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

Annotation of OpenXM_contrib/PHC/Ada/Schubert/bracket_polynomials.adb, Revision 1.1.1.1

1.1       maekawa     1: package body Bracket_Polynomials is
                      2:
                      3: -- CONSTRUCTORS :
                      4:
                      5:   function Create ( m : Bracket_Monomial ) return Bracket_Polynomial is
                      6:
                      7:     t : Bracket_Term;
                      8:
                      9:   begin
                     10:     t.coeff := Create(1.0);
                     11:     t.monom := m;
                     12:     return Create(t);
                     13:   end Create;
                     14:
                     15:   function Create ( t : Bracket_Term ) return Bracket_Polynomial is
                     16:
                     17:     p : Bracket_Polynomial;
                     18:
                     19:   begin
                     20:     Construct(t,p);
                     21:     return p;
                     22:   end Create;
                     23:
                     24:   procedure Copy ( t1 : in Bracket_Term; t2 : in out Bracket_Term ) is
                     25:   begin
                     26:     t2.coeff := t1.coeff;
                     27:     Copy(t1.monom,t2.monom);
                     28:   end Copy;
                     29:
                     30:   procedure Copy ( p : in Bracket_Polynomial; q : in out Bracket_Polynomial ) is
                     31:
                     32:     tmp : Bracket_Polynomial := p;
                     33:
                     34:   begin
                     35:     Clear(q);
                     36:     while not Is_Null(tmp) loop
                     37:       Add(q,Head_Of(tmp));
                     38:     end loop;
                     39:   end Copy;
                     40:
                     41: -- COMPARISON OPERATIONS :
                     42:
                     43:   function Is_Equal ( t1,t2 : Bracket_Term ) return boolean is
                     44:   begin
                     45:     return (t1.coeff = t2.coeff and then Is_Equal(t1.monom,t2.monom));
                     46:   end Is_Equal;
                     47:
                     48:   function Is_Equal ( p,q : Bracket_Polynomial ) return boolean is
                     49:
                     50:     tmp1 : Bracket_Polynomial := p;
                     51:     tmp2 : Bracket_Polynomial := q;
                     52:
                     53:   begin
                     54:     while not Is_Null(tmp1) and not Is_Null(tmp2) loop
                     55:       if not Is_Equal(Head_Of(tmp1),Head_Of(tmp2))
                     56:        then return false;
                     57:        else tmp1 := Tail_Of(tmp1); tmp2 := Tail_Of(tmp2);
                     58:       end if;
                     59:     end loop;
                     60:     if Is_Null(tmp1) and Is_Null(tmp2)
                     61:      then return true;
                     62:      else return false;
                     63:     end if;
                     64:   end Is_Equal;
                     65:
                     66:   function "<" ( t1,t2 : Bracket_Term ) return boolean is
                     67:   begin
                     68:     return t1.monom < t2.monom;
                     69:   end "<";
                     70:
                     71:   function ">" ( t1,t2 : Bracket_Term ) return boolean is
                     72:   begin
                     73:     return t1.monom > t2.monom;
                     74:   end ">";
                     75:
                     76: -- ARITHMETIC OPERATIONS :
                     77:
                     78:   function "+" ( t : Bracket_Term; p : Bracket_Polynomial )
                     79:                return Bracket_Polynomial is
                     80:
                     81:     res : Bracket_Polynomial;
                     82:
                     83:   begin
                     84:     Copy(p,res);
                     85:     Add(res,t);
                     86:     return res;
                     87:   end "+";
                     88:
                     89:   function "+" ( p : Bracket_Polynomial; t : Bracket_Term )
                     90:                return Bracket_Polynomial is
                     91:
                     92:     res : Bracket_Polynomial;
                     93:
                     94:   begin
                     95:     Copy(p,res);
                     96:     Add(res,t);
                     97:     return res;
                     98:   end "+";
                     99:
                    100:   procedure Add ( p : in out Bracket_Polynomial; t : in Bracket_Term ) is
                    101:
                    102:     tt : Bracket_Term;
                    103:
                    104:   begin
                    105:     Copy(t,tt);
                    106:     if Is_Null(p)
                    107:      then p := Create(tt);
                    108:      else declare
                    109:             first,second : Bracket_Polynomial;
                    110:             t1,t2 : Bracket_Term;
                    111:           begin
                    112:             first := p; second := Tail_Of(p);
                    113:             t1 := Head_Of(first);
                    114:             if t > t1
                    115:              then Construct(tt,p);
                    116:              elsif Is_Equal(t.monom,t1.monom)
                    117:                  then t1.coeff := t1.coeff + t.coeff;
                    118:                       if t1.coeff = Create(0.0)
                    119:                        then Clear(t1);
                    120:                             p := Tail_Of(p);
                    121:                        else Set_Head(p,t1);
                    122:                       end if;
                    123:                  else while not Is_Null(second) loop     -- merge term in list
                    124:                         t1 := Head_Of(second);
                    125:                         if t > t1
                    126:                          then Construct(tt,second);
                    127:                               Swap_Tail(first,second);
                    128:                               exit;
                    129:                          elsif Is_Equal(t.monom,t1.monom)
                    130:                              then t1.coeff := t1.coeff + t.coeff;
                    131:                                   if t1.coeff = Create(0.0)
                    132:                                    then Clear(t1);
                    133:                                         Swap_Tail(first,second);
                    134:                                    else Set_Head(second,t1);
                    135:                                   end if;
                    136:                                   exit;
                    137:                         end if;
                    138:                         first := Tail_Of(first);
                    139:                         second := Tail_Of(second);
                    140:                       end loop;
                    141:                       if Is_Null(second)          -- then first points to last
                    142:                        then Append(p,first,tt);     --   element of the list p
                    143:                       end if;
                    144:             end if;
                    145:           end;
                    146:     end if;
                    147:   end Add;
                    148:
                    149:   procedure Frontal_Add ( p : in out Bracket_Polynomial;
                    150:                                                  t : in Bracket_Term ) is
                    151:
                    152:     tt : Bracket_Term;
                    153:
                    154:   begin
                    155:     Copy(t,tt);
                    156:     Construct(tt,p);
                    157:   end Frontal_Add;
                    158:
                    159:   procedure Frontal_Min ( p : in out Bracket_Polynomial;
                    160:                                                  t : in Bracket_Term ) is
                    161:
                    162:     mt : Bracket_Term := -t;
                    163:
                    164:   begin
                    165:     Construct(mt,p);
                    166:   end Frontal_Min;
                    167:
                    168:   function "+" ( p,q : Bracket_Polynomial ) return Bracket_Polynomial is
                    169:
                    170:     res : Bracket_Polynomial;
                    171:
                    172:   begin
                    173:     Copy(p,res);
                    174:     Add(res,q);
                    175:     return res;
                    176:   end "+";
                    177:
                    178:   procedure Add ( p : in out Bracket_Polynomial; q : in Bracket_Polynomial ) is
                    179:
                    180:     tmp : Bracket_Polynomial := q;
                    181:
                    182:   begin
                    183:     while not Is_Null(tmp) loop
                    184:       Add(p,Head_Of(tmp));
                    185:       tmp := Tail_Of(tmp);
                    186:     end loop;
                    187:   end Add;
                    188:
                    189:   function "-" ( t : Bracket_Term ) return Bracket_Term is
                    190:
                    191:     res : Bracket_Term;
                    192:
                    193:   begin
                    194:     Copy(t.monom,res.monom);
                    195:     res.coeff := -t.coeff;
                    196:     return res;
                    197:   end "-";
                    198:
                    199:   procedure Min ( t : in out Bracket_Term ) is
                    200:   begin
                    201:     t.coeff := -t.coeff;
                    202:   end Min;
                    203:
                    204:   function "-" ( p : Bracket_Polynomial ) return Bracket_Polynomial is
                    205:
                    206:     res : Bracket_Polynomial;
                    207:
                    208:   begin
                    209:     Copy(p,res);
                    210:     Min(res);
                    211:     return res;
                    212:   end "-";
                    213:
                    214:   procedure Min ( p : in out Bracket_Polynomial ) is
                    215:
                    216:     tmp : Bracket_Polynomial := p;
                    217:
                    218:   begin
                    219:     while not Is_Null(tmp) loop
                    220:       declare
                    221:         bt : Bracket_Term := Head_Of(tmp);
                    222:       begin
                    223:         Min(bt);
                    224:         Set_Head(tmp,bt);
                    225:       end;
                    226:       tmp := Tail_Of(tmp);
                    227:     end loop;
                    228:   end Min;
                    229:
                    230:   function "-" ( t : Bracket_Term; p : Bracket_Polynomial )
                    231:                return Bracket_Polynomial is
                    232:
                    233:     mp : Bracket_Polynomial := -p;
                    234:     res : Bracket_Polynomial := t+mp;
                    235:
                    236:   begin
                    237:     Clear(mp);
                    238:     return res;
                    239:   end "-";
                    240:
                    241:   function "-" ( p : Bracket_Polynomial; t : Bracket_Term )
                    242:                return Bracket_Polynomial is
                    243:
                    244:     mt : Bracket_Term := -t;
                    245:     res : Bracket_Polynomial := p+mt;
                    246:
                    247:   begin
                    248:     Clear(mt);
                    249:     return res;
                    250:   end "-";
                    251:
                    252:   procedure Min ( p : in out Bracket_Polynomial; t : in Bracket_Term ) is
                    253:
                    254:     mt : Bracket_Term := -t;
                    255:
                    256:   begin
                    257:     Add(p,mt);
                    258:   end Min;
                    259:
                    260:   function "-" ( p,q : Bracket_Polynomial ) return Bracket_Polynomial is
                    261:
                    262:     mq : Bracket_Polynomial := -q;
                    263:     res : Bracket_Polynomial := p+mq;
                    264:
                    265:   begin
                    266:     Clear(mq);
                    267:     return res;
                    268:   end "-";
                    269:
                    270:   procedure Min ( p : in out Bracket_Polynomial; q : in Bracket_Polynomial ) is
                    271:
                    272:     mq : Bracket_Polynomial := -q;
                    273:
                    274:   begin
                    275:     Add(p,mq);
                    276:   end Min;
                    277:
                    278: -- ITERATORS OVER MONOMIALS :
                    279:
                    280:   function Number_of_Monomials ( p : Bracket_Polynomial ) return natural is
                    281:   begin
                    282:     return Length_Of(p);
                    283:   end Number_of_Monomials;
                    284:
                    285:   procedure Enumerate_Terms ( p : in Bracket_Polynomial ) is
                    286:
                    287:     tmp : Bracket_Polynomial := p;
                    288:     continue : boolean := true;
                    289:
                    290:   begin
                    291:     while not Is_Null(tmp) loop
                    292:       Process(Head_Of(tmp),continue);
                    293:       exit when not continue;
                    294:       tmp := Tail_Of(tmp);
                    295:     end loop;
                    296:   end Enumerate_Terms;
                    297:
                    298: -- DESTRUCTOR :
                    299:
                    300:   procedure Clear ( t : in out Bracket_Term ) is
                    301:   begin
                    302:     Clear(t.monom);
                    303:   end Clear;
                    304:
                    305:   procedure Clear ( p : in out Bracket_Polynomial ) is
                    306:
                    307:     tmp : Bracket_Polynomial := p;
                    308:
                    309:   begin
                    310:     while not Is_Null(tmp) loop
                    311:       declare
                    312:         t : Bracket_Term := Head_Of(tmp);
                    313:       begin
                    314:         Clear(t);
                    315:       end;
                    316:       tmp := Tail_Of(tmp);
                    317:     end loop;
                    318:     Lists_of_Bracket_Terms.Clear(Lists_of_Bracket_Terms.List(p));
                    319:   end Clear;
                    320:
                    321: end Bracket_Polynomials;

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