[BACK]Return to ox_math.tex CVS log [TXT][DIR] Up to [local] / OpenXM / src / ox_math / documents

Annotation of OpenXM/src/ox_math/documents/ox_math.tex, Revision 1.7

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>