[BACK]Return to frequency_graph.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Root_Counts / Dynlift

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Dynlift/frequency_graph.adb, Revision 1.1.1.1

1.1       maekawa     1: package body Frequency_Graph is
                      2:
                      3: -- CREATORS :
                      4:
                      5:   function Occurrences ( i : natural; l : List ) return natural is
                      6:
                      7:     res : natural := 0;
                      8:     tmp : List := l;
                      9:     pt : Link_to_Vector;
                     10:
                     11:   begin
                     12:     while not Is_Null(tmp) loop
                     13:       pt := Head_Of(tmp);
                     14:       if pt(i) /= 0
                     15:        then res := res + 1;
                     16:       end if;
                     17:       tmp := Tail_Of(tmp);
                     18:     end loop;
                     19:     return res;
                     20:   end Occurrences;
                     21:
                     22:   function Graph ( n : natural; supports : Array_of_Lists ) return Matrix is
                     23:
                     24:     res : Matrix(1..n,supports'range);
                     25:
                     26:   begin
                     27:     for i in 1..n loop
                     28:       for j in supports'range loop
                     29:         res(i,j) := Occurrences(i,supports(j));
                     30:       end loop;
                     31:     end loop;
                     32:     return res;
                     33:   end Graph;
                     34:
                     35: -- MODIFIER :
                     36:
                     37:   procedure Ignore ( m : in out Matrix; point : in Vector ) is
                     38:   begin
                     39:     for i in point'range loop
                     40:       if point(i) /= 0
                     41:        then for j in m'range(2) loop
                     42:               m(i,j) := 1;
                     43:             end loop;
                     44:       end if;
                     45:     end loop;
                     46:   end Ignore;
                     47:
                     48: -- SELECTORS :
                     49:
                     50:   function Occurrence ( i : natural; m : Matrix ) return natural is
                     51:
                     52:     res : natural := 0;
                     53:
                     54:   begin
                     55:     for j in m'range(2) loop
                     56:       if m(i,j) /= 0
                     57:        then res := res + 1;
                     58:       end if;
                     59:     end loop;
                     60:     return res;
                     61:   end Occurrence;
                     62:
                     63:   function Occurrence ( i : natural; m : Matrix; col : natural; perm : Vector )
                     64:                       return natural is
                     65:
                     66:     res : natural := 0;
                     67:
                     68:   begin
                     69:     for j in col+1..m'last(2) loop
                     70:       if m(i,perm(j)) /= 0
                     71:        then res := res + 1;
                     72:       end if;
                     73:     end loop;
                     74:     return res;
                     75:   end Occurrence;
                     76:
                     77:   function Occurrence ( v : Vector; m : Matrix ) return natural is
                     78:
                     79:     min : natural := 1000000;
                     80:     occ : natural;
                     81:
                     82:   begin
                     83:     for i in v'range loop
                     84:       if v(i) /= 0
                     85:        then occ := Occurrence(i,m);
                     86:             if occ < min
                     87:              then min := occ;
                     88:             end if;
                     89:       end if;
                     90:     end loop;
                     91:     return min;
                     92:   end Occurrence;
                     93:
                     94:   function Occurrence ( v : Vector; m : Matrix; col : natural; perm : Vector )
                     95:                       return natural is
                     96:
                     97:     min : natural := 1000000;
                     98:     occ : natural;
                     99:
                    100:   begin
                    101:     for i in v'range loop
                    102:       if v(i) /= 0
                    103:        then occ := Occurrence(i,m,col,perm);
                    104:             if occ < min
                    105:              then min := occ;
                    106:             end if;
                    107:       end if;
                    108:     end loop;
                    109:     return min;
                    110:   end Occurrence;
                    111:
                    112:   function Lowest_Occurrence
                    113:                ( Vec : VecVec; start : natural; m : Matrix ) return natural is
                    114:
                    115:     res : natural := start;
                    116:     min : natural := Occurrence(vec(start).all,m);
                    117:     occ : natural;
                    118:
                    119:   begin
                    120:     for i in start+1..vec'last loop
                    121:       occ := Occurrence(vec(i).all,m);
                    122:       if occ < min
                    123:        then min := occ; res := i;
                    124:       end if;
                    125:     end loop;
                    126:     return res;
                    127:   end Lowest_Occurrence;
                    128:
                    129:   function Lowest_Occurrence
                    130:                ( vec : VecVec; start : natural; m : Matrix;
                    131:                  col : natural; perm : Vector ) return natural is
                    132:
                    133:     res : natural := start;
                    134:     min : natural := Occurrence(vec(start).all,m,col,perm);
                    135:     occ : natural;
                    136:
                    137:   begin
                    138:     for i in start+1..vec'last loop
                    139:       occ := Occurrence(vec(i).all,m,col,perm);
                    140:       if occ < min
                    141:        then min := occ; res := i;
                    142:       end if;
                    143:     end loop;
                    144:     return res;
                    145:   end Lowest_Occurrence;
                    146:
                    147: -- CONSTRUCTORS :
                    148:
                    149:   function Sort ( l : List; m : Matrix ) return List is
                    150:
                    151:     res : List;
                    152:     vec : VecVec(1..Length_Of(l))
                    153:            := Deep_Create(l);
                    154:     tmp : Link_to_Vector;
                    155:     low : natural;
                    156:
                    157:   begin
                    158:     if Length_Of(l) <= 1
                    159:      then Copy(l,res);
                    160:      else for i in vec'first..vec'last-1 loop
                    161:             low := Lowest_Occurrence(vec,i,m);
                    162:             if low /= i
                    163:              then tmp := vec(i);
                    164:                   vec(i) := vec(low);
                    165:                   vec(low) := tmp;
                    166:             end if;
                    167:           end loop;
                    168:           res := Deep_Create(vec);
                    169:           Clear(vec);
                    170:     end if;
                    171:     return res;
                    172:   end Sort;
                    173:
                    174:   procedure Sort ( l : in out List; m : in Matrix ) is
                    175:
                    176:     res : List := Sort(l,m);
                    177:
                    178:   begin
                    179:     Copy(res,l); Deep_Clear(res);
                    180:   end Sort;
                    181:
                    182:   function Sort ( l : List; m : Matrix; col : natural; perm : Vector )
                    183:                 return List is
                    184:
                    185:     res : List;
                    186:     vec : VecVec(1..Length_Of(l)) := Deep_Create(l);
                    187:     tmp : Link_to_Vector;
                    188:     low : natural;
                    189:
                    190:   begin
                    191:     if Length_Of(l) <= 1
                    192:      then Copy(l,res);
                    193:      else for i in vec'first..vec'last-1 loop
                    194:             low := Lowest_Occurrence(vec,i,m,col,perm);
                    195:             if low /= i
                    196:              then tmp := vec(i);
                    197:                   vec(i) := vec(low);
                    198:                   vec(low) := tmp;
                    199:             end if;
                    200:           end loop;
                    201:           res := Deep_Create(vec);
                    202:           Clear(vec);
                    203:     end if;
                    204:     return res;
                    205:   end Sort;
                    206:
                    207:   procedure Sort ( l : in out List; m : in Matrix;
                    208:                    col : in natural; perm : in Vector ) is
                    209:
                    210:     res : List := Sort(l,m,col,perm);
                    211:
                    212:   begin
                    213:     Copy(res,l); Deep_Clear(res);
                    214:   end Sort;
                    215:
                    216: end Frequency_Graph;

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