Cadabra
Computer algebra system for field theory problems
Compare.hh
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #include "Storage.hh"
5 #include "Props.hh"
6 #include "properties/Indices.hh"
7 
8 namespace cadabra {
9 
52 
53 int subtree_compare(const Properties*,
54  Ex::iterator one, Ex::iterator two,
55  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
56  bool literal_wildcards=false);
57 
59 
60 bool tree_less(const Properties*,
61  const Ex& one, const Ex& two,
62  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
63 bool tree_equal(const Properties*,
64  const Ex& one, const Ex& two,
65  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
66 bool tree_exact_less(const Properties*,
67  const Ex& one, const Ex& two,
68  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
69  bool literal_wildcards=false);
70 bool tree_exact_equal(const Properties*,
71  const Ex& one, const Ex& two,
72  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
73  bool literal_wildcards=false);
74 
75 bool subtree_less(const Properties*,
76  Ex::iterator one, Ex::iterator two,
77  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
78 bool subtree_equal(const Properties*,
79  Ex::iterator one, Ex::iterator two,
80  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
81 bool subtree_exact_less(const Properties*,
82  Ex::iterator one, Ex::iterator two,
83  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
84  bool literal_wildcards=false);
85 bool subtree_exact_equal(const Properties*,
86  Ex::iterator one, Ex::iterator two,
87  int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
88  bool literal_wildcards=false);
89 
91 //
93  public:
94  tree_less_obj(const Properties*);
95  bool operator()(const Ex& first, const Ex& second) const;
96  private:
98 };
99 
101  public:
103  bool operator()(const Ex& first, const Ex& second) const;
104  private:
106 };
107 
109  public:
110  tree_equal_obj(const Properties*);
111  bool operator()(const Ex& first, const Ex& second) const;
112  private:
114 };
115 
117 //
119  public:
121  bool operator()(const Ex& first, const Ex& second) const;
122  private:
124 };
125 
127  public:
129  bool operator()(const Ex& first, const Ex& second) const;
130  private:
132 };
133 
135  public:
137  bool operator()(const Ex& first, const Ex& second) const;
138  private:
140 };
141 
143  public:
145  bool operator()(const Ex& first, const Ex& second) const;
146  private:
148 };
149 
156 
158  public:
159  bool operator()(const Ex& first, const Ex& second) const;
160 };
161 
163 //
165  public:
166  tree_exact_less_no_wildcards_obj(); // disables property handling
168  bool operator()(const Ex& first, const Ex& second) const;
169  private:
171 };
172 
174  public:
176  bool operator()(const Ex& first, const Ex& second) const;
177  private:
179 };
180 
181 
188 
190  public:
191  Ex_comparator(const Properties&);
192 
193  enum class match_t {
194  node_match=0, // a single node matches
195  subtree_match=1, // identical match, including index names
196  match_index_less=2, // structure match, indices in same set, but different names
198  no_match_indexpos_less=4, // mismatch but only for index positions
200  no_match_less=6, // more serious mismatch
202  };
203 
204  enum class useprops_t {
205  always=0, // always use property info
206  not_at_top, // don't use property info at top level of the expression
207  never=2 // never use property info
208  };
209 
211 
212  void clear();
213 
221 
222  void set_value_matches_index(bool);
223 
232 
233  match_t equal_subtree(Ex::iterator i1, Ex::iterator i2,
234  useprops_t use_props=useprops_t::always, bool ignore_parent_rel=false);
235 
242 
243  match_t match_subproduct(const Ex&,
244  Ex::sibling_iterator lhs, Ex::sibling_iterator tofind,
245  Ex::sibling_iterator st, Ex::iterator conditions);
246 
253 
254  match_t match_subsum(const Ex&,
255  Ex::sibling_iterator lhs, Ex::sibling_iterator tofind,
256  Ex::sibling_iterator st, Ex::iterator conditions);
257 
261 
262  bool satisfies_conditions(Ex::iterator conditions, std::string& error);
263 
265 
266  typedef std::map<Ex, Ex, tree_exact_less_no_wildcards_obj> replacement_map_t;
268 
270 
271  typedef std::map<nset_t::iterator, Ex::iterator, nset_it_less> subtree_replacement_map_t;
273 
276 
278 
283 
284  std::vector<Ex::sibling_iterator> factor_locations;
285  std::vector<int> factor_moving_signs;
287 
292 
295 
296  bool should_swap(Ex::iterator obj, match_t subtree_comparison) ;
297 
307 
308  int can_swap(Ex::iterator one, Ex::iterator two, match_t subtree_comparison,
309  bool ignore_implicit_indices=false);
310 
314 
315  int can_move_adjacent(Ex::iterator prod, Ex::sibling_iterator one,
316  Ex::sibling_iterator two, bool fix_one=false) ;
317 
318  protected:
320 
322 
327 
328  match_t compare(const Ex::iterator&, const Ex::iterator&,
329  bool nobrackets=false,
330  useprops_t use_props=useprops_t::always,
331  bool ignore_parent_rel=false);
332 
333  // Internal functions used by can_swap.
334  int can_swap_prod_obj(Ex::iterator prod, Ex::iterator obj, bool) ;
335  int can_swap_prod_prod(Ex::iterator prod1, Ex::iterator prod2, bool) ;
336  int can_swap_sum_obj(Ex::iterator sum, Ex::iterator obj, bool) ;
337  int can_swap_prod_sum(Ex::iterator prod, Ex::iterator sum, bool) ;
338  int can_swap_sum_sum(Ex::iterator sum1, Ex::iterator sum2, bool) ;
339  int can_swap_ilist_ilist(Ex::iterator obj1, Ex::iterator obj2);
340  bool can_swap_different_indexsets(Ex::iterator obj1, Ex::iterator obj2);
341 
342  std::string tab() const;
343  match_t report(match_t r) const;
344 
345  static int offset;
346 };
347 
351 
353  public:
355  bool operator()(const Ex&, const Ex&);
356  private:
358 };
359 
360 class Ex_is_less {
361  public:
362  Ex_is_less(const Properties&, int mod_prel);
363  bool operator()(const Ex&, const Ex&);
364  private:
366  int mod_prel;
367 };
368 
369 
370 
371 }
372 
373 bool operator<(const cadabra::Ex::iterator&, const cadabra::Ex::iterator&);
374 bool operator<(const cadabra::Ex&, const cadabra::Ex&);
375 std::ostream& operator<<(std::ostream&, cadabra::Ex_comparator::useprops_t up);
bool should_swap(Ex::iterator obj, match_t subtree_comparison)
Determine whether two objects should be swapped according to the available SortOrder properties...
Definition: Compare.cc:1108
bool lhs_contains_dummies
Flag to indicate whether additional care must be taken to handle dummies in the lhs of the pattern...
Definition: Compare.hh:291
int can_swap_ilist_ilist(Ex::iterator obj1, Ex::iterator obj2)
Definition: Compare.cc:1234
bool tree_exact_equal(const Properties *properties, const Ex &one, const Ex &two, int mod_prel, bool checksets, int compare_multiplier, bool literal_wildcards)
Definition: Compare.cc:152
bool operator()(const Ex &, const Ex &)
Definition: Compare.cc:1542
static int offset
Definition: Compare.hh:345
int can_move_adjacent(Ex::iterator prod, Ex::sibling_iterator one, Ex::sibling_iterator two, bool fix_one=false)
Determine whether object &#39;one&#39; and &#39;two&#39; can be moved next to each other by moving either one or the ...
Definition: Compare.cc:1048
Compare for indexmap_t.
Definition: Compare.hh:157
bool subtree_less(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier)
Definition: Compare.cc:157
int subtree_compare(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier, bool literal_wildcards)
Basic building block subtree comparison function for tensors without dummy indices, which determines whether two tensor subtrees are equal up to the names of indices.
Definition: Compare.cc:28
tree_exact_less_no_wildcards_obj()
Definition: Compare.cc:227
Compare two trees exactly, i.e. including exact index names.
Definition: Compare.hh:118
Basic storage class for symbolic mathemematical expressions.
Definition: Storage.hh:139
std::map< nset_t::iterator, Ex::iterator, nset_it_less > subtree_replacement_map_t
Map for the replacement of entire subtrees (object patterns).
Definition: Compare.hh:271
std::ostream & operator<<(std::ostream &, cadabra::Ex_comparator::useprops_t up)
Definition: Compare.cc:1561
Basic comparison operator for tree iterators, so we can use them as keys in maps. ...
Definition: Compare.hh:352
const Properties & properties
Definition: Compare.hh:319
replacement_map_t index_value_map
Map for matching of index names to index values.
Definition: Compare.hh:277
bool subtree_equal(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier)
Definition: Compare.cc:164
tree_exact_less_mod_prel_obj(const Properties *)
Definition: Compare.cc:247
A generic tree comparison class which will take into account index contractions and will also keep tr...
Definition: Compare.hh:189
void clear()
Reset the object for a new match.
Definition: Compare.cc:273
replacement_map_t replacement_map
Definition: Compare.hh:267
tree_less_modprel_obj(const Properties *)
Definition: Compare.cc:197
int mod_prel
Definition: Compare.hh:366
Definition: Compare.hh:126
bool subtree_exact_equal(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier, bool literal_wildcards)
Definition: Compare.cc:179
std::map< Ex, Ex, tree_exact_less_no_wildcards_obj > replacement_map_t
Map for the replacement of nodes (indices, patterns).
Definition: Compare.hh:266
const Properties * properties
Definition: Compare.hh:178
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:192
bool satisfies_conditions(Ex::iterator conditions, std::string &error)
Check whether the a match found by calling equal_subtree or match_subproduct satisfies the conditions...
Definition: Compare.cc:1384
int can_swap_prod_obj(Ex::iterator prod, Ex::iterator obj, bool)
Definition: Compare.cc:1140
int can_swap_prod_sum(Ex::iterator prod, Ex::iterator sum, bool)
Definition: Compare.cc:1200
const Properties * properties
Definition: Compare.hh:170
int can_swap_sum_obj(Ex::iterator sum, Ex::iterator obj, bool)
Definition: Compare.cc:1181
bool operator<(const cadabra::Ex::iterator &, const cadabra::Ex::iterator &)
Definition: Compare.cc:1551
Ex_is_equivalent(const Properties &)
Definition: Compare.cc:1525
tree_equal_obj(const Properties *)
Definition: Compare.cc:207
match_t match_subsum(const Ex &, Ex::sibling_iterator lhs, Ex::sibling_iterator tofind, Ex::sibling_iterator st, Ex::iterator conditions)
Find a sub-sum in a sum.
Definition: Compare.cc:916
multiplier_t term_ratio
Definition: Compare.hh:286
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:212
const Properties * properties
Definition: Compare.hh:139
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:232
Compare two trees exactly, treat wildcard names as ordinary names.
Definition: Compare.hh:164
int can_swap_prod_prod(Ex::iterator prod1, Ex::iterator prod2, bool)
Definition: Compare.cc:1165
Definition: Compare.hh:142
Compare two trees by pattern logic, i.e. modulo index names.
Definition: Compare.hh:92
match_t match_subproduct(const Ex &, Ex::sibling_iterator lhs, Ex::sibling_iterator tofind, Ex::sibling_iterator st, Ex::iterator conditions)
Find a sub-product in a product.
Definition: Compare.cc:830
void set_value_matches_index(bool)
Determine whether Coordinates in the pattern (first argument to functions below) can match against In...
Definition: Compare.cc:389
useprops_t
Definition: Compare.hh:204
match_t
Definition: Compare.hh:193
match_t compare(const Ex::iterator &, const Ex::iterator &, bool nobrackets=false, useprops_t use_props=useprops_t::always, bool ignore_parent_rel=false)
Internal entry point.
Definition: Compare.cc:438
tree_exact_equal_mod_prel_obj(const Properties *)
const Properties * properties
Definition: Compare.hh:147
void one(rset_t::iterator &num)
Definition: Storage.cc:923
bool tree_equal(const Properties *properties, const Ex &one, const Ex &two, int mod_prel, bool checksets, int compare_multiplier)
Definition: Compare.cc:142
std::string tab() const
Definition: Compare.cc:394
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:237
const char error[]
Definition: Snoop.hh:160
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:222
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:242
match_t equal_subtree(Ex::iterator i1, Ex::iterator i2, useprops_t use_props=useprops_t::always, bool ignore_parent_rel=false)
Match two subtrees taking into account symbol properties.
Definition: Compare.cc:282
bool tree_less(const Properties *properties, const Ex &one, const Ex &two, int mod_prel, bool checksets, int compare_multiplier)
Various comparison functions, some exact, some with pattern logic.
Definition: Compare.cc:137
bool value_matches_index
Definition: Compare.hh:321
Definition: Compare.hh:134
tree_less_obj(const Properties *)
Definition: Compare.cc:187
Functions to handle the exchange properties of two or more symbols in a product.
Definition: Algorithm.cc:1030
std::vector< Ex::sibling_iterator > factor_locations
Information to keep track of where individual factors/terms in a sub-product/sub-sum were found...
Definition: Compare.hh:284
bool subtree_exact_less(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier, bool literal_wildcards)
Definition: Compare.cc:171
const Properties * properties
Definition: Compare.hh:105
bool can_swap_different_indexsets(Ex::iterator obj1, Ex::iterator obj2)
Definition: Compare.cc:1263
Ex_is_less(const Properties &, int mod_prel)
Definition: Compare.cc:1537
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:252
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:202
const Properties & properties
Definition: Compare.hh:357
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:262
mpq_class multiplier_t
Definition: Storage.hh:38
const Properties * properties
Definition: Compare.hh:97
const Properties & properties
Definition: Compare.hh:365
const Properties * properties
Definition: Compare.hh:113
int can_swap(Ex::iterator one, Ex::iterator two, match_t subtree_comparison, bool ignore_implicit_indices=false)
Determine whether obj and obj+1 be exchanged? If yes, return the sign, if no return zero...
Definition: Compare.cc:1289
Definition: Compare.hh:108
bool tree_exact_less(const Properties *properties, const Ex &one, const Ex &two, int mod_prel, bool checksets, int compare_multiplier, bool literal_wildcards)
Definition: Compare.cc:147
subtree_replacement_map_t subtree_replacement_map
Definition: Compare.hh:272
tree_exact_equal_obj(const Properties *)
match_t report(match_t r) const
Definition: Compare.cc:402
bool operator()(const Ex &, const Ex &)
Definition: Compare.cc:1530
const Properties * properties
Definition: Compare.hh:131
Definition: Compare.hh:360
const Properties * properties
Definition: Compare.hh:123
bool operator()(const Ex &first, const Ex &second) const
Definition: Compare.cc:257
Ex_comparator(const Properties &)
Definition: Compare.cc:384
Ex lhs(std::shared_ptr< Ex > ex)
Definition: PythonCdb.cc:178
Class holding a collection of properties attached to expressions.
Definition: Props.hh:208
Definition: Compare.hh:100
int can_swap_sum_sum(Ex::iterator sum1, Ex::iterator sum2, bool)
Definition: Compare.cc:1217
tree_exact_less_obj(const Properties *)
Definition: Compare.cc:217
std::vector< int > factor_moving_signs
Definition: Compare.hh:285