name: curriculum_v1
intent: >
  The paper trains each model at a single fixed pairing distribution. This
  experiment asks whether varying that distribution over the course of one run
  does better. Concretely, does \@{annealing} the Zipfian exponent
  \@[α]{alpha} from peaked toward uniform within a single 1200-iteration run
  beat the best fixed setting, α = 1.4, at the same budget? The
  peaked-to-uniform shape mirrors child-directed speech, whose measured α
  falls from about 1.46 to 1.25 over the first 96 months.
hypothesis: >
  The proposed mechanism is \@{collocational-bootstrapping}. Early training at
  high \@[α]{alpha}, where each verb almost always takes its favorite noun,
  should build strong associations from a verb to its subject, so the model
  learns to agree with the subject rather than with the nearest noun. The
  later low-α tail, where pairings spread out, should then force the model to
  abstract agreement across the whole noun class. If this holds, a curriculum
  arm (\texttt{cds} or \texttt{anneal\_3\_0}) should beat both fixed baselines
  on \@{unseen-mismatch} at iteration 1200: \texttt{fixed\_14\_single}, the
  paper's best fixed α, and \texttt{fixed\_14\_fresh}, which draws fresh data
  each stage at constant α and controls for data diversity. The
  anti-curriculum arm \texttt{reverse\_0\_3} should not beat them, and
  \texttt{noisy\_14} controls for variability without a trend.
seed: 42
base_args: [curriculum, --n-iterations, "10",
            --waypoints, "150", "300", "450", "600", "750", "900", "1050", "1200"]
runs:
  - label: fixed_14_single
    args: [--schedule, "1.4:1200"]
  - label: fixed_14_fresh
    args: [--schedule, "1.4:150,1.4:150,1.4:150,1.4:150,1.4:150,1.4:150,1.4:150,1.4:150"]
  - label: cds
    args: [--schedule-shape, cds, --total-iters, "1200"]
  - label: anneal_3_0
    args: [--schedule-shape, linear, --alpha-start, "3.0", --alpha-end, "0.0",
           --n-stages, "8", --total-iters, "1200"]
  - label: reverse_0_3
    args: [--schedule-shape, linear, --alpha-start, "0.0", --alpha-end, "3.0",
           --n-stages, "8", --total-iters, "1200"]
  - label: noisy_14
    args: [--schedule-shape, linear, --alpha-start, "1.4", --alpha-end, "1.4",
           --n-stages, "8", --total-iters, "1200", --schedule-noise, "0.3"]
compare:
  metric: unseen_mismatch
