/** @file color.h
*
- * Interface to GiNaC's color objects.
- *
- * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany
+ * Interface to GiNaC's color (SU(3) Lie algebra) objects. */
+
+/*
+ * GiNaC Copyright (C) 1999-2004 Johannes Gutenberg University Mainz, Germany
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#ifndef __GINAC_COLOR_H__
#define __GINAC_COLOR_H__
-#include <string>
-#include <vector>
+#include "indexed.h"
+#include "tensor.h"
+
+#include <set>
-#define MAX_REPRESENTATION_LABELS 4
-#define COLOR_EIGHT 8 // N*N-1
-#define COLOR_THREE 3 // N
+namespace GiNaC {
-/** Base class for color object */
+
+/** This class holds a generator T_a or the unity element of the Lie algebra
+ * of SU(3), as used for calculations in quantum chromodynamics. A
+ * representation label (an unsigned 8-bit integer) is used to distinguish
+ * elements from different Lie algebras (objects with different labels
+ * commutate). These objects implement an abstract representation of the
+ * group, not a specific matrix representation. The indices used for color
+ * objects should not have a variance. */
class color : public indexed
{
-// friends
-
- friend color color_ONE(unsigned const rl);
- friend color color_T(ex const & a, unsigned const rl);
- friend color color_f(ex const & a, ex const & b, ex const & c);
- friend color color_d(ex const & a, ex const & b, ex const & c);
- friend ex color_h(ex const & a, ex const & b, ex const & c);
- friend color color_delta8(ex const & a, ex const & b);
- friend unsigned subs_index_in_exvector(exvector & v, ex const & is, ex const & ir);
- friend void split_color_string_in_parts(exvector const & v, exvector & delta8vec,
- exvector & fvec, exvector & dvec,
- vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs,
- exvector & unknownvec);
- friend exvector recombine_color_string(exvector & delta8vec, exvector & fvec,
- exvector & dvec, vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs, exvector & unknownvec);
- friend ex color_trace_of_one_representation_label(exvector const & v);
- friend ex color_trace(exvector const & v, unsigned const rl);
- friend ex simplify_pure_color_string(ex const & e);
- friend ex simplify_color(ex const & e);
-
-
-// types
+ GINAC_DECLARE_REGISTERED_CLASS(color, indexed)
+ // other constructors
public:
- typedef enum { invalid, // not properly constructed by one of the friend functions
- color_T,
- color_f,
- color_d,
- color_delta8,
- color_ONE
- } color_types;
-
-// member functions
-
- // default constructor, destructor, copy constructor assignment operator and helpers
-public:
- color();
- ~color();
- color(color const & other);
- color const & operator=(color const & other);
+ color(const ex & b, unsigned char rl = 0);
+ color(const ex & b, const ex & i1, unsigned char rl = 0);
+
+ // internal constructors
+ color(unsigned char rl, const exvector & v, bool discardable = false);
+ color(unsigned char rl, std::auto_ptr<exvector> vp);
+
+ // functions overriding virtual functions from base classes
protected:
- void copy(color const & other);
- void destroy(bool call_parent);
+ ex eval_ncmul(const exvector & v) const;
+ bool match_same_type(const basic & other) const;
+ ex thiscontainer(const exvector & v) const;
+ ex thiscontainer(std::auto_ptr<exvector> vp) const;
+ unsigned return_type() const { return return_types::noncommutative; }
+ unsigned return_type_tinfo() const { return TINFO_color + representation_label; }
+
+ // non-virtual functions in this class
+public:
+ unsigned char get_representation_label() const {return representation_label;}
+
+ // member variables
+private:
+ unsigned char representation_label; /**< Representation label to distinguish independent color matrices coming from separated fermion lines */
+};
+
- // other constructors
+/** This class represents the su(3) unity element. */
+class su3one : public tensor
+{
+ GINAC_DECLARE_REGISTERED_CLASS(su3one, tensor)
+
+ // non-virtual functions in this class
protected:
- color(color_types const t, unsigned const rl=0);
- color(color_types const t, ex const & i1, unsigned const rl=0);
- color(color_types const t, ex const & i1, ex const & i2, unsigned const rl=0);
- color(color_types const t, ex const & i1, ex const & i2, ex const & i3,
- unsigned const rl=0);
- color(color_types const t, exvector const & iv, unsigned const rl=0);
- color(color_types const t, exvector * ivp, unsigned const rl=0);
-
- // functions overriding virtual functions from base classes
+ void do_print(const print_context & c, unsigned level) const;
+ void do_print_latex(const print_latex & c, unsigned level) const;
+};
+
+/** This class represents an su(3) generator. */
+class su3t : public tensor
+{
+ GINAC_DECLARE_REGISTERED_CLASS(su3t, tensor)
+
+ // functions overriding virtual functions from base classes
public:
- basic * duplicate() const;
- void printraw(ostream & os) const;
- void printtree(ostream & os, unsigned indent) const;
- void print(ostream & os, unsigned upper_precedence=0) const;
- void printcsrc(ostream & os, unsigned type, unsigned upper_precedence=0) const;
- bool info(unsigned inf) const;
- ex eval(int level=0) const;
+ bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const;
+
+ // non-virtual functions in this class
protected:
- int compare_same_type(basic const & other) const;
- bool is_equal_same_type(basic const & other) const;
- ex simplify_ncmul(exvector const & v) const;
- ex thisexprseq(exvector const & v) const;
- ex thisexprseq(exvector * vp) const;
-
- // new virtual functions which can be overridden by derived classes
- // none
-
- // non-virtual functions in this class
+ void do_print(const print_context & c, unsigned level) const;
+ void do_print_latex(const print_latex & c, unsigned level) const;
+};
+
+/** This class represents the tensor of antisymmetric su(3) structure
+ * constants. */
+class su3f : public tensor
+{
+ GINAC_DECLARE_REGISTERED_CLASS(su3f, tensor)
+
+ // functions overriding virtual functions from base classes
+public:
+ ex eval_indexed(const basic & i) const;
+ bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const;
+
+ // non-virtual functions in this class
protected:
- bool all_of_type_coloridx(void) const;
-
-// member variables
+ void do_print(const print_context & c, unsigned level) const;
+ void do_print_latex(const print_latex & c, unsigned level) const;
+};
+/** This class represents the tensor of symmetric su(3) structure constants. */
+class su3d : public tensor
+{
+ GINAC_DECLARE_REGISTERED_CLASS(su3d, tensor)
+
+ // functions overriding virtual functions from base classes
+public:
+ ex eval_indexed(const basic & i) const;
+ bool contract_with(exvector::iterator self, exvector::iterator other, exvector & v) const;
+
+ // non-virtual functions in this class
protected:
- color_types type;
- unsigned representation_label; // to distiguish independent color matrices coming from separated fermion lines
+ void do_print(const print_context & c, unsigned level) const;
+ void do_print_latex(const print_latex & c, unsigned level) const;
};
-// global constants
-extern const color some_color;
-extern type_info const & typeid_color;
+// global functions
-// macros
+/** Specialization of is_exactly_a<color>(obj) for color objects. */
+template<> inline bool is_exactly_a<color>(const basic & obj)
+{
+ return obj.tinfo()==TINFO_color;
+}
-#define ex_to_color(X) static_cast<color const &>(*(X).bp)
-#define ex_to_nonconst_color(X) static_cast<color &>(*(X).bp)
+/** Create the su(3) unity element. This is an indexed object, although it
+ * has no indices.
+ *
+ * @param rl Representation label
+ * @return newly constructed unity element */
+ex color_ONE(unsigned char rl = 0);
-color color_ONE(unsigned const rl=0);
-color color_T(ex const & a, unsigned const rl=0);
-color color_f(ex const & a, ex const & b, ex const & c);
-color color_d(ex const & a, ex const & b, ex const & c);
-ex color_h(ex const & a, ex const & b, ex const & c);
-color color_delta8(ex const & a, ex const & b);
-void split_color_string_in_parts(exvector const & v, exvector & delta8vec,
- exvector & fvec, exvector & dvec,
- vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs,
- exvector & unknownvec);
-exvector recombine_color_string(exvector & delta8vec, exvector & fvec,
- exvector & dvec, vector<exvector> & Tvecs,
- vector<exvector> & ONEvecs, exvector & unknownvec);
-ex color_trace_of_one_representation_label(exvector const & v);
-ex color_trace(exvector const & v, unsigned const rl=0);
-ex simplify_pure_color_string(ex const & e);
-ex simplify_color(ex const & e);
+/** Create an su(3) generator.
+ *
+ * @param a Index
+ * @param rl Representation label
+ * @return newly constructed unity generator */
+ex color_T(const ex & a, unsigned char rl = 0);
-ex brute_force_sum_color_indices(ex const & e);
+/** Create an su(3) antisymmetric structure constant.
+ *
+ * @param a First index
+ * @param b Second index
+ * @param c Third index
+ * @return newly constructed structure constant */
+ex color_f(const ex & a, const ex & b, const ex & c);
-void append_exvector_to_exvector(exvector & dest, exvector const & source);
+/** Create an su(3) symmetric structure constant.
+ *
+ * @param a First index
+ * @param b Second index
+ * @param c Third index
+ * @return newly constructed structure constant */
+ex color_d(const ex & a, const ex & b, const ex & c);
-#endif // ndef __GINAC_COLOR_H__
+/** This returns the linear combination d.a.b.c+I*f.a.b.c. */
+ex color_h(const ex & a, const ex & b, const ex & c);
+
+/** Calculate color traces over the specified set of representation labels.
+ *
+ * @param e Expression to take the trace of
+ * @param rls Set of representation labels */
+ex color_trace(const ex & e, const std::set<unsigned char> & rls);
+
+/** Calculate color traces over the specified list of representation labels.
+ *
+ * @param e Expression to take the trace of
+ * @param rll List of representation labels */
+ex color_trace(const ex & e, const lst & rll);
+
+/** Calculate the trace of an expression containing color objects with a
+ * specified representation label.
+ *
+ * @param e Expression to take the trace of
+ * @param rl Representation label */
+ex color_trace(const ex & e, unsigned char rl = 0);
+} // namespace GiNaC
+
+#endif // ndef __GINAC_COLOR_H__