アルゴリズム概要

inputs[:512] <- [規定入力, 乱数*300]
outputs[] <- eval inputs
探索範囲[:1000くらい] <- `親ソルバー < サイズとoperator`

loop:
  if children.size < CPUの2倍:
    child <- `子ソルバー -t 探索範囲.pop < (inputs, outputs)`
    children.push(child)

  child.onFinish:
    if 出力なし:
      goto loop
    else:
      program <- 出力
      探索範囲.push(all 探索中)
      killall children
      status, 反例 <- guess program
      if status == 'win':
        print program
        探索終了
      if status == 'mismatch':
        inputs.append(反例), outputs.append(反例)
      goto loop

という風にやってました。自然言語より似非コードの方が伝わるんで書きなおしてみた。

この辺の作業は時系列順に言うと

  1. @tzik さんが細かい単位で書いていた。
  2. 手作業が面倒だったので全体を繋げた。
  3. @tzik さんが並列化。

という感じに進んでて、よく見ると Python 知識が必要なところは @tzik さんがガシガシ書いてくれました。