[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     ! 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>