// functions overriding virtual functions from bases classes
public:
- void printraw(std::ostream & os) const;
- void printtree(std::ostream & os, unsigned indent) const;
- void print(std::ostream & os, unsigned upper_precedence=0) const;
+ void print(const print_context & c, unsigned level = 0) const;
bool info(unsigned inf) const;
+ unsigned nops() const;
+ ex & let_op(int i);
protected:
ex subs(const lst & ls, const lst & lr) const;
/** Check whether the dimension is symbolic. */
bool is_dim_symbolic(void) const {return !is_ex_exactly_of_type(dim, numeric);}
- // member variables
protected:
ex value; /**< Expression that constitutes the index (numeric or symbolic name) */
ex dim; /**< Dimension of space (can be symbolic or numeric) */
// functions overriding virtual functions from bases classes
public:
- void print(std::ostream & os, unsigned upper_precedence=0) const;
+ void print(const print_context & c, unsigned level = 0) const;
bool is_dummy_pair_same_type(const basic & other) const;
// non-virtual functions in this class
};
+/** This class holds a spinor index that can be dotted or undotted and that
+ * also has a variance. This is used in the Weyl-van-der-Waerden formalism
+ * where the dot indicates complex conjugation. There is an associated
+ * (asymmetric) metric tensor that can be used to raise/lower spinor
+ * indices. */
+class spinidx : public varidx
+{
+ GINAC_DECLARE_REGISTERED_CLASS(spinidx, varidx)
+
+ // other constructors
+public:
+ /** Construct index with given value, dimension, variance and dot.
+ *
+ * @param v Value of index (numeric or symbolic)
+ * @param dim Dimension of index space (numeric or symbolic)
+ * @param covariant Make covariant index (default is contravariant)
+ * @param dotted Make covariant dotted (default is undotted)
+ * @return newly constructed index */
+ spinidx(const ex & v, const ex & dim = 2, bool covariant = false, bool dotted = false);
+
+ // functions overriding virtual functions from bases classes
+public:
+ void print(const print_context & c, unsigned level = 0) const;
+ bool is_dummy_pair_same_type(const basic & other) const;
+
+ // non-virtual functions in this class
+public:
+ /** Check whether the index is dotted. */
+ bool is_dotted(void) const {return dotted;}
+
+ /** Check whether the index is not dotted. */
+ bool is_undotted(void) const {return !dotted;}
+
+ /** Make a new index with the same value and variance but the opposite
+ * dottedness. */
+ ex toggle_dot(void) const;
+
+ /** Make a new index with the same value but opposite variance and
+ * dottedness. */
+ ex toggle_variance_dot(void) const;
+
+ // member variables
+protected:
+ bool dotted;
+};
+
+
// utility functions
inline const idx &ex_to_idx(const ex & e)
{
return static_cast<const varidx &>(*e.bp);
}
+inline const spinidx &ex_to_spinidx(const ex & e)
+{
+ return static_cast<const spinidx &>(*e.bp);
+}
+
/** Check whether two indices form a dummy pair. */
bool is_dummy_pair(const idx & i1, const idx & i2);
/** Check whether two expressions form a dummy index pair. */
bool is_dummy_pair(const ex & e1, const ex & e2);
+/** Given a vector of indices, split them into two vectors, one containing
+ * the free indices, the other containing the dummy indices (numeric
+ * indices are neither free nor dummy ones).
+ *
+ * @param it Pointer to start of index vector
+ * @param itend Pointer to end of index vector
+ * @param out_free Vector of free indices (returned, sorted)
+ * @param out_dummy Vector of dummy indices (returned, sorted) */
+void find_free_and_dummy(exvector::const_iterator it, exvector::const_iterator itend, exvector & out_free, exvector & out_dummy);
+
+/** Given a vector of indices, split them into two vectors, one containing
+ * the free indices, the other containing the dummy indices (numeric
+ * indices are neither free nor dummy ones).
+ *
+ * @param v Index vector
+ * @param out_free Vector of free indices (returned, sorted)
+ * @param out_dummy Vector of dummy indices (returned, sorted) */
+inline void find_free_and_dummy(const exvector & v, exvector & out_free, exvector & out_dummy)
+{
+ find_free_and_dummy(v.begin(), v.end(), out_free, out_dummy);
+}
+
+/** Given a vector of indices, find the dummy indices.
+ *
+ * @param v Index vector
+ * @param out_dummy Vector of dummy indices (returned, sorted) */
+inline void find_dummy_indices(const exvector & v, exvector & out_dummy)
+{
+ exvector free_indices;
+ find_free_and_dummy(v.begin(), v.end(), free_indices, out_dummy);
+}
+
+/** Count the number of dummy index pairs in an index vector. */
+inline unsigned count_dummy_indices(const exvector & v)
+{
+ exvector free_indices, dummy_indices;
+ find_free_and_dummy(v.begin(), v.end(), free_indices, dummy_indices);
+ return dummy_indices.size();
+}
+
+/** Count the number of dummy index pairs in an index vector. */
+inline unsigned count_free_indices(const exvector & v)
+{
+ exvector free_indices, dummy_indices;
+ find_free_and_dummy(v.begin(), v.end(), free_indices, dummy_indices);
+ return free_indices.size();
+}
+
+/** Given two index vectors, find those indices that appear in the first
+ * vector but not in the second one (asymmetric set difference). */
+exvector index_set_difference(const exvector & set1, const exvector & set2);
} // namespace GiNaC