Push GP¶
How to use the published firewall is the Push GP tutorial. This page is the backlog that assembled that path.
Two-level program search: tapes stay the laws, Push evolves the
loop around them. Push never sees raw columns or matrix[t].
It reads summaries and emits discrete actions that already exist
as toolbox calls. That is not a second public genome — prefix
trees plus the tape remain the program. A public Push / Cartesian
/ linear genome stays on Not planned.
This page is a backlog, not a schedule. Status matches the library: shipped preconditions are shipped; the rest are planned. Shipped items are not re-specified here; the item column links the matching write-up on a Features page. Items 30, 31, 33, and 34 are shipped on both pages.
| # | Item | Surface | Status |
|---|---|---|---|
| P1 | Batch tape evaluation (item 4) | gp |
shipped |
| P2 | Down-sampled and informed lexicase (item 5) | operators |
shipped |
| P3 | Case-structured evaluation helper (item 6) | utilities | shipped |
| P4 | Quality-diversity archive (item 8) | records |
shipped |
| P5 | Growing primitive language (item 21) | gp |
shipped |
| P6 | Semantic search space (item 22) | gp, records |
shipped |
| P7 | Co-evolving cases (item 23) | operators, records |
shipped |
| P8 | Memetic constants (item 24) | gp, strategies |
shipped |
| P9 | Streaming and island ecology (item 25) | algorithms |
shipped |
| P10 | Program teams (item 26) | operators |
shipped |
| P11 | Policy observation schema | records, utilities |
shipped |
| P12 | Policy action applicator | algorithms |
shipped |
| P13 | Held-out policy fitness | records, operators |
shipped |
| P14 | Action guards and cooldowns | operators |
shipped |
| P15 | Evaluation budget and eval cache (item 33) | algorithms, utilities |
shipped |
| P16 | Causal lookback and suffix rescore (item 30) | gp |
shipped |
| P17 | Affine scaling and Lamarckian writeback (item 31) | gp, utilities |
shipped |
| P18 | Parallel RNG streams (item 34) | rng |
shipped |
| P19 | Push GP as the loop | gp (private policy) |
shipped |
P1–P10 are shipped on the main table and still sit on this path: the two-level loop uses them. P11–P14 are shipped firewall pieces. P15–P18 are shipped. P19 is last on purpose.
Note
A linear policy or a fixed decision list on the same
observe / action interface is a valid test that the
firewall works. If that cannot beat
next_lexicase_cases plus periodic tune on held-out
quality per eval, stacks will not save the path.
P1. Batch tape evaluation¶
What. Population-wide tape scoring against one packed
(rows, columns) matrix. The laws Push must not reimplement.
Today. Shipped as
item 4.
interpret_tapes and evaluate_batch are the only row
kernels on this path.
Role. Push never interprets a column. It may request a rescore; the tape does the work.
P2. Down-sampled and informed lexicase¶
What. Case-subset lexicase (cases=, informed sampling,
matrix filter). The geometry the policy chooses among.
Today. Shipped as item 5.
Role. A policy action sets the next cases= list. It
does not replace the selector.
P3. Case-structured evaluation helper¶
What. Series → per-case errors with a valid= mask.
Today. Shipped as item 6.
Role. Observations and held-out scores are reductions of
case_errors, not raw rows.
P4. Quality-diversity archive¶
What. Behavior-binned elites (add, random_elites,
coverage / qd_score).
Today. Shipped as item 8. Item 20 is the same surface on CVT / unstructured archives.
Role. Coverage and qd_score are legal observation
fields. Push does not write descriptors.
P5. Growing primitive language¶
What. promote_subtree lifts a typed chunk into the pset.
Today. Shipped as item 21. Do not auto-promote every generation.
Role. Promote is a policy action, rate-limited by P14.
P6. Semantic search space¶
What. Tape outputs → moments, solve bits, projections, nearest neighbors.
Today. Shipped as item 22.
Role. Solve bits and distances are summaries Push may
read. The pack stays behind valid= / trust_matrix=.
P7. Co-evolving cases¶
What. CaseExam / CaseExamPool, score_case_exams,
next_lexicase_cases, guard_case_exams.
Today. Shipped as item 23.
Role. The hand-written loop Push is allowed to replace.
held_out must remain unmarked by policy actions
(P13).
P8. Memetic constants¶
What. Short boxed CMA / sep-CMA on ephemeral leaves and
Window ints.
Today. Shipped as item 24.
Role. Tune is a costly action.
P15 charges it to
n_evals.
P17 makes the
polish worth firing.
P9. Streaming and island ecology¶
What. step_islands and the full-matrix append-only
rescore recipe.
Today. Shipped as item 25. Legal dirty suffixes are item 30.
Role. Migrate / deme pressure and “rescore now” are actions. Legal dirty suffixes are P16.
P10. Program teams¶
What. Greedy coverage of cases solved at 0.
Today. Shipped as item 26. Team scoring stays on the caller.
Role. A policy may pick sel_count or feed sel_team
a cases= list. It is not a per-row router.
P11. Policy observation schema¶
What. policy_observe(...) returns one fixed, typed
vector. Allowed fields are summaries only: case-solve bits,
unsolved count, train vs held-out score, archive coverage /
qd_score, nevals used, rows seen, promoted-library size,
fitness-invalid flag, last action rejected. No Array, no
column slice, no matrix[t].
Today. Shipped as
PolicyObservation
and :func:~deap_er.tools.policy_observe. Summary helpers
coerce outputs from :func:~deap_er.tools.case_errors,
:func:~deap_er.tools.score_case_exams,
:class:~deap_er.records.ArchiveStats, and promoted-library
counters. Raw NumPy packs are rejected at the observation
boundary.
Benefit. This is the firewall. Without it, Push grows a load-column opcode and the causal story is gone.
Scope. A helper and a documented layout. Not a new genome. Not a domain metric.
P12. Policy action applicator¶
What. apply_policy_action(action, ...) maps a discrete
action onto existing callables only:
- set next
cases=/ pick an exam (next_lexicase_cases) - tune / skip (
tune_ephemerals) - promote / skip (
promote_subtree) - invalidate and rescore (
evaluate_invalid/interpret_tapes) - migrate / pick deme pressure (
step_islands)
Today. Shipped as
item 29.
SUPPORTED_POLICY_ACTIONS documents the token schema. Skip
tokens are intentional no-ops; unknown tokens and missing
required kwargs are rejected without raising.
Benefit. Push emits actions, not trees. The applicator
is the thin loop that must not become a second ea_*
framework.
Scope. Schema plus dispatch. Evaluation stays on the
caller. No step_program_search that owns fitness.
P13. Held-out policy fitness¶
What. Policy individuals are scored only on a
caller-marked held_out exam (and/or a later slice the
action schema cannot name). Train-exam quality is an
observation, not the policy objective. Log the
generalization gap as its own Logbook chapter.
Today. Shipped as
item 31 on the
features page. policy_held_out_fitness scores only the
caller-marked held_out exam; guard_policy_fitness_exam
refuses train or freshly mutated exams as the objective.
policy_exam_scores and policy_observe keep train quality
as an observation. record_policy_generalization_gap logs
train, held-out, and gap as a generalization_gap Logbook
chapter.
Benefit. Otherwise Push evolves “make the exam easy.”
Scope. A scoring convention and a chapter. Chronological meaning stays on the caller. Not a metric catalog.
P14. Action guards and cooldowns¶
What. Hard caps next to guard_case_exams: max promotes
per generation, max inner tune generations, minimum exam
size, promote cooldown, reject any action that exceeds
remaining n_evals. A rejected action is an observation,
not a crash. A uniform random policy must run thousands of
generations without melting the compile cache.
Today. PolicyActionGuard and guard_policy_action
enforce the caps on apply_policy_action. Rejected actions
return PolicyActionResult(rejected=True) without raising.
Call begin_generation each outer generation so per-generation
promote limits reset. estimate_policy_action_evals supplies
conservative budget checks for tune, rescore, and island steps.
Benefit. If a random policy cannot survive, do not add Exec stacks.
Scope. Guards on P12 only. Not a new selector.
P15. Evaluation budget and eval cache¶
What. n_evals= on the shared loop and an EvalCache
keyed by expression plus matrix identity. Every tune,
rescore, and promote-induced recompile spends that budget.
Policy fitness is held-out quality per eval.
Today. Shipped as
item 33.
n_evals= stops ea_simple, ea_mu_plus_lambda,
ea_mu_comma_lambda, and ea_map_elites when the evaluation
count is spent; generations remain the default.
ea_generate_update_restarts already stops on evaluations.
EvalCache wraps evaluate / evaluate_batch by expression
text or a caller key plus matrix identity and row count.
promote_subtree and tune_ephemerals drop matching fitness
keys when they invalidate the compile cache.
Role. Without this, a policy that tunes every generation wins by spending. Do not evolve Push until actions are metered.
P16. Causal lookback and suffix rescore¶
What. tape_lookback plus a suffix rescore that matches
the full-matrix oracle.
Today. Shipped as
item 30.
tape_lookback is the certificate; suffix_rescore writes
the dirty suffix onto a cached prefix and matches the
full-matrix oracle.
Role. A policy may say “new rows; rescore now.” The lookback bound is what makes that action legal.
P17. Affine scaling and Lamarckian writeback¶
What. Keijzer \(a + b\,f(x)\) before or as writeback
from tune_ephemerals.
Today. Shipped as item 31.
Role. Makes tune actions polish a law instead of
fighting intercept and slope. Not a firewall piece; ship
before Push if tune is in the action set.
P18. Parallel RNG streams¶
What. Independent, seedable worker streams that still reproduce.
Today. Shipped as
item 34.
spawn_rng(seed, worker_id) and map_spawned derive
independent worker streams. The process-wide generator stays
the default and stays checkpointable.
Role. Two populations (tapes and policies) under
toolbox.map. Skip only if both stay in-process.
P19. Push GP as the loop¶
What. A private policy individual: a tiny Push
instruction set on int / bool / a short solve-bit
vector. policy_observe in, apply_policy_action out.
No column loads, no Window as a Push type, no public
PushTree on gp / tools. Tapes remain the only thing
interpret_tapes runs.
Today. Shipped as
item 28.
LinearPolicyProgram and PushPolicyProgram live under
deap_er.private.programming only — not on gp or tools.
step_policy_loop wires policy_observe in and
apply_policy_action out. The in-tree Push interpreter reads
int / bool / solve-bit summaries only; tapes remain the
only interpret_tapes target.
Benefit. Evolves the operator of specialists — which
exam, when to tune or promote, when to rescore, which
pressure — when a second prefix tree is too clumsy and a
hand-written next_lexicase_cases plus periodic tune is
too rigid.
Scope. Optional extra or in-tree interpreter, either
way behind the firewall. Not a second public genome. Not
per-row Push. Not rolling_mean as a Push instruction.
A linear policy on the same interface may ship first as
the acceptance test.
Related: P11, P12, P13, P14, Not planned.