Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Adding support for quadratic functions using the table data parser #1178

Merged
merged 8 commits into from
Aug 28, 2024
3 changes: 3 additions & 0 deletions src/PowerSystems.jl
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,9 @@ export get_compression_settings
export CompressionSettings
export CompressionTypes

# Parsing functions
export create_poly_cost

#export make_time_series
export get_bus_numbers
export get_name
Expand Down
48 changes: 48 additions & 0 deletions test/test_power_system_table_data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,51 @@ end
g = get_components(ThermalStandard, sys)
@test get_variable.(get_operation_cost.(g)) == get_variable.(get_operation_cost.(g))
end

@testset "Test create_poly_cost function" begin

cost_colnames = ["heat_rate_a0", "heat_rate_a1", "heat_rate_a2"]

# Coefficients for a CC using natura gas
pesap marked this conversation as resolved.
Show resolved Hide resolved
a2 = -0.000531607
a1 = 0.060554675
a0 = 8.951100118

# First test that return quadratic if all coefficients are provided.
# We convert the coefficients to string to mimic parsing from csv
example_generator = (name="test-gen", heat_rate_a0=string(a0), heat_rate_a1=string(a1), heat_rate_a2=string(a2))
cost_curve, fixed_cost = create_poly_cost(example_generator, cost_colnames)
@assert cost_curve isa QuadraticCurve
@assert isapprox(get_quadratic_term(cost_curve), a2, atol=0.01)
@assert isapprox(get_proportional_term(cost_curve), a1, atol=0.01)
@assert isapprox(get_constant_term(cost_curve), a0, atol=0.01)

# Test return linear with both proportional and constant term
example_generator = (name="test-gen", heat_rate_a0=string(a0), heat_rate_a1=string(a1), heat_rate_a2=nothing)
cost_curve, fixed_cost = create_poly_cost(example_generator, cost_colnames)
@assert cost_curve isa LinearCurve
@assert isapprox(get_proportional_term(cost_curve), a1, atol=0.01)
@assert isapprox(get_constant_term(cost_curve), a0, atol=0.01)

# Test return linear with just proportional term
example_generator = (name="test-gen", heat_rate_a0=nothing, heat_rate_a1=string(a1), heat_rate_a2=nothing)
cost_curve, fixed_cost = create_poly_cost(example_generator, cost_colnames)
@assert cost_curve isa LinearCurve
@assert isapprox(get_proportional_term(cost_curve), a1, atol=0.01)

# Test raises error if a2 is passed but other coefficients are nothing
example_generator = (name="test-gen", heat_rate_a0=nothing, heat_rate_a1=nothing, heat_rate_a2=string(a2))
@test_throws IS.DataFormatError create_poly_cost(example_generator, cost_colnames)
example_generator = (name="test-gen", heat_rate_a0=nothing, heat_rate_a1=string(a1), heat_rate_a2=string(a2))
@test_throws IS.DataFormatError create_poly_cost(example_generator, cost_colnames)
example_generator = (name="test-gen", heat_rate_a0=string(a0), heat_rate_a1=nothing, heat_rate_a2=string(a2))
@test_throws IS.DataFormatError create_poly_cost(example_generator, cost_colnames)

# Test that it works with zero proportional and constant term
example_generator = (name="test-gen", heat_rate_a0=string(0.0), heat_rate_a1=string(0.0), heat_rate_a2=string(a2))
cost_curve, fixed_cost = create_poly_cost(example_generator, cost_colnames)
@assert cost_curve isa QuadraticCurve
@assert isapprox(get_quadratic_term(cost_curve), a2, atol=0.01)
@assert isapprox(get_proportional_term(cost_curve), 0.0, atol=0.01)
@assert isapprox(get_constant_term(cost_curve), 0.0, atol=0.01)
end
Loading