diff --git a/src/validation/validate.jl b/src/validation/validate.jl index 3708149..2b816a1 100644 --- a/src/validation/validate.jl +++ b/src/validation/validate.jl @@ -321,33 +321,17 @@ function _validate_reserve_and_demand(instance, solution, tol = 0.01) err_count += 1 end - # Verify spinning reserves - reserve = - sum(solution["Reserve (MW)"][g.name][t] for g in instance.units) - reserve_shortfall = - (instance.shortfall_penalty[t] >= 0) ? - solution["Reserve shortfall (MW)"][t] : 0 - - if reserve + reserve_shortfall < instance.reserves.spinning[t] - tol - @error @sprintf( - "Insufficient spinning reserves at time %d (%.2f + %.2f should be %.2f)", - t, - reserve, - reserve_shortfall, - instance.reserves.spinning[t], - ) - err_count += 1 - end - - upflexiramp = sum( - solution["Up-flexiramp (MW)"][g.name][t] for g in instance.units - ) + + # Verify flexiramp solutions only if either of the up-flexiramp and + # down-flexiramp requirements is not a default array of zeros + if instance.reserves.upflexiramp != zeros(T) || instance.reserves.dwflexiramp != zeros(T) + upflexiramp = + sum(solution["Up-flexiramp (MW)"][g.name][t] for g in instance.units) upflexiramp_shortfall = (instance.flexiramp_shortfall_penalty[t] >= 0) ? solution["Up-flexiramp shortfall (MW)"][t] : 0 - if upflexiramp + upflexiramp_shortfall < - instance.reserves.upflexiramp[t] - tol + if upflexiramp + upflexiramp_shortfall < instance.reserves.upflexiramp[t] - tol @error @sprintf( "Insufficient up-flexiramp at time %d (%.2f + %.2f should be %.2f)", t, @@ -358,15 +342,13 @@ function _validate_reserve_and_demand(instance, solution, tol = 0.01) err_count += 1 end - dwflexiramp = sum( - solution["Down-flexiramp (MW)"][g.name][t] for g in instance.units - ) + dwflexiramp = + sum(solution["Down-flexiramp (MW)"][g.name][t] for g in instance.units) dwflexiramp_shortfall = (instance.flexiramp_shortfall_penalty[t] >= 0) ? solution["Down-flexiramp shortfall (MW)"][t] : 0 - if dwflexiramp + dwflexiramp_shortfall < - instance.reserves.dwflexiramp[t] - tol + if dwflexiramp + dwflexiramp_shortfall < instance.reserves.dwflexiramp[t] - tol @error @sprintf( "Insufficient down-flexiramp at time %d (%.2f + %.2f should be %.2f)", t, @@ -376,7 +358,27 @@ function _validate_reserve_and_demand(instance, solution, tol = 0.01) ) err_count += 1 end + # Verify spinning reserve solutions only if both up-flexiramp and + # down-flexiramp requirements are arrays of zeros. + else + reserve = + sum(solution["Reserve (MW)"][g.name][t] for g in instance.units) + reserve_shortfall = + (instance.shortfall_penalty[t] >= 0) ? + solution["Reserve shortfall (MW)"][t] : 0 + + if reserve + reserve_shortfall < instance.reserves.spinning[t] - tol + @error @sprintf( + "Insufficient spinning reserves at time %d (%.2f + %.2f should be %.2f)", + t, + reserve, + reserve_shortfall, + instance.reserves.spinning[t], + ) + err_count += 1 + end end + return err_count end