/**
* @file 思考エンジンAZjsEngineのRMI版です。ドキュメントは本体側のコードを参照してください。
*/
/*
* @author 市川雄二
* @copyright 2018 ICHIKAWA, Yuji (New 3 Rs)
* @license MIT
*/
import { WorkerRMI, resigterWorkerRMI } from 'worker-rmi';
import { NeuralNetwork } from './neural_network.js';
import { SearchMode } from './search_mode.js';
// 思考エンジンAZjsEngineの本体をウェブワーカーとして動かします。
const worker = new Worker('js/az-worker.js');
// ニューラルネットワークをメインスレッドで動かすように登録します。
// WebGL/WebGPUがメインスレッドのみで動作するからです。
// 実際の呼び出しは上記ワーカがします。
resigterWorkerRMI(worker, NeuralNetwork);
/**
* 思考エンジンAZjsEngineのRMI版です。ドキュメントは本体側のコードを参照してください。
* @alias AZjsEngineRMI
* @see AZjsEngine
*/
export class AZjsEngine extends WorkerRMI {
/**
* 碁盤サイズsizeの思考エンジンを返します。
* @param {Integer} size
*/
constructor(size) {
super(worker, size);
}
/** */
async loadNN() {
await this.invokeRM('loadNN');
}
/** */
async clear() {
await this.stop();
await this.invokeRM('clear');
}
/**
* timeSettingsのRMIです。
* mainTimeとbyoyomiの取得でRMIを避けるため、設定値をこちらでも保持します。
* @param {number} mainTime
* @param {number} byoyomi
*/
async timeSettings(mainTime, byoyomi) {
this.mainTime = mainTime;
this.byoyomi = byoyomi;
await this.invokeRM('timeSettings', [mainTime, byoyomi]);
}
async genmove(mode = SearchMode.HARD) {
return await this.invokeRM('genmove', [mode]);
}
async play(x, y) {
await this.invokeRM('play', [x, y]);
}
async pass() {
await this.invokeRM('pass');
}
async search() {
return await this.invokeRM('search');
}
async finalScore() {
return await this.invokeRM('finalScore');
}
async ponder() {
return await this.invokeRM('ponder');
}
async stop() {
await this.invokeRM('stop');
}
async timeLeft() {
return await this.invokeRM('timeLeft');
}
}