Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

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

オープン
#634 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 3 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
28/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
api

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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.

主要言語
Python
スター
22
フォーク
30
平均マージ
4日 16時間
マージ済み PR(30日)
35

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

PolicyEngine/policyengine-core のほかの issue

PolicyEngine/policyengine-core の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。