GiNaC 1.8.7
symmetry.h
Go to the documentation of this file.
1
5/*
6 * GiNaC Copyright (C) 1999-2023 Johannes Gutenberg University Mainz, Germany
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#ifndef GINAC_SYMMETRY_H
24#define GINAC_SYMMETRY_H
25
26#include "ex.h"
27#include "archive.h"
28
29#include <set>
30
31namespace GiNaC {
32
33class sy_is_less;
34class sy_swap;
35
38class symmetry : public basic
39{
40 friend class sy_is_less;
41 friend class sy_swap;
42 friend int canonicalize(exvector::iterator v, const symmetry &symm);
43
45
46 // types
47public:
49 typedef enum {
53 cyclic
55
56 // other constructors
57public:
59 symmetry(unsigned i);
60
62 symmetry(symmetry_type t, const symmetry &c1, const symmetry &c2);
63
64 // functions overriding virtual functions from base classes
65public:
67 void archive(archive_node& n) const override;
69 void read_archive(const archive_node& n, lst& syms) override;
70protected:
71 unsigned calchash() const override;
72
73 // non-virtual functions in this class
74public:
76 symmetry_type get_type() const {return type;}
77
80
82 symmetry &add(const symmetry &c);
83
88 void validate(unsigned n);
89
91 bool has_symmetry() const {return type != none || !children.empty(); }
93 bool has_nonsymmetric() const;
95 bool has_cyclic() const;
96protected:
97 void do_print(const print_context & c, unsigned level) const;
98 void do_print_tree(const print_tree & c, unsigned level) const;
99
100 // member variables
101private:
104
106 std::set<unsigned> indices;
107
110};
112
113
114// global functions
115
116inline symmetry sy_none() { return symmetry(); }
117inline symmetry sy_none(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::none, c1, c2); }
118inline symmetry sy_none(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::none, c1, c2).add(c3); }
119inline symmetry sy_none(const symmetry &c1, const symmetry &c2, const symmetry &c3, const symmetry &c4) { return symmetry(symmetry::none, c1, c2).add(c3).add(c4); }
120
122inline symmetry sy_symm(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::symmetric, c1, c2); }
123inline symmetry sy_symm(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::symmetric, c1, c2).add(c3); }
124inline symmetry sy_symm(const symmetry &c1, const symmetry &c2, const symmetry &c3, const symmetry &c4) { return symmetry(symmetry::symmetric, c1, c2).add(c3).add(c4); }
125
127inline symmetry sy_anti(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::antisymmetric, c1, c2); }
128inline symmetry sy_anti(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::antisymmetric, c1, c2).add(c3); }
129inline symmetry sy_anti(const symmetry &c1, const symmetry &c2, const symmetry &c3, const symmetry &c4) { return symmetry(symmetry::antisymmetric, c1, c2).add(c3).add(c4); }
130
131inline symmetry sy_cycl() { symmetry s; s.set_type(symmetry::cyclic); return s; }
132inline symmetry sy_cycl(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::cyclic, c1, c2); }
133inline symmetry sy_cycl(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::cyclic, c1, c2).add(c3); }
134inline symmetry sy_cycl(const symmetry &c1, const symmetry &c2, const symmetry &c3, const symmetry &c4) { return symmetry(symmetry::cyclic, c1, c2).add(c3).add(c4); }
135
136// These return references to preallocated common symmetries (similar to
137// the numeric flyweights).
138const symmetry & not_symmetric();
139const symmetry & symmetric2();
140const symmetry & symmetric3();
141const symmetry & symmetric4();
142const symmetry & antisymmetric2();
143const symmetry & antisymmetric3();
144const symmetry & antisymmetric4();
145
153extern int canonicalize(exvector::iterator v, const symmetry &symm);
154
156ex symmetrize(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
157
159inline ex symmetrize(const ex & e, const exvector & v)
160{
161 return symmetrize(e, v.begin(), v.end());
162}
163
165ex antisymmetrize(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
166
168inline ex antisymmetrize(const ex & e, const exvector & v)
169{
170 return antisymmetrize(e, v.begin(), v.end());
171}
172
175ex symmetrize_cyclic(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
176
179inline ex symmetrize_cyclic(const ex & e, const exvector & v)
180{
181 return symmetrize(e, v.begin(), v.end());
182}
183
184} // namespace GiNaC
185
186#endif // ndef GINAC_SYMMETRY_H
Archiving of GiNaC expressions.
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition: archive.h:49
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition: basic.h:105
Wrapper template for making GiNaC classes out of STL containers.
Definition: container.h:73
Lightweight wrapper for GiNaC's symbolic objects.
Definition: ex.h:72
const_iterator begin() const noexcept
Definition: ex.h:662
Base class for print_contexts.
Definition: print.h:103
Context for tree-like output for debugging.
Definition: print.h:147
This class describes the symmetry of a group of indices.
Definition: symmetry.h:39
void read_archive(const archive_node &n, lst &syms) override
Read (a.k.a.
Definition: symmetry.cpp:87
void validate(unsigned n)
Verify that all indices of this node are in the range [0..n-1].
Definition: symmetry.cpp:312
symmetry_type
Type of symmetry.
Definition: symmetry.h:49
@ symmetric
totally symmetric
Definition: symmetry.h:51
@ antisymmetric
totally antisymmetric
Definition: symmetry.h:52
@ none
no symmetry properties
Definition: symmetry.h:50
@ cyclic
cyclic symmetry
Definition: symmetry.h:53
friend int canonicalize(exvector::iterator v, const symmetry &symm)
Canonicalize the order of elements of an expression vector, according to the symmetry properties defi...
Definition: symmetry.cpp:438
bool has_nonsymmetric() const
Check whether this node involves anything non symmetric.
Definition: symmetry.cpp:265
symmetry & add(const symmetry &c)
Add child node, check index sets for consistency.
Definition: symmetry.cpp:289
symmetry_type type
Type of symmetry described by this node.
Definition: symmetry.h:103
void do_print(const print_context &c, unsigned level) const
Definition: symmetry.cpp:206
exvector children
Vector of child nodes.
Definition: symmetry.h:109
symmetry_type get_type() const
Get symmetry type.
Definition: symmetry.h:76
void set_type(symmetry_type t)
Set symmetry type.
Definition: symmetry.h:79
bool has_cyclic() const
Check whether this node involves a cyclic symmetry.
Definition: symmetry.cpp:277
std::set< unsigned > indices
Sorted union set of all indices handled by this node.
Definition: symmetry.h:106
symmetry(unsigned i)
Create leaf node that represents one index.
Definition: symmetry.cpp:70
bool has_symmetry() const
Check whether this node actually represents any kind of symmetry.
Definition: symmetry.h:91
unsigned calchash() const override
Compute the hash value of an object and if it makes sense to store it in the objects status_flags,...
Definition: symmetry.cpp:183
void do_print_tree(const print_tree &c, unsigned level) const
Definition: symmetry.cpp:232
void archive(archive_node &n) const override
Save (a.k.a.
Definition: symmetry.cpp:119
Interface to GiNaC's light-weight expression handles.
size_t n
Definition: factor.cpp:1432
size_t c
Definition: factor.cpp:757
exset syms
Definition: factor.cpp:2429
size_t last
Definition: factor.cpp:1434
Definition: add.cpp:38
const symmetry & antisymmetric4()
Definition: symmetry.cpp:386
const symmetry & symmetric3()
Definition: symmetry.cpp:362
const symmetry & not_symmetric()
Definition: symmetry.cpp:350
symmetry sy_symm()
Definition: symmetry.h:121
ex symmetrize(const ex &thisex)
Definition: ex.h:808
const symmetry & antisymmetric3()
Definition: symmetry.cpp:380
GINAC_DECLARE_UNARCHIVER(add)
const symmetry & antisymmetric2()
Definition: symmetry.cpp:374
const symmetry & symmetric2()
Definition: symmetry.cpp:356
symmetry sy_anti()
Definition: symmetry.h:126
ex antisymmetrize(const ex &thisex)
Definition: ex.h:814
const symmetry & symmetric4()
Definition: symmetry.cpp:368
static ex symm(const ex &e, exvector::const_iterator first, exvector::const_iterator last, bool asymmetric)
Definition: symmetry.cpp:485
symmetry sy_cycl()
Definition: symmetry.h:131
int canonicalize(exvector::iterator v, const symmetry &symm)
Canonicalize the order of elements of an expression vector, according to the symmetry properties defi...
Definition: symmetry.cpp:438
ex symmetrize_cyclic(const ex &thisex)
Definition: ex.h:820
symmetry sy_none()
Definition: symmetry.h:116
std::vector< ex > exvector
Definition: basic.h:48
#define GINAC_DECLARE_REGISTERED_CLASS(classname, supername)
Macro for inclusion in the declaration of each registered class.
Definition: registrar.h:153

This page is part of the GiNaC developer's reference. It was generated automatically by doxygen. For an introduction, see the tutorial.