This file is indexed.

/usr/include/ginac/idx.h is in libginac-dev 1.7.4-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/** @file idx.h
 *
 *  Interface to GiNaC's indices. */

/*
 *  GiNaC Copyright (C) 1999-2018 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
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef GINAC_IDX_H
#define GINAC_IDX_H

#include "ex.h"
#include "numeric.h"

namespace GiNaC {

/** This class holds one index of an indexed object. Indices can
 *  theoretically consist of any symbolic expression but they are usually
 *  only just a symbol (e.g. "mu", "i") or numeric (integer). Indices belong
 *  to a space with a certain numeric or symbolic dimension. */
class idx : public basic
{
	GINAC_DECLARE_REGISTERED_CLASS(idx, basic)

	// other constructors
public:
	/** Construct index with given value and dimension.
	 *
	 *  @param v Value of index (numeric or symbolic)
	 *  @param dim Dimension of index space (numeric or symbolic)
	 *  @return newly constructed index */
	explicit idx(const ex & v, const ex & dim);

	// functions overriding virtual functions from base classes
public:
	bool info(unsigned inf) const override;
	size_t nops() const override;
	ex op(size_t i) const override;
	ex map(map_function & f) const override;
	ex evalf() const override;
	ex subs(const exmap & m, unsigned options = 0) const override;
	void archive(archive_node& n) const override;
	void read_archive(const archive_node& n, lst& syms) override;
protected:
	ex derivative(const symbol & s) const override;
	bool match_same_type(const basic & other) const override;
	unsigned calchash() const override;

	// new virtual functions in this class
public:
	/** Check whether the index forms a dummy index pair with another index
	 *  of the same type. */
	virtual bool is_dummy_pair_same_type(const basic & other) const;

	// non-virtual functions in this class
public:
	/** Get value of index. */
	ex get_value() const {return value;}

	/** Check whether the index is numeric. */
	bool is_numeric() const {return is_exactly_a<numeric>(value);}

	/** Check whether the index is symbolic. */
	bool is_symbolic() const {return !is_exactly_a<numeric>(value);}

	/** Get dimension of index space. */
	ex get_dim() const {return dim;}

	/** Check whether the dimension is numeric. */
	bool is_dim_numeric() const {return is_exactly_a<numeric>(dim);}

	/** Check whether the dimension is symbolic. */
	bool is_dim_symbolic() const {return !is_exactly_a<numeric>(dim);}

	/** Make a new index with the same value but a different dimension. */
	ex replace_dim(const ex & new_dim) const;

	/** Return the minimum of the dimensions of this and another index.
	 *  If this is undecidable, throw an exception. */
	ex minimal_dim(const idx & other) const;

protected:
	void print_index(const print_context & c, unsigned level) const;
	void do_print(const print_context & c, unsigned level) const;
	void do_print_csrc(const print_csrc & c, unsigned level) const;
	void do_print_latex(const print_latex & c, unsigned level) const;
	void do_print_tree(const print_tree & c, unsigned level) const;

protected:
	ex value; /**< Expression that constitutes the index (numeric or symbolic name) */
	ex dim;   /**< Dimension of space (can be symbolic or numeric) */
};
GINAC_DECLARE_UNARCHIVER(idx); 


/** This class holds an index with a variance (co- or contravariant). There
 *  is an associated metric tensor that can be used to raise/lower indices. */
class varidx : public idx
{
	GINAC_DECLARE_REGISTERED_CLASS(varidx, idx)

	// other constructors
public:
	/** Construct index with given value, dimension and variance.
	 *
	 *  @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)
	 *  @return newly constructed index */
	varidx(const ex & v, const ex & dim, bool covariant = false);

	// functions overriding virtual functions from base classes
public:
	bool is_dummy_pair_same_type(const basic & other) const override;
	void archive(archive_node& n) const override;
	void read_archive(const archive_node& n, lst& syms) override;
protected:
	bool match_same_type(const basic & other) const override;

	// non-virtual functions in this class
public:
	/** Check whether the index is covariant. */
	bool is_covariant() const {return covariant;}

	/** Check whether the index is contravariant (not covariant). */
	bool is_contravariant() const {return !covariant;}

	/** Make a new index with the same value but the opposite variance. */
	ex toggle_variance() const;

protected:
	void do_print(const print_context & c, unsigned level) const;
	void do_print_tree(const print_tree & c, unsigned level) const;

	// member variables
protected:
	bool covariant; /**< x.mu, default is contravariant: x~mu */
};
GINAC_DECLARE_UNARCHIVER(varidx);


/** 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 base classes
public:
	bool is_dummy_pair_same_type(const basic & other) const override;
	// complex conjugation
	ex conjugate() const override { return toggle_dot(); }
	void archive(archive_node& n) const override;
	void read_archive(const archive_node& n, lst& syms) override;
protected:
	bool match_same_type(const basic & other) const override;

	// non-virtual functions in this class
public:
	/** Check whether the index is dotted. */
	bool is_dotted() const {return dotted;}

	/** Check whether the index is not dotted. */
	bool is_undotted() const {return !dotted;}

	/** Make a new index with the same value and variance but the opposite
	 *  dottedness. */
	ex toggle_dot() const;

	/** Make a new index with the same value but opposite variance and
	 *  dottedness. */
	ex toggle_variance_dot() const;

protected:
	void do_print(const print_context & c, unsigned level) const;
	void do_print_latex(const print_latex & c, unsigned level) const;
	void do_print_tree(const print_tree & c, unsigned level) const;

	// member variables
protected:
	bool dotted;
};
GINAC_DECLARE_UNARCHIVER(spinidx);


// utility functions

/** 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 size_t 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 size_t 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();
}

/** 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