cov_prim.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
class COV_PRIM
class COV_PRIM is
--primitives for covering space and covering linkage.
--prints
--relation in coverings
--relation matrix
-- 1989 Cover K.Kodama
--1998/05
--LongInt version
--
--1996/10
--LINUX version
--
--1992/6/28
--split from cover.mod
---------- print routines -----------
LonPrint(compo:INT, Mer:INT, Lon:WORD) is
s:STR;
s:="meridian: "+WORD::gstr(Mer.int,0.int)+"\n"+" -"+"->";
REP::rcode.stack.Fetch(REP::rcode.merPtr.int+compo);
s:=s+REP::rcode.stack.get_str+"\n";
#LOGOUT+s; s:="longitude: "+Lon.wstr+"\n"+" -"+"->";
REP::rcode.stack.Fetch(REP::rcode.longPtr.int+compo);
s:=s+REP::rcode.stack.get_str+"\n";
#LOGOUT+s;
end;
OrbitPrintLog(compo:INT, NOrbit:CARD) is
oFlg:BOOL;
s:STR;
s:="\n"+"Covering link: "+NOrbit.str+" component";
if NOrbit>1 then s:=s+"s"; end;
loop o::=1.upto!(REP::rcode.stack.st[REP::rcode.orbitpPtr.int+compo][0]);
s:=s+"\n"+"br. index: "+REP::rcode.stack.st[REP::rcode.orbitmPtr.int+compo][o].str
+"/ orbit of peripheral: ";
oFlg:=false;
loop j::=1.upto!(REP::rcode.stack.Jn) ;
if REP::rcode.stack.st[REP::rcode.orbitpPtr.int+compo][j]=o then
if oFlg then s:=s+","; end;
s:=s+j.str;
oFlg:=true;
end;
end;
end;
#LOGOUT+s;
end;
--------------Branch index---------------------
SetLongitude(TCode:TCODE, compo:INT, out Mer:INT, out Lon:WORD) is
-- set mer & Lon[*]
-- set
-- st[longPtr+compo]:longitude.
-- st[merPtr+compo]]:meridian.
-- Lon[*]: word of longitude
stp:INT:=TCode.compoStart(compo); enp:INT:=TCode.endOfString(stp,1.int);
Mer:=TCode[stp].gen;
l:INT:=0;
copt:INT;
Lon:=#;
loop i::=stp.upto!(enp);
if VERTEXC::under.in(TCode[i].sep) then
copt:=TCode[i].companion;
if VERTEXC::positive.in(TCode[i].sep) then
Lon.append(TCode[copt].gen);
if TCode[copt].compo=compo then l:=l+1; end;
else Lon.append(-TCode[copt].gen);
if TCode[copt].compo=compo then l:=l-1; end;
end;
end;
end;
if Lon.size>0 then
s:INT;
if l.is_pos then s:=-TCode[enp].gen; else s:=TCode[enp].gen; end;
loop l.abs.times!; Lon.append(s); end;
else Lon.w:=#(|Mer, -Mer|);
end;
REP::rcode.stack.CMul(Lon.w); REP::rcode.stack.Store(REP::rcode.longPtr+compo.card);
REP::rcode.stack.Fetch(Mer); REP::rcode.stack.Store(REP::rcode.merPtr+compo.card);
end;
SetBranchIndex(compo:INT) is
bi:CARD;
REP::rcode.stack.st[REP::rcode.orbitmPtr+compo.card].to_val(0);
REP::rcode.stack.Fetch(REP::rcode.merPtr+compo.card);
REP::rcode.stack.Store(REP::rcode.Work);
loop i::=1.upto!(REP::rcode.stack.Jn);
p::=i;
loop bi:=1.up!; p:=REP::rcode.stack.st[REP::rcode.Work][p]; until!(i=p); end;
o::=REP::rcode.stack.st[REP::rcode.orbitpPtr+compo.card][i];
REP::rcode.stack.st[REP::rcode.orbitmPtr+compo.card][o]:=bi;
end;
end;
SetWindLong(compo:INT) is
--Set st[windLon+compo] winding of the covering longitude
i,i0,wind:CARD;
loop cvComp::=1.upto!(REP::rcode.stack.st[REP::rcode.orbitpPtr+compo.card][0]);
REP::rcode.stack.st[REP::rcode.Work].to_val(0);
loop
i0:=1.up!;
while!(REP::rcode.stack.st[REP::rcode.orbitpPtr+compo.card][i0]/=cvComp);
end;
i:=i0;
loop REP::rcode.stack.st[REP::rcode.Work][i]:=1;
i:=REP::rcode.stack.st[REP::rcode.longPtr+compo.card][i]; until!(i=i0);
end;
wind:=0;
loop
if REP::rcode.stack.st[REP::rcode.Work][i]=1 then wind:=wind+1; end;
i:=REP::rcode.stack.st[REP::rcode.merPtr+compo.card][i];
until!(i=i0);
end;
REP::rcode.stack.st[REP::rcode.windLon+compo.card][cvComp]:=wind;
#OUT+"wind: "+wind.str+"\n";
end;
end;
SetOrbits(compo:INT, out NOrbit:CARD) is
-- st[orbitpPtr+compo]: orbit table of meridian.
-- NOrbit: number of Orbit=covering link.
-- st[orbitmPtr+compo]: table of Branch index.
-- orbits of meridian & longitude in S(Jn).
REP::rcode.stack.Fetch(REP::rcode.merPtr.int+compo);
REP::rcode.stack.Fetch(REP::rcode.longPtr.int+compo);
REP::rcode.stack.OrbitC(2);
REP::rcode.stack.Store(REP::rcode.orbitpPtr.int+compo);
NOrbit:=REP::rcode.stack.st[REP::rcode.orbitpPtr.int+compo][0];
SetBranchIndex(compo);
end;
rm1(el:INT) is
REP::rcode.stack.Fetch(el); REP::rcode.stack.Mul;
REP::rcode.stack.Store(REP::rcode.Work); REP::rcode.stack.Pu;
end;
Relation(word:WORD, base:INT, rm2:ROUT{INT,INT}) is
-- relation in covering sp.
z:INT:=REP::rcode.Work.int;
REP::rcode.stack.Unit; REP::rcode.stack.Store(z); REP::rcode.stack.Pu;
-- word.printD;
loop el:INT:=word.w.elt!;
if el>0.int then rm2.call(el,REP::rcode.stack.st[z][base].int);
--#OUT+WORD::gstr(el,REP::rcode.stack.st[z][base])+" ";
rm1(el);
else rm1(el); rm2.call(el,REP::rcode.stack.st[z][base].int);
--#OUT+WORD::gstr(el,REP::rcode.stack.st[z][base])+" ";
end;
end;
-- #OUT+"\n";
REP::rcode.stack.Pd;
end;
end;