|  |  | @ -17,6 +17,7 @@ | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/exceptions/UnexpectedException.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/exceptions/InvalidOperationException.h"
 | 
			
		
	
		
			
				
					|  |  |  | #include "storm/exceptions/IllegalArgumentException.h"
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | namespace storm { | 
			
		
	
	
		
			
				
					|  |  | @ -296,25 +297,37 @@ namespace storm { | 
			
		
	
		
			
				
					|  |  |  |                 initializeFacets(env); | 
			
		
	
		
			
				
					|  |  |  |                  | 
			
		
	
		
			
				
					|  |  |  |                 // Compute the relative precision in each dimension.
 | 
			
		
	
		
			
				
					|  |  |  |                 // Todo: also allow for absolute precision
 | 
			
		
	
		
			
				
					|  |  |  |                 eps = std::vector<GeometryValueType>(objectives.size(), storm::utility::zero<GeometryValueType>()); | 
			
		
	
		
			
				
					|  |  |  |                 for (auto const& point : pointset) { | 
			
		
	
		
			
				
					|  |  |  |                     for (uint64_t i = 0; i < eps.size(); ++i) { | 
			
		
	
		
			
				
					|  |  |  |                         eps[i] += storm::utility::abs(point.second.get()[i]); | 
			
		
	
		
			
				
					|  |  |  |                 if (env.modelchecker().multi().getPrecisionType() == MultiObjectiveModelCheckerEnvironment::PrecisionType::RelativeToDiff) { | 
			
		
	
		
			
				
					|  |  |  |                     std::vector<GeometryValueType> pmax, pmin; | 
			
		
	
		
			
				
					|  |  |  |                     for (auto const& point : pointset) { | 
			
		
	
		
			
				
					|  |  |  |                         auto const& coordinates = point.second.get(); | 
			
		
	
		
			
				
					|  |  |  |                         if (pmax.empty() && pmin.empty()) { | 
			
		
	
		
			
				
					|  |  |  |                             pmax = coordinates; | 
			
		
	
		
			
				
					|  |  |  |                             pmin = coordinates; | 
			
		
	
		
			
				
					|  |  |  |                         } else { | 
			
		
	
		
			
				
					|  |  |  |                             for (uint64_t i = 0; i < pmax.size(); ++i) { | 
			
		
	
		
			
				
					|  |  |  |                                 pmax[i] = std::max(pmax[i], coordinates[i]); | 
			
		
	
		
			
				
					|  |  |  |                                 pmin[i] = std::min(pmin[i], coordinates[i]); | 
			
		
	
		
			
				
					|  |  |  |                             } | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 GeometryValueType epsScalingFactor = storm::utility::convertNumber<GeometryValueType>(env.modelchecker().multi().getPrecision()); | 
			
		
	
		
			
				
					|  |  |  |                 epsScalingFactor += epsScalingFactor; | 
			
		
	
		
			
				
					|  |  |  |                 epsScalingFactor = epsScalingFactor / storm::utility::convertNumber<GeometryValueType, uint64_t>(pointset.size()); | 
			
		
	
		
			
				
					|  |  |  |                 for (auto& ei : eps) { | 
			
		
	
		
			
				
					|  |  |  |                     if (storm::utility::isZero(ei)) { | 
			
		
	
		
			
				
					|  |  |  |                         // This is for the special case where the objective value was zero for all considered schedulers in the initialization phase.
 | 
			
		
	
		
			
				
					|  |  |  |                         ei = storm::utility::convertNumber<GeometryValueType>(1e-8); | 
			
		
	
		
			
				
					|  |  |  |                     GeometryValueType epsScalingFactor = storm::utility::convertNumber<GeometryValueType>(env.modelchecker().multi().getPrecision()); | 
			
		
	
		
			
				
					|  |  |  |                     epsScalingFactor += epsScalingFactor; | 
			
		
	
		
			
				
					|  |  |  |                     eps.clear(); | 
			
		
	
		
			
				
					|  |  |  |                     for (uint64_t i = 0; i < pmax.size(); ++i) { | 
			
		
	
		
			
				
					|  |  |  |                         eps.push_back((pmax[i] - pmin[i]) * epsScalingFactor); | 
			
		
	
		
			
				
					|  |  |  |                         if (eps.back() < storm::utility::convertNumber<GeometryValueType>(1e-8)) { | 
			
		
	
		
			
				
					|  |  |  |                             STORM_LOG_WARN("Changing relative precision of objective " << i << " to 1e-8 since the difference between the highest and lowest value is below 1e-8."); | 
			
		
	
		
			
				
					|  |  |  |                             eps.back() = storm::utility::convertNumber<GeometryValueType>(1e-8); | 
			
		
	
		
			
				
					|  |  |  |                         } | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                     ei *=epsScalingFactor; | 
			
		
	
		
			
				
					|  |  |  |                     STORM_PRINT_AND_LOG("Relative precision is " << storm::utility::vector::toString(storm::utility::vector::convertNumericVector<double>(eps)) << std::endl); | 
			
		
	
		
			
				
					|  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |                     STORM_LOG_THROW(env.modelchecker().multi().getPrecisionType() == MultiObjectiveModelCheckerEnvironment::PrecisionType::Absolute, storm::exceptions::IllegalArgumentException, "Unknown multiobjective precision type."); | 
			
		
	
		
			
				
					|  |  |  |                     auto ei = storm::utility::convertNumber<GeometryValueType>(env.modelchecker().multi().getPrecision()); | 
			
		
	
		
			
				
					|  |  |  |                     ei += ei; | 
			
		
	
		
			
				
					|  |  |  |                     eps = std::vector<GeometryValueType>(objectives.size(), ei); | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 std::cout << "scaled precision is " << storm::utility::vector::toString(storm::utility::vector::convertNumericVector<double>(eps)) << std::endl; | 
			
		
	
		
			
				
					|  |  |  |                  | 
			
		
	
		
			
				
					|  |  |  |                 while (!unprocessedFacets.empty()) { | 
			
		
	
		
			
				
					|  |  |  |                     Facet f = std::move(unprocessedFacets.front()); | 
			
		
	
		
			
				
					|  |  |  |                     unprocessedFacets.pop(); | 
			
		
	
	
		
			
				
					|  |  | 
 |