File size: 1,793 Bytes
3afc977
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""Shared configuration. The two models differ ONLY in attention (bidirectional
vs causal) and objective; everything else — size, data, tokenizer, sequence
budget — is held equal so the comparison isolates the substrate (RQ3 / EXPERIMENTS.md)."""

from __future__ import annotations

from dataclasses import dataclass


@dataclass
class ModelConfig:
    vocab_size: int = 0  # filled from tokenizer
    d_model: int = 256
    n_layers: int = 6
    n_heads: int = 8
    d_ff: int = 1024
    dropout: float = 0.1
    max_len: int = 512  # total sequence length T (shared)


@dataclass
class TaskConfig:
    # The whole source must fit the context (the masked block is filled in-place),
    # so T is set by source length. Attention is O(T^2) and MPS is sensitive to it;
    # T=512 (fp16) is the speed/coverage balance: fits most of difficulty 0-2, much
    # of 3; the long difficulty-4 programs are skipped (documented, not silently).
    seq_len: int = 512      # T: total canvas length
    mask_frac: float = 0.3  # default eval block fraction of the BODY
    frac_lo: float = 0.1    # training: sample block fraction in [lo, hi] per record
    frac_hi: float = 0.6    # so one model handles any masking ratio (eval sweeps it)
    tile_size: int = 16     # chars per tile: granularity of remask/revision
    max_decode: int = 256   # AR decode cap (>= largest block)
    block_len: int = 32     # block diffusion: tokens generated per block (KV-cached)
    n_inner: int = 4        # block diffusion: ReMDM refinement steps per block


@dataclass
class TrainConfig:
    batch_size: int = 64
    steps: int = 4000
    lr: float = 2.0e-4      # WSD peak (TRAINING.md)
    warmup: int = 200
    weight_decay: float = 0.1
    grad_clip: float = 1.0
    log_every: int = 100
    seed: int = 0