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

Annotation of OpenXM_contrib/PHC/Ada/Homotopy/standard_complex_solutions.adb, Revision 1.1.1.1

1.1       maekawa     1: with unchecked_deallocation;
                      2: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                      3:
                      4: package body Standard_Complex_Solutions is
                      5:
                      6:   use List_of_Solutions;
                      7:
                      8: -- CREATORS :
                      9:
                     10:   function Create ( sl : Solution_List ) return Solution_Array is
                     11:
                     12:     sa : Solution_Array(1..Length_Of(sl));
                     13:
                     14:   begin
                     15:     if not Is_Null(sl)
                     16:      then declare
                     17:             i : positive := 1;
                     18:             temp : Solution_List := sl;
                     19:           begin
                     20:             while not Is_Null(temp) loop
                     21:               sa(i) := new Solution'(Head_Of(temp).all);
                     22:               i := i + 1;
                     23:               temp := Tail_Of(temp);
                     24:             end loop;
                     25:           end;
                     26:     end if;
                     27:     return sa;
                     28:   end Create;
                     29:
                     30:   function Create ( sa : Solution_Array ) return Solution_List is
                     31:
                     32:     sl : Solution_List;
                     33:
                     34:   begin
                     35:     if sa'first <= sa'last
                     36:      then declare
                     37:             n : natural := sa(sa'first).n;
                     38:             sol : Solution(n) := sa(sa'first).all;
                     39:             l : Link_to_Solution := new Solution'(sol);
                     40:             last,tmp : Solution_List;
                     41:           begin
                     42:             Construct(l,sl);
                     43:             last := sl;
                     44:             for i in (sa'first+1)..sa'last loop
                     45:               sol := sa(i).all;
                     46:               l := new Solution'(sol);
                     47:               Construct(l,tmp);
                     48:               Swap_Tail(last,tmp);
                     49:               last := Tail_Of(last);
                     50:             end loop;
                     51:           end;
                     52:     end if;
                     53:     return sl;
                     54:   end Create;
                     55:
                     56: -- COMPARISON and COPYING :
                     57:
                     58:   function Equal ( s1,s2 : Solution; tol : double_float ) return boolean is
                     59:   begin
                     60:     if (s1.t /= s2.t) or else (s1.n /= s2.n)
                     61:      then return false;
                     62:      else return Equal(s1.v,s2.v,tol);
                     63:     end if;
                     64:   end Equal;
                     65:
                     66:   function Equal ( s1,s2 : Solution_List; tol : double_float )
                     67:                  return boolean is
                     68:   begin
                     69:     if Is_Null(s1) and Is_Null(s2)
                     70:      then return true;
                     71:      elsif Is_Null(s1) or Is_Null(s2)
                     72:          then return false;
                     73:          else declare
                     74:                 temp1 : Solution_List := s1;
                     75:                 temp2 : Solution_List := s2;
                     76:               begin
                     77:                 While not Is_Null(temp1) and not Is_Null(s2) loop
                     78:                   if not Equal(Head_Of(temp1).all,Head_Of(temp2).all,tol)
                     79:                    then return false;
                     80:                    else temp1 := Tail_Of(temp1);
                     81:                         temp2 := Tail_Of(temp2);
                     82:                   end if;
                     83:                 end loop;
                     84:                 if Is_Null(temp1) and Is_Null(temp2)
                     85:                  then return true;
                     86:                  else return false;
                     87:                 end if;
                     88:               end;
                     89:     end if;
                     90:   end Equal;
                     91:
                     92:   function Equal ( s1,s2 : Solution_Array; tol : double_float )
                     93:                  return boolean is
                     94:   begin
                     95:     if s1'first /= s2'first
                     96:      then return false;
                     97:      elsif s1'last /= s2'last
                     98:          then return false;
                     99:          else for i in s1'range loop
                    100:                 if not Equal(s1(i).all,s2(i).all,tol)
                    101:                  then return false;
                    102:                 end if;
                    103:               end loop;
                    104:     end if;
                    105:     return true;
                    106:   end Equal;
                    107:
                    108:   procedure Equals ( sols : in out Solution_List; flag : in natural;
                    109:                      tol : in double_float; same : out boolean ) is
                    110:   begin
                    111:     same := false;
                    112:     if not Is_Null(sols)
                    113:      then declare
                    114:             n : natural := Head_Of(sols).n;
                    115:             i : natural := 1;
                    116:             s1,s2 : Solution(n);
                    117:             temp : Solution_List := sols;
                    118:           begin
                    119:             while not Is_Null(temp) loop
                    120:               s1 := Head_Of(temp).all;
                    121:               for j in (i+1)..Length_Of(sols) loop
                    122:                 s2 := Get(sols,j);
                    123:                 if Equal(s1,s2,tol)
                    124:                  then same := true;
                    125:                       Change_Multiplicity(sols,i,flag);
                    126:                       Change_Multiplicity(sols,j,flag);
                    127:                 end if;
                    128:               end loop;
                    129:               temp := Tail_Of(temp);
                    130:               i := i + 1;
                    131:             end loop;
                    132:           end;
                    133:     end if;
                    134:   end Equals;
                    135:
                    136:   procedure Equals ( sa : in Solution_Array; x : in Vector; i : in natural;
                    137:                      tol : in double_float; j : in out natural ) is
                    138:
                    139:     eq : boolean;
                    140:
                    141:   begin
                    142:     while j < i loop
                    143:       eq := true;
                    144:       for k in x'range loop
                    145:         if AbsVal(sa(j).v(k) - x(k)) > tol
                    146:          then eq := false;
                    147:         end if;
                    148:         exit when not eq;
                    149:       end loop;
                    150:       exit when eq;
                    151:       j := j + 1;
                    152:     end loop;
                    153:   end Equals;
                    154:
                    155:   procedure Copy ( s1 : in Solution_List; s2 : in out Solution_List ) is
                    156:   begin
                    157:     Clear(s2);
                    158:     if not Is_Null(s1)
                    159:      then declare
                    160:             temp : Solution_List := s1;
                    161:             last : Solution_List;
                    162:             n : natural := Head_Of(s1).n;
                    163:             sol : Solution(n) := Head_Of(temp).all;
                    164:           begin
                    165:             declare
                    166:               l : Link_to_Solution := new Solution'(sol);
                    167:             begin
                    168:               Construct(l,s2);
                    169:             end;
                    170:             last := s2;
                    171:             temp := Tail_Of(temp);
                    172:             while not Is_Null(temp) loop
                    173:               sol := Head_Of(temp).all;
                    174:               declare
                    175:                 l : Link_to_Solution := new Solution'(sol);
                    176:                 tmp : Solution_List;
                    177:               begin
                    178:                 Construct(l,tmp);
                    179:                 Swap_Tail(last,tmp);
                    180:               end;
                    181:               last := Tail_Of(last);
                    182:               temp := Tail_Of(temp);
                    183:             end loop;
                    184:           end;
                    185:     end if;
                    186:   end Copy;
                    187:
                    188:   procedure Copy ( s1 : in Solution_Array; s2 : in out Solution_Array ) is
                    189:   begin
                    190:     Clear(s2);
                    191:     for i in s1'range loop
                    192:       s2(i) := new Solution'(s1(i).all);
                    193:     end loop;
                    194:   end Copy;
                    195:
                    196: -- SELECTORS :
                    197:
                    198:   function Number ( sols : Solution_List; flag : natural ) return natural is
                    199:
                    200:     res : natural := 0;
                    201:
                    202:   begin
                    203:     if Is_Null(sols)
                    204:      then return res;
                    205:      else declare
                    206:             temp : Solution_List := sols;
                    207:             ls : Link_to_Solution;
                    208:           begin
                    209:             while not Is_Null(temp) loop
                    210:               if Head_Of(temp).m = flag
                    211:                then res := res + 1;
                    212:               end if;
                    213:               temp := Tail_Of(temp);
                    214:             end loop;
                    215:           end;
                    216:           return res;
                    217:     end if;
                    218:   end Number;
                    219:
                    220:   function Is_In ( sols : Solution_List; s : Solution; tol : double_float )
                    221:                  return boolean is
                    222:
                    223:     tmp : Solution_List := sols;
                    224:
                    225:   begin
                    226:     while not Is_Null(tmp) loop
                    227:       if Equal(Head_Of(tmp).all,s,tol)
                    228:        then return true;
                    229:        else tmp := Tail_Of(tmp);
                    230:       end if;
                    231:     end loop;
                    232:     return false;
                    233:   end Is_In;
                    234:
                    235:   function Is_In ( sa : Solution_Array; s : Solution; tol : double_float )
                    236:                  return boolean is
                    237:   begin
                    238:     for i in sa'range loop
                    239:       if Equal(sa(i).all,s,tol)
                    240:        then return true;
                    241:       end if;
                    242:     end loop;
                    243:     return false;
                    244:   end Is_In;
                    245:
                    246:   function Get ( sols : Solution_List; pos : positive )
                    247:                return Solution is
                    248:   begin
                    249:     if pos <= Length_Of(sols)
                    250:      then declare
                    251:             temp : Solution_List := sols;
                    252:             count : natural := 1;
                    253:           begin
                    254:             while not Is_Null(temp) loop
                    255:               if count = pos
                    256:                then return Head_Of(temp).all;
                    257:                else temp := Tail_Of(temp);
                    258:                     count := count + 1;
                    259:               end if;
                    260:             end loop;
                    261:           end;
                    262:     end if;
                    263:     declare
                    264:       s : Solution(0);
                    265:     begin
                    266:       return s;
                    267:     end;
                    268:   end Get;
                    269:
                    270: -- CONSTRUCTORS :
                    271:
                    272:   procedure Append ( first,last : in out Solution_List; s : in Solution ) is
                    273:
                    274:     ls : Link_to_Solution := new Solution'(s);
                    275:
                    276:   begin
                    277:     if Is_Null(first)
                    278:      then Construct(ls,first);
                    279:           last := first;
                    280:      else declare
                    281:             tmp : Solution_List;
                    282:           begin
                    283:             Construct(ls,tmp);
                    284:             Swap_Tail(last,tmp);
                    285:             last := Tail_Of(last);
                    286:           end;
                    287:     end if;
                    288:   end Append;
                    289:
                    290:   procedure Add ( sols : in out Solution_List; s : in Solution ) is
                    291:
                    292:     last,temp,tmp : Solution_List;
                    293:     ls : Link_to_Solution := new Solution'(s);
                    294:
                    295:   begin
                    296:     if Is_Null(sols)
                    297:      then Construct(ls,sols);
                    298:      else temp := sols;
                    299:           while not Is_Null(temp) loop
                    300:             last := temp;
                    301:             temp := Tail_Of(temp);
                    302:           end loop;
                    303:           Construct(ls,tmp);
                    304:           Swap_Tail(last,tmp);
                    305:     end if;
                    306:   end Add;
                    307:
                    308:   procedure Add ( sols : in out Solution_List; s : in Solution;
                    309:                   tol : in double_float; other : out natural ) is
                    310:
                    311:     last,temp,tmp : Solution_List;
                    312:     ls : Link_to_Solution := new Solution'(s);
                    313:     s2 : Solution(s.n);
                    314:     count : natural := 1;
                    315:
                    316:   begin
                    317:     other := 0;
                    318:     if Is_Null(sols)
                    319:      then Construct(ls,sols);
                    320:      else temp := sols;
                    321:           while not Is_Null(temp) loop
                    322:             s2 := Head_Of(temp).all;
                    323:             if Equal(s,s2,tol)
                    324:              then other := count;
                    325:                   Clear(ls);
                    326:                   return;
                    327:              else last := temp;
                    328:                   temp := Tail_Of(temp);
                    329:                   count := count + 1;
                    330:             end if;
                    331:           end loop;
                    332:           Construct(ls,tmp);
                    333:           Swap_Tail(last,tmp);
                    334:     end if;
                    335:   end Add;
                    336:
                    337: -- MODIFIERS :
                    338:
                    339:   procedure Change ( sols : in out Solution_List; pos : in positive;
                    340:                      s : in Solution; tol : in double_float;
                    341:                      other : out natural ) is
                    342:   begin
                    343:     if pos <= Length_Of(sols)
                    344:      then declare
                    345:             temp : Solution_List := sols;
                    346:             ls : Link_to_Solution;
                    347:           begin
                    348:             other := 0;
                    349:             for i in 1..Length_Of(temp) loop
                    350:               ls := Head_Of(temp);
                    351:               if i = pos
                    352:                then ls.v := s.v;
                    353:                     ls.m := s.m;
                    354:                     ls.t := s.t;
                    355:                     Set_Head(temp,ls);
                    356:                     return;
                    357:                elsif Equal(s,ls.all,tol)
                    358:                    then other := i;
                    359:                         return;
                    360:               end if;
                    361:               temp := Tail_Of(temp);
                    362:             end loop;
                    363:           end;
                    364:     end if;
                    365:   end Change;
                    366:
                    367:   procedure Set_Continuation_Parameter
                    368:                ( sols : in out Solution_List; t : in Complex_Number ) is
                    369:
                    370:     tmp : Solution_List := sols;
                    371:
                    372:   begin
                    373:     while not Is_Null(tmp) loop
                    374:       declare
                    375:         ls : Link_to_Solution := Head_Of(tmp);
                    376:       begin
                    377:         ls.t := t;
                    378:         Set_Head(tmp,ls);
                    379:       end;
                    380:       tmp := Tail_Of(tmp);
                    381:     end loop;
                    382:   end Set_Continuation_Parameter;
                    383:
                    384:   procedure Change_Multiplicity
                    385:                 ( sols : in out Solution_List; pos : in positive;
                    386:                   m : in natural ) is
                    387:   begin
                    388:     if pos <= Length_Of(sols)
                    389:      then declare
                    390:             temp : Solution_List := sols;
                    391:             ls : Link_to_Solution;
                    392:           begin
                    393:             for i in 1..(pos-1) loop
                    394:               temp := Tail_Of(temp);
                    395:             end loop;
                    396:             ls := Head_Of(temp);
                    397:             ls.m := m;
                    398:             Set_Head(temp,ls);
                    399:           end;
                    400:     end if;
                    401:   end Change_Multiplicity;
                    402:
                    403:   procedure Remove ( sols : in out Solution_List; pos : in positive ) is
                    404:
                    405:     first,second,temp : Solution_List;
                    406:     ls : Link_to_Solution;
                    407:
                    408:   begin
                    409:     if pos <= Length_Of(sols)
                    410:      then if pos = 1
                    411:            then if Is_Null(Tail_Of(sols))
                    412:                  then Clear(sols);
                    413:                  else ls := Head_Of(sols);
                    414:                       Clear(ls);
                    415:                       sols := Tail_Of(sols);
                    416:                 end if;
                    417:            else second := sols;
                    418:                 for i in 1..(pos-1) loop
                    419:                   first := second;
                    420:                   second := Tail_Of(first);
                    421:                 end loop;
                    422:                 ls := Head_Of(second);
                    423:                 Clear(ls);
                    424:                 temp := Tail_Of(second);
                    425:                 Swap_Tail(first,temp);
                    426:           end if;
                    427:     end if;
                    428:   end Remove;
                    429:
                    430:   procedure Delete ( sols : in out Solution_List ) is
                    431:
                    432:     continue : boolean;
                    433:
                    434:   begin
                    435:     continue := true;
                    436:     -- looking for the first element in sols that can stay :
                    437:     while not Is_Null(sols) and continue loop
                    438:       declare
                    439:         ls : Link_to_Solution := Head_Of(sols);
                    440:       begin
                    441:         if To_Be_Removed(ls.m)
                    442:          then Clear(ls);
                    443:               sols := Tail_Of(sols);
                    444:         else continue := false;
                    445:         end if;
                    446:       end;
                    447:     end loop;
                    448:     if not Is_Null(sols)
                    449:      then -- first element of sols can stay in the list
                    450:          declare
                    451:            first,second : Solution_List;
                    452:           begin
                    453:            first := sols;
                    454:            second := Tail_Of(first);
                    455:            while not Is_Null(second) loop
                    456:              declare
                    457:                ls : Link_to_Solution := Head_Of(second);
                    458:                temp : Solution_List;
                    459:               begin
                    460:                if To_Be_Removed(ls.m)
                    461:                 then Clear(ls);
                    462:                      temp := Tail_Of(second);
                    463:                      Swap_Tail(first,temp);
                    464:                 end if;
                    465:              end;
                    466:              first := second;
                    467:              second := Tail_Of(first);
                    468:             end loop;
                    469:           end;
                    470:     end if;
                    471:   end Delete;
                    472:
                    473:   procedure Remove_All ( sols : in out Solution_List; flag : in natural ) is
                    474:
                    475:     continue : boolean;
                    476:
                    477:   begin
                    478:     continue := true;
                    479:     -- looking for the first element in sols that can stay :
                    480:     while not Is_Null(sols) and continue loop
                    481:       declare
                    482:         ls : Link_to_Solution := Head_Of(sols);
                    483:       begin
                    484:         if ls.m = flag
                    485:          then Clear(ls);
                    486:               sols := Tail_Of(sols);
                    487:         else continue := false;
                    488:         end if;
                    489:       end;
                    490:     end loop;
                    491:     if not Is_Null(sols)
                    492:      then -- first element of s can stay in the list
                    493:          declare
                    494:            first,second : Solution_List;
                    495:           begin
                    496:            first := sols;
                    497:            second := Tail_Of(first);
                    498:            while not Is_Null(second) loop
                    499:              declare
                    500:                ls : Link_to_Solution := Head_Of(second);
                    501:                temp : Solution_List;
                    502:               begin
                    503:                if ls.m = flag
                    504:                 then Clear(ls);
                    505:                      temp := Tail_Of(second);
                    506:                      Swap_Tail(first,temp);
                    507:                 end if;
                    508:              end;
                    509:              first := second;
                    510:              second := Tail_Of(first);
                    511:             end loop;
                    512:           end;
                    513:     end if;
                    514:   end Remove_All;
                    515:
                    516: -- DESTRUCTORS :
                    517:
                    518:
                    519:   procedure Clear ( ls : in out Link_to_Solution ) is
                    520:
                    521:     procedure free is new unchecked_deallocation(Solution,Link_to_Solution);
                    522:
                    523:   begin
                    524:     free(ls);
                    525:   end Clear;
                    526:
                    527:   procedure Shallow_Clear ( sl : in out Solution_List ) is
                    528:   begin
                    529:     List_of_Solutions.Clear(List_of_Solutions.List(sl));
                    530:   end Shallow_Clear;
                    531:
                    532:   procedure Deep_Clear ( sl : in out Solution_List ) is
                    533:
                    534:     temp : Solution_List := sl;
                    535:     ls : Link_to_Solution;
                    536:
                    537:   begin
                    538:     while not Is_Null(temp) loop
                    539:       ls := Head_Of(temp);
                    540:       Clear(ls);
                    541:       temp := Tail_Of(temp);
                    542:     end loop;
                    543:     Shallow_Clear(sl);
                    544:   end Deep_Clear;
                    545:
                    546:   procedure Clear ( sa : in out Solution_Array ) is
                    547:   begin
                    548:     for i in sa'range loop
                    549:       Clear(sa(i));
                    550:     end loop;
                    551:   end Clear;
                    552:
                    553: end Standard_Complex_Solutions;

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