Skip to content

Commit 98e3727

Browse files
authored
Merge pull request #557 from ValeevGroup/default-tensor-symmetry-context
Source default tensor symmetries from the Context
2 parents 7e86711 + 5f7c3c9 commit 98e3727

26 files changed

Lines changed: 1203 additions & 542 deletions

SeQuant/core/context.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ bool operator==(const Context& ctx1, const Context& ctx2) {
3131
ctx1.canonicalization_options() == ctx2.canonicalization_options() &&
3232
ctx1.braket_typesetting() == ctx2.braket_typesetting() &&
3333
ctx1.braket_slot_typesetting() == ctx2.braket_slot_typesetting() &&
34+
ctx1.symmetry() == ctx2.symmetry() &&
35+
ctx1.hermiticity() == ctx2.hermiticity() &&
36+
ctx1.column_symmetry() == ctx2.column_symmetry() &&
3437
*ctx1.index_space_registry() == *ctx2.index_space_registry();
3538
}
3639

@@ -132,7 +135,10 @@ Context::Context(Options options)
132135
first_dummy_index_ordinal_(options.first_dummy_index_ordinal),
133136
canonicalization_options_(options.canonicalization_options),
134137
braket_typesetting_(options.braket_typesetting),
135-
braket_slot_typesetting_(options.braket_slot_typesetting) {}
138+
braket_slot_typesetting_(options.braket_slot_typesetting),
139+
symmetry_(options.symmetry),
140+
hermiticity_(options.hermiticity),
141+
column_symmetry_(options.column_symmetry) {}
136142

