homology.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
class HOMOLOGY
class HOMOLOGY is
-- 1998/05 LongInt version
-- 1996/10 LINUX version
-- Kouji Kodama 1989/9
-- FTL-Modula2 version
-- knot,theta-curve, 2-knot(oriented,un-oriented)
-- Copyright (C) 1989 1996 Kouji KODAMA
shared RelM:MAT_INTI; -- relation matrix
HRm2(gen,base:INT) is
el5:INT:=(gen.abs-1)*REP::rcode.stack.Jn+base-1;
if (gen.is_pos) then RelM[RelM.nr-1][el5]:=RelM[RelM.nr-1][el5]+1.inti;
else RelM[RelM.nr-1][el5]:=RelM[RelM.nr-1][el5]-1.inti;
end;
end;
init(TCode:TCODE) is
Mer,orb:INT;
Lon:WORD;
NOrbit:CARD;
loop compo::=1.int.upto!(TCode.number_compo);
COV_PRIM::SetLongitude(TCode,compo,out Mer,out Lon);
COV_PRIM::SetOrbits(compo,out NOrbit);
end;
RelM:=#(0,REP::rcode.stack.Jn*TCode.number_gen);
end;
newC is
RelM:=RelM.resize(RelM.nr+1,RelM.nc);
end;
CrossRelation(TCode:TCODE) is
word:WORD;
i1:INT:=0.int;
loop while!(KNOT_GROUP::getCrossR(TCode,inout i1,out word));
loop pt::=1.upto!(REP::rcode.stack.Jn).int;
newC;
COV_PRIM::Relation(word,pt,bind(HRm2(_,_)));
end;
end;
end;
BandR(TCode:TCODE) is
if ~TCode.has_band then return; end;
word:WORD;
bs:INT:=0.int;
loop while!(KNOT_GROUP::getBandR(TCode,inout bs,out word));
loop pt::=1.upto!(REP::rcode.stack.Jn).int;
newC;
COV_PRIM::Relation(word,pt,bind(HRm2(_,_)));
end;
end;
end;
BrRelation_NewOrbit(out orb:INT, mark:ARRAY{BOOL}):BOOL is
loop orb:=1.up!.int; while!((orb<=REP::rcode.stack.Jn.int)and(~mark[orb])); end;
return orb<=REP::rcode.stack.Jn.int;
end;
BrRelation(TCode:TCODE,BrCover:BOOL) is
if ~ BrCover then return; end;
orb:INT;
Ncompo:INT:=TCode.number_compo;
loop compo::=1.int.upto!(Ncompo);
mark:ARRAY{BOOL}:=#(REP::rcode.stack.Jn1); mark.to_val(true);
Mer::=TCode[TCode.compoStart(compo)].gen;
loop while!(BrRelation_NewOrbit(out orb, mark));
newC;
loop while!(mark[orb]); mark[orb]:=false;
HRm2(Mer,orb); orb:=REP::rcode.stack.st[Mer][orb].int;
end;
end;
end;
end;
BaseRelation(TCode:TCODE) is
bsFlg:ARRAY{BOOL}:=#(REP::rcode.stack.Jn1);
bsFlg.to_val(false);
BsCount:INT:=1; bsFlg[BsCount]:=true;
setF:BOOL;
maxG::=TCode.number_gen;
loop while!(BsCount<REP::rcode.stack.Jn.int);
setF:=false;
loop g::=1.upto!(maxG);
loop bp::=1.upto!(REP::rcode.stack.Jn);
if (bsFlg[bp] and (~bsFlg[REP::rcode.stack.st[g][bp] ])) then
newC;
HRm2(g.int,bp.int);
setF:=true; BsCount:=BsCount+1;
bsFlg[REP::rcode.stack.st[g][bp]]:=true;
end;
until!(setF);
end;
until!(setF);
end;
end;
end;
comp(p1,p2:INTI):BOOL is
return p1<p2;
end;
normalCv(p:INTI, inout gr:ARRAY{INTI}, inout Group:ARRAY{INTI}):BOOL is
pi,q:INTI;
ptbl:ARRAY{INTI}:=#(Group.size); ptbl.to_val(0.inti);
flge:BOOL:=false; flg:BOOL:=false;
loop i::=Group.ind!;
if Group[i]=0.inti then pi:=0.inti; else pi:=1.inti; end;
if Group[i]>1.inti then flge:=true;
loop
q:=Group[i]/p; if Group[i]/=p*q then break!; end;
pi:=pi*p; Group[i]:=q; flg:=true;
end;
end;
ptbl[i]:=pi;
end;
if flg then
ptbl.insertion_sort_by(bind(comp(_,_)));
loop i::=gr.ind!; gr[i]:=gr[i]*ptbl[i]; end;
end;
return flge;
end;
normalForm(inout Group:ARRAY{INTI}) is
loop i::=Group.ind!; Group[i]:=Group[i].abs; end;
gr:ARRAY{INTI}:=#(Group.size); gr.to_val(1.inti);
p:INTI:=2.inti;
if normalCv(p,inout gr,inout Group) then
p:=3.inti;
loop while!(normalCv(p,inout gr,inout Group));
p:=p+2.inti;
end;
Group:=gr.copy;
end;
gr:=Group.copy; Group:=#;
loop g::=gr.elt!; if g/=1.inti then Group:=Group.append(|g|); end; end;
end;
PrintHomology(Group:ARRAY{INTI},BrCover:BOOL) is
s:STR:="";
if ~ BrCover then s:="un"; end;
#LOGOUT+"\nH1 of "+s+"br. Cover is: ";
s:=""; -- if trivial Group
loop g::=Group.elt!;
if g/=1.inti then
#LOGOUT+s+" Z"; s:=" +";
if g>0.inti then #LOGOUT+"/"+g.str; end;
end;
end;
if s="" then #LOGOUT+"0"; end;
#LOGOUT+"\n"; LOGOUT::flush;
end;
H1Cov(TCode:TCODE, branchCover:BOOL, LogCovDist:BOOL) is
-- BrCover:=true/false means Branched/Unbranched cover.
-- #OUT+"Homology. Computing.\n";
init(TCode); CrossRelation(TCode);
BandR(TCode); BaseRelation(TCode);
BrRelation(TCode,branchCover);
-- RelM.initPivot; RelM.printRelation;
Group:ARRAY{INTI}:=#; -- [0..dimG-1]
RelM.SolveH(inout Group);
-- RelM.printRelation; PrintHomology(Group,branchCover);
normalForm(inout Group);
PrintHomology(Group,branchCover);
if LogCovDist then
if branchCover then REP::cdH1Br.IncCDH1(Group);
else REP::cdH1Unbr.IncCDH1(Group);
end;
end;
RelM:=#(0,0);
end;
end;