diff --git a/engine-wasm/bench.mjs b/engine-wasm/bench.mjs index f45b59c..0a0e875 100644 --- a/engine-wasm/bench.mjs +++ b/engine-wasm/bench.mjs @@ -35,6 +35,7 @@ const { positions } = JSON.parse(readFileSync(sitePath("wasm/positions.json"), " const times = await measureTimes({ bestMove: (...args) => engine.run(commands.bestMove(...args)), cubeDecision: (...args) => engine.run(commands.cubeDecision(...args)), + analyseMove: (...args) => engine.run(commands.analyseMove(...args)), }, positions, (done, total) => process.stderr.write("\r " + done + "/" + total + " calculs")); process.stderr.write("\n"); diff --git a/web/engine-wasm.mjs b/web/engine-wasm.mjs index 3430d27..7c66372 100644 --- a/web/engine-wasm.mjs +++ b/web/engine-wasm.mjs @@ -78,6 +78,8 @@ export const commands = { ["--ply", ply, "cube", positionId, matchId], evaluate: (positionId, matchId, ply) => ["--ply", ply, "eval", positionId, matchId], + analyseMove: (positionId, matchId, dice, playedPositionId, ply) => + ["--ply", ply, "analysemove", positionId, matchId, diceText(dice), playedPositionId], reference: (positionId, matchId, dice, ply) => ["--ply", ply, "reference", positionId, matchId, ...(dice ? [diceText(dice)] : [])], }; diff --git a/web/moteur/bench-page.mjs b/web/moteur/bench-page.mjs index f6a47c1..dcf5f4d 100644 --- a/web/moteur/bench-page.mjs +++ b/web/moteur/bench-page.mjs @@ -43,6 +43,7 @@ async function measure() { const times = await measureTimes({ bestMove: (...args) => engine.bestMove(...args).then(keepMemory), cubeDecision: (...args) => engine.cubeDecision(...args).then(keepMemory), + analyseMove: (...args) => engine.analyseMove(...args).then(keepMemory), }, positions, (done, total) => { $("status").textContent = "Calcul " + done + " sur " + total + "…"; }); diff --git a/web/moteur/benchmark.mjs b/web/moteur/benchmark.mjs index 2c7d15b..c8ea54f 100644 --- a/web/moteur/benchmark.mjs +++ b/web/moteur/benchmark.mjs @@ -15,6 +15,9 @@ export const TIME_THRESHOLDS = [ { key: "move0", label: "Meilleur coup, 0 pli", limitMs: 300 }, { key: "move2", label: "Meilleur coup, 2 plis", limitMs: 3000 }, { key: "cube2", label: "Décision de videau, 2 plis", limitMs: 3000 }, + // Étape 1a : l'analyse du coup joué, pour le conseil du maître, calculée + // en arrière-plan ; même repère que le meilleur coup (ADR 0009). + { key: "analysis2", label: "Analyse du coup joué, 2 plis", limitMs: 3000 }, ]; // Taille totale à télécharger, compressée : moins de 40 Mo. @@ -34,19 +37,29 @@ export const DOWNLOADED_FILES = [ "wasm/engine.data", ]; -// engine : objet avec bestMove(positionId, matchId, dice, ply) et -// cubeDecision(positionId, matchId, ply), qui renvoient (ou promettent) -// { result, ms }. +// engine : objet avec bestMove(positionId, matchId, dice, ply), +// cubeDecision(positionId, matchId, ply) et analyseMove(positionId, matchId, +// dice, playedPositionId, ply), qui renvoient (ou promettent) { result, ms }. +// Le coup analysé est le meilleur coup à 0 pli : celui qu'un joueur aurait +// pu jouer, analysé à 2 plis comme pour le conseil du maître. // positions : le tableau « positions » de positions.json. // onProgress(done, total) : appelé après chaque calcul. // Renvoie, pour chaque clé de TIME_THRESHOLDS, la liste des // { id, ms } mesurés. export async function measureTimes(engine, positions, onProgress = () => {}) { const tasks = []; + const played = new Map(); for (const p of positions) { if (p.type === "move") { - tasks.push(["move0", p, () => engine.bestMove(p.position_id, p.match_id, p.dice, 0)]); + tasks.push(["move0", p, async () => { + const answer = await engine.bestMove(p.position_id, p.match_id, p.dice, 0); + // Sans coup possible, n'importe quelle position fait l'affaire. + played.set(p.id, answer.result.best_move?.position_id ?? p.position_id); + return answer; + }]); tasks.push(["move2", p, () => engine.bestMove(p.position_id, p.match_id, p.dice, 2)]); + tasks.push(["analysis2", p, () => engine.analyseMove(p.position_id, p.match_id, p.dice, + played.get(p.id), 2)]); } else { tasks.push(["cube2", p, () => engine.cubeDecision(p.position_id, p.match_id, 2)]); } diff --git a/web/moteur/engine-client.mjs b/web/moteur/engine-client.mjs index f8ddfc5..b50b436 100644 --- a/web/moteur/engine-client.mjs +++ b/web/moteur/engine-client.mjs @@ -58,6 +58,8 @@ export function startEngine() { run(commands.bestMove(positionId, matchId, dice, ply)), cubeDecision: (positionId, matchId, ply) => run(commands.cubeDecision(positionId, matchId, ply)), + analyseMove: (positionId, matchId, dice, playedPositionId, ply) => + run(commands.analyseMove(positionId, matchId, dice, playedPositionId, ply)), evaluate: (positionId, matchId, ply) => run(commands.evaluate(positionId, matchId, ply)), reference: (positionId, matchId, dice, ply) =>