package AlgLin;

public class SysTriangSupUnite extends SysTriangSup {
    // Constructeur
    public SysTriangSupUnite(Matrice matrice, Vecteur secondMembre) throws IrregularSysLinException {
        super(matrice, secondMembre); // Appel du constructeur de la classe parente SysTriangSup
    }
     
    public Vecteur resolution() {  
        int n = getOrdre(); 
        Matrice a = getMatriceSystem(); // o,n recupere la matrice
        Vecteur b = getSecondMembre();  
        Vecteur x = new Vecteur(n); // 

        //on commence par la derniere equation
        // comme le coef diagonale est 1 il n'y a pas de division d ou x(n-1) = b(n-1)
        x.remplacerCoefficient(n - 1, b.getCoef(n - 1));  

        // Parcours des lignes du système en remontant, de l'avant-dernière a la première 
        for (int i = n - 2; i >= 0; i--) {  
            double sum = 0.0; // on stock la somme des terme connu   a droite

            // Calcul de la somme des termes déjà déterminés dans les lignes supérieures  
            for (int j = n - 1; j > i; j--) {  
                sum += a.getCoef(i, j) * x.getCoef(j); // Ajout du produit des coefficients connus  
            }  

            // calcul de la solution avec  x(i) = b(i) - sum  
            x.remplacerCoefficient(i, (b.getCoef(i) - sum));  
        }  

        return x; // Retourne le vecteur solution  
    }  

    
    
    public static void main(String[] args) {
    	 try {
             // Création de la matrice triangulaire supérieure unitaire
             double[][] coefficients = {
                 {1, 1, 1},
                 {0, 1, 1},
                 {0, 0, 1}
             };
             Matrice matriceTriangSupUnite = new Matrice(coefficients);
             System.out.println("Notre Matrice :\n" + matriceTriangSupUnite);


             // 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 unitaire
             SysTriangSupUnite sysTriangSupUnite = new SysTriangSupUnite(matriceTriangSupUnite, secondMembre);

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

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

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

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