=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/oxshell.oxw,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM/src/kan96xx/Doc/oxshell.oxw 2003/12/05 07:53:10 1.1 +++ OpenXM/src/kan96xx/Doc/oxshell.oxw 2003/12/08 05:35:32 1.2 @@ -1,4 +1,4 @@ -%%$OpenXM$ +%%$OpenXM: OpenXM/src/kan96xx/Doc/oxshell.oxw,v 1.1 2003/12/05 07:53:10 takayama Exp $ %% "make oxshell-ja.tex" to get the platex source. //&ja \documentclass{jarticle} //&en \documentclass{article} @@ -6,7 +6,7 @@ //&ja \title{Oxshell の設計と実装} //&en \title{The design and implementation of oxshell} //&C \author{Nobuki Takayama} -//&C \date{December 5, 2003} +//&C \date{December 8, 2003} //&C \newtheorem{example}{Example} \usepackage{html} @@ -113,24 +113,26 @@ FACETS //&ja \section{doPolymake の処理の流れ} -//&ja {\bf 以下はとりあえず要点のみ.} - /*&ja \begin{enumerate} \item (CMO tree を tfb/2 形式へ.) \item tfb/2 表現のデータを polymake の入力形式へ. + ({\tt OpenXM/src/k097/k0} の {\tt QuoteMode} を利用して CMO tree 形式へ. + それから sm1 の treeToPolymake extension を用いる. + ソースは, {\tt OpenXM/src/kan96xx/trans/tree2polymake.c}) \item polymake を {\tt oxshell} で呼び出す. -\item うけとった polymake 形式のデータを tfb/2 形式へ (polymake2tfb). + ({\tt OpenXM/src/kan96xx/trans/polymake.sm1}). +\item うけとった polymake 形式のデータを tfb/2 形式へ + ({\tt OpenXM/src/kan96xx/trans} の {\tt yy\_polymake.y} でパース. + polymake2tfb が変換用のバイナリ.) \item (tfb/2 形式を CMO tree へ.) \end{enumerate} -{\tt doPolymake} のソースは {\tt kan96xx/trans/polymake.sm1} にある. +{\tt doPolymake} のソースは \\ {\tt kan96xx/trans/polymake.sm1} にある. */ //&ja \section{{\tt Oxshell} の特徴} -//&ja {\bf 以下はとりあえず要点のみ.} - /*&ja \noindent OX RFC 100 にはファイルの概念がない. したがって, \\ \verb@ polymake ファイル名 動作 @ \\ @@ -140,20 +142,139 @@ FACETS /bin/sh の存在を仮定できる unix と /bin/sh の存在を仮定できない windows とかいろんな要素があり, プログラムが大変読みにくく保守もしにくい ( phc での経験). ZPG の極致である. + {\tt oxshell} ではこの仕事は次の 1 行で書く. \\ -\verb@ [(polymake) (stringInOut://スタックマシン変数名.poly) 動作] oxshell @ \\ +\verb@[(polymake) (stringInOut://スタックマシン変数名.poly) 動作] oxshell@\\ スタックマシンの変数をファイルをみなしている. -変数を input output stream とみなすというのは Java の class 等で -すでにつかわれているよく知られている工夫だがこれを採り入れることにより, + +このような考え方は, なにも新しいものではない. +文字列変数をファイルのように input output stream とみなすというのは Java の +io.StringReader ( io.InputStreamReader の代わり) 等で使われている. +またコマンドの実行結果を文字列として変数に代入する動作は, +たとえばスクリプト言語である Python では \verb@ x=os.popen("abc","r").read(); @ +として簡単に実行できる. +しかしながらこれらの考えを数学ソフトウエアの統合化のために使うための実装は存在していなかった. +これが oxshell コマンドの導入によって解決される点の一つである. +これらはよく知られている工夫だがこれを数学ソフトウエア統合作業に採り入れることにより, 考え方が整理されプログラムの保守性が大変よくなり, また新しいバッチ型アプリケーションの OX サーバ化が楽になった. {\tt oxshell} のその他のコマンドについては, sm1 で {\tt (oxshell) usage} の解説を見よ. +{\tt oxshell} のソースコードは {\tt OpenXM/src/kan96xx/Kan/shell.c}. 将来的には /bin/sh の拡張言語とする予定. OX RFC 100 にファイルの概念を加える作業は OX RFC 103 (100, 101 の補い) でやる予定. +*/ + +//&ja \section{Asir より使う oxshell } +//&en \section{Oxshell on asir} + +/*&ja +Asir から sm1/oxshell を利用するための関数は \\ +{\tt OpenXM/src/asir-contrib/packages/src/oxshell.rr} +にまとめられている. 次のコマンドでロードする. +*/ +/*&C +\begin{verbatim} +[1163]:= load("oxshell.rr"); +\end{verbatim} +*/ + +//&ja 幾つか例をみてみよう. +//&en Let us see some examples. + +/*&ja unix 上で次のコマンドの実行により {\tt ls} の stdout への出力が文字列として {\tt S} の +第一要素として, stderr への出力が文字列として {\tt S} の第2要素として格納される. +*/ +/*&C +\begin{verbatim} +[1164]:= S = oxshell.oxshell(["ls"]); +\end{verbatim} +*/ + +/*&ja +文字列 {\tt S} に格納された単語 dog, cat, lion を unix のツール sort で +並べ変えるには次のように書く. +入力は oxshell を実行しているスタックマシンの変数 {\tt S} に格納されている. +*/ +/*&C +\begin{verbatim} +[1163]:= S="dog\ncat\nlion\n"; +[1164]:= oxshell.set_value("S",S); +[1165]:= T=oxshell.oxshell(["sort","stringIn://S"]); +[cat +dog +lion +,] +\end{verbatim} +*/ + +/*&ja +{\tt OpenXM/src/asir-contrib/packages/src/taka\_ahg.rr} の +関数 {\tt taka\_ahg.b(A,Idx)} は oxshell による polymake 呼び出し機能を +用いた数学関数の実装例である. +この関数は 行列 {\tt A} に付随した 方向 {\tt Idx} のある $b$ 関数を計算する. +これは {\tt A} の定義する cone のファセットをあらわす一次式の積で表現されることが, +知られている +(Saito, Mutsumi; Sturmfels, Bernd; Takayama, Nobuki; Hypergeometric polynomials and integer programming. Compositio Math. 115 (1999), no. 2, 185--204 +および +Saito, Mutsumi; Parameter shift in normal generalized hypergeometric systems. Tohoku Math. J. (2) 44 (1992), no. 4, 523--534 +をみよ.) +*/ + +/*&C +\begin{verbatim} +[1163]:= load("oxshell.rr"); +[1164]:= load("taka_ahg.rr"); +[1165]:= A=[[1,0,0],[1,1,0],[1,0,1],[1,1,1],[1,2,0]]; +[1166]:= fctr(taka_ahg.b(A,4,[s1,s2,s3])); +[[1,1],[s1+2*s2,2],[s1+2*s2-1,1]] +\end{verbatim} +*/ + +/*&C +\begin{verbatim} +def b(A,Idx,V) { + F = oxshell.facets(A); /* Computing all the facets by polymake server.*/ + F = F[1]; /* F is the set of the facets */ + P = A[Idx]; + Nfacets = length(F); + F = toPrimitive(A,F); /* Translate into primitive supporting function */ + Bf = 1; + for (I=0; I