hRなのでサイズクラスでは表題の件を実現できません。これについてググると、traitCollectionをoverrideする方法が出てきます。hRもしくはhCに変えてしまおうというアイデアです。supportedになりました。なんとかしないといけません。方法はありますが、拡張性を重視して以下の方法を採用しました。hRについてポートレートとランドスケープそれぞれについてストーリボードで制約を設計。両方installedにすると衝突するので、メインと思われる片方のみinstalledにする。hRの場合、isPortraitに応じて2で設計した制約のどちらかだけをactivateする。hRのときの縦横比からisPortraitの条件が変わった場合、isPortraitを設定してview.setNeedsUpdateConstraintsを呼び出すこれで色々な状況に対応できました。念頭にある回転だけでなく、例えば、アプリがフォワグランドに復帰するときとか、スプリットビューとか。これだけ書くと当たり前っぽい処理ですが、ここに至る前にupdateVIewConstraintsをoverrideせずにviewWillTransition(to:with:)内で制約を切り替える方法を実装して嵌りました。updateVIewConstraintsはデフォルトでは色々な状況でストーリボードの制約を読み直す処理が入っているようで、viewWillTransition(to:with:)で設定しても有効にならないケースが複数ありました。以上、ご参考になれば幸いです。これに関してもっと常識のイデオムがあれば教えていただきたく。追記(2019/02/19)猛烈に勘違いしていました。AlphaZeroは、バリューネットワークの出力には[-1,1]レンジを使っていますが、MCTSでは[0,1]レンジだそうです。talkchess.com今までのいくつかの謎が氷解しました。これに合わせてコードのコメントとオリジナルコードのバグを修正しました。1年前大騒ぎになったAlphaZeroの論文が正式に出版されました。擬似コードも公開されたので、今日はそれを読みましょう。コメントを挿入しました。hintを通すためにPython3に直しました。5,000台のTPUを使って自己対戦をさせてます。30手まではMCTSプレイアウト数に比例した確率で着手を選択します。手数が長い場合、チェス,将棋は引き分け、囲碁はTromp-Taylorルールスコアに従います。ルートノードではポリシー確率に事実上1点ランダムな着手を確率0.25増しにしてMCTSを行います。事実上というのはalphaがこのように1より小さい場合原点付近の非常に鋭利な関数になるからです。Leeが第4局で負けた教訓で、ポリシー確率の低い手を打たれてもMCTSがそれを咎める手を探せるように訓練します。AlphaZeroではCpuctがプレイアウト数に依存する関数になりました。プレイアウトを増やしても手があまり変わらなくなる性質を抑制するためと思われます。論文ではエッジを更新するアルゴリズムですが、ノードを更新しています。結果として論文ではWは親ノードのバリューでの初期化、コードではW=0と違ったアルゴリズムを実装しています。WはMCTS内部では[-1,1]ではなく[0,1]です。すべてのエッジは勝率0のバリューで初期化されます。今日は碁盤描画周りです。間口の一番広いウェブアプリを対象にします。JavaScriptの碁盤描画のライブラリをまずご紹介します。HTML5以前では事実上のデファクトスタンダードだったオープンソースのウェブアプリです。耳赤サイトでも現役で活躍しています。canvasを使った美しい碁盤ライブラリです。碁や慎始(どちらも私の自作ウェブアプリです)で利用させていただいています。AZ.jsの碁盤もこれです。有料の商用の場合、ライセンスの確認が必要です。canvasを使った碁盤ライブラリです。Teachで使われています。実装に特徴があって市松模様上に描画したcanvasを2枚重ねることで長いラベルにも対応しています。Electronを使った碁盤アプリです。ElectronなのでJavaScriptで書かれておりウェブアプリ版もあります。Zeroにも対応し、今も積極的に開発が続いているこころ強いソフトです。DOMで描画しています。個人的にはHTML5が安定した現在にあっても碁盤描画はcanvas描画ではなくDOMで構成するのが筋がいいと思っています。遊ぼうと思うとcanvasが自由ですね。碁盤になる自家製描画ライブラリをご紹介します。どんなものかライブラリを使ったウェブアプリから。Chromeで見てください。Safariだと肝心な部分の描画が欠けます。)描画に思いっきり特長があるので、あえて囲碁と呼ばずに「アレロ」と呼んでいます。わかる人にわかると思いますが、ルールは囲碁のTromp-Taylerルールと同値です。Tromp-Taylerルールは純碁から地埋めをなくしたルールでわかれば一番シンプルなのですが、文章で読むと難しい感じがします。いう理解のための障壁をなくすため、出来うる限り可視化に努めました。石と石がくっついたり、呼吸点がなくなったりする様子がわかりますし、なぜ石が盤上から消えるのかもうまく説明できたと思っています。「アレロ」はこれから色々展開していく予定です。このウェブアプリの描画ライブラリが、allelo-boardです。WebGLとSVGとHTML5の次の技術を駆使しています^^描画の実装のご参考になれば幸いです。(商標やデザインなど今後権利化していく可能性があります。今日はちょっと変わったところで、SGFファイルを扱う方法です。SGFというのは、様々なプラットフォーム上で販売されているSmartGoというアプリケーションのファイルフォーマットです。Formatの略で、囲碁以外のボードゲームにも対応可能なフォーマットです。囲碁のファイルフォーマットはアプリケーション毎に他にも色々ありますが、仕様がドキュメント化されているこのSGFが事実上標準フォーマットという感じです。テキストフォーマットなので中身を見たことのある人も多いかと思います。(;FF[4]GM[1]CA[UTF-8]AP[囲碁の師匠:1.1.2]SZ[19]HA[2]AB[pd][dp];W[dd])見ただけでなんとなく意味もわかる、わかりやすいフォーマットですね。いうフォーマットを扱うには、扱うプログラムを直接書くのではなく、パーサジェネレータというものを使うと楽ができます。パーサジェネレータというのは、フォーマットの規則を与えると、その規則に則ってフォーマットに従った文字列からデータ構造を抽出するコード(パーサ)を生成してくれるものです。パーサジェネレータを使って作った自作のパーサをいくつかご紹介します。JavaScript用SGFパーサ。Jisonというパーサジェネレータを使いました。Rust用SGFパーサ。rust-pegというパーサジェネレータを使いました。Swift用SGFパーサ。citronというパーサジェネレータを使いました。なんでいくつも作っているのかというと、それだけ作るのが簡単だからです^^jssgfを作った時のSGFフォーマットを記述を見てみましょう。};%%こんな風に、コレクションはどういうもの?ゲームツリーはどういうもの?シークエンスはどういうもの?ノードはどういうもの?という規則を書くと、JavaScriptで書かれたパーサを生成してくれます。実はこの規則、SGFの仕様書に書かれたものをほぼ書き写したものです。以下はSGFの仕様書より。Stone)似てるでしょ?なので、新しいプログラミング言語に取り組んだときも、その言語のパーサジェネレータがあれば、その言語用にSGFパーサを用意することは簡単なのです。