X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fsymmetry.cpp;h=2312526e67a367df028a1ec1e68f2053f5e4961a;hp=a07fbe7eb11ccce7b5c8edc8fb623884f1536757;hb=1566be23d91ed1311bee2071bdae9ef93d0b7cf6;hpb=bf28c9f0b06f349b3a655ee7c152d9ab77a900b7 diff --git a/ginac/symmetry.cpp b/ginac/symmetry.cpp index a07fbe7e..2312526e 100644 --- a/ginac/symmetry.cpp +++ b/ginac/symmetry.cpp @@ -36,6 +36,20 @@ namespace GiNaC { GINAC_IMPLEMENT_REGISTERED_CLASS(symmetry, basic) +/* + Some notes about the structure of a symmetry tree: + - The leaf nodes of the tree are of type "none", have one index, and no + children (of course). They are constructed by the symmetry(unsigned) + constructor. + - Leaf nodes are the only nodes that only have one index. + - Container nodes contain two or more children. The "indices" set member + is the set union of the index sets of all children, and the "children" + vector stores the children themselves. + - The index set of each child of a "symm", "anti" or "cycl" node must + have the same size. It follows that the children of such a node are + either all leaf nodes, or all container nodes with two or more indices. +*/ + ////////// // default constructor, destructor, copy constructor assignment operator and helpers ////////// @@ -135,41 +149,77 @@ void symmetry::archive(archive_node &n) const DEFAULT_UNARCHIVE(symmetry) ////////// -// functions overriding virtual functions from bases classes +// functions overriding virtual functions from base classes ////////// int symmetry::compare_same_type(const basic & other) const { GINAC_ASSERT(is_of_type(other, symmetry)); - const symmetry &o = static_cast(other); // All symmetry trees are equal. They are not supposed to appear in // ordinary expressions anyway... return 0; } -void symmetry::print(const print_context & c, unsigned level = 0) const +void symmetry::print(const print_context & c, unsigned level) const { debugmsg("symmetry print", LOGLEVEL_PRINT); - if (children.empty()) { - if (indices.size() > 0) - c.s << *(indices.begin()); - } else { + if (is_of_type(c, print_tree)) { + + c.s << std::string(level, ' ') << class_name() + << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec + << ", type="; + switch (type) { - case none: c.s << '!'; break; - case symmetric: c.s << '+'; break; - case antisymmetric: c.s << '-'; break; - case cyclic: c.s << '@'; break; - default: c.s << '?'; break; + case none: c.s << "none"; break; + case symmetric: c.s << "symm"; break; + case antisymmetric: c.s << "anti"; break; + case cyclic: c.s << "cycl"; break; + default: c.s << ""; break; + } + + c.s << ", indices=("; + if (!indices.empty()) { + std::set::const_iterator i = indices.begin(), end = indices.end(); + --end; + while (i != end) + c.s << *i++ << ","; + c.s << *i; + } + c.s << ")\n"; + + unsigned delta_indent = static_cast(c).delta_indent; + exvector::const_iterator i = children.begin(), end = children.end(); + while (i != end) { + i->print(c, level + delta_indent); + ++i; } - c.s << '('; - for (unsigned i=0; i 0) + c.s << *(indices.begin()); + else + c.s << "none"; + } else { + switch (type) { + case none: c.s << '!'; break; + case symmetric: c.s << '+'; break; + case antisymmetric: c.s << '-'; break; + case cyclic: c.s << '@'; break; + default: c.s << '?'; break; + } + c.s << '('; + unsigned num = children.size(); + for (unsigned i=0; i