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;