-
Notifications
You must be signed in to change notification settings - Fork 7
Open
Labels
Description
例えば以下のように書けるようにしたい。
import maf
def configure(conf): pass
def build(exp):
exp(source='hoge1', target='piyo',
parameters=[{'ttt':0}],
rule='cat ${SRC} > ${TGT}')
exp(source='hoge2', target='piyo',
parameters=[{'ttt':1}],
rule='cat ${SRC} > ${TGT}')
exp(source='piyo', target='fuga_0',
parameters=[{'ttt':0}],
rule='cat ${SRC} > ${TGT}')
exp(source='piyo', target='fuga_1',
parameters=[{'ttt':1}],
rule='cat ${SRC} > ${TGT}')
exp(source='fuga_0', target='hoge2',
aggregate_by='ttt',
rule='cat ${SRC} > ${TGT}')
つまり、2パスの実験のようになっていて、2パス目は1パス目の結果に依存するが、各パスの実験は共通しているような場合をうまく書けるようにしたい。
現状だとmafのExperimentGraphは上のような実験をうまくパースできなくて、メタノード単位で依存関係解析をしているのでcyclic dependencyになってしまう。回避策として1パス目と2パス目でノード名を変えて同じ実験をコピペして書くこともできるが、これはそもそもmafを使うことでやらずに済ませたかったようなケースであり、できるだけやらなくて済むようにしたい。
解決するためにはExperimentContextを全体的に書きなおす必要がありそうで、特に依存解析の方法が大きく変わる。例えば以下のやり方がある。(以下、「解釈」とはそのタスクをwafに登録することを意味する)
まず、どのタスクのtargetにもなっていないsourceを列挙し、これらを"free node"とする。次に、sourceがすべてfree nodeなタスクを解釈し、そのタスクのtarget nodeとパラメータの組をfree nodeに加える。これを繰り返す。
ただし、以下の注意点がある。
- 同じタスクを二回以上解釈しないように、どのタスク・パラメータ対が解釈済みか覚えておき、解釈前に判定する必要がある
- 集約タスクは特別扱いし、他に解釈可能なタスクがなくなったときにだけ解釈するようにする必要がある。また、一つの集約タスクに対して、解釈後にsourceが新たに生成された場合にはcyclic dependencyとしてエラーを吐く必要がある。
以上を実装すれば、2パスの実験を簡潔に書けるようになる。また、依存関係の解析がより実験の実行順序に沿うようになるため、エラーの報告がしやすくなるかもしれない。一方、解析の計算効率は落ちる。