259e67d7ff
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
36 lines
1.2 KiB
Nim
36 lines
1.2 KiB
Nim
## diag_ppo_fullbuffer.nim — run ppoUpdate on a FULL 8192-transition buffer.
|
|
## Verifies whether the round-10 death (first ppoUpdate at buffer capacity)
|
|
## is a real crash in ppoUpdate or purely the saveAdamStates empty-shape bug.
|
|
|
|
import std/[math, random]
|
|
import arraymancer
|
|
import PPO_Bot/network
|
|
import PPO_Bot/training
|
|
|
|
var ac = initActorCritic()
|
|
var adam: ACAdamStates # uninitialised → ppoUpdate must reinit (fresh-process path)
|
|
var buf = initTrajectoryBuffer()
|
|
|
|
randomize(1)
|
|
while buf.len < MAX_TRANSITIONS:
|
|
var t: Transition
|
|
for i in 0..<STATE_DIM: t.state[i] = rand(1.0'f32) - 0.5'f32
|
|
for i in 0..<ACTION_DIM: t.action[i] = rand(1.0'f32) - 0.5'f32
|
|
t.logProb = rand(1.0'f32) - 1.0'f32
|
|
t.reward = rand(0.02'f32) - 0.01'f32
|
|
t.value = rand(0.1'f32)
|
|
t.done = buf.len mod 300 == 299
|
|
buf.add(t)
|
|
|
|
echo "buffer.len = ", buf.len, " (MAX=", MAX_TRANSITIONS, ")"
|
|
var ac2 = ac
|
|
var adam2: ACAdamStates
|
|
try:
|
|
let m = ppoUpdate(ac2, buf, lastValue = 0.0'f32, adamStates = adam2)
|
|
echo "ppoUpdate OK: aLoss=", m.actorLoss, " vLoss=", m.valueLoss, " gNorm=", m.gradNorm
|
|
except CatchableError as e:
|
|
echo "CAUGHT CatchableError: ", e.msg
|
|
echo getStackTrace(e)
|
|
except Defect as e:
|
|
echo "CAUGHT Defect: ", e.msg
|
|
echo getStackTrace(e) |