mirror of
https://github.com/XRPLF/rippled.git
synced 2026-07-24 07:30:30 +00:00
53 lines
1.2 KiB
C++
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
|