GiNaC 1.8.8
symmetry.h
Go to the documentation of this file.
1
5/*
6 * GiNaC Copyright (C) 1999-2025 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:
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.
#define GINAC_DECLARE_UNARCHIVER(classname)
Helper macros to register a class with (un)archiving (a.k.a.
Definition archive.h:219
Sum of expressions.
Definition add.h:32
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition archive.h:49
This class holds archived versions of GiNaC expressions (class ex).
Definition archive.h:255
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:73
const_iterator begin() const noexcept
Definition ex.h:663
Base class for print_contexts.
Definition print.h:102
Context for tree-like output for debugging.
Definition print.h:146
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:86
void validate(unsigned n)
Verify that all indices of this node are in the range [0..n-1].
Definition symmetry.cpp:311
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:437
bool has_nonsymmetric() const
Check whether this node involves anything non symmetric.
Definition symmetry.cpp:264
symmetry & add(const symmetry &c)
Add child node, check index sets for consistency.
Definition symmetry.cpp:288
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:205
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:276
std::set< unsigned > indices
Sorted union set of all indices handled by this node.
Definition symmetry.h:106
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:182
void do_print_tree(const print_tree &c, unsigned level) const
Definition symmetry.cpp:231
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:2428
size_t last
Definition factor.cpp:1434
Definition add.cpp:36
const symmetry & antisymmetric4()
Definition symmetry.cpp:385
const symmetry & symmetric3()
Definition symmetry.cpp:361
const symmetry & not_symmetric()
Definition symmetry.cpp:349
symmetry sy_symm()
Definition symmetry.h:121
ex symmetrize(const ex &thisex)
Definition ex.h:809
const symmetry & antisymmetric3()
Definition symmetry.cpp:379
const symmetry & antisymmetric2()
Definition symmetry.cpp:373
const symmetry & symmetric2()
Definition symmetry.cpp:355
symmetry sy_anti()
Definition symmetry.h:126
ex antisymmetrize(const ex &thisex)
Definition ex.h:815
const symmetry & symmetric4()
Definition symmetry.cpp:367
static ex symm(const ex &e, exvector::const_iterator first, exvector::const_iterator last, bool asymmetric)
Definition symmetry.cpp:484
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:437
ex symmetrize_cyclic(const ex &thisex)
Definition ex.h:821
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:152

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