#include "common.hpp"
#include "array.hpp"
#include "action.hpp"

using namespace std::complex_literals;
using namespace array;

template <typename Scalar, typename Shape>
void dump(Array<Scalar,Shape> Q)
{
    for (size_t i = 0; i < Q.dim(0); ++i) {
        for (size_t j = 0; j < Q.dim(1); ++j) {
            for (size_t k = 0; k < Q.dim(2); ++k) {
                for (size_t l = 0; l < Q.dim(3); ++l) {
                    std::cout << i << "," << j << "," << k << "," << l << " = " << Q(i,j,k,l) << std::endl;
                }
            }
        }
    }

    for (size_t i = 0; i < Q.size(); ++i) {
        std::cout << Q.data()[i] << std::endl;
    }
}

int main()
{
    std::vector<double> v(10*10*2*2);
    Array<double,Shape<Dynamic,Dynamic,2,2> > Q0(v.data(), v.size(), {10,10,2,2});
    auto Q = Q0.part(0u,1u);

    S_2(Q0);

    std::cout << "size = " << Q.size() << std::endl;

    dump(Q0);

    auto mat = Q.matrix();

    mat = mat * mat * mat;

    static_assert(std::is_same<decltype(mat), Eigen::Map<Eigen::Matrix<double, 2, 2, Eigen::RowMajor>, Eigen::Aligned8 > >::value, "wrong type");

    dump(Q0);
    return 0;
}