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:
@@ -11,7 +11,7 @@ type
|
|||||||
GridCell = object
|
GridCell = object
|
||||||
sumSin: float
|
sumSin: float
|
||||||
sumCos: float
|
sumCos: float
|
||||||
count: int
|
count: float
|
||||||
|
|
||||||
LeadGrid* = object
|
LeadGrid* = object
|
||||||
cells: array[VPERP_BINS * DIST_BINS, GridCell] # 17 × 8 = 136 cells
|
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 sinVal = clamp(vPerp / BULLET_SPEED, -1.0, 1.0)
|
||||||
let offsetRad = arcsin(sinVal)
|
let offsetRad = arcsin(sinVal)
|
||||||
let idx = vBin * DIST_BINS + dBin
|
let idx = vBin * DIST_BINS + dBin
|
||||||
result.cells[idx].sumSin = sin(offsetRad)
|
result.cells[idx].sumSin = 0.1 * sin(offsetRad)
|
||||||
result.cells[idx].sumCos = cos(offsetRad)
|
result.cells[idx].sumCos = 0.1 * cos(offsetRad)
|
||||||
result.cells[idx].count = 1
|
result.cells[idx].count = 0.1
|
||||||
|
|
||||||
proc cellIndex(vPerp: float, distance: float): int {.inline.} =
|
proc cellIndex(vPerp: float, distance: float): int {.inline.} =
|
||||||
let vBin = clamp(int(vPerp + 8.5), 0, VPERP_BINS - 1)
|
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
|
let db = dBin + dd
|
||||||
if vb < 0 or vb >= VPERP_BINS or db < 0 or db >= DIST_BINS: continue
|
if vb < 0 or vb >= VPERP_BINS or db < 0 or db >= DIST_BINS: continue
|
||||||
let c = grid.cells[vb * DIST_BINS + db]
|
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
|
let w = if dv == 0 and dd == 0: 1.0
|
||||||
elif dv == 0 or dd == 0: 0.5
|
elif dv == 0 or dd == 0: 0.5
|
||||||
else: 0.25
|
else: 0.25
|
||||||
sinSum += w * c.sumSin / float(c.count)
|
sinSum += w * c.sumSin / c.count
|
||||||
cosSum += w * c.sumCos / float(c.count)
|
cosSum += w * c.sumCos / c.count
|
||||||
totalW += w
|
totalW += w
|
||||||
if totalW == 0.0:
|
if totalW == 0.0:
|
||||||
return -999.0
|
return -999.0
|
||||||
@@ -65,8 +65,8 @@ proc learn*(grid: var LeadGrid, vPerp, distance, correctOffset: float) =
|
|||||||
let idx = cellIndex(vPerp, distance)
|
let idx = cellIndex(vPerp, distance)
|
||||||
grid.cells[idx].sumSin += sin(degToRad(correctOffset))
|
grid.cells[idx].sumSin += sin(degToRad(correctOffset))
|
||||||
grid.cells[idx].sumCos += cos(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:
|
for c in grid.cells:
|
||||||
result += c.count
|
result += c.count
|
||||||
|
|||||||
Reference in New Issue
Block a user