- fixes to the indentation
[ginac.git] / ginac / color.h
1 /** @file color.h
2  *
3  *  Interface to GiNaC's color objects. */
4
5 /*
6  *  GiNaC Copyright (C) 1999-2000 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #ifndef __GINAC_COLOR_H__
24 #define __GINAC_COLOR_H__
25
26 #include <string>
27 #include <vector>
28 #include "indexed.h"
29 #include "ex.h"
30
31 #ifndef NO_NAMESPACE_GINAC
32 namespace GiNaC {
33 #endif // ndef NO_NAMESPACE_GINAC
34
35 const unsigned MAX_REPRESENTATION_LABELS = 4;
36 const unsigned COLOR_EIGHT = 8; // N*N-1
37 const unsigned COLOR_THREE = 3; // N
38
39 // typedef std::vector<exvector> exvectorvector;
40 typedef std::vector<exvector,malloc_alloc> exvectorvector; // CINT does not like vector<...,default_alloc>
41
42 /** Base class for color object */
43 class color : public indexed
44 {
45         GINAC_DECLARE_REGISTERED_CLASS(color, indexed)
46
47 // friends
48
49         friend color color_ONE(unsigned rl);
50         friend color color_T(const ex & a, unsigned rl);
51         friend color color_f(const ex & a, const ex & b, const ex & c);
52         friend color color_d(const ex & a, const ex & b, const ex & c);
53         friend ex color_h(const ex & a, const ex & b, const ex & c);
54         friend color color_delta8(const ex & a, const ex & b);
55         friend unsigned subs_index_in_exvector(exvector & v, const ex & is, const ex & ir);
56         friend void split_color_string_in_parts(const exvector & v, exvector & delta8vec,
57                                                 exvector & fvec, exvector & dvec,
58                                                 exvectorvector & Tvecs,
59                                                 exvectorvector & ONEvecs,
60                                                 exvector & unknownvec);
61         friend exvector recombine_color_string(exvector & delta8vec, exvector & fvec,
62                                                exvector & dvec, exvectorvector & Tvecs,
63                                                exvectorvector & ONEvecs, exvector & unknownvec);
64         friend ex color_trace_of_one_representation_label(const exvector & v);
65         friend ex color_trace(const exvector & v, unsigned rl);
66         friend ex simplify_pure_color_string(const ex & e);
67         friend ex simplify_color(const ex & e);
68
69         
70 // types
71
72 public:
73         typedef enum {
74                 invalid,        // not properly constructed by one of the friend functions
75                 color_T,
76                 color_f,
77                 color_d,
78                 color_delta8,
79                 color_ONE
80         } color_types;
81         
82 // member functions
83
84         // default constructor, destructor, copy constructor assignment operator and helpers
85 public:
86         color();
87         ~color();
88         color(const color & other);
89         const color & operator=(const color & other);
90 protected:
91         void copy(const color & other); 
92         void destroy(bool call_parent);
93
94         // other constructors
95 protected:
96         color(color_types const t, unsigned rl=0);
97         color(color_types const t, const ex & i1, unsigned rl=0);
98         color(color_types const t, const ex & i1, const ex & i2, unsigned rl=0);
99         color(color_types const t, const ex & i1, const ex & i2, const ex & i3,
100               unsigned rl=0);
101         color(color_types const t, const exvector & iv, unsigned rl=0);
102         color(color_types const t, exvector * ivp, unsigned rl=0);
103         
104         // functions overriding virtual functions from base classes
105 public:
106         basic * duplicate() const;
107         void printraw(std::ostream & os) const;
108         void printtree(std::ostream & os, unsigned indent) const;
109         void print(std::ostream & os, unsigned upper_precedence=0) const;
110         void printcsrc(std::ostream & os, unsigned type, unsigned upper_precedence=0) const;
111         bool info(unsigned inf) const;
112         ex eval(int level=0) const;
113 protected:
114         int compare_same_type(const basic & other) const;
115         bool is_equal_same_type(const basic & other) const;
116         ex simplify_ncmul(const exvector & v) const;
117         ex thisexprseq(const exvector & v) const;
118         ex thisexprseq(exvector * vp) const;
119
120         // new virtual functions which can be overridden by derived classes
121         // none
122         
123         // non-virtual functions in this class
124 protected:
125         bool all_of_type_coloridx(void) const;
126         
127 // member variables
128
129 protected:
130         color_types type;
131         unsigned representation_label; // to distiguish independent color matrices coming from separated fermion lines
132 };
133
134 // global constants
135
136 extern const color some_color;
137 extern const type_info & typeid_color;
138
139 // global functions
140 inline const color &ex_to_color(const ex &e)
141 {
142         return static_cast<const color &>(*e.bp);
143 }
144
145 inline color &ex_to_nonconst_color(const ex &e)
146 {
147         return static_cast<color &>(*e.bp);
148 }
149
150 color color_ONE(unsigned rl=0);
151 color color_T(const ex & a, unsigned rl=0);
152 color color_f(const ex & a, const ex & b, const ex & c);
153 color color_d(const ex & a, const ex & b, const ex & c);
154 ex color_h(const ex & a, const ex & b, const ex & c);
155 color color_delta8(const ex & a, const ex & b);
156 void split_color_string_in_parts(const exvector & v, exvector & delta8vec,
157                                  exvector & fvec, exvector & dvec,
158                                  exvectorvector & Tvecs,
159                                  exvectorvector & ONEvecs,
160                                  exvector & unknownvec);
161 exvector recombine_color_string(exvector & delta8vec, exvector & fvec,
162                                 exvector & dvec, exvectorvector & Tvecs,
163                                 exvectorvector & ONEvecs, exvector & unknownvec);
164 ex color_trace_of_one_representation_label(const exvector & v);
165 ex color_trace(const exvector & v, unsigned rl=0);
166 ex simplify_pure_color_string(const ex & e);
167 ex simplify_color(const ex & e);
168
169 ex brute_force_sum_color_indices(const ex & e);
170
171 void append_exvector_to_exvector(exvector & dest, const exvector & source);
172
173 #ifndef NO_NAMESPACE_GINAC
174 } // namespace GiNaC
175 #endif // ndef NO_NAMESPACE_GINAC
176
177 #endif // ndef __GINAC_COLOR_H__