#include <stdexcept>
#include "color.h"
-#include "ex.h"
#include "idx.h"
#include "ncmul.h"
+#include "symmetry.h"
#include "numeric.h"
#include "power.h" // for sqrt()
#include "symbol.h"
tinfo_key = TINFO_color;
}
-color::color(unsigned char rl, const exvector & v, bool discardable) : inherited(indexed::unknown, v, discardable), representation_label(rl)
+color::color(unsigned char rl, const exvector & v, bool discardable) : inherited(sy_none(), v, discardable), representation_label(rl)
{
debugmsg("color constructor from unsigned char,exvector", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_color;
}
-color::color(unsigned char rl, exvector * vp) : inherited(indexed::unknown, vp), representation_label(rl)
+color::color(unsigned char rl, exvector * vp) : inherited(sy_none(), vp), representation_label(rl)
{
debugmsg("color constructor from unsigned char,exvector *", LOGLEVEL_CONSTRUCT);
tinfo_key = TINFO_color;
DEFAULT_ARCHIVING(su3d)
//////////
-// functions overriding virtual functions from bases classes
+// functions overriding virtual functions from base classes
//////////
int color::compare_same_type(const basic & other) const
{
- GINAC_ASSERT(other.tinfo() == TINFO_color);
+ GINAC_ASSERT(is_of_type(other, color));
const color &o = static_cast<const color &>(other);
if (representation_label != o.representation_label) {
return inherited::compare_same_type(other);
}
+bool color::match_same_type(const basic & other) const
+{
+ GINAC_ASSERT(is_of_type(other, color));
+ const color &o = static_cast<const color &>(other);
+
+ return representation_label == o.representation_label;
+}
+
DEFAULT_COMPARE(su3one)
DEFAULT_COMPARE(su3t)
DEFAULT_COMPARE(su3f)
it++;
}
- if (s.size() == 0)
+ if (s.empty())
return color(su3one(), representation_label);
else
return simplified_ncmul(s);
GINAC_ASSERT(is_ex_of_type(i.op(0), su3d));
// Convolutions are zero
- if (static_cast<const indexed &>(i).get_dummy_indices().size() != 0)
+ if (!(static_cast<const indexed &>(i).get_dummy_indices().empty()))
return _ex0();
// Numeric evaluation
// Sort indices
int v[3];
for (unsigned j=0; j<3; j++)
- v[j] = ex_to_numeric(ex_to_idx(i.op(j + 1)).get_value()).to_int();
+ v[j] = ex_to<numeric>(ex_to<idx>(i.op(j + 1)).get_value()).to_int();
if (v[0] > v[1]) std::swap(v[0], v[1]);
if (v[0] > v[2]) std::swap(v[0], v[2]);
if (v[1] > v[2]) std::swap(v[1], v[2]);
// Sort indices, remember permutation sign
int v[3];
for (unsigned j=0; j<3; j++)
- v[j] = ex_to_numeric(ex_to_idx(i.op(j + 1)).get_value()).to_int();
+ v[j] = ex_to<numeric>(ex_to<idx>(i.op(j + 1)).get_value()).to_int();
int sign = 1;
if (v[0] > v[1]) { std::swap(v[0], v[1]); sign = -sign; }
if (v[0] > v[2]) { std::swap(v[0], v[2]); sign = -sign; }
GINAC_ASSERT(is_ex_of_type(*other, indexed));
GINAC_ASSERT(self->nops() == 2);
GINAC_ASSERT(is_ex_of_type(self->op(0), su3t));
- unsigned char rl = ex_to_color(*self).get_representation_label();
+ unsigned char rl = ex_to<color>(*self).get_representation_label();
if (is_ex_exactly_of_type(other->op(0), su3t)) {
if (is_ex_exactly_of_type(other->op(0), su3d)) {
// Find the dummy indices of the contraction
- exvector self_indices = ex_to_indexed(*self).get_indices();
- exvector other_indices = ex_to_indexed(*other).get_indices();
+ exvector self_indices = ex_to<indexed>(*self).get_indices();
+ exvector other_indices = ex_to<indexed>(*other).get_indices();
exvector all_indices = self_indices;
all_indices.insert(all_indices.end(), other_indices.begin(), other_indices.end());
exvector free_indices, dummy_indices;
// d.akl d.bkl = 5/3 delta.ab
} else if (dummy_indices.size() == 2) {
exvector a;
- back_insert_iterator<exvector> ita(a);
+ std::back_insert_iterator<exvector> ita(a);
ita = set_difference(self_indices.begin(), self_indices.end(), dummy_indices.begin(), dummy_indices.end(), ita, ex_is_less());
ita = set_difference(other_indices.begin(), other_indices.end(), dummy_indices.begin(), dummy_indices.end(), ita, ex_is_less());
GINAC_ASSERT(a.size() == 2);
// d.abc T.b T.c = 5/6 T.a
if (other+1 != v.end()
&& is_ex_exactly_of_type(other[1].op(0), su3t)
- && ex_to_indexed(*self).has_dummy_index_for(other[1].op(1))) {
+ && ex_to<indexed>(*self).has_dummy_index_for(other[1].op(1))) {
- exvector self_indices = ex_to_indexed(*self).get_indices();
+ exvector self_indices = ex_to<indexed>(*self).get_indices();
exvector dummy_indices;
dummy_indices.push_back(other[0].op(1));
dummy_indices.push_back(other[1].op(1));
int sig;
ex a = permute_free_index_to_front(self_indices, dummy_indices, sig);
*self = numeric(5, 6);
- other[0] = color_T(a, ex_to_color(other[0]).get_representation_label());
+ other[0] = color_T(a, ex_to<color>(other[0]).get_representation_label());
other[1] = _ex1();
return true;
}
// Find the dummy indices of the contraction
exvector dummy_indices;
- dummy_indices = ex_to_indexed(*self).get_dummy_indices(ex_to_indexed(*other));
+ dummy_indices = ex_to<indexed>(*self).get_dummy_indices(ex_to<indexed>(*other));
// f.abc f.abc = 24
if (dummy_indices.size() == 3) {
// f.akl f.bkl = 3 delta.ab
} else if (dummy_indices.size() == 2) {
int sign1, sign2;
- ex a = permute_free_index_to_front(ex_to_indexed(*self).get_indices(), dummy_indices, sign1);
- ex b = permute_free_index_to_front(ex_to_indexed(*other).get_indices(), dummy_indices, sign2);
+ ex a = permute_free_index_to_front(ex_to<indexed>(*self).get_indices(), dummy_indices, sign1);
+ ex b = permute_free_index_to_front(ex_to<indexed>(*other).get_indices(), dummy_indices, sign2);
*self = sign1 * sign2 * 3 * delta_tensor(a, b);
*other = _ex1();
return true;
// f.abc T.b T.c = 3/2 I T.a
if (other+1 != v.end()
&& is_ex_exactly_of_type(other[1].op(0), su3t)
- && ex_to_indexed(*self).has_dummy_index_for(other[1].op(1))) {
+ && ex_to<indexed>(*self).has_dummy_index_for(other[1].op(1))) {
- exvector self_indices = ex_to_indexed(*self).get_indices();
+ exvector self_indices = ex_to<indexed>(*self).get_indices();
exvector dummy_indices;
dummy_indices.push_back(other[0].op(1));
dummy_indices.push_back(other[1].op(1));
int sig;
ex a = permute_free_index_to_front(self_indices, dummy_indices, sig);
*self = numeric(3, 2) * sig * I;
- other[0] = color_T(a, ex_to_color(other[0]).get_representation_label());
+ other[0] = color_T(a, ex_to<color>(other[0]).get_representation_label());
other[1] = _ex1();
return true;
}
{
if (!is_ex_of_type(a, idx))
throw(std::invalid_argument("indices of color_T must be of type idx"));
- if (!ex_to_idx(a).get_dim().is_equal(8))
+ if (!ex_to<idx>(a).get_dim().is_equal(8))
throw(std::invalid_argument("index dimension for color_T must be 8"));
return color(su3t(), a, rl);
{
if (!is_ex_of_type(a, idx) || !is_ex_of_type(b, idx) || !is_ex_of_type(c, idx))
throw(std::invalid_argument("indices of color_f must be of type idx"));
- if (!ex_to_idx(a).get_dim().is_equal(8) || !ex_to_idx(b).get_dim().is_equal(8) || !ex_to_idx(c).get_dim().is_equal(8))
+ if (!ex_to<idx>(a).get_dim().is_equal(8) || !ex_to<idx>(b).get_dim().is_equal(8) || !ex_to<idx>(c).get_dim().is_equal(8))
throw(std::invalid_argument("index dimension for color_f must be 8"));
- return indexed(su3f(), indexed::antisymmetric, a, b, c);
+ return indexed(su3f(), sy_anti(), a, b, c);
}
ex color_d(const ex & a, const ex & b, const ex & c)
{
if (!is_ex_of_type(a, idx) || !is_ex_of_type(b, idx) || !is_ex_of_type(c, idx))
throw(std::invalid_argument("indices of color_d must be of type idx"));
- if (!ex_to_idx(a).get_dim().is_equal(8) || !ex_to_idx(b).get_dim().is_equal(8) || !ex_to_idx(c).get_dim().is_equal(8))
+ if (!ex_to<idx>(a).get_dim().is_equal(8) || !ex_to<idx>(b).get_dim().is_equal(8) || !ex_to<idx>(c).get_dim().is_equal(8))
throw(std::invalid_argument("index dimension for color_d must be 8"));
- return indexed(su3d(), indexed::symmetric, a, b, c);
+ return indexed(su3d(), sy_symm(), a, b, c);
}
ex color_h(const ex & a, const ex & b, const ex & c)
{
if (is_ex_of_type(e, color)) {
- if (ex_to_color(e).get_representation_label() == rl
+ if (ex_to<color>(e).get_representation_label() == rl
&& is_ex_of_type(e.op(0), su3one))
return _ex3();
else
return _ex0();
- } else if (is_ex_exactly_of_type(e, add)) {
-
- // Trace of sum = sum of traces
- ex sum = _ex0();
- for (unsigned i=0; i<e.nops(); i++)
- sum += color_trace(e.op(i), rl);
- return sum;
-
} else if (is_ex_exactly_of_type(e, mul)) {
// Trace of product: pull out non-color factors
exvector v1;
v1.reserve(num - 2);
- for (int i=0; i<num-2; i++)
+ for (unsigned i=0; i<num-2; i++)
v1.push_back(e.op(i));
exvector v2 = v1;
return delta_tensor(next_to_last_index, last_index) * color_trace(ncmul(v1), rl) / 6
+ color_h(next_to_last_index, last_index, summation_index) * color_trace(ncmul(v2), rl) / 2;
}
- }
- return _ex0();
+ } else if (e.nops() > 0) {
+
+ // Trace maps to all other container classes (this includes sums)
+ pointer_to_map_function_1arg<unsigned char> fcn(color_trace, rl);
+ return e.map(fcn);
+
+ } else
+ return _ex0();
}
} // namespace GiNaC