Annotation of OpenXM_contrib/PHC/Ada/Schubert/maximal_minors.adb, Revision 1.1
1.1 ! maekawa 1: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
! 2: with Standard_Natural_Vectors; use Standard_Natural_Vectors;
! 3: with Standard_Natural_Vectors_io; use Standard_Natural_Vectors_io;
! 4: with Standard_Floating_Linear_Solvers; use Standard_Floating_Linear_Solvers;
! 5:
! 6: procedure Maximal_Minors ( file : in file_type;
! 7: n,d : in natural; mat : in Matrix;
! 8: min,max : out double_float ) is
! 9:
! 10: function Determinant
! 11: ( mat : Matrix; rows : Standard_Natural_Vectors.Vector )
! 12: return double_float is
! 13:
! 14: -- DESCRIPTION :
! 15: -- Computes the determinant of the matrix obtained by selecting rows.
! 16:
! 17: res : double_float := 1.0;
! 18: sqm : Matrix(rows'range,rows'range);
! 19: piv : Standard_Natural_Vectors.Vector(rows'range);
! 20: inf : natural;
! 21:
! 22: begin
! 23: for i in rows'range loop
! 24: piv(i) := i;
! 25: for j in rows'range loop
! 26: sqm(i,j) := mat(rows(i),j);
! 27: end loop;
! 28: end loop;
! 29: lufac(sqm,rows'last,piv,inf);
! 30: for i in rows'range loop
! 31: res := res*sqm(i,i);
! 32: end loop;
! 33: for i in piv'range loop
! 34: if piv(i) > i
! 35: then res := -res;
! 36: end if;
! 37: end loop;
! 38: return res;
! 39: end Determinant;
! 40:
! 41: procedure Main is
! 42:
! 43: rows : Standard_Natural_Vectors.Vector(1..d);
! 44: first : boolean := true;
! 45: mindet,maxdet : double_float;
! 46:
! 47: procedure Select_Rows ( k,start : in natural ) is
! 48:
! 49: det : double_float;
! 50:
! 51: begin
! 52: if k > d
! 53: then det := Determinant(mat,rows);
! 54: put(file,"Minor "); put(file,rows); put(file," equals ");
! 55: put(file,det); new_line(file);
! 56: det := abs(det);
! 57: if first
! 58: then mindet := det; maxdet := det; first := false;
! 59: else if det > maxdet
! 60: then maxdet := det;
! 61: elsif det < mindet
! 62: then mindet := det;
! 63: end if;
! 64: end if;
! 65: else for j in start..n loop
! 66: rows(k) := j;
! 67: Select_Rows(k+1,j+1);
! 68: end loop;
! 69: end if;
! 70: end Select_Rows;
! 71:
! 72: begin
! 73: Select_Rows(1,1);
! 74: put(file,"Min : "); put(file,mindet,3,3,3);
! 75: put(file," Max : "); put(file,maxdet,3,3,3);
! 76: put(file," Max/Min : "); put(file,maxdet/mindet,3,3,3); new_line(file);
! 77: min := mindet; max := maxdet;
! 78: end;
! 79:
! 80: begin
! 81: Main;
! 82: end Maximal_Minors;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>