class MPS_Tensor

#include <MPSTensor.h>

class MPS_Tensor
{
public:
    // fields

    std::vector<cmatrix_t> m_physical_index;

    // construction

    MPS_Tensor();

    MPS_Tensor(
        const cmatrix_t& data0,
        const cmatrix_t& data1
        );

    // methods

    size_t get_dim() const;
    std::vector<cmatrix_t> get_data() const;
    cmatrix_t get_data(size_t i) const;
    void apply_swap();

    void apply_matrix(
        const cmatrix_t& mat,
        bool swapped = false
        );

    void mul_gamma_by_left_lambda(const rvector_t& Lambda);
    void mul_gamma_by_right_lambda(const rvector_t& Lambda);
    void div_gamma_by_left_lambda(const rvector_t& Lambda);
    void div_gamma_by_right_lambda(const rvector_t& Lambda);
    void apply_pauli(GateType gate);

    static MPS_Tensor contract(
        const MPS_Tensor& left_gamma,
        const rvector_t& lambda,
        const MPS_Tensor& right_gamma
        );

    static void decompose(
        MPS_Tensor& temp,
        MPS_Tensor& left_gamma,
        rvector_t& lambda,
        MPS_Tensor& right_gamma
        );

    static void contract_2_dimensions(
        const MPS_Tensor& left_gamma,
        const MPS_Tensor& right_gamma,
        cmatrix_t& result
        );
};