version 1.1, 1999/10/29 08:06:42 |
version 1.7, 2002/04/17 01:09:23 |
|
|
%#!platex |
%#!platex |
%% $OpenXM$ |
%% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.6 2000/01/20 15:18:31 ohara Exp $ |
|
|
\documentclass{jarticle} |
\documentclass{jarticle} |
\title{Mathematica の Open XM 化について |
\title{Mathematica の Open XM 化について |
% \\ {\small --- Open Mathematica サーバの内部構成 ---} |
% \\ {\small --- Open Mathematica サーバの内部構成 ---} |
} |
} |
%\date{January 19, 1999} |
%\date{January 19, 1999} |
\date{July 12, 1999} |
%\date{July 12, 1999} |
|
\date{November 25, 1999} |
\author{小原功任} |
\author{小原功任} |
|
|
\begin{document} |
\begin{document} |
\maketitle |
\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 サーバはOpen XM クライアントおよびmathematica カーネルと |
通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、 |
通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、 |
mathematica カーネルと協調して動作する。mathematica カーネルとは |
mathematica カーネルと協調して動作する。mathematica カーネルとは |
Line 32 MathLink ライブラリを利用して通信する。Open Mathmatica |
|
Line 59 MathLink ライブラリを利用して通信する。Open Mathmatica |
|
つまり、Open XM 規約で定められたデータ形式を流用している. |
つまり、Open XM 規約で定められたデータ形式を流用している. |
% cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ |
% cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ |
% れている. |
% れている. |
この方法の利点は open xm プロトコルを通して通信するにあたって |
この方法の利点は Open XM プロトコルを通して通信するにあたって |
特にデータの変換を必要としないことである. すなわちCMO の各データタイプ |
特にデータの変換を必要としないことである. すなわちCMO の各データタイプ |
は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する |
は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する |
わけである. |
わけである. |
Line 47 CMO は 次のように変換されてから, MathLink を通して送ら |
|
Line 74 CMO は 次のように変換されてから, MathLink を通して送ら |
|
\begin{enumerate} |
\begin{enumerate} |
\item CMO\_INT32 は MLTKINT (多倍長整数型). |
\item CMO\_INT32 は MLTKINT (多倍長整数型). |
\item CMO\_STRING は MLTKSTR (文字列型). |
\item CMO\_STRING は MLTKSTR (文字列型). |
|
\item CMO\_LIST は MLTKFUNC (関数型). |
\item その他のタイプの CMO は ToExpression[文字列] として送る. |
\item その他のタイプの CMO は ToExpression[文字列] として送る. |
\end{enumerate} |
\end{enumerate} |
|
|
|
|
\] |
\] |
という評価が行われ, 文字列データから整数が復元される. |
という評価が行われ, 文字列データから整数が復元される. |
|
|
逆に, Mathematica から送られた整数データは, |
逆に, Mathematica から送られた整数データは, マシン整数の範囲内であれば, |
マシン整数の範囲内であれば, int として |
int として取得可能(MLGetInteger を使う)であるが, 受け取る前に int に収ま |
取得可能(MLGetInteger を使う)であるが, |
るか否かを知ることはできない. int に収まらない場合、データが切り捨てられ |
受け取る前に int に収まるか否かを知ることはできない. |
てしまうので注意が必要である. また, 直接 CMO\_ZZ として取得することも不 |
また, 直接 CMO\_ZZ として取得することも不可能である. |
可能である. (MathLink 上でどのような形式でデータ交換されているのかの情 |
(MathLink 上でどのような形式でデータ交換されているのかの |
報は手元にある資料からは得られなかった) |
情報は手元にある資料からは得られなかった) |
|
|
|
しかしながら, たとえ Mathematica 側から整数データが送られていたとしても, |
しかしながら, たとえ Mathematica 側から整数データが送られていたとしても, |
そのデータを文字列に変換して受け取ることは MathLink の機構上可能である. |
そのデータを文字列に変換して受け取ることは MathLink の機構上可能である. |
|
|
} |
} |
\end{verbatim} |
\end{verbatim} |
|
|
つまり、Mathematica から整数データを文字列として受け取り、 |
つまり、Mathematica から整数データを文字列として受け取り、その文字列を |
その文字列を OX サーバ側で CMO\_ZZ に直している。 |
OX サーバ側で CMO\_ZZ に直している。 |
|
|
基本的に MathLink では全てのデータを文字列で受け取るしか方法はない。どの |
基本的に MathLink では全てのデータを文字列で受け取るしか方法はない。どの |
ような種類のデータであるかは受け取る前に知ることはできる。データの型は、 |
ような種類のデータであるかは受け取る前に知ることはできる。データの型は、 |
Line 125 Mathematica から受け取ったデータは基本的に CMO\_STRING |
|
Line 152 Mathematica から受け取ったデータは基本的に CMO\_STRING |
|
まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。 |
まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。 |
|
|
\section{個々のスタックマシン命令の実装} |
\section{個々のスタックマシン命令の実装} |
現在、実装しているのは |
|
|
現在、実装されているのは |
SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction, |
SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction, |
SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ |
SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ |
で何もしない)である。 |
で何もしない)である。 |
|
|
\section{Mathematica を OX のクライアントに} |
\section{Mathematica を OX のクライアントに} |
|
|
|
OpenXM クライアントは Mathematica の外部プログラム({\tt math2ox}) の形で |
|
実現されている。すなわち、Mathematica と math2ox の間は MathLink プロト |
|
コルで、math2ox と OpenXM サーバの間は OpenXM プロトコルで通信し、 |
|
math2ox が適切に情報を変換しながらやりとりする。その意味で wrapper の一 |
|
種であるとも言える。 |
|
|
|
利用するには、最初に |
\begin{verbatim} |
\begin{verbatim} |
In[1]:= Install["math2ox"] |
In[1]:= Install["math2ox"] |
\end{verbatim} |
\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} |
\begin{verbatim} |
In[2] := OxStart["ox_sm1"] |
In[2] := OxStart["ox_sm1"] |
\end{verbatim} |
\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} |
\begin{verbatim} |
In[3] := OxClose[] |
In[3] := OxParse["(CMO_LIST, (CMO_STRING, "hello world"), (CMO_ZERO))"] |
\end{verbatim} |
\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 |
\appendix |
Line 177 typedef unsigned long int mp_limb_t; |
|
Line 249 typedef unsigned long int mp_limb_t; |
|
\begin{thebibliography}{99} |
\begin{thebibliography}{99} |
\bibitem{Openxxx-1998} |
\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} |
\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} |
\bibitem{Wolfram-1992} |
ウルフラム. |
ウルフラム. |
{Mathematica (日本語版)}, |
{Mathematica (日本語版)}, |