GiNaC 1.8.10
symmetry.h
Go to the documentation of this file.
1
5/*
6 * GiNaC Copyright (C) 1999-2026 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, see <https://www.gnu.org/licenses/>.
20 */
21
22#ifndef GINAC_SYMMETRY_H
23#define GINAC_SYMMETRY_H
24
25#include "ex.h"
26#include "archive.h"
27
28#include <set>
29
30namespace GiNaC {
31
32class sy_is_less;
33class sy_swap;
34
37class symmetry : public basic
38{
39 friend class sy_is_less;
40 friend class sy_swap;
41 friend int canonicalize(exvector::iterator v, const symmetry &symm);
42
44
45 // types
46public:
54
55 // other constructors
56public:
58 symmetry(unsigned i);
59
61 symmetry(symmetry_type t, const symmetry &c1, const symmetry &c2);
62
63 // functions overriding virtual functions from base classes
64public:
66 void archive(archive_node& n) const override;
68 void read_archive(const archive_node& n, lst& syms) override;
69protected:
70 unsigned calchash() const override;
71
72 // non-virtual functions in this class
73public:
75 symmetry_type get_type() const {return type;}
76
79
81 symmetry &add(const symmetry &c);
82
87 void validate(unsigned n);
88
90 bool has_symmetry() const {return type != none || !children.empty(); }
92 bool has_nonsymmetric() const;
94 bool has_cyclic() const;
95protected:
96 void do_print(const print_context & c, unsigned level) const;
97 void do_print_tree(const print_tree & c, unsigned level) const;
98
99 // member variables
100private:
103
105 std::set<unsigned> indices;
106
109};
111
112
113// global functions
114
115inline symmetry sy_none() { return symmetry(); }
116inline symmetry sy_none(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::none, c1, c2); }
117inline symmetry sy_none(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::none, c1, c2).add(c3); }
118inline 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); }
119
121inline symmetry sy_symm(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::symmetric, c1, c2); }
122inline symmetry sy_symm(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::symmetric, c1, c2).add(c3); }
123inline 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); }
124
126inline symmetry sy_anti(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::antisymmetric, c1, c2); }
127inline symmetry sy_anti(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::antisymmetric, c1, c2).add(c3); }
128inline 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); }
129
130inline symmetry sy_cycl() { symmetry s; s.set_type(symmetry::cyclic); return s; }
131inline symmetry sy_cycl(const symmetry &c1, const symmetry &c2) { return symmetry(symmetry::cyclic, c1, c2); }
132inline symmetry sy_cycl(const symmetry &c1, const symmetry &c2, const symmetry &c3) { return symmetry(symmetry::cyclic, c1, c2).add(c3); }
133inline 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); }
134
135// These return references to preallocated common symmetries (similar to
136// the numeric flyweights).
137const symmetry & not_symmetric();
138const symmetry & symmetric2();
139const symmetry & symmetric3();
140const symmetry & symmetric4();
141const symmetry & antisymmetric2();
142const symmetry & antisymmetric3();
143const symmetry & antisymmetric4();
144
152extern int canonicalize(exvector::iterator v, const symmetry &symm);
153
155ex symmetrize(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
156
158inline ex symmetrize(const ex & e, const exvector & v)
159{
160 return symmetrize(e, v.begin(), v.end());
161}
162
164ex antisymmetrize(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
165
167inline ex antisymmetrize(const ex & e, const exvector & v)
168{
169 return antisymmetrize(e, v.begin(), v.end());
170}
171
174ex symmetrize_cyclic(const ex & e, exvector::const_iterator first, exvector::const_iterator last);
175
178inline ex symmetrize_cyclic(const ex & e, const exvector & v)
179{
180 return symmetrize(e, v.begin(), v.end());
181}
182
183} // namespace GiNaC
184
185#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:218
Sum of expressions.
Definition add.h:31
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition archive.h:48
This class holds archived versions of GiNaC expressions (class ex).
Definition archive.h:254
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition basic.h:104
Wrapper template for making GiNaC classes out of STL containers.
Definition container.h:72
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:101
Context for tree-like output for debugging.
Definition print.h:145
This class describes the symmetry of a group of indices.
Definition symmetry.h:38
void read_archive(const archive_node &n, lst &syms) override
Read (a.k.a.
Definition symmetry.cpp:85
void validate(unsigned n)
Verify that all indices of this node are in the range [0..n-1].
Definition symmetry.cpp:310
symmetry_type
Type of symmetry.
Definition symmetry.h:48
@ symmetric
totally symmetric
Definition symmetry.h:50
@ antisymmetric
totally antisymmetric
Definition symmetry.h:51
@ none
no symmetry properties
Definition symmetry.h:49
@ cyclic
cyclic symmetry
Definition symmetry.h:52
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:436
bool has_nonsymmetric() const
Check whether this node involves anything non symmetric.
Definition symmetry.cpp:263
symmetry & add(const symmetry &c)
Add child node, check index sets for consistency.
Definition symmetry.cpp:287
symmetry_type type
Type of symmetry described by this node.
Definition symmetry.h:102
void do_print(const print_context &c, unsigned level) const
Definition symmetry.cpp:204
exvector children
Vector of child nodes.
Definition symmetry.h:108
symmetry_type get_type() const
Get symmetry type.
Definition symmetry.h:75
void set_type(symmetry_type t)
Set symmetry type.
Definition symmetry.h:78
bool has_cyclic() const
Check whether this node involves a cyclic symmetry.
Definition symmetry.cpp:275
std::set< unsigned > indices
Sorted union set of all indices handled by this node.
Definition symmetry.h:105
bool has_symmetry() const
Check whether this node actually represents any kind of symmetry.
Definition symmetry.h:90
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:181
void do_print_tree(const print_tree &c, unsigned level) const
Definition symmetry.cpp:230
Interface to GiNaC's light-weight expression handles.
size_t n
Definition factor.cpp:1431
size_t c
Definition factor.cpp:756
exset syms
Definition factor.cpp:2427
size_t last
Definition factor.cpp:1433
Definition add.cpp:35
const symmetry & antisymmetric4()
Definition symmetry.cpp:384
const symmetry & symmetric3()
Definition symmetry.cpp:360
const symmetry & not_symmetric()
Definition symmetry.cpp:348
symmetry sy_symm()
Definition symmetry.h:120
ex symmetrize(const ex &thisex)
Definition ex.h:808
const symmetry & antisymmetric3()
Definition symmetry.cpp:378
const symmetry & antisymmetric2()
Definition symmetry.cpp:372
const symmetry & symmetric2()
Definition symmetry.cpp:354
symmetry sy_anti()
Definition symmetry.h:125
ex antisymmetrize(const ex &thisex)
Definition ex.h:814
const symmetry & symmetric4()
Definition symmetry.cpp:366
static ex symm(const ex &e, exvector::const_iterator first, exvector::const_iterator last, bool asymmetric)
Definition symmetry.cpp:483
symmetry sy_cycl()
Definition symmetry.h:130
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:436
ex symmetrize_cyclic(const ex &thisex)
Definition ex.h:820
symmetry sy_none()
Definition symmetry.h:115
std::vector< ex > exvector
Definition basic.h:47
#define GINAC_DECLARE_REGISTERED_CLASS(classname, supername)
Macro for inclusion in the declaration of each registered class.
Definition registrar.h:151

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