=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/documents/ox_math.tex,v retrieving revision 1.4 retrieving revision 1.10 diff -u -p -r1.4 -r1.10 --- OpenXM/src/ox_math/documents/ox_math.tex 1999/11/29 12:05:15 1.4 +++ OpenXM/src/ox_math/documents/ox_math.tex 2015/05/25 07:13:52 1.10 @@ -1,246 +1,398 @@ %#!platex -%% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.3 1999/11/23 03:08:26 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} -%\date{July 12, 1999} -\date{November 25, 1999} -\author{小原功任} +\date{ +%January 19, 1999 +%July 12, 1999 +November 25, 1999 +(Revised July 20, 2005) +} +\author{$B>.868yG$(B} +\def\oxmath{{\tt ox\_math}} + \begin{document} \maketitle -\section{Open Mathematicaの構成} +\section{$B2f!9$,Ds6!$9$k$b$N(B} -Open Mathmatica サーバはOpen XM クライアントおよびmathematica カーネルと -通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、 -mathematica カーネルと協調して動作する。mathematica カーネルとは -MathLink ライブラリを利用して通信する。Open Mathmatica サーバはMathLink -のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通 -信する。Open Mathmatica サーバはファイルディスクリプタ 3,4 が既にオープ -ンされていると思って, 3 から読み込み、4 に書き出す。 +$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 -\section{OX スタックマシン} -スタックのオブジェクトは cmo 型の変数、あるいはその派生クラスである. -つまり、Open XM 規約で定められたデータ形式を流用している. -% cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ -% れている. -この方法の利点は Open XM プロトコルを通して通信するにあたって -特にデータの変換を必要としないことである. すなわちCMO の各データタイプ -は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する -わけである. +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 -サーバの各関数は cmo* を受け取り、タグをみて実際のクラスが何であるかを -知り、動作を決定する. +\section{Open Mathematica $B%5!<%P$N9=@.(B} -\section{Mathematica との通信(MathLink) について} +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 -CMO は 次のように変換されてから, MathLink を通して送られる. +$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 + +$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 + +$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} +$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 CMO\_INT32 は MLTKINT (多倍長整数型). -\item CMO\_STRING は MLTKSTR (文字列型). -\item CMO\_LIST は MLTKFUNC (関数型). -\item その他のタイプの CMO は ToExpression[文字列] として送る. +\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) +{ + MLPutFunction(link, "EvaluatePacket", 1); + MLPutFunction(link, "ToExpression", 1); + MLPutString(link, string); + MLEndPacket(link); +} +\end{verbatim} +$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}) -ここで一つ注意をしておく. -MathLink では, int 型以外のデータを MLTKINT として送ることは残念ながらで -きない. したがって CMO\_ZZ を直接, 整数型であると Mathematica に思わせ -ることはできないのである. そこで, 次のような方法をとることになる. - +$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} \] -という評価が行われ, 文字列データから整数が復元される. +$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. + +$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(文字列), MLREAL(実数), MLTKSYM -(シンボル), MLTKFUNC(関数) のいずれかである。このような事情で -Mathematica から受け取ったデータは基本的に CMO\_STRINGとしてスタックに積 -まれるので、クライアント側でその文字列の解釈をする必要がでてくる。 +% $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 "] $B$r "] $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] := OxStartInsecure["water.s.kanazawa-u.ac.jp", 1300, 1400] +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["(CMO_LIST, (CMO_STRING, "hello world"), (CMO_ZERO))"] +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["(OX_COMMAND, (SM_popCMO))"] +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[]} -(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} +$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 $B$N%7%s%\%kI=(B, mprep $B$N@8@.$9$k%=!<%9(B. \end{thebibliography} \end{document}