package AlgLin;

public class Mat3Diag extends Matrice {

	// constructeur prenant les dimensions de la matrice
    public Mat3Diag(int dim1, int dim2) throws IrregularSysLinException { 
        super(dim1, dim2); 
        
        // verification que dim1 vaut 3 pour une matrice tridiagonale
        if (dim1 != 3) {
            throw new IllegalArgumentException("dim1 doit etre egal à 3");
        }
        if (dim2 <= 0) {
            throw new IllegalArgumentException("dim2 doit etre strictement positif");
        }
    }

    // constructeur prenant un tableau de coefficients
    public Mat3Diag(double[][] tableau) throws IrregularSysLinException {
        super(tableau); 
        // verification que le tableau a 3 lignes 
        if (tableau.length != 3) {
            throw new IllegalArgumentException("Le tableau doit avoir 3 lignes");
        }
        if (tableau[0].length <= 0) {
            throw new IllegalArgumentException("Le tableau doit avoir au moins une colonne");
        }
    }

    // constructeur pour allouer en memoire un tableau à 3 lignes et dim colonnes pour une matrice tridiagonale
    // d ordre n
    public Mat3Diag(int dim) throws IrregularSysLinException {
        super(3, dim); 
        if (dim <= 0) {
            throw new IllegalArgumentException("la taille de la matrice doit être strictement positive");
        }
    }

    // methode statique pour le produit d'une matrice tridiagonale par un vecteur
    public static Vecteur produit(Mat3Diag tridiagonale, Vecteur vecteur) {
        // Vérification des dimensions compatibles
        if (tridiagonale.nbColonne() != vecteur.taille()) {
            throw new IllegalArgumentException("dimensions incompatibles pour le produit");
        }
        
        // Calcul du produit : 
        Vecteur resultat = new Vecteur(vecteur.taille());
        for (int i = 0; i < vecteur.taille(); i++) {
            double somme = 0.0;
            // Diagonale principale
            somme += tridiagonale.getCoef(1, i) * vecteur.getCoef(i);

            // Sous-diagonale
            if (i > 0) {
                somme += tridiagonale.getCoef(0, i) * vecteur.getCoef(i - 1);
            }

            // Sur-diagonale
            if (i < vecteur.taille() - 1) {
                somme += tridiagonale.getCoef(2, i) * vecteur.getCoef(i + 1);
            }
            
            resultat.remplacerCoefficient(i, somme);
        }
        return resultat;
    }
	
    public static void main(String[] args) throws IrregularSysLinException {

    	//Test 1 :
      double[][] matrice1 = {
            {0, 1, 2}, 
            {4, 5, 6}, 
            {7, 2, 0}
        };
      
        Mat3Diag mat1 = new Mat3Diag(matrice1);
        Vecteur vec1 = new Vecteur(new double[]{1,2,3});
        Vecteur res1 = Mat3Diag.produit(mat1, vec1);
        System.out.println("Test :");
        System.out.println("Matrice 1 :\n" + mat1);
        System.out.println("Vecteur 1 :\n" + vec1);
        System.out.println("Résultat 1 :\n" + res1);
       
        // Test 2 : 
        double[][] matrice2 = {
                {0, 1, 2, 3, 1}, 
                {4, 5, 6, 7, 8}, 
                {2, 9, 10, 11, 0}  
            };
        
        Mat3Diag mat2 = new Mat3Diag(matrice2);
        Vecteur vec2 = new Vecteur(new double[]{1, 3, 5, 7, 9});
        Vecteur res2 = Mat3Diag.produit(mat2, vec2);
        System.out.println("Test 2");
        System.out.println("Matrice 2 :\n" + mat2);
        System.out.println("Vecteur 2:\n" + vec2);
        System.out.println("Résultat 2:\n" + res2);

        // Test 3 : 
        double[][] matrice3 = { 
        		{ 0, -1, -1, -1}, 
                { 2, 2, 2, 2 }, 
                { -1, -1, -1, 0 }
        };
        
        Mat3Diag mat3 = new Mat3Diag(matrice3);
        Vecteur vec3 = new Vecteur(new double[]{1, 2, 3, 4});
        Vecteur res3 = Mat3Diag.produit(mat3, vec3);
        System.out.println("Test 3 : ");
        System.out.println("Matrice 3:\n" + mat3);
        System.out.println("Vecteur 3 :\n" + vec3);
        System.out.println("Résultat 3:\n" + res3);
    }
}