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