| 841 | } |
| 842 | |
| 843 | boost::optional<double> UtilityBill_Impl::NMBE() const { |
| 844 | boost::optional<double> result; |
| 845 | double ysum = 0; |
| 846 | double sumError = 0; |
| 847 | unsigned n = 0; |
| 848 | double conv = this->consumptionUnitConversionFactor(); |
| 849 | for (const BillingPeriod& p : this->billingPeriods()) { |
| 850 | boost::optional<double> consumption = p.consumption(); |
| 851 | if (consumption) { |
| 852 | double convertedConsumption = conv * consumption.get(); |
| 853 | boost::optional<double> modelConsumption = p.modelConsumption(); |
| 854 | if (modelConsumption) { |
| 855 | ysum += convertedConsumption; |
| 856 | sumError += (convertedConsumption - *modelConsumption); |
| 857 | n += 1; |
| 858 | } |
| 859 | } |
| 860 | } |
| 861 | |
| 862 | if (n > 1) { |
| 863 | double ybar = ysum / n; |
| 864 | result = 100.0 * (sumError / (n - 1)) / ybar; |
| 865 | } |
| 866 | |
| 867 | return result; |
| 868 | } |
| 869 | |
| 870 | } // namespace detail |
| 871 |
no test coverage detected