The following steps should be performed before releasing a new storm version.
Note that in most case a simultaneous release of [carl](https://github.com/smtrat/carl), [storm](https://github.com/moves-rwth/storm), [pycarl](https://github.com/moves-rwth/pycarl/) and [stormpy](https://github.com/moves-rwth/stormpy/) is preferred.
1. Update `CHANGELOG.md`
To get all the commits from an author since the last tag execute:
```console
git log last_tag..HEAD --author "author_name"
```
2. Update used carl version:
* Update `GIT_TAG` in `resources/3rdparty/carl/CMakeLists.txt`
* Maybe update `CARL_MINVERSION` in `resources/3rdparty/CMakeLists.txt`
3. Check that storm builds without errors and all tests are successful
* [Travis](https://travis-ci.org/moves-rwth/storm) should run successfully
4. Set new storm version:
* Set new storm version in `version.cmake`
5. Set new tag in git
```console
git tag -a new_version
git push origin new_version
```
Next we push the tag to GitHub. This step requires the GitHub repo to to be configured as a remote.
STORM_LOG_THROW(mdp.getNumberOfChoices()==labelSets.size(),storm::exceptions::InvalidArgumentException,"The given number of labels does not match the number of choices.");
STORM_LOG_THROW(mdp.hasChoiceOrigins(),storm::exceptions::InvalidArgumentException,"Restriction to minimal command set is impossible for model without choice origns.");
STORM_LOG_THROW(mdp.hasChoiceOrigins(),storm::exceptions::InvalidArgumentException,"Restriction to minimal command set is impossible for model without choice origins.");
STORM_LOG_THROW(mdp.getChoiceOrigins()->isPrismChoiceOrigins(),storm::exceptions::InvalidArgumentException,"Restriction to command set is impossible for model without prism choice origins.");
std::cout<<std::endl<<"Extended command for lower bounded property to size "<<commandSet.size()<<" in "<<std::chrono::duration_cast<std::chrono::milliseconds>(endTime-startTime).count()<<"ms."<<std::endl;
std::cout<<std::endl<<"Generating minimal label counterexample for formula "<<*formula<<std::endl;
STORM_LOG_THROW(formula->isProbabilityOperatorFormula(),storm::exceptions::InvalidPropertyException,"Counterexample generation does not support this kind of formula. Expecting a probability operator as the outermost formula element.");
STORM_LOG_THROW(comparisonType==storm::logic::ComparisonType::Less||comparisonType==storm::logic::ComparisonType::LessEqual,storm::exceptions::InvalidPropertyException,"Counterexample generation only supports formulas with an upper probability bound.");
STORM_LOG_THROW(probabilityOperator.getSubformula().isUntilFormula()||probabilityOperator.getSubformula().isEventuallyFormula(),storm::exceptions::InvalidPropertyException,"Path formula is required to be of the form 'phi U psi' for counterexample generation.");
STORM_LOG_THROW(!storm::logic::isLowerBound(comparisonType),storm::exceptions::NotSupportedException,"Lower bounds in counterexamples are only supported for eventually formulas.");
std::cout<<std::endl<<"Computed minimal command set of size "<<commandSet.size()<<" in "<<std::chrono::duration_cast<std::chrono::milliseconds>(endTime-startTime).count()<<"ms."<<std::endl;
STORM_LOG_THROW((variable.getType()==carl::VariableType::VT_BOOL),storm::exceptions::IllegalArgumentException,"Tried to add a constraint that consists of a non-boolean variable.");
STORM_LOG_THROW((variable.type()==carl::VariableType::VT_BOOL),storm::exceptions::IllegalArgumentException,"Tried to add a constraint that consists of a non-boolean variable.");
STORM_LOG_TRACE("Completed "<<valueIterationInvocations<<" value iteration invocations, the last one with precision "<<precision<<" completed in "<<viResult.iterations<<" iterations.");
STORM_LOG_TRACE("Completed "<<powerIterationInvocations<<" power iteration invocations, the last one with precision "<<precision<<" completed in "<<result.iterations<<" iterations.");
STORM_LOG_WARN("Fox-Glynn: lambda >= 25, underflow near Poi("<<lambda<<","<<left<<") <= "<<std::exp(result-log10_result/log10_e)<<log10_result<<". The results are unreliable.");
}
// We still have to perform an underflow check for the right truncation point when lambda >= 400.
STORM_LOG_WARN("Fox-Glynn: lambda >= 25, underflow near Poi("<<lambda<<","<<right<<") <= "<<std::exp(result-log10_result/log10_e)<<log10_result<<". The results are unreliable.");
STORM_LOG_THROW(lambda!=storm::utility::zero<ValueType>(),storm::exceptions::InvalidArgumentException,"Error in Fox-Glynn algorithm: lambda must not be zero.");
STORM_LOG_THROW(std::trunc((m-k*sqrtLambda-1.5))>=0,storm::exceptions::OutOfRangeException,"Error in Fox-Glynn algorithm: Underflow of left truncation point.");
xxxxxxxxxx