[BACK]Return to minor_computations.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Schubert

Annotation of OpenXM_contrib/PHC/Ada/Schubert/minor_computations.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      2: with 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: package body Minor_Computations is
                      7:
                      8:   function Determinant
                      9:               ( mat : Matrix; rows,cols : Standard_Natural_Vectors.Vector )
                     10:               return double_float is
                     11:
                     12:   -- DESCRIPTION :
                     13:   --   Computes the determinant of the matrix selecting d rows and columns,
                     14:   --   where d = rows'length = cols'length.
                     15:
                     16:     res : double_float := 1.0;
                     17:     sqm : Matrix(rows'range,rows'range);
                     18:     piv : Standard_Natural_Vectors.Vector(rows'range);
                     19:     inf : natural;
                     20:
                     21:   begin
                     22:     for i in rows'range loop
                     23:       piv(i) := i;
                     24:       for j in cols'range loop
                     25:         sqm(i,j) := mat(rows(i),cols(j));
                     26:       end loop;
                     27:     end loop;
                     28:     lufac(sqm,rows'last,piv,inf);
                     29:     for i in rows'range loop
                     30:       res := res*sqm(i,i);
                     31:     end loop;
                     32:     for i in piv'range loop
                     33:       if piv(i) > i
                     34:        then res := -res;
                     35:       end if;
                     36:     end loop;
                     37:     return res;
                     38:   end Determinant;
                     39:
                     40:   procedure Minors ( file : in file_type;
                     41:                      n,m : in natural; mat : in Matrix ) is
                     42:
                     43:     procedure Minors ( d : in natural ) is
                     44:
                     45:       rows,cols : Standard_Natural_Vectors.Vector(1..d);
                     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,cols);
                     54:               put(file,"Minor ");
                     55:               put(file,rows); put(file," X"); put(file,cols);
                     56:               put(file," equals ");
                     57:               put(file,det); new_line(file);
                     58:          else for j in start..n loop
                     59:                 rows(k) := j;
                     60:                 Select_Rows(k+1,j+1);
                     61:               end loop;
                     62:         end if;
                     63:       end Select_Rows;
                     64:
                     65:       procedure Select_Columns ( k,start : in natural ) is
                     66:       begin
                     67:         if k > d
                     68:          then Select_Rows(1,1);
                     69:          else for j in start..m loop
                     70:                 cols(k) := j;
                     71:                 Select_Columns(k+1,j+1);
                     72:               end loop;
                     73:         end if;
                     74:       end Select_Columns;
                     75:
                     76:     begin
                     77:       Select_Columns(1,1);
                     78:     end Minors;
                     79:
                     80:   begin
                     81:     for d in 2..m loop
                     82:       Minors(d);
                     83:     end loop;
                     84:   end Minors;
                     85:
                     86:   function Number_of_Minors ( n,m : natural ) return natural is
                     87:
                     88:     res : natural := 0;
                     89:
                     90:     procedure Count_Minors ( d : in natural ) is
                     91:
                     92:       procedure Select_Rows ( k,start : in natural ) is
                     93:       begin
                     94:         if k > d
                     95:          then res := res + 1;
                     96:          else for j in start..n loop
                     97:                 Select_Rows(k+1,j+1);
                     98:               end loop;
                     99:         end if;
                    100:       end Select_Rows;
                    101:
                    102:       procedure Select_Columns ( k,start : in natural ) is
                    103:       begin
                    104:         if k > d
                    105:          then Select_Rows(1,1);
                    106:          else for j in start..m loop
                    107:                 Select_Columns(k+1,j+1);
                    108:               end loop;
                    109:         end if;
                    110:       end Select_Columns;
                    111:
                    112:     begin
                    113:       Select_Columns(1,1);
                    114:     end Count_Minors;
                    115:
                    116:   begin
                    117:     for d in 2..m loop
                    118:       Count_Minors(d);
                    119:     end loop;
                    120:     return res;
                    121:   end Number_of_Minors;
                    122:
                    123:   function Sign_of_Minors ( n,m : natural; mat : Matrix ) return Vector is
                    124:
                    125:     res : Vector(1..Number_of_Minors(n,m));
                    126:     tol : constant double_float := 10.0**(-10);
                    127:     cnt : natural := 0;
                    128:
                    129:     procedure Compute_Minors ( d : in natural ) is
                    130:
                    131:       rows,cols : Standard_Natural_Vectors.Vector(1..d);
                    132:
                    133:       procedure Select_Rows ( k,start : in natural ) is
                    134:
                    135:         det : double_float;
                    136:
                    137:       begin
                    138:         if k > d
                    139:          then det := Determinant(mat,rows,cols);
                    140:               cnt := cnt + 1;
                    141:               if abs(det) < tol
                    142:                then res(cnt) := 0;
                    143:                elsif det > 0.0
                    144:                    then res(cnt) := +1;
                    145:                    else res(cnt) := -1;
                    146:               end if;
                    147:          else for j in start..n loop
                    148:                 rows(k) := j;
                    149:                 Select_Rows(k+1,j+1);
                    150:               end loop;
                    151:         end if;
                    152:       end Select_Rows;
                    153:
                    154:       procedure Select_Columns ( k,start : in natural ) is
                    155:       begin
                    156:         if k > d
                    157:          then Select_Rows(1,1);
                    158:          else for j in start..m loop
                    159:                 cols(k) := j;
                    160:                 Select_Columns(k+1,j+1);
                    161:               end loop;
                    162:         end if;
                    163:       end Select_Columns;
                    164:
                    165:     begin
                    166:       Select_Columns(1,1);
                    167:     end Compute_Minors;
                    168:
                    169:   begin
                    170:     for d in 2..m loop
                    171:       Compute_Minors(d);
                    172:     end loop;
                    173:     return res;
                    174:   end Sign_of_Minors;
                    175:
                    176: end Minor_Computations;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>