Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
7cbc799
Make tensors non-symmetric by default
Krzmbrzl Jun 15, 2026
140e41d
Default to no symmetries when deserializing
Krzmbrzl Jun 15, 2026
83eed70
Special handling of symm op symmetries in deserialization
Krzmbrzl Jun 15, 2026
8dba518
Infer column symmetry instead of erroring
Krzmbrzl Jun 15, 2026
18c1541
Don't mark symm ops as hermitian
Krzmbrzl Jun 15, 2026
83e0139
Adapt parse tests to new symm handling
Krzmbrzl Jun 15, 2026
109aae3
Fix invalid symm op symmetry spec
Krzmbrzl Jun 15, 2026
4586be9
Parse biorth exprs as column symmetric
Krzmbrzl Jun 15, 2026
7e86711
Fix invalid symm op symmetry spec
Krzmbrzl Jun 15, 2026
4e20c36
core: source default tensor symmetries from the Context
evaleev Jun 16, 2026
7fdb794
deserialize: keep reserved (anti)symmetrizers braket-Nonsymm regardle…
evaleev Jun 16, 2026
a7f9dea
tensor: make programmatic symmetry defaults Context-free (Option B)
evaleev Jul 8, 2026
e3bd206
tests: define the particle-symmetric `ps` pack once, shared (fix unit…
evaleev Jul 8, 2026
81935b1
tensor: source resolve_symmetries fallbacks from Tensor::Defaults
evaleev Jul 8, 2026
47869fb
tensor: force reserved (anti)symmetrizers to be particle (column) sym…
evaleev Jul 8, 2026
5bad4cd
tensor: TensorSymmetries pack in resolve_symmetries + (anti)symmetriz…
evaleev Aug 4, 2026
afad235
tests: rename the shared symmetry pack `ps` -> `particle_symmetric`
evaleev Aug 4, 2026
4b9d511
mbpt: build Kronecker deltas in F() via make_kronecker
evaleev Aug 4, 2026
edf0140
tensor: rename resolved_symmetries -> ResolvedSymmetries; trim comments
evaleev Aug 23, 2026
5f7c3c9
fix two column/perm-symmetry defaulting gaps found by Copilot
evaleev Aug 23, 2026
98e3727
Merge pull request #557 from ValeevGroup/default-tensor-symmetry-context
evaleev Aug 23, 2026
c7346a4
Merge branch 'master' into default-tensor-symmetry
evaleev Aug 24, 2026
df8eeec
restore Hermiticity on reserved metric/Kronecker tensors and RDMs
evaleev Aug 24, 2026
8471ffd
enforce the defining perm symmetry and braket/hermiticity agreement
evaleev Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion SeQuant/core/context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ bool operator==(const Context& ctx1, const Context& ctx2) {
ctx1.canonicalization_options() == ctx2.canonicalization_options() &&
ctx1.braket_typesetting() == ctx2.braket_typesetting() &&
ctx1.braket_slot_typesetting() == ctx2.braket_slot_typesetting() &&
ctx1.symmetry() == ctx2.symmetry() &&
ctx1.hermiticity() == ctx2.hermiticity() &&
ctx1.column_symmetry() == ctx2.column_symmetry() &&
*ctx1.index_space_registry() == *ctx2.index_space_registry();
}

Expand Down Expand Up @@ -132,7 +135,10 @@ Context::Context(Options options)
first_dummy_index_ordinal_(options.first_dummy_index_ordinal),
canonicalization_options_(options.canonicalization_options),
braket_typesetting_(options.braket_typesetting),
braket_slot_typesetting_(options.braket_slot_typesetting) {}
braket_slot_typesetting_(options.braket_slot_typesetting),
symmetry_(options.symmetry),
hermiticity_(options.hermiticity),
column_symmetry_(options.column_symmetry) {}

Context Context::clone() const {
Context ctx(*this);
Expand Down Expand Up @@ -176,6 +182,12 @@ BraKetSlotTypesetting Context::braket_slot_typesetting() const {
return braket_slot_typesetting_;
}

Symmetry Context::symmetry() const { return symmetry_; }

Hermiticity Context::hermiticity() const { return hermiticity_; }

ColumnSymmetry Context::column_symmetry() const { return column_symmetry_; }

Context& Context::set(Vacuum vacuum) {
vacuum_ = vacuum;
return *this;
Expand Down Expand Up @@ -229,6 +241,21 @@ Context& Context::set(BraKetSlotTypesetting bkst) {
return *this;
}

Context& Context::set(Symmetry symmetry) {
symmetry_ = symmetry;
return *this;
}

Context& Context::set(Hermiticity hermiticity) {
hermiticity_ = hermiticity;
return *this;
}

Context& Context::set(ColumnSymmetry column_symmetry) {
column_symmetry_ = column_symmetry;
return *this;
}

IndexSpace get_particle_space(const IndexSpace::QuantumNumbers& qn) {
return get_default_context().index_space_registry()->particle_space(qn);
}
Expand Down
45 changes: 38 additions & 7 deletions SeQuant/core/context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ namespace sequant {
/// orthonormal to their dual (bra) counterparts
/// (`IndexSpaceMetric::Unit`) or not (`IndexSpaceMetric::General`);
/// this affects the value of Wick contractions.
/// - `braket_symmetry`: whether the primal (ket) and dual (bra) vector space
/// _bases_
/// are "equivalent" (homogenous to each other; `BraKetSymmetry::Symm`),
/// "conjugate to each other" (<a
/// href="https://en.wikipedia.org/wiki/Antilinear_map">conjugate-homogenous</a>
/// to each other; `BraKetSymmetry::Conjugate`) or are "nonequivalent" (not
/// homogeneous; `BraKetSymmetry::Nonsymm`)
/// - `symmetry`, `hermiticity`, `column_symmetry`: the symmetries given to a
/// *deserialized* tensor that does not specify them; the programmatic
/// Tensor ctors are unaffected (see Tensor::Defaults). There is no
/// `braket_symmetry` knob: a tensor's BraKetSymmetry is derived from its
/// `hermiticity` and base field.
/// - `spbasis`: whether the bra/ket bases are spinor (`SPBasis::Spinor`) or
/// spin-free (`SPBasis::Spinfree`).
/// - `first_dummy_index_ordinal`: during its operation SeQuant will generate
Expand Down Expand Up @@ -59,6 +57,9 @@ class Context {
constexpr static auto braket_typesetting = BraKetTypesetting::ContraSub;
constexpr static auto braket_slot_typesetting =
BraKetSlotTypesetting::TensorPackage;
constexpr static auto symmetry = Symmetry::Nonsymm;
constexpr static auto hermiticity = Hermiticity::NonHermitian;
constexpr static auto column_symmetry = ColumnSymmetry::Nonsymm;
};

/// helper for the named-parameter constructor of Context
Expand Down Expand Up @@ -88,6 +89,14 @@ class Context {
/// the BraKetSlotTypesetting object
BraKetSlotTypesetting braket_slot_typesetting =
Defaults::braket_slot_typesetting;
/// the default bra/ket permutational Symmetry for deserialized tensors
Symmetry symmetry = Defaults::symmetry;
/// the default Hermiticity for deserialized tensors; the braket symmetry
/// of a deserialized tensor is *derived* from this and its #base_field
Hermiticity hermiticity = Defaults::hermiticity;
/// the default ColumnSymmetry (particle-permutation symmetry) for
/// deserialized tensors
ColumnSymmetry column_symmetry = Defaults::column_symmetry;
};
static Options make_default_options() { return {}; }

Expand Down Expand Up @@ -157,6 +166,15 @@ class Context {
/// \return BraKetSlotTypesetting of this context; see BraKetSlotTypesetting
/// for the meaning of the possible values
BraKetSlotTypesetting braket_slot_typesetting() const;
/// \return the default bra/ket permutational Symmetry for deserialized tensors
Symmetry symmetry() const;
/// \return the default Hermiticity for deserialized tensors; the braket
/// symmetry of a deserialized tensor is *derived* from this and its
/// #base_field
Hermiticity hermiticity() const;
/// \return the default ColumnSymmetry (particle-permutation symmetry) for
/// deserialized tensors
ColumnSymmetry column_symmetry() const;

/// Sets the Vacuum for this context, convenient for chaining
/// \param vacuum Vacuum
Expand Down Expand Up @@ -197,6 +215,16 @@ class Context {
/// \param braket_slot_typeset BraKetSlotTypesetting
/// \return ref to `*this`, for chaining
Context& set(BraKetSlotTypesetting braket_slot_typeset);
/// Sets the default bra/ket permutational Symmetry for deserialized tensors
/// \return ref to `*this`, for chaining
Context& set(Symmetry symmetry);
/// Sets the default Hermiticity for deserialized tensors (the braket symmetry
/// of a deserialized tensor is derived from this and its base field)
/// \return ref to `*this`, for chaining
Context& set(Hermiticity hermiticity);
/// Sets the default ColumnSymmetry for deserialized tensors
/// \return ref to `*this`, for chaining
Context& set(ColumnSymmetry column_symmetry);

private:
std::shared_ptr<IndexSpaceRegistry> idx_space_reg_ = nullptr;
Expand All @@ -209,6 +237,9 @@ class Context {
BraKetTypesetting braket_typesetting_ = Defaults::braket_typesetting;
BraKetSlotTypesetting braket_slot_typesetting_ =
Defaults::braket_slot_typesetting;
Symmetry symmetry_ = Defaults::symmetry;
Hermiticity hermiticity_ = Defaults::hermiticity;
ColumnSymmetry column_symmetry_ = Defaults::column_symmetry;
};

/// Context object equality comparison
Expand Down
Loading
Loading