Cadabra
Computer algebra system for field theory problems
Loading...
Searching...
No Matches
Compare.hh
Go to the documentation of this file.
1
2#pragma once
3
4#include "Storage.hh"
5#include "Props.hh"
7
8namespace cadabra {
9
55
56 int subtree_compare(const Properties*,
57 Ex::iterator one, Ex::iterator two,
58 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
59 bool literal_wildcards=false);
60
62
63 bool tree_less(const Properties*,
64 const Ex& one, const Ex& two,
65 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
66 bool tree_equal(const Properties*,
67 const Ex& one, const Ex& two,
68 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
69 bool tree_exact_less(const Properties*,
70 const Ex& one, const Ex& two,
71 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
72 bool literal_wildcards=false);
73 bool tree_exact_less(const Properties*,
74 Ex::iterator one, Ex::iterator two,
75 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
76 bool literal_wildcards=false);
77 bool tree_exact_equal(const Properties*,
78 const Ex& one, const Ex& two,
79 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
80 bool literal_wildcards=false);
81
82 bool subtree_less(const Properties*,
83 Ex::iterator one, Ex::iterator two,
84 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
85 bool subtree_equal(const Properties*,
86 Ex::iterator one, Ex::iterator two,
87 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2);
88 bool subtree_exact_less(const Properties*,
89 Ex::iterator one, Ex::iterator two,
90 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
91 bool literal_wildcards=false);
92 bool subtree_exact_equal(const Properties*,
93 Ex::iterator one, Ex::iterator two,
94 int mod_prel=-2, bool checksets=true, int compare_multiplier=-2,
95 bool literal_wildcards=false);
96
98 //
100 public:
102 bool operator()(const Ex& first, const Ex& second) const;
103 private:
105 };
106
108 public:
110 bool operator()(const Ex& first, const Ex& second) const;
111 private:
113 };
114
116 public:
118 bool operator()(const Ex& first, const Ex& second) const;
119 private:
121 };
122
124 //
126 public:
128 bool operator()(const Ex& first, const Ex& second) const;
129 bool operator()(Ex::iterator first, Ex::iterator 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
151 public:
153 bool operator()(const Ex& first, const Ex& second) const;
154 private:
156 };
157
164
166 public:
167 bool operator()(const Ex& first, const Ex& second) const;
168 };
169
171 //
173 public:
174 tree_exact_less_no_wildcards_obj(); // disables property handling
176 bool operator()(const Ex& first, const Ex& second) const;
177 private:
179 };
180
182 public:
184 bool operator()(const Ex& first, const Ex& second) const;
185 private:
187 };
188
189
196
198 public:
200
201 enum class match_t {
202 node_match=0, // a single node matches
203 subtree_match=1, // identical match, including index names
204 match_index_less=2, // structure match, indices in same set, but different names
206 no_match_indexpos_less=4, // mismatch but only for index positions
208 no_match_less=6, // more serious mismatch
210 };
211
212 enum class useprops_t {
213 always=0, // always use property info
214 not_at_top, // don't use property info at top level of the expression
215 never=2 // never use property info
216 };
217
219
220 void clear();
221
229
230 void set_value_matches_index(bool);
231
240
241 match_t equal_subtree(Ex::iterator i1, Ex::iterator i2,
243
246
247 match_t match_subtree(const Ex&, Ex::iterator i1, Ex::iterator i2, Ex::iterator conditions);
248
255
257 Ex::sibling_iterator lhs, Ex::sibling_iterator tofind,
258 Ex::sibling_iterator st, Ex::iterator conditions);
259
266
267 match_t match_subsum(const Ex&,
268 Ex::sibling_iterator lhs, Ex::sibling_iterator tofind,
269 Ex::sibling_iterator st, Ex::iterator conditions);
270
274
275 bool satisfies_conditions(Ex::iterator conditions, std::string& error);
276
278
279 typedef std::map<Ex, Ex, tree_exact_less_no_wildcards_obj> replacement_map_t;
281
283
284 typedef std::map<nset_t::iterator, Ex::iterator, nset_it_less> subtree_replacement_map_t;
286
289
291
296
297 std::vector<Ex::sibling_iterator> factor_locations;
298 std::vector<int> factor_moving_signs;
300
305
308
309 bool should_swap(Ex::iterator obj, match_t subtree_comparison) ;
310
320
321 int can_swap(Ex::iterator one, Ex::iterator two, match_t subtree_comparison,
322 bool ignore_implicit_indices=false);
323
328
329 int can_swap_components(Ex::iterator one, Ex::iterator two,
331
335
336 int can_move_adjacent(Ex::iterator prod, Ex::sibling_iterator one,
337 Ex::sibling_iterator two, bool fix_one=false) ;
338
339
342 int can_move_to_front(Ex&, Ex::iterator prod, Ex::sibling_iterator one);
343
346
347 int can_move_adjacent(Ex::iterator prod, const std::vector<Ex::sibling_iterator>& factors, Ex::sibling_iterator to_move);
348
349 protected:
351
353
358
359 match_t compare(const Ex::iterator&, const Ex::iterator&,
360 bool nobrackets=false,
362 bool ignore_parent_rel=false);
363
364 // Internal functions used by can_swap.
365 int can_swap_prod_obj(Ex::iterator prod, Ex::iterator obj, bool) ;
366 int can_swap_prod_prod(Ex::iterator prod1, Ex::iterator prod2, bool) ;
367 int can_swap_sum_obj(Ex::iterator sum, Ex::iterator obj, bool) ;
368 int can_swap_prod_sum(Ex::iterator prod, Ex::iterator sum, bool) ;
369 int can_swap_sum_sum(Ex::iterator sum1, Ex::iterator sum2, bool) ;
370 int can_swap_ilist_ilist(Ex::iterator obj1, Ex::iterator obj2);
371 bool can_swap_different_indexsets(Ex::iterator obj1, Ex::iterator obj2);
372
373 std::string tab() const;
374 match_t report(match_t r) const;
375
378 bool name_match_with_autodeclare(Ex::sibling_iterator one, Ex::sibling_iterator two) const;
379
380 static int offset;
381 };
382
386
388 public:
390 bool operator()(const Ex&, const Ex&);
391 private:
393 };
394
396 public:
397 Ex_is_less(const Properties&, int mod_prel);
398 bool operator()(const Ex&, const Ex&);
399 private:
402 };
403
404
405
406 }
407
408bool operator<(const cadabra::Ex::iterator&, const cadabra::Ex::iterator&);
409bool operator<(const cadabra::Ex&, const cadabra::Ex&);
410std::ostream& operator<<(std::ostream&, cadabra::Ex_comparator::useprops_t up);
bool operator<(const cadabra::Ex::iterator &, const cadabra::Ex::iterator &)
Definition Compare.cc:1778
std::ostream & operator<<(std::ostream &, cadabra::Ex_comparator::useprops_t up)
Definition Compare.cc:1788
A generic tree comparison class which will take into account index contractions and will also keep tr...
Definition Compare.hh:197
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:1049
match_t report(match_t r) const
Definition Compare.cc:454
int can_swap_components(Ex::iterator one, Ex::iterator two, match_t subtree_comparison)
Wrapper for can_swap which is meant for objects that have implicit indices.
Definition Compare.cc:1246
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:284
void clear()
Reset the object for a new match.
Definition Compare.cc:286
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:304
multiplier_t term_ratio
Definition Compare.hh:299
int can_move_to_front(Ex &, Ex::iterator prod, Ex::sibling_iterator one)
Determine whether object 'one' can be moved to be the first factor in the given product.
Definition Compare.cc:1236
int can_move_adjacent(Ex::iterator prod, Ex::sibling_iterator one, Ex::sibling_iterator two, bool fix_one=false)
Determine whether object 'one' and 'two' can be moved next to each other by moving either one or the ...
Definition Compare.cc:1181
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:955
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:309
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:1512
useprops_t
Definition Compare.hh:212
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:1323
bool can_swap_different_indexsets(Ex::iterator obj1, Ex::iterator obj2)
Definition Compare.cc:1486
int can_swap_sum_sum(Ex::iterator sum1, Ex::iterator sum2, bool)
Definition Compare.cc:1440
int can_swap_sum_obj(Ex::iterator sum, Ex::iterator obj, bool)
Definition Compare.cc:1404
bool name_match_with_autodeclare(Ex::sibling_iterator one, Ex::sibling_iterator two) const
Match the name elements of a node, but take into account that one of them can be an autodeclare name ...
Definition Compare.cc:944
replacement_map_t index_value_map
Map for matching of index names to index values.
Definition Compare.hh:290
void set_value_matches_index(bool)
Determine whether Coordinates in the pattern (first argument to functions below) can match against In...
Definition Compare.cc:441
static int offset
Definition Compare.hh:380
match_t match_subtree(const Ex &, Ex::iterator i1, Ex::iterator i2, Ex::iterator conditions)
Match two subtrees, new-style equal_subtree that handles conditions; this is what substitute uses.
Definition Compare.cc:295
int can_swap_ilist_ilist(Ex::iterator obj1, Ex::iterator obj2)
Definition Compare.cc:1457
int can_swap_prod_prod(Ex::iterator prod1, Ex::iterator prod2, bool)
Definition Compare.cc:1388
std::string tab() const
Definition Compare.cc:446
const Properties & properties
Definition Compare.hh:350
bool value_matches_index
Definition Compare.hh:352
int can_swap_prod_sum(Ex::iterator prod, Ex::iterator sum, bool)
Definition Compare.cc:1423
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:494
subtree_replacement_map_t subtree_replacement_map
Definition Compare.hh:285
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:297
std::vector< int > factor_moving_signs
Definition Compare.hh:298
int can_swap_prod_obj(Ex::iterator prod, Ex::iterator obj, bool)
Definition Compare.cc:1363
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:1607
match_t
Definition Compare.hh:201
replacement_map_t replacement_map
Definition Compare.hh:280
std::map< Ex, Ex, tree_exact_less_no_wildcards_obj > replacement_map_t
Map for the replacement of nodes (indices, patterns).
Definition Compare.hh:279
Basic comparison operator for tree iterators, so we can use them as keys in maps.
Definition Compare.hh:387
bool operator()(const Ex &, const Ex &)
Definition Compare.cc:1757
const Properties & properties
Definition Compare.hh:392
Definition Compare.hh:395
const Properties & properties
Definition Compare.hh:400
int mod_prel
Definition Compare.hh:401
bool operator()(const Ex &, const Ex &)
Definition Compare.cc:1769
Definition Storage.hh:170
Definition Multiplier.hh:9
Class holding a collection of properties attached to expressions.
Definition Props.hh:242
Definition Compare.hh:115
const Properties * properties
Definition Compare.hh:120
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:220
const Properties * properties
Definition Compare.hh:155
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:270
tree_exact_equal_mod_prel_obj(const Properties *)
Definition Compare.hh:142
const Properties * properties
Definition Compare.hh:147
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:255
tree_exact_equal_obj(const Properties *)
Compare for indexmap_t.
Definition Compare.hh:165
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:275
Definition Compare.hh:134
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:265
const Properties * properties
Definition Compare.hh:139
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:250
const Properties * properties
Definition Compare.hh:186
Compare two trees exactly, treat wildcard names as ordinary names.
Definition Compare.hh:172
tree_exact_less_no_wildcards_obj()
Definition Compare.cc:240
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:245
const Properties * properties
Definition Compare.hh:178
tree_exact_less_no_wildcards_obj(const Properties *)
Compare two trees exactly, i.e. including exact index names.
Definition Compare.hh:125
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:230
const Properties * properties
Definition Compare.hh:131
Definition Compare.hh:107
const Properties * properties
Definition Compare.hh:112
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:210
Compare two trees by pattern logic, i.e. modulo index names.
Definition Compare.hh:99
bool operator()(const Ex &first, const Ex &second) const
Definition Compare.cc:200
const Properties * properties
Definition Compare.hh:104
int subtree_compare(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool, int compare_multiplier, bool literal_wildcards)
Basic building block subtree comparison function for tensors without dummy indices,...
Definition Compare.cc:28
Functions to handle the exchange properties of two or more symbols in a product.
Definition Adjform.cc:83
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:187
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:160
bool tree_equal(const Properties *properties, const Ex &one, const Ex &two, int mod_prel, bool checksets, int compare_multiplier)
Definition Compare.cc:145
void one(rset_t::iterator &num)
Definition Storage.cc:1201
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:140
Ex lhs(Ex_ptr ex)
Definition py_ex.cc:411
void set(rset_t::iterator &num, multiplier_t fac)
Definition Storage.cc:1179
bool subtree_equal(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier)
Definition Compare.cc:172
bool subtree_less(const Properties *properties, Ex::iterator one, Ex::iterator two, int mod_prel, bool checksets, int compare_multiplier)
Definition Compare.cc:165
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:179
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:150