#pragma once

/**
 * \file Solver.h
 * \brief Contient la définition du solutionneur
 */

#include "Vect.h"

/**
 * \class Solver
 * \brief Permet d'obtenir différentes propriétés d'une matrice comme l'image ou le noyau
 */
class Solver {
  public:
	/**
	 * \brief Calcule l'image d'une matrice
	 * \param a_Matrix La matrice à traiter
	 * \return L'espace vectoriel correspondant
	 */
	Vect Image(Matrix&& a_Matrix) const;

	/**
	 * \brief Calcule le noyau d'une matrice
	 * \param a_Matrix La matrice à traiter
	 * \return L'espace vectoriel correspondant
	 */
	Vect Kernel(Matrix&& a_Matrix) const;

	/**
	 * \brief Résout le système rectangulaire de la forme AX=B, avec X et B, des vecteurs colonne.
	 * \param a_MatrixA La matrice jouant le rôle de A
	 * \param a_VectorB La matrice colonne jouant le rôle de B
	 * \return L'espace affine associé
	 */
	VectAffine RectangularSystem(Matrix&& a_MatrixA, const Matrix& a_VectorB) const;

	/**
	 * \brief Calcule le rang d'une matrice
	 * \param a_Matrix La matrice à traiter
	 * \note Ceci équivaut à \code Image(a_Matrix).GetCardinal() \endcode
	 */
	std::size_t Rank(Matrix&& a_Matrix) const;
};