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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Implift/lists_of_vectors_utilities.adb, Revision 1.1.1.1

1.1       maekawa     1: with Standard_Integer_Norms;             use Standard_Integer_Norms;
                      2: with Standard_Integer_Matrices;          use Standard_Integer_Matrices;
                      3: with Standard_Integer_Linear_Solvers;    use Standard_Integer_Linear_Solvers;
                      4:
                      5: package body Lists_of_Vectors_Utilities is
                      6:
                      7:   procedure Compute_Normal ( v : in VecVec; n : out Link_to_Vector;
                      8:                              deg : out natural ) is
                      9:
                     10:     d : Link_to_Vector renames v(v'last);
                     11:     im : matrix(d'range,d'range);
                     12:     res : Link_to_Vector;
                     13:     cnt : integer;
                     14:
                     15:   begin
                     16:     res := new Vector(d'range);
                     17:     cnt := im'first(1);
                     18:     for i in v'first..(v'last-1) loop
                     19:       for j in im'range(2) loop
                     20:         im(cnt,j) := v(i)(j) - d(j);
                     21:       end loop;
                     22:       cnt := cnt + 1;
                     23:     end loop;
                     24:     for i in cnt..im'last(1) loop
                     25:       for j in im'range(2) loop
                     26:         im(i,j) := 0;
                     27:       end loop;
                     28:     end loop;
                     29:     Upper_Triangulate(im);
                     30:     cnt := 1;
                     31:     for k in im'first(1)..im'last(1)-1 loop
                     32:       cnt := cnt*im(k,k);
                     33:     end loop;
                     34:     if cnt < 0
                     35:      then deg := -cnt;
                     36:      else deg := cnt;
                     37:     end if;
                     38:     Scale(im);
                     39:     Solve0(im,res.all);
                     40:     Normalize(res.all);
                     41:     n := res;
                     42:   end Compute_Normal;
                     43:
                     44:   function Compute_Normal ( v : VecVec ) return Link_to_Vector is
                     45:
                     46:     deg : natural;
                     47:     res : Link_to_Vector;
                     48:
                     49:   begin
                     50:     Compute_Normal(v,res,deg);
                     51:     return res;
                     52:   end Compute_Normal;
                     53:
                     54:   function Pointer_to_Last ( l : List ) return List is
                     55:
                     56:     res : List := l;
                     57:
                     58:   begin
                     59:     if not Is_Null(res)
                     60:      then while not Is_Null(Tail_Of(res)) loop
                     61:             res := Tail_Of(res);
                     62:           end loop;
                     63:     end if;
                     64:     return res;
                     65:   end Pointer_to_Last;
                     66:
                     67:   procedure Move_to_Front ( l : in out List; v : in Vector ) is
                     68:
                     69:     tmp : List := l;
                     70:     found : boolean := false;
                     71:     first,lv : Link_to_Vector;
                     72:
                     73:   begin
                     74:     while not Is_Null(tmp) loop
                     75:       lv := Head_Of(tmp);
                     76:       if Equal(lv.all,v)
                     77:        then found := true;
                     78:        else tmp := Tail_Of(tmp);
                     79:       end if;
                     80:       exit when found;
                     81:     end loop;
                     82:     if found
                     83:      then
                     84:        first := Head_Of(l);
                     85:        if first /= lv
                     86:         then
                     87:           lv.all := first.all;  Set_Head(tmp,lv);
                     88:           first.all := v;       Set_Head(l,first);
                     89:        end if;
                     90:     end if;
                     91:   end Move_to_Front;
                     92:
                     93:   function Difference ( l1,l2 : List ) return List is
                     94:
                     95:     res,res_last : List;
                     96:     tmp : List := l1;
                     97:     pt : Link_to_Vector;
                     98:
                     99:   begin
                    100:     while not Is_Null(tmp) loop
                    101:       pt := Head_Of(tmp);
                    102:       if not Is_In(l2,pt.all)
                    103:        then Append(res,res_last,pt.all);
                    104:       end if;
                    105:       tmp := Tail_Of(tmp);
                    106:     end loop;
                    107:     return res;
                    108:   end Difference;
                    109:
                    110:   function Different_Points ( l : List ) return List is
                    111:
                    112:     tmp,res,res_last : List;
                    113:
                    114:   begin
                    115:     tmp := l;
                    116:     while not Is_Null(tmp) loop
                    117:       Append_Diff(res,res_last,Head_Of(tmp).all);
                    118:       tmp := Tail_Of(tmp);
                    119:     end loop;
                    120:     return res;
                    121:   end Different_Points;
                    122:
                    123:   procedure Remove_Duplicates ( l : in out List ) is
                    124:
                    125:     res : List := Different_Points(l);
                    126:
                    127:   begin
                    128:     Deep_Clear(l);
                    129:     l := res;
                    130:   end Remove_Duplicates;
                    131:
                    132: end Lists_of_Vectors_Utilities;

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