Cadabra Computer algebra system for field theory problems

#include <evaluate.hh>

## Public Member Functions

evaluate (const Kernel &, Ex &, const Ex &component_values, bool rhs=false, bool simplify=true)

virtual bool can_apply (iterator) override

virtual result_t apply (iterator &) override

void merge_components (iterator it1, iterator it2)
Merge the information in two 'components' nodes at the given iterators, moving all out of the second one into the first one. More...

Public Member Functions inherited from cadabra::Algorithm
Algorithm (const Kernel &, Ex &)
Initialise the algorithm with a reference to the expression tree, but do not yet do anything with this tree. More...

virtual ~Algorithm ()

void set_progress_monitor (ProgressMonitor *)
Provide the algorithm with a ProgressMonitor object on which to register (nested) progress information, to be reported out-of-band to a client. More...

result_t apply_generic (bool deep=true, bool repeat=false, unsigned int depth=0)
The main entry points for running algorithms, which traverse the tree post-order ('child before parent'). More...

result_t apply_generic (iterator &, bool deep, bool repeat, unsigned int depth)

result_t apply_pre_order (bool repeat=false)
Apply algorithm with alternative traversal: starting from the top node, traverse the tree pre-order ('parent before child') and once the algorithm acts at a given node, do not traverse the subtree below anymore. More...

bool check_consistency (iterator) const
Given an expression top node, check index consistency. More...

bool check_index_consistency (iterator) const

bool check_degree_consistency (iterator) const
Given an expression top node, check differential form degree consistency. More...

void report_progress (const std::string &, int todo, int done, int count=2)

index_iterator begin_index (iterator it) const

index_iterator end_index (iterator it) const

unsigned int number_of_indices (iterator it)

std::string get_index_set_name (iterator it) const

bool rename_replacement_dummies (iterator, bool still_inside_algo=false)
Rename the dummies in the sub-tree starting with head at the given iterator. More...

Public Member Functions inherited from cadabra::IndexClassifier
IndexClassifier (const Kernel &)

void fill_index_position_map (Ex::iterator, const index_map_t &, index_position_map_t &) const
Routines to find and classify all indices in an expression, taking into account sums and products. More...

void fill_map (index_map_t &, Ex::sibling_iterator, Ex::sibling_iterator) const

void print_classify_indices (std::ostream &, Ex::iterator) const

void determine_intersection (index_map_t &one, index_map_t &two, index_map_t &target, bool move_out=false) const
Determine those indices in 'two' which have a name which is identical to an index name occurring in 'one'. More...

void classify_add_index (Ex::iterator it, index_map_t &ind_free, index_map_t &ind_dummy) const

void classify_indices_up (Ex::iterator, index_map_t &ind_free, index_map_t &ind_dummy) const
Classify indices bottom-up, that is, given a node, it goes up the tree to find. More...

void classify_indices (Ex::iterator, index_map_t &ind_free, index_map_t &ind_dummy) const
Classify indices top-down, that is, finds the free indices and all dummy index pairs used in the full subtree below a given node. More...

int max_numbered_name_one (const std::string &nm, const index_map_t *one) const

int max_numbered_name (const std::string &, const index_map_t *m1, const index_map_t *m2=0, const index_map_t *m3=0, const index_map_t *m4=0, const index_map_t *m5=0) const

Ex get_dummy (const list_property *, const index_map_t *m1, const index_map_t *m2=0, const index_map_t *m3=0, const index_map_t *m4=0, const index_map_t *m5=0) const

Ex get_dummy (const list_property *, Ex::iterator) const

Ex get_dummy (const list_property *, Ex::iterator, Ex::iterator) const

bool index_in_set (Ex, const index_map_t *) const

void dumpmap (std::ostream &, const index_map_t &) const

index_map_t::iterator find_modulo_parent_rel (Ex::iterator it, index_map_t &imap) const
Find an index in the set, not taking into account index position. More...

## Private Member Functions

bool is_component (iterator it) const

bool is_scalar_function (iterator it) const

iterator handle_components (iterator it)

iterator handle_sum (iterator it)

iterator handle_prod (iterator it)

iterator handle_derivative (iterator it)

iterator handle_epsilon (iterator it)

iterator handle_factor (sibling_iterator sib, const index_map_t &full_ind_free)
Replace a single factor with a 'components' ... More...

iterator dense_factor (iterator sib, const index_map_t &ind_free, const index_map_t &ind_dummy)
Expand a tensor factor into a components node with all components written out explicitly. More...

void merge_component_children (iterator it)
Merge entries in a single 'components' node when they are for the same index value(s). More...

void cleanup_components (iterator it1)
Cleanup all components in a 'components' node; that is, call the cleanup_dispatch function on them. More...

void simplify_components (iterator)
Simplify all components of a 'components' node by running sympy's simplify on them. More...

iterator wrap_scalar_in_components_node (iterator sib)
Wrap a non-component scalar node in a 'components' node. More...

void unwrap_scalar_in_components_node (iterator sib)
Inverse of the above. More...

std::set< Ex, tree_exact_less_objdependencies (iterator it)
Determine all the Coordinate dependencies of the object at 'it'. More...

## Private Attributes

const Excomponents

bool only_rhs

bool call_sympy

typedef Ex::iterator iterator

typedef Ex::post_order_iterator post_order_iterator

typedef Ex::sibling_iterator sibling_iterator

typedef Ex::result_t result_t

typedef std::multimap< Ex, Ex::iterator, tree_exact_less_for_indexmap_objindex_map_t
A map from a pattern to the position where it occurs in the tree. More...

typedef std::map< Ex::iterator, int, Ex::iterator_base_less > index_position_map_t
A map from the position of each index to the sequential index. More...

Static Public Member Functions inherited from cadabra::Algorithm
static unsigned int number_of_indices (const Properties &, iterator it)

