Files
rippled/src/libxrpl/protocol/QualityFunction.cpp
2026-05-28 14:42:17 -04:00

53 lines
1.2 KiB
C++

#include <xrpl/protocol/QualityFunction.h>
#include <xrpl/basics/Number.h>
#include <xrpl/basics/contract.h>
#include <xrpl/beast/utility/Zero.h>
#include <xrpl/protocol/Quality.h>
#include <optional>
#include <stdexcept>
namespace xrpl {
QualityFunction::QualityFunction(Quality const& quality, QualityFunction::CLOBLikeTag)
: m_(0), b_(0), quality_(quality)
{
if (quality.rate() <= beast::kZero)
Throw<std::runtime_error>("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<Number>
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