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;