static unsigned int number_of_direct_indices (iterator it)

static bool is_termlike (iterator)
Determines whether the indicated node is 'like a term in a sum'. More...

static bool is_factorlike (iterator)
Determines whether the indicated node is 'like a factor in a product'. More...

bool interrupted

unsigned int number_of_calls

unsigned int number_of_modifications

bool suppress_normal_output

Stopwatch index_sw

Stopwatch get_dummy_sw

Stopwatch report_progress_stopwatch

typedef std::pair< sibling_iterator, sibling_iteratorrange_t
Finding objects in sets. More...

typedef std::vector< range_trange_vector_t

Protected Member Functions inherited from cadabra::Algorithm
int index_parity (iterator) const

bool contains (sibling_iterator from, sibling_iterator to, sibling_iterator arg)

void find_argument_lists (range_vector_t &, bool only_comma_lists=true) const

template<class Iter >
range_vector_t::iterator find_arg_superset (range_vector_t &, Iter st, Iter nd)

range_vector_t::iterator find_arg_superset (range_vector_t &, sibling_iterator it)

unsigned int locate_single_object (Ex::iterator obj_to_find, Ex::iterator st, Ex::iterator nd, std::vector< unsigned int > &store)

bool locate_object_set (const Ex &objs, Ex::iterator st, Ex::iterator nd, std::vector< unsigned int > &store)

bool is_single_term (iterator)
Take a single non-product node in a sum and wrap it in a product node, so it can be handled on the same footing as a proper product. More...

bool is_nonprod_factor_in_prod (iterator)

bool prod_wrap_single_term (iterator &)

bool prod_unwrap_single_term (iterator &)

bool sum_wrap_single_term (iterator &)

bool sum_unwrap_single_term (iterator &)

void force_node_wrap (iterator &, std::string)
Wrap a term in a product or sum in a node with indicated name, irrespective of its parent (it usually makes more sense to call the safer prod_wrap_single_term or sum_wrap_single_term above). More...

bool separated_by_derivative (iterator, iterator, iterator check_dependence) const
Figure out whether two objects (commonly indices) are separated by a derivative operator, as in. More...

void pushup_multiplier (iterator)

template<class BinaryPredicate >
unsigned int intersection_number (sibling_iterator, sibling_iterator, sibling_iterator, sibling_iterator, BinaryPredicate) const
Determine the number of elements in the first range which also occur in the second range. More...

void node_zero (iterator)

void node_one (iterator)

void node_integer (iterator, int)

Static Protected Member Functions inherited from cadabra::Algorithm
static bool less_without_numbers (nset_t::iterator, nset_t::iterator)

static bool equal_without_numbers (nset_t::iterator, nset_t::iterator)

static bool compare_ (const str_node &, const str_node &)

Extr

ProgressMonitorpm

bool traverse_ldots

const Kernelkernel

## ◆ evaluate()

 evaluate::evaluate ( const Kernel & k, Ex & tr, const Ex & component_values, bool rhs = false, bool simplify = true )

## ◆ apply()

 Algorithm::result_t evaluate::apply ( iterator & it )
overridevirtual

## ◆ can_apply()

 bool evaluate::can_apply ( iterator it )
overridevirtual

## ◆ cleanup_components()

 void evaluate::cleanup_components ( iterator it1 )
private

Cleanup all components in a 'components' node; that is, call the cleanup_dispatch function on them.

## ◆ dense_factor()

 Ex::iterator evaluate::dense_factor ( iterator sib, const index_map_t & ind_free, const index_map_t & ind_dummy )
private

Expand a tensor factor into a components node with all components written out explicitly.

Used when there is no sparse rule matching this factor.

## ◆ dependencies()

 std::set< Ex, tree_exact_less_obj > evaluate::dependencies ( iterator it )
private

Determine all the Coordinate dependencies of the object at 'it'.

For the time being this can only be a 'components' node.

## ◆ handle_components()

 Ex::iterator evaluate::handle_components ( iterator it )
private

## ◆ handle_derivative()

 Ex::iterator evaluate::handle_derivative ( iterator it )
private

## ◆ handle_epsilon()

 Ex::iterator evaluate::handle_epsilon ( iterator it )
private

## ◆ handle_factor()

 Ex::iterator evaluate::handle_factor ( sibling_iterator sib, const index_map_t & full_ind_free )
private

Replace a single factor with a 'components' ...

The full_ind_free argument can contain a list of indices in the order in which values should be stored in index value sets.

## ◆ handle_prod()

 Ex::iterator evaluate::handle_prod ( iterator it )
private

## ◆ handle_sum()

 Ex::iterator evaluate::handle_sum ( iterator it )
private

## ◆ is_component()

 bool evaluate::is_component ( iterator it ) const
private

## ◆ is_scalar_function()

 bool evaluate::is_scalar_function ( iterator it ) const
private

## ◆ merge_component_children()

 void evaluate::merge_component_children ( iterator it )
private

Merge entries in a single 'components' node when they are for the same index value(s).

## ◆ merge_components()

 void evaluate::merge_components ( iterator it1, iterator it2 )

Merge the information in two 'components' nodes at the given iterators, moving all out of the second one into the first one.

## ◆ simplify_components()

 void evaluate::simplify_components ( iterator it )
private

Simplify all components of a 'components' node by running sympy's simplify on them.

Returns a replacement iterator to the top.

## ◆ unwrap_scalar_in_components_node()

 void evaluate::unwrap_scalar_in_components_node ( iterator sib )
private

Inverse of the above.

## ◆ wrap_scalar_in_components_node()

 Algorithm::iterator evaluate::wrap_scalar_in_components_node ( iterator sib )
private

Wrap a non-component scalar node in a 'components' node.