Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#634 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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
Tipo de issue
Nueva funcionalidad
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
api

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_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.

Lenguaje dominante
Python
Estrellas
22
Forks
30
Merge medio
4 d 16 h
PR fusionados (30 d)
35

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de PolicyEngine/policyengine-core

Todos los issues de PolicyEngine/policyengine-core

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.