=================================================================== RCS file: /home/cvs/OpenXM/src/ox_math/documents/ox_math.tex,v retrieving revision 1.1 retrieving revision 1.7 diff -u -p -r1.1 -r1.7 --- OpenXM/src/ox_math/documents/ox_math.tex 1999/10/29 08:06:42 1.1 +++ OpenXM/src/ox_math/documents/ox_math.tex 2002/04/17 01:09:23 1.7 @@ -1,19 +1,46 @@ %#!platex -%% $OpenXM$ +%% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.6 2000/01/20 15:18:31 ohara Exp $ \documentclass{jarticle} \title{Mathematica の Open XM 化について % \\ {\small --- Open Mathematica サーバの内部構成 ---} } %\date{January 19, 1999} -\date{July 12, 1999} +%\date{July 12, 1999} +\date{November 25, 1999} \author{小原功任} \begin{document} \maketitle -\section{Open Mathematicaの構成} +\noindent +{\bf +注意 (2002.04.17): +この文書は, 古いインタフェースをもとに記述してあるので, +例はこのままでは動作しないので注意. +math2ox.texi が最新のインタフェースのマニュアルである. +一番の変更点は, {\tt OxStart} が pid (ox process id) を戻すようになり, +{\tt OxParse} など多くの関数が, pid を引数として求めるようになったことで +ある. +たとえば, この文書の {\tt OxParse} を用いる例は, 次のように変更しないと +いけない.} +\begin{verbatim} +Install["math2ox"] +pid = OxStart["ox_sm1"] +OxParse[pid,"(CMO_ZERO)"] +OxPopCMO[pid] +\end{verbatim} + +\section{我々が提供するもの} + +我々が提供するのは二つのプログラムとそのソースである。一つ目は +{\tt ox\_math} プログラムであり、これは OpenXM サーバの一種である。二つ +目は {\tt math2ox} であり、OpenXM クライアントである。 + + +\section{Open Mathematica サーバの構成} + Open Mathmatica サーバはOpen XM クライアントおよびmathematica カーネルと 通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、 mathematica カーネルと協調して動作する。mathematica カーネルとは @@ -32,7 +59,7 @@ MathLink ライブラリを利用して通信する。Open Mathmatica つまり、Open XM 規約で定められたデータ形式を流用している. % cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ % れている. -この方法の利点は open xm プロトコルを通して通信するにあたって +この方法の利点は Open XM プロトコルを通して通信するにあたって 特にデータの変換を必要としないことである. すなわちCMO の各データタイプ は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する わけである. @@ -47,6 +74,7 @@ CMO は 次のように変換されてから, MathLink を通して送ら \begin{enumerate} \item CMO\_INT32 は MLTKINT (多倍長整数型). \item CMO\_STRING は MLTKSTR (文字列型). +\item CMO\_LIST は MLTKFUNC (関数型). \item その他のタイプの CMO は ToExpression[文字列] として送る. \end{enumerate} @@ -81,13 +109,12 @@ int main() \] という評価が行われ, 文字列データから整数が復元される. -逆に, Mathematica から送られた整数データは, -マシン整数の範囲内であれば, int として -取得可能(MLGetInteger を使う)であるが, -受け取る前に int に収まるか否かを知ることはできない. -また, 直接 CMO\_ZZ として取得することも不可能である. -(MathLink 上でどのような形式でデータ交換されているのかの -情報は手元にある資料からは得られなかった) +逆に, Mathematica から送られた整数データは, マシン整数の範囲内であれば, +int として取得可能(MLGetInteger を使う)であるが, 受け取る前に int に収ま +るか否かを知ることはできない. int に収まらない場合、データが切り捨てられ +てしまうので注意が必要である. また, 直接 CMO\_ZZ として取得することも不 +可能である. (MathLink 上でどのような形式でデータ交換されているのかの情 +報は手元にある資料からは得られなかった) しかしながら, たとえ Mathematica 側から整数データが送られていたとしても, そのデータを文字列に変換して受け取ることは MathLink の機構上可能である. @@ -110,8 +137,8 @@ int main() } \end{verbatim} -つまり、Mathematica から整数データを文字列として受け取り、 -その文字列を OX サーバ側で CMO\_ZZ に直している。 +つまり、Mathematica から整数データを文字列として受け取り、その文字列を +OX サーバ側で CMO\_ZZ に直している。 基本的に MathLink では全てのデータを文字列で受け取るしか方法はない。どの ような種類のデータであるかは受け取る前に知ることはできる。データの型は、 @@ -125,30 +152,75 @@ Mathematica から受け取ったデータは基本的に CMO\_STRING まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。 \section{個々のスタックマシン命令の実装} -現在、実装しているのは + +現在、実装されているのは SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction, SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ で何もしない)である。 \section{Mathematica を OX のクライアントに} +OpenXM クライアントは Mathematica の外部プログラム({\tt math2ox}) の形で +実現されている。すなわち、Mathematica と math2ox の間は MathLink プロト +コルで、math2ox と OpenXM サーバの間は OpenXM プロトコルで通信し、 +math2ox が適切に情報を変換しながらやりとりする。その意味で wrapper の一 +種であるとも言える。 + +利用するには、最初に \begin{verbatim} In[1]:= Install["math2ox"] \end{verbatim} -とすると、外部プログラムをロードし、 +として、math2ox をロードしなければならない。 +Mathematica に新たに定義されるコマンドは、 +{\tt OxStart[s\_String], OxStartInsecure[s\_String, p\_Integer, q\_Integer], +OxExecuteString[s\_String], OxParse[s\_String], OxGet[], +OxPopCMO[], OxPopString[], OxClose[], OxReset[]} +の9つである。 +math2ox をロードしたら、 \begin{verbatim} In[2] := OxStart["ox_sm1"] \end{verbatim} -によって OpenXM サーバに接続する。接続先は ox\_sm1 である。 +によって OpenXM サーバに接続する。この場合の接続先は ox\_sm1 である。 +もちろん +\begin{verbatim} +In[2] := OxStartInsecure["water.s.kanazawa-u.ac.jp", 1300, 1400] +\end{verbatim} +のようにして、insecure モードで接続してもよい。ただしこの場合は、 +あらかじめ {\tt Run[]} 等で、OpenXM サーバを起動しておかなければならない。 -接続が成功したら適当にデータを送ってみよう。 -利用できるコマンドは -{\tt OxStart[s\_String], OxExecute[s\_String], OxPopString[], OxClose[], OxReset[]} -の五つである。計算が終わったら、 +接続が成功したらデータを送ってみよう。 \begin{verbatim} -In[3] := OxClose[] +In[3] := OxParse["(CMO_LIST, (CMO_STRING, "hello world"), (CMO_ZERO))"] \end{verbatim} +のように CMO expression を指定することによって、 +任意の CMO を送信できる。 +正しくない CMO の場合には、何も送信されない。 +また、CMO ではなく、 +\begin{verbatim} +In[4] := OxParse["(OX_COMMAND, (SM_popCMO))"] +\end{verbatim} +などとして、OX メッセージの形で記述することもできる。 +注意しなければならないのは、SM コマンドの場合、OX スタックマシンから +OX メッセージが送られてくる場合があるが、OxParse[] を用いた場合、 +このメッセージは自動的には受信しない(現在の仕様では)。したがって明示的に +受信する必要がある。そのためには +\begin{verbatim} +In[5] := OxGet[] +\end{verbatim} +とするだけでよい。返ってくるオブジェクトは CMO に対応するものである。 +\begin{verbatim} +In[6] := OxPopCMO[] +\end{verbatim} +を用いる場合にはもちろん {\tt OxGet[]} を呼び出す必要はない。 + +計算を実行するには {\tt OxExecute[]} +(SM\_executeStringByLocalParser) か、適切な OX メッセージを送信すること。 + +計算が終わったら、 +\begin{verbatim} +In[7] := OxClose[] +\end{verbatim} とすると、接続が終了する。 \appendix @@ -177,10 +249,11 @@ typedef unsigned long int mp_limb_t; \begin{thebibliography}{99} \bibitem{Openxxx-1998} 野呂正行, 高山信毅. -{Open xxx の設計と実装, xxx = asir,kan}, 1998/10/11 +{Open XM の設計と実装 --- Open message eXchange protocol for Mathematics}, +1999/11/22 \bibitem{Ohara-Takayama-Noro-1999} 小原功任, 高山信毅, 野呂正行. -{Open asir 入門}. +{Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo). \bibitem{Wolfram-1992} ウルフラム. {Mathematica (日本語版)},