Annotation of OpenXM/doc/OpenXM-specs/implementation.tex, Revision 1.2
1.2 ! noro 1: %% $OpenXM: OpenXM/doc/OpenXM-specs/implementation.tex,v 1.1.1.1 2000/01/20 08:52:46 noro Exp $
1.1 noro 2: //&jp \section{ 実装, デバッグ, 検証 }
3:
4: //&jp \subsection{ 実装の手順 }
5:
6: /*&jp
7: ソフト xxx を, open XM 対応にするのには以下のような
8: 手順をふむと開発が容易であろう.
9: \begin{enumerate}
10: \item[Step 1.]
11: {\tt executeStringByLocalParser}
12: および {\tt popString} の機能を実現して,
13: xxx をライブラリとしてまとめ, 他のソフトとリンクして
14: 使用できるかテストする.
15: C での実現の場合 割り込みの取扱に注意を要する.
16: これだけの実現でも, サンプルサーバ
17: ({\tt nullserver00.c}) とリンクすれば,
18: open XM 対応のクライアントと通信できる.
19: クライアント側では, このシステムに対応した機能呼び出し
20: プログラムを書く.
21: \item[Step 2.]
22: 次に, CMO を可能な限り実装する.
23: open sm1 や open asir で, CMO 形式のデータを
24: 作成して, 読み込めるかテストする.
25: \item[Step 2'.]
26: {\tt kan/sm1} の plugin として組み込むとサーバの開発が楽かもしれない.
27: {\tt kan/sm1} のソースファイルのディレクトリ {\tt plugin} を見よ.
28: \item[Step 3.]
29: CMO の stream への転送, stream よりの転送は,
30: 巨大データの送信受信にきわめて大切である.
31: これを実装しサンプルサーバとリンクする.
32: \end{enumerate}
33:
34:
35: \subsection{歴史}
36: kan -- asir 間でも以上のように開発がすすんだ.
37:
38: Risa/Asir の開p発が沼津の富士フォーラムでおこなわれていた
39: ころ, 私が沼津を, 1996年, 1月19日に訪問し,
40: {\tt Asir\_executeString()}
41: の機能を野呂さんに書いてもらって, kan より asir を文字列で呼び出す
42: 機能およびその逆を実現したのがことの発端である.
43: たとえば, asir より kan/sm1 の機能を呼び出すには,
44: \begin{verbatim}
45: F = x; G = y;
46: Ans = kan("(%p). (%p). mul toString",F,G)
47: \end{verbatim}
48: と入力すればよい.
49: {\tt x} と {\tt y} の積が kan で解釈実行されて, 結果を
50: もどす.
51: このレベルの結合では kan/sm1 は, 内蔵インタプリタ付の
52: ライブラリとして利用できてずいぶん便利である.
53: この関数 {\tt kan} は {\tt builtin/parif.c} に組み込んだ.
54: {\tt asir} は {\tt pari} の関数を組み込んでいるが, この組み込みの
55: メカニズムを利用すると容易にリンクできた.
56: 参照: {\tt noro/src/Old1/parif.c}.
57:
1.2 ! noro 58: 次に, CMO Primitive の機能を
1.1 noro 59: 1997, 5 月, 6 月に実現した.
1.2 ! noro 60: その後, 1997年 7 月に, SMObject/Basic の実装,
1.1 noro 61: 1997年 7 月には, 野呂がイタリアの CoCoA のワークショップにおいて,
62: 大阿久の b-function を stratification 込みで計算する計算プログラムを
63: asir, kan を連係してデモした. このときは, {\tt Sm1\_executeStringByLocalParser}
64: 関数を用いて, ライブラリとしてリンクしてつかった.
65: 1997 年 11 月に TCP/IP による, サーバスタックマシン間の通信の
66: 実装をおこなっている.
67: 通信の実装テストのために, Java および C で null server , null client
68: を作成した. 以下, これにつき述べる.
69:
70:
71: \subsection{ サンプルサーバ, クライアント }
72:
73: Open XM では, 現在のところ,
74: サンプルサーバとして {\tt oxserver00.c} を提供している.
75: このサーバをもとにして, {\tt asir} および {\tt kan/sm1}
76: の open XM サーバを試験中である ({\tt ox\_asir}, {\tt ox\_sm1}).
77: {\tt ox\_sm1} では, {\tt sm1stackmachine.c} が
78: open XM スタックマシンを実現している.
79: サンプルクライアントは, ネットワークにデータを送出および
80: 受信する機能のみをもつ, {\tt testclient.c} を提供
81: している.
82: {\tt asir} および {\tt kan/sm1} には本格的な
83: クライアント機能(open XM サーバを呼び出す
84: 機能)を組み込んである.
85: サーバを起動するプログラムは, {\tt kan/sm1} グループでは,
86: {\tt ox} なる名前で, {\tt asir} グループでは,
87: {\tt ox\_lauch} なる名前であるが, 機能は同じである.
88: {\tt ox} のソースは {\tt oxmain.c} である.
89:
90: \subsubsection{OpenXM/src/ox\_toolkit にあるサンプル実装}
91: このディレクトリの解説文書を見よ.
92:
93: \subsubsection{ ox\_null }
94:
1.2 ! noro 95: Primitive のスタックマシンのソケットによる実装.
1.1 noro 96: スタックマシンは {\tt nullstackmachine.c} に実装されており,
97: {\tt oxserver00.c} にリンクしてサーバとなる.
1.2 ! noro 98: サンプルサーバであり, これに CMO Primitive 仕様の関数を結合すれば,
1.1 noro 99: 一応 サーバが動作するはずである.
1.2 ! noro 100: スタックには,CMO の Primitive の object へのポインタがそのまま push される.
1.1 noro 101: コントロール機能なし. 1997/11/29 版よりコントロール機能追加.
102: @Old/nullserver00.c.19971122c,
103: @Old/mytcpip.c.19971122c
104:
105: 現在はこのサーバはメンテナンスされていない
106: (object 関係の関数を追加しないとコンパイルできない.)
107:
108: \subsubsection{ testclient }
109:
110:
111: Java による実装:
112: @Old/client.java.19971122c
113: これも現在はふるい.
114: OX パケットのシリアル番号に対応していない.
115: ちかいうちに改訂する予定.
116: {\tt executeString} および {\tt popString} を要請する能力しか持たない.
117: 受信は スレッド {\tt listner} がおこなっている.
118: 受信は byte データを表示するのみである.
119: スレッドの優先度をうまくバランスとらないと, 受信データがあるのに
120: 表示しなかったりする.
121:
122: C による {\tt testclient}
123: 同じような機能をもつプログラムの実装もある.
124: {\footnotesize \begin{verbatim}
125: ./ox -ox ox_sm1 -host localhost -data 1300 -control 1200 (サーバの立ち上げ)
126: ./testclient (testclient の立ち上げ)
127: \end{verbatim}}
128: これも現在はふるい.
129:
130: 田村 ({\tt tamura@math.kobe-u.ac.jp}) による Java への新しい実装がある
131: (1999, 3月, 神戸大学修士論文).
132:
133: \subsubsection{ {\tt ox} }
134: {\tt ox} は ox サーバをたちあげるためのプログラムである.
135: クライアントよりサーバへ接続するには二つの方法がある.
136: 一つは {\tt ox} で データとコントロール用の二つの
137: ポート番号を明示的に起動し, クライアントがこのポートへつなぎに
138: いく方法である.
139: もう一つは, クライアント側でまず, 空いているポートを二つ
140: さがし, それから {\tt ox} を {\tt -reverse} で起動して
141: サーバ側がクライアントにつなぎにくる方法である.
142: この場合, {\tt ox} はたとえば次のように起動される.
143: {\footnotesize \begin{verbatim}
144: /home/nobuki/kxx/ox -reverse -ox /home/nobuki/kxx/ox_sm1
145: -data 1172 -control 1169 -pass 1045223078
146: \end{verbatim} }
147:
148: {\tt ox} は, 子どもプロセスとして, {\tt ox\_asir}, {\tt ox\_sm1}
149: などを起動するのであるが,
150: これらのプロセスは
151: 3 よりOX データ, コマンドを読み込み, 4 へ OX データを書き出す.
152: 現在の実装では 3 と 4 は dup して同一視してしまっている.
153: {\tt ox} はTCP/IP のデータ転送のポートを, 3, 4 へわりあてて,
154: 子どもプロセスを起動する.
155: {\footnotesize \begin{verbatim}
156: close(fdControl); /* close(0); dup(fdStream); */
157: dup2(fdStream,3);
158: dup2(fdStream,4);
159: \end{verbatim}}
160:
161:
162: \subsubsection{ {\tt ox\_asir} phrase book}
163:
164: [ この節の記述は古い]
165: CMObject と asir の object は次の規則にしたがって変換される.
166: なお asir の object のタグをみるには関数 {\tt type} を用いる.
167: \begin{enumerate}
168: \item Null : 0 として使用される.
169: \item Integer32 : 内部的にのみ使用される. 送出は, ZZ に変換される.
170: -1 は (unsigned int) -1 に変換されてから, ZZ に変換されるので,
171: 正の数となる.
172: \item Cstring : 文字列 (type = 7) に変換される.
173: \item ZZ : 数 (type = 1 ) に変換される.
174: \item QQ : 数 (type = 1 ) に変換される.
175: \item List : リスト (type = 4) に変換される.
176: \item Dpolynomial : 分散表現多項式 (type = 9) に変換される.
177: order はうけとったモノミアルのリストと同じ order である.
178: \item RecursivePolynomial : 再帰表現多項式に変換される.
179: 内部順序に自動変換される.
180: \item Indeterminate : 不定元に変換される.
181: \end{enumerate}
182: 記述のない CMObject に関しては, 利用できない (cf. mathcap ).
183:
184: \noindent
185: 問題点: 0 の扱いの仕様がまださだまっていない.
186: Null が数 (type = 1) の 0 に変換される版もある.
187:
188: \medbreak
189: \noindent
190: 例:
191: 分散表現多項式の $x^2-1$ の因数分解を asir にやってもらう
192: OXexpression の列をあげる.
193: {\footnotesize
194: \begin{verbatim}
195: (OX_DATA, (CMO_LIST, 4, CMO_DMS,CMO_DMS_GENERIC,
196: (CMO_MONOMIAL32,1,2,(CMO_ZZ,1)),
197: (CMO_MONOMIAL32,1,0,(CMO_ZZ,-1)))),
198: (OX_DATA, (CMO_INT32,1))
199: (OX_DATA, (CMO_STRING,"ox_dtop"))
200: (OX_COMMAND,(SM_executeString))
201:
202: (OX_DATA, (CMO_INT32,1))
203: (OX_DATA, (CMO_STRING,"fctr"))
204: (OX_COMMAND,(SM_executeString))
205:
206:
207: (OX_DATA, (CMO_INT32,1))
208: (OX_DATA, (CMO_STRING,"ox_ptod"))
209: (OX_COMMAND,(SM_executeString))
210:
211: (OX_COMMAND,(SM_popCMO))
212: \end{verbatim}}
213:
214: ここで, ZZ の元を普通の整数表記であらわした.
215: {\tt dtop1} および {\tt ptod1} はそれぞれ, 分散表現多項式を, Asir の再帰表現
216: 多項式に, 逆に, Asir の再帰表現多項式を, 分散表現多項式に変換する,
217: ユーザ定義の 1 引数関数である. %% kxx/oxasir.sm1
218: これらの関数は Asir の リストにも作用させることが可能であり, その場合は
219: 要素としてでてくる, 分散表現多項式 または Asir の再帰表現多項式
220: を必要な形に変換する.
221: {\tt fctr} は因数分解をする組み込み関数である.
222:
223: {\tt kxx/oxasir.asir} のソース.
224: {\footnotesize \begin{verbatim}
225: OxVlist = [x,y,z]$
226:
227: def ox_ptod(F) {
228: extern OxVlist;
229: if (type(F) == 4) return(map(ox_ptod,F));
230: else if (type(F) == 2) return(dp_ptod(F,OxVlist));
231: else return(F);
232: }
233:
234: def ox_dtop(F) {
235: extern OxVlist;
236: if (type(F) == 4) return(map(ox_dtop,F));
237: else if (type(F) == 9) return(dp_dtop(F,OxVlist));
238: else return(F);
239: }
240:
241: end$
242: \end{verbatim}}
243:
244: \subsubsection{ {\tt ox\_sm1} phrase book }
245:
246: [ この節の記述は古い]
247: CMObject と kan/sm1 の object は次の規則にしたがい変換される.
248: なお, kan/sm1 の object のタグをみるには, {\tt tag} または {\tt etag}
249: を用いる.
250: \begin{enumerate}
251: %% \item Error : Error (etag = 257) に変換される.
252: \item Error2 : Error (etag = 257) に変換される.
253: \item Null : null (tag = 0) に変換される.
254: \item Integer32 : integer (tag = 1) に変換される.
255: \item Cstring : 文字列 (type = 5) に変換される.
256: \item ZZ : universalNumber (type = 15 ) に変換される.
257: \item QQ : rational (tag = 16 ) に変換される.
258: \item List : array (tag = 6) に変換される.
259: \item Dpolynomial : 多項式 (tag = 9) に変換される.
260: \end{enumerate}
261:
262:
263: \noroa{ {\tt SS475/memo1.txt} も見よ.}
264:
265: 注意: {\tt ReverseOutputOrder = 1} (標準)
266: のとき, {\tt xn, ..., x0, dn, ..., d0} の順番で
267: ({\tt show\_ring} の形式) Dpolynomial に変換される
268: (印刷形式だと,
269: {\tt xn} は {\tt e}, {\tt d0} は {\tt h},
270: {\tt x0} は {\tt E}, {\tt dn} は {\tt H}).
271: たとえば,
272: {\tt ox\_send\_cmo(id,<<1,0,0,0,0,0>>)} は,
273: {\tt x2} に変換される.
274: {\tt ox\_send\_cmo(id,<<0,0,1,0,0,0>>)} は,
275: {\tt x0} に変換される.
276:
277: {\tt OxVersion} 変数で openXM のプロトコルの version を表す.
278:
279: \subsubsection{ {\tt ox\_sm1} を用いたクライアントのテスト方法 }
280: まだかいてない.
281:
282: \subsubsection{ {\tt Asir} を用いたサーバのテスト方法 }
283:
284: \subsection{ 最小の TCP/IP クライアントの例 }
285:
286: Java または M2 によるソースコードを掲載の予定.
287:
288: \subsection{ クライアント asir, sm1 }
289:
290: sm1 については, ox.sm1 , oxasir.sm1 がクライアントパッケージ.
291: {\tt ox}, {\tt ox\_asir}, {\tt ox\_sm1} の存在するパス,
292: および sm1 より呼び出すための asir の関数定義である
293: {\tt oxasir.asir} のあるパスを
294: これらのパッケージに書き込んでおく必要がある.
295:
296: {\tt ox\_asir} は, {\tt asir} なる名前でよばれると
297: asir として動作し, {\tt ox\_asir} なる名前でよばれると,
298: open XM サーバとして動作する.
299: {\tt /usr/local/lib/asir} または
300: {\tt ASIR\_LIBDIR} へ {\tt ox\_asir} 実体をおき,
301: {\tt ox\_launch} をおなじディレクトリへ {\tt ox\_asir} へのシンボリックリンク
302: として作成する.
303: コマンドサーチパスにあるディレクトリへ {\tt asir} を {\tt ox\_asir}
304: へのシンボリックリンクとして作成する.
305: {\footnotesize
306: \begin{verbatim}
307:
308: This is Asir, Version 990413.
309: Copyright (C) FUJITSU LABORATORIES LIMITED.
310: 3 March 1994. All rights reserved.
311: 0
312: [324] ox_launch(0,"/usr/local/lib/asir/ox_asir");
313: 1 <=== これがサーバの番号.
314: [326] ox_execute_string(1,"fctr(x^10-1);");
315: 0
316: [327] ox_pop_local(1);
317: [[1,1],[x-1,1],[x+1,1],[x^4+x^3+x^2+x+1,1],[x^4-x^3+x^2-x+1,1]]
318: [328] ox_execute_string(1,"dp_ptod((x+y)^5,[x,y]);");
319: 0
320: [329] ox_pop_cmo(1);
321: (1)*<<5,0>>+(5)*<<4,1>>+(10)*<<3,2>>+(10)*<<2,3>>+(5)*<<1,4>>+(1)*<<0,5>>
322: [330] ox_rpc(1,"fctr",x^10-y^10);
323: 0
324: [331] ox_pop_local(1);
325: [[1,1],[x^4-y*x^3+y^2*x^2-y^3*x+y^4,1],[x^4+y*x^3+y^2*x^2+y^3*x+y^4,1],[x+y,1],[x-y,1]]
326: [332] ox_rpc(1,"fctr",x^1000-y^1000); ox_cmo_rpc もあり.
327: 0
328: [333] ox_flush(1);
329: 1
330: [334] ox_pop_local(1);
331: 0
332:
333: ox_sync(1); --- sync ball を送る.
334:
335: \end{verbatim}}
336:
337: \subsection{開発中のサーバ, クランアント}
338:
339: Mathematica サーバ, クライアント : 小原.
340: Java クライアント, Open Math proxy : 田村.
341: Gnuplot サーバ, Macaulay 2 クライアント, サーバ,
342: その他小さいソフト (Toric GB, Grobner fan)のサーバ,
343: Algebraic equation solver by numerical method: 高山.
344: Open Asir マニュアル, サンプル: 小原, 高山.
345:
346: 数学的におもしろい問題を実際にあつかってみないと
347: わからない問題点もおおくあると思う.
348: 現在, ${\cal A}$-超幾何関数の解のグラフ表示,
349: パラメータ付積分のグラフ表示のソフトをかくことで
350: さらに問題点をさぐることを
351: 計画している.
352: グレブナdeformation による多項式解, 有理解の導出(線形および非線形方程式,
353: 非線形微分方程式から出発すると代数方程式を解く問題になる)
354: は OpenXM 的なプログラムのおもしろい練習問題.
355: Java の並列計算記述能力をつかって ox サーバを使うのもおもしろい.
356:
357: 世界中の人につかってもらえる規格にするには
358: まだまだ実験と経験をかさねないといけない.
359: Free Mathematical Software Initiative を作るべきだろう.
360:
361: \subsection{ Change log }
362: \begin{enumerate}
363: \item 1997/11/20 : この document の最初の version が生まれた.
364: kxx/openxxx.tex なる名前であった.
365: \item 1999/07 : {\tt CMO\_ZZ} の形式を変えた.
366: \item 1999/09/7, 9/8 : 分散表現多項式, Mathcap, RecursivePolynomial,
367: の形式を変えた. asir, sm1 に実装した. エラー処理のために,
368: dupErrors, getsp を SM コマンドに加えた.
369: \end{enumerate}
370:
371: \subsection{ }
372: Java で sm1 サーバをすべて書いてみるか?
373: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>