Program Listing for File wick_extended.hpp

↰ Return to documentation for file (SeQuant/core/wick_extended.hpp)

#ifndef SEQUANT_CORE_WICK_EXTENDED_HPP
#define SEQUANT_CORE_WICK_EXTENDED_HPP

#include <SeQuant/core/attr.hpp>
#include <SeQuant/core/container.hpp>
#include <SeQuant/core/density.hpp>
#include <SeQuant/core/expr.hpp>
#include <SeQuant/core/index.hpp>
#include <SeQuant/core/op.hpp>
#include <SeQuant/core/rational.hpp>

#include <cstddef>
#include <optional>
#include <utility>

namespace sequant {

template <Statistics S>
class WickTheorem;

class IndexBasisRegistry;

namespace detail {

void assert_protoindexed_not_active(const IndexBasisRegistry &isr,
                                    const IndexSpace &sp, const Index &a,
                                    const Index &b);

struct ExtendedWickOptions {
  bool full_contractions = true;
  std::optional<std::size_t> max_cumulant_rank = std::nullopt;
  bool eta_as_delta_minus_gamma = false;
  bool use_topology = true;
  container::svector<std::pair<std::size_t, std::size_t>> nop_connections = {};
  container::svector<std::pair<std::size_t, std::size_t>>
      nop_avoided_connections = {};
};

using OpProvenance = container::map<Index, std::size_t>;

template <Statistics S>
ExprPtr block_value(const NormalOperator<S> &block) {
  return density::make_cumulant(block);
}

template <Statistics S>
rational term_weight(
    const NormalOperator<S> & /*survivors*/,
    const container::svector<container::svector<std::size_t>> & /*blocks*/) {
  return 1;
}

template <Statistics S>
ExprPtr cumulant_expand(const ExprPtr &wick_output,
                        const OpProvenance &provenance,
                        const ExtendedWickOptions &opts);

extern template ExprPtr cumulant_expand<Statistics::FermiDirac>(
    const ExprPtr &, const OpProvenance &, const ExtendedWickOptions &);

template <Statistics S>
ExprPtr extended_wick(ExprPtr input, const ExtendedWickOptions &opts,
                      WickTheorem<S> &stats_sink);

extern template ExprPtr extended_wick<Statistics::FermiDirac>(
    ExprPtr, const ExtendedWickOptions &,
    WickTheorem<Statistics::FermiDirac> &);

}  // namespace detail

}  // namespace sequant

#endif  // SEQUANT_CORE_WICK_EXTENDED_HPP