package AlgLin;

public class SysTriangSup extends SysLin {
    // Constructeur
    public SysTriangSup(Matrice matrice, Vecteur secondMembre) throws IrregularSysLinException {
        super(matrice, secondMembre); // Appel du constructeur de la classe parente SysLin
      
    }

    // Implémentation de la méthode resolution pour un système triangulaire supérieur
    @Override
    public Vecteur resolution() {
        int ordre = this.getOrdre(); // Récupération de l'ordre du système
        Vecteur solution = new Vecteur(ordre); // Vecteur solution initialisé avec la taille de l'ordre
        for (int i = ordre - 1; i >= 0; i--) { // on resoud de la derniere a la premiere ligne
            double somme = 0;
            for (int j = i + 1; j < ordre; j++) {
                somme += this.getMatriceSystem().getCoef(i, j) * solution.getCoef(j, 0);
            }
            double secondMembre = this.getSecondMembre().getCoef(i, 0); // Second membre
            double coefficientDiagonal = this.getMatriceSystem().getCoef(i, i); // Coefficient diagonal
            solution.remplacerCoefficient(i, (secondMembre - somme) / coefficientDiagonal); // Calcul de la solution
        }
        return solution; // Renvoie du vecteur solution
    }
    
    public static void main(String[] args) {
    	try {
            // Création de la matrice triangulaire supérieure
            double[][] coefficients = {
                {2, 1, 4},
                {0, 3, 5},
                {0, 0, 6}
            };
            Matrice matriceTriangSup = new Matrice(coefficients);
            System.out.println("Notre Matrice :\n" + matriceTriangSup);

            // Création du second membre
            double[] secondMembreValues = {6, 9, 12};
            Vecteur secondMembre = new Vecteur(secondMembreValues);
            System.out.println("Notre SecondMembre :\n" + secondMembre);

            // Création du système triangulaire supérieur
            SysTriangSup sysTriangSup = new SysTriangSup(matriceTriangSup, secondMembre);

            // Copie de la matrice et du second membre pour les tests
            Matrice matriceCopie = new Matrice(matriceTriangSup.nbLigne(), matriceTriangSup.nbColonne());
            matriceCopie.recopie(matriceTriangSup);

            Vecteur secondMembreCopie = new Vecteur(secondMembre.taille());
            secondMembreCopie.recopie(secondMembre);

            // Résolution du système triangulaire supérieur
            Vecteur solution = sysTriangSup.resolution();
            System.out.println("Solution du système triangulaire supérieur : \n" + solution);

         // Appel de la méthode pour vérifier la norme
            sysTriangSup.verifierNorme(matriceCopie, secondMembreCopie, solution);
        } catch (IrregularSysLinException e) {
            System.out.println("Erreur : " + e.getMessage());
        }
    }
}
