Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ All notable maintenance updates to this fork are documented here.

## Unreleased

- Replace isolated point evaluation with equal-weight, multi-point focus in the current supported local KataGo search tree; adopt and save ordinary analysis, retain attention outlines after targets complete, and preserve focus across identical ReadBoard frames (#414).
- Use KataGo root visits for ordinary analysis totals and budgets, preserve same-stream evaluation updates and cache depth protection, and retain exact root counts, candidate order, and edge allocation in SGF (#414).
- Allow fresh point evaluation after returning to an accepted ReadBoard position without another helper frame; validate position semantics and engine synchronization, and reject malformed or stale frame publication (#444).
- Keep thread-source controls visible and locked to CFG for empty or unrecognized local targets, without explanatory warnings (#437).
- Keep remote connection labels with their fields after deferred Swing layout, align thread-source controls with the adjacent benchmark action, and show only current thread policy status (#437).
- Keep thread-source labels aligned across local and remote entries, use concise benchmark button labels, and clear stale tooltips when switching targets (#437).
Expand Down
4 changes: 4 additions & 0 deletions docs/SNAPSHOT_NODE_KIND.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,10 @@ ReadBoard 协议里的 `pass` 行在自动落子/交换顺序链路中表示用
- `undo`、`play`(含真实 PASS)与 `set_position` 使用精确 numbered response identity 和既有 queued/pending retirement。错误、发送失败或超时使所属位置 lineage 失败;迟到响应不能恢复失败来源,也不能结算后继命令。完整替换位置建立新的 lineage,但本身仍需确认。
- `requireResponseBeforeSend` 的普通队列等待真实已写出的响应义务,不使用包含尚未发送后继命令的计数阻塞自身。Engine-game 的精确 ACK/terminal 与 arbitration 语义独立保留。
- 解析和最终节点 publication 均复验冻结目标。被退休、目标过期或未确认的位置输出不能进入候选缓存或 ownership-only backfill;有效历史缓存、SGF 已保存分析、同上下文暂停/继续与主副引擎独立槽位保留。显式失效仍由既有 `isChanged/isChanged2` 允许首个合法低 visits 接管。
- KataGo 普通分析区分精确 root visits、候选 move visits、可选 edgeVisits 和推荐 order。总量与全局预算使用存在的 root;缺少 root 时保留 legacy 非对称候选求和。候选文字使用 move visits,分配比例使用存在的 edge(包括 0),排名沿用 order;节点评价仍来自首选候选。
- 旧 legacy 缓存准入只用 incoming 的同一 legacy 算法比较;通过保护门后可以整份保存 incoming 的真实 root。已存 root 与缺失 root 的新流不可比较,未显式失效时保留缓存。同一已采纳输出 owner 的同 root 新帧可更新评价/PV;新请求、binding 或真实搜索重建不继承该例外。ownership-only 回填不改变候选、计算量口径或已采纳来源。
- SGF 的 LZ/LZOP 及副槽在六个传统 header slots 后保存 `rootVisits=<精确整数>`,候选 PV 前保存 order 和存在的 edgeVisits。无标识数据保持 legacy/unknown;clone/restore 保留分析值但不复制活跃流刷新权限。扩展放在同一分析 payload 内,旧 writer 重建 payload 时一并降级。
- 用户显式通过准入的同树 focus 可为当前节点对应引擎槽位授予整份普通分析采纳权限,允许首份合法精确 root payload 替换更高旧缓存。首份前取消/暂停/失败/context 变化退休未消费权限;已采纳值在完成、取消和同局面暂停后保留。仅 focus 参数重发延续同树刷新关系;真正清树、binding/位置替换仍退休旧权限。具体关注、进度与渲染行为见 `docs/TRACKING_ANALYSIS_CONTRACT.md`。
- 跨 SNAPSHOT 的复合恢复及 ReadBoard 单次最终 resume 遵守下列对应 owner 契约。

## 复合局面恢复确认(Issue #429 / Ticket 02)
Expand Down
263 changes: 97 additions & 166 deletions docs/TRACKING_ANALYSIS_CONTRACT.md

Large diffs are not rendered by default.

552 changes: 67 additions & 485 deletions docs/TRACKING_ANALYSIS_DEVELOPER_GUIDE.md

Large diffs are not rendered by default.

28 changes: 10 additions & 18 deletions src/main/java/featurecat/lizzie/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -1038,11 +1038,7 @@
public int wholeGameAnalysisDeepVisits = WholeGameAnalysisOptions.DEFAULT_VISITS;
public int trackingAnalysisMaxVisits = 500;
public boolean showTrackingPointOutline = true;
public Color trackingPointInteriorColor = new Color(255, 156, 156);
public int trackingPointInteriorOpacityPercent = 100;
public int trackingPointOutlineOpacityPercent = 92;
public boolean trackingPointTextAutoColor = true;
public Color trackingPointTextColor = Color.BLACK;
public boolean autoQuickAnalyzeOnLoad = true;
public boolean quickAnalysisLightweightModelEnabled = false;
public String analysisSpecificRules = "";
Expand Down Expand Up @@ -1524,11 +1520,11 @@
public Config() throws IOException {
this.runtimeWorkDirectoryOverride = null;
this.newProfile = !new File(configFilename).isFile();
initializeFromWorkDirectory();

Check warning on line 1523 in src/main/java/featurecat/lizzie/Config.java

View workflow job for this annotation

GitHub Actions / build

possible 'this' escape before subclass is fully initialized
}

private void initializeFromWorkDirectory() throws IOException {
JSONObject defaultConfig = createDefaultConfig();

Check warning on line 1527 in src/main/java/featurecat/lizzie/Config.java

View workflow job for this annotation

GitHub Actions / build

previous possible 'this' escape happens here via invocation
JSONObject persistConfig = createPersistConfig();
JSONObject saveBoardConf = createSaveBoardConfig();
try {
Expand Down Expand Up @@ -2860,7 +2856,7 @@
ui.put("weighted-blunder-bar-height", false);
// ui.put("dynamic-winrate-graph-width", true);
ui.put("show-comment", true);
ui.put("extra-mode", getExtraModeValue(ExtraMode.Normal));

Check warning on line 2859 in src/main/java/featurecat/lizzie/Config.java

View workflow job for this annotation

GitHub Actions / build

previous possible 'this' escape happens here via invocation
ui.put("comment-font-size", 0);
ui.put("show-variation-graph", true);
ui.put("show-captured", true);
Expand Down Expand Up @@ -2915,33 +2911,29 @@
ui.remove("tracking-engine-preload");
ui.remove("tracking-engine-skip-warning");
ui.remove("tracking-engine-max-visits");
removeRetiredTrackingAppearanceConfig(ui);
return visits;
}

void loadTrackingPointAppearanceConfig(JSONObject ui) {
showTrackingPointOutline = ui.optBoolean("show-tracking-point-outline", true);
trackingPointInteriorColor =
Theme.array2Color(
ui.optJSONArray("tracking-point-interior-color"), new Color(255, 156, 156));
trackingPointInteriorOpacityPercent =
clampPercent(ui.optInt("tracking-point-interior-opacity", 100));
trackingPointOutlineOpacityPercent =
clampPercent(ui.optInt("tracking-point-outline-opacity", 92));
trackingPointTextAutoColor = ui.optBoolean("tracking-point-text-auto-color", true);
trackingPointTextColor =
Theme.array2Color(ui.optJSONArray("tracking-point-text-color"), Color.BLACK);
removeRetiredTrackingAppearanceConfig(ui);
}

public void saveTrackingPointAppearanceConfig() {
uiConfig.put("show-tracking-point-outline", showTrackingPointOutline);
uiConfig.put(
"tracking-point-interior-color", Theme.color2ArrayNoAlpha(trackingPointInteriorColor));
uiConfig.put(
"tracking-point-interior-opacity", clampPercent(trackingPointInteriorOpacityPercent));
uiConfig.put(
"tracking-point-outline-opacity", clampPercent(trackingPointOutlineOpacityPercent));
uiConfig.put("tracking-point-text-auto-color", trackingPointTextAutoColor);
uiConfig.put("tracking-point-text-color", Theme.color2ArrayNoAlpha(trackingPointTextColor));
removeRetiredTrackingAppearanceConfig(uiConfig);
}

private static void removeRetiredTrackingAppearanceConfig(JSONObject ui) {
ui.remove("tracking-point-interior-color");
ui.remove("tracking-point-interior-opacity");
ui.remove("tracking-point-text-auto-color");
ui.remove("tracking-point-text-color");
}

private static int clampPercent(int value) {
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/featurecat/lizzie/Lizzie.java
Original file line number Diff line number Diff line change
Expand Up @@ -1117,7 +1117,7 @@
}

public static void setUIFont(javax.swing.plaf.FontUIResource f) {
java.util.Enumeration keys = UIManager.getDefaults().keys();

Check warning on line 1120 in src/main/java/featurecat/lizzie/Lizzie.java

View workflow job for this annotation

GitHub Actions / build

found raw type: java.util.Enumeration
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
Expand Down Expand Up @@ -1249,8 +1249,10 @@
}
if (!isEngineGame && currentFrame != null && !currentFrame.isPlayingAgainstLeelaz) {
if (startPondering && !Lizzie.config.notStartPondering) {
engine.ponderIfAnalysisControlAllows();
engine.setResponseUpToDate();
if (!engine.startMoveFocusProbeAfterInitialization()) {
engine.ponderIfAnalysisControlAllows();
engine.setResponseUpToDate();
}
} else {
engine.notPondering();
engine.setResponseUpToDate();
Expand Down
Loading
Loading