Introduce Run.optimization.has_solution()
#154
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
For compliance with ixmp's API, we need a way to check whether a
Run
has a solution. This PR adds such a function and tests its behaviour.I wondered a bit about the best way to do this. Theoretically, we could also add a field
has_solution
to the DB model of aRun
and set it toTrue
if some kind ofrun.optimization.solve()
function is called. We don't have such a function right now, though, so I opted for the way we can already check it (which is identical to how ixmp_source does it): iterate over all variables and equations defined in theRun
, and returnTrue
if any of them containlevels
(i.e. some data); return False otherwise.Of course, this could be slow if we need to iterate through millions of equations; maybe @danielhuppmann can share how many objects we'd typically have to iterate over.
For now, I've included this function in the
optimization
subobject since it seems similar toremove_solution()
and only affects the "solving" part of aRun
. However, we could also shift this up to enablerun.has_solution()
as this is a property of the wholeRun
.