Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

同じメタノード内のノード間に依存関係を持たせたい #100

Open
beam2d opened this issue Dec 16, 2014 · 0 comments
Open

Comments

@beam2d
Copy link
Member

beam2d commented Dec 16, 2014

例えば以下のように書けるようにしたい。

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パスの実験を簡潔に書けるようになる。また、依存関係の解析がより実験の実行順序に沿うようになるため、エラーの報告がしやすくなるかもしれない。一方、解析の計算効率は落ちる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant