11 namespace implementation_details{
15 using is_rank = std::enable_if_t<std::is_same<T, row_vector_t<T>>::value,
int>;
18 using is_vector_rank = std::enable_if_t<std::is_same<T, std::vector<row_vector_t<typename T::value_type>>>::value,
int>;
21 using is_arrow = std::enable_if_t<std::is_same<T, arrow_t<T>>::value,
int>;
24 using is_chains = std::enable_if_t<std::is_same<T, chains_t<T>>::value,
int>;
27 using is_junction = std::enable_if_t<std::is_same<T, junction_t<T>>::value,
int>;
29 template<
typename T,
bool>
33 struct optional_base<T, 0> {};
36 struct optional_base<T, 1> { T _optional; };
42 template<
typename _output_t,
typename _optional_t =
void>
43 class Tensor : implementation_details::optional_base<_optional_t, !std::is_same<_optional_t, void>::value> {
66 template<
typename _input_t>
67 Tensor(
const _input_t& A,
const _input_t& B,
int i= -1);
70 static constexpr
bool optional_exists = !std::is_same<_optional_t, void>::value;
76 template<
typename _input_t,
typename implementation_details::is_rank<_input_t> = 0>
77 void tensor(
const _input_t&,
const _input_t&,
int = -1);
81 template<
typename _input_t,
typename implementation_details::is_vector_rank<_input_t> = 0,
typename S = _output_t,
typename implementation_details::is_rank<S> = 0>
82 void tensor(
const _input_t&,
const _input_t&,
int = -1);
86 template<
typename _input_t,
typename T = _output_t,
typename S = _output_t,
typename implementation_details::is_vector_rank<T> = 0,
typename implementation_details::is_vector_rank<S> = 0>
87 void tensor(
const _input_t&,
const _input_t&,
int = -1);
91 template<
typename _input_t,
typename T = _output_t,
typename implementation_details::is_arrow<T> = 0>
92 void tensor(
const _input_t&,
const _input_t&,
int = -1);
96 template<
typename _input_t,
typename T = _output_t,
typename implementation_details::is_chains<T> = 0>
97 void tensor(
const _input_t&,
const _input_t&,
int = -1);
101 template<
typename _input_t,
typename T = _output_t,
typename implementation_details::is_junction<T> = 0>
102 void tensor(
const _input_t&,
const _input_t&,
int = -1);
106 #include "impl/Box.ipp"
Contains the classes mackey::Arrow, mackey::Chains and mackey::Junction.
Contains the class mackey::ChangeBasis.
Contains general functions and vector overloads independent of everything else.
Tensor product of chain complexes and more.
Definition: Box.hpp:43
const _output_t & tensor() const
Returns the tensor product.
auto & optional()
Returns the optional parameter (detailed rank)
_output_t & tensor()
Returns the tensor product.
const auto & optional() const
Returns the optional parameter (detailed rank)
Tensor(const _input_t &A, const _input_t &B, int i=-1)
Constructor that tensors A,B and optionally at given location only.
Everything in this library is under this namespace.
Definition: Box.hpp:9