Annotation of OpenXM/src/ox_math/documents/ox_math.tex, Revision 1.6
1.1 ohara 1: %#!platex
1.6 ! ohara 2: %% $OpenXM: OpenXM/src/ox_math/documents/ox_math.tex,v 1.5 2000/01/20 15:09:24 ohara Exp $
1.1 ohara 3:
4: \documentclass{jarticle}
5: \title{Mathematica の Open XM 化について
6: % \\ {\small --- Open Mathematica サーバの内部構成 ---}
7: }
8: %\date{January 19, 1999}
1.4 ohara 9: %\date{July 12, 1999}
10: \date{November 25, 1999}
1.1 ohara 11: \author{小原功任}
12:
13: \begin{document}
14: \maketitle
15:
1.6 ! ohara 16: \section{我々が提供するもの}
! 17:
! 18: 我々が提供するのは二つのプログラムとそのソースである。一つ目は
! 19: {\tt ox\_math} プログラムであり、これは OpenXM サーバの一種である。二つ
! 20: 目は {\tt math2ox} であり、OpenXM クライアントである。
! 21:
! 22:
! 23: \section{Open Mathematica サーバの構成}
1.1 ohara 24:
25: Open Mathmatica サーバはOpen XM クライアントおよびmathematica カーネルと
26: 通信する。Open Mathmatica サーバは起動直後にmathematica カーネルを起動し、
27: mathematica カーネルと協調して動作する。mathematica カーネルとは
28: MathLink ライブラリを利用して通信する。Open Mathmatica サーバはMathLink
29: のラッパだと思ってよい。Open XM クライアントとの間はソケットを利用して通
30: 信する。Open Mathmatica サーバはファイルディスクリプタ 3,4 が既にオープ
31: ンされていると思って, 3 から読み込み、4 に書き出す。
32:
33: さらに、Open Mathmatica サーバはコントロールプロセスからシグナルを受け取
34: る場合がある。シグナルを受け取った場合には,相応の動作が必要であるが、現
35: 在は実装していない. SIGUSR1 (SM\_control\_reset\_connection) は計算が全
36: て終わってからOX\_SYNC\_BALL を投げるので、実際には意味がない。
37:
38: \section{OX スタックマシン}
39: スタックのオブジェクトは cmo 型の変数、あるいはその派生クラスである.
40: つまり、Open XM 規約で定められたデータ形式を流用している.
41: % cmo 構造体およびその派生クラスは/home/ohara/openxxx/lib/oxlib.h で定義さ
42: % れている.
1.2 ohara 43: この方法の利点は Open XM プロトコルを通して通信するにあたって
1.1 ohara 44: 特にデータの変換を必要としないことである. すなわちCMO の各データタイプ
45: は Open Mathematicaサーバ(スタックマシン)の内部でも, CMO として保持する
46: わけである.
47:
48: サーバの各関数は cmo* を受け取り、タグをみて実際のクラスが何であるかを
49: 知り、動作を決定する.
50:
51: \section{Mathematica との通信(MathLink) について}
52:
53: CMO は 次のように変換されてから, MathLink を通して送られる.
54:
55: \begin{enumerate}
56: \item CMO\_INT32 は MLTKINT (多倍長整数型).
57: \item CMO\_STRING は MLTKSTR (文字列型).
1.4 ohara 58: \item CMO\_LIST は MLTKFUNC (関数型).
1.1 ohara 59: \item その他のタイプの CMO は ToExpression[文字列] として送る.
60: \end{enumerate}
61:
62: 上で述べられている ToExpression は Mathematica の組み込み関数であり,
63: 文字列を引数として Mathematica の式を返す.
64: (\cite[pp.407]{Wolfram-1996})
65:
66: ここで一つ注意をしておく.
67: MathLink では, int 型以外のデータを MLTKINT として送ることは残念ながらで
68: きない. したがって CMO\_ZZ を直接, 整数型であると Mathematica に思わせ
69: ることはできないのである. そこで, 次のような方法をとることになる.
70:
71: \begin{verbatim}
72: char *CONVERT_ZZ_TO_CSTRING(cmo_t zz);
73:
74: int main()
75: {
76: char *s;
77: cmo_t zz; /* zz.tag == CMO_ZZ */
78: MLINK lp; /* MathLink Socket */
79: ...
80: s = CONVERT_ZZ_TO_CSTRING(zz);
81: MLPutFunction(lp, "ToExpression", 1);
82: MLPutString(lp, s);
83: ...
84: }
85: \end{verbatim}
86:
87: このようにすると, Mathematica 側では, 例えば
88: \[
89: \mbox{\tt ToExpression["1234567890"]}
90: \]
91: という評価が行われ, 文字列データから整数が復元される.
92:
1.4 ohara 93: 逆に, Mathematica から送られた整数データは, マシン整数の範囲内であれば,
94: int として取得可能(MLGetInteger を使う)であるが, 受け取る前に int に収ま
95: るか否かを知ることはできない. int に収まらない場合、データが切り捨てられ
96: てしまうので注意が必要である. また, 直接 CMO\_ZZ として取得することも不
97: 可能である. (MathLink 上でどのような形式でデータ交換されているのかの情
98: 報は手元にある資料からは得られなかった)
1.1 ohara 99:
100: しかしながら, たとえ Mathematica 側から整数データが送られていたとしても,
101: そのデータを文字列に変換して受け取ることは MathLink の機構上可能である.
102:
103: これを利用して, 我々は次のようにして整数を受け取る.
104: \begin{verbatim}
105: cmo_t CONVERT_CSTRING_TO_ZZ(char *s);
106:
107: int main()
108: {
109: MLINK lp;
110: char *s;
111: cmo_t zz;
112: ...
113: if(MLGetNext(lp) == MLTHINT) {
114: MLGetString(lp, &s);
115: zz = CONVERT_CSTRING_TO_ZZ(s); /* zz.tag == CMO_ZZ */
116: }
117: ...
118: }
119: \end{verbatim}
120:
1.4 ohara 121: つまり、Mathematica から整数データを文字列として受け取り、その文字列を
122: OX サーバ側で CMO\_ZZ に直している。
1.1 ohara 123:
124: 基本的に MathLink では全てのデータを文字列で受け取るしか方法はない。どの
125: ような種類のデータであるかは受け取る前に知ることはできる。データの型は、
126: MLTKERR(エラー), MLTKINT(整数), MLTKSTR(文字列), MLREAL(実数), MLTKSYM
127: (シンボル), MLTKFUNC(関数) のいずれかである。このような事情で
128: Mathematica から受け取ったデータは基本的に CMO\_STRINGとしてスタックに積
129: まれるので、クライアント側でその文字列の解釈をする必要がでてくる。
130:
131: しかしながら、全ての MathLink オブジェクトが文字列に変換できるわけではな
132: いので、その取り扱いには注意を要する。
133: まだ、実装していないが、多項式(CMO\_???\_PORINOMIAL)の扱いが難しい。
134:
135: \section{個々のスタックマシン命令の実装}
1.6 ! ohara 136:
! 137: 現在、実装されているのは
1.1 ohara 138: SM\_popCMO, SM\_popString, SM\_pops, SM\_executeFunction,
139: SM\_executeStringByLocalParser, SM\_mathcap, SM\_setMathcap(受け取るだけ
140: で何もしない)である。
141:
142: \section{Mathematica を OX のクライアントに}
1.6 ! ohara 143:
! 144: OpenXM クライアントは Mathematica の外部プログラム({\tt math2ox}) の形で
! 145: 実現されている。すなわち、Mathematica と math2ox の間は MathLink プロト
! 146: コルで、math2ox と OpenXM サーバの間は OpenXM プロトコルで通信し、
! 147: math2ox が適切に情報を変換しながらやりとりする。その意味で wrapper の一
! 148: 種であるとも言える。
1.1 ohara 149:
1.3 ohara 150: 利用するには、最初に
1.1 ohara 151: \begin{verbatim}
152: In[1]:= Install["math2ox"]
153: \end{verbatim}
1.3 ohara 154: として、math2ox をロードしなければならない。
155: Mathematica に新たに定義されるコマンドは、
1.5 ohara 156: {\tt OxStart[s\_String], OxStartInsecure[s\_String, p\_Integer, q\_Integer],
157: OxExecuteString[s\_String], OxParse[s\_String], OxGet[],
1.3 ohara 158: OxPopCMO[], OxPopString[], OxClose[], OxReset[]}
159: の9つである。
1.1 ohara 160:
1.3 ohara 161: math2ox をロードしたら、
1.1 ohara 162: \begin{verbatim}
163: In[2] := OxStart["ox_sm1"]
164: \end{verbatim}
1.3 ohara 165: によって OpenXM サーバに接続する。この場合の接続先は ox\_sm1 である。
166: もちろん
167: \begin{verbatim}
168: In[2] := OxStartInsecure["water.s.kanazawa-u.ac.jp", 1300, 1400]
169: \end{verbatim}
170: のようにして、insecure モードで接続してもよい。ただしこの場合は、
171: あらかじめ {\tt Run[]} 等で、OpenXM サーバを起動しておかなければならない。
172:
173: 接続が成功したらデータを送ってみよう。
174: \begin{verbatim}
175: In[3] := OxParse["(CMO_LIST, (CMO_STRING, "hello world"), (CMO_ZERO))"]
176: \end{verbatim}
177: のように CMO expression を指定することによって、
178: 任意の CMO を送信できる。
179: 正しくない CMO の場合には、何も送信されない。
180: また、CMO ではなく、
181: \begin{verbatim}
182: In[4] := OxParse["(OX_COMMAND, (SM_popCMO))"]
183: \end{verbatim}
184: などとして、OX メッセージの形で記述することもできる。
185: 注意しなければならないのは、SM コマンドの場合、OX スタックマシンから
186: OX メッセージが送られてくる場合があるが、OxParse[] を用いた場合、
187: このメッセージは自動的には受信しない(現在の仕様では)。したがって明示的に
188: 受信する必要がある。そのためには
189: \begin{verbatim}
1.5 ohara 190: In[5] := OxGet[]
1.3 ohara 191: \end{verbatim}
192: とするだけでよい。返ってくるオブジェクトは CMO に対応するものである。
193: \begin{verbatim}
194: In[6] := OxPopCMO[]
195: \end{verbatim}
1.5 ohara 196: を用いる場合にはもちろん {\tt OxGet[]} を呼び出す必要はない。
1.3 ohara 197:
198: 計算を実行するには {\tt OxExecute[]}
199: (SM\_executeStringByLocalParser) か、適切な OX メッセージを送信すること。
1.1 ohara 200:
1.3 ohara 201: 計算が終わったら、
1.1 ohara 202: \begin{verbatim}
1.3 ohara 203: In[7] := OxClose[]
1.1 ohara 204: \end{verbatim}
205: とすると、接続が終了する。
206:
207: \appendix
208: \section{付録}
209:
210: GMP における ``整数型'' {\tt mpz\_t} はつぎのような
211: 内部表現を持つ: \\
212: まず {\tt mpz\_t} 型は
213: \begin{verbatim}
214: typedef struct __mpz_struct mpz_t[1];
215: \end{verbatim}
216: と typedef されており,
217: {\tt mpz\_t} 型の変数は(関数の仮引数でない限り)配列の
218: 扱いである. また,
219: \begin{verbatim}
220: typedef unsigned long int mp_limb_t;
221: \end{verbatim}
222: と宣言されている場合には,
223: 変数 {\tt mpz\_t x} の {\tt x->\_mp\_d} が unsigned long int の
224: 配列であり, データの実体である.
225: これは整数の最下位4バイトが配列の先頭にくる.
226: つまり全体としては``リトルエンディアンっぽい''が,
227: 各 unsigned long int はマシンのネイティブな integer である.
228: つまり, GMP の内部表現はマシン依存となっている.
229:
230: \begin{thebibliography}{99}
231: \bibitem{Openxxx-1998}
232: 野呂正行, 高山信毅.
1.4 ohara 233: {Open XM の設計と実装 --- Open message eXchange protocol for Mathematics},
234: 1999/11/22
1.1 ohara 235: \bibitem{Ohara-Takayama-Noro-1999}
236: 小原功任, 高山信毅, 野呂正行.
1.4 ohara 237: {Open asir 入門}, 1999, 数式処理, Vol 7, No 2, 2--17. (ISBN4-87243-086-7, SEG 出版, Tokyo).
1.1 ohara 238: \bibitem{Wolfram-1992}
239: ウルフラム.
240: {Mathematica (日本語版)},
241: アジソンウエスレイ, 1992.
242: \bibitem{Wolfram-1996}
243: Stephen Wolfram.
244: {The Mathematica Book}, Third edition,
245: Wolfram Media/Cambridge University Press, 1996.
246:
247: \bibitem{miyachi-1998}
248: 宮地力.
249: {Mathematica によるネットワークプログラミング},
250: 岩波コンピュータサイエンス,
251: 岩波書店, 1998.
252: \end{thebibliography}
253:
254: \end{document}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>