Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
802821a
Add units-aware getters/setters infrastructure
luke-kiernan Jan 20, 2026
0c768d7
adjust struct generation
luke-kiernan Mar 11, 2026
58ea095
tests now pass
luke-kiernan Mar 17, 2026
78c2cd3
Fix CostCurve/FuelCurve repr tests for CI compatibility
luke-kiernan Mar 18, 2026
129d9fd
Add exclude_getter support to struct generation
luke-kiernan Mar 27, 2026
7886002
Use DEFAULT_UNITS in generated 1-arg getter template
luke-kiernan Mar 27, 2026
d8be86c
Use PowerSystemsUnits.jl for unit types and conversions
luke-kiernan Mar 30, 2026
2f57949
put back default `is_cost_alias` (lost in rebase)
luke-kiernan Apr 15, 2026
344d40a
Make IS domain-agnostic for the units system
luke-kiernan Apr 17, 2026
1237cd5
Move relative-unit primitives into IS, require explicit units on getters
luke-kiernan Apr 17, 2026
456df73
Export hand-written accessors when exclude_getter is set
luke-kiernan Apr 21, 2026
f0bf72c
Use simple_type_name for TimeSeries*Curve show output
luke-kiernan Apr 24, 2026
845e656
Parameterize CostCurve/FuelCurve on unit-system type
luke-kiernan Apr 24, 2026
7fbf436
Add AnyCostCurve/AnyFuelCurve aliases; accept legacy enum names
luke-kiernan Apr 25, 2026
e319211
Add convert_cost_coefficient for unit-system cost conversion
luke-kiernan Apr 27, 2026
414048d
Test convert_cost_coefficient
luke-kiernan Apr 27, 2026
355b8e3
delete `print_pt_v2.jl`
luke-kiernan May 6, 2026
05e6982
Merge branch 'IS4' into lk/units-domain-agnostic-is4
luke-kiernan May 6, 2026
e2ff064
Merge branch 'IS4' into lk/units-domain-agnostic-is4 (this time I rem…
luke-kiernan May 6, 2026
c80c144
Generate `_unitful` companion getters; bare `get_X` strips units
luke-kiernan May 6, 2026
245954e
Accept legacy `UnitSystem` enum in CostCurve/FuelCurve constructors
luke-kiernan May 8, 2026
43a51ca
Wrap relative-units in submodule; add `units` kwarg to time series ac…
luke-kiernan May 8, 2026
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
25 changes: 25 additions & 0 deletions src/InfrastructureSystems.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@ export PiecewisePointCurve, PiecewiseIncrementalCurve, PiecewiseAverageCurve
export TimeSeriesLinearCurve, TimeSeriesQuadraticCurve, TimeSeriesPiecewisePointCurve
export TimeSeriesPiecewiseIncrementalCurve, TimeSeriesPiecewiseAverageCurve

# Units interface: declared here, methods implemented by domain packages
# (e.g., PowerSystems.jl provides power-domain `get_value`/`set_value` methods).
"Get a field value with optional unit conversion. Methods are provided by domain packages."
function get_value end
"Set a field value with optional unit conversion. Methods are provided by domain packages."
function set_value end
export get_value, set_value

import Base: @kwdef
import CSV
import DataFrames
Expand Down Expand Up @@ -133,6 +141,22 @@ end
get_internal(value::InfrastructureSystemsComponent) = value.internal

include("common.jl")
include("relative_units.jl")
using .RelativeUnits:
AbstractUnitSystem,
AbstractRelativeUnit,
DeviceBaseUnit,
SystemBaseUnit,
NaturalUnit,
RelativeQuantity,
DU,
SU,
NU,
convert_cost_coefficient,
display_units_arg
# Underscored names aren't exported from the submodule; pull them in by name
# so existing `IS._strip_units(...)` / `IS.ustrip(...)` call sites keep working.
using .RelativeUnits: _strip_units, ustrip
include("random_seed.jl")
include("utils/timers.jl")
include("utils/assert_op.jl")
Expand Down Expand Up @@ -200,4 +224,5 @@ include("function_data/make_convex.jl")
include("deprecated.jl")
include("Optimization/Optimization.jl")
include("Simulation/Simulation.jl")

end # module
39 changes: 25 additions & 14 deletions src/cost_aliases.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
# methods being defined for all the `ValueCurve{FunctionData}` types, not just the ones we
# have here nicely packaged and presented to the user.

# Default `is_cost_alias` is defined in value_curve.jl so it's available to
# time_series_value_curve.jl show methods (included before this file).
"Whether there is a cost alias for the instance or type under consideration"
is_cost_alias(::Union{ValueCurve, Type{<:ValueCurve}}) = false

"""
LinearCurve(proportional_term::Float64)
Expand All @@ -29,6 +29,7 @@ curve = LinearCurve(50.0, 100.0)
const LinearCurve = InputOutputCurve{LinearFunctionData}

is_cost_alias(::Union{LinearCurve, Type{LinearCurve}}) = true
simple_type_name(::LinearCurve) = "LinearCurve"

InputOutputCurve{LinearFunctionData}(proportional_term::Real) =
InputOutputCurve(LinearFunctionData(proportional_term))
Expand All @@ -44,7 +45,7 @@ get_constant_term(vc::LinearCurve) = get_constant_term(get_function_data(vc))

Base.show(io::IO, vc::LinearCurve) =
if isnothing(get_input_at_zero(vc))
print(io, "$(typeof(vc))($(get_proportional_term(vc)), $(get_constant_term(vc)))")
print(io, "LinearCurve($(get_proportional_term(vc)), $(get_constant_term(vc)))")
else
Base.show_default(io, vc)
end
Expand All @@ -67,6 +68,7 @@ curve = QuadraticCurve(0.002, 25.0, 150.0)
const QuadraticCurve = InputOutputCurve{QuadraticFunctionData}

is_cost_alias(::Union{QuadraticCurve, Type{QuadraticCurve}}) = true
simple_type_name(::QuadraticCurve) = "QuadraticCurve"

InputOutputCurve{QuadraticFunctionData}(quadratic_term, proportional_term, constant_term) =
InputOutputCurve(
Expand All @@ -86,7 +88,7 @@ Base.show(io::IO, vc::QuadraticCurve) =
if isnothing(get_input_at_zero(vc))
print(
io,
"$(typeof(vc))($(get_quadratic_term(vc)), $(get_proportional_term(vc)), $(get_constant_term(vc)))",
"QuadraticCurve($(get_quadratic_term(vc)), $(get_proportional_term(vc)), $(get_constant_term(vc)))",
)
else
Base.show_default(io, vc)
Expand All @@ -112,6 +114,7 @@ curve = PiecewisePointCurve([(100.0, 400.0), (200.0, 900.0), (300.0, 1500.0)])
const PiecewisePointCurve = InputOutputCurve{PiecewiseLinearData}

is_cost_alias(::Union{PiecewisePointCurve, Type{PiecewisePointCurve}}) = true
simple_type_name(::PiecewisePointCurve) = "PiecewisePointCurve"

InputOutputCurve{PiecewiseLinearData}(points::Vector) =
InputOutputCurve(PiecewiseLinearData(points))
Expand All @@ -131,7 +134,7 @@ get_slopes(vc::PiecewisePointCurve) = get_slopes(get_function_data(vc))
# Here we manually circumvent the @NamedTuple{x::Float64, y::Float64} type annotation, but we keep things looking like named tuples
Base.show(io::IO, vc::PiecewisePointCurve) =
if isnothing(get_input_at_zero(vc))
print(io, "$(typeof(vc))([$(join(get_points(vc), ", "))])")
print(io, "PiecewisePointCurve([$(join(get_points(vc), ", "))])")
else
Base.show_default(io, vc)
end
Expand Down Expand Up @@ -159,6 +162,7 @@ curve = PiecewiseIncrementalCurve(500.0, [100.0, 150.0, 200.0], [30.0, 35.0])
const PiecewiseIncrementalCurve = IncrementalCurve{PiecewiseStepData}

is_cost_alias(::Union{PiecewiseIncrementalCurve, Type{PiecewiseIncrementalCurve}}) = true
simple_type_name(::PiecewiseIncrementalCurve) = "PiecewiseIncrementalCurve"

IncrementalCurve{PiecewiseStepData}(initial_input, x_coords::Vector, slopes::Vector) =
IncrementalCurve(PiecewiseStepData(x_coords, slopes), initial_input)
Expand All @@ -181,9 +185,9 @@ Base.show(io::IO, vc::PiecewiseIncrementalCurve) =
print(
io,
if isnothing(get_input_at_zero(vc))
"$(typeof(vc))($(get_initial_input(vc)), $(get_x_coords(vc)), $(get_slopes(vc)))"
"PiecewiseIncrementalCurve($(get_initial_input(vc)), $(get_x_coords(vc)), $(get_slopes(vc)))"
else
"$(typeof(vc))($(get_input_at_zero(vc)), $(get_initial_input(vc)), $(get_x_coords(vc)), $(get_slopes(vc)))"
"PiecewiseIncrementalCurve($(get_input_at_zero(vc)), $(get_initial_input(vc)), $(get_x_coords(vc)), $(get_slopes(vc)))"
end,
)

Expand All @@ -202,6 +206,7 @@ input). If your data gives incremental/marginal rates instead, use
const PiecewiseAverageCurve = AverageRateCurve{PiecewiseStepData}

is_cost_alias(::Union{PiecewiseAverageCurve, Type{PiecewiseAverageCurve}}) = true
simple_type_name(::PiecewiseAverageCurve) = "PiecewiseAverageCurve"

AverageRateCurve{PiecewiseStepData}(initial_input, x_coords::Vector, y_coords::Vector) =
AverageRateCurve(PiecewiseStepData(x_coords, y_coords), initial_input)
Expand All @@ -216,7 +221,7 @@ Base.show(io::IO, vc::PiecewiseAverageCurve) =
if isnothing(get_input_at_zero(vc))
print(
io,
"$(typeof(vc))($(get_initial_input(vc)), $(get_x_coords(vc)), $(get_average_rates(vc)))",
"PiecewiseAverageCurve($(get_initial_input(vc)), $(get_x_coords(vc)), $(get_average_rates(vc)))",
)
else
Base.show_default(io, vc)
Expand All @@ -237,14 +242,15 @@ const TimeSeriesLinearCurve =
TimeSeriesInputOutputCurve{TimeSeriesFunctionData{LinearFunctionData}}

is_cost_alias(::Union{TimeSeriesLinearCurve, Type{TimeSeriesLinearCurve}}) = true
simple_type_name(::TimeSeriesLinearCurve) = "TimeSeriesLinearCurve"

TimeSeriesInputOutputCurve{TimeSeriesFunctionData{LinearFunctionData}}(
key::TimeSeriesKey,
) = TimeSeriesInputOutputCurve(TimeSeriesFunctionData{LinearFunctionData}(key))

Base.show(io::IO, vc::TimeSeriesLinearCurve) =
if isnothing(get_input_at_zero(vc))
print(io, "$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))))")
print(io, "$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))))")
else
Base.show_default(io, vc)
end
Expand All @@ -259,14 +265,15 @@ const TimeSeriesQuadraticCurve =
TimeSeriesInputOutputCurve{TimeSeriesFunctionData{QuadraticFunctionData}}

is_cost_alias(::Union{TimeSeriesQuadraticCurve, Type{TimeSeriesQuadraticCurve}}) = true
simple_type_name(::TimeSeriesQuadraticCurve) = "TimeSeriesQuadraticCurve"

TimeSeriesInputOutputCurve{TimeSeriesFunctionData{QuadraticFunctionData}}(
key::TimeSeriesKey,
) = TimeSeriesInputOutputCurve(TimeSeriesFunctionData{QuadraticFunctionData}(key))

Base.show(io::IO, vc::TimeSeriesQuadraticCurve) =
if isnothing(get_input_at_zero(vc))
print(io, "$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))))")
print(io, "$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))))")
else
Base.show_default(io, vc)
end
Expand All @@ -283,14 +290,15 @@ const TimeSeriesPiecewisePointCurve =
is_cost_alias(
::Union{TimeSeriesPiecewisePointCurve, Type{TimeSeriesPiecewisePointCurve}},
) = true
simple_type_name(::TimeSeriesPiecewisePointCurve) = "TimeSeriesPiecewisePointCurve"

TimeSeriesInputOutputCurve{TimeSeriesFunctionData{PiecewiseLinearData}}(
key::TimeSeriesKey,
) = TimeSeriesInputOutputCurve(TimeSeriesFunctionData{PiecewiseLinearData}(key))

Base.show(io::IO, vc::TimeSeriesPiecewisePointCurve) =
if isnothing(get_input_at_zero(vc))
print(io, "$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))))")
print(io, "$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))))")
else
Base.show_default(io, vc)
end
Expand All @@ -310,6 +318,8 @@ is_cost_alias(
Type{TimeSeriesPiecewiseIncrementalCurve},
},
) = true
simple_type_name(::TimeSeriesPiecewiseIncrementalCurve) =
"TimeSeriesPiecewiseIncrementalCurve"

TimeSeriesIncrementalCurve{TimeSeriesFunctionData{PiecewiseStepData}}(
key::TimeSeriesKey,
Expand All @@ -330,9 +340,9 @@ Base.show(io::IO, vc::TimeSeriesPiecewiseIncrementalCurve) =
print(
io,
if isnothing(get_input_at_zero(vc))
"$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))))"
"$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))))"
else
"$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))), $(_ts_key_repr(get_input_at_zero(vc))))"
"$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))), $(_ts_key_repr(get_input_at_zero(vc))))"
end,
)

Expand All @@ -351,6 +361,7 @@ is_cost_alias(
Type{TimeSeriesPiecewiseAverageCurve},
},
) = true
simple_type_name(::TimeSeriesPiecewiseAverageCurve) = "TimeSeriesPiecewiseAverageCurve"

TimeSeriesAverageRateCurve{TimeSeriesFunctionData{PiecewiseStepData}}(
key::TimeSeriesKey,
Expand All @@ -371,7 +382,7 @@ Base.show(io::IO, vc::TimeSeriesPiecewiseAverageCurve) =
if isnothing(get_input_at_zero(vc))
print(
io,
"$(typeof(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))))",
"$(simple_type_name(vc))($(_ts_key_repr(get_time_series_key(vc))), $(_ts_key_repr(get_initial_input(vc))))",
)
else
Base.show_default(io, vc)
Expand Down
Loading
Loading