console プログラムにおける命令記述言語の拡張

最終更新日:2007年10月31日

はじめに

この文書では,SILC のサンプルプログラムの1つである console プログラム (src/client/console.c) における SILC の数式 (命令記述言語) の拡張 仕様について述べる.このプログラムは,(1) SILC の数式を対話的に実行す ること,(2) たくさんの数式をファイルから読み込んで一括実行することがで きる.また,SILC の命令記述言語の仕様を拡張しており,条件分岐や反復な どを記述できる.このプログラムを用いることにより,C や Fortran など他 のプログラミング言語の処理系がなくても SILC のユーザプログラムを作成で きる.

条件分岐

条件分岐は以下の形式で記述する:

if (cond_expr) {
  stmt; ...
} else if (cond_expr) {
  stmt; ...
} else {
  stmt; ...
}

cond_expr には後述の条件式を指定する. stmt は任意の文を表す.else 節は省略できる.中括弧は省略できない.

反復,continue 文,break 文

反復は以下の形式で記述する:

while (cond_expr) {
  stmt; ...
}

cond_expr には後述の条件式を指定する.中括弧は省略できない.また, continue 文と break 文が利用できる.

条件式

条件式 (cond_expr) は以下の比較演算子から成る.

expr には SILC の命令記述言語で記述された式を指定する.この式の値 はスカラーでなければならない.スカラー以外 (ベクトル,行列など) の値を 取る式を与えると実行時エラーとなる.さらに,上記の条件式は次の論理演算 子および括弧により結合できる.

比較演算子および論理演算子は値として真理値を取る.真理値を取らない式は 条件式として利用できない.また,真理値を表す定数として true および false が利用できる.

console プログラムにおける比較演算子の処理方法は次の通りである.

  1. 比較演算子の左辺および右辺に指定された式をそれぞれ一時変数 _ に 対する代入文として実行する:

    SILC_EXEC("_ = expr")
    
  2. 一時変数の値を SILC サーバから受け取る:

    SILC_GET(&tmp, "_")
    
  3. 受け取った値をクライアント側で比較する.

拡張システム文

SILC の命令記述言語で定義されているシステム文に加えて,以下の拡張シス テム文が利用できる.

その他

条件分岐,反復,および拡張システム文はクライアント側で実行する.その他 の文 (SILC の命令記述言語における文) はサーバ側で実行する.すなわち, データはすべて SILC サーバ側で管理する (console プログラムにはデータ管 理機構はない).

文はセミコロンで区切ってつなげることができる.行末のセミコロンは省略可.

行末に \ を置くと直後の改行記号を読み飛ばす.例えば,以下の文は1行 とみなされる:

B = {1, 2, 3; \
     4, 5, 6; \
     7, 8, 9}

# から行末まではコメントとみなして読み飛ばす.

利用例

上述の拡張命令記述言語で実現した共役勾配 (Conjugate Gradient, CG) 法の プログラムを以下に示す:

# 三重対角行列 A とベクトル b を作る
n = 400
A = diag(2.0 * ones(n, 1)) - diag(ones(n-1, 1), 1) - diag(ones(n-1, 1), -1)
b = A * (-ones(n, 1))

# 連立一次方程式 Ax=b を CG 法で解く
rho_old = 1.0
p = zeros(n, 1)
x = zeros(n, 1)
r = b
bnrm2 = 1.0 / norm2(b)
iter = 1
while (iter <= n) {
  rho = r' * r
  beta = rho / rho_old
  p = r + beta * p
  q = A * p
  alpha = rho / (p' * q)
  r = r - alpha * q
  nrm2 = norm2(r) * bnrm2
  x = x + alpha * p
  if (nrm2 <= 1.0e-12) {
    break
  }
  rho_old = rho
  iter += 1
}

# 解 x をファイルに保存する
save "sol.mtx", x

# 反復回数を表示する
message "number of iterations:"
pprint iter

実行方法: 上記のプログラムをファイル (例えば silc_cg.txt) に保存し, SILC サーバを起動した上で次のように console プログラムを実行する:

console silc_cg.txt

反復回数 (number of iterations) が200回で終了すれば正常動作している.

改訂履歴

$Id: README.console.ja,v 1.5 2007/10/31 05:18:48 kajiyama Exp $