コンピュータ碁の開発者の多くが、GoGuiをUIや開発ツールとして利用しているようです。
GoGuiにはコンピュータ碁の開発開発用ツール(スクリプト)が付属されているので、どんなものがあるかメモってみました。
オープンソースのコンピュータ囲碁
昔オープンソースのコンピュータ囲碁にどんなものがあるのか調査したメモを公開します。
他にご存知の方、教えてください。
- KataGo
レポジトリ: https://github.com/lightvector/KataGo
言語: C++, Python
ライセンス: 独自(著作権と許可の表記義務)
コメント: Leela Zeroより5倍以上の学習効率
- Cygo
レポジトリ: https://github.com/syarig/Cygo
言語: Python
ライセンス: GPLv3
コメント: AlphaGo Fanを参考にしたもの。
- PhoenixGo
レポジトリ: https://github.com/Tencent/PhoenixGo
言語: C++
ライセンス: BSD
コメント: Tencent社内でAlphaGo Zeroのレプリカを目指したもの。
- ELF OpenGo
URL: https://research.fb.com/facebook-open-sources-elf-opengo/
レポジトリ: https://github.com/pytorch/ELF
言語: Python, C++
ライセンス: BSD
コメント: Facebook社内でAlphaGo Zeroのレプリカを目指したもの。韓国のトッププロに対して14戦14勝。
- Minigo
レポジトリ: https://github.com/tensorflow/minigo
言語: Python
ライセンス: Apache
コメント: Google社内でAlphaGo Zeroのレプリカを目指したもの。活発に開発が続いている。
ウェイト情報: https://cloudygo.com/
ウェイト: https://console.cloud.google.com/storage/browser/minigo-pub/
- Leela Zero
URL: http://zero.sjeng.org/
レポジトリ: https://github.com/gcp/leela-zero
言語: C++
ライセンス: GPLv3 or later
コメント: AlphaGo Zeroのレプリカを目指したもの。活発に開発が続いている。
ウェイト情報: https://zero.sjeng.org/
- AQ
URL: https://github.com/ymgaq/AQ
言語: C++
ライセンス: MIT
コメント: TensorFlowを使っているのでNNの応用がしやすい。
- Rn
URL: https://github.com/zakki/Ray/
言語: 限りなくCなC++
ライセンス: BSD
コメント: RayにDeep Learningを追加したもの。活発に開発が続いている。
- Ray
URL: http://computer-go-ray.com/
レポジトリ: https://github.com/kobanium/Ray
言語: 限りなくCなC++
ライセンス: BSD
最新安定版: 8.0
- GNU Go
URL: http://www.gnu.org/software/gnugo/
レポジトリ: http://git.savannah.gnu.org/cgit/gnugo.git/
言語: C
ライセンス: GPL3
最新安定版: 3.8(2009)
行数: 87,000行
コメント: 2011年まで3.9の開発が続いていましたが、2013年のコミットを最後にアクティビティがなくなっている。
- Pachi
URL: http://pachi.or.cz/
レポジトリ: https://github.com/pasky/pachi
言語: C
ライセンス: GPL2
最新安定版: 11(2015)
行数: 20,000行
コメント: 現在も開発が続いている。
- Fuego
URL: http://fuego.sourceforge.net/
レポジトリ: http://sourceforge.net/projects/fuego/
言語: C++
ライセンス: GPL3
最新安定版: 1.1(2013)
行数: 72,000行
コメント: 現在も開発が続いている。
- Oakfoam
URL: http://oakfoam.com
レポジトリ: https://bitbucket.org/francoisvn/oakfoam/wiki/Home
言語: C++
ライセンス: BSD
最新安定版: 0.2.0(2014)
- A Monte-Carlo Go AI
URL: http://www.ryanlothian.com/projects/go/
レポジトリ: https://github.com/ryanl/go-ai
言語: C++
ライセンス: GPL3
最新安定版: (2012)
- Library of Effective GO routines
レポジトリ: https://github.com/lukaszlew/libego
言語: C++
ライセンス: GPL
最新安定版:
- Orego
レポジトリ: https://github.com/Orego/Orego
言語: Java
ライセンス:
最新安定版:
- Iomrascálaí
レポジトリ: https://github.com/ujh/iomrascalai
言語: Rust
ライセンス: GPL3
- gogo
レポジトリ: https://github.com/khadiwala/gogo
言語: Go
ライセンス:
最新安定版:
- Isana
レポジトリ: https://github.com/foozea/isana-go
言語: Go
ライセンス:
最新安定版:
- Michi
レポジトリ: https://github.com/pasky/michi
言語: Python
ライセンス: MIT
最新安定版:
コメント: Pachi作者によるミニマル実装
Michiは他言語への移植がされています。
- Michi-c
レポジトリ: https://github.com/db3108/michi-c
言語: C
ライセンス: MIT
最新安定版:
コメント: MichiのC言語移植
- Michi-c2
レポジトリ: https://github.com/db3108/michi-c2
言語: C
ライセンス: MIT
最新安定版:
コメント: Michi-cの改良版
- Michi-Go
レポジトリ: https://github.com/traveller42/michi-go
言語: Go
ライセンス: MIT
最新安定版:
コメント: MichiのGo言語移植
- Kurt
レポジトリ: https://github.com/lefant/kurt
言語: Haskell
ライセンス:
最新安定版:
- Creating board games in Haskell in 100 lines of code
URL: http://keera.co.uk/blog/2013/03/19/creating-board-games-in-haskell/
言語: Haskell
ライセンス:
最新安定版:
- DarkForest
URL: https://github.com/facebookresearch/darkforestGo
言語: Lua/C++
ライセンス: BSD
- MuGo
URL: https://github.com/brilee/MuGo
言語: Python
コメント: A minimalist Go engine modeled after AlphaGo
- DeltaGo
URL: http://home.q00.itscom.net/otsuki/delta.html
言語: C
ライセンス: 無断での商用利用は不可
コメント: AlphaGoのSupervised-Learning Policy Networkのレプリカ
- WeiRustQi
URL: https://github.com/kuking/weirustqi
言語: Rust
ライセンス: GPL 3.0
- pony-mcts
レポジトリ: https://github.com/Mononofu/pony-mcts
言語: Pony/Rust
- RustyGo
レポジトリ: https://github.com/mratsim/rustygo
言語: Rust
バイナリ配布のプログラム
- Leela
URL: https://www.sjeng.org/leela.html
言語: ?
最新安定版: 0.10.0
コメント: 0.9.0が一手15秒でKGS 8d(CPU Skylake 3.5GHz4コア(i5-6600)、GPU R9-390)
パッケージが外部コマンドを起動できない時は
Rustaceanになろうと四苦八苦しています。
Atomでlinter-rustを入れて、cargoで作ったプロジェクトをいじると、
Failed to run cargo spawn cargo ENOENT
というエラーが出ます。cargoがパスにないようです。
OS XのYosemite以降、ターミナルからコマンドを起動しても環境変数が継承されないようで、Atom内部でのprocess.env.PATHを見ると".:/usr/bin:/bin:/usr/sbin:/sbin"となっています。
確かに/usr/local/binが通っていない。
この問題、アプリによらず解決しようと思うと重い問題ですが、Atomでえいやと解決するには、init.coffeeに以下の1行を記述します。
process.env.PATH = "/usr/local/bin:#{process.env.PATH}"
これで、linter-rustが動くようになりました。
日本語マニュアルにカスタム検索機能付けました
Maxima日本語マニュアルにカスタム検索機能を付けました。
日本語マニュアル更新
Maximaの日本語マニュアルを5.37.2に更新しました。
(10月11日に更新したのですが、1箇所訳せなかった部分がようやく訳せたので告知させていただきます。)
一度引退したはずなのですが、変更箇所が少ない状況が続いていますので、まあやっちゃうかという感じです^^;
underscore形式の名前をCamelCaseに変換する
Atomのfind-and-replaceは正規表現が使えますが、JavaScript仕様なので、置換文字に\u(小文字を大文字に変える)などのメタ文字が使えません。
JavaScriptのreplaceは置換文字列引数に関数を与えることができ、それでなんでも変換できるようになっていますが、find-and-replaceには文字列しか渡せないので、表題である「underscore形式の名前をCamelCaseに変換する」ことができません。
なので、init.coffeeに簡単なコマンドを追加しました。
atom.commands.add 'atom-text-editor', 'my-tools:underscore-to-camelcase', -> return unless editor = atom.workspace.getActiveTextEditor() editor.buffer.replace /_[a-z]/, (str) -> str[1].toUpperCase()
これで、コマンドパレット(shift-cmd-p)からmy-tools:underscore-to-camelcaseを実行すれば、名前を変換してくれます。
逆変換は本来もっとややこしい気もしますが、あまりこだわらない単純な実装なら、以下のような感じ。
atom.commands.add 'atom-text-editor', 'my-tools:camelcase-to-underscore', -> return unless editor = atom.workspace.getActiveTextEditor() editor.buffer.replace /[a-z][A-Z]/, (str) -> str[0] + '_' + str[1].toLowerCase()
Collection Typeを使う重い計算にSwiftを使うにはまだ時期が早い?
アルゴリズムに専念できる「高級」言語でコンピュータ囲碁をやってみたいと思い、Swiftを選択してみました。
原始モンテカルロ碁を実装してみて、結論として、残念ながらSwift 2ではまだこういう計算は大変という結論を得ました。
以下、ボトルネックとなったところ。
// reference : Mr. Yamashita's sample code in lectures in Dentsu University let dir4 = [1, WIDTH, -1, -WIDTH] func count_liberty_sub(tz: Int, color: Int, inout liberty: Int, inout stone: Int) { ... for dir in dir4 { .... if board[z] == color { count_liberty_sub(z, color: color, liberty: &liberty, stone: &stone) } } }
このコードが重いのです。dir4はグローバルな定数ですが、関数count_liberty_subで使う時、Swiftは礼儀正しく、swift_bridgeObjectRetainを実行し、その中で_swift_retain_を実行します。
そして関数が戻る時には_swift_release_を実行。
このretainとreleaseがそれぞれ1-2msかかるので、他の処理にほとんど時間がかからなくても重い処理になります。
(試しにdir4に配列リテラルを直接描いてみたら、配列リテラルの生成とリリースが都度発生して悪化しました。)
グローバルな定数配列でARCをしても仕方ないと思うのですが、どういうものなのでしょう?
ちなみに、Optimization LevelはFast, Whole Module Optimizationです。
Swiftはベンチマークでいい数字出しているようですが、全体に、ArrayやSetなどCollection Typeを使うとまだスクリプト言語並みに重いという印象です。