experiment(reservoir): reduce warm-start weight to 0.1 for faster learning adaptation

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 08:44:47 +02:00
parent a20796cf9b
commit 8289488e13
+9 -9
View File
@@ -11,7 +11,7 @@ type
GridCell = object
sumSin: float
sumCos: float
count: int
count: float
LeadGrid* = object
cells: array[VPERP_BINS * DIST_BINS, GridCell] # 17 × 8 = 136 cells
@@ -25,9 +25,9 @@ proc initLeadGrid*(): LeadGrid =
let sinVal = clamp(vPerp / BULLET_SPEED, -1.0, 1.0)
let offsetRad = arcsin(sinVal)
let idx = vBin * DIST_BINS + dBin
result.cells[idx].sumSin = sin(offsetRad)
result.cells[idx].sumCos = cos(offsetRad)
result.cells[idx].count = 1
result.cells[idx].sumSin = 0.1 * sin(offsetRad)
result.cells[idx].sumCos = 0.1 * cos(offsetRad)
result.cells[idx].count = 0.1
proc cellIndex(vPerp: float, distance: float): int {.inline.} =
let vBin = clamp(int(vPerp + 8.5), 0, VPERP_BINS - 1)
@@ -50,12 +50,12 @@ proc forward*(grid: var LeadGrid, vPerp, distance: float): float =
let db = dBin + dd
if vb < 0 or vb >= VPERP_BINS or db < 0 or db >= DIST_BINS: continue
let c = grid.cells[vb * DIST_BINS + db]
if c.count == 0: continue
if c.count < 0.001: continue
let w = if dv == 0 and dd == 0: 1.0
elif dv == 0 or dd == 0: 0.5
else: 0.25
sinSum += w * c.sumSin / float(c.count)
cosSum += w * c.sumCos / float(c.count)
sinSum += w * c.sumSin / c.count
cosSum += w * c.sumCos / c.count
totalW += w
if totalW == 0.0:
return -999.0
@@ -65,8 +65,8 @@ proc learn*(grid: var LeadGrid, vPerp, distance, correctOffset: float) =
let idx = cellIndex(vPerp, distance)
grid.cells[idx].sumSin += sin(degToRad(correctOffset))
grid.cells[idx].sumCos += cos(degToRad(correctOffset))
inc grid.cells[idx].count
grid.cells[idx].count += 1.0
proc totalCount*(grid: LeadGrid): int =
proc totalCount*(grid: LeadGrid): float =
for c in grid.cells:
result += c.count