Adds 7th plan_isv dimension: PLAN_ISV_REMAINING_FRACTION = max(0, min(1, (plan_target_bars - hold_time) / plan_target_bars)) when plan active, else 0. Exposes temporal pressure to the policy. State vector grows 104 → 112 (105 + 7 padding for 8-alignment). SL_PORTFOLIO_PLAN_DIM 6 → 7. SL_PADDING_DIM 0 → 7. Both training (experience_env_step) and val (backtest_plan_state_isv) write the new slot identically — preserves train/val state-distribution parity. All hardcoded stride-6 references in backtest_plan_kernel.cu replaced with SL_PORTFOLIO_PLAN_DIM. plan_isv_buf allocation updated to n_windows * 7. Stale offset comments ([86..92)) corrected to [98..105) across all files. No behavioural change to existing dimensions. New signal is additive. Plan 2 Task 6A. Spec §4.D.6. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.0 KiB
DQN Named Dimensions Registry
Invariant 8 enforcement. Every semantic index has a named constant. Raw indices ([0], [6], [23]) appear ONLY at definition sites. Consumer code always uses the named constant.
State vector offsets
Defined in crates/ml/src/cuda_pipeline/state_layout.cuh and mirrored in Rust via ml-core::state_layout.
| Constant | Value | Meaning |
|---|---|---|
SL_STATE_DIM |
112 | Total state vector length (D.6 Plan 2 Task 6A: was 104) |
SL_STATE_DIM_PADDED |
128 | Padded for cuBLAS K-tile alignment |
SL_MARKET_DIM |
42 | Market-feature block width |
SL_OFI_DIM |
32 | OFI block width |
SL_MTF_DIM |
16 | Multi-timeframe block width |
SL_PORTFOLIO_BASE_DIM |
8 | Portfolio-base block width |
SL_PORTFOLIO_PLAN_DIM |
7 | Plan-ISV block width (D.6 Plan 2 Task 6A: was 6) |
SL_MARKET_START |
0 | |
SL_OFI_START |
42 | |
SL_MTF_START |
74 | |
SL_PORTFOLIO_START |
90 | |
SL_PLAN_ISV_START |
98 |
Portfolio state slots (ps[0..PS_STRIDE=38))
Defined in crates/ml/src/cuda_pipeline/state_layout.cuh (PS_* constants).
Consumer code uses the named constants; raw ps[N] access outside definition
sites is a lint violation (Invariant 8). Slots 3-6 and 22 also carry legacy
named aliases in experience_kernels.cu (DSR_A_SLOT etc.) retained for
in-file use; PS_* names are the canonical cross-file form.
| Index | Constant | Meaning |
|---|---|---|
| 0 | PS_POSITION |
Current contract position (signed) |
| 1 | PS_CASH |
Cash balance |
| 2 | PS_PORTFOLIO_VALUE |
Mark-to-market total (cash + pos×price) |
| 3 | PS_DSR_A |
EMA of realised trade returns (DSR) |
| 4 | PS_DSR_B |
EMA of squared trade returns (DSR) |
| 5 | PS_DSR_TRADE_COUNT |
Completed trades counter (DSR warmup) |
| 6 | PS_PREV_CLOSE |
Prev bar raw_close for DSR per-bar returns |
| 7 | PS_PEAK_EQUITY |
High-water mark (init to initial_capital) |
| 8 | PS_FLAT_COUNTER |
Consecutive flat steps |
| 9 | PS_PREV_EQUITY |
Equity at previous step |
| 10 | PS_HOLD_TIME |
Consecutive steps with position |
| 11 | PS_REALIZED_PNL |
Cumulative realised PnL |
| 12 | PS_ENTRY_PRICE |
Price when trade was entered |
| 13 | PS_TRADE_START_PNL |
Realised PnL snapshot at trade entry |
| 14 | PS_KELLY_WIN_COUNT |
Kelly: number of profitable trade exits |
| 15 | PS_KELLY_LOSS_COUNT |
Kelly: number of losing trade exits |
| 16 | PS_KELLY_SUM_WINS |
Kelly: cumulative profit from winners |
| 17 | PS_KELLY_SUM_LOSSES |
Kelly: cumulative |loss| from losers |
| 18 | PS_KELLY_SUM_RETURNS |
Kelly: cumulative net returns (for mu) |
| 19 | PS_KELLY_SUM_SQ_RETURNS |
Kelly: cumulative squared returns (sigma^2) |
| 20 | PS_INTRA_TRADE_MAX_DD |
Worst intra-trade drawdown (v8 reward) |
| 21 | PS_INTRA_TRADE_MAX_PNL |
Best intra-trade unrealised PnL (hindsight) |
| 22 | PS_PREV_MID |
Prev bar MBP-10 mid-price |
| 23 | PS_PLAN_TARGET_BARS |
plan: max hold bars (>0.5 = plan active) |
| 24 | PS_PLAN_PROFIT_TARGET |
plan: raw profit threshold |
| 25 | PS_PLAN_STOP_LOSS |
plan: raw stop threshold |
| 26 | PS_PLAN_SCALE_AGGRESSION |
plan: position ramp speed |
| 27 | PS_PLAN_CONVICTION |
plan: conviction at entry [0,1] |
| 28 | PS_PLAN_ASYMMETRY |
plan: profit/stop asymmetry |
| 29 | PS_PLAN_ENTRY_REGIME |
plan: regime_stability at entry |
| 30-37 | PS_OFI_PREV_BASE + k |
Prev-bar OFI scratch for delta computation |
| 38 | PS_STRIDE |
Total portfolio state stride (=PORTFOLIO_STRIDE) |
Plan_isv dimensions (plan_isv[0..7))
D.6 Plan 2 Task 6A landed: 7th dimension PLAN_ISV_REMAINING_FRACTION added. These constants live alongside SL_PLAN_ISV_START in state_layout.cuh.
| Index | Constant | Meaning |
|---|---|---|
| 0 | PLAN_ISV_PROGRESS |
hold_time / target_bars (clamped 2.0) |
| 1 | PLAN_ISV_PNL_VS_TARGET |
unrealized / (target × equity) |
| 2 | PLAN_ISV_PNL_VS_STOP |
-unrealized / (stop × equity) |
| 3 | PLAN_ISV_ENTRY_CONVICTION |
conviction at entry |
| 4 | PLAN_ISV_CONVICTION_DRIFT |
current conviction − entry conviction |
| 5 | PLAN_ISV_REGIME_SHIFT |
|isv[11] − entry_stability| |
| 6 | PLAN_ISV_REMAINING_FRACTION |
max(0, min(1, (target_bars − hold_time) / target_bars)) when plan active, else 0 — temporal pressure signal |
Plan_params output (plan_params[0..6))
From the trade_plan MLP output.
| Index | Constant | Meaning |
|---|---|---|
| 0 | PLAN_PARAM_TARGET_BARS |
|
| 1 | PLAN_PARAM_PROFIT_TARGET |
|
| 2 | PLAN_PARAM_STOP_LOSS |
|
| 3 | PLAN_PARAM_SCALE_AGGRESSION |
|
| 4 | PLAN_PARAM_CONVICTION |
|
| 5 | PLAN_PARAM_ASYMMETRY |
Branch indices (4-branch factored action)
| Index | Constant | Meaning |
|---|---|---|
| 0 | BRANCH_DIR |
Direction branch (4 actions) |
| 1 | BRANCH_MAG |
Magnitude branch (3 actions) |
| 2 | BRANCH_ORD |
Order-type branch (3 actions) |
| 3 | BRANCH_URG |
Urgency branch (3 actions) |
Direction action sub-indices
| Index | Constant | Meaning |
|---|---|---|
| 0 | DIR_SHORT |
Open short (or close long + open short) |
| 1 | DIR_HOLD |
Keep current position (no-op on position) |
| 2 | DIR_LONG |
Open long (or close short + open long) |
| 3 | DIR_FLAT |
Close any position to zero |
Magnitude action sub-indices
| Index | Constant | Meaning |
|---|---|---|
| 0 | MAG_QUARTER |
0.25× max_position |
| 1 | MAG_HALF |
0.50× max_position |
| 2 | MAG_FULL |
1.00× max_position |
Commit history
- Task 4A (ps[0..PS_STRIDE) constants): commit 144c85b85
- Task 4B (plan_isv[0..6) constants): commit 741cb48d5
- Task 4C (plan_params[0..6) constants): commit 0ac83479e
- Task 4D (BRANCH_* constants): commit 11755632b
- Task 4E (DIR_* direction sub-indices): commit c64fde0be
- Task 4F (MAG_* magnitude sub-indices): commit 537e18b84
- Task 4 gap-fix (3 review issues): experience_kernels.cu lines 1148-1152 and 1194 missed by sed sweep (ps_base_plan+N syntax), replaced with PS_PLAN_TARGET_BARS/PS_POSITION/DIR_LONG/ DIR_SHORT/DIR_FLAT; ml-core state_layout.rs Rust mirror added for all Task 4 constants (PS_/PLAN_ISV_/PLAN_PARAM_/BRANCH_/DIR_/MAG_, 46 constants total).