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: "+argv[0]+"\n";
#OUT+"Usage2: "+argv[0]+" -s options < knot_data\n";
#OUT+"Usage3: "+argv[0]+" -s -if input_file options\n";
#OUT+"options:\n";
#OUT+" -a Alexander polynomial\n";
#OUT+" -ai Alexander matrix/ideal\n";
#OUT+" -am multi variable Alexander matrix\n";
#OUT+" -p [type] P polynomial(type=vz,lm,xyz. type=vz by default)\n";
#OUT+" -f F polynomial\n";
#OUT+" -q Q polynomial\n";
#OUT+" -v [n] Jones polynomial or\n";
#OUT+" n-parallelized Jones polynomial\n";
#OUT+" -c Conway polynomial\n";
#OUT+" -cyc test cyclic period using Alexander polynomial\n";
#OUT+" -cov [n] n-fold covering spaces(n=2 by default)\n";
#OUT+" -sl2 [n] representation to SL2(n) (n:prime, 2 by default)\n";
#OUT+" -grp knot group\n";
#OUT+" -kv Goeritz matrix and knot value\n";
#OUT+"----------- diagram ----------\n";
#OUT+" -alt alternate\n";
#OUT+" -braid Braid\n";
#OUT+" -ndata n-data\n";
#OUT+" -mirror [axis] mirror(axis=x,y,z. x by default)\n";
#OUT+" -mag [m] m-magnify(m=2.0 by default)\n";
#OUT+" -rot rotate of 90\n";
#OUT+" -rotn rotate of -90\n";
end;
inits is
--- polynomial --
POLYS_INTI::init;
POLYM_INTI::init;
-- knot inout --
VERTEXC::setShareds;
K::Knot:=#KNOT; K::Knot.NoCompo0;
-- K::Knot:=KNOT_TEST::trifoil; -- for test
end;
XLoop(argv:ARRAY{STR}) is
-- call X main loop
KNOTX::init;
KNOTX::TrackEventK(-1,0,0,0);
KNOTXW::knotXProc(argv.size, argv.array_ptr);
end;
streamTestmode(argv:ARRAY{STR}) is
-- 0: prog. name, 1: -s, 2: function, 3..: optional
-- use as: knot -s -f < knot_data > result
argPos:INT:=2;
in_s::=FILE::stdin; out_s::=FILE::stdout;
tcode:TCODE; reply:INT:=0; replyb:BOOL:=true;
if KNOTFIO::ReadKnotNS(out K::Knot, in_s).not then return; end;
if K::Knot.is_Closed then K::Knot.CrossSet(0,K::Knot.length);
else #OUT+"Knot data is not closed.\n";
return;
end;
loop while!(argPos<argv.size);
out_s+"\n";
func:STR:=argv[argPos]; argPos:=argPos+1;
if K::Knot.has_band then
K::Knot.make_coherent;
end;
if K::Knot.SetTCode(out tcode) then -- tcode.get_Relator(tcode);
else return;
end;
case func
when "-p" then -- HOMFLY P
PDefNum:INT:=1;
if argPos<argv.size 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;
end
end;
case PDefNum
when 1 then PPOLY::PpolyTest(tcode,PPOLY::Def_vz);
when 2 then PPOLY::PpolyTest(tcode,PPOLY::Def_lm);
when 3 then PPOLY::PpolyTest(tcode,PPOLY::Def_xyz);
end;
else
#OUT+" Unknown option "+func+"\n";
end;
end;
end;
streamIO(argv:ARRAY{STR}) is
-- 0: prog. name, 1: -s, 2: function, 3..: optional
-- use as: knot -s -f < knot_data > result
in_s:FILE;
argPos:INT:=2;
#OUT+"argv[2]:"+argv[argPos]+"\n";
if argv[argPos]="-if" then
argPos:=argPos+1; in_s:=FILE::open_for_read(argv[argPos]);
#OUT+"file:"+argv[argPos]+"\n";
argPos:=argPos+1;
else
in_s:=FILE::stdin;
#OUT+"file:"+"stdin"+"\n";
end;
if in_s.error then return; end;
out_s::=FILE::stdout;
tcode:TCODE; reply:INT:=0; replyb:BOOL:=true;
if KNOTFIO::ReadKnotNS(out K::Knot, in_s).not then return; end;
if K::Knot.is_Closed then K::Knot.CrossSet(0,K::Knot.length);
else #OUT+"Knot data is not closed.\n";
return;
end;
loop while!(argPos<argv.size);
out_s+"\n";
func:STR:=argv[argPos]; argPos:=argPos+1;
if K::Knot.has_band then
case func
when "-p","-f","-c","-q","-v","-a","-kv","-braid","-ndata" then
#OUT+"Not support on 2-knot.";
return;
else K::Knot.make_coherent;
end;
end;
if K::Knot.SetTCode(out tcode) then -- tcode.get_Relator(tcode);
else return;
end;
case func
when "-p" then -- HOMFLY P
-- format: -p [vz|lm|xyz]
PDefNum:INT;
if argPos<argv.size 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 PDefNum:=1;
end
else PDefNum:=1;
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
FPOLY::Fpoly(tcode);
when "-c" then -- Conway C
ALEXMAT::AlexMat(tcode,false,false,true);
--CPOLY::Cpoly(tcode);
when "-q" then -- Q
QPOLY::Qpoly(tcode);
when "-v" then -- Jones V
-- format: -v [parallel_index]
n:INT:=1;
if (argPos<argv.size)and argv[argPos][0].is_digit then
n:=#INT(argv[argPos]); argPos:=argPos+1;
end;
if n>=2 then VPOLY::VPara(tcode,n);
else VPOLY::Vpoly(tcode);
end;
when "-cov" then -- covering
-- format: -cov [covering_index]
n:INT:=2; -- covering fold >=2
if (argPos<argv.size) and argv[argPos][0].is_digit then
n:=INT::create(argv[argPos]); argPos:=argPos+1;
end;
if n<2 then n:=2; end;
form::=2; -- 1/2
branchind::=1; covlk::=1; --0/1
h1b::=1; h1u::=1; knotgrp::=1; twistAlex::=1; --0/1
covDistY::=1; covDistBr::=1; covDistLk::=1; --0/1
covDistH1B::=1; covDistH1U::=1; --0/1
#REP.RepSearch(tcode,n,form,branchind,covlk,h1b,h1u,knotgrp,twistAlex,
covDistY,covDistBr,covDistLk,
covDistH1B,covDistH1U);
when "-sl2" then -- SL2(p) representation
-- format: -sl2 prime_number
base::=2;
form::=1;
twistAlex::=1; --0/1
if (argPos<argv.size) and argv[argPos][0].is_digit then
base:=INT::create(argv[argPos]); argPos:=argPos+1;
end;
#REP_SL2P.RepSearch(tcode,base,form,twistAlex);
when "-a" then -- alexander poly.
ALEXMAT::AlexMat(tcode,false,false);
--APOLY::ApolyC(tcode);
when "-ai" then -- alexander matrix/ideal
ALEXMAT::AlexMat(tcode,false,true);
when "-cyc" then -- test cyclic period
ALEXMAT::AlexMat(tcode,true,false);
when "-am" then -- multi variable alexander matrix
ALEXMATM::AlexMat(tcode);
when "-grp" then -- knot group
KNOT_GROUP::printGroup(tcode); -- Group;
when "-kv" then -- Goerits matrix and knot value
GOERITZ_MAT::KnotValue(tcode);
when "-alt" then -- alternate
ALTERNATE::Alternate(inout K::Knot);
replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,"");
when "-braid" then -- braid
replyb:=KNOTFIO::WriteBraidS(K::Knot,out_s,true,true,"");
when "-ndata" then -- n-data
replyb:=KNOTFIO::WriteNDataS(K::Knot,out_s,true,true,"");
when "-mirror" then -- mirror-x
-- format: -mirror [x|y|z]
axis:STR:="x"; -- x,y,z
if argPos<argv.size then
case argv[argPos]
when "x" then axis:="x"; argPos:=argPos+1;
when "y" then axis:="y"; argPos:=argPos+1;
when "z" then axis:="z"; argPos:=argPos+1;
else axis:="x"; -- x,y,z
end
end;
case axis
when "x" then K::Knot.mirrorX;
when "y" then K::Knot.mirrorY;
when "z" then K::Knot.mirrorZ;
end;
replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,"");
when "-mag" then -- magnify
-- format: -mag [scaling]
mag:FLT:=2.0;
if (argPos<argv.size) and argv[argPos][0].is_digit then
mag:=#FLT(argv[argPos]); argPos:=argPos+1;
end;
if mag<0.0 then mag:=2.0; end;
K::Knot.transform(mag);
replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,"");
when "-rot" then K::Knot.transform(0,-1,1,0);
replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,"");
when "-rotn" then K::Knot.transform(0,1,-1,0);
replyb:=KNOTFIO::WriteKnotS(K::Knot,out_s,true,true,"");
else
#OUT+" Unknown option "+func+"\n";
end;
end;
end;
main(argv:ARRAY{STR}) is
inits;
if (argv.size>=2) then
if (argv[1]="-s") then streamIO(argv); -- stream in/out
elsif (argv[1]="-testmode") then streamTestmode(argv); -- stream in/out
else help_message(argv);
end;
else XLoop(argv); -- X main loop
end;
end;
end;