knot.sa


Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
 

class MAIN

class MAIN is help_message(argv:ARRAY{STR}) is #OUT+"Usage1(as a graphical tool): "+argv[0]+" (GUI options)\n"; #OUT+"Usage2(as a graphical tool): "+argv[0]+" -gui (GUI options)\n"; #OUT+"Usage3(as a stream filter): "+argv[0]+" -s (options) < (knot_data)\n"; #OUT+"Usage4(as a command tool): "+argv[0]+" -if (input_file) (options)\n"; #OUT+"******* GUI options*******\n"; #OUT+" -gui to force GUI, put this at the top of options\n"; #OUT+" -log enable logging at boot time\n"; #OUT+" -logfile file set file to log out. knotLog.(date) by default\n"; #OUT+"******* options for invariants *******\n"; #OUT+" -a Alexander polynomial\n"; #OUT+" -ai Alexander/Elementary ideal\n"; #OUT+" -am multi variable Alexander polynomial\n"; #OUT+" -ami multi variable Alexander/Elementary ideal\n"; #OUT+" -c Conway polynomial\n"; #OUT+" -v [n] Jones polynomial(n-parallelized)\n"; #OUT+" -p [type] P(HOMFLY) polynomial. type=vz,lm,xyz. (vz by default)\n"; #OUT+" -f F polynomial\n"; #OUT+" -q Q polynomial\n"; #OUT+" -cyc test cyclic period using Alexander polynomial\n"; #OUT+" -cov [n] [sub options] n-fold covering(n=2 by default)\n"; #OUT+" Sub options:\n"; #OUT+" br : branch indeces\n"; #OUT+" lk : covering linkage\n"; #OUT+" h1b : H_1 as branched covering space\n"; #OUT+" h1u : H_1 as unbranched covering space\n"; #OUT+" gp : Group relations\n"; #OUT+" ai : Twisted Alexander invariants\n"; #OUT+" distr: Distributions\n"; #OUT+" -sl2 [n] [sub option] representation to SL2(p) (p:prime,2 by default)\n"; #OUT+" Sub option:\n"; #OUT+" ai : Twisted Alexander invariants.\n"; #OUT+" -grp knot group\n"; #OUT+" -kv Goeritz matrix and knot value\n"; #OUT+" -sign Signature\n"; #OUT+"******* options for conversions *******\n"; #OUT+" -alt alternate\n"; #OUT+" -mirror [axis] mirror. axis=x,y,z. (x by default)\n"; #OUT+" -rot rotate by 90\n"; #OUT+" -rotn rotate by -90\n"; #OUT+" -mag [m] m-magnify(m=2.0 by default)\n"; #OUT+"******* options for output data *******\n"; #OUT+" -knot knot data\n"; #OUT+" -braid [sub option] braid\n"; #OUT+" Sub option:\n"; #OUT+" a : Artin normal form\n"; #OUT+" ra : reduced Artin normal form\n"; #OUT+" -ndata n-data\n"; #OUT+" -picture [width [height]] [sub options] LaTeX picture. Measure by millimeter\n"; #OUT+" Sub options:\n"; #OUT+" s : smooth curve\n"; #OUT+" r : rigid line\n"; #OUT+" tpic : LaTeX tpic\n"; #OUT+" ps : LaTeX pstricks (using psbezier when smooth is enabled)\n"; -- #OUT+" psc : LaTeX pstricks (using pscurve when smooth is enabled)\n"; #OUT+" r(rigid) and ps(pstricks) are enabled by default.\n" end; inits is --- polynomial -- POLYS_INTI::init; POLYM_INTI::init; -- knot inout -- VERTEXC::setShareds; K::Knot:=#KNOT; K::Knot.NoCompo0; end; endprogram is -- c.f. KNOTXW::endprogram. LOGOUT::Disconnect; end; XLoop(argv:ARRAY{STR}) is log_start:BOOL:=false; -- log enable at boot time log_file:STR:=""; argPos:CARD:=1; loop while!(argv.has_ind(argPos)); func:STR:=argv[argPos]; argPos:=argPos+1; case func when "-gui" then when "-log" then log_start:=true; when "-logfile" then if argv.has_ind(argPos).not then help_message(argv); return; end; log_file:=argv[argPos]; argPos:=argPos+1; else #OUT+" Unknown option "+func+"\n"; help_message(argv); return; end; end; -- log options if log_file.size>0 then LOGOUT::Connect(inout log_file); if LOGOUT::FileEnabled.not then help_message(argv); return; end; LOGOUT::Disconnect; end; if log_start then LOGOUT::LogBegin; end; inits; KNOTX::init; -- X main loop --KNOTX::CurrentEditMode:=1; KNOTX::TrackEventK(-1,0.int,0.int,0.int); KNOTXW::knotXProc(argv.size,argv.array_ptr); end; Testmode(argv:ARRAY{STR}) is -- use as: knot -test -- K::Knot:=KNOT_TEST::trifoil; -- for test inits; loop e:CARD:=16.upto!(50); i1::=2.inti.pow(e)+2.inti.pow(15)+1.inti; r1::=i1.fltd; i2::=r1.round.inti; #OUT+i1.str+":"+i2.str+":"+(i1-i2).str; if (i1-i2).is_non_zero then #OUT+" --------- ! ---------"; end; #OUT+"\n"; end; end; streamIO(argv:ARRAY{STR}) is -- 0: prog. name, 1: -s, 2..: options argPos:CARD:=1; inits; out_s::=OUTSTREAM::stdout; in_s::=INSTREAM::stdin; -- STD_CHANS::stdout;, STD_CHANS::stdin; -- read knot if argv.has_ind(argPos) and argv[argPos]="-s" then argPos:=argPos+1; in_s:=INSTREAM::stdin; end; if argv.has_ind(argPos) and argv[argPos]="-if" then argPos:=argPos+1; if argv.has_ind(argPos).not then help_message(argv); return; end; #LOGOUT+"\ninput_file: "+argv[argPos]+"\n\n"; in_s:=#INSTREAM(argv[argPos]); argPos:=argPos+1; end; if argv.has_ind(argPos).not then help_message(argv); return; end; if in_s.error then return; end; if KNOTFIO::ReadKnotNS(out K::Knot, in_s).not then return; end; if K::Knot.is_nocompo then #OUT+"Knot data have no component.\n"; return; end; if K::Knot.is_Closed.not then #OUT+"Knot data is not closed.\n"; return; end; K::Knot.CrossSet(0.int,K::Knot.length.int); tcode:TCODE; reply:INT:=0; replyb:BOOL:=true; loop while!(argv.has_ind(argPos)); func:STR:=argv[argPos]; argPos:=argPos+1; if K::Knot.SetTCode(out tcode).not then return; end; -- tcode.get_Relator(tcode); case func ----- ----- test ----- when "-test" then #OUT+"test: write knot\n"; replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,""); ----- ----- invariants ----- when "-p" then -- HOMFLY P if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; -- format: -p [vz|lm|xyz] PDefNum::=1; if argv.has_ind(argPos) then case argv[argPos] when "vz" then PDefNum:=1; argPos:=argPos+1; when "lm" then PDefNum:=2; argPos:=argPos+1; when "xyz" then PDefNum:=3; argPos:=argPos+1; else end end; case PDefNum when 1 then PPOLY::Ppoly(tcode,PPOLY::Def_vz); when 2 then PPOLY::Ppoly(tcode,PPOLY::Def_lm); when 3 then PPOLY::Ppoly(tcode,PPOLY::Def_xyz); end; when "-f" then -- Kauffman F if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; FPOLY::Fpoly(tcode); when "-c" then -- Conway C if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; ALEXMAT::AlexMat(tcode,false,false,true); --CPOLY::Cpoly(tcode); when "-q" then -- Q if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; QPOLY::Qpoly(tcode); when "-v" then -- Jones V -- format: -v [parallel_index] if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; n:INT:=1; --if (argPos<argv.size) then #OUT+"arg:"+argv[argPos]+":" -- +.str+"\n"; -- end; if argv.has_ind(argPos) and argv[argPos].cursor.get_char.is_digit and CARD::is_card(argv[argPos]) then n:=#INT(argv[argPos]); argPos:=argPos+1; end; if n>=2.int then VPOLY::VPara(tcode,n); else VPOLY::Vpoly(tcode); end; when "-cov" then -- covering if K::Knot.has_band then K::Knot.make_coherent; end; -- format: -cov [covering_index] n:CARD:=2; -- covering fold >=2 form::=2; -- 1/2 branchind::=0; covlk::=0; h1b::=0; h1u::=0; knotgrp::=0; twistAlex::=0; --0/1 covDistY::=0; covDistBr::=0; covDistLk::=0; covDistH1B::=0; covDistH1U::=0; --0/1 distr:BOOL:=false; loop while!(argv.has_ind(argPos)); if argv[argPos].cursor.get_char.is_digit and CARD::is_card(argv[argPos]) then n:=CARD::create(argv[argPos]); elsif argv[argPos]="br" then branchind:=1;-- branch indeces. elsif argv[argPos]="lk" then covlk:=1; --covering linkage. elsif argv[argPos]="h1b" then h1b:=1;--H_1 as "branched" covering space. elsif argv[argPos]="h1u" then h1u:=1;--H_1 as "unbranched" covering space. elsif argv[argPos]="gr" then knotgrp:=1;--Group relations. elsif argv[argPos]="ai" then twistAlex:=1;--Twisted Alexander invariants. elsif argv[argPos]="distr" then distr:=true; --Distributions. else break!; end; argPos:=argPos+1; end; if n<2 then n:=2; end; if distr then covDistY:=branchind; covDistBr:=branchind; covDistLk:=covlk; covDistH1B:=h1b; covDistH1U:=h1u; --0/1 end; #REP.RepSearch(tcode,n,form,branchind,covlk,h1b,h1u,knotgrp,twistAlex, covDistY,covDistBr,covDistLk,covDistH1B,covDistH1U); when "-sl2" then -- SL2(p) representation if K::Knot.has_band then K::Knot.make_coherent; end; -- format: -sl2 prime_number base:INT:=2.int; form::=1; -- 1/2 twistAlex::=0; --0/1 loop while!(argv.has_ind(argPos)); if argv[argPos].cursor.get_char.is_digit and CARD::is_card(argv[argPos]) then base:=INT::create(argv[argPos]); elsif argv[argPos]="ai" then twistAlex:=1; --Twisted Alexander invariants. else break!; end; argPos:=argPos+1; end; -- "base" must be prime. if base.is_prime then #REP_SL2P.RepSearch(tcode,base,form,twistAlex); else #OUT+"\nThe base "+base.str+" for SL2(p) is not prime.\n"; end; when "-a" then -- alexander poly. if K::Knot.has_band then K::Knot.make_coherent; end; ALEXMAT::AlexMat(tcode,false,false); --APOLY::ApolyC(tcode); when "-ai" then -- alexander matrix/ideal if K::Knot.has_band then K::Knot.make_coherent; end; ALEXMAT::AlexMat(tcode,false,true); when "-cyc" then -- test cyclic period if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; ALEXMAT::AlexMat(tcode,true,false); when "-am" then -- multi variable alexander polynomial if K::Knot.has_band then K::Knot.make_coherent; end; ALEXMATM::AlexMat(tcode,false); when "-ami" then -- multi variable alexander matrix/ideal if K::Knot.has_band then K::Knot.make_coherent; end; ALEXMATM::AlexMat(tcode,true); when "-grp" then -- knot group if K::Knot.has_band then K::Knot.make_coherent; end; KNOT_GROUP::printGroup(tcode); -- Group; when "-kv" then -- Goerits matrix and knot value if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; GOERITZ_MAT::KnotValue(tcode); when "-sign" then SIGNATURE::Signature(tcode); ----- ----- conversions ----- when "-alt" then -- alternate ALTERNATE::Alternate(inout K::Knot); if K::Knot.SetTCode(out tcode) then -- tcode.get_Relator(tcode); else return; end; when "-mirror" then -- mirror-x -- format: -mirror [x|y|z] mirror::=false; loop while!(argv.has_ind(argPos)); case argv[argPos] when "x" then K::Knot.mirrorX; when "y" then K::Knot.mirrorY; when "z" then K::Knot.mirrorZ; else break!; end; mirror:=true; argPos:=argPos+1; end; if mirror.not then K::Knot.mirrorX; end; if K::Knot.SetTCode(out tcode) then -- tcode.get_Relator(tcode); else return; end; when "-mag" then -- magnify -- format: -mag [scaling] if K::Knot.is_nocompo then #OUT+"Knot data is not specified.\n"; return; end; mag:FLT:=2.0; -- 2 by default if argv.has_ind(argPos) and argv[argPos].cursor.get_char.is_digit then if FLT::is_real(argv[argPos])=CONVERSION_RESULTS::All_Right then mag:=#FLT(argv[argPos]); argPos:=argPos+1; elsif CARD::is_card(argv[argPos]) then mag:=#CARD(argv[argPos]).flt; argPos:=argPos+1; end; end; if mag<0.0 then mag:=2.0; end; K::Knot.transform(mag); when "-rot" then K::Knot.transform(0.int,-1,1.int,0.int); when "-rotn" then K::Knot.transform(0.int,1.int,-1,0.int); ----- ----- print data ----- when "-knot" then -- knot data replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,""); when "-braid" then -- braid if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; braid::=false; loop while!(argv.has_ind(argPos)); case argv[argPos] when "a" then replyb:=KNOTFIO::WriteBraidS(K::Knot,out_s,true,true,"",true,false); when "ra" then replyb:=KNOTFIO::WriteBraidS(K::Knot,out_s,true,true,"",true,true); else break!; end; braid:=true; argPos:=argPos+1; end; if braid.not then replyb:=KNOTFIO::WriteBraidS(K::Knot,out_s,true,true,"",false,false); end; when "-ndata" then -- n-data if K::Knot.has_band then #OUT+"Not support on 2-knot."; return; end; replyb:=KNOTFIO::WriteNDataS(K::Knot,out_s,true,true,""); when "-picture" then -- LaTeX picture -- format: -picture [width(mm) [height(mm)]] smooth:BOOL:=false; latexMode:CARD:=2; -- 1/2/3 pw:INT:=-1; ph:INT:=pw; loop while!(argv.has_ind(argPos)); if argv[argPos].cursor.get_char.is_digit and CARD::is_card(argv[argPos]) then if pw.is_neg then pw:=INT::create(argv[argPos]); else ph:=INT::create(argv[argPos]); end; elsif argv[argPos]="s" then smooth:=true; elsif argv[argPos]="r" then smooth:=false; elsif argv[argPos]="tpic" then latexMode:=1; elsif argv[argPos]="ps" then latexMode:=2; elsif argv[argPos]="psc" then latexMode:=3; else break!; end; argPos:=argPos+1; end; if pw.is_neg then pw:=120; end; if ph.is_neg then ph:=pw; end; -- width, height, margin:INT, scalingMode:CARD, smooth:BOOL, latexMode:CARD DRAWKNOT_TEX_ALG::DrawKnotPic(K::Knot, pw, ph, 0.int, 1, smooth,latexMode); else #OUT+" Unknown option "+func+"\n"; help_message(argv); return; end; out_s+"\n"; end; end; main(argv:ARRAY{STR}) is if (argv.size>=2) then if (argv[1]="-test") then Testmode(argv); elsif (argv[1]="-help") then help_message(argv); elsif (argv[1]="-s") then streamIO(argv); elsif (argv[1]="-if") then streamIO(argv); elsif (argv[1]="-gui") then XLoop(argv); -- force GUI else XLoop(argv); -- help_message(argv); end; else XLoop(argv); end; end; end;