Skip to content
Open
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/add-labor-supply-response-output.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add a legacy-compatible labor-supply response output for US and UK macro analyses.
21 changes: 21 additions & 0 deletions src/policyengine/core/dynamic.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ class Dynamic(BaseModel):
description: Optional[str] = None
parameter_values: list[ParameterValue] = []
simulation_modifier: Optional[Callable] = None
affects_labor_supply_response: Optional[bool] = Field(
default=None,
description=(
"Whether this dynamic should materialize labor-supply response "
"outputs. None preserves conservative detection for unmarked "
"simulation modifiers."
),
)
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)

Expand All @@ -39,9 +47,22 @@ def combined_modifier(sim):
elif other.simulation_modifier is not None:
combined_modifier = other.simulation_modifier

affects_labor_supply_response = None
if (
self.affects_labor_supply_response is True
or other.affects_labor_supply_response is True
):
affects_labor_supply_response = True
elif (
self.affects_labor_supply_response is False
and other.affects_labor_supply_response is False
):
affects_labor_supply_response = False

return Dynamic(
name=f"{self.name} + {other.name}",
description=f"Combined dynamic: {self.name} and {other.name}",
parameter_values=self.parameter_values + other.parameter_values,
simulation_modifier=combined_modifier,
affects_labor_supply_response=affects_labor_supply_response,
)
21 changes: 21 additions & 0 deletions src/policyengine/core/policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ class Policy(BaseModel):
description: Optional[str] = None
parameter_values: list[ParameterValue] = []
simulation_modifier: Optional[Callable] = None
affects_labor_supply_response: Optional[bool] = Field(
default=None,
description=(
"Whether this policy should materialize labor-supply response "
"outputs. None preserves conservative detection for unmarked "
"simulation modifiers."
),
)
created_at: datetime = Field(default_factory=datetime.now)
updated_at: datetime = Field(default_factory=datetime.now)

Expand All @@ -39,9 +47,22 @@ def combined_modifier(sim):
elif other.simulation_modifier is not None:
combined_modifier = other.simulation_modifier

affects_labor_supply_response = None
if (
self.affects_labor_supply_response is True
or other.affects_labor_supply_response is True
):
affects_labor_supply_response = True
elif (
self.affects_labor_supply_response is False
and other.affects_labor_supply_response is False
):
affects_labor_supply_response = False

return Policy(
name=f"{self.name} + {other.name}",
description=f"Combined policy: {self.name} and {other.name}",
parameter_values=self.parameter_values + other.parameter_values,
simulation_modifier=combined_modifier,
affects_labor_supply_response=affects_labor_supply_response,
)
12 changes: 12 additions & 0 deletions src/policyengine/outputs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@
IntraDecileImpact,
compute_intra_decile_impacts,
)
from policyengine.outputs.labor_supply_response import (
HoursResponse,
LaborSupplyResponse,
calculate_labor_supply_response,
configure_labor_supply_response_variables,
labor_supply_response_is_active,
)
from policyengine.outputs.local_authority_impact import (
LocalAuthorityImpact,
compute_uk_local_authority_impacts,
Expand Down Expand Up @@ -63,6 +70,11 @@
"ProgramStatistics",
"IntraDecileImpact",
"compute_intra_decile_impacts",
"HoursResponse",
"LaborSupplyResponse",
"calculate_labor_supply_response",
"configure_labor_supply_response_variables",
"labor_supply_response_is_active",
"Poverty",
"UKPovertyType",
"USPovertyType",
Expand Down
Loading
Loading