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

Annotation of OpenXM_contrib/PHC/Ada/Root_Counts/Stalift/floating_lifting_utilities.adb, Revision 1.1.1.1

1.1       maekawa     1: package body Floating_Lifting_Utilities is
                      2:
                      3:   function Adaptive_Lifting ( l : Array_of_Lists ) return Vector is
                      4:
                      5:     res : Vector(l'range);
                      6:     fac : constant double_float := 3.0;     -- multiplication factor
                      7:     max : constant double_float := 23.0;    -- upper bound for lifting
                      8:
                      9:   begin
                     10:     for i in l'range loop
                     11:       res(i) := fac*double_float(Length_Of(l(i)));
                     12:       if res(i) > max
                     13:        then res(i) := max;
                     14:       end if;
                     15:     end loop;
                     16:     return res;
                     17:   end Adaptive_Lifting;
                     18:
                     19:   procedure Search_Lifting ( l : in List; pt : in Vector;
                     20:                              found : out boolean; lif : out double_float ) is
                     21:
                     22:     tmp : List := l;
                     23:     lpt : Link_to_Vector;
                     24:
                     25:   begin
                     26:     found := false;
                     27:     while not Is_Null(tmp) loop
                     28:       lpt := Head_Of(tmp);
                     29:       if Equal(lpt(pt'range),pt)
                     30:        then found := true;
                     31:             lif := lpt(lpt'last);
                     32:             exit;
                     33:        else tmp := Tail_Of(tmp);
                     34:       end if;
                     35:     end loop;
                     36:   end Search_Lifting;
                     37:
                     38:   function Search_and_Lift ( l : List; pt : Vector ) return Vector is
                     39:
                     40:     tmp : List := l;
                     41:     lpt : Link_to_Vector;
                     42:
                     43:   begin
                     44:     while not Is_Null(tmp) loop
                     45:       lpt := Head_Of(tmp);
                     46:       if Equal(lpt(pt'range),pt)
                     47:        then return lpt.all;
                     48:        else tmp := Tail_Of(tmp);
                     49:       end if;
                     50:     end loop;
                     51:     return pt;
                     52:   end Search_and_Lift;
                     53:
                     54:   function Search_and_Lift ( mic : Mixed_Cell; k : natural; pt : Vector )
                     55:                            return Vector is
                     56:   begin
                     57:     return Search_and_Lift(mic.pts(k),pt);
                     58:   end Search_and_Lift;
                     59:
                     60:   function Occured_Lifting ( mixsub : Mixed_Subdivision; k : natural;
                     61:                              pt : Vector ) return Vector is
                     62:
                     63:     tmp : Mixed_Subdivision := mixsub;
                     64:
                     65:   begin
                     66:     while not Is_Null(tmp) loop
                     67:       declare
                     68:         lpt : constant Vector := Search_and_Lift(Head_Of(tmp),k,pt);
                     69:       begin
                     70:         if lpt'last > pt'last
                     71:          then return lpt;
                     72:          else tmp := Tail_Of(tmp);
                     73:         end if;
                     74:       end;
                     75:     end loop;
                     76:     return pt;
                     77:   end Occured_Lifting;
                     78:
                     79:   function Occured_Lifting
                     80:                ( n : natural; mix : Standard_Integer_Vectors.Vector;
                     81:                  points : Array_of_Lists; mixsub : Mixed_Subdivision )
                     82:                return Array_of_Lists is
                     83:
                     84:     res,res_last : Array_of_Lists(mix'range);
                     85:     cnt : natural := 1;
                     86:     tmp : List;
                     87:
                     88:   begin
                     89:     for k in mix'range loop
                     90:       res_last(k) := res(k);
                     91:       tmp := points(cnt);
                     92:       while not Is_Null(tmp) loop
                     93:         declare
                     94:           pt : Link_to_Vector := Head_Of(tmp);
                     95:           lpt : constant Vector := Occured_Lifting(mixsub,k,pt.all);
                     96:         begin
                     97:           if lpt'last > pt'last
                     98:            then Append(res(k),res_last(k),lpt);
                     99:           end if;
                    100:         end;
                    101:         tmp := Tail_Of(tmp);
                    102:       end loop;
                    103:       cnt := cnt + mix(k);
                    104:     end loop;
                    105:     return res;
                    106:   end Occured_Lifting;
                    107:
                    108:   function Induced_Lifting ( mixsub : Mixed_Subdivision; k : natural;
                    109:                              pt : Vector ) return Vector is
                    110:
                    111:     tmp : Mixed_Subdivision := mixsub;
                    112:     res : Vector(pt'first..pt'last+1);
                    113:
                    114:   begin
                    115:     while not Is_Null(tmp) loop
                    116:       declare
                    117:         mic : Mixed_Cell := Head_Of(tmp);
                    118:         lpt : constant Vector := Search_and_Lift(mic,k,pt);
                    119:       begin
                    120:         if lpt'length = pt'length+1
                    121:          then return lpt;
                    122:          else tmp := Tail_Of(tmp);
                    123:         end if;
                    124:       end;
                    125:     end loop;
                    126:     res(pt'range) := pt;
                    127:     res(res'last) := 1.0;
                    128:     res(res'last) := Conservative_Lifting(mixsub,k,res);
                    129:     return res;
                    130:   end Induced_Lifting;
                    131:
                    132:   function Induced_Lifting
                    133:                ( n : natural; mix : Standard_Integer_Vectors.Vector;
                    134:                  points : Array_of_Lists; mixsub : Mixed_Subdivision )
                    135:                return Array_of_Lists is
                    136:
                    137:     res,res_last : Array_of_Lists(mix'range);
                    138:     cnt : natural := 1;
                    139:     tmp : List;
                    140:
                    141:   begin
                    142:     for k in mix'range loop
                    143:       res_last(k) := res(k);
                    144:       tmp := points(cnt);
                    145:       while not Is_Null(tmp) loop
                    146:         declare
                    147:           pt : Link_to_Vector := Head_Of(tmp);
                    148:           lpt : constant Vector := Induced_Lifting(mixsub,k,pt.all);
                    149:         begin
                    150:           Append(res(k),res_last(k),lpt);
                    151:         end;
                    152:         tmp := Tail_Of(tmp);
                    153:       end loop;
                    154:       cnt := cnt + mix(k);
                    155:     end loop;
                    156:     return res;
                    157:   end Induced_Lifting;
                    158:
                    159:   function Conservative_Lifting
                    160:                ( mic : Mixed_Cell; k : natural; point : Vector )
                    161:                return double_float is
                    162:
                    163:     sp : double_float := mic.nor*Head_Of(mic.pts(k));
                    164:     spp : double_float:= mic.nor.all*point;
                    165:     res : double_float;
                    166:
                    167:   begin
                    168:     if sp < spp
                    169:      then return point(point'last);
                    170:      else if mic.nor(mic.nor'last) = 0.0
                    171:            then res := point(point'last);
                    172:            else spp := spp - point(point'last)*mic.nor(mic.nor'last);
                    173:                 res := (sp - spp)/mic.nor(mic.nor'last) + 1.0;
                    174:           end if;
                    175:           return res;
                    176:     end if;
                    177:   end Conservative_Lifting;
                    178:
                    179:   function Conservative_Lifting ( mixsub : Mixed_Subdivision; k : natural;
                    180:                                   point : Vector ) return double_float is
                    181:
                    182:     tmp : Mixed_Subdivision := mixsub;
                    183:     pt : Vector(point'range) := point;
                    184:     res : double_float;
                    185:
                    186:   begin
                    187:     while not Is_Null(tmp) loop
                    188:       pt(pt'last) := Conservative_Lifting(Head_Of(tmp),k,pt);
                    189:       tmp := Tail_Of(tmp);
                    190:     end loop;
                    191:     res := pt(pt'last);
                    192:     Clear(pt);
                    193:     return res;
                    194:   end Conservative_Lifting;
                    195:
                    196: end Floating_Lifting_Utilities;

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