package utils;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import java.util.Vector;
import org.jscience.mathematics.function.Polynomial;
import org.jscience.mathematics.function.Term;
import org.jscience.mathematics.function.Variable;
import org.jscience.mathematics.number.Real;

/**
 *
 * @author jnunezf
 */
public class SymbolicMatrix {
    
    private int rows;
    private int columns;
    
    private Vector<Vector<Polynomial<Real>>> Matrix;
    
    public SymbolicMatrix(int m, int n){
        rows = m;
        columns = n;
    
        Matrix = new Vector<Vector<Polynomial<Real>>>(rows);
        
        for (int i = 0; i<rows; i++){
            Matrix.add(new Vector<Polynomial<Real>>(columns));
            Matrix.get(i).setSize(columns);                                
        }        
    }
    
    public Polynomial<Real> getDeterminant(){
                
        PermutationsGenerator p = new PermutationsGenerator(this.getDimension());
        
        Polynomial polynomial = Polynomial.valueOf(Real.ZERO, new Variable.Local<Real>("s"));
        int[] indexs;        
        
        while (p.hasMore()){
           
            indexs = p.getNext();        
           
            int sign;            
            if ((p.getPermutations() % 2) == 0){
                sign = 1;
            }else{
                sign = -1;
            }
            
            Polynomial polynomial_factor = Polynomial.valueOf(Real.valueOf(sign), Term.ONE);            
            for (int i = 0; i < indexs.length; i++) {
                polynomial_factor = polynomial_factor.times(this.get(i, indexs[i]));                
            }  
            
            polynomial = polynomial.plus(polynomial_factor);
        }
        
        return polynomial;
    }
    
    public Polynomial<Real> get(int i, int j){
        return Matrix.get(i).get(j);
    }
    
    public void set(int i, int j, Polynomial<Real> polynomial){
        
        Matrix.get(i).setElementAt(polynomial, j);
    }
    
    public int getRows(){
        return rows;
    }
    
    public int getColumns(){
        return columns;
    }
    
    public void removeRow(int i){
        Matrix.remove(i);
        rows--;
    }
    
    public void removeColumn(int j){
        for(int i = 0; i<rows; i++){
            Matrix.get(i).remove(j);
        }
        columns--;                
    }
    
    public int getDimension(){
        return rows;
    }
    
}
