#pragma once

#include "../general_model/ProcessCorrelations.h"
#include <iostream>

class SliceProcessCorrelations3d : public SliceProcessCorrelations
{
	// M matrix defined by these three variables 
	double m_alpha;
	double m_beta;
	double m_gamma;

	gelib::d_matrix m_Mk_Ck_Mkt;
	gelib::d_matrix m_Mk_Ckminus1_Mkt;
	gelib::d_matrix m_Mk_Ck_Ckminus1_Mkt;

public:

	static std::unique_ptr<SliceProcessCorrelations> construct();

	SliceProcessCorrelations3d(size_t size);

	void initialise(const std::vector<double>& prev_covariances, const std::vector<double>& covariances, const std::array<size_t, 3>& ordering) override;

	double alpha() const;

	double beta() const;

	double gamma() const;

	gelib::d_matrix const& get_Mk_Ck_Mkt() const;

	gelib::d_matrix const& get_Mk_Ck_Ckminus1_Mkt() const;

	gelib::d_matrix const& get_Mk_Ckminus1_Mkt() const;
};