Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Expose the source a read resolves to: period, branch, tier and whether it is an input

Aperta
#634 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
28/100
Tipo di issue
Funzionalità
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
api

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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_array reads. That is the first branch in _readable_branches that 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:

  1. A same-slot overwrite. put_in_cache(value, period, branch) with its default derived=False, over an input in the same slot, replaces the array. _set then drops that tier from the slot's input locations (:242–260, :544–609), but _user_input_keys keeps the key, and get_input_periods still counts the period. Core itself always passes derived=True (simulations/simulation.py:1115, :1266, :1350, :1383), so this value comes from a caller.
  2. 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: whether period is the carry source rather than the requested slot.
  • branch and tier ("memory" or "disk").
  • derived: the storage mark.
  • is_input: whether that tier still holds the value set_input stored 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=False overwrite, 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 equals calculate'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.

Lingua principale
Python
Stelle
22
Fork
30
Merge medio
4g 16h
PR unite (30g)
35

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di PolicyEngine/policyengine-core

Tutte le issue di PolicyEngine/policyengine-core

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.