# D,0,n aranžman
use application "fan";

use Algorithm::Combinatorics qw(combinations);

my $n = 5	;

# Funkcija za generisanje svih kombinacija sa zadatim brojem jedinica i dužinom niza
sub generisi_kombinacije{
    my ($broj_jedinica, $n) = @_;
    my @rezultat;

    # Generišemo sve kombinacije indeksa za jedinice u nizu dužine n
    my $iter = combinations([0..$n-1], $broj_jedinica);
    while (my $komb = $iter->next) {
        # Kreiramo osnovni niz sa svim nulama
        my @niz = (0) x $n;
        
        # Postavljamo jedinice na odgovarajuće pozicije
        $niz[$_] = 1 for @$komb;
        
        # Dodajemo -1 na početak i čuvamo kombinaciju
        push @rezultat, [-1, @niz];
    }
    
    return @rezultat;
};

# Generisanje hyperplane matrice za opšte n
my @kombinacije;
for my $k (2..$n-2) {
    push @kombinacije, generisi_kombinacije($k, $n);
};

declare $hyperplane = new Matrix<Int>(@kombinacije);


#my $eps = Rational->new(1, 100000); # Epsilon vrednost
#my @rows;
#push @rows, [1, (0) x $n]; # Prvi red: 1, zatim n nula
#for my $i (1..$n) {
#    my @row = (0) x ($n+1);
#    $row[$i] = 1;
#    $row[0] = -$eps;       # Prvi element reda je epsilon
#    push @rows, \@row;
#}

#my $dense_unit_matrix = new Matrix<Rational>(@rows);

# x_i\geq 0
my $dense_unit_matrix = dense(unit_matrix<Int>($n+1));

# x_1+x_2+x_3+x_4+x_5\geq 2
my $ar = new Matrix<Int>([[-2, (1) x ($n)]]);

# x_i\leq 1
my $m_int = new Matrix<Int>((-1)*unit_matrix<Int>($n));
my $arr2 = new Vector<Int>([(1) x ($n)]);
my $extended_matrix = new Matrix<Int>(($arr2 | $m_int));

my $sp = $dense_unit_matrix/$extended_matrix;
my $sp = $sp/$ar;

print "Hyperplane matrix:\n";
print $hyperplane;

print "Sp matrix:\n";
print $sp;


declare $HA = new HyperplaneArrangement(HYPERPLANES=>$hyperplane, "SUPPORT.INEQUALITIES"=>$sp);


declare $filename = "/mnt/c/Users/Vladimir/Desktop/D${n}2Rays.txt";

open(FH, '>', $filename) or die $!;
print FH $HA->CHAMBER_DECOMPOSITION->RAYS;
close(FH);

declare $chmb = $HA->CHAMBER_DECOMPOSITION;
declare $filename2 = "/mnt/c/Users/Vladimir/Desktop/D${n}2chamber.txt";
open(FH, '>', $filename2) or die $!;
print FH $chmb->MAXIMAL_CONES;
close(FH);

declare $filename3 = "/mnt/c/Users/Vladimir/Desktop/D${n}2Signature.txt";

open(FH, '>', $filename3) or die $!;
print FH $HA->CHAMBER_SIGNATURES;
close(FH);


