=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/documents/ox_math.tex,v retrieving revision 1.9 retrieving revision 1.10 diff -u -p -r1.9 -r1.10 --- OpenXM/src/ox_math/documents/ox_math.tex 2005/07/20 16:24:56 1.9 +++ OpenXM/src/ox_math/documents/ox_math.tex 2015/05/25 07:13:52 1.10 @@ -1,9 +1,9 @@ %#!platex -%% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.8 2005/07/19 15:58:37 ohara Exp $ +%% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.9 2005/07/20 16:24:56 ohara Exp $ \documentclass{jarticle} -\title{Mathematica の Open XM 化について -% \\ {\small --- Open Mathematica サーバの内部構成 ---} +\title{Mathematica $B$N(B Open XM $B2=$K$D$$$F(B +% \\ {\small --- Open Mathematica $B%5!<%P$NFbIt9=@.(B ---} } \date{ %January 19, 1999 @@ -11,93 +11,93 @@ November 25, 1999 (Revised July 20, 2005) } -\author{小原功任} +\author{$B>.868yG$(B} \def\oxmath{{\tt ox\_math}} \begin{document} \maketitle -\section{我々が提供するもの} +\section{$B2f!9$,Ds6!$9$k$b$N(B} -我々が提供するのは二つのプログラムとそのソースである。一つ目は -\oxmath プログラムであり、これは OpenXM サーバの一種である。二つ目は -{\tt math2ox} であり、OpenXM クライアントである。 +$B2f!9$,Ds6!$9$k$N$OFs$D$N%W%m%0%i%`$H$=$N%=!<%9$G$"$k!#0l$DL\$O(B +\oxmath $B%W%m%0%i%`$G$"$j!"$3$l$O(B OpenXM $B%5!<%P$N0l]$H$7$F$$$k(B Mathematica $B$N(B +$B%P!<%8%g%s$O!"(B3.0 $B!A(B 4.2 $B$^$G$G$"$k!#%P!<%8%g%s(B 5.x $B$K$D$$$F$O!"2f!9$,=j(B +$BM-$7$F$$$J$$$?$aD4::$7$F$$$J$$!#(B -Windows 上では \oxmath は、cygwin のもとで動作する。\oxmath の Windows -対応は藤本さんによる(2002年4月)。ありがとう。 +Windows $B>e$G$O(B \oxmath $B$O!"(Bcygwin $B$N$b$H$GF0:n$9$k!#(B\oxmath $B$N(B Windows +$BBP1~$OF#K\$5$s$K$h$k(B(2002$BG/(B4$B7n(B)$B!#$"$j$,$H$&!#(B -\section{Open Mathematica サーバの構成} +\section{Open Mathematica $B%5!<%P$N9=@.(B} -Open Mathmatica サーバ(\oxmath)はOpen XM クライアントおよび Mathematica -Kernel と通信する。\oxmath は起動直後に Mathematica Kernel を起動し、 -Mathematica Kernel と協調して動作する。Mathematica Kernel とは MathLink -ライブラリを利用して通信する。つまり \oxmath は MathLink -のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通 -信する。\oxmath はファイルディスクリプタ 3,4 が既にオープ -ンされていると思って, 3 から読み込み、4 に書き出す。 +Open Mathmatica $B%5!<%P(B(\oxmath)$B$O(BOpen XM $B%/%i%$%"%s%H$*$h$S(B Mathematica +Kernel $B$HDL?.$9$k!#(B\oxmath $B$O5/F0D>8e$K(B Mathematica Kernel $B$r5/F0$7!"(B +Mathematica Kernel $B$H6(D4$7$FF0:n$9$k!#(BMathematica Kernel $B$H$O(B MathLink +$B%i%$%V%i%j$rMxMQ$7$FDL?.$9$k!#$D$^$j(B \oxmath $B$O(B MathLink +$B$N%i%C%Q$@$H;W$C$F$h$$!#(BOpen XM $B%/%i%$%"%s%H$H$N4V$O%=%1%C%H$rMxMQ$7$FDL(B +$B?.$9$k!#(B\oxmath $B$O%U%!%$%k%G%#%9%/%j%W%?(B 3,4 $B$,4{$K%*!<%W(B +$B%s$5$l$F$$$k$H;W$C$F(B, 3 $B$+$iFI$_9~$_!"(B4 $B$K=q$-=P$9!#(B -さらに \oxmath には計算中断機能が必要であるが、この機能は 2003年のはじめに実装された。 +$B$5$i$K(B \oxmath $B$K$O7W;;CfCG5!G=$,I,MW$G$"$k$,!"$3$N5!G=$O(B 2003$BG/$N$O$8$a$KH$9$l$P$h$$(B +$B$,!"I,$:$7$b$3$l$i$N=q@R$KL@3N$K=q$+$l$F$$$k$o$1$G$O$J$$(B($BC5$;$P8+$D$+$k(B +$B$,(B)$B!#(B -まず MathLink とは、Wolfram が提供するライブラリであり、Mathematica のネッ -トワーク対応部分に相当する。Mathematica Kernel と通信するプログラムを書 -こうとするならば、MathLink を利用する必要がある。MathLink の内部構成は明 -らかにされていないが、{\bf 大部分はネットワーク透過的}である(例外はある)。 +$B$^$:(B MathLink $B$H$O!"(BWolfram $B$,Ds6!$9$k%i%$%V%i%j$G$"$j!"(BMathematica $B$N%M%C(B +$B%H%o!<%/BP1~ItJ,$KAjEv$9$k!#(BMathematica Kernel $B$HDL?.$9$k%W%m%0%i%`$r=q(B +$B$3$&$H$9$k$J$i$P!"(BMathLink $B$rMxMQ$9$kI,MW$,$"$k!#(BMathLink $B$NFbIt9=@.$OL@(B +$B$i$+$K$5$l$F$$$J$$$,!"(B{\bf $BBgItJ,$O%M%C%H%o!<%/F)2aE*(B}$B$G$"$k(B($BNc30$O$"$k(B)$B!#(B -まず、MathLink の通信路で交換されるデータが何なのか、ということを理解す -る必要がある。答は{\bf Mathematicaの式}である。これは自明ではない。 -次のような式がその例である。 +$B$^$:!"(BMathLink $B$NDL?.O)$G8r49$5$l$k%G!<%?$,2?$J$N$+!"$H$$$&$3$H$rM}2r$9(B +$B$kI,MW$,$"$k!#Ez$O(B{\bf Mathematica$B$N<0(B}$B$G$"$k!#$3$l$O<+L@$G$O$J$$!#(B +$B "] \end{verbatim} -このような *Packet[] を \cite{Wolfram-1996}ではパケットと呼んでいる. -MathLink を用いて、確実なプログラミングをするためには、これらのパケット -を正しく扱う必要がある。 +$B$3$N$h$&$J(B *Packet[] $B$r(B \cite{Wolfram-1996}$B$G$O%Q%1%C%H$H8F$s$G$$$k(B. +MathLink $B$rMQ$$$F!"3NJN,$9$k!#(B +$B$$$C$?$s!"DL?.O)$,3NN)$5$l$?$i!"(B \begin{enumerate} -\item Mathematica Kernel に式を送る。 -\item Mathematica Kernel から式を受け取る。 +\item Mathematica Kernel $B$K<0$rAw$k!#(B +\item Mathematica Kernel $B$+$i<0$r2A$5$;$?$$<0$,!"(BC $B8@8l$NJ8;zNs$GM?$($i(B +$B$l$F$$$k$H$7$F!"(Blink $B$G;X$7<($9(BMathematica Kernel $B$K(B \begin{verbatim} int ml_evaluateStringByLocalParser(char *string) { @@ -107,13 +107,13 @@ int ml_evaluateStringByLocalParser(char *string) MLEndPacket(link); } \end{verbatim} -として送信する。パケットは、 -EvaluatePacket[ToExpression[{\it string}]] である。 -ここで ToExpression は Mathematica の組み込み関数であり, -文字列 {\it string} を引数として Mathematica の式を返す. +$B$H$7$FAw?.$9$k!#%Q%1%C%H$O!"(B +EvaluatePacket[ToExpression[{\it string}]] $B$G$"$k!#(B +$B$3$3$G(B ToExpression $B$O(B Mathematica $B$NAH$_9~$_4X?t$G$"$j(B, +$BJ8;zNs(B {\it string} $B$r0z?t$H$7$F(B Mathematica $B$N<0$rJV$9(B. (\cite[pp.407]{Wolfram-1996}) -評価された結果を配列 str に格納するには、単純には次のようになる。 +$BI>2A$5$l$?7k2L$rG[Ns(B str $B$K3JG<$9$k$K$O!"C1=c$K$O$N(B CMO} & \to & \mbox{ToExpression[$BJ8;zNs(B]} \end{array} \] -逆に MathLink のオブジェクトは次の規則で CMO に変換される. +$B5U$K(B MathLink $B$N%*%V%8%'%/%H$O@\(B MLTKINT $B$K(B +$BJQ49$9$k$3$H$O$G$-$J$$(B. $B$D$^$j(B CMO\_ZZ $B$,@0?t7?$G$"$k$H(B MathLink $B$KCN$i(B +$B$;$k$3$H$O$G$-$J$$(B. $B$=$3$G(B, $B2A$,9T$o$l(B, $BJ8;zNs%G!<%?$+$i@0?t(B 1234567890 $B$,I|85$5$l$k(B. -逆に, Mathematica から送られた多倍長整数は, マシン整数の範囲内であれば, -int として取得可能(MLGetInteger を使う)であるが, 受け取る前に int に収ま -るか否かを知ることはできない. int に収まらない場合、データが切り捨てられ -てしまうので注意が必要である. また, 直接 CMO\_ZZ として取得することも不 -可能である. (MathLink 上でどのような形式でデータ交換されているのかの情 -報は手元にある資料からは得られなかった) +$B5U$K(B, Mathematica $B$+$iAw$i$l$?B?G\D9@0?t$O(B, $B%^%7%s@0?t$NHO0OFb$G$"$l$P(B, +int $B$H$7$Fl9g!"%G!<%?$,@Z$j@\(B CMO\_ZZ $B$H$7$Fe$G$I$N$h$&$J7A<0$G%G!<%?8r49$5$l$F$$$k$N$+$N>p(B +$BJs$Oe2DG=$G$"$k(B. -これを利用して, 我々は次のようにして整数を受け取る. +$B$3$l$rMxMQ$7$F(B, $B2f!9$O$7$F$$$k!#(B -% このように基本的に MathLink では全てのデータを文字列で受け取るしか方法は -% ない。どのような種類のデータであるかは受け取る前に知ることはできる。デー -% タの型は、MLTKERR(エラー), MLTKINT(整数), MLTKSTR(文字列), MLTKREAL(実数), -% MLTKSYM (シンボル), MLTKFUNC(関数) のいずれかである。このような事情で -% Mathematica から受け取ったデータは基本的に CMO\_STRINGとしてスタックに積 -% まれるので、クライアント側でその文字列の解釈をする必要がでてくる。しかし -% ながら、全ての MathLink オブジェクトが文字列に変換できるわけではないので、 -% その取り扱いには注意を要する。 +% $B$3$N$h$&$K4pK\E*$K(B MathLink $B$G$OA4$F$N%G!<%?$rJ8;zNs$Gp$G(B +% Mathematica $B$+$il9g!"(BMLInterruptMessage $B$N "] を受け取れば計算が中断されている +\item MenuPacket[1,"Interrupt> "] $B$r "] を受け取る +\item MenuPacket[0,"Interrupt> "] $B$r$KJV$C$F$/$l$P$$$$$N$G$"$k$,!"(B +$B%P!<%8%g%s(B 3.x $B$G$OJV$C$F$/$k$N$K!"%P!<%8%g%s(B4.x$B$G$O!"2?8N$+!"(B +$BJV$C$F$3$:!"pJs$rJQ49$7$J$,$i$d$j$H$j$9$k!#$=$N0UL#$G(B wrapper $B$N0l(B +$Bl9g$N@\B3@h$O(B ox\_sm1 $B$G$"$k!#(B +$BJV$jCM(B pid $B$O!"%;%C%7%g%sHV9f$G$"$k!#(B +$B$b$A$m$s(B \begin{verbatim} In[2] := pid = OxStartInsecure["water.s.kanazawa-u.ac.jp", 1300, 1400] \end{verbatim} -のようにして、insecure モードで接続してもよい。ただしこの場合は、 -あらかじめ {\tt Run[]} 等で、OpenXM サーバを起動しておかなければならない。 +$B$N$h$&$K$7$F!"(Binsecure $B%b!<%I$G@\B3$7$F$b$h$$!#$?$@$7$3$N>l9g$O!"(B +$B$"$i$+$8$a(B {\tt Run[]} $BEy$G!"(BOpenXM $B%5!<%P$r5/F0$7$F$*$+$J$1$l$P$J$i$J$$!#(B -接続が成功したらデータを送ってみよう。 +$B@\B3$,@.8y$7$?$i%G!<%?$rAw$C$F$_$h$&!#(B \begin{verbatim} In[3] := OxParse[pid, "(CMO_LIST, (CMO_STRING, "hello world"), (CMO_ZERO))"] \end{verbatim} -のように CMO expression を指定することによって、 -任意の CMO を送信できる。 -正しくない CMO の場合には、何も送信されない。 -また、CMO ではなく、 +$B$N$h$&$K(B CMO expression $B$r;XDj$9$k$3$H$K$h$C$F!"(B +$BG$0U$N(B CMO $B$rAw?.$G$-$k!#(B +$B@5$7$/$J$$(B CMO $B$N>l9g$K$O!"2?$bAw?.$5$l$J$$!#(B +$B$^$?!"(BCMO $B$G$O$J$/!"(B \begin{verbatim} In[4] := OxParse[pid, "(OX_COMMAND, (SM_popCMO))"] \end{verbatim} -などとして、OX メッセージの形で記述することもできる。 -注意しなければならないのは、SM コマンドの場合、OX スタックマシンから -OX メッセージが送られてくる場合があるが、OxParse[] を用いた場合、 -このメッセージは自動的には受信しない(現在の仕様では)。したがって明示的に -受信する必要がある。そのためには +$B$J$I$H$7$F!"(BOX $B%a%C%;!<%8$N7A$G5-=R$9$k$3$H$b$G$-$k!#(B +$BCm0U$7$J$1$l$P$J$i$J$$$N$O!"(BSM $B%3%^%s%I$N>l9g!"(BOX $B%9%?%C%/%^%7%s$+$i(B +OX $B%a%C%;!<%8$,Aw$i$l$F$/$k>l9g$,$"$k$,!"(BOxParse[] $B$rMQ$$$?>l9g!"(B +$B$3$N%a%C%;!<%8$O<+F0E*$K$Ol9g$K$O$b$A$m$s(B {\tt OxGet[pid]} $B$r8F$S=P$9I,MW$O$J$$!#(B -計算を実行するには {\tt OxExecute[pid, ...]} -(SM\_executeStringByLocalParser) か、適切な OX メッセージを送信すること。 +$B7W;;$r0z?t$G$J$$8B$j(B)$BG[Ns$N(B +$B07$$$G$"$k(B. $B$^$?(B, \begin{verbatim} typedef unsigned long int mp_limb_t; \end{verbatim} -と宣言されている場合には, -変数 {\tt mpz\_t x} の {\tt x->\_mp\_d} が unsigned long int の -配列であり, データの実体である. -これは整数の最下位4バイトが配列の先頭にくる. -つまり全体としては``リトルエンディアンっぽい''が, -各 unsigned long int はマシンのネイティブな integer である. -つまり, GMP の内部表現はマシン依存となっている. +$B$H@k8@$5$l$F$$$k>l9g$K$O(B, +$BJQ?t(B {\tt mpz\_t x} $B$N(B {\tt x->\_mp\_d} $B$,(B unsigned long int $B$N(B +$BG[Ns$G$"$j(B, $B%G!<%?$N.868yG$(B, $B9b;3?.5#(B, $BLnO$@59T(B. +{Open asir $BF~Lg(B}, 1999, $B?t<0=hM}(B, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG $B=PHG(B, Tokyo). \bibitem{Wolfram-1992} -ウルフラム. -{Mathematica (日本語版)}, -アジソンウエスレイ, 1992. +$B%&%k%U%i%`(B. +{Mathematica ($BF|K\8lHG(B)}, +$B%"%8%=%s%&%(%9%l%$(B, 1992. \bibitem{Wolfram-1996} Stephen Wolfram. {The Mathematica Book}, Third edition, Wolfram Media/Cambridge University Press, 1996. \bibitem{miyachi-1998} -宮地力. -{Mathematica によるネットワークプログラミング}, -岩波コンピュータサイエンス, -岩波書店, 1998. +$B5\CONO(B. +{Mathematica $B$K$h$k%M%C%H%o!<%/%W%m%0%i%_%s%0(B}, +$B4dGH%3%s%T%e!<%?%5%$%(%s%9(B, +$B4dGH=qE9(B, 1998. \bibitem{MathSource-Google1} Todd Gayley. [mg17015] in MathArchive, 1999 April. \bibitem{MathSource-Google2} -昔の MathLink にあった MLSignal の解説. -(以前、Google のキャッシュにあったが、もうない) +$B@N$N(B MathLink $B$K$"$C$?(B MLSignal $B$N2r@b(B. +($B0JA0!"(BGoogle $B$N%-%c%C%7%e$K$"$C$?$,!"$b$&$J$$(B) \bibitem{Math-Output1} -mathlink.h, libMLa のシンボル表, mprep の生成するソース. +mathlink.h, libMLa $B$N%7%s%\%kI=(B, mprep $B$N@8@.$9$k%=!<%9(B. \end{thebibliography} \end{document}