GINAC_ASSERT(is_a<indexed>(*other));
GINAC_ASSERT(is_a<diracgamma>(self->op(0)));
unsigned char rl = ex_to<clifford>(*self).get_representation_label();
+
ex dim = ex_to<idx>(self->op(1)).get_dim();
+ if (other->nops() > 1)
+ dim = minimal_dim(dim, ex_to<idx>(self->op(1)).get_dim());
- if (other->nops() > 1)
- dim = minimal_dim(dim, ex_to<idx>(self->op(1)).get_dim());
if (is_a<clifford>(*other)) {
// Contraction only makes sense if the represenation labels are equal
ex idx::minimal_dim(const idx & other) const
{
- if (dim.is_equal(other.dim) || dim < other.dim || (is_exactly_a<numeric>(dim) && is_a<symbol>(other.dim)))
- return dim;
- else if (dim > other.dim || (is_a<symbol>(dim) && is_exactly_a<numeric>(other.dim)))
- return other.dim;
- else
- throw (std::runtime_error("idx::minimal_dim: index dimensions cannot be ordered"));
+ return GiNaC::minimal_dim(dim, other.dim);
}
ex varidx::toggle_variance(void) const
out_free.push_back(*last);
}
+ex minimal_dim(const ex & dim1, const ex & dim2)
+{
+ if (dim1.is_equal(dim2) || dim1 < dim2 || (is_exactly_a<numeric>(dim1) && is_a<symbol>(dim2)))
+ return dim1;
+ else if (dim1 > dim2 || (is_a<symbol>(dim1) && is_exactly_a<numeric>(dim2)))
+ return dim2;
+ else
+ throw (std::runtime_error("minimal_dim(): index dimensions cannot be ordered"));
+}
+
} // namespace GiNaC
return free_indices.size();
}
+/** Return the minimum of two index dimensions. If this is undecidable,
+ * throw an exception. Numeric dimensions are always considered "smaller"
+ * than symbolic dimensions. */
+ex minimal_dim(const ex & dim1, const ex & dim2);
+
} // namespace GiNaC
#endif // ndef __GINAC_IDX_H__