137143
Context Context::clone() const {
138144
Context ctx(*this);
@@ -176,6 +182,12 @@ BraKetSlotTypesetting Context::braket_slot_typesetting() const {
176182
return braket_slot_typesetting_;
177183
}
178184

185+
Symmetry Context::symmetry() const { return symmetry_; }
186+
187+
Hermiticity Context::hermiticity() const { return hermiticity_; }
188+
189+
ColumnSymmetry Context::column_symmetry() const { return column_symmetry_; }
190+
179191
Context& Context::set(Vacuum vacuum) {
180192
vacuum_ = vacuum;
181193
return *this;
@@ -229,6 +241,21 @@ Context& Context::set(BraKetSlotTypesetting bkst) {
229241
return *this;
230242
}
231243

244+
Context& Context::set(Symmetry symmetry) {
245+
symmetry_ = symmetry;
246+
return *this;
247+
}
248+
249+
Context& Context::set(Hermiticity hermiticity) {
250+
hermiticity_ = hermiticity;
251+
return *this;
252+
}
253+
254+
Context& Context::set(ColumnSymmetry column_symmetry) {
255+
column_symmetry_ = column_symmetry;
256+
return *this;
257+
}
258+
232259
IndexSpace get_particle_space(const IndexSpace::QuantumNumbers& qn) {
233260
return get_default_context().index_space_registry()->particle_space(qn);
234261
}

SeQuant/core/context.hpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,11 @@ namespace sequant {
2222
/// orthonormal to their dual (bra) counterparts
2323
/// (`IndexSpaceMetric::Unit`) or not (`IndexSpaceMetric::General`);
2424
/// this affects the value of Wick contractions.
25-
/// - `braket_symmetry`: whether the primal (ket) and dual (bra) vector space
26-
/// _bases_
27-
/// are "equivalent" (homogenous to each other; `BraKetSymmetry::Symm`),
28-
/// "conjugate to each other" (<a
29-
/// href="https://en.wikipedia.org/wiki/Antilinear_map">conjugate-homogenous</a>
30-
/// to each other; `BraKetSymmetry::Conjugate`) or are "nonequivalent" (not
31-
/// homogeneous; `BraKetSymmetry::Nonsymm`)
25+
/// - `symmetry`, `hermiticity`, `column_symmetry`: the symmetries given to a
26+
/// *deserialized* tensor that does not specify them; the programmatic
27+
/// Tensor ctors are unaffected (see Tensor::Defaults). There is no
28+
/// `braket_symmetry` knob: a tensor's BraKetSymmetry is derived from its
29+
/// `hermiticity` and base field.
3230
/// - `spbasis`: whether the bra/ket bases are spinor (`SPBasis::Spinor`) or
3331
/// spin-free (`SPBasis::Spinfree`).
3432
/// - `first_dummy_index_ordinal`: during its operation SeQuant will generate
@@ -58,6 +56,9 @@ class Context {
5856
constexpr static auto braket_typesetting = BraKetTypesetting::ContraSub;
5957
constexpr static auto braket_slot_typesetting =
6058
BraKetSlotTypesetting::TensorPackage;
59+
constexpr static auto symmetry = Symmetry::Nonsymm;
60+
constexpr static auto hermiticity = Hermiticity::NonHermitian;
61+
constexpr static auto column_symmetry = ColumnSymmetry::Nonsymm;
6162
};
6263

6364
/// helper for the named-parameter constructor of Context
@@ -86,6 +87,14 @@ class Context {
8687
/// the BraKetSlotTypesetting object
8788
BraKetSlotTypesetting braket_slot_typesetting =
8889
Defaults::braket_slot_typesetting;
90+
/// the default bra/ket permutational Symmetry for deserialized tensors
91+
Symmetry symmetry = Defaults::symmetry;
92+
/// the default Hermiticity for deserialized tensors; the braket symmetry
93+
/// of a deserialized tensor is *derived* from this and its #base_field
94+
Hermiticity hermiticity = Defaults::hermiticity;
95+
/// the default ColumnSymmetry (particle-permutation symmetry) for
96+
/// deserialized tensors
97+
ColumnSymmetry column_symmetry = Defaults::column_symmetry;
8998
};
9099
static Options make_default_options() { return {}; }
91100

@@ -155,6 +164,15 @@ class Context {
155164
/// \return BraKetSlotTypesetting of this context; see BraKetSlotTypesetting
156165
/// for the meaning of the possible values
157166
BraKetSlotTypesetting braket_slot_typesetting() const;
167+
/// \return the default bra/ket permutational Symmetry for deserialized tensors
168+
Symmetry symmetry() const;
169+
/// \return the default Hermiticity for deserialized tensors; the braket
170+
/// symmetry of a deserialized tensor is *derived* from this and its
171+
/// #base_field
172+
Hermiticity hermiticity() const;
173+
/// \return the default ColumnSymmetry (particle-permutation symmetry) for
174+
/// deserialized tensors
175+
ColumnSymmetry column_symmetry() const;
158176

159177
/// Sets the Vacuum for this context, convenient for chaining
160178
/// \param vacuum Vacuum
@@ -195,6 +213,16 @@ class Context {
195213
/// \param braket_slot_typeset BraKetSlotTypesetting
196214
/// \return ref to `*this`, for chaining
197215
Context& set(BraKetSlotTypesetting braket_slot_typeset);
216+
/// Sets the default bra/ket permutational Symmetry for deserialized tensors
217+
/// \return ref to `*this`, for chaining
218+
Context& set(Symmetry symmetry);
219+
/// Sets the default Hermiticity for deserialized tensors (the braket symmetry
220+
/// of a deserialized tensor is derived from this and its base field)
221+
/// \return ref to `*this`, for chaining
222+
Context& set(Hermiticity hermiticity);
223+
/// Sets the default ColumnSymmetry for deserialized tensors
224+
/// \return ref to `*this`, for chaining
225+
Context& set(ColumnSymmetry column_symmetry);
198226

199227
private:
200228
std::shared_ptr<IndexSpaceRegistry> idx_space_reg_ = nullptr;
@@ -207,6 +235,9 @@ class Context {
207235
BraKetTypesetting braket_typesetting_ = Defaults::braket_typesetting;
208236
BraKetSlotTypesetting braket_slot_typesetting_ =
209237
Defaults::braket_slot_typesetting;
238+
Symmetry symmetry_ = Defaults::symmetry;
239+
Hermiticity hermiticity_ = Defaults::hermiticity;
240+
ColumnSymmetry column_symmetry_ = Defaults::column_symmetry;
210241
};
211242

212243
/// Context object equality comparison

0 commit comments

Comments
 (0)