PIONE定義書
ここではPIONEの定義書における基本的な記述ルールを示します。具体的な記述や動作についてはPIONEチュートリアルをご覧下さい。厳密な定義などはこちらのpione-docをご覧下さい。また、記法における細かい注意点などはPIONE定義書のTIPSをご覧下さい。
目次
ルールの記述方法
ルール内は大きく#ルールヘッダーと#条件定義と#振る舞い定義に分かれます。#ルールヘッダーはルール名を宣言し、#条件定義は入力ファイルや出力ファイル、パラメータなど、#振る舞い定義はその条件に対する処理を定義します。
ルールヘッダー
Ruleを使用してルール名を宣言します。ここで、Mainは特殊な宣言で実行時に最初に実行されるルールですので、注意して下さい。また、この外で行った#パラメータ定義や#変数束縛文は全てのルールで有効となります。
条件定義
条件定義では#入力定義、#出力定義、#パラメータ定義、#特性定義を必要に応じてそれぞれ記述します。
入力定義
直示表現による記述
input 'XXX.YYY'といったように定義します。宣言するファイル名を必ずシングルクォートで囲みます。このように定義するとそのルール内であればどこでも{$I[N]}として使用できるようになります。ここでNは入力定義されている順番を指します。例えば、
input 'abc.def' input 'ghi.jkl' input 'mno.pqr'
上記の場合は{$I[1]}が'abc.def'を、{$[2]}が'ghi.jkl'を指します。
ワイルドカードによる記述
さらに、*(アスタリスク)を任意の文字として使用することもできます。このときの任意の文字列を取り出す場合は{$[N][M]}として使用します。ここでNは入力定義の順番、Mはinputで定義したフォーマットで左から数えた*に該当する文字列となります。但し、*の間にある区切り文字(下記ではピリオド)は右から判定します。例えば、ディレクトリに
ab.cd.ef gh.ij.kl mn.op.qr
の3つのファイルがあったとします。このとき入力定義にて
input '*.*.*' input '*.*.ef' input '*.*'
上記の場合は{$[1][3]}がそれぞれef, kl, qrとなり、{$I[2][1]}はab、{$I[3][1]}はそれぞれab.cd, gh.ij, mn.opとなります。
また、$*といった特殊な記法がありますが、これは{$I[1][1]}の略記です。makefileからPIONE定義書に書き換えるときに記述を流用するために使用しています。
量化の概念
ワイルドカードを使用しているとき、さらに「each」や「all」の概念を持っています。「each」はファイル1つ1つを入力に処理を実行し、「all」は全体を入力として処理を実行します。入力ファイルと出力ファイルを1対1対応の処理で動かしたいときは「each」、入力ファイルの全てを使用した処理を動かしたいときに「all」を使用するというように考えれば良いでしょう。下記のように定義し、省略した場合は「each」が適用されます。
eachの定義
input '*.tif'.each
具体的な記述や動作についてはPIONEチュートリアル#基本4(複数ファイルの入力と複数ファイルの出力の並列処理)をご覧下さい。
allの定義
input '*.tif'.all
具体的な記述や動作についてはPIONEチュートリアル#基本3(複数ファイルの入力と複数ファイルの出力)をご覧下さい。
orの使用
入力条件に「または」を使用したい場合にはorで繋いで記述することができます。
input '*.tif' or '*.tiff'
上記の場合は入力として.tifファイルまたは.tiffファイルがあれば処理を実行されます。
出力定義
output 'XXX.YYY'といったように定義します。#入力定義と同様{$O[N]}や{$O[N][M]}としてルール内で使用することができます。出力定義の場合、.stdoutや.stderrを使用すると、標準出力やエラー出力をそのファイルに書き込むことができます。
output 'XXX.YYY'.stdout output 'AAA.log'.stderr
パラメータ定義
パラメータにはbasicとadvancedの2つがあり、定義したルール内で有効です。外で定義した場合はグローバル変数のように全てのルールで有効となります。前者を基本パラメータ、後者を上級者向けパラメータとして定義します。basicはparamもしくはbasic paramあるいはBasic Param - End間(ルール外のみ可能)で定義し、advancedはadvanced paramあるいはAdvanced Param - End間(ルール外のみ可能)で定義します。:=にてパラメータのデフォルト値を定義することができます。デフォルト値が定義されていない変数は実行時に値が必ず設定されていなければなりません。(参照: pione-client#オプション --params、PIONEチュートリアル#基本6(パラメータの定義))
param $val basic param $b_val := 456 advanced param $a_val := 987 Basic Param $b_val1 := 135 $b_val2 End Advanced Param $a_val1 := 975 $a_val2 := 864 End Main Rule param $m_val := 731 basic param $m_b_val := 426 advanced param $m_a_val := 971 . . .
Action内で使用するときは{ }を用います。
echo "{$val} {$b_val1} {$b_val2} {$a_val1} {$a_val2}" > {$O[1]}
特性定義
タスクを実行するためのマシンの条件などを定義します。
Rule Main output 'message.out' Flow rule A End Rule A output 'message.out' feature +X Action touch {$O[1]} End
上記の例ではXを特性として持っているマシンに対してルールAを実行するように振り分けます。
振る舞い定義
振る舞い定義では#アクション定義もしくは#フロー定義のいずれかを記述します。
アクション定義
ActionとEndで挟んで記述します。この間の記述は基本的にシェルスクリプトです。但し、#条件定義で記述した入出力や変数などを使用するときはルール内の記述に従って、{$I[N]}, {$O[N][M]}, {$val}などのように記述します。さらにこれらの変数やパラメータはPIONEの式によるメソッドを利用することもできます。
フロー定義
FlowとEndで挟んで記述します。この間の記述はPIONEの記法になりますので、#アクション定義と混同しないように注意が必要です。#変数束縛文、#ルール呼び出し文、#条件処理文を必要に応じて記述します。
変数束縛文
このルールで使用する変数に値を設定します。paramを付けずに宣言します。この設定はC言語でいうところの#defineに当たるもので、変数の再設定はできません。またパラメータと違いユーザから見えない部分ですので、パラメータから内部的な処理を行うための計算としても使用できます。
$val := 1
ルール呼び出し文
rule (ルール名)として他のルールを呼び出します。
rule SubRule1
条件処理文
パラメータなどを用いた条件処理にてフロー制御します。条件処理には#if文と#case文があります。使用する式についてはPIONEの式をご覧下さい。
if文
ifやelseを使用します。文の終わりにはendを使用します。
if {$val} <= 100 rule Sub1 else rule Sub2 end
case文
caseやwhen, elseを使用します。文の終わりにはendを使用します。
case {$mode} when 1 rule Abc when 2 rule Def else rule Ghi end