| 961 | } |
| 962 | |
| 963 | bool WorkflowJSON_Impl::validateMeasures() const { |
| 964 | // TODO: should we exit early, or return all problems found? |
| 965 | |
| 966 | bool result = true; |
| 967 | MeasureType state = MeasureType::ModelMeasure; |
| 968 | |
| 969 | for (size_t i = 0; const auto& step : m_steps) { |
| 970 | LOG(Debug, "Validating step " << i); |
| 971 | if (auto step_ = step.optionalCast<MeasureStep>()) { |
| 972 | // Not calling getBCLMeasure because I want to mimic workflow-gem and be as explicit as possible about what went wrong |
| 973 | const auto measureDirName = step_->measureDirName(); |
| 974 | auto measurePath_ = findMeasure(measureDirName); |
| 975 | if (!measurePath_) { |
| 976 | LOG(Error, "Cannot find measure '" << measureDirName << "'"); |
| 977 | result = false; |
| 978 | continue; |
| 979 | } |
| 980 | auto bclMeasure_ = BCLMeasure::load(*measurePath_); |
| 981 | if (!bclMeasure_) { |
| 982 | LOG(Error, "Cannot load measure '" << measureDirName << "' at '" << *measurePath_ << "'"); |
| 983 | result = false; |
| 984 | continue; |
| 985 | } |
| 986 | |
| 987 | // Ensure that measures are in order, i.e. no OS after E+, E+ or OS after Reporting |
| 988 | const auto measureType = bclMeasure_->measureType(); |
| 989 | |
| 990 | if (measureType == MeasureType::ModelMeasure) { |
| 991 | if (state == MeasureType::EnergyPlusMeasure) { |
| 992 | LOG(Error, "OpenStudio measure '" << measureDirName << "' called after transition to EnergyPlus."); |
| 993 | result = false; |
| 994 | } |
| 995 | if (state == MeasureType::ModelicaMeasure) { |
| 996 | LOG(Error, "OpenStudio measure '" << measureDirName << "' called after Modelica measure."); |
| 997 | result = false; |
| 998 | } |
| 999 | if (state == MeasureType::ReportingMeasure) { |
| 1000 | LOG(Error, "OpenStudio measure '" << measureDirName << "' called after Energyplus simulation."); |
| 1001 | result = false; |
| 1002 | } |
| 1003 | } else if (measureType == MeasureType::EnergyPlusMeasure) { |
| 1004 | if (state == MeasureType::ModelicaMeasure) { |
| 1005 | LOG(Error, "EnergyPlus measure '" << measureDirName << "' called after Modelica measure."); |
| 1006 | result = false; |
| 1007 | } |
| 1008 | if (state == MeasureType::ReportingMeasure) { |
| 1009 | LOG(Error, "EnergyPlus measure '" << measureDirName << "' called after Energyplus simulation."); |
| 1010 | result = false; |
| 1011 | } |
| 1012 | if (state == MeasureType::ModelMeasure) { |
| 1013 | state = MeasureType::EnergyPlusMeasure; |
| 1014 | } |
| 1015 | } else if (measureType == MeasureType::ModelicaMeasure) { |
| 1016 | if (state == MeasureType::ReportingMeasure) { |
| 1017 | LOG(Error, "Modelica measure '" << measureDirName << "' called after Energyplus simulation."); |
| 1018 | result = false; |
| 1019 | } |
| 1020 | if (state == MeasureType::EnergyPlusMeasure) { |