SimulationBuilder.build_from_dict should clear dataset provenance when rebuilding from a situation
I maintainer di solito rispondono entro 3 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
Direzione di ricerca
Start with SimulationBuilder.build_from_dict, then trace build_from_entities and build_from_variables in simulation_builder.py alongside provenance initialization in simulation.py. Check how clones and branches copy source state. Done means both rebuild paths clear dataset provenance, record the active situation, and preserve correct provenance in derived clones and branches.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Found while adopting PolicyEngine/policyengine-uk#1831 (UK hub, 2026-10-20).
PolicyEngine Core version: 3.33.2. Reproduced with synthetic MOCK data and the UK tax-benefit system, without private datasets or downloads.
SimulationBuilder.build_from_dict(system, situation, simulation) supports overwriting an existing simulation. When that simulation was built over a dataset, the method replaces its population structure and inputs but leaves is_over_dataset=True and retains dataset. It also leaves situation_input=None. Its clones and newly created branches inherit this stale provenance.
Reproducer
import pandas as pd
from policyengine_core.simulations import Simulation
from policyengine_core.simulations.simulation_builder import SimulationBuilder
from policyengine_uk.system import system
year = 2026
frame = pd.DataFrame(
{
f"person_id__{year}": [1],
f"person_benunit_id__{year}": [1],
f"person_household_id__{year}": [1],
f"benunit_id__{year}": [1],
f"household_id__{year}": [1],
f"age__{year}": [70],
}
)
situation = {
"people": {"adult": {"age": {year: 70}}},
"benunits": {"family": {"members": ["adult"]}},
"households": {"home": {"members": ["adult"]}},
}
simulation = Simulation(tax_benefit_system=system, dataset=frame)
original_dataset = simulation.dataset
builder = SimulationBuilder()
builder.default_period = year
rebuilt = builder.build_from_dict(system, situation, simulation)
assert rebuilt is simulation
print(rebuilt.persons.ids) # ['adult']
print(rebuilt.is_over_dataset) # True (expected False)
print(rebuilt.dataset is original_dataset) # True (expected cleared)
print(rebuilt.situation_input) # None (no new situation marker)
print(rebuilt.clone().is_over_dataset) # True (expected False)
print(rebuilt.get_branch("rebuilt").is_over_dataset) # True (expected False)
Expected behavior
Rebuilding from a situation should reset is_over_dataset, clear the previous dataset, and record the situation as the active source. The behavior should cover both build_from_entities and build_from_variables, including clones and branches derived after the rebuild. A canonical source marker or population-rebuild hook would also let subclasses keep their own provenance in sync.
Source finding and downstream effect
In Core 3.33.2, Simulation.__init__ sets is_over_dataset (simulation.py:801) and situation_input (simulation.py:897). SimulationBuilder.build_from_dict (simulation_builder.py:66–96) only dispatches the build and refreshes input_variables; build_from_entities (98–192) updates population counts, IDs, memberships and holder inputs without recording a source change. The builder's population bookkeeping is not retained as an independent source marker on the simulation. Population IDs or input variable names are not reliable provenance: either source can use the same IDs and variables, and variable-only situations also use NumPy ID arrays.
The PE-UK provenance probe classifies 20 of 24 routes correctly. Its four failures are a data-built core simulation overwritten by this builder, its clone, its new branch, and a data-built UK simulation overwritten directly by the core builder. PE-UK's supported Simulation.build_from_situation rebuild path resets its own source marker correctly. No supported production caller found by the UK hub uses these four direct core-builder overwrite routes.
This matters for model formulas that distinguish survey runs from explicit household situations. PE-UK currently documents the direct overwrite limitation instead of guessing from IDs, weights or population size.
🤖 Generated with Claude Code
- Lingua principale
- Python
- Stelle
- 22
- Fork
- 30
- Merge medio
- 4g 16h
- PR unite (30g)
- 35
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di PolicyEngine/policyengine-core
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
PolicyEngine/policyengine-core#605 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
PolicyEngine/policyengine-core#549 ·
I maintainer di solito rispondono entro 3 giorni
-
`restore_simulation` silently drops memberless group entitiesForse già presa @Adelagric l’ha presa 43 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
PolicyEngine/policyengine-core#547 ·
I maintainer di solito rispondono entro 3 giorni
-
Remove the Reform and chart functions that call the Public APIForse già presa @anth-volk l’ha presa 1 giorno fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
PolicyEngine/policyengine-core#628 ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 8/100
PolicyEngine/policyengine-core#621 ·
I maintainer di solito rispondono entro 3 giorni
Tutte le issue di PolicyEngine/policyengine-core
Issue simili
-
difficulty:2 enhancement good first issue
Difficoltà 1/5 1-3 ore Idoneità per principianti 92/100
MakazhanAlpamys/Soup#2178 ·
I maintainer di solito rispondono entro 1 giorno
-
Slang input: int8_t4_packed and uint8_t4_packed are copied into CrossGLForse già presa @ninglinLiu l’ha presa oggi. Apertaarea:frontend backend:slang bug direction:input
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
I maintainer di solito rispondono entro 13 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
Kozea/Radicale#2301 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
bug ci good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno