#include #include #include #include #include #include #include namespace xrpl { QualityFunction::QualityFunction(Quality const& quality, QualityFunction::CLOBLikeTag) : m_(0), b_(0), quality_(quality) { if (quality.rate() <= beast::kZero) Throw("QualityFunction quality rate is 0."); b_ = 1 / quality.rate(); } void QualityFunction::combine(QualityFunction const& qf) { m_ += b_ * qf.m_; b_ *= qf.b_; if (m_ != 0) quality_ = std::nullopt; } std::optional QualityFunction::outFromAvgQ(Quality const& quality) { if (m_ != 0 && quality.rate() != beast::kZero) { SaveNumberRoundMode const rm(Number::setround(Number::RoundingMode::Upward)); auto const out = (1 / quality.rate() - b_) / m_; if (out <= 0) return std::nullopt; return out; } return std::nullopt; } bool QualityFunction::satisfiesAvgQ(Quality const& quality, Number const& out) const { if (quality.rate() == beast::kZero) return false; return m_ * out + b_ >= 1 / quality.rate(); } } // namespace xrpl