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

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

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Communications_with_User;           use Communications_with_User;
                      3: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      4: with Numbers_io;                         use Numbers_io;
                      5: with Standard_Random_Numbers;            use Standard_Random_Numbers;
                      6: with Standard_Integer_Vectors;
                      7: with Standard_Integer_Vectors_io;        use Standard_Integer_Vectors_io;
                      8: with Standard_Floating_Vectors;
                      9: with Standard_Floating_Vectors_io;       use Standard_Floating_Vectors_io;
                     10: with Standard_Complex_Poly_Systems_io;   use Standard_Complex_Poly_Systems_io;
                     11: with Arrays_of_Integer_Vector_Lists_io;  use Arrays_of_Integer_Vector_Lists_io;
                     12: with Integer_Lifting_Functions;          use Integer_Lifting_Functions;
                     13: with Integer_Lifting_Utilities;          use Integer_Lifting_Utilities;
                     14: with Floating_Lifting_Functions;         use Floating_Lifting_Functions;
                     15: with Floating_Lifting_Utilities;         use Floating_Lifting_Utilities;
                     16: with Floating_Integer_Convertors;        use Floating_Integer_Convertors;
                     17: with Floating_Mixed_Subdivisions_io;
                     18:
                     19: package body Drivers_for_Lifting_Functions is
                     20:
                     21: -- AUXILIARIES :
                     22:
                     23:   procedure put ( file : in file_type;
                     24:                   v : in Standard_Floating_Vectors.Vector;
                     25:                   fore,aft,exp : in natural ) is
                     26:   begin
                     27:     for i in v'range loop
                     28:       put(file,v(i),fore,aft,exp);
                     29:     end loop;
                     30:   end put;
                     31:
                     32:   procedure put ( v : in Standard_Floating_Vectors.Vector;
                     33:                   fore,aft,exp : in natural ) is
                     34:   begin
                     35:     put(Standard_Output,v,fore,aft,exp);
                     36:   end put;
                     37:
                     38:   procedure Read_Integer_Vector
                     39:               ( v : in out Standard_Integer_Vectors.Vector ) is
                     40:   begin
                     41:     for i in v'range loop
                     42:       put("Give integer for component "); put(i,1); put(" : ");
                     43:       Read_Integer(v(i));
                     44:     end loop;
                     45:   end Read_Integer_Vector;
                     46:
                     47:   procedure Read_Float_Vector
                     48:               ( v : in out Standard_Floating_Vectors.Vector ) is
                     49:   begin
                     50:     for i in v'range loop
                     51:       put("Give float for component "); put(i,1); put(" : ");
                     52:       Read_Double_Float(v(i));
                     53:     end loop;
                     54:   end Read_Float_Vector;
                     55:
                     56:   procedure Set_Integer_Bounds
                     57:               ( file : in file_type;
                     58:                 low,upp : in out Standard_Integer_Vectors.Vector ) is
                     59:
                     60:   -- DESCRIPTION :
                     61:   --   Shows the default values for lower and upper bounds and allows
                     62:   --   the user to modify these.
                     63:
                     64:     ans : character;
                     65:     m : constant natural := low'length;
                     66:
                     67:   begin
                     68:     loop
                     69:       new_line;
                     70:       put_line("Current lower and upper bounds on lifting values");
                     71:       put("  lower : "); put(low); new_line;
                     72:       put("  upper : "); put(upp); new_line;
                     73:       put("Do you want to change these values ? (y/n) ");
                     74:       Ask_Yes_or_No(ans);
                     75:       exit when ans /= 'y';
                     76:       put("Reading "); put(m,1); put(" lower bounds ");
                     77:       put_line("for the lifting."); Read_Integer_Vector(low);
                     78:       put("Reading "); put(m,1); put(" upper bounds ");
                     79:       put_line("for the lifting."); Read_Integer_Vector(upp);
                     80:     end loop;
                     81:     put(file,"  Lower bounds : "); put(file,low); new_line(file);
                     82:     put(file,"  Upper bounds : "); put(file,upp); new_line(file);
                     83:   end Set_Integer_Bounds;
                     84:
                     85:   procedure Set_Float_Bounds
                     86:               ( file : in file_type;
                     87:                 low,upp : in out Standard_Floating_Vectors.Vector ) is
                     88:
                     89:   -- DESCRIPTION :
                     90:   --   Shows the default values for lower and upper bounds and allows
                     91:   --   the user to modify these.
                     92:
                     93:     ans : character;
                     94:     m : constant natural := low'length;
                     95:
                     96:   begin
                     97:     loop
                     98:       new_line;
                     99:       put_line("Current lower and upper bounds on lifting values");
                    100:       put("  lower : "); put(low,2,3,3); new_line;
                    101:       put("  upper : "); put(upp,2,3,3); new_line;
                    102:       put("Do you want to change these values ? (y/n) ");
                    103:       Ask_Yes_or_No(ans);
                    104:       exit when ans /= 'y';
                    105:       put("Reading "); put(m,1); put(" lower bounds ");
                    106:       put_line("for the lifting."); Read_Float_Vector(low);
                    107:       put("Reading "); put(m,1); put(" upper bounds ");
                    108:       put_line("for the lifting."); Read_Float_Vector(upp);
                    109:     end loop;
                    110:     put(file,"  Lower bounds : "); put(file,low,2,3,3); new_line(file);
                    111:     put(file,"  Upper bounds : "); put(file,upp,2,3,3); new_line(file);
                    112:   end Set_Float_Bounds;
                    113:
                    114:   function Read_Integer_Lifting
                    115:               ( l : Lists_of_Integer_Vectors.List )
                    116:               return Lists_of_Integer_Vectors.List is
                    117:
                    118:     use Lists_of_Integer_Vectors;
                    119:     use Standard_Integer_Vectors;
                    120:
                    121:     tmp : List := l;
                    122:     res,res_last : List;
                    123:
                    124:   begin
                    125:     put_line("Give a lifting value for the following points :");
                    126:     while not Is_Null(tmp) loop
                    127:       declare
                    128:         v : constant Vector := Head_Of(tmp).all;
                    129:         lv : Vector(v'first..v'last+1);
                    130:       begin
                    131:         lv(v'range) := v;
                    132:         put(v); put(" : "); Read_Integer(lv(lv'last));
                    133:         Append(res,res_last,lv);
                    134:       end;
                    135:       tmp := Tail_Of(tmp);
                    136:     end loop;
                    137:     return res;
                    138:   end Read_Integer_Lifting;
                    139:
                    140:   function Read_Float_Lifting
                    141:               ( l : Lists_of_Floating_Vectors.List )
                    142:               return Lists_of_Floating_Vectors.List is
                    143:
                    144:     use Lists_of_Floating_Vectors;
                    145:     use Standard_Floating_Vectors;
                    146:
                    147:     tmp : List := l;
                    148:     res,res_last : List;
                    149:
                    150:   begin
                    151:     put_line("Give a lifting value for the following points :");
                    152:     while not Is_Null(tmp) loop
                    153:       declare
                    154:         v : constant Vector := Head_Of(tmp).all;
                    155:         lv : Vector(v'first..v'last+1);
                    156:       begin
                    157:         lv(v'range) := v;
                    158:         put(v,0,0,0); put(" : "); Read_Double_Float(lv(lv'last));
                    159:         Append(res,res_last,lv);
                    160:       end;
                    161:       tmp := Tail_Of(tmp);
                    162:     end loop;
                    163:     return res;
                    164:   end Read_Float_Lifting;
                    165:
                    166:   procedure Integer_Random_Linear_Lifting
                    167:              ( file : in file_type; n : in natural;
                    168:                points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    169:                lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    170:                lilifu : in out Standard_Integer_VecVecs.Link_to_VecVec ) is
                    171:
                    172:     low : Standard_Integer_Vectors.Vector(points'range) := (points'range => 0);
                    173:     upp : Standard_Integer_Vectors.Vector(points'range)
                    174:         := Adaptive_Lifting(points);
                    175:     ranvec : Standard_Integer_Vectors.Vector(1..n);
                    176:
                    177:   begin
                    178:     Set_Integer_Bounds(file,low,upp);
                    179:     lilifu := new Standard_Integer_VecVecs.VecVec(points'range);
                    180:     for i in lilifu'range loop
                    181:       for j in ranvec'range loop
                    182:         ranvec(j) := Random(low(i),upp(i));
                    183:       end loop;
                    184:       lilifu(i) := new Standard_Integer_Vectors.Vector'(ranvec);
                    185:     end loop;
                    186:     lifted := Linear_Lift(lilifu.all,points);
                    187:   end Integer_Random_Linear_Lifting;
                    188:
                    189:   procedure Float_Random_Linear_Lifting
                    190:              ( file : in file_type; n : in natural;
                    191:                points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    192:                lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    193:                lilifu : in out Standard_Floating_VecVecs.Link_to_VecVec ) is
                    194:
                    195:     m : constant natural := points'last;
                    196:     low : Standard_Floating_Vectors.Vector(points'range)
                    197:         := (points'range => 0.0);
                    198:     upp : Standard_Floating_Vectors.Vector(points'range)
                    199:         := Adaptive_Lifting(points);
                    200:     ranvec : Standard_Floating_Vectors.Vector(1..n);
                    201:
                    202:   begin
                    203:     Set_Float_Bounds(file,low,upp);
                    204:     lilifu := new Standard_Floating_VecVecs.VecVec(points'range);
                    205:     for i in lilifu'range loop
                    206:       ranvec := Random(m,low(i),upp(i));
                    207:       lifted(i) := Linear_Lift(points(i),ranvec);
                    208:       lilifu(i) := new Standard_Floating_Vectors.Vector'(ranvec);
                    209:     end loop;
                    210:   end Float_Random_Linear_Lifting;
                    211:
                    212:   procedure Integer_User_Linear_Lifting
                    213:              ( file : in file_type; n : in natural;
                    214:                points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    215:                lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    216:                lilifu : in out Standard_Integer_VecVecs.Link_to_VecVec ) is
                    217:
                    218:     lift : Standard_Integer_VecVecs.VecVec(points'range);
                    219:
                    220:   begin
                    221:     for k in lift'range loop
                    222:       put("Give "); put(n,1); put(" integers for ");
                    223:       put("vector "); put(k,1); put(" : "); get(n,lift(k));
                    224:       put(file," vector "); put(file,k,1);
                    225:       put(file," : "); put(file,lift(k)); new_line(file);
                    226:     end loop;
                    227:     lifted := Linear_Lift(lift,points);
                    228:     lilifu := new Standard_Integer_VecVecs.VecVec'(lift);
                    229:   end Integer_User_Linear_Lifting;
                    230:
                    231:   procedure Float_User_Linear_Lifting
                    232:              ( file : in file_type; n : in natural;
                    233:                points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    234:                lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    235:                lilifu : in out Standard_Floating_VecVecs.Link_to_VecVec ) is
                    236:
                    237:     lift : Standard_Floating_VecVecs.VecVec(points'range);
                    238:
                    239:   begin
                    240:     for k in lift'range loop
                    241:       put("Give "); put(n,1); put(" floats for ");
                    242:       put("vector "); put(k,1); put(" : "); get(n,lift(k));
                    243:       put(file," vector "); put(file,k,1);
                    244:       put(file," : "); put(file,lift(k)); new_line(file);
                    245:       lifted(k) := Linear_Lift(points(k),lift(k).all);
                    246:     end loop;
                    247:     lilifu := new Standard_Floating_VecVecs.VecVec'(lift);
                    248:   end Float_User_Linear_Lifting;
                    249:
                    250:   procedure Integer_Polynomial_Lifting
                    251:             ( file : in file_type;
                    252:               points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    253:               lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists ) is
                    254:
                    255:     lift : Link_to_Poly_Sys;
                    256:
                    257:   begin
                    258:     get(lift);
                    259:     put(file,lift.all);
                    260:     lifted := Polynomial_Lift(lift.all,points);
                    261:   end Integer_Polynomial_Lifting;
                    262:
                    263:   procedure Float_Polynomial_Lifting
                    264:           ( file : in file_type;
                    265:             points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    266:             lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists ) is
                    267:
                    268:     lift : Link_to_Poly_Sys;
                    269:
                    270:   begin
                    271:     get(lift);
                    272:     put(file,lift.all);
                    273:     lifted := Polynomial_Lift(lift.all,points);
                    274:   end Float_Polynomial_Lifting;
                    275:
                    276:   procedure Integer_User_Point_Wise_Lifting
                    277:             ( file : in file_type;
                    278:               points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    279:               lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists ) is
                    280:   begin
                    281:     for k in points'range loop
                    282:       lifted(k) := Read_Integer_Lifting(points(k));
                    283:     end loop;
                    284:   end Integer_User_Point_Wise_Lifting;
                    285:
                    286:   procedure Float_User_Point_Wise_Lifting
                    287:           ( file : in file_type;
                    288:             points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    289:             lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists ) is
                    290:   begin
                    291:     for k in points'range loop
                    292:       lifted(k) := Read_Float_Lifting(points(k));
                    293:     end loop;
                    294:   end Float_User_Point_Wise_Lifting;
                    295:
                    296:   procedure Integer_Random_Point_Wise_Lifting
                    297:             ( file : in file_type;
                    298:               points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    299:               lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists ) is
                    300:
                    301:     low : Standard_Integer_Vectors.Vector(points'range) := (points'range => 0);
                    302:     upp : Standard_Integer_Vectors.Vector(points'range)
                    303:         := Adaptive_Lifting(points);
                    304:
                    305:   begin
                    306:     Set_Integer_Bounds(file,low,upp);
                    307:     lifted := Random_Lift(low,upp,points);
                    308:   end Integer_Random_Point_Wise_Lifting;
                    309:
                    310:  procedure Float_Random_Point_Wise_Lifting
                    311:           ( file : in file_type;
                    312:             points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    313:             lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists ) is
                    314:
                    315:     low : Standard_Floating_Vectors.Vector(points'range)
                    316:         := (points'range => 0.0);
                    317:     upp : Standard_Floating_Vectors.Vector(points'range)
                    318:         := Adaptive_Lifting(points);
                    319:
                    320:   begin
                    321:     Set_Float_Bounds(file,low,upp);
                    322:     lifted := Random_Lift(points,low,upp);
                    323:   end Float_Random_Point_Wise_Lifting;
                    324:
                    325:   function Menu_for_Lifting_Functions return character is
                    326:
                    327:   -- DESCRIPTION :
                    328:   --   Displays the menu and returns the selected lifting function.
                    329:
                    330:     ans : character;
                    331:
                    332:   begin
                    333:     put_line("MENU for Lifting Functions :");
                    334:     put_line("  Linear     : 1. Random linear vectors will be chosen.");
                    335:     put_line("             : 2. You can choose the vectors yourself.");
                    336:     put_line("  Polynomial : 3. The system to be solved will be used.");
                    337:     put_line("             : 4. You can choose the polynomials yourself.");
                    338:     put_line("  Point-wise : 5. For each point a random lifting value.");
                    339:     put_line("             : 6. You can choose all lifting values yourself.");
                    340:     put("Type a number between 1 and 6 to select lifting : ");
                    341:     Ask_Alternative(ans,"123456"); return ans;
                    342:   end Menu_for_Lifting_Functions;
                    343:
                    344:   procedure Dispatch_Integer_Lifting
                    345:               ( file : in file_type; p : in Poly_Sys; choice : in character;
                    346:                 points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    347:                 lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    348:                 lilifu : in out Standard_Integer_VecVecs.Link_to_VecVec ) is
                    349:
                    350:   -- DESCRIPTION :
                    351:   --   Calls the appropriate lifting function to perform the lifting.
                    352:
                    353:     n : constant natural := p'length;
                    354:
                    355:   begin
                    356:     new_line(file); put(file,"INTEGER LIFTING FUNCTION : ");
                    357:     case choice is
                    358:       when '1' => put_line(file,"random linear.");
                    359:                   Integer_Random_Linear_Lifting(file,n,points,lifted,lilifu);
                    360:       when '2' => put_line(file,"linear provided by user.");
                    361:                   Integer_User_Linear_Lifting(file,n,points,lifted,lilifu);
                    362:       when '3' => put_line(file,"polynomial system.");
                    363:                   lifted := Polynomial_Lift(p,points);
                    364:       when '4' => put_line(file,"polynomials provided by user.");
                    365:                   Integer_Polynomial_Lifting(file,points,lifted);
                    366:       when '5' => put_line(file,"random point-wise.");
                    367:                   Integer_Random_Point_Wise_Lifting(file,points,lifted);
                    368:       when '6' => put_line(file,"point-wise provided by user.");
                    369:                   Integer_User_Point_Wise_Lifting(file,points,lifted);
                    370:       when others => null;
                    371:     end case;
                    372:     new_line(file); put_line(file,"THE LIFTED SUPPORTS :"); new_line(file);
                    373:     put(file,lifted);
                    374:   end Dispatch_Integer_Lifting;
                    375:
                    376:   procedure Dispatch_Float_Lifting
                    377:               ( file : in file_type; p : in Poly_Sys; choice : in character;
                    378:                 points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    379:                 lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    380:                 lilifu : in out Standard_Floating_VecVecs.Link_to_VecVec ) is
                    381:
                    382:   -- DESCRIPTION :
                    383:   --   Calls the appropriate lifting function to perform the lifting.
                    384:
                    385:     n : constant natural := p'length;
                    386:
                    387:   begin
                    388:     new_line(file); put(file,"FLOATING-POINT LIFTING FUNCTION : ");
                    389:     case choice is
                    390:       when '1' => put_line(file,"random linear.");
                    391:                   Float_Random_Linear_Lifting(file,n,points,lifted,lilifu);
                    392:       when '2' => put_line(file,"linear provided by user.");
                    393:                   Float_User_Linear_Lifting(file,n,points,lifted,lilifu);
                    394:       when '3' => put_line(file,"polynomial system.");
                    395:                   lifted := Polynomial_Lift(p,points);
                    396:       when '4' => put_line(file,"polynomials provided by user.");
                    397:                   Float_Polynomial_Lifting(file,points,lifted);
                    398:       when '5' => put_line(file,"random point-wise.");
                    399:                   Float_Random_Point_Wise_Lifting(file,points,lifted);
                    400:       when '6' => put_line(file,"point-wise provided by user.");
                    401:                   Float_User_Point_Wise_Lifting(file,points,lifted);
                    402:       when others => null;
                    403:     end case;
                    404:     new_line(file); put_line(file,"THE LIFTED SUPPORTS :"); new_line(file);
                    405:     Floating_Mixed_Subdivisions_io.put(file,lifted);
                    406:   end Dispatch_Float_Lifting;
                    407:
                    408: -- TARGET ROUTINES :
                    409:
                    410:   procedure Driver_for_Lifting_Functions
                    411:             ( file : in file_type; p : in Poly_Sys;
                    412:               points : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    413:               lifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    414:               lilifu : in out Standard_Integer_VecVecs.Link_to_VecVec ) is
                    415:
                    416:     liftfun : character := Menu_for_Lifting_Functions;
                    417:
                    418:   begin
                    419:     Dispatch_Integer_Lifting(file,p,liftfun,points,lifted,lilifu);
                    420:   end Driver_for_Lifting_Functions;
                    421:
                    422:   procedure Driver_for_Lifting_Functions
                    423:             ( file : in file_type; p : in Poly_Sys;
                    424:               points : in Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    425:               lifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    426:               lilifu : in out Standard_Floating_VecVecs.Link_to_VecVec ) is
                    427:
                    428:     liftfun : character := Menu_for_Lifting_Functions;
                    429:
                    430:   begin
                    431:     Dispatch_Float_Lifting(file,p,liftfun,points,lifted,lilifu);
                    432:   end Driver_for_Lifting_Functions;
                    433:
                    434:   procedure Driver_for_Lifting_Functions
                    435:               ( file : in file_type; p : in Poly_Sys;
                    436:                 ipoints : in Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    437:                 fltlif : out boolean;
                    438:                 fpoints : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    439:                 ilifted : in out Arrays_of_Integer_Vector_Lists.Array_of_Lists;
                    440:                 flifted : in out Arrays_of_Floating_Vector_Lists.Array_of_Lists;
                    441:                 ililifu : in out Standard_Integer_VecVecs.Link_to_VecVec;
                    442:                 flilifu : in out Standard_Floating_VecVecs.Link_to_VecVec ) is
                    443:
                    444:     liftfun : character := Menu_for_Lifting_Functions;
                    445:     ans : character;
                    446:
                    447:   begin
                    448:     put("Type i for integer or f for floating-point lifting : ");
                    449:     Ask_Alternative(ans,"if"); fltlif := (ans = 'f');
                    450:     if ans = 'i'
                    451:      then Dispatch_Integer_Lifting(file,p,liftfun,ipoints,ilifted,ililifu);
                    452:      else fpoints := Convert(ipoints);
                    453:           Dispatch_Float_Lifting(file,p,liftfun,fpoints,flifted,flilifu);
                    454:     end if;
                    455:   end Driver_for_Lifting_Functions;
                    456:
                    457: end Drivers_for_Lifting_Functions;

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