Expose the source a read resolves to: period, branch, tier and whether it is an input
Los mantenedores suelen responder en 3 días
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 28/100
Línea de trabajo
Start in holders/holder.py: read get_array/_readable_branches (305–352, 665–687), _stores_user_input (262–285), _seed_input_storage (214–240), and the _set/put_in_cache input-location handling (242–260, 544–609). Then trace carry logic in simulations/simulation.py (143–162, 1221–1236) and the deletion behavior in data_storage/in_memory_storage.py (305–321). Done means a side-effect-free Holder.read_source(period, branch_name) returning period, carried, branch, tier, derived and is_input, with tests for the listed cases and the calculate differential.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
Country packages need to know whether the value core returns for a variable is an input someone supplied, and today they can only find out by copying core's read logic from private members. policyengine-uk's plan for deterministic draws needs three facts for a (variable, period, branch):
- The slot
Holder.get_arrayreads. That is the first branch in_readable_branchesthat stores the period, reading memory before disk (holders/holder.py:305–352,:665–687). - The carry source, where that slot is empty or derived. That is the latest of
get_input_periods(branch)starting at or before the period, ranked by_latest_input_key(simulations/simulation.py:143–162,:1221–1236). - Whether the value in that tier is an actual input. That comes from
_user_input_storage's locations, or the storage mark for a restored or register-only input (_stores_user_input,holders/holder.py:262–285;_seed_input_storage,:214–240).
The input record alone can't answer the third question at 3.32.27:
- A same-slot overwrite.
put_in_cache(value, period, branch)with its defaultderived=False, over an input in the same slot, replaces the array._setthen drops that tier from the slot's input locations (:242–260,:544–609), but_user_input_keyskeeps the key, andget_input_periodsstill counts the period. Core itself always passesderived=True(simulations/simulation.py:1115,:1266,:1350,:1383), so this value comes from a caller. - A child branch's shadow. A child branch's non-derived value hides a parent's input for the same period, while the key names the parent.
Deleting derived caches to force a recompute isn't a safe workaround. InMemoryStorage.delete removes every period that the given one contains on that branch (data_storage/in_memory_storage.py:305–321), so it can remove supplied inputs.
Proposal
Add a public, read-only method, for example Holder.read_source(period, branch_name="default"). It returns None when nothing reaches the period, and otherwise a small record:
period: the stored period core reads, in storage form (_storage_period). That is the requested slot, or the carry source.carried: whetherperiodis the carry source rather than the requested slot.branchandtier("memory"or"disk").derived: the storage mark.is_input: whether that tier still holds the valueset_inputstored there, by_stores_user_input's rule.
The method must change nothing in storage or in any cache. It covers the pass-through path only: a variable with no formula, uprating, defined_for, adds or subtracts, calculate_output or requires_computation_after, requested at its definition period and one period long. Outside that path it raises.
Tests
- Cases: a same-slot
derived=Falseoverwrite, a child branch's shadow, memory over disk, restored and register-only inputs, clones, inputs at several units, and two inputs that start on the same day. - A differential: on the pass-through path, where no derived value stands in the slot, the array at
read_source's answer equalscalculate's.
Context
policyengine-uk's deterministic rules engine plan reads required draws through a helper built on these facts. It uses the private members, pinned by tests, until a public method exists. The cross-country approach (pe-us) states presence as "core's read resolves to an actual input" and points to this issue.
- Lenguaje dominante
- Python
- Estrellas
- 22
- Forks
- 30
- Merge medio
- 4 d 16 h
- PR fusionados (30 d)
- 35
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de PolicyEngine/policyengine-core
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
PolicyEngine/policyengine-core#605 · 1 comentario ·
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
PolicyEngine/policyengine-core#549 ·
Los mantenedores suelen responder en 3 días
-
`restore_simulation` silently drops memberless group entitiesPosiblemente ocupada @Adelagric la tomó hace 47 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
PolicyEngine/policyengine-core#547 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
PolicyEngine/policyengine-core#632 · 1 comentario ·
Los mantenedores suelen responder en 3 días
-
Remove the Reform and chart functions that call the Public APIPosiblemente ocupada @anth-volk la tomó hace 5 días. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
PolicyEngine/policyengine-core#628 ·
Los mantenedores suelen responder en 3 días
Todos los issues de PolicyEngine/policyengine-core
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 67/100
pydot/pydot#601 · 4 comentarios ·
Los mantenedores suelen responder en 2 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
letsencrypt/cp-cps#361 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
CI: startup_failure because callers grant fewer permissions than ledger-app-workflows@v1 declaresPosiblemente ocupada @maykonmichel la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
LedgerHQ/app-boilerplate-rust#227 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
linuxmint/mintupdate#1107 ·