Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/added/ssa-disability-screen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added an SSA disability-screen variable for data-backed SSI disability modeling.
2 changes: 1 addition & 1 deletion changelog.d/fixed/ssi-disability-sga.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Keep the SSI substantial gainful activity screen separate from the data-backed SSI disability criteria variable.
Keep the SSI substantial gainful activity screen separate from the data-backed SSI disability criteria variable and preserve data-backed SSI disability criteria across future analysis years.
36 changes: 36 additions & 0 deletions policyengine_us/tests/core/test_ssi_disability_criteria_inputs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from policyengine_us import Simulation


def test_data_provided_ssi_disability_criteria_carries_to_future_years():
simulation = Simulation(
situation={
"people": {
"person1": {
"is_disabled": {2024: False, 2026: False},
"meets_ssi_disability_criteria": {2024: True},
}
}
}
)

result = simulation.calculate("meets_ssi_disability_criteria", 2026)

assert result[0]


def test_formula_derived_ssi_disability_criteria_allows_later_disabled_input():
simulation = Simulation(
situation={
"people": {
"person1": {
"is_disabled": {2024: False, 2026: True},
}
}
}
)

assert not simulation.calculate("meets_ssi_disability_criteria", 2024)[0]

result = simulation.calculate("meets_ssi_disability_criteria", 2026)

assert result[0]
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,19 @@
ssi_engaged_in_sga: false
output:
meets_ssi_disability_criteria: false

- name: Data-provided SSI disability criteria can override broad disability
period: 2024
input:
meets_ssi_disability_criteria: true
is_disabled: false
output:
meets_ssi_disability_criteria: true

- name: Data-provided SSI disability criteria can exclude broad disability
period: 2024
input:
meets_ssi_disability_criteria: false
is_disabled: true
output:
meets_ssi_disability_criteria: false
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,23 @@ class meets_ssi_disability_criteria(Variable):
reference = "https://www.law.cornell.edu/uscode/text/42/1382c#a_3_A"

def formula(person, period, parameters):
holder = person.simulation.get_holder("meets_ssi_disability_criteria")
prior_periods = [
known_period
for known_period in holder.get_known_periods()
if known_period.unit == YEAR and known_period.start < period.start
]
if prior_periods:
latest_period = max(
prior_periods, key=lambda known_period: known_period.start
)
latest_value = holder.get_array(
latest_period, person.simulation.branch_name
)
latest_broad_disability = person("is_disabled", latest_period)
# Data-backed overrides should persist across analysis years; pure
# formula caches should not shadow later is_disabled inputs.
if not np.array_equal(latest_value, latest_broad_disability):
return None

return person("is_disabled", period)
Loading