diff --git a/src/PowerSystems.jl b/src/PowerSystems.jl index 79097c2c34..66fa9f00ac 100644 --- a/src/PowerSystems.jl +++ b/src/PowerSystems.jl @@ -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 diff --git a/test/test_power_system_table_data.jl b/test/test_power_system_table_data.jl index fc668cf0c8..75c66a5fdb 100644 --- a/test/test_power_system_table_data.jl +++ b/test/test_power_system_table_data.jl @@ -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 + 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