=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/ox.sm1,v retrieving revision 1.1.1.1 retrieving revision 1.55 diff -u -p -r1.1.1.1 -r1.55 --- OpenXM/src/kan96xx/Doc/ox.sm1 1999/10/08 02:12:02 1.1.1.1 +++ OpenXM/src/kan96xx/Doc/ox.sm1 2006/03/03 02:30:09 1.55 @@ -1,58 +1,63 @@ -%%%%%%%%%%%% Configuration: Specify your server path -%%%%% ox, ox_sm1, oxlog are contained in kxx.tgz -%%%%% These should be under /usr/local/lib/sm1 or LOAD_SM1_PATH -/oxpath.ox (bin/ox) def -/oxpath.oxsm1 (bin/ox_sm1) def -/oxpath.oxlog (bin/oxlog) def -/oxpath.xterm (/usr/X11R6/bin/xterm -icon -e ) def -/oxpath.null ( ) def -/oxpath.null00 ( >& /dev/null ) def %% cf oxNoX -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Old full path. -%/oxpath.ox (/home/nobuki/kxx/ox) def -%/oxpath.oxsm1 (/home/nobuki/kxx/ox_sm1) def -%/oxpath.oxlog (/home/nobuki/kxx/oxlog) def -%/oxpath.xterm (/usr/X11R6/bin/xterm -icon -e ) def +%%%%%%%%%%% $OpenXM: OpenXM/src/kan96xx/Doc/ox.sm1,v 1.54 2006/03/03 00:43:02 takayama Exp $ -%% This macro is invoked when this package is loaded. -/initializePathNamesForOx { - [oxpath.ox] getPathNameSm1 /oxpath.ox set - [oxpath.oxsm1] getPathNameSm1 /oxpath.oxsm1 set - [oxpath.oxlog] getPathNameSm1 /oxpath.oxlog set - /oxpath.oxlog.xterm [oxpath.oxlog ( ) oxpath.xterm] cat def -} def +/ox.sm1.myname (ox-new.sm1) def -%% Execute this macro, then xterm will not be executed and the output -%% will be redirected to /dev/null. -/oxNoX { - /oxpath.null oxpath.null00 def - /oxpath.oxlog.xterm [oxpath.oxlog ( )] cat def - (oxpath.oxlog.xterm is set to ) messagen - oxpath.oxlog.xterm message -} def +[(ostype)] extension 0 get (unix) eq { + /oxstart100 + [[(getenv) (OpenXM_HOME)] extension (/bin/ox100start )] cat + def +} { + /oxstart100 + [[(getenv) (OpenXM_HOME)] extension + (/bin/ox100start.exe )] cat + def +} ifelse +[(getenv) (OXSTART100)] extension tag 0 eq not { + /oxstart100 [(getenv) (OXSTART100)] extension def +} { } ifelse +oxstart100 message-quiet -/ox.ccc.init { ox.ccc ( [(oxPrintMessage) 0] extension pop ) oxsubmit } def +/ox.sm1.loaded 1 def +/oxasir.sm1.loaded 1 def +/ox.k0.loaded 1 def +/Ox103_loaded 1 def /ox.verbose 0 def -/ox.version (2.981105) def +/ox.version (3.030000) def ox.version [(Version)] system_variable gt { (This package requires the latest version of kan/sm1) message (Please get it from http://www.math.kobe-u.ac.jp/KAN) message error } { } ifelse -(ox.sm1, --- open sm1 protocol module 10/1,1999 (C) N.Takayama. oxhelp for help) message-quiet +(ox.sm1, ---OpenXM protocol module 07/20, 2003 (C) N.Takayama.) message-quiet +( for ox_sm1, ox_asir, ox_k0 ) message-quiet /ox.ccc load isArray { } { /ox.ccc [ ] def } ifelse +/oxsm1.ccc load isArray +{ } +{ /oxsm1.ccc [ ] def } ifelse +/ox.takelog 0 def +(@@@.Xm_noX) boundp { +}{ + /@@@.Xm_noX 0 def +} ifelse +(Xm_noX) boundp { + /@@@.Xm_noX Xm_noX def +}{ } ifelse +/Xm_noX @@@.Xm_noX def +/Xm_engineLogToStdout 0 def +/oxNoX { + /Xm_noX 1 def +} def -/ox.logsize 10 def -/ox.log [1 1 ox.logsize {pop 0} for ] def -/ox.mod { dup ox.logsize idiv ox.logsize mul sub } def -/ox.takelog 1 def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% basic functions for OX-RFC 100 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /SM_executeStringByLocalParser 268 def /SM_execute 268 def /SM_popString 263 def @@ -60,7 +65,7 @@ ox.version [(Version)] system_variable gt /SM_popCMO 262 def /SM_executeFunction 269 def -/SM_DUMMY_sendcmo 280 def +/SM_DUMMY_sendcmo 2147418112 1 add def %%% SM_PRIVATE+1 /SM_sync_ball 281 def /SM_pops 265 def @@ -72,124 +77,73 @@ ox.version [(Version)] system_variable gt /SM_getsp 275 def /SM_dupErrors 276 def +/SM_pushCMOtag 277 def +/SM_executeFunctionWithOptionalArgument 282 def + /SM_control_kill 1024 def /SM_control_reset_connection 1030 def +/SM_control_spawn_server 1027 def /Etag_error 257 def -/enginesList [ - [(localhost) 1300 1200] - [(localhost) 2300 2200] -] def -%% cf. startengines -/enginesList.2 [ - [(dc1) 1300 1200] - [(dc2) 2300 2200] -] def -%% cf. se12 - -/oxconnect { - /arg1 set - [(oxCreateClient) arg1 aload pop] extension -} def -[(oxconnect) - [([hostname data-port control-port] oxconnect pid) - (oxconnect is used to connect this to a server on the hostname with data-port) - (and control-port) - (Example 1: ox -ox ox_sm1 -data 1300 -control 1200 <== on server.) - ( [$localhost$ 1300 1200] oxconnect /ox.ccc set <== on client.) - (Example 2: ox -ox ox_sm1 -host s.OpenXM.org -insecure -data 1300 -control 1200 <== on server.) - ( [$s.OpenXM.org$ 1300 1200] oxconnect /ox.ccc set <== on client.) - (Example 3: ox -ox ox_sm1 -data 1300 -control 1200 >& /dev/null &<== on server.) - ( [$localhost$ 1300 1200] oxconnect /ox.ccc set <== on client.) - ( cf. oxNoX) - (See also ox) - ] -] putUsages - [(ox) [ (client aa oxpushcmo (oxsendcmo), client oxpopcmo dd, client popstring dd, client ss oxrpc) - (Example: ox.ccc [1 2 3] oxpushcmo ox.ccc oxpopcmo /ff set ff :: ) + (Example: oxsm1.ccc [1 2 3] oxpushcmo oxsm1.ccc oxpopcmo /ff set ff :: ) ( ) (client ss oxexecutestring(oxsubmit) <>, client ss oxexec <>) + (client ss oxexecWithOpt ) - (Example: ox.ccc (0 1 10 { pop $Hello$ message } for) oxexecutestring ) - (Example: ox.ccc (2).. oxpushcmo ox.ccc (10).. oxpushcmo ) - ( ox.ccc (power) oxexec ox.ccc oxpopcmo :: ) + (Example: oxsm1.ccc (0 1 10 { pop $Hello$ message } for) oxexecutestring ) + (Example: oxsm1.ccc (2).. oxpushcmo oxsm1.ccc (10).. oxpushcmo ) + ( oxsm1.ccc (power) oxexec oxsm1.ccc oxpopcmo :: ) ( ) (client str oxevalname, client str oxsetname, client num oxpops, client oxget) ( ) (client oxmathcap, client oxsetmathcap, oxgenportfile, oxremoveportfile) + (client oxpushcmotag) ( ) (client oxgetsp --- get stack pointer, client oxgeterrors --- get all errors) + (client oxclearstack --- clear the stack of the ox server.) (cleint oxisData, client oxreset, client oxshutdown) - (oxhelp for this message, [(oxWatch) client] extension to start a log.) + (oxhelp for this message) + ([(oxWatch) client] extension to start a log.) + $ ex 1. (ox.sm1) run sm1connectr [(oxWatch) oxsm1.ccc] extension $ + $ oxsm1.ccc ( [(cmoLispLike) 0] extension ) oxsubmit $ + $ oxsm1.ccc ( [(cmoLispLike) 1] extension ) oxsubmit $ ([(oxSerial)] extension serial-number-of-out-going-ox-packet.) - (oxpopcmo1, oxpopcmo2, sm1connect2, sm1connect3) - (sm1connectr ) + (oxpopcmo1, oxpopcmo2, sm1connectr ox_launch, ox_launch_nox) (oxNoX : set an environment to invoke oxlog without xterm and to call oxlog with >& /dev/null) $ ex 1. (ox.sm1) run oxNoX sm1connectr $ - $ ex 2. (oxasir.sm1) run oxNoX (x^2-1). fctr pmat ; $ + $ ex 2. (ox.sm1) run oxNoX (x^2-1). fctr pmat ; $ + $ $ + $cf. extension-oxLog $ ] ] putUsages -/oxhelp { - (oxconnect) usage - ( ) message - (ox) usage -} def -[(oxhelp) - [(oxhelp outputs help messages for ox commands.) +[(extension-oxLog) +[ +$Take the log of communication in files.$ +$[(oxLog) client logfile_for_incomming_data logfile_for_outgoing_data] extension $ +$Example:$ +$ [(parse) (ox.sm1) pushfile] extension$ +$ sm1connectr$ +$ (i.t) (w) file /ii set$ +$ (o.t) (w) file /oo set$ +$ [(oxLog) oxsm1.ccc ii oo] extension $ +$ [(oxWatch) oxsm1.ccc ] extension$ +$ oxsm1.ccc 1 oxpushcmo ;$ +$ oxsm1.ccc oxpopcmo ;$ +$ [(oxLogStop) oxsm1.ccc] extension$ ]] putUsages -ox.verbose { oxhelp } { } ifelse - -/sm1connect2 { - [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1 - oxpath.null - ( &)] cat system -% (kterm -iconic -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_sm1 &) system -% For MSRI, or Eterm, -%(xterm -icon -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_sm1 &) system - (If you start the server automatically, you may have a trouble to) message - (oxreset. In order to avoid this trouble, start the server by hand.) message - (sleep 5) system - [(localhost) 1300 1200] oxconnect /ox.ccc set - (The server is binded to the variable ox.ccc) message - ox.ccc.init +/oxconnect { + /arg1 set + [(oxCreateClient) arg1 aload pop] extension } def -/sm1connect3 { - [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1 - ( -data 2300 -control 2200 ) - oxpath.null - ( &)] cat system -% (kterm -iconic -e /home/nobuki/kxx/ox -ox /home/nobuki/kxx/ox_sm1 -data 2300 -control 2200 &) system -% For MSRI -%(xterm -icon -e /u/nobuki/tmp/kxx/ox -ox /u/nobuki/tmp/Ox/ox_sm1 -data 2300 -control 2200&) system - (If you start the server automatically, you may have a trouble to) message - (oxreset. In order to avoid this trouble, start the server by hand.) message - (sleep 5) system - [(localhost) 2300 2200] oxconnect /ox.ccc2 set - (The server is binded to the variable ox.ccc2) message -} def +ox.verbose { oxhelp } { } ifelse -/sm1connect4 { - %% test version. - /ox.ccc.portfile oxgenportfile def - [oxpath.oxlog.xterm oxpath.ox ( -ox ) oxpath.oxsm1 - ( -portfile ) ox.ccc.portfile - oxpath.null - ( &)] cat system - (sleep 5) system - [(oxReadPortFile) ox.ccc.portfile] extension /ox.ccc.control set - ox.ccc.control message - [(localhost) ox.ccc.control 1200] /ox.ccc set - (The server is binded to the variable ox.ccc) message - oxremoveportfile -} def - /oxpushcmo { oxsendcmo } def /oxsendcmo { /arg1 set @@ -199,6 +153,11 @@ ox.verbose { oxhelp } { } ifelse [(oxReq) arg2 SM_DUMMY_sendcmo arg1] extension pop } def +/oxpushcmotag { + /arg2 set + [(oxReq) arg2 SM_pushCMOtag ] extension pop +} def + /oxpopcmo { /arg1 set [(oxReq) arg1 SM_popCMO ] extension pop @@ -246,19 +205,7 @@ ox.verbose { oxhelp } { } ifelse ] pop popVariables } def -/oxsetmathcap.old { - /arg1 set - [(oxReq) - arg1 SM_setMathCap - [(mathcap-object) - [[199901160 (sm1)] - [2130706434 , 1 , 2 , 4 , 17 , 19 , 20 , 22 , 23 , 24 , 25 , 26 , 30 ] - %% mathcap for sm1. - %% [1 2 3 4 5] %% for test. cf. cmoCheckMathCap, Sm1_mathcap() - ] - ] %% Never write a broken data here. - ] extension pop -} def + /oxpopcmo1 { %% ask of the transmission. /arg1 set [(oxReq) arg1 SM_popCMO ] extension pop @@ -316,6 +263,23 @@ ox.verbose { oxhelp } { } ifelse } { } ifelse [(oxReq) arg2 SM_executeFunction arg1] extension pop } def +/oxexecWithOpt { + /arg1 set + /arg2 set + ox.takelog { ox.log [(oxSerial)] extension ox.mod arg1 put + ox.log [(oxSerial)] extension 1 add ox.mod + (executeFunctionWithOptionalArgument) put + } { } ifelse + [(oxReq) arg2 SM_executeFunctionWithOptionalArgument arg1] extension pop +} def +[(oxexecWithOpt) + [ + $Example: $ + $oxsm1.ccc (/foo { message message message } def) oxsubmit ;$ + $oxsm1.ccc (hello) oxpushcmo oxsm1.ccc 1 oxpushcmo oxsm1.ccc [[(opt) 0]] oxpushcmo ;$ + $oxsm1.ccc (foo) oxexecWithOpt $ + ] +] putUsages /oxsubmit2 { oxexec } def @@ -342,7 +306,7 @@ ox.verbose { oxhelp } { } ifelse /oxreset { /arg1 set [(oxReq) arg1 SM_control_reset_connection] extension pop - [(oxGetFromControl) arg1 ] extension pop +%% [(oxGetFromControl) arg1 ] extension pop [(oxGet) arg1] extension message } def @@ -385,130 +349,150 @@ ox.verbose { oxhelp } { } ifelse }def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/enginescmd - $ /computesp { - /arg1 set - [arg1 myid] arg1 message - } def - $ -def +/ox_launch_nox { + Xm_noX /ox_launch_nox.save set + oxNoX + ox_launch_aux + /Xm_noX ox_launch_nox.save def +} def +/ox_launch { + ox_launch_aux +} def +/ox_launch_aux { + /arg1 set + [/in-launch_nox /pass /peer /data /control /name /machine + /your-peer /comm /remoteOpenXMbin /remoteServer /myhost + /argNumber /aaa /myssh + ] pushVariables + [ + /aaa arg1 def + /argNumber aaa length def + /machine aaa 0 get def + machine (localhost) eq argNumber 5 lt and { + aaa 1 get ox_launch_localhost /your-peer set + /LLL.end goto + } { + /remoteServer aaa 1 get def + /name aaa 2 get def + } ifelse -/genPairs { - /arg1 set - [/n /i /j] pushVariables - [ - /n arg1 def - /genPairs.list [ ] def - /genPairs.i 0 def - 0 1 n 1 sub { - /i set - i 1 add 1 n 1 sub { - /j set - genPairs.list [i j] append /genPairs.list set - } for - } for - /genPairs.n genPairs.list length def - ] pop - popVariables -} def + /myssh [(which) (ssh)] oxshell def + myssh tag 0 eq { + (ssh is not found.) error + } { } ifelse -/getPair { - [/i ] pushVariables - [ - genPairs.i genPairs.n lt { - genPairs.list genPairs.i get /ans set - genPairs.i 1 add /genPairs.i set - } - { [-1 -1] /ans set} ifelse - /arg1 ans def - ] pop - popVariables - arg1 -} def + [(gethostname)] extension /myhost set -/sumUp { - /arg1 set - [/ans /v /i /n] pushVariables - [ - /v arg1 def - /n v length def - /ans 0 def - 0 1 n 1 sub { - /i set - ans v i get add /ans set - } for - /arg1 ans def - ] pop - popVariables - arg1 + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) myhost] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message + peer 0 get -1 eq { + (Error in oxGetPort) error + } { } ifelse + [myssh ( -X -f ) machine ( -l ) name ( ) + [ + (ox100start ) % it must be on a path of the remote host + @@@.quiet { ( -quiet ) } { } ifelse + Xm_noX { ( -nox ) } { } ifelse + ( -oxserver ) remoteServer ( -e ) + ( -reverse ) + ( -host ) myhost + ( -data ) data ( -control ) control pass [1 2] get + ] cat + ] cat /comm set + (Executing the command : ) messagen comm message + comm execve 0 lt { + (Fork exec failed) error + } { } ifelse +% ipmask must be 1 to accept from a global address. + [(oxCreateClient2) peer 1 , pass 0 get] extension /your-peer set + /LLL.end + /arg1 your-peer def + ] pop + popVariables + arg1 } def +[(ox_launch) +[( [remote-machine remote-ox-server-name remote-login-name] ) + ( ox_launch client ) + $or $ + $ [(localhost) ox-server-name] ox_launch client$ + (This command launches ox server via ssh.) + (My hostname is set by the function gethostname.) + (Example 1: ) + $ [(orange2-clone) $ + $ (bin/ox_sm1) (taka)$ + $ ] ox_launch /@@@.oxsm1 set $ +]] putUsages -/dist { - /dist.debug 0 def - /result [ ] def - enginesList {oxconnect} map /engines set - /enginesN engines length def - % broadcast the program. - (ox-1.sm1) pushfile /enginescmd set %% read a file. - [(parse) enginescmd] extension - engines {enginescmd oxsubmit} map - engines { (slave-start) oxsubmit} map %% initialize slave codes. - %% send pid. - 0 1 enginesN 1 sub { - /i set - engines i get i oxsendcmo - engines i get (/myid set) oxsubmit - } for +[(ox_launch_nox) +[( [remote-machine remote-ox-server-name remote-login-name] ) + ( ox_launch_nox client ) + (Example 1: ) + $ [(tau.math.kobe-u.ac.jp) $ + $ (bin/ox_math) (taka) $ + $ ] ox_launch_nox /@@@.oxmath set $ +]] putUsages - master-start %% initialize master codes - %% gbsize genPairs %% obsolete - /gbsize ans length def - ans makePairs /genPairs.list set - /genPairs.i 0 def /genPairs.n genPairs.list length def - +/ox_launch_localhost { + /arg1 set + [/in-ox_launch_localhost /pass /peer /data /control /oxserver + /my-peer] pushVariables + [ + /oxserver arg1 def + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) (localhost)] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message + [ + oxstart100 + @@@.quiet { ( -quiet ) } { } ifelse + Xm_noX { ( -nox ) } { } ifelse + ( -oxserver ) oxserver ( -e ) + ( -reverse ) + ( -data ) data ( -control ) control pass [1 2] get + ] cat execve + [(oxCreateClient2) peer 0 pass 0 get] extension /my-peer set + %% 0 means connect from only localhost. + /arg1 my-peer def + ] pop + popVariables + arg1 +} def - /exhausted 0 def - % clear the busy flag. - /busy [1 1 enginesN { pop 0 } for ] def - (date) system - {{ - exhausted 0 eq { - 0 1 enginesN 1 sub { - /i set - busy i get 0 eq { - getPair /p set - p 0 get -1 eq {/exhausted 1 def exit} { } ifelse - busy i 1 put - engines i get p oxsendcmo - engines i get ( computesp ) oxsubmit - engines i get oxpopcmo1 - } { } ifelse - } for - } { } ifelse - dist.debug { (busy=) messagen busy message } { } ifelse - busy sumUp 0 eq { result message exit error } { } ifelse - [(oxMultiSelect) engines -1] extension /status set - /datastatus status 1 get def - dist.debug { (datastatus=) messagen datastatus message } { } ifelse - 0 1 enginesN 1 sub { - /i set - datastatus i get 1 eq { - engines i get oxpopcmo2 /ans set - busy i 0 put - result ans append /result set - } { } ifelse - } for - } loop } timer - (date) system - (result is in result) message - (Number of s-pairs checked is ) messagen result length message +/oxrpc2 { + /arg2 set + /arg1 set + [/in-oxrpc2 /pid /n /comm /i] pushVariables + [ + /pid arg1 def + /comm arg2 def + /n comm length def + n 1 sub -1 1 { + /i set + pid comm i get oxsendcmo + } for + pid n 1 sub oxsendcmo + pid comm 0 get oxexec + ] pop + popVariables } def -ox.verbose { - (dist for experiments for distributed computing. cf. startengines) message -} { } ifelse +[(oxrpc2) + [(Remote procedure call by using oxexec) + (client [function-name arg1 arg2 ...] oxrpc2 ) + (cf. ox-cmo-rpc in Risa/Asir) + (Example: ) + $ (oxasir.sm1) run (x^2-1). fctr $ + (oxasir.ccc [(igcd) (6).. (10)..] oxrpc2) + (oxasir.ccc oxpopcmo :: ) + ] +] putUsages /oxIsServerReady { /arg1 set @@ -527,188 +511,1457 @@ ox.verbose { arg1 } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Functions to start server by OX-RFC-101 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/sm1StartControl101 { + [/in-sm1connectr /pass /peer /data /control ] pushVariables + [ + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort1) (localhost)] extension def + /data peer 1 get toString def + peer message + [(/home/nobuki/OpenXM/src/oxc/oxc) + ( -c ) pass ( -h ) (localhost) ( -p ) data ( -x ) + oxpath.null + ( &)] cat system-csh -%%%%%%%%%%%%%%% tests -ox.verbose { - (test10 : test to read and write ox-data and ox-command to a file) message -} { } ifelse + [(oxCreateControl_RFC_101) peer 0 pass] extension /oxsm1.ccc set + %% 0 means connect from only localhost. + /ox.ccc oxsm1.ccc def + (The server is binded to the variable oxsm1.ccc) message-quiet + oxsm1.ccc + ] pop + popVariables +} def -/test10 { - [(oxCreateClientFile) (afo) (w)] extension /ccc set - [(oxWatch) ccc] extension - ccc (x-1). oxsendcmo - [(oxReq) ccc SM_executeStringByLocalParser - ( dup add message )] extension pop - ccc (quit) oxsendcmo +/sm1StartEngine101 { + [/in-sm1StartEngine101 /peer /data /control /engineID] pushVariables + [ + /peer [(oxGetPort1) (localhost)] extension def + /data peer 1 get def - [(oxCloseClient) ccc] extension + oxsm1.ccc data oxpushcmo + oxsm1.ccc (/home/nobuki/OpenXM/bin/ox_sm1) oxpushcmo + [(oxPushCMD) oxsm1.ccc SM_control_spawn_server] extension + oxsm1.ccc oxpopcmo /engineID set + [(oxCreateEngine_RFC_101) peer 0 (Empty) engineID] extension + /ox.ddd set + (The engine is binded to the variables ox.ddd) message-quiet + ] pop + popVariables + arg1 } def -/test11 { - [(oxCreateClientFile) (afo) (r)] extension /ccc set - [(oxGet) ccc] extension :: - [(oxGet) ccc] extension :: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Functions for OX-RFC 103 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +[(chattr) 0 /ctrlC-hook] extension +/ctrlC-hook { + ox103_reset } def +/ox103_disable { + [(chattr) 0 /ctrlC-hook] extension + /ctrlC-hook { } def +} def -ox.verbose { - (test12 : ccc is the client. ff poly in Q ) message -} { } ifelse -/test12 { - [(localhost) 1300 1200] oxconnect /ccc set - [(x,y,z) ring_of_differential_operators ( ) elimination_order 0] define_ring - (x+y). /ff set - /eee (hello) (error) dc def - /eee0 eee (error) dc def - (eee is the CMO_ERROR2 object [CMO_ERROR2 hello], eee0 is the CMO_ERROR object) message +[(ox103_reset) + [(ox103_reset broadcasts the OX reset to all processes) + (cf. ctrlC-hook, register_hander) +]] putUsages +/ox103_reset { + [/in-ox103_reset /L /n /i] pushVariables + [ + /L [(oxGetClientList)] extension def + (In ox103_reset...) message + (killall in oxshell...) message [(killall)] oxshell pop + /n L length def + 0 1 n 1 sub { + /i set + L i get oxreset + } for + (Done) message + ] pop + popVariables } def +%%%%%%% +/ox103_asir_init { + /arg1 set + [/ttt] pushVariables + [ + /ttt arg1 def + %% ttt oxsetmathcap ttt oxmathcap %% It is done in asir.init + %% Do nothing special for now. + ] pop + popVariables +} def +/ox103_sm1_init { + /arg1 set + [/ttt] pushVariables + [ + /ttt arg1 def + ttt oxsetmathcap + ttt oxmathcap + ttt ([(parse) (oxrfc103.sm1) pushfile] extension ) oxsubmit + ] pop + popVariables +} def +%%% + +/Xm_rfc103_shared [ ] def + +[(ox103_set_shared_variable) + [(value name 2 ox103_set_shared_variable) + (It broadcasts the <> of a shared variable <>) + (to all processes.) + (cf. Xm_rfc103_shared, ) + $Example: (2).. (hoge) 2 ox103_set_shared_variable$ +]] putUsages +/ox103_set_shared_variable { + /arg0 set %% Dummy to be called by rpc2. Number of args + /arg1 set %% Name + /arg2 set %% Value, [Name Value] not [Value Name] + [/in-ox103_set_shared_variable /Name /Value + /Found /N /i /L + ] pushVariables + [ + /Name arg1 def + /Value arg2 def + Value message + /Found 0 def + /N Xm_rfc103_shared length def + 0 1 N 1 sub { + /i set + Xm_rfc103_shared i get 0 get + Name eq { + Xm_rfc103_shared i [Name Value] put + /Found 1 def + exit + } { } ifelse + } for + Found 1 eq { } + { + Xm_rfc103_shared [Name Value] append + /Xm_rfc103_shared set + } ifelse + /L [(oxGetClientList)] extension def + 0 1 L length 1 sub { + /i set + L i get [(ox103_set_shared_variable) Name Value] oxrpc2 + } for + + (ox103_set_shared_variable: Xm_rfc103_shared=) message + Xm_rfc103_shared message + %% [(parse) [(/) Name ( ) Value toString ( def )] cat] extension + %% Add $ $ when Value is a string. + + /arg1 [Name Value] def + ] pop + popVariables + arg1 +} def + +/ox103_test { + (x^2-1). fctr + oxasir.ccc ( sm1_start(); ) oxexecutestring + sm1connectr +} def + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%% Starting ox_sm1. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /sm1connectr { [/in-sm1connectr /pass /peer /data /control ] pushVariables [ - /pass [(oxGenPass)] extension def + [(getServerEnv) (bin/ox_sm1)] extension tag 0 eq { + (Server bin/ox_sm1 is not found.) error + }{ } ifelse + /pass ox_encrypt_104_genPass def /peer [(oxGetPort) (localhost)] extension def /data peer 1 get toString def /control peer 3 get toString def - peer message - [oxpath.oxlog.xterm oxpath.ox ( -reverse -ox ) oxpath.oxsm1 - ( -data ) data ( -control ) control ( -pass ) pass + peer message-quiet + [ + oxstart100 + @@@.quiet { ( -quiet ) } { } ifelse + Xm_noX { ( -nox ) } { } ifelse + Xm_engineLogToStdout { ( -nox -engineLogToStdout ) } { } ifelse %bug.onlyForsm1 + ( -oxserver bin/ox_sm1 -e ) ( -reverse ) + ( -data ) data ( -control ) control pass [1 2] get + ( )] cat execve + [(oxCreateClient2) peer 0 pass 0 get] extension /oxsm1.ccc set + %% 0 means connect from only localhost. + (The server is binded to the variable oxsm1.ccc) message-quiet + /ox.ccc oxsm1.ccc def + oxsm1.ccc.init + oxsm1.ccc + ] pop + popVariables +} def + +/oxsm1.ccc.init { + oxsm1.ccc ( [(oxPrintMessage) 0] extension pop ) oxsubmit + Xm_noX { oxsm1.ccc ( /@@@.Xm_noX 1 def ) oxsubmit } + { oxsm1.ccc ( /@@@.Xm_noX 0 def ) oxsubmit } ifelse + (Ox103_loaded) boundp + { oxsm1.ccc ox103_sm1_init } + { } ifelse +} def + +/sm1connectr-ssh { +%% It has not yet implemented. + /arg1 set + [/in-sm1connectr /pass /peer /data /control /name /machine + /your-peer /comm + ] pushVariables + [ + /machine arg1 0 get def + /name arg1 1 get def + + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) myhostname-ssh] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message-quiet + [(ssh -f ) machine ( -l ) name ( ") + oxpath.oxlog.xterm-ssh oxpath.ox-ssh ( -reverse -ox ) oxpath.oxsm1-ssh + ( -host ) myhostname-ssh + ( -data ) data ( -control ) control pass [1 2] get oxpath.null - ( &)] cat system - [(oxCreateClient2) peer 0 pass] extension /ox.ccc set + ( ") + ] cat /comm set + (Executing the command : ) messagen comm message message + comm system + (sleep 5) system-csh + [(oxCreateClient2) peer 1 pass 0 get] extension /your-peer set + /arg1 your-peer def + ] pop + popVariables + arg1 +} def +[(sm1connectr-ssh) +[([hostname login-name] sm1connectr-ssh client) + (Starting oxpath.oxsm1-ssh by the launcher oxpath.ox-ssh on the "hostname".) + (cf. oxNoX ) + (Set the following varialbes to appropriate values:) + (oxpath.oxlog.xterm-ssh oxpath.oxsm1-ssh oxpath.ox-ssh myhostname-ssh ) + $Example 1: $ + $ *** Path names on the remote machine dc1.math.kobe-u.ac.jp $ + $ /oxpath.oxlog.xterm-ssh (/home/taka/OpenXM/bin/oxlog /usr/X11R6/bin/xterm -icon -e ) def $ + $ /oxpath.oxsm1-ssh (/home/taka/OpenXM/bin/ox_sm1) def $ + $ /oxpath.ox-ssh (/home/taka/OpenXM/bin/ox) def $ + $ *** The machine name on which you are running sm1. $ + $ /myhostname-ssh (yama.math.kobe-u.ac.jp) def $ + $ [(dc1.math.kobe-u.ac.jp) (taka)] sm1connectr-ssh /ox.ccc set $ + $Example 2: $ + $ *** Path names on the remote machine dc2.math.kobe-u.ac.jp $ + $ *** We will not use X11 debug windows. $ + $ oxNoX $ + $ /oxpath.oxlog.xterm-ssh (/home/taka/OpenXM/bin/oxlog ) def $ + $ /oxpath.oxsm1-ssh (/home/taka/OpenXM/bin/ox_sm1) def $ + $ /oxpath.ox-ssh (/home/taka/OpenXM/bin/ox) def $ + $ *** the machine name on which you are running sm1. $ + $ /myhostname-ssh (dc1.math.kobe-u.ac.jp) def $ + $ [(dc2.math.kobe-u.ac.jp) (taka)] sm1connectr-ssh /ox.ccc set $ +]] putUsages + +%%% ntl +/ntlconnectr { + [/in-ntlconnectr /pass /peer /data /control ] pushVariables + [ + [(getServerEnv) (bin/ox_ntl)] extension tag 0 eq { + (Server bin/ox_ntl is not found.) error + }{ } ifelse + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) (localhost)] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message-quiet + [ + oxstart100 + Xm_noX { ( -nox ) } { } ifelse + ( -oxserver bin/ox_ntl -e ) ( -reverse ) + ( -data ) data ( -control ) control pass [1 2] get + ( )] cat execve + [(oxCreateClient2) peer 0 pass 0 get] extension /oxntl.ccc set %% 0 means connect from only localhost. - (The server is binded to the variable ox.ccc) message - ox.ccc.init + (The server is binded to the variable oxntl.ccc) message-quiet +% oxntl.ccc.init + oxntl.ccc ] pop popVariables } def -/addSlash { +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Aux functions for ox_asir +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/ox_asirConnectMethod { asirconnectr /oxasir.ccc set } def +/oxasir.loadmethod 1 def %% "..." oxsendcmo (load) ox... +/oxasir.verbose 0 def +/oxasir.ccc load isArray +{ } +{ /oxasir.ccc [ ] def } ifelse +/loadAsirFile { /arg1 set - [/in-addSlash /ss /aaa /ans] pushVariables + [/in-loadAsirFile /peer /fname] pushVariables [ - /ss arg1 def - ss (array) dc /aaa set - aaa length 0 eq { - /ans (/) def + /peer arg1 0 get def + /fname arg1 1 get def + oxasir.loadmethod { + peer fname oxsendcmo peer 1 oxsendcmo + peer (load) oxexec }{ - aaa aaa length 1 sub get 47 eq %% The last equals / ? - { - /ans ss def + peer [$load("$ fname $");$] cat oxsubmit + }ifelse + ] pop + popVariables +} def +[(loadAsirFile) +[$[client fname] loadAsirFile (ox_asir function)$ + $Load a file into the client$ +]] putUsages + +/set_oxasir.rr_path { + [(ostype)] extension 0 get (windows) eq { + [(getenv) (OSTYPE)] extension tag 0 eq { + /oxasir.rr.name (oxasir-win.rr) def + }{ + [(getenv) (OSTYPE)] extension (cygwin) eq { + /oxasir.rr.name (oxasir.asir) def + }{ + /oxasir.rr.name (oxasir-win.rr) def + } ifelse + } ifelse + }{ + /oxasir.rr.name (oxasir.asir) def + } ifelse +} def +set_oxasir.rr_path +/oxasirpath.asirlib [[(getenv) (OpenXM_HOME)] extension + (/lib/sm1/) oxasir.rr.name] cat def +oxasir.verbose { + oxasirpath.asirlib message +} { } ifelse + +%% Note. oxasir.asir is under OpenXM/src/kan96xx/lib/ +%% oxasir-win.asir is generated under OpenXM/misc/packages/Windows +%% They are installed under $OpenXM_HOME/lib/sm1 +%% Todo: ox_asir has to understand /cygdrive/c/... on windows-native. +%% Since ox_asir is generated by cygwin, it will be OK. +/asir.init { + %% gr and primdec are loaded by .asirrc + /asir.init.peer set + [(ostype)] extension 0 get (windows) eq { + [(getenv) (OSTYPE)] extension tag 0 eq { + [asir.init.peer (oxasir-win.rr)] oxasirParseFile + }{ + [(getenv) (OSTYPE)] extension (cygwin) eq { + [asir.init.peer oxasirpath.asirlib] loadAsirFile + }{ + [asir.init.peer (oxasir-win.rr)] oxasirParseFile + } ifelse + } ifelse + }{ + [asir.init.peer oxasirpath.asirlib] loadAsirFile + } ifelse + asir.init.peer oxmathcap + asir.init.peer oxsetmathcap + Xm_noX { + asir.init.peer (Xm_noX=1;) oxsubmit + }{ + asir.init.peer (Xm_noX=0;) oxsubmit + } ifelse + (Ox103_loaded) boundp + { + asir.init.peer ox103_asir_init + }{ } ifelse +} def + +[(asir) + [(pid [asir-command, asir-arg1, asir-arg2, ...] asir result (ox_asir function)) + (Call open asir server. You need to install ox_asir on your system) + (to use this function. cf. primadec, fctr, asirconnect2, asirconnectr.) + (If you interrupted the computation by typing ctrl-C, type in ) + ( oxasir.ccc oxreset ; ) + (to interrupt the ox_asir server.) + (NOTE: all asir-args must belong to the same ring. cf.oxasir.changeRing. ) + (Example: oxasir.ccc [(fctr) (x^10-1).] asir ) + ( ) + (This function requires plugins cmo, socket and ox_asir server. cf. oxasir) + (See, http://www.math.kobe-u.ac.jp/Asir on asir) + ] +] putUsages + +/asir { + /arg2 set + /arg1 set + [/pid /asir-comm /comm /n /i /rr] pushVariables + [(CurrentRingp)] pushEnv + [ + /pid arg1 def + /asir-comm arg2 def + pid tag 6 eq { } { (Invalid pid. See asir.) error } ifelse + pid 0 get (client) eq { } { (Invalid pid. See asir.) error } ifelse + asir-comm tag 6 eq { } { (Invalid argument asir-comm. See asir) error } ifelse + + [ %% Change the current ring if necessary to send a correct OxVlist. + asir-comm oxasir.changeRing + ] pop + %%% Setting OxVlist to tell asir a way to change dist-poly <==> poly. + (OxVlist=) getVlist2 toString (;) 3 cat_n /comm set + %% comm message + pid comm oxsubmit + pid (print(OxVlist);) oxsubmit + + + /n asir-comm length def + n 1 sub -1 1 { + /i set + pid asir-comm i get oxsendcmo + pid 1 oxsendcmo pid (ox_dtop) oxexec + } for + pid n 1 sub oxsendcmo + pid asir-comm 0 get oxexec + + pid 1 oxsendcmo pid (ox_ptod) oxexec + pid oxpopcmo /arg1 set + + + ] pop + popEnv + popVariables + arg1 +} def + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Mathematical functions for asir +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/oxasir.changeRing { + /oxasir.changeRing.rr.prev 0 def + oxasir.changeRing2 +} def +/oxasir.changeRing2 { + /arg1 set + [/in-oxasir.changeRing2 /f /rr ] pushVariables + [ + /f arg1 def + f isArray { + f {oxasir.changeRing2} map + }{ + f isPolynomial { + f (0). eq { } + { f (ring) dc /rr set [(CurrentRingp) rr] system_variable + oxasir.changeRing.rr.prev tag 1 eq { } + { + oxasir.changeRing.rr.prev rr eq { } + { (asir : arguments must belong to the same ring.) error } ifelse + } ifelse + /oxasir.changeRing.rr.prev rr def + } ifelse + } { } ifelse + } ifelse + ] pop + popVariables +} def + +/fctr { + /arg1 set + [/f /comm /vv] pushVariables + [(CurrentRingp)] pushEnv + [ + /f arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + f isPolynomial not { + /vv f 1 get def + vv isArray { /vv vv from_records def } { } ifelse + /f f 0 get def + [vv ring_of_polynomials 0] define_ring + f . /f set + }{ } ifelse + oxasir.ccc [(fctr) f] asir /arg1 set + ] pop + popEnv + popVariables + arg1 +} def + +[(fctr) + [(You need to install ox_asir server to use this function. (ox_asir function)) + (f fctr g) + (poly f; array g;) + ([f v] fctr g ; string f, string or array of string v) + (This function factors the polynomial f over Q.) + ( ) + (Example 1: [(x^10-y^10) (x,y)] fctr ::) + (Example 2: (x^10-1). fctr ::) + ( ) + (If you interrupted the computation by typing ctrl-C, type in ) + ( oxasir.ccc oxreset ; ) + (to interrupt the ox_asir server.) + ( ) + (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) +]] putUsages + + +[(primadec) + [(You need to install ox_asir server to use this function. (ox_asir function)) + ([ ii ] primadec [[q1 p1] [q2 p2] ... ] ) + ( array of poly ii; array of poly q1, p1, q2, p2 ...;) + ( q1, q2, ... are primary components of the primary ideal decomposition) + ( of the ideal generated by << ii >>.) + ( ) + ([ ii v ] primadec [[q1 p1] [q2 p2] ... ] ) + ( array of poly or string ii; array of string v; array of poly q1, p1, q2, p2 ...;) + (<< v >> is an array of independent variables.) + ( ) + ([ ii v ] primadec [[q1 p1] [q2 p2] ... ] ) + ( array of poly or string ii; array of string v; array of poly q1, p1, q2, p2 ...;) + ( v is a string of variables separated by , ) + ( ) + (Example: [(x,y) ring_of_polynomials 0] define_ring) + ( [ [(x^2-1). (x y).] ] primadec pmat ;) + ( ) + (Example: [ [(x^2-1) (x y)] [(x) (y)]] primadec pmat ;) + ( ) + (If you interrupted the computation by typing ctrl-C, type in ) + ( oxasir.ccc oxreset ; ) + (to interrupt the ox_asir server.) + ( ) + (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) +]] putUsages + +/primadec { + /arg1 set + [/in-primadec /aa /f /comm /vvv /r /setarg] pushVariables + [(CurrentRingp)] pushEnv + [ + /aa arg1 def + aa isArray { } { (<> primadec) error } ifelse + /setarg 0 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + aa { tag } map /typev set + typev [ ArrayP ] eq + { /f aa 0 get def + f 0 get (ring) dc /r set + [(CurrentRingp) r] system_variable + /vvv getVariableNames def + /setarg 1 def + } { } ifelse + typev [ArrayP StringP] eq + { /f aa 0 get def + /vvv [ aa 1 get to_records pop ] def + /setarg 1 def + } { } ifelse + typev [ArrayP ArrayP] eq + { /f aa 0 get def + /vvv aa 1 get {toString} map def + /setarg 1 def + } { } ifelse + setarg { } { (primadec : Argument mismatch) error } ifelse + + f 0 get isPolynomial { + /r f 0 get (ring) dc def + /vvv vvv { r __ } map def + } + { + [vvv from_records ring_of_polynomials 0] define_ring + f { toString . } map /f set + vvv { . } map /vvv set + } ifelse + oxasir.ccc [(primadec) f vvv] asir /arg1 set + ] pop + popEnv + popVariables + arg1 +} def + + +/getVlist2 { + [/n /i ] pushVariables + [ + /n [(N)] system_variable def + [ + 0 1 n 1 sub { /i set (x) i (dollar) dc 2 cat_n } for + 0 1 n 1 sub { /i set (d) i (dollar) dc 2 cat_n } for + ] /arg1 set + ] pop + popVariables + arg1 +} def + +%%%%%%%%%%%%%%%%%%% +/getVlist { + [/n /i ] pushVariables + [ + /n [(N)] system_variable def + [ + 0 1 n 1 sub { /i set [(x) (var) i] system_variable } for + 0 1 n 1 sub { /i set [(D) (var) i] system_variable } for + ] /arg1 set + ] pop + popVariables + arg1 +} def + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/polygcd { + /arg1 set + [/pp /f /g /comm /vv] pushVariables + [(CurrentRingp)] pushEnv + [ + /pp arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + pp isArray { + /f pp 0 get def + /g pp 1 get def + pp length 3 eq { + /vv pp 2 get def + vv isArray { /vv vv from_records def } { } ifelse + [vv ring_of_polynomials 0] define_ring + f . /f set + g . /g set + } { } ifelse + }{ (usage: [f g] polygcd) error } ifelse + oxasir.ccc [(gcd) f g] asir /arg1 set + ] pop + popEnv + popVariables + arg1 +} def +[(polygcd) + [( [f g] polygcd r ) + ( [f g v] polygcd r) + (Example: [(x^2-1) (x-1) [(x)]] polygcd ) + ] +] putUsages +/polylcm { + /arg1 set + [/pp /f /g /comm /vv] pushVariables + [(CurrentRingp)] pushEnv + [ + /pp arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + pp isArray { + /f pp 0 get def + /g pp 1 get def + pp length 3 eq { + /vv pp 2 get def + vv isArray { /vv vv from_records def } { } ifelse + [vv ring_of_polynomials 0] define_ring + f . /f set + g . /g set + } { } ifelse + }{ (usage: [f g] polylcm) error } ifelse + oxasir.ccc [(lcm) f g] asir /arg1 set + ] pop + popEnv + popVariables + arg1 +} def +[(polylcm) + [( [f g] polylcm r ) + ( [f g v] polylcm r) + (Example: [(x^2-1) (x-1) [(x)]] polylcm ) + ] +] putUsages + +/asir_red { + /arg1 set + [/pp /f /g /rr /vv] pushVariables + [(CurrentRingp)] pushEnv + [ + /pp arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + { + pp isRational { + /f pp numerator def + /g pp denominator def + [[f g]] reduceByAsir /rr set + }{ } ifelse + exit + + pp isArray { + /vv pp 2 get def + /f pp 0 get 0 get def + /g pp 0 get 1 get def + [[f toString g toString] vv] reduceByAsir /rr set + } { } ifelse + exit + + (asir_red: not implemented) error exit + } loop + + rr 1 get isPolynomial { + rr 0 get rr 1 get div /rr set + }{ + rr 1 get (1).. eq { + rr 0 get /rr set }{ - /ans [ss (/)] cat def + rr 0 get rr 1 get div /rr set } ifelse } ifelse + + /arg1 rr def + ] pop + popEnv + popVariables + arg1 +} def +[(asir_red) + [(Calling the function red of asir. It simplifies a rational function.) + (cf. cancel) + (Example: (x^2). (x). div asir_red ) +]] putUsages + +/asir_fctr { fctr } def +[(asir_fctr) + [(Calling the factorizer of asir.) +]] putUsages + +/asir_primadec { primadec } def +[(asir_primadec) + [(Calling the primadec of asir.) +]] putUsages + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +[(chattr) 0 /findIntegralRoots] extension pop +/findIntegralRoots { + /arg1 set + [/in-findIntegralRoots /pp ] pushVariables + [ + /pp arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + oxasir.ccc oxIsServerReady + { pp findIntegralRoots.oxasir /arg1 set} + { pp findIntegralRoots.slow /arg1 set} ifelse + ] pop + popVariables + arg1 +} def + +/findIntegralRoots.oxasir { + /arg1 set + [/in-findIntegralRoots /f /r /g /aa /rlist] pushVariables + [(CurrentRingp) (KanGBmessage)] pushEnv + [ + /f arg1 def + [(s) ring_of_polynomials 0] define_ring + f toString . /f set + f fctr rest /g set + g { + 0 get /aa set + aa (s). degree 1 eq { + aa (s). coeff 1 get /aa set + aa length 1 eq { 0 } + { aa 0 get (1). eq { + 0 << aa 1 get (integer) dc >> sub + } { } ifelse + } ifelse + }{ } ifelse + } map + /rlist set + %% rlist :: + [-1000000] rlist join shell rest /arg1 set + ] pop + popEnv + popVariables + arg1 +} def + +%%%%%%%%%%%%% From gbhg3/Int/intw.sm1 +%% This function needs solv1.asir and ox_asir. +%% See solv1.asir for the usage of this function. +/rationalRoots2 { + /arg1 set + [/in-rationalRoots2 /aa /f /comm /vvv /r /setarg + /w /ans + ] pushVariables + [(CurrentRingp) (KanGBmessage)] pushEnv + [ + /aa arg1 def + aa isArray { } { (<> rationalRoots2) error } ifelse + /setarg 0 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + aa { tag } map /typev set + typev [ArrayP StringP ArrayP] eq + { /f aa 0 get def + /vvv [ aa 1 get to_records pop ] def + /w aa 2 get def + /setarg 1 def + } { } ifelse + typev [ArrayP ArrayP ArrayP] eq + { /f aa 0 get def + /vvv aa 1 get {toString} map def + /setarg 1 def + /w aa 2 get def + } { } ifelse + setarg { } { (rationalRoots2 : Argument mismatch) error } ifelse + + + [vvv from_records ring_of_polynomials 0] define_ring + f { toString . } map /f set + vvv { . } map /vvv set + w { toString . } map /w set + + (rationalRoots2 -- f = ) messagen f messagen + ( , vvv= ) messagen vvv messagen ( , w = ) messagen w message + + vvv length 1 eq w 0 get (1). eq and + { + [(KanGBmessage) 0] system_variable + [f] groebner_sugar 0 get /f set + vvv 0 get toString (s) eq { + }{ [[vvv 0 get toString (s)] from_records ring_of_polynomials 0] define_ring} + ifelse + f 0 get toString . [[vvv 0 get toString . (s).]] replace + findIntegralRoots /ans set + } + { + oxasir.ccc [(sm1_rationalRoots2) f vvv w] asir + {(integer) dc} map + /ans set + } ifelse + /arg1 ans def ] pop - arg1 + popEnv + popVariables + arg1 } def +[(rationalRoots2) +[(rationalRoots2 (ox_asir function) called from intw.sm1 to analyze integral) + (roots.) +]] putUsages -/getPathNameSm1 { +/ptozp_subst { /arg1 set - [/in-getPathNameSm1 /fname /fullname /tname] pushVariables + [/in-ptozp_subst /aaa /fff /xxx /vvv /vlist] pushVariables + [(CurrentRingp)] pushEnv [ - /fname arg1 0 get def - %% If fullname is given, use it. - fname (array) dc 0 get - (/) (array) dc 0 get eq - { /fullname fname def - /getPathNameSm1.LLL goto - } { } ifelse + /aaa arg1 def + /fff aaa 0 get def + /xxx aaa 1 get toString def + /vvv aaa 2 get {toString ..} map def + aaa length 4 eq { + /vlist aaa 3 get def + } { + /vlist 0 def + } ifelse + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + fff isPolynomial { + fff (ring) dc ring_def + fff toString /fff set + } + { vlist isInteger { (ptozp_subst: need variable names.) error } { } ifelse + [vlist ring_of_differential_operators 0] define_ring + } ifelse + oxasir.ccc [(sm1_ptozp_subst) fff . xxx . vvv] asir + /arg1 set + ] pop + popEnv + popVariables + arg1 +} def - %% Else first try to find it in LOAD_SM1_PATH - [(getenv) (LOAD_SM1_PATH)] extension /tname set - tname isString - { - tname addSlash /tname set - [(stat) [tname fname] cat] extension - 0 get isInteger %% The file was found. - { /fullname [tname fname] cat def - /getPathNameSm1.LLL goto - } { } ifelse +[(ptozp_subst) + [$[f s [p q] v] ptozp_subst g (ox_asir function)$ + $It returns ptozp(subst(f,s,p/q))$ + $Example 1: [ (x Dx - s) (s) [2 3] (x,s)] ptozp_subst $ + $ ===> 3 x Dx - 2 $ +]] putUsages + +/reduceByAsir { + /arg1 set + [/in-reduceByAsir /aaa /fff /fff0 /fff1 /vlist] pushVariables + [(CurrentRingp)] pushEnv + [ + /aaa arg1 def + /fff aaa 0 get def + aaa length 2 eq { + /vlist aaa 1 get def + } { + /vlist 0 def + } ifelse + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod } { } ifelse + fff isArray { + fff length 2 eq { + /fff0 fff 0 get def + /fff1 fff 1 get def + } { + ([ << [f g] >> vlist ] reduceByAsir ) error + } ifelse + } { + ([ << [f g] >> vlist ] reduceByAsir ) error + } ifelse + fff0 isPolynomial fff1 isPolynomial and { + fff0 (ring) dc ring_def + fff0 toString . /fff0 set + fff1 (ring) dc ring_def + fff1 toString . /fff1 set + } + { vlist isInteger { (reduceByAsir: need variable names.) error } { } ifelse + [vlist ring_of_differential_operators 0] define_ring + fff0 toString . /fff0 set + fff1 toString . /fff1 set + } ifelse + oxasir.ccc [(sm1_rat2plist2) [fff0 fff1]] asir + /arg1 set + ] pop + popEnv + popVariables + arg1 +} def - %% Else try to find it in /usr/local/lib/sm1 - [(stat) [(/usr/local/lib/sm1/) fname] cat] extension - 0 get isInteger %% The file was found. - { /fullname [(/usr/local/lib/sm1/) fname] cat def - /getPathNameSm1.LLL goto - } { } ifelse +[(reduceByAsir) +[$ [[f g] v] reduceByAsir [ff gg] (ox_asir function)$ + $ [[f g]] reduceByAsir [ff gg] $ + $Example 1: [[(2 x -2) (4 x - 8)] (x)] reduceByAsir $ + (Note that there may be a gcd that is more than 1 among the coefficients.) +]] putUsages - %% Otherwise error. - [(getPathNameSm1: The file ) fname - ( could not be found ) - (neigher in LOAD_SM1_PATH=) - [(getenv) (LOAD_SM1_PATH)] extension - ( nor in /usr/local/lib/sm1) - ] cat /getPathNameSm1.errorMessage set - getPathNameSm1.errorMessage message - ] pop popVariables getPathNameSm1.errorMessage error +%% File should be preprocessed by OpenXM/misc/packages/Windows/oxpp +%% and ./oxapp --removeSharp +[(oxasirParseFile) +[$[peer filename] oxasirParseFile $ + $File should be preprocessed by OpenXM/misc/packages/Windows/oxpp$ + $and ./oxapp --removeSharp $ +]] putUsages - /getPathNameSm1.LLL - /arg1 fullname def +/oxasirParseFile { + /arg1 set + [/in-oxasirParseFile /fname /sss] pushVariables + [ + /fname arg1 1 get def + /peer arg1 0 get def + fname pushfile /sss set + peer + [$if (1) { ; $ sss (}$)] cat + oxsubmit ] pop popVariables +} def + +[(bfct) + [ + ( f bfct b ) + ( poly f; poly b) + ([f v] bfct b) + ( string f ) + ( b is the global b-function of the polynomial f.) + (Example: [(x^3-y^2) (x,y)] bfct fctr :: ) + (Algorithm: M.Noro, Mathematical Software, icms 2002, pp.147--157.) + ( ) + (If you interrupted the computation by typing ctrl-C, type in ) + ( oxasir.ccc oxreset ; ) + (to interrupt the ox_asir server.) + ( ) + (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) + (You need to install ox_asir server to use this function. (ox_asir function)) +]] putUsages + +/bfct { + /arg1 set + [/in-bfct /f /comm /vv] pushVariables + [(CurrentRingp)] pushEnv + [ + /f arg1 def + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + f isPolynomial not { + /vv f 1 get def + vv isArray { /vv vv from_records def } { } ifelse + /f f 0 get def + [vv ring_of_polynomials 0] define_ring + f . /f set + }{ } ifelse + oxasir.ccc [(oxasir_bfct) f] asir /f set + [(s) ring_of_polynomials 0] define_ring + f . /f set + [f f fctr] /arg1 set + ] pop + popEnv + popVariables arg1 } def -[(getPathNameSm1) -[([fname] getPathNameSm1 fullname) - (string fname, fullname) - (This command searches the fname in /usr/local/lib/sm1 and LOAD_SM1_PATH) - (and returns the fullname.) + +[(generic_bfct) + [ + ( [ii weight] generic_bfct b ) + ( list of poly ii; list weight) + ([ii weight variables] generic_bfct b) + ( list of string ii; list weight; list variables) + ( b is the general b-function of the ideal ii w.r.t the weight.) + (Example: [[(Dx^2) (Dy^2)] [(x) -1 (Dx) 1] [(x) (y)]] generic_bfct :: ) + (Notion: Saito, Sturmfels, Takayama, Grobner deformations of hypergeometric differential equaitons) + (Algorithm: M.Noro, Mathematical Software, icms 2002, pp.147--157.) + ( ) + (If you interrupted the computation by typing ctrl-C, type in ) + ( oxasir.ccc oxreset ; ) + (to interrupt the ox_asir server.) + ( ) + (This function requires plugins cmo, socket and ox_asir server. cf.oxasir) + (You need to install ox_asir server to use this function. (ox_asir function)) ]] putUsages -/getPathNameAsir { +/generic_bfct { /arg1 set - [/in-getPathNameAsir /fname /fullname /tname] pushVariables + [/in-generic_bfct /aa /f /comm /vvv0 /n /vvv /ddd /r /setarg + /bf /wt ] pushVariables + [(CurrentRingp)] pushEnv [ - /fname arg1 0 get def - %% If fullname is given, use it. - fname (array) dc 0 get - (/) (array) dc 0 get eq - { /fullname fname def - /getPathNameAsir.LLL goto - } { } ifelse + /aa arg1 def + aa isArray { } { (<> generic_bfct) error } ifelse + /setarg 0 def + aa { tag } map /typev set + typev [ ArrayP ArrayP] eq + { /f aa 0 get def + f 0 tag PolyP { } { (The first argument must be a list of differential operators. Give the third variable: a list of variables) error } ifelse + f 0 get (ring) dc /r set + [(CurrentRingp) r] system_variable + /wt aa 1 get def - %% Else first try to find it in /usr/local/lib/asir - [(stat) [(/usr/local/lib/asir/) fname] cat] extension - 0 get isInteger %% The file was found. - { /fullname [(/usr/local/lib/asir/) fname] cat def - /getPathNameAsir.LLL goto - } { } ifelse + /vvv0 getVariableNames def + /n [(N)] system_variable def + /vvv vvv0 n carN rest reverse rest reverse def + /ddd vvv0 reverse n carN reverse + rest reverse rest reverse def - %% Else try to find it in ASIR_LIBDIR - [(getenv) (ASIR_LIBDIR)] extension /tname set - tname isString - { - [(stat) [tname (/) fname] cat] extension - 0 get isInteger %% The file was found. - { /fullname [tname (/) fname] cat def - /getPathNameAsir.LLL goto - } { } ifelse + /wt wt generic_bfct.aux1 def + + /setarg 1 def + } { } ifelse + typev [ArrayP ArrayP StringP] eq + { /f aa 0 get def + /vvv [ aa 2 get to_records pop ] def + /wt aa 1 get def + + /n vvv length def + /ddd vvv { (D) 2 1 roll 2 cat_n } map def + + /setarg 1 def + } { } ifelse + typev [ArrayP ArrayP ArrayP] eq + { /f aa 0 get def + /vvv aa 2 get {toString} map def + /wt aa 1 get def - } { } ifelse - - %% Otherwise error. - [ (getPathNameAsir: The file ) fname - ( could not be found ) - (neigher in /usr/local/lib/asir nor in ASIR_LIBDIR. ) - ] cat /getPathNameAsir.errorMessage set - getPathNameAsir.errorMessage message - ] pop popVariables getPathNameAsir.errorMessage error + /n vvv length def + /ddd vvv { (D) 2 1 roll 2 cat_n } map def - /getPathNameAsir.LLL - /arg1 fullname def + /setarg 1 def + } { } ifelse + setarg { } { (generic_bfct : Argument mismatch) error } ifelse + + f 0 get isPolynomial { + + } + { + [vvv from_records ring_of_differential_operators 0] define_ring + f { toString . } map /f set + vvv { . } map /vvv set + ddd { . } map /ddd set + /wt [vvv ddd wt] generic_bfct.aux1 def + } ifelse + [f vvv ddd wt] message + + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + oxasir.ccc [(oxasir_generic_bfct) f vvv ddd wt] asir /bf set + [(s) ring_of_polynomials 0] define_ring + bf . /bf set + [bf bf fctr] /arg1 set ] pop + popEnv popVariables arg1 } def -[(getPathNameAsir) -[([fname] getPathNameAsir fullname) - (string fname, fullname) - (This command searches the fname in /usr/local/lib/asir and ASIR_LIBDIR) - (and returns the fullname.) + +/generic_bfct.aux1 { + /arg1 set + [/in-generic_bfct.aux1 /ii /jj /wt /wtx /wtd /vv /dd /n] pushVariables + [ + arg1 2 get /wt set + arg1 0 get /vv set + arg1 1 get /dd set + /wtx [ 0 1 vv length 1 sub { pop (0).. } for ] def + /n wt length def + 0 2 n 1 sub { + /ii set + 0 1 vv length 1 sub { + /jj set + wt ii get toString dd jj get toString eq { + wtx jj << wt ii 1 add get >> put + } { } ifelse + } for + } for + + wtx /wt set + wt { dup tag IntegerP eq { (universalNumber) dc } { } ifelse } map /wt set + wt /arg1 set + ] pop + popVariables + arg1 +} def +/verbose.wgr 1 def +%[ ff vv ww ] asir.wgb [gb init] +/asir.wgr { + /arg1 set + [/in-asir.gb /ff /vv /ww /vvx /vvd /avv /comm /wvec /i] pushVariables + [ + /ff arg1 0 get def + /vv arg1 1 get def + /ww arg1 2 get def + + oxasir.ccc [ ] eq { + (Starting ox_asir server.) message + ox_asirConnectMethod + } { } ifelse + + vv isArray { + vv from_records /vv set + } { } ifelse + oxasir.ccc [(dp_gr_print) (2)..] asir + [vv to_records pop] /vvx set + vvx { toString (D) 2 1 roll 2 cat_n } map /vvd set + + [ + 0 1 vvx length 1 sub { + /i set + vvx i get + 0 ww i get sub + vvd i get + ww i get + } for + ] /wvec set + + [vv ring_of_differential_operators + [wvec] weight_vector + 0] define_ring + + ff { toString . dehomogenize homogenize } map /ff set + vvx { . } map /vvx set %%ex [x,y] + vvd { . } map /vvd set %%ex [Dx,Dy] + vvx vvd join [(h).] join /avv set + + verbose.wgr { + (Asir (-w,w) gb in the Weyl algebra) message + (wvec=) messagen wvec message + (ff=) messagen ff message + (avv=) messagen avv message + } { } ifelse + + [$dp_weyl_set_weight(newvect($ ww length toString $,$ + ww toString $));$ ] cat /comm set + + verbose.wgr { + comm message + } { } ifelse + + oxasir.ccc comm oxsubmit ; + + oxasir.ccc [(dp_weyl_gr_main) ff avv (0).. (1).. (11)..] asir + /arg1 set + ] pop + popVariables + arg1 +} def +[(asir.wgr) +[([ ff vv ww ] asir.wgr g) + $It computes the (-ww,ww) Grobner basis of ff in the homogenized Weyl algebra.$ + (Homogenization is automatically done.) + $Example 1: $ + $ [ [(x*Dx+y*Dy-1) (Dx*Dy)] $ + $ (x,y) $ + $ [1 2 ] ] asir.wgr $ ]] putUsages +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% functions to start ox_asir +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/asirconnectr { + [/in-asirconnectr /pass /peer /data /control /oxasir] pushVariables + [ + [(getServerEnv) (bin/ox_asir)] extension tag 0 eq { + (Server bin/ox_sm1 is not found.) error + }{ } ifelse + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) (localhost)] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message-quiet + [ + oxstart100 + @@@.quiet { ( -quiet ) } { } ifelse + Xm_noX { ( -nox ) } { } ifelse + Xm_engineLogToStdout { ( -nox -engineLogToStdout ) } { } ifelse %bug.onlyForasir + ( -oxserver bin/ox_asir -e ) ( -reverse ) + ( -data ) data ( -control ) control pass [1 2] get + ( )] cat execve + [(oxCreateClient2) peer 0 pass 0 get] extension /oxasir.ccc set + %% 0 means connect from only localhost. + oxasir.ccc asir.init + /arg1 oxasir.ccc def + ] pop + popVariables + arg1 +} def -initializePathNamesForOx %% This should be +[(asirconnectr) + [(asirconnectr server (ox_asir function)) + (array server;) + (Example: asirconnectr /oxasir.ccc set) +]] putUsages + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% functions to start ox_k0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/oxk0.ccc load isArray +{ } +{ /oxk0.ccc [ ] def } ifelse + +/ox.k0.init { + % oxk0.ccc ( Print("Hello!"); ) oxsubmit + Xm_noX { oxk0.ccc (Xm_noX=true;) oxsubmit } + { oxk0.ccc (Xm_noX=false;) oxsubmit } ifelse +} def + +/k0connectr { + [/in-k0connectr /pass /peer /data /control ] pushVariables + [ + [(getServerEnv) (bin/ox_k0)] extension tag 0 eq { + (Server bin/ox_sm1 is not found.) error + }{ } ifelse + + /pass ox_encrypt_104_genPass def + /peer [(oxGetPort) (localhost)] extension def + /data peer 1 get toString def + /control peer 3 get toString def + peer message-quiet + [ + oxstart100 + Xm_noX { ( -nox ) } { } ifelse + ( -oxserver bin/ox_k0 -e ) ( -reverse ) + ( -data ) data ( -control ) control pass [1 2] get + ( )] cat execve + [(oxCreateClient2) peer 0 pass 0 get] extension /oxk0.ccc set + %% 0 means connect from only localhost. + (The server is binded to the variable oxk0.ccc) message-quiet + ox.k0.init + /arg1 oxk0.ccc def + ] pop + popVariables + arg1 +} def +/@@@polymake.k0.ccc [ ] def + +/ox_server_mode { + /:: { } def % do nothing +} def + +%% Encryption methods +/ox_encrypt_104.NONE 0 def +/ox_encrypt_104.FILE 1 def +/ox_encrypt_104.RSA 2 def +/@@@.ox_encrypt_104.method ox_encrypt_104.NONE def +/ox_encrypt_104.1 { + /arg1 set + [/sss /rrr] pushVariables + [ + /sss arg1 def + sss toString /sss set + { + @@@.ox_encrypt_104.method ox_encrypt_104.NONE eq { + /rrr [sss] def + exit + } { } ifelse + (The encryption method has not yet been implemented.) error + } loop + /arg1 rrr def + ] pop + popVariables + arg1 +} def + +%< +% Usages: ox_encrypt_104_genPass +% [[ c-pass d-pass ] [c-pass-encrypted d-pass-encrypted ox-command-str ] ...] +%> +/ox_encrypt_104_genPass { + [/sss /p1 /p2 /e1 /e2 /rrr] pushVariables + [ + /r1 [(oxGenPass)] extension def + /r2 [(oxGenPass)] extension def + r1 ox_encrypt_104.1 /e1 set + r2 ox_encrypt_104.1 /e2 set + { + @@@.ox_encrypt_104.method ox_encrypt_104.NONE eq { + [( -passControl ) e1 0 get ( -passData ) e2 0 get ( )] cat /sss set + [[r1 r2] [e1 0 get , e2 0 get , sss]] /rrr set + exit + } { } ifelse + (The encryption method has not been implemented.) error + } loop + rrr /arg1 set + ] pop + popVariables + arg1 +} def + +[[(lines),[10,-1]], + [(where),[(shell), (length)]], + [(reason_of_error), (invalid argument)], + [(asir_where),[[(toplevel),10],[(string),(foo),3],[(string),(hoge),-1]] +] +/i1 set +%% /translateErrorForCfep.sampleInput set + +[(translateErrorForCfep) +[ + (translate the error packet defined in ox-rfc-103 into series of commands for cfep.) +] +] putUsages +/translateErrorForCfep { + /arg1 set + [/ee /ans /tt /lf /i /nn /ee.orig /tt2] pushVariables + [ + /ee arg1 def + { + ee etag 257 eq { + ee (body) dc 1 get /ee set ee /ee.orig set + ee length 3 gt { + ee 3 get /ee set + ee [[(reason_of_error) ee.orig 2 get toString ]] join /ee set + }{ + %% nn should be 2, [serial, common error no, short message] + ee length /nn set + nn 0 gt { + /ee [(reason_of_error) ee nn 1 sub get toString ] def + } { /ee [ ] def } ifelse + } ifelse + }{ } ifelse + ee etag 6 eq not { /ans [ ] def exit } { } ifelse + /ans [ ] def + /lf 12 (string) dc def % line feed. + ans [(Begin) nl lf] join /ans set + + ee (lines) getNode /tt set + tt tag 0 eq { + ee (parse_error_at) getNode /tt set + } { } ifelse + tt isArray { + tt length 0 gt { + ans + [(gotoLine, ) tt 0 get toString nl lf] join /ans set + }{ } ifelse + } { } ifelse + tt isInteger { + [(gotoLine, ) tt toString nl lf] join /ans set + } { } ifelse + + ee (where) getNode /tt set + tt isArray { + tt length 0 gt { + ans + [(findAndSelect, ) tt 0 get (string) dc nl lf] join /ans set + }{ } ifelse + 1 1, tt length 1 sub { + /i set + ans + [(findAndShow, ) tt i get (string) dc nl lf] join /ans set + } for + } { } ifelse + + ee (reason_of_error) getNode /tt set + tt tag 0 eq { + ee (reason_of_parse_error) getNode /tt set + } { } ifelse + tt tag 0 eq not { + ans [(printErrorMessage, ) + tt (string) dc localizedString % for translation. + nl lf] join /ans set + }{ } ifelse + +%% Keyword from asir. [(asir_where) [[(toplevel),3],[(string),(foo),3],[(filename),(func),4]]] + ee (asir_where) getNode /tt set + tt (toplevel) getNode /tt2 set + tt2 isInteger, tt2 tag 15 eq, or { + ans [(gotoLine, ) tt2 toString nl lf] join /ans set + } { } ifelse + tt isArray { + 0 1 tt length 1 sub { + /i set + tt i get /tt2 set + tt2 (string) getNode tag 0 eq { } + { + tt2 length 2 gt { + tt2 2 get /tt2 set + tt2 isInteger, tt2 tag 15 eq, or { + tt2 toString .. /tt2 set + tt2 (-1).. gt, tt2 (4294967295).. lt, and { + ans [(gotoLine, ) tt2 toString nl lf] join /ans set + } { } ifelse + } { } ifelse + }{ } ifelse + } ifelse + } for + }{ } ifelse + + exit + } loop + ans [(End) nl lf] join /ans set + ans cat /arg1 set + ] pop + popVariables + arg1 +} def + +/oxclearstack { + /arg1 set + [/cl /n] pushVariables + [ + /cl arg1 def + cl oxgetsp /n set + n tag 0 eq { /n 0 def } { } ifelse + n tag 15 eq { n (integer) dc /n set } { } ifelse + cl n oxpops + ] pop + popVariables +} def