Cadabra
Computer algebra system for field theory problems
Loading...
Searching...
No Matches
Storage.hh
Go to the documentation of this file.
1/*
2
3Cadabra: a field-theory motivated computer algebra system.
4Copyright (C) 2001-2014 Kasper Peeters <kasper.peeters@phi-sci.com>
5
6This program is free software: you can redistribute it and/or
7modify it under the terms of the GNU General Public License as
8published by the Free Software Foundation, either version 3 of the
9License, or (at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19*/
20
21#pragma once
22
23#include <cstddef>
24#include <iostream>
25#include <gmpxx.h>
26#include <string>
27#include <vector>
28#include <set>
29#include <map>
30#include <stdint.h>
31#include <assert.h>
32#include <initializer_list>
33
34#include "tree.hh"
35
36namespace cadabra {
37
38 typedef mpq_class multiplier_t;
39 typedef std::set<std::string> nset_t;
40 typedef std::set<multiplier_t> rset_t;
41 typedef uintptr_t hashval_t;
42
44 double to_double(multiplier_t);
45 std::string to_string(long);
46
47 extern nset_t name_set;
48 extern rset_t rat_set;
49
55
56 class str_node { // size: 9 bytes (32 bit arch), can be reduced to 5 bytes.
57 public:
59
63
64 str_node(void);
65 str_node(nset_t::iterator name, bracket_t btype=b_none, parent_rel_t ptype=p_none);
66 str_node(const std::string& name, bracket_t btype=b_none, parent_rel_t ptype=p_none);
67 str_node(const std::u32string& name, bracket_t btype=b_none, parent_rel_t ptype=p_none);
68
69 bool operator==(const str_node&) const;
70 bool operator<(const str_node&) const;
71
72 nset_t::iterator name;
73 rset_t::iterator multiplier;
74
75#ifdef _WIN32
76 struct flag_t {
77 bool keep_after_eval ;
80 bool line_per_node ;
81 };
82#else
83 struct flag_t { // kept inside 8 bits for speed and size
87 bool line_per_node : 1;
88 };
89#endif
90
92
95 void flip_parent_rel();
96
97 bool is_zero() const;
98 bool is_identity() const;
99 bool is_rational() const;
100 bool is_unsimplified_rational() const;
101 bool is_integer() const;
102 bool is_unsimplified_integer() const;
103 bool is_index() const; // _ or ^ parent_rel (does not query properties)
104 bool is_quoted_string() const;
105 bool is_command() const;
106 bool is_inert_command() const;
107 bool is_name_wildcard() const; // ?
108 bool is_object_wildcard() const; // ??
109 bool is_range_wildcard() const; // #{..}
110 bool is_siblings_wildcard() const; // a...
111 bool is_autodeclare_wildcard() const; // m#
112 bool is_indexstar_wildcard() const; // ?* in sub/super
113 bool is_indexplus_wildcard() const; // ?+ in sub/super
114 bool is_numbered_symbol() const; // [a-zA-Z]+[0-9]+
115
116 nset_t::iterator name_only();
117
118 static bool compare_names_only(const str_node&, const str_node&);
119 static bool compare_name_brack_par(const str_node&, const str_node&);
120 static bool compare_name_inverse_par(const str_node&, const str_node&);
121 };
122
126 void multiply(rset_t::iterator&, multiplier_t);
127 void add(rset_t::iterator&, multiplier_t);
128 void zero(rset_t::iterator&);
129 void one(rset_t::iterator&);
130 void flip_sign(rset_t::iterator&);
131 void half(rset_t::iterator&);
132
140
141 class Ex : public std::enable_shared_from_this<Ex>, public tree<str_node> {
142 public:
143 Ex();
144 // Ex(const tree<str_node>&);
145 Ex(tree<str_node>::iterator);
146 Ex(const str_node&);
147 Ex(const Ex&);
149 Ex(const std::string&);
150 Ex(int);
151
159
161 result_t state() const;
163 void reset_state();
164
169 bool changed_state();
170
173 bool is_rational() const;
175 bool is_integer() const;
176 long to_integer() const;
177
181 static std::ostream& print_python(std::ostream& str, Ex::iterator it);
182
184 std::ostream& print_entire_tree(std::ostream& str) const;
185 static std::ostream& print_recursive_treeform(std::ostream& str, Ex::iterator it);
186 static std::ostream& print_recursive_treeform(std::ostream& str, Ex::iterator it, unsigned int& number);
187
189 std::ostream& print_repr(std::ostream& str, Ex::iterator it) const;
190
192 iterator named_parent(iterator it, const std::string&) const;
193 iterator erase_expression(iterator it);
194
196 hashval_t calc_hash(iterator it) const;
197
199 static sibling_iterator arg(iterator, unsigned int);
200 static unsigned int arg_size(sibling_iterator);
201
202 multiplier_t arg_to_num(sibling_iterator, unsigned int) const; // shorthand for numerical arguments
203
204 // Like 'child', but using index iterators instead.
205 // sibling_iterator tensor_index(const iterator_base& position, unsigned int) const;
206
207 // Number of \\history nodes in an expression
208 unsigned int number_of_steps(iterator it) const;
209 // Given an iterator pointing to any node in the tree, figure
210 // out to which equation number it belongs.
211 unsigned int number_of_equations() const;
212 unsigned int equation_number(iterator it) const;
213 nset_t::iterator equation_label(iterator it) const;
214 iterator equation_by_number(unsigned int i) const;
215 iterator equation_by_name(nset_t::iterator it) const;
216 iterator equation_by_name(nset_t::iterator it, unsigned int& ) const;
217 iterator equation_by_number_or_name(iterator it, unsigned int last_used_equation) const;
218 iterator equation_by_number_or_name(iterator it, unsigned int last_used_equation,
219 unsigned int&) const;
220 std::string equation_number_or_name(iterator it, unsigned int last_used_equation) const;
221 iterator procedure_by_name(nset_t::iterator it) const;
222
223 // Determine whether a node has an '\ldots' parent (not necessarily direct).
224 bool is_hidden(iterator) const;
225
237 iterator replace_index(iterator position, const iterator& from, bool keep_parent_rel=false);
238
241 iterator move_index(iterator position, const iterator& from);
242
246 void list_wrap_single_element(iterator&);
247 void list_unwrap_single_element(iterator&);
248
253 iterator flatten_and_erase(iterator position);
254
257
258 bool operator==(const Ex& other) const;
259
264 void push_history(const std::vector<Ex::path_t>&);
265
269 std::vector<Ex::path_t> pop_history();
270
273 int history_size() const;
274
275 private:
277
278 std::vector<tree<str_node> > history;
280 std::vector<std::vector<Ex::path_t> > terms;
281 };
282
283
287
289 public:
290 bool operator()(nset_t::iterator first, nset_t::iterator second) const;
291 };
292
293 template <typename T>
294 bool is_in(const T& val, const std::initializer_list<T>& list)
295 {
296 for (const auto& i : list) {
297 if (val == i) {
298 return true;
299 }
300 }
301 return false;
302 }
303
304 }
305
313
314std::ostream& operator<<(std::ostream&, const cadabra::Ex&);
315std::ostream& operator<<(std::ostream&, cadabra::Ex::iterator);
Basic storage class for symbolic mathemematical expressions.
Definition: Storage.hh:141
iterator move_index(iterator position, const iterator &from)
As in replace_index, but moves the index rather than making a copy (so that iterators pointing to the...
Definition: Storage.cc:597
void list_unwrap_single_element(iterator &)
Definition: Storage.cc:619
multiplier_t arg_to_num(sibling_iterator, unsigned int) const
Definition: Storage.cc:440
static std::ostream & print_python(std::ostream &str, Ex::iterator it)
Display expression in Python/Cadabra input form.
Definition: Storage.cc:154
bool operator==(const Ex &other) const
Compare two Ex objects for exact equality; no dummy equivalence or other things that require property...
Definition: Storage.cc:694
std::string equation_number_or_name(iterator it, unsigned int last_used_equation) const
Definition: Storage.cc:680
result_t
Keeping track of what algorithms have done to this expression.
Definition: Storage.hh:160
@ l_error
Definition: Storage.hh:160
@ l_checkpointed
Definition: Storage.hh:160
@ l_no_action
Definition: Storage.hh:160
@ l_applied_no_new_dummies
Definition: Storage.hh:160
@ l_applied
Definition: Storage.hh:160
hashval_t calc_hash(iterator it) const
Calculate the hash value for the subtree starting at 'it'.
Definition: Storage.cc:402
void reset_state()
Definition: Storage.cc:111
iterator named_parent(iterator it, const std::string &) const
Step up until matching node is found (if current node matches, do nothing)
Definition: Storage.cc:382
static sibling_iterator arg(iterator, unsigned int)
Quick access to arguments or argument lists for A(B)(C,D) type nodes.
Definition: Storage.cc:425
iterator erase_expression(iterator it)
Definition: Storage.cc:395
result_t state() const
Definition: Storage.cc:91
std::ostream & print_entire_tree(std::ostream &str) const
Output helpers mainly for debugging purposes.
Definition: Storage.cc:290
result_t state_
Definition: Storage.hh:276
bool is_integer() const
Definition: Storage.cc:139
static unsigned int arg_size(sibling_iterator)
Definition: Storage.cc:434
void list_wrap_single_element(iterator &)
Make sure that the node pointed to is a \comma object, i.e.
Definition: Storage.cc:608
long to_integer() const
Definition: Storage.cc:147
iterator equation_by_name(nset_t::iterator it) const
Definition: Storage.cc:524
bool changed_state()
A status query method mainly to implement a simple method to apply algorithms until they converge.
Definition: Storage.cc:116
unsigned int equation_number(iterator it) const
Definition: Storage.cc:448
int history_size() const
Return the size of the history; 0 means no history, just the current expression.
Definition: Storage.cc:720
bool is_hidden(iterator) const
Definition: Storage.cc:554
Ex()
Definition: Storage.cc:57
std::vector< Ex::path_t > pop_history()
Pop the most recent state of the expression off the history stack; returns the set of paths that we a...
Definition: Storage.cc:711
void push_history(const std::vector< Ex::path_t > &)
Push a copy of the current state of the expression onto the history stack.
Definition: Storage.cc:705
iterator procedure_by_name(nset_t::iterator it) const
Definition: Storage.cc:565
unsigned int number_of_steps(iterator it) const
bool is_rational() const
Test if the expression is a rational number.
Definition: Storage.cc:124
iterator equation_by_number(unsigned int i) const
Definition: Storage.cc:506
std::vector< tree< str_node > > history
Definition: Storage.hh:278
std::ostream & print_repr(std::ostream &str, Ex::iterator it) const
Print a representation like Python's 'repr'.
Definition: Storage.cc:257
multiplier_t to_rational() const
Definition: Storage.cc:132
iterator flatten_and_erase(iterator position)
Replace the node with the children of the node, useful for e.g.
Definition: Storage.cc:629
nset_t::iterator equation_label(iterator it) const
Definition: Storage.cc:469
std::vector< std::vector< Ex::path_t > > terms
Patterns which describe how to get from one history step to the next.
Definition: Storage.hh:280
iterator replace_index(iterator position, const iterator &from, bool keep_parent_rel=false)
Replace the index-like object (originally intended to replace indices only, but now used also for e....
Definition: Storage.cc:585
static std::ostream & print_recursive_treeform(std::ostream &str, Ex::iterator it)
Definition: Storage.cc:268
iterator equation_by_number_or_name(iterator it, unsigned int last_used_equation) const
Definition: Storage.cc:674
unsigned int number_of_equations() const
Definition: Storage.cc:640
void update_state(result_t)
Definition: Storage.cc:96
Compare two nset iterators by comparing the strings to which they point.
Definition: Storage.hh:288
bool operator()(nset_t::iterator first, nset_t::iterator second) const
Definition: Storage.cc:997
Elementary building block for a mathematical expression.
Definition: Storage.hh:56
bool is_indexstar_wildcard() const
Definition: Storage.cc:914
bool is_index() const
Definition: Storage.cc:828
bool is_unsimplified_integer() const
Definition: Storage.cc:818
bool operator<(const str_node &) const
Definition: Storage.cc:1043
void flip_parent_rel()
Change the parent relation from sub to super and vice versa (throws error when this is not an index).
Definition: Storage.cc:775
bracket_t
Definition: Storage.hh:58
@ b_round
Definition: Storage.hh:58
@ b_none
Definition: Storage.hh:58
@ b_square
Definition: Storage.hh:58
@ b_no
Definition: Storage.hh:58
@ b_pointy
Definition: Storage.hh:58
@ b_curly
Definition: Storage.hh:58
@ b_invalid
Definition: Storage.hh:58
bool is_numbered_symbol() const
Definition: Storage.cc:932
str_node(void)
Definition: Storage.cc:725
static bool compare_name_brack_par(const str_node &, const str_node &)
Definition: Storage.cc:980
bool is_quoted_string() const
Definition: Storage.cc:836
bool is_unsimplified_rational() const
Definition: Storage.cc:808
bool is_siblings_wildcard() const
Definition: Storage.cc:897
nset_t::iterator name_only()
Definition: Storage.cc:941
bool is_command() const
Definition: Storage.cc:844
bool is_object_wildcard() const
Definition: Storage.cc:879
parent_rel_t
Child nodes are related to their parent node by a so-called parent relation, which can be one of thes...
Definition: Storage.hh:62
@ p_exponent
Definition: Storage.hh:62
@ p_sub
Definition: Storage.hh:62
@ p_invalid
Definition: Storage.hh:62
@ p_property
Definition: Storage.hh:62
@ p_none
Definition: Storage.hh:62
@ p_super
Definition: Storage.hh:62
@ p_components
Definition: Storage.hh:62
rset_t::iterator multiplier
Definition: Storage.hh:73
static bool compare_name_inverse_par(const str_node &, const str_node &)
Definition: Storage.cc:988
bool is_inert_command() const
Definition: Storage.cc:857
bool is_indexplus_wildcard() const
Definition: Storage.cc:923
bool is_range_wildcard() const
Definition: Storage.cc:888
bool is_identity() const
Definition: Storage.cc:788
bool is_name_wildcard() const
Definition: Storage.cc:866
bool is_autodeclare_wildcard() const
Definition: Storage.cc:906
nset_t::iterator name
Definition: Storage.hh:72
static bool compare_names_only(const str_node &, const str_node &)
Definition: Storage.cc:974
bool is_zero() const
Definition: Storage.cc:782
flag_t fl
Definition: Storage.hh:91
bool operator==(const str_node &) const
Definition: Storage.cc:964
bool is_integer() const
Definition: Storage.cc:799
bool is_rational() const
Definition: Storage.cc:794
std::ostream & operator<<(std::ostream &, const cadabra::Ex &)
Bare output operator for Ex objects, mainly to provide a simple way to generate debugging output.
Definition: Storage.cc:1053
void multiply(rset_t::iterator &num, multiplier_t fac)
Helper functions for manipulation of multipliers.
Definition: Storage.cc:1005
Functions to handle the exchange properties of two or more symbols in a product.
Definition: Adjform.cc:83
rset_t rat_set
Definition: Storage.cc:36
std::set< multiplier_t > rset_t
Definition: Storage.hh:40
void flip_sign(rset_t::iterator &num)
Definition: Storage.cc:1029
double to_double(multiplier_t mul)
Definition: Storage.cc:43
uintptr_t hashval_t
Definition: Storage.hh:41
void zero(rset_t::iterator &num)
Definition: Storage.cc:1019
bool is_in(const T &val, const std::initializer_list< T > &list)
Definition: Storage.hh:294
std::set< std::string > nset_t
Definition: Storage.hh:39
void one(rset_t::iterator &num)
Definition: Storage.cc:1024
void half(rset_t::iterator &num)
Definition: Storage.cc:1036
void add(rset_t::iterator &num, multiplier_t fac)
Definition: Storage.cc:1012
long to_long(multiplier_t mul)
Definition: Storage.cc:38
mpq_class multiplier_t
Definition: Storage.hh:38
nset_t name_set
Definition: Storage.cc:35
std::string to_string(long num)
Definition: Storage.cc:48
Definition: Storage.hh:83
bracket_t bracket
Definition: Storage.hh:85
bool line_per_node
Definition: Storage.hh:87
bool keep_after_eval
Definition: Storage.hh:84
parent_rel_t parent_rel
Definition: Storage.hh:86