with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
with Standard_Natural_Vectors; use Standard_Natural_Vectors;
with Standard_Natural_Vectors_io; use Standard_Natural_Vectors_io;
with Standard_Floating_Linear_Solvers; use Standard_Floating_Linear_Solvers;
procedure Maximal_Minors ( file : in file_type;
n,d : in natural; mat : in Matrix;
min,max : out double_float ) is
function Determinant
( mat : Matrix; rows : Standard_Natural_Vectors.Vector )
return double_float is
-- DESCRIPTION :
-- Computes the determinant of the matrix obtained by selecting rows.
res : double_float := 1.0;
sqm : Matrix(rows'range,rows'range);
piv : Standard_Natural_Vectors.Vector(rows'range);
inf : natural;
begin
for i in rows'range loop
piv(i) := i;
for j in rows'range loop
sqm(i,j) := mat(rows(i),j);
end loop;
end loop;
lufac(sqm,rows'last,piv,inf);
for i in rows'range loop
res := res*sqm(i,i);
end loop;
for i in piv'range loop
if piv(i) > i
then res := -res;
end if;
end loop;
return res;
end Determinant;
procedure Main is
rows : Standard_Natural_Vectors.Vector(1..d);
first : boolean := true;
mindet,maxdet : double_float;
procedure Select_Rows ( k,start : in natural ) is
det : double_float;
begin
if k > d
then det := Determinant(mat,rows);
put(file,"Minor "); put(file,rows); put(file," equals ");
put(file,det); new_line(file);
det := abs(det);
if first
then mindet := det; maxdet := det; first := false;
else if det > maxdet
then maxdet := det;
elsif det < mindet
then mindet := det;
end if;
end if;
else for j in start..n loop
rows(k) := j;
Select_Rows(k+1,j+1);
end loop;
end if;
end Select_Rows;
begin
Select_Rows(1,1);
put(file,"Min : "); put(file,mindet,3,3,3);
put(file," Max : "); put(file,maxdet,3,3,3);
put(file," Max/Min : "); put(file,maxdet/mindet,3,3,3); new_line(file);
min := mindet; max := maxdet;
end;
begin
Main;
end Maximal_Minors;