| 814 | } |
| 815 | |
| 816 | boost::optional<double> UtilityBill_Impl::CVRMSE() const { |
| 817 | boost::optional<double> result; |
| 818 | double ysum = 0; |
| 819 | double squaredError = 0; |
| 820 | unsigned n = 0; |
| 821 | double conv = this->consumptionUnitConversionFactor(); |
| 822 | for (const BillingPeriod& p : this->billingPeriods()) { |
| 823 | boost::optional<double> consumption = p.consumption(); |
| 824 | if (consumption) { |
| 825 | double convertedConsumption = conv * consumption.get(); |
| 826 | boost::optional<double> modelConsumption = p.modelConsumption(); |
| 827 | if (modelConsumption) { |
| 828 | ysum += convertedConsumption; |
| 829 | squaredError += std::pow(convertedConsumption - *modelConsumption, 2); |
| 830 | n += 1; |
| 831 | } |
| 832 | } |
| 833 | } |
| 834 | |
| 835 | if (n > 1) { |
| 836 | double ybar = ysum / n; |
| 837 | result = 100.0 * std::pow(squaredError / (n - 1), 0.5) / ybar; |
| 838 | } |
| 839 | |
| 840 | return result; |
| 841 | } |
| 842 | |
| 843 | boost::optional<double> UtilityBill_Impl::NMBE() const { |
| 844 | boost::optional<double> result; |
no test coverage detected