Cadabra
Computer algebra system for field theory problems
Adjform.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include <map>
5 #include <gmpxx.h>
6 #include <iosfwd>
7 #include <cstdint>
8 #include <string>
9 #include "Hash.hh"
10 #include "Kernel.hh"
11 #include "Storage.hh"
12 
13 namespace cadabra {
14 
15  // Return true if 'it' has children which are indices and not
16  // registered as Symbol or Coordinate.
17  bool has_indices(const Kernel& kernel, Ex::iterator it);
18  bool is_index(const Kernel& kernel, Ex::iterator it);
19 
20  class IndexMap;
21 
22  class Adjform
23  {
24  public:
25  using value_type = short;
28  using array_type = std::vector<value_type>;
29  using const_reference = array_type::const_reference;
30  using const_iterator = array_type::const_iterator;
31 
32  Adjform();
33  Adjform(Ex::iterator it, IndexMap& index_map, const Kernel& kernel);
34 
35  const_iterator begin() const;
36  const_iterator end() const;
37 
38  bool operator < (const Adjform& other) const;
39  bool operator == (const Adjform& other) const;
40  bool operator != (const Adjform& other) const;
41 
43 
44  size_type size() const;
45  size_type max_size() const;
46  bool empty() const;
47 
48  size_type n_free_indices() const;
49  size_type n_dummy_indices() const;
50 
51  void push_back(value_type value);
52  void swap(size_type a, size_type b);
53  void rotate(size_type n);
54 
55  uint64_t to_lehmer_code() const;
56  uint64_t max_lehmer_code() const;
57  std::string to_string() const;
58 
59  private:
61  };
62 
65 
66  // To ensure consistency when creating adjforms out of two
67  // different Ex objects an IndexMap object is required which
68  // keeps track of which numeric index represents which index
69  // name
70  class IndexMap
71  {
72  public:
74  private:
75  std::vector<Ex_hasher::result_t> data;
76  };
77 
78  class AdjformEx
79  {
80  public:
81  using rational_type = mpq_class;
82  using map_t = std::map<Adjform, rational_type>;
83  using iterator = map_t::iterator;
84  using const_iterator = map_t::const_iterator;
85 
86  AdjformEx();
87  AdjformEx(const Adjform& adjform, const rational_type& value = 1, const Ex& prefactor = Ex());
88  AdjformEx(const Adjform& adjform, const rational_type& value, Ex::iterator prefactor);
89  AdjformEx(Ex::iterator it, IndexMap& index_map, const Kernel& kernel);
90 
91  // Check if 'other' is a linear multiple of 'this' and return
92  // the numeric factor if so, otherwise returns 0
93  rational_type compare(const AdjformEx& other) const;
94 
95  void combine(const AdjformEx& other); // Add all contributions from 'other' into 'this'
96  void combine(const AdjformEx& other, rational_type factor);
97  void multiply(const rational_type& k); // Multiply all terms by a constant factor
98 
99  iterator begin();
100  const_iterator begin() const;
101  iterator end();
102  const_iterator end() const;
103 
104  void clear(); // Remove all entries
105  size_t size() const; // Number of entries
106  size_t max_size() const; // Returns the number of terms there would be if fully antisymmetrized
107  size_t n_indices() const; // Returns the number of indices each adform has
108  bool empty() const; // True if there are no entries
109 
110  const Ex& get_prefactor_ex() const;
111  Ex& get_prefactor_ex();
112  const Ex& get_tensor_ex() const;
113  Ex& get_tensor_ex();
114 
115  // Get the value of the term, or zero if it doesn't exist
116  const rational_type& get(const Adjform& adjform) const;
117  // Sets the given term to value, creating/removing the term if required
118  void set(const Adjform& adjform, const rational_type& value = 1);
119  // Adds value to the given term, creating/removing the term if required
120  void add(const Adjform& adjform, const rational_type& value = 1);
121 
122  // Symmetrize in the given indices
123  // e.g. if the only term is abcd then
124  // apply_young_symmetry({0, 1, 2}, false) -> abcd + acbd + bacd + bcad + cabd + cbad
125  // apply_young_symmetry({2, 3, 4}, true) -> abcd - abdc - acbd + acdb - adcb + adbc
126  void apply_young_symmetry(const std::vector<size_t>& indices, bool antisymmetric);
127 
128  // Symmetrize in indices starting at the indices in 'positions' with each group
129  // 'n_indices' long
130  // e.g. if the only term is abcdefg then apply_ident_symmetry({0, 2, 4}, 2) ->
131  // abcdefg + abefcdg + cdabefg + cdefabg + efabcdg + efcdabg
132  void apply_ident_symmetry(std::vector<size_t> positions, size_t n_indices);
133 
134  // Symmetrize cyclically so abc -> abc + bca + cab
135  void apply_cyclic_symmetry();
136 
137  private:
138  // Unsafe (but faster) versions of the public functions
139  void set_(const Adjform& adjform, const rational_type& value = 1);
140  void add_(const Adjform& adjform, const rational_type& value = 1);
145  };
146 }
147 
148 std::ostream& operator << (std::ostream& os, const cadabra::Adjform& adjform);
149 std::ostream& operator << (std::ostream& os, const cadabra::AdjformEx& adjex);
cadabra::AdjformEx::map_t
std::map< Adjform, rational_type > map_t
Definition: Adjform.hh:82
cadabra::Adjform::push_back
void push_back(value_type value)
Definition: Adjform.cc:172
cadabra::Adjform::array_type
std::vector< value_type > array_type
Definition: Adjform.hh:28
cadabra::Adjform::const_iterator
array_type::const_iterator const_iterator
Definition: Adjform.hh:30
Storage.hh
cadabra::IndexMap::get_free_index
Adjform::value_type get_free_index(Ex_hasher::result_t index)
Definition: Adjform.cc:311
cadabra::AdjformEx
Definition: Adjform.hh:79
Hash.hh
cadabra::Adjform::Adjform
Adjform()
Definition: Adjform.cc:101
operator<<
std::ostream & operator<<(std::ostream &os, const cadabra::Adjform &adjform)
Definition: Adjform.cc:595
cadabra::Adjform::operator[]
const_reference operator[](size_type idx) const
Definition: Adjform.cc:142
cadabra::Adjform::value_type
short value_type
Definition: Adjform.hh:25
cadabra::AdjformEx::prefactor
Ex prefactor
Definition: Adjform.hh:142
cadabra::Kernel
Definition: Kernel.hh:14
cadabra::AdjformEx::apply_ident_symmetry
void apply_ident_symmetry(std::vector< size_t > positions, size_t n_indices)
Definition: Adjform.cc:560
cadabra::AdjformEx::data
map_t data
Definition: Adjform.hh:141
cadabra::AdjformEx::AdjformEx
AdjformEx()
Definition: Adjform.cc:325
cadabra::Adjform::data
array_type data
Definition: Adjform.hh:60
cadabra::AdjformEx::iterator
map_t::iterator iterator
Definition: Adjform.hh:83
cadabra::AdjformEx::begin
iterator begin()
Definition: Adjform.cc:412
cadabra::AdjformEx::add
void add(const Adjform &adjform, const rational_type &value=1)
Definition: Adjform.cc:501
cadabra::Adjform::n_free_indices
size_type n_free_indices() const
Definition: Adjform.cc:162
cadabra::Adjform::size_type
value_type size_type
Definition: Adjform.hh:26
cadabra::AdjformEx::multiply
void multiply(const rational_type &k)
Definition: Adjform.cc:406
cadabra::IndexMap::data
std::vector< Ex_hasher::result_t > data
Definition: Adjform.hh:75
cadabra::AdjformEx::combine
void combine(const AdjformEx &other)
Definition: Adjform.cc:394
cadabra::AdjformEx::clear
void clear()
Definition: Adjform.cc:432
cadabra::is_dummy_index
bool is_dummy_index(Adjform::value_type idx)
Definition: Adjform.cc:306
cadabra::is_index
bool is_index(const Kernel &kernel, Ex::iterator it)
Definition: Adjform.cc:81
cadabra::Adjform::empty
bool empty() const
Definition: Adjform.cc:157
cadabra::Adjform::operator==
bool operator==(const Adjform &other) const
Definition: Adjform.cc:132
cadabra::AdjformEx::get
const rational_type & get(const Adjform &adjform) const
Definition: Adjform.cc:481
cadabra::Adjform::operator<
bool operator<(const Adjform &other) const
Definition: Adjform.cc:127
k
int k
Definition: passing.cc:4
cadabra::AdjformEx::empty
bool empty() const
Definition: Adjform.cc:456
cadabra::AdjformEx::end
iterator end()
Definition: Adjform.cc:422
cadabra::Adjform::begin
const_iterator begin() const
Definition: Adjform.cc:117
cadabra::Adjform::to_string
std::string to_string() const
Definition: Adjform.cc:282
cadabra::AdjformEx::tensor
Ex tensor
Definition: Adjform.hh:143
cadabra::Adjform::n_dummy_indices
size_type n_dummy_indices() const
Definition: Adjform.cc:167
cadabra::Adjform::max_lehmer_code
uint64_t max_lehmer_code() const
Definition: Adjform.cc:274
cadabra::Adjform
Definition: Adjform.hh:23
cadabra::has_indices
bool has_indices(const cadabra::Kernel &kernel, cadabra::Ex::iterator it)
Definition: Adjform.cc:91
cadabra::Adjform::swap
void swap(size_type a, size_type b)
Definition: Adjform.cc:184
cadabra::AdjformEx::set
void set(const Adjform &adjform, const rational_type &value=1)
Definition: Adjform.cc:487
cadabra::AdjformEx::apply_cyclic_symmetry
void apply_cyclic_symmetry()
Definition: Adjform.cc:575
cadabra::AdjformEx::max_size
size_t max_size() const
Definition: Adjform.cc:442
cadabra::AdjformEx::get_tensor_ex
const Ex & get_tensor_ex() const
Definition: Adjform.cc:471
cadabra::Ex
Basic storage class for symbolic mathemematical expressions.
Definition: Storage.hh:140
cadabra::Adjform::end
const_iterator end() const
Definition: Adjform.cc:122
cadabra::Adjform::max_size
size_type max_size() const
Definition: Adjform.cc:152
cadabra::Adjform::difference_type
value_type difference_type
Definition: Adjform.hh:27
cadabra::AdjformEx::add_
void add_(const Adjform &adjform, const rational_type &value=1)
Definition: Adjform.cc:507
cadabra
Functions to handle the exchange properties of two or more symbols in a product.
Definition: Adjform.cc:80
cadabra::Adjform::to_lehmer_code
uint64_t to_lehmer_code() const
Definition: Adjform.cc:212
cadabra::IndexMap
Definition: Adjform.hh:71
cadabra::Ex_hasher::result_t
size_t result_t
Definition: Hash.hh:26
cadabra::is_free_index
bool is_free_index(Adjform::value_type idx)
Definition: Adjform.cc:301
cadabra::AdjformEx::n_indices
size_t n_indices() const
Definition: Adjform.cc:449
Kernel.hh
cadabra::AdjformEx::const_iterator
map_t::const_iterator const_iterator
Definition: Adjform.hh:84
cadabra::AdjformEx::apply_young_symmetry
void apply_young_symmetry(const std::vector< size_t > &indices, bool antisymmetric)
Definition: Adjform.cc:520
cadabra::Adjform::size
size_type size() const
Definition: Adjform.cc:147
cadabra::AdjformEx::rational_type
mpq_class rational_type
Definition: Adjform.hh:81
cadabra::Adjform::const_reference
array_type::const_reference const_reference
Definition: Adjform.hh:29
cadabra::Adjform::rotate
void rotate(size_type n)
Definition: Adjform.cc:199
cadabra::Adjform::operator!=
bool operator!=(const Adjform &other) const
Definition: Adjform.cc:137
cadabra::AdjformEx::size
size_t size() const
Definition: Adjform.cc:437
cadabra::AdjformEx::compare
rational_type compare(const AdjformEx &other) const
Definition: Adjform.cc:374
cadabra::AdjformEx::set_
void set_(const Adjform &adjform, const rational_type &value=1)
Definition: Adjform.cc:493
cadabra::AdjformEx::zero
static rational_type zero
Definition: Adjform.hh:144
cadabra::AdjformEx::get_prefactor_ex
const Ex & get_prefactor_ex() const
Definition: Adjform.cc:461