<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.23 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC1242 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1242.xml">
<!ENTITY RFC2285 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2285.xml">
<!ENTITY RFC2544 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2544.xml">
<!ENTITY RFC5180 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5180.xml">
<!ENTITY RFC8219 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8219.xml">
<!ENTITY RFC6349 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6349.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-bmwg-mlrsearch-09" category="info" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="MLRsearch">Multiple Loss Ratio Search</title>

    <author initials="M." surname="Konstantynowicz" fullname="Maciek Konstantynowicz">
      <organization>Cisco Systems</organization>
      <address>
        <email>mkonstan@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Polak" fullname="Vratko Polak">
      <organization>Cisco Systems</organization>
      <address>
        <email>vrpolak@cisco.com</email>
      </address>
    </author>

    <date year="2025" month="February" day="24"/>

    <area>ops</area>
    <workgroup>Benchmarking Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 62?>

<t>This document proposes extensions to <xref target="RFC2544"></xref> throughput search by
defining a new methodology called Multiple Loss Ratio search
(MLRsearch). MLRsearch aims to minimize search duration,
support multiple loss ratio searches,
and enhance result repeatability and comparability.</t>

<t>The primary reason for extending <xref target="RFC2544"></xref> is to address the challenges
of evaluating and testing the data planes of software-based networking systems.</t>

<t>To give users more freedom, MLRsearch provides additional configuration options
such as allowing multiple short trials per load instead of one large trial,
tolerating a certain percentage of trial results with higher loss,
and supporting the search for multiple goals with varying loss ratios.</t>



    </abstract>



  </front>

  <middle>


<?line 78?>


<section anchor="purpose-and-scope"><name>Purpose and Scope</name>

<t>The purpose of this document is to describe the Multiple Loss Ratio search
(MLRsearch) methodology, optimized for determining
data plane throughput in software-based networking devices and functions.</t>

<t>Applying the vanilla <xref target="RFC2544"></xref> throughput bisection method to software DUTs
results in several problems:</t>

<t><list style="symbols">
  <t>Binary search takes too long as most trials are done far from the
eventually found throughput.</t>
  <t>The required final trial duration and pauses between trials
prolong the overall search duration.</t>
  <t>Software DUTs show noisy trial results,
leading to a big spread of possible discovered throughput values.</t>
  <t>Throughput requires a loss of exactly zero frames, but the industry
frequently allows for low but non-zero losses.</t>
  <t>The definition of throughput is not clear when trial results are inconsistent.</t>
</list></t>

<t>To address these problems,
the MLRsearch test methodology employs the following enhancements:</t>

<t><list style="symbols">
  <t>Allow multiple short trials instead of one big trial per load.
  <list style="symbols">
      <t>Optionally, tolerate a percentage of trial results with higher loss.</t>
    </list></t>
  <t>Allow searching for multiple Search Goals, with differing loss ratios.
  <list style="symbols">
      <t>Any trial result can affect each Search Goal in principle.</t>
    </list></t>
  <t>Insert multiple coarse targets for each Search Goal, earlier ones need
to spend less time on trials.
  <list style="symbols">
      <t>Earlier targets also aim for lesser precision.</t>
      <t>Use Forwarding Rate (FR) at maximum offered load
<xref target="RFC2285"></xref> (Section 3.6.2) to initialize bounds.</t>
    </list></t>
  <t>Take care when dealing with inconsistent trial results.
  <list style="symbols">
      <t>Reported throughput is smaller than the smallest load with high loss.</t>
      <t>Smaller load candidates are measured first.</t>
    </list></t>
  <t>Apply several load selection heuristics to save even more time
by trying hard to avoid unnecessarily narrow bounds.</t>
</list></t>

<t>Some of these enhancements are formalized as MLRsearch specification,
the remaining enhancements are treated as implementation details,
thus achieving high comparability without limiting future improvements.</t>

<t>MLRsearch configuration options are flexible enough to
support both conservative settings and aggressive settings.
Conservative enough settings lead to results
unconditionally compliant with <xref target="RFC2544"></xref>,
but without much improvement on search duration and repeatability.
Conversely, aggressive settings lead to shorter search durations
and better repeatability, but the results are not compliant with <xref target="RFC2544"></xref>.</t>

<t>No part of <xref target="RFC2544"></xref> is intended to be obsoleted by this document.</t>

</section>
<section anchor="identified-problems"><name>Identified Problems</name>

<t>This chapter describes the problems affecting usability
of various performance testing methodologies,
mainly a binary search for <xref target="RFC2544"></xref> unconditionally compliant throughput.</t>

<section anchor="long-search-duration"><name>Long Search Duration</name>

<t>The emergence of software DUTs, with frequent software updates and a
number of different frame processing modes and configurations,
has increased both the number of performance tests
required to verify the DUT update and the frequency of running those tests.
This makes the overall test execution time even more important than before.</t>

<t>The current <xref target="RFC2544"></xref> throughput definition restricts the potential
for time-efficiency improvements.
A more generalized throughput concept could enable further enhancements
while maintaining the precision of simpler methods.</t>

<t>The bisection method, when used in a manner unconditionally compliant
with <xref target="RFC2544"></xref>, is excessively slow.</t>

<t>This is because a significant amount of time is spent on trials
with loads that, in retrospect, are far from the final determined throughput.</t>

<t><xref target="RFC2544"></xref> does not specify any stopping condition for throughput search,
so users already have an access to a limited trade-off
between search duration and achieved precision.
However, each of the full 60-second trials doubles the precision,
so not many trials can be removed without a substantial loss of precision.</t>

</section>
<section anchor="dut-in-sut"><name>DUT in SUT</name>

<t><xref target="RFC2285"></xref> defines:</t>

<t>DUT as:</t>

<t><list style="symbols">
  <t>The network frame forwarding device to which stimulus is offered and
response measured <xref target="RFC2285"></xref> (Section 3.1.1).</t>
</list></t>

<t>SUT as:</t>

<t><list style="symbols">
  <t>The collective set of network devices as a single entity to which
stimulus is offered and response measured <xref target="RFC2285"></xref> (Section 3.1.2).</t>
</list></t>

<t><xref target="RFC2544"></xref> (Section 19) specifies a test setup
with an external tester stimulating the networking system,
treating it either as a single DUT, or as a system of devices, an SUT.</t>

<t>In the case of software networking, the SUT consists of not only the DUT
as a software program processing frames, but also of
server hardware and operating system functions,
with that server hardware resources shared across all programs including
the operating system.</t>

<t>Given that the SUT is a shared multi-tenant environment
encompassing the DUT and other components, the DUT might inadvertently
experience interference from the operating system
or other software operating on the same server.</t>

<t>Some of this interference can be mitigated.
For instance, pinning DUT program threads to specific CPU cores
and isolating those cores can prevent context switching.</t>

<t>Despite taking all feasible precautions, some adverse effects may still impact
the DUT&#39;s network performance.
In this document, these effects are collectively
referred to as SUT noise, even if the effects are not as unpredictable
as what other engineering disciplines call noise.</t>

<t>DUT can also exhibit fluctuating performance itself,
for reasons not related to the rest of SUT. For example
due to pauses in execution as needed for internal stateful processing.
In many cases this may be an expected per-design behavior,
as it would be observable even in a hypothetical scenario
where all sources of SUT noise are eliminated.
Such behavior affects trial results in a way similar to SUT noise.
As the two phenomenons are hard to distinguish,
in this document the term &#39;noise&#39; is used to encompass
both the internal performance fluctuations of the DUT
and the genuine noise of the SUT.</t>

<t>A simple model of SUT performance consists of an idealized noiseless performance,
and additional noise effects.
For a specific SUT, the noiseless performance is assumed to be constant,
with all observed performance variations being attributed to noise.
The impact of the noise can vary in time, sometimes wildly,
even within a single trial.
The noise can sometimes be negligible, but frequently
it lowers the observed SUT performance as observed in trial results.</t>

<t>In this model, SUT does not have a single performance value, it has a spectrum.
One end of the spectrum is the idealized noiseless performance value,
the other end can be called a noiseful performance.
In practice, trial results close to the noiseful end of the spectrum
happen only rarely.
The worse a possible performance value is, the more rarely it is seen in a trial.
Therefore, the extreme noiseful end of the SUT spectrum is not observable
among trial results.
Furthermore, the extreme noiseless end of the SUT spectrum
is unlikely to be observable, this time because some small noise effects
are very likely to occur multiple times during a trial.</t>

<t>Unless specified otherwise, this document&#39;s focus is
on the potentially observable ends of the SUT performance spectrum,
as opposed to the extreme ones.</t>

<t>When focusing on the DUT, the benchmarking effort should ideally aim
to eliminate only the SUT noise from SUT measurements.
However, this is currently not feasible in practice,
as there are no realistic enough models that would be capable
to distinguish SUT noise from DUT fluctuations
(at least based on authors&#39; experience and available literature).</t>

<t>Assuming a well-constructed SUT, the DUT is likely its primary bottleneck.
In this case, we can define the DUT&#39;s ideal noiseless performance
as the noiseless end of the SUT performance spectrum.
That is true for throughput. Other performance metrics, such as latency,
may require additional considerations.</t>

<t>Note that by this definition, DUT noiseless performance
also minimizes the impact of DUT fluctuations, as much as realistically possible
for a given trial duration.</t>

<t>MLRsearch methodology aims to solve the DUT in SUT problem
by estimating the noiseless end of the SUT performance spectrum
using a limited number of trial results.</t>

<t>Any improvements to the throughput search algorithm, aimed at better
dealing with software networking SUT and DUT setups, should employ
strategies recognizing the presence of SUT noise, allowing the discovery of
(proxies for) DUT noiseless performance
at different levels of sensitivity to SUT noise.</t>

</section>
<section anchor="repeatability-and-comparability"><name>Repeatability and Comparability</name>

<t><xref target="RFC2544"></xref> does not suggest to repeat throughput search.
And from just one discovered throughput value,
it cannot be determined how repeatable that value is.
Poor repeatability then leads to poor comparability,
as different benchmarking teams may obtain varying throughput values
for the same SUT, exceeding the expected differences from search precision.
Repeatability is important also when the test procedure is kept the same,
but SUT is varied in small ways. For example, during development
of software-based DUTs, repeatability is needed to detect small regressions.</t>

<t><xref target="RFC2544"></xref> throughput requirements (60 seconds trial and
no tolerance of a single frame loss) affect the throughput results
in the following way.
The SUT behavior close to the noiseful end of its performance spectrum
consists of rare occasions of significantly low performance,
but the long trial duration makes those occasions not so rare on the trial level.
Therefore, the binary search results tend to wander away from the noiseless end
of SUT performance spectrum, more frequently and more widely than shorter
trials would, thus causing poor throughput repeatability.</t>

<t>The repeatability problem can be addressed by defining a search procedure
that identifies a consistent level of performance,
even if it does not meet the strict definition of throughput in <xref target="RFC2544"></xref>.</t>

<t>According to the SUT performance spectrum model, better repeatability
will be at the noiseless end of the spectrum.
Therefore, solutions to the DUT in SUT problem
will help also with the repeatability problem.</t>

<t>Conversely, any alteration to <xref target="RFC2544"></xref> throughput search
that improves repeatability should be considered
as less dependent on the SUT noise.</t>

<t>An alternative option is to simply run a search multiple times,
and report some statistics (e.g. average and standard deviation).
This can be used for a subset of tests deemed more important,
but it makes the search duration problem even more pronounced.</t>

</section>
<section anchor="throughput-with-non-zero-loss"><name>Throughput with Non-Zero Loss</name>

<t><xref target="RFC1242"></xref> (Section 3.17) defines throughput as:
    The maximum rate at which none of the offered frames
    are dropped by the device.</t>

<t>Then, it says:
    Since even the loss of one frame in a
    data stream can cause significant delays while
    waiting for the higher level protocols to time out,
    it is useful to know the actual maximum data
    rate that the device can support.</t>

<t>However, many benchmarking teams accept a low,
non-zero loss ratio as the goal for their load search.</t>

<t>Motivations are many:</t>

<t><list style="symbols">
  <t>Modern protocols tolerate frame loss better,
compared to the time when <xref target="RFC1242"></xref> and <xref target="RFC2544"></xref> were specified.</t>
  <t>Trials nowadays send way more frames within the same duration,
increasing the chance of a small SUT performance fluctuation
being enough to cause frame loss.</t>
  <t>Small bursts of frame loss caused by noise have otherwise smaller impact
on the average frame loss ratio observed in the trial,
as during other parts of the same trial the SUT may work more closely
to its noiseless performance, thus perhaps lowering the Trial Loss Ratio
below the Goal Loss Ratio value.</t>
  <t>If an approximation of the SUT noise impact on the Trial Loss Ratio is known,
it can be set as the Goal Loss Ratio.</t>
  <t>For more information, see an earlier draft <xref target="Lencze-Shima"></xref> (Section 5)
and references there.</t>
</list></t>

<t>Regardless of the validity of all similar motivations,
support for non-zero loss goals makes any search algorithm more user-friendly.
<xref target="RFC2544"></xref> throughput is not user-friendly in this regard.</t>

<t>Furthermore, allowing users to specify multiple loss ratio values,
and enabling a single search to find all relevant bounds,
significantly enhances the usefulness of the search algorithm.</t>

<t>Searching for multiple Search Goals also helps to describe the SUT performance
spectrum better than the result of a single Search Goal.
For example, the repeated wide gap between zero and non-zero loss loads
indicates the noise has a large impact on the observed performance,
which is not evident from a single goal load search procedure result.</t>

<t>It is easy to modify the vanilla bisection to find a lower bound
for the load that satisfies a non-zero Goal Loss Ratio.
But it is not that obvious how to search for multiple goals at once,
hence the support for multiple Search Goals remains a problem.</t>

<t>There does not seem to be a consensus on which ratio value is the best.
For users, performance of higher protocol layers is important, for
example goodput of TCP connection (TCP throughput), but relationship
between goodput and loss ratio is not simple. See
<xref target="Lencze-Kovacs-Shima"></xref> for examples of various corner cases,
<xref target="RFC6349"></xref> Section 3 for loss ratios acceptable for an accurate
measurement of TCP throughput, and <xref target="Ott-Mathis-Semke-Mahdavi"></xref> for
models and calculations of TCP performance in presence of packet loss.</t>

</section>
<section anchor="inconsistent-trial-results"><name>Inconsistent Trial Results</name>

<t>While performing throughput search by executing a sequence of
measurement trials, there is a risk of encountering inconsistencies
between trial results.</t>

<t>Examples include:</t>

<t><list style="symbols">
  <t>A trial at the same load (same or different trial duration) results
in a different Trial Loss Ratio.</t>
  <t>A trial at a larger load (same or different trial duration) results
in a lower Trial Loss Ratio.</t>
</list></t>

<t>The plain bisection never encounters inconsistent trials.
But <xref target="RFC2544"></xref> hints about the possibility of inconsistent trial results,
in two places in its text.
The first place is Section 24, where full trial durations are required,
presumably because they can be inconsistent with the results
from short trial durations.
The second place is Section 26.3, where two successive zero-loss trials
are recommended, presumably because after one zero-loss trial
there can be a subsequent inconsistent non-zero-loss trial.</t>

<t>Any robust throughput search algorithm needs to decide how to continue
the search in the presence of such inconsistencies.
Definitions of throughput in <xref target="RFC1242"></xref> and <xref target="RFC2544"></xref> are not specific enough
to imply a unique way of handling such inconsistencies.</t>

<t>Ideally, there will be a definition of a new quantity which both generalizes
throughput for non-zero Goal Loss Ratio values
(and other possible repeatability enhancements), while being precise enough
to force a specific way to resolve trial result inconsistencies.
But until such a definition is agreed upon, the correct way to handle
inconsistent trial results remains an open problem.</t>

<t>Relevant Lower Bound is the MLRsearch term that addresses this problem.</t>

</section>
</section>
<section anchor="mlrsearch-specification"><name>MLRsearch Specification</name>

<t>MLRsearch specification describes all technical
definitions needed for evaluating whether a particular test procedure
complies with MLRsearch specification.</t>

<t>Some terms used in the specification are capitalized.
It is just a stylistic choice for this document,
reminding the reader this term is introduced, defined or explained
elsewhere in the document. See <xref target="index">Index </xref> for list of such terms.
Lowercase variants are equally valid.</t>

<t>Each per term subsection contains a short <strong>Definition</strong> paragraph
containing a minimal definition and all strict requirements,
followed by <strong>Discussion</strong> paragraphs focusing on
important consequences and recommendations.
Requirements on the way other components can use the defined quantity
are also present in the discussion paragraphs.</t>

<t>Other text in this section discusses document structure
and non-authoritative summaries.</t>

<section anchor="overview"><name>Overview</name>

<t>MLRsearch Specification describes a set of abstract system components,
acting as functions with specified inputs and outputs.</t>

<t>A test procedure is said to comply with MLRsearch Specification
if it can be conceptually divided into analogous components,
each satisfying requirements for the corresponding MLRsearch component.
Any such compliant test procedure is called a MLRsearch Implementation.</t>

<t>The Measurer component is tasked to perform Trials,
the Controller component is tasked to select Trial Durations and Loads,
the Manager component is tasked to pre-configure everything
and to produce the test report.
The test report explicitly states Search Goals (as Controller inputs)
and corresponding Goal Results (Controller outputs).</t>

<t>The Manager calls the Controller once,
the Controller keeps calling the Measurer
until all stopping conditions are met.</t>

<t>The part where Controller calls the Measurer is called the Search.
Any activity done by the Manager before it calls the Controller
(or after Controller returns) is not considered to be part of the Search.</t>

<t>MLRsearch Specification prescribes regular search results and recommends
their stopping conditions. Irregular search results are also allowed,
they may have different requirements and stopping conditions.</t>

<t>Search results are based on Load Classification.
When measured enough, any chosen Load can either achieve or fail
each Search Goal (separately), thus becoming
a Lower Bound or an Upper Bound for that Search Goal, respectively.</t>

<t>For repeatability and comparability reasons, it is important that
all implementations of MLRsearch classify the Load equivalently,
based on all Trials measured at that Load.</t>

<t>When the Relevant Lower Bound is close enough to Relevant Upper Bound
according to Goal Width, the Regular Goal Result is found.
Search stops when all Regular Goal Results are found,
or when some Search Goals are proven to have only Irregular Goal Results.</t>

<section anchor="behavior-correctness"><name>Behavior Correctness</name>

<t>MLRsearch Specification by itself does not guarantee
the Search ends in finite time, as the freedom the Controller has
for Load selection also allows for clearly deficient choices.</t>

<t>Although the authors believe that any MLRsearch Implementation
that aims to shorten the Search Duration (with fixed Controller Input)
will necessarily also become good at repeatability and comparability,
any attempts to prove such claims are outside of the scope of this document.</t>

<t>For deeper insights, see <xref target="FDio-CSIT-MLRsearch"></xref>.</t>

<t>The primary MLRsearch Implementation, used as the prototype
for this specification, is <xref target="PyPI-MLRsearch"></xref>.</t>

</section>
</section>
<section anchor="quantities"><name>Quantities</name>

<t>MLRsearch specification uses a number of specific quantities,
some of them can be expressed in several different units.</t>

<t>In general, MLRsearch specification does not require particular units to be used,
but it is REQUIRED for the test report to state all the units.
For example, ratio quantities can be dimensionless numbers between zero and one,
but may be expressed as percentages instead.</t>

<t>For convenience, a group of quantities can be treated as a composite quantity,
One constituent of a composite quantity is called an attribute,
and a group of attribute values is called an instance of that composite quantity.</t>

<t>Some attributes are not independent from others,
and they can be calculated from other attributes.
Such quantites are called derived quantities.</t>

<section anchor="current-and-final-values"><name>Current and Final Values</name>

<t>Some quantites are defined in a way that allows computing their values
in the middle of the Search. Other quantities are specified in a way
that allows their values to be computed only after the Search ends.
And some quantities are important only after the Search ended,
but their values are computable also before the Search ends.</t>

<t>For a quantity that is computable before the Search ends,
the adjective <strong>current</strong> is used to mark a value of that quantity
available before the Search ends.
When such value is relevant for the search result, the adjective <strong>final</strong>
is used to denote the value of that quantity at the end of the Search.</t>

<t>If a time evolution of such a dynamic quantity is guided
by configuration quantities, those adjectives can be used
to distinguish quantities.
For example if the current value of &quot;duration&quot; (dynamic quantity) increases
from &quot;initial duration&quot; to &quot;final duration&quot; (configuration quantities),
all the quoted names denote separate but related quantites.
As the naming suggests, the final value od &quot;duration&quot; is expected
to be equal to &quot;final duration&quot; value.</t>

</section>
</section>
<section anchor="existing-terms"><name>Existing Terms</name>

<t>This specification relies on the following three documents that should
be consulted before attempting to make use of this document:</t>

<t><list style="symbols">
  <t>RFC 1242 &quot;Benchmarking Terminology for Network Interconnect Devices&quot;
contains basic term definitions.</t>
  <t>RFC 2285 &quot;Benchmarking Terminology for LAN Switching Devices&quot; adds
more terms and discussions, describing some known network
benchmarking situations in a more precise way.</t>
  <t>RFC 2544 &quot;Benchmarking Methodology for Network Interconnect Devices&quot;
contains discussions of a number of terms and additional methodology
requirements.</t>
</list></t>

<t>Definitions of some central terms from above documents are copied and
discussed in the following subsections.</t>

<section anchor="sut"><name>SUT</name>

<t>Defined in <xref target="RFC2285"></xref> (Section 3.1.2) as follows.</t>

<t>Definition:</t>

<t>The collective set of network devices to which stimulus is offered
as a single entity and response measured.</t>

<t>Discussion:</t>

<t>An SUT consisting of a single network device is also allowed.</t>

</section>
<section anchor="dut"><name>DUT</name>

<t>Defined in <xref target="RFC2285"></xref> (Section 3.1.1) as follows.</t>

<t>Definition:</t>

<t>The network forwarding device to which stimulus is offered and
response measured.</t>

<t>Discussion:</t>

<t>DUT, as a sub-component of SUT, is only indirectly mentioned
in MLRsearch specification, but is of key relevance for its motivation.</t>

</section>
<section anchor="trial"><name>Trial</name>

<t>A trial is the part of the test described in <xref target="RFC2544"></xref> (Section 23).</t>

<t>Definition:</t>

<t>A particular test consists of multiple trials.  Each trial returns
   one piece of information, for example the loss rate at a particular
   input frame rate.  Each trial consists of a number of phases:</t>

<t>a) If the DUT is a router, send the routing update to the &quot;input&quot;
   port and pause two seconds to be sure that the routing has settled.</t>

<t>b)  Send the &quot;learning frames&quot; to the &quot;output&quot; port and wait 2
   seconds to be sure that the learning has settled.  Bridge learning
   frames are frames with source addresses that are the same as the
   destination addresses used by the test frames.  Learning frames for
   other protocols are used to prime the address resolution tables in
   the DUT.  The formats of the learning frame that should be used are
   shown in the Test Frame Formats document.</t>

<t>c) Run the test trial.</t>

<t>d) Wait for two seconds for any residual frames to be received.</t>

<t>e) Wait for at least five seconds for the DUT to restabilize.</t>

<t>Discussion:</t>

<t>The traffic is sent only in phase c) and received in phases c) and d).</t>

<t>The definition describes some traits, and it is not clear whether all of them
are required, or some of them are only recommended.</t>

<t>Trials are the only stimuli the SUT is expected to experience during the Search.</t>

<t>For the purposes of the MLRsearch specification,
it is ALLOWED for the test procedure to deviate from the <xref target="RFC2544"></xref> description,
but any such deviation MUST be described explicitly in the test report.</t>

<t>In some discussion paragraphs, it is useful to consider the traffic
as sent and received by a tester, as implicitly defined
in <xref target="RFC2544"></xref> (Section 6).</t>

<t>An example of deviation from <xref target="RFC2544"></xref> is using shorter wait times,
compared to those described in phases a), b), d) and e).</t>

<t>The <xref target="RFC2544"></xref> document itself seems to be treating phase b)
as any type of configuration that cannot be configured only once (by Manager,
before Search starts), as some crucial SUT state could time-out during the Search.
This document RECOMMENDS to understand &quot;learning frames&quot; to be
any such time-sensitive per-trial configuration method,
with bridge MAC learning being only one possibe example.
<xref target="RFC2544"></xref> (Section C.2.4.1) lists another example: ARP with wait time 5 seconds.</t>

</section>
</section>
<section anchor="trial-terms"><name>Trial Terms</name>

<t>This section defines new and redefine existing terms for quantities
relevant as inputs or outputs of a Trial, as used by the Measurer component.
This includes also any derived quantities related to one trial result.</t>

<section anchor="trial-duration"><name>Trial Duration</name>

<t>Definition:</t>

<t>Trial Duration is the intended duration of the phase c) of a Trial.</t>

<t>Discussion:</t>

<t>While any positive real value may be provided, some Measurer implementations
MAY limit possible values, e.g. by rounding down to nearest integer in seconds.
In that case, it is RECOMMENDED to give such inputs to the Controller
so the Controller only proposes the accepted values.</t>

</section>
<section anchor="trial-load"><name>Trial Load</name>

<t>Definition:</t>

<t>Trial Load is the per-interface Intended Load for a Trial.</t>

<t>Discussion:</t>

<t>For test report purposes, it is assumed that this is a constant load by default,
as specified in <xref target="RFC1242"></xref> (Section 3.4).</t>

<t>Trial Load MAY be only an average load,
e.g. when the traffic is intended to be bursty,
e.g. as suggested in <xref target="RFC2544"></xref> (Section 21).
In the case of non-constant load, the test report
MUST explicitly mention how exactly non-constant the traffic is.</t>

<t>Trial Load is equivalent to the quantities defined
as constant load of <xref target="RFC1242"></xref> (Section 3.4),
data rate of <xref target="RFC2544"></xref> (Section 14),
and Intended Load of <xref target="RFC2285"></xref> (Section 3.5.1),
in the sense that all three definitions specify that this value
applies to one (input or output) interface.</t>

<t>Similarly to Trial Duration, some Measurers may limit the possible values
of trial load. Contrary to trial duration, the test report is NOT REQUIRED
to document such behavior, as in practice the load differences
are negligible (and frequently undocumented).</t>

<t>It is ALLOWED to combine Trial Load and Trial Duration values in a way
that would not be possible to achieve using any integer number of data frames.</t>

<t>If a particular Trial Load value is not tied to a single Trial,
e.g. if there are no Trials yet or if there are multiple Trials,
this document uses a shorthand <strong>Load</strong>.</t>

<t>For test report purposes, multi-interface aggregate load MAY be reported,
and is understood as the same quantity expressed using different units.
From the report it MUST be clear whether a particular Trial Load value
is per one interface, or an aggregate over all interfaces.
This implies there is a known and constant coefficient between
single-interface and multi-interface load values.
The single-interface value is still the primary one,
as most other documents deal with single-interface quantites only.</t>

<t>The last paragraph also applies to other terms related to Load.</t>

</section>
<section anchor="trial-input"><name>Trial Input</name>

<t>Definition:</t>

<t>Trial Input is a composite quantity, consisting of two attributes:
Trial Duration and Trial Load.</t>

<t>Discussion:</t>

<t>When talking about multiple Trials, it is common to say &quot;Trial Inputs&quot;
to denote all corresponding Trial Input instances.</t>

<t>A Trial Input instance acts as the input for one call of the Measurer component.</t>

<t>Contrary to other composite quantities, MLRsearch Implementations
are NOT ALLOWED to add optional attributes here.
This improves interoperability between various implementations of
the Controller and the Measurer.</t>

<t>Please note that both attributes are <strong>intended</strong> quantities,
as only those can be fully controlled by the Controller.
The actual offered quantities, as realized by the Measurer, can be different
(and must be different if not multiplying into integer number of frames),
but questions around those offered quantities are generally
outside of the scope of this document.</t>

</section>
<section anchor="traffic-profile"><name>Traffic Profile</name>

<t>Definition:</t>

<t>Traffic Profile is a composite quantity containing
all attributes other than Trial Load and Trial Duration,
that are needed for unique determination of the Trial to be performed.</t>

<t>Discussion:</t>

<t>All the attributes are assumed to be constant during the search,
and the composite is configured on the Measurer by the Manager
before the Search starts.
This is why the traffic profile is not part of the Trial Input.</t>

<t>As a consequence, implementations of the Manager and the Measurer
must be aware of their common set of capabilities, so that Traffic Profile
instance uniquely defines the traffic during the Search.
The important fact is that none of those capabilities
have to be known by the Controller implementations.</t>

<t>The Traffic Profile SHOULD contain some specific quantities defined elsewhere.
For example <xref target="RFC2544"></xref> (Section 9) governs
data link frame sizes as defined in <xref target="RFC1242"></xref> (Section 3.5).</t>

<t>Several more specific quantities may be RECOMMENDED, depending on media type.
For example, <xref target="RFC2544"></xref> (Appendix C) lists frame formats and protocol addresses,
as recommended in <xref target="RFC2544"></xref> (Section 8) and <xref target="RFC2544"></xref> (Section 12).</t>

<t>Depending on SUT configuration, e.g. when testing specific protocols,
additional attributes MUST be included in the traffic profile
and in the test report.</t>

<t>Example: <xref target="RFC8219"></xref> (Section 5.3) introduces traffic setups
consisting of a mix of IPv4 and IPv6 traffic - the implied traffic profile
therefore must include an attribute for their percentage.</t>

<t>Other traffic properties that need to be somehow specified in Traffic
Profile, if they apply to the test scenario, include:</t>

<t><list style="symbols">
  <t>bidirectional traffic from <xref target="RFC2544"></xref> (Section 14),</t>
  <t>fully meshed traffic from <xref target="RFC2285"></xref> (Section 3.3.3),</t>
  <t>modifiers from <xref target="RFC2544"></xref> (Section 11).</t>
</list></t>

</section>
<section anchor="trial-forwarding-ratio"><name>Trial Forwarding Ratio</name>

<t>Definition:</t>

<t>The Trial Forwarding Ratio is a dimensionless floating point value.
It MUST range between 0.0 and 1.0, both inclusive.
It is calculated by dividing the number of frames
successfully forwarded by the SUT
by the total number of frames expected to be forwarded during the trial.</t>

<t>Discussion:</t>

<t>For most Traffic Profiles, &quot;expected to be forwarded&quot; means
&quot;intended to get transmitted from tester towards SUT&quot;.
Only if this is not the case, the test report MUST describe the Traffic Profile
in a way that implies how Trial Forwarding Ratio should be calculated.</t>

<t>Trial Forwarding Ratio MAY be expressed in other units
(e.g. as a percentage) in the test report.</t>

<t>Note that, contrary to Load terms, frame counts used to compute
Trial Forwarding Ratio are generally aggregates over all SUT output interfaces,
as most test procedures verify all outgoung frames.</t>

<t>For example, in a test with symmetric bidirectional traffic,
if one direction is forwarded without losses, but the opposite direction
does not forward at all, the trial forwarding ratio would be 0.5 (50%).</t>

</section>
<section anchor="trial-loss-ratio"><name>Trial Loss Ratio</name>

<t>Definition:</t>

<t>The Trial Loss Ratio is equal to one minus the Trial Forwarding Ratio.</t>

<t>Discussion:</t>

<t>100% minus the Trial Forwarding Ratio, when expressed as a percentage.</t>

<t>This is almost identical to Frame Loss Rate of <xref target="RFC1242"></xref> (Section 3.6).
The only minor differences are that Trial Loss Ratio
does not need to be expressed as a percentage,
and Trial Loss Ratio is explicitly based on aggregate frame counts.</t>

</section>
<section anchor="trial-forwarding-rate"><name>Trial Forwarding Rate</name>

<t>Definition:</t>

<t>The Trial Forwarding Rate is a derived quantity, calculated by
multiplying the Trial Load by the Trial Forwarding Ratio.</t>

<t>Discussion:</t>

<t>It is important to note that while similar, this quantity is not identical
to the Forwarding Rate as defined in <xref target="RFC2285"></xref> (Section 3.6.1).
The latter is based on frame counts on one output interface only,
so each output interface can have different forwarding rate,
whereas the Trial Forwarding Rate is based on frame counts
aggregated over all SUT output interfaces, while stil being a multiple of Load.</t>

<t>Consequently, for symmetric bidirectional Traffic Profiles,
the Trial Forwarding Rate value is equal to arithmetic average
of <xref target="RFC2285"></xref> Forwarding Rate values across both output interfaces.</t>

<t>Given that Trial Forwarding Rate is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface forwarding rate values.</t>

</section>
<section anchor="trial-effective-duration"><name>Trial Effective Duration</name>

<t>Definition:</t>

<t>Trial Effective Duration is a time quantity related to the trial,
by default equal to the Trial Duration.</t>

<t>Discussion:</t>

<t>This is an optional feature.
If the Measurer does not return any Trial Effective Duration value,
the Controller MUST use the Trial Duration value instead.</t>

<t>Trial Effective Duration may be any time quantity chosen by the Measurer
to be used for time-based decisions in the Controller.</t>

<t>The test report MUST explain how the Measurer computes the returned
Trial Effective Duration values, if they are not always
equal to the Trial Duration.</t>

<t>This feature can be beneficial for users
who wish to manage the overall search duration,
rather than solely the traffic portion of it.
Simply measure the duration of the whole trial (including all wait times)
and use that as the Trial Effective Duration.</t>

<t>This is also a way for the Measurer to inform the Controller about
its surprising behavior, for example when rounding the Trial Duration value.</t>

</section>
<section anchor="trial-output"><name>Trial Output</name>

<t>Definition:</t>

<t>Trial Output is a composite quantity. The REQUIRED attributes are
Trial Loss Ratio, Trial Effective Duration and Trial Forwarding Rate.</t>

<t>Discussion:</t>

<t>When talking about multiple trials, it is common to say &quot;Trial Outputs&quot;
to denote all corresponding Trial Output instances.</t>

<t>Implementations may provide additional (optional) attributes.
The Controller implementations MUST ignore values of any optional attribute
they are not familiar with,
except when passing Trial Output instances to the Manager.</t>

<t>Example of an optional attribute:
The aggregate number of frames expected to be forwarded during the trial,
especially if it is not just (a rounded-down value)
implied by Trial Load and Trial Duration.</t>

<t>While <xref target="RFC2285"></xref> (Section 3.5.2) requires the Offered Load value
to be reported for forwarding rate measurements,
it is NOT REQUIRED in MLRsearch Specification,
as search results do not depend on it.</t>

</section>
<section anchor="trial-result"><name>Trial Result</name>

<t>Definition:</t>

<t>Trial Result is a composite quantity,
consisting of the Trial Input and the Trial Output.</t>

<t>Discussion:</t>

<t>When talking about multiple trials, it is common to say &quot;Trial Results&quot;
to denote all corresponding Trial Result instances.</t>

<t>While implementations SHOULD NOT include additional attributes
with independent values, they MAY include derived quantities.</t>

</section>
</section>
<section anchor="goal-terms"><name>Goal Terms</name>

<t>This section defines new terms for quantities relevant (directly or indirectly)
for inputs and outputs of the Controller component.</t>

<t>Several goal attributes are defined before introducing
the main composite quantity: the Search Goal.</t>

<t>Contrary to other sections, definitions in subsections of this section
are necessarily vague, as their fundamental meaning is to act as
coefficients in formulas for Controller Output, which are not defined yet.</t>

<t>The discussions here relate the attributes to concepts mentioned in chapter
<xref target="identified-problems">Identified Problems</xref>, but even these discussion
paragraphs are short, informal, and mostly referencing later sections,
where the impact on search results is discussed after introducing
the complete set of auxiliary terms.</t>

<section anchor="goal-final-trial-duration"><name>Goal Final Trial Duration</name>

<t>Definition:</t>

<t>Minimal value for Trial Duration that has to be reached.
The value MUST be positive.</t>

<t>Discussion:</t>

<t>Some Trials have to be at least this long
to allow a Load to be classified as a Lower Bound.
The Controller is allowed to choose shorter durations,
results of those may be enough for classification as an Upper Bound.</t>

<t>It is RECOMMENDED for all search goals to share the same
Goal Final Trial Duration value. Otherwise, Trial Duration values larger than
the Goal Final Trial Duration may occur, weakening the assumptions
the <xref target="load-classification-logic">Load Classification Logic</xref> is based on.</t>

</section>
<section anchor="goal-duration-sum"><name>Goal Duration Sum</name>

<t>Definition:</t>

<t>A threshold value for a particular sum of Trial Effective Duration values.
The value MUST be positive.</t>

<t>Discussion:</t>

<t>Informally, this prescribes the sufficient amount of trials performed
at a specific Trial Load and Goal Final Trial Duration during the search.</t>

<t>If the Goal Duration Sum is larger than the Goal Final Trial Duration,
multiple trials may be needed to be performed at the same load.</t>

<t>See section <xref target="mlrsearch-compliant-with-tst009">MLRsearch Compliant with TST009</xref>
of this document for an example where the possibility of multiple trials
at the same load is intended.</t>

<t>A Goal Duration Sum value shorter than the Goal Final Trial Duration
(of the same goal) could save some search time, but is NOT RECOMMENDED,
as the time savings come at the cost of decreased repeatability.</t>

<t>In practice, the Search can spend less than Goal Duration Sum measuring
a Load value when the results are particularly one-sided,
but also the Search can spend more than Goal Duration Sum measuring a Load
when the results are balanced and include
trials shorter than Goal Final Trial Duration.</t>

</section>
<section anchor="goal-loss-ratio"><name>Goal Loss Ratio</name>

<t>Definition:</t>

<t>A threshold value for Trial Loss Ratio values.
The value MUST be non-negative and smaller than one.</t>

<t>Discussion:</t>

<t>A trial with Trial Loss Ratio larger than this value
signals the SUT may be unable to process this Trial Load well enough.</t>

<t>See <xref target="throughput-with-non-zero-loss">Throughput with Non-Zero Loss</xref>
for reasons why users may want to set this value above zero.</t>

<t>Since multiple trials may be needed for one Load value,
the Load Classification is generally more complicated than mere comparison
of Trial Loss Ratio to Goal Loss Ratio.</t>

</section>
<section anchor="goal-exceed-ratio"><name>Goal Exceed Ratio</name>

<t>Definition:</t>

<t>A threshold value for a particular ratio of sums
of Trial Effective Duration values.
The value MUST be non-negative and smaller than one.</t>

<t>Discussion:</t>

<t>Informally, up to this proportion of Trial Results
with Trial Loss Ratio above Goal Loss Ratio is tolerated at a Lower Bound.
This is the full impact if every Trial was measured at Goal Final Trial Duration.
The actual full logic is more complicated, as shorter Trials are allowed.</t>

<t>For explainability reasons, the RECOMMENDED value for exceed ratio is 0.5 (50%),
as in practice that value leads to
the smallest variation in overall Search Duration.</t>

<t>See <xref target="exceed-ratio-and-multiple-trials">Exceed Ratio and Multiple Trials</xref>
section for more details.</t>

</section>
<section anchor="goal-width"><name>Goal Width</name>

<t>Definition:</t>

<t>A threshold value for deciding whether two Trial Load values are close enough.
This is an OPTIONAL attribute. If present, the value MUST be positive.</t>

<t>Discussion:</t>

<t>Informally, this acts as a stopping condition,
controlling the precision of the search result.
The search stops if every goal has reached its precision.</t>

<t>Implementations without this attribute
MUST give the Controller other ways to control the search stopping conditions.</t>

<t>Absolute load difference and relative load difference are two popular choices,
but implementations may choose a different way to specify width.</t>

<t>The test report MUST make it clear what specific quantity is used as Goal Width.</t>

<t>It is RECOMMENDED to set the Goal Width (as relative difference) value
to a value no lower than the Goal Loss Ratio.
If the reason is not obvious, see the details in
<xref target="generalized-throughput">Generalized Throughput</xref>.</t>

</section>
<section anchor="goal-initial-trial-duration"><name>Goal Initial Trial Duration</name>

<t>Definition:</t>

<t>Minimal value for Trial Duration suggested to use for this goal.
If present, this value MUST be positive.</t>

<t>Discussion:</t>

<t>This is an example of an OPTIONAL Search Goal some implementations may support.</t>

<t>The reasonable default value is equal to the Goal Final Trial Duration value.</t>

<t>Informally, this is the shortest Trial Duration the Controller should select
when focusing on the goal.</t>

<t>Note that shorter Trial Duration values can still be used,
for example selected while focusing on a different Search Goal.
Such results MUST be still accepted by the Load Classification logic.</t>

<t>Goal Initial Trial Duration is just a way for the user to discourage
trials with Trial Duration values deemed as too unreliable
for particular SUT and this Search Goal.</t>

</section>
<section anchor="search-goal"><name>Search Goal</name>

<t>Definition:</t>

<t>The Search Goal is a composite quantity consisting of several attributes,
some of them are required.</t>

<t>Required attributes:
- Goal Final Trial Duration
- Goal Duration Sum
- Goal Loss Ratio
- Goal Exceed Ratio</t>

<t>Optional attributes:
- Goal Initial Trial Duration
- Goal Width</t>

<t>Discussion:</t>

<t>Implementations MAY add their own attributes.
Those additional attributes may be required by the implementation
even if they are not required by MLRsearch specification.
But it is RECOMMENDED for those implementations
to support missing attributes by providing reasonable default values.</t>

<t>For example, implementations with Goal Initial Trial Durations
may also require users to specify &quot;how quickly&quot; should Trial Durations increase.</t>

<t>See <xref target="compliance">Compliance </xref> for important Search Goal instances.</t>

</section>
<section anchor="controller-input"><name>Controller Input</name>

<t>Definition:</t>

<t>Controller Input is a composite quantity
required as an input for the Controller.
The only REQUIRED attribute is a list of Search Goal instances.</t>

<t>Discussion:</t>

<t>MLRsearch Implementations MAY use additional attributes.
Those additional attributes may be required by the implementation
even if they are not required by MLRsearch specification.</t>

<t>Formally, the Manager does not apply any Controller configuration
apart from one Controller Input instance.</t>

<t>For example, Traffic Profile is configured on the Measurer by the Manager,
without explicit assistance of the Controller.</t>

<t>The order of Search Goal instances in a list SHOULD NOT
have a big impact on Controller Output,
but MLRsearch Implementations MAY base their behavior on the order
of Search Goal instances in a list.</t>

<section anchor="max-load"><name>Max Load</name>

<t>Definition:</t>

<t>Max Load is an optional attribute of Controller Input.
It is the maximal value the Controller is allowed to use for Trial Load values.</t>

<t>Discussion:</t>

<t>Max Load is an example of an optional attribute (outside the list of Search Goals)
required by some implementations of MLRsearch.</t>

<t>In theory, each search goal could have its own Max Load value,
but as all Trial Results are possibly affecting all Search Goals,
it makes more sense for a single Max Load value to apply
to all Search Goal instances.</t>

<t>While Max Load is a frequently used configuration parameter, already governed
(as maximum frame rate) by <xref target="RFC2544"></xref> (Section 20)
and (as maximum offered load) by <xref target="RFC2285"></xref> (Section 3.5.3),
some implementations may detect or discover it
(instead of requiring a user-supplied value).</t>

<t>In MLRsearch specification, one reason for listing
the <xref target="relevant-upper-bound">Relevant Upper Bound</xref> as a required attribute
is that it makes the search result independent of Max Load value.</t>

<t>Given that Max Load is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface maximal loads.</t>

</section>
<section anchor="min-load"><name>Min Load</name>

<t>Definition:</t>

<t>Min Load is an optional attribute of Controller Input.
It is the minimal value the Controller is allowed to use for Trial Load values.</t>

<t>Discussion:</t>

<t>Min Load is another example of an optional attribute
required by some implementations of MLRsearch.
Similarly to Max Load, it makes more sense to prescribe one common value,
as opposed to using a different value for each Search Goal.</t>

<t>Min Load is mainly useful for saving time by failing early,
arriving at an Irregular Goal Result when Min Load gets classified
as an Upper Bound.</t>

<t>For implementations, it is RECOMMENDED to require Min Load to be non-zero
and large enough to result in at least one frame being forwarded
even at shortest allowed Trial Duration,
so that Trial Loss Ratio is always well-defined,
and the implementation can apply relative Goal Width safely.</t>

<t>Given that Min Load is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface minimal loads.</t>

</section>
</section>
</section>
<section anchor="auxiliary-terms"><name>Auxiliary Terms</name>

<t>While the terms defined in this section are not strictly needed
when formulating MLRsearch requirements, they simplify the language used
in discussion paragraphs and explanation chapters.</t>

<section anchor="trial-classification"><name>Trial Classification</name>

<t>When one Trial Result instance is compared to one Search Goal instance,
several relations can be named using short adjectives.</t>

<t>As trial results do not affect each other, this <strong>Trial Classification</strong>
does not change during the Search.</t>

<section anchor="high-loss-trial"><name>High-Loss Trial</name>

<t>A trial with Trial Loss Ratio larger than a Goal Loss Ratio value
is called a <strong>high-loss trial</strong>, with respect to given Search Goal
(or lossy trial, if Goal Loss Ratio is zero).</t>

</section>
<section anchor="low-loss-trial"><name>Low-Loss Trial</name>

<t>If a trial is not high-loss, it is called a <strong>low-loss trial</strong>
(or zero-loss trial, if Goal Loss Ratio is zero).</t>

</section>
<section anchor="short-trial"><name>Short Trial</name>

<t>A trial with Trial Duration shorter than the Goal Final Trial Duration
is called a <strong>short trial</strong> (with respect to the given Search Goal).</t>

</section>
<section anchor="full-length-trial"><name>Full-Length Trial</name>

<t>A trial that is not short is called a <strong>full-length</strong> trial.</t>

<t>Note that this includes Trial Durations larger than Goal Final Trial Duration.</t>

</section>
<section anchor="long-trial"><name>Long Trial</name>

<t>A trial with Trial Duration longer than the Goal Final Trial Duration
is called a <strong>long trial</strong>.</t>

</section>
</section>
<section anchor="load-classification"><name>Load Classification</name>

<t>When a set of all Trial Result instances, performed so far
at one Trial Load, is compared to one Search Goal instance,
their relation can be named using the concept of a bound.</t>

<t>In general, such bounds are a current quantity,
even though cases of a Load changing its classification more than once
during the Search is rare in practice.</t>

<section anchor="upper-bound"><name>Upper Bound</name>

<t>Definition:</t>

<t>A Load value is called an Upper Bound if and only if it is classified
as such by <xref target="appendix-a-load-classification">Appendix A: Load Classification</xref>
algorithm for the given Search Goal at the current moment of the Search.</t>

<t>Discussion:</t>

<t>In more detail, the set of all Trial Results
performed so far at the Trial Load (and any Trial Duration)
is certain to fail to uphold all the requirements of the given Search Goal,
mainly the Goal Loss Ratio in combination with the Goal Exceed Ratio.
Here &quot;certain to fail&quot; relates to any possible results within the time
remaining till Goal Duration Sum.</t>

<t>One search goal can have multiple different Trial Load values
classified as its Upper Bounds.
While search progresses and more trials are measured,
any load value can become an Upper Bound in principle.</t>

<t>Moreover, a load can stop being an Upper Bound, but that
can only happen when more than Goal Duration Sum of trials are measured
(e.g. because another Search Goal needs more trials at this load).
In practice, the load becomes a Lower Bound (see next subsection),
and we say the previous Upper Bound got Invalidated.</t>

</section>
<section anchor="lower-bound"><name>Lower Bound</name>

<t>Definition:</t>

<t>A Load value is called a Lower Bound if and only if it is classified
as such by <xref target="appendix-a-load-classification">Appendix A: Load Classification</xref>
algorithm for the given Search Goal at the current moment of the search.</t>

<t>Discussion:</t>

<t>In more detail, the set of all Trial Results
performed so far at the Trial Load (and any Trial Duration)
is certain to uphold all the requirements of the given Search Goal,
mainly the Goal Loss Ratio in combination with the Goal Exceed Ratio.
Here &quot;certain to uphold&quot; relates to any possible results within the time
remaining till Goal Duration Sum.</t>

<t>One search goal can have multiple different Trial Load values
classified as its Lower Bounds.
As search progresses and more trials are measured,
any load value can become a Lower Bound in principle.</t>

<t>No load can be both an Upper Bound and a Lower Bound for the same Search goal
at the same time, but it is possible for a larger load to be a Lower Bound
while a smaller load is an Upper Bound.</t>

<t>Moreover, a load can stop being a Lower Bound, but that
can only happen when more than Goal Duration Sum of trials are measured
(e.g. because another Search Goal needs more trials at this load).
In that case, the load becomes an Upper Bound,
and we say the previous Lower Bound got Invalidated.</t>

</section>
<section anchor="undecided"><name>Undecided</name>

<t>Definition:</t>

<t>A Load value is called Undecided if it is currently
neither an Upper Bound nor a Lower Bound.</t>

<t>Discussion:</t>

<t>A Load value that has not been measured so far is Undecided.</t>

<t>It is possible for a Load to transition from an Upper Bound to Undecided
by adding Short Trials with Low-Loss results.
That is yet another reason for users to avoid using Search Goal instances
with diferent Goal Final Trial Duration values.</t>

</section>
</section>
</section>
<section anchor="result-terms"><name>Result Terms</name>

<t>Before defining the full structure of Controller Output,
it is useful to define the composite quantity called Goal Result.
The following subsections define its attribute first,
before describing the Goal Result quantity.</t>

<t>There is a correspondence between Search Goals and Goal Results.
Most of the following subsections refer to a given Search Goal,
when defining their terms.
Conversely, at the end of the search, each Search Goal instance
has its corresponding Goal Result instance.</t>

<section anchor="relevant-upper-bound"><name>Relevant Upper Bound</name>

<t>Definition:</t>

<t>The Relevant Upper Bound is the smallest Trial Load value
classified as an Upper Bound for a given Search Goal at the end of the Search.</t>

<t>Discussion:</t>

<t>If no measured load had enough High-Loss Trials,
the Relevant Upper Bound MAY be non-existent.
For example, when Max Load is classified as a Lower Bound.</t>

<t>Conversely, when Relevant Upper Bound does exist,
it is not affected by Max Load value.</t>

<t>Given that Relevant Upper Bound is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface loads.</t>

</section>
<section anchor="relevant-lower-bound"><name>Relevant Lower Bound</name>

<t>Definition:</t>

<t>The Relevant Lower Bound is the largest Trial Load value
among those smaller than the Relevant Upper Bound, that got classified
as a Lower Bound for a given Search Goal at the end of the search.</t>

<t>Discussion:</t>

<t>If no load had enough Low-Loss Trials, the Relevant Lower Bound
MAY be non-existent.</t>

<t>Strictly speaking, if the Relevant Upper Bound does not exist,
the Relevant Lower Bound also does not exist.
In a typical case, Max Load is classified as a Lower Bound,
making it impossible to increase the Load to continue the search
for an Upper Bound.
Thus, it is not clear whether a larger value would be found
for a Relevant Lower Bound if larger Loads were possible.</t>

<t>Given that Relevant Lower Bound is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface loads.</t>

</section>
<section anchor="conditional-throughput"><name>Conditional Throughput</name>

<t>Definition:</t>

<t>Conditional Throughput is a value computed at the Relevant Lower Bound
according to algorithm defined in
<xref target="appendix-b-conditional-throughput">Appendix B: Conditional Throughput</xref>.</t>

<t>Discussion:</t>

<t>The Relevant Lower Bound is defined only at the end of the Search,
and so is the Conditional Throughput.
But the algorithm can be applied at any time on any Lower Bound load,
so the final Conditional Throughput value may appear sooner
than at the end of the Search.</t>

<t>Informally, the Conditional Throughput should be
a typical Trial Forwarding Rate, expected to be seen
at the Relevant Lower Bound of the given Search Goal.</t>

<t>But frequently it is only a conservative estimate thereof,
as MLRsearch Implementations tend to stop measuring more Trials
as soon as they confirm the value cannot get worse than this estimate
within the Goal Duration Sum.</t>

<t>This value is RECOMMENDED to be used when evaluating repeatability
and comparability of different MLRsearch Implementations.</t>

<t>See <xref target="generalized-throughput">Generalized Throughput</xref> for more details.</t>

<t>Given that Conditional Throughput is a quantity based on Load,
it is ALLOWED to express this quantity using multi-interface values
in test report, e.g. as sum of per-interface foerwarding rates.</t>

</section>
<section anchor="goal-results"><name>Goal Results</name>

<t>MLRsearch specification is based on a set of requirements
for a &quot;regular&quot; result. But in practice, it is not always possible
for such result instance to exist, so also &quot;irregular&quot; results
need to be supported.</t>

<section anchor="regular-goal-result"><name>Regular Goal Result</name>

<t>Definition:</t>

<t>Regular Goal Result is a composite quantity consisting of several attributes.
Relevant Upper Bound and Relevant Lower Bound are REQUIRED attributes,
Conditional Throughput is a RECOMMENDED attribute.
Stopping conditions for the corresponding Search Goal MUST be satisfied.</t>

<t>Discussion:</t>

<t>Both relevant bounds MUST exist.</t>

<t>If the implementation offers Goal Width as a Search Goal attribute,
the distance between the Relevant Lower Bound
and the Relevant Upper Bound MUST NOT be larger than the Goal Width,</t>

<t>Implementations MAY add their own attributes.</t>

<t>Test report MUST display Relevant Lower Bound.
Displaying Relevant Upper Bound is NOT REQUIRED, but it is RECOMMENDED,
especially if the implementation does not use Goal Width.</t>

</section>
<section anchor="irregular-goal-result"><name>Irregular Goal Result</name>

<t>Definition:</t>

<t>Irregular Goal Result is a composite quantity. No attributes are required.</t>

<t>Discussion:</t>

<t>It is RECOMMENDED to report any useful quantity even if it does not
satisfy all the requirements. For example if Max Load is classified
as a Lower Bound, it is fine to report it as an &quot;effective&quot; Relevant Lower Bound
(although not a real one, as that requires
Relevant Upper Bound which does not exist in this case),
and compute Conditional Throughput for it. In this case,
only the missing Relevant Upper Bound signals this result instance is irregular.</t>

<t>Similarly, if both revevant bounds exist, it is RECOMMENDED
to include them as Irregular Goal Result attributes,
and let the Manager decide if their distance is too far for users&#39; purposes.</t>

<t>If test report displays some Irregular Goal Result attribute values,
they MUST be clearly marked as comming from irregular results.</t>

<t>The implementation MAY define additional attributes.</t>

</section>
<section anchor="goal-result"><name>Goal Result</name>

<t>Definition:</t>

<t>Goal Result is a composite quantity.
Each instance is either a Regular Goal Result or an Irregular Goal Result.</t>

<t>Discussion:</t>

<t>The Manager MUST be able to distinguish whether the instance is regular or not.</t>

</section>
</section>
<section anchor="search-result"><name>Search Result</name>

<t>Definition:</t>

<t>The Search Result is a single composite object
that maps each Search Goal instance to a corresponding Goal Result instance.</t>

<t>Discussion:</t>

<t>Alternatively, the Search Result can be implemented as an ordered list
of the Goal Result instances, matching the order of Search Goal instances.</t>

<t>The Search Result (as a mapping)
MUST map from all the Search Goal instances present in the Controller Input.</t>

<t>Identical Goal Result instances MAY be listed for different Search Goals,
but their status as regular or irregular may be different.
For example if two goals differ only in Goal Width value,
and the relevant bound values are close enough according to only one of them.</t>

</section>
<section anchor="controller-output"><name>Controller Output</name>

<t>Definition:</t>

<t>The Controller Output is a composite quantity returned from the Controller
to the Manager at the end of the search.
The Search Result instance is its only REQUIRED attribute.</t>

<t>Discussion:</t>

<t>MLRsearch Implementation MAY return additional data in the Controller Output,
for example number of trials performed and the total Search Duration.</t>

</section>
</section>
<section anchor="mlrsearch-architecture"><name>MLRsearch Architecture</name>

<t>MLRsearch architecture consists of three main system components:
the Manager, the Controller, and the Measurer.</t>

<t>The architecture also implies the presence of other components,
such as the SUT and the tester (as a sub-component of the Measurer).</t>

<t>Protocols of communication between components are generally left unspecified.
For example, when MLRsearch specification mentions &quot;Controller calls Measurer&quot;,
it is possible that the Controller notifies the Manager
to call the Measurer indirectly instead. This way the Measurer Implementations
can be fully independent from the Controller implementations,
e.g. developed in different programming languages.</t>

<section anchor="measurer"><name>Measurer</name>

<t>Definition:</t>

<t>The Measurer is an abstract system component that when called
with a <xref target="trial-input">Trial Input</xref> instance, performs one <xref target="trial">Trial </xref>,
and returns a <xref target="trial-output">Trial Output</xref> instance.</t>

<t>Discussion:</t>

<t>This definition assumes the Measurer is already initialized.
In practice, there may be additional steps before the Search,
e.g. when the Manager configures the traffic profile
(either on the Measurer or on its tester sub-component directly)
and performs a warm-up (if the tester or the test procedure requires one).</t>

<t>It is the responsibility of the Measurer implementation to uphold
any requirements and assumptions present in MLRsearch specification,
e.g. Trial Forwarding Ratio not being larger than one.</t>

<t>Implementers have some freedom.
For example <xref target="RFC2544"></xref> (Section 10)
gives some suggestions (but not requirements) related to
duplicated or reordered frames.
Implementations are RECOMMENDED to document their behavior
related to such freedoms in as detailed a way as possible.</t>

<t>It is RECOMMENDED to benchmark the test equipment first,
e.g. connect sender and receiver directly (without any SUT in the path),
find a load value that guarantees the Offered Load is not too far
from the Intended Load, and use that value as the Max Load value.
When testing the real SUT, it is RECOMMENDED to turn any big difference
between the Intended Load and the Offered Load into increased Trial Loss Ratio.</t>

<t>Neither of the two recommendations are made into requirements,
because it is not easy to tell when the difference is big enough,
in a way that would be disentangled from other Measurer freedoms.</t>

<t>For a simple example of a situation where the Offered Load cannot keep up
with the Intended Load, and the consequences on MLRsearch result,
see <xref target="hard-performance-limit">Hard Performance Limit</xref>.</t>

</section>
<section anchor="controller"><name>Controller</name>

<t>Definition:</t>

<t>The Controller is an abstract system component
that when called once with a Controller Input instance
repeatedly computes Trial Input instance for the Measurer,
obtains corresponding Trial Output instances,
and eventually returns a Controller Output instance.</t>

<t>Discussion:</t>

<t>Informally, the Controller has big freedom in selection of Trial Inputs,
and the implementations want to achieve all the Search Goals
in the shortest average time.</t>

<t>The Controller&#39;s role in optimizing the overall Search Duration
distinguishes MLRsearch algorithms from simpler search procedures.</t>

<t>Informally, each implementation can have different stopping conditions.
Goal Width is only one example.
In practice, implementation details do not matter,
as long as Goal Result instances are regular.</t>

</section>
<section anchor="manager"><name>Manager</name>

<t>Definition:</t>

<t>The Manager is an abstract system component that is reponsible for
configuring other components, calling the Controller component once,
and for creating the test report following the reporting format as
defined in <xref target="RFC2544"></xref> (Section 26).</t>

<t>Discussion:</t>

<t>The Manager initializes the SUT, the Measurer
(and the tester if independent from Measurer)
with their intended configurations before calling the Controller.</t>

<t>Note that <xref target="RFC2544"></xref> (Section 7) already puts requirements on SUT setups:</t>

<figure><artwork><![CDATA[
It is expected that all of the tests will be run without changing the
configuration or setup of the DUT in any way other than that required
to do the specific test. For example, it is not acceptable to change
the size of frame handling buffers between tests of frame handling
rates or to disable all but one transport protocol when testing the
throughput of that protocol.
]]></artwork></figure>

<t>It is REQUIRED for the test report to encompass all the SUT configuration
details, perhaps by describing a &quot;default&quot; configuration common for most tests
and only describe configuration changes if required by a specific test.</t>

<t>For example, <xref target="RFC5180"></xref> (Section 5.1.1) recommends testing jumbo frames
if SUT can forward them, even though they are outside the scope
of the 802.3 IEEE standard. In this case, it is fair
for the SUT default configuration to not support jumbo frames,
and only enable this support when testing jumbo traffic profiles,
as the handling of jumbo frames typically has different packet buffer
requirements and potentially higher processing overhead.
Ideally, non-jumbo frame sizes should also be tested on the jumbo-enabled setup.</t>

<t>The Manager does not need to be able to tweak any Search Goal attributes,
but it MUST report all applied attribute values even if not tweaked.</t>

<t>In principle, there should be a &quot;user&quot; (human or automated)
that &quot;starts&quot; or &quot;calls&quot; the Manager and receives the report.
The Manager MAY be able to be called more than once whis way,
thus triggering multiple independent Searches.</t>

</section>
</section>
<section anchor="compliance"><name>Compliance</name>

<t>This section discusses compliance relations between MLRsearch
and other test procedures.</t>

<section anchor="test-procedure-compliant-with-mlrsearch"><name>Test Procedure Compliant with MLRsearch</name>

<t>Any networking measurement setup that could be understood as consisting of
abstract components satisfying requirements
for the Measurer, the Controller and the Manager,
is considered to be compliant with MLRsearch specification.</t>

<t>These components can be seen as abstractions present in any testing procedure.
For example, there can be a single component acting both
as the Manager and the Controller, but as long as values of required attributes
of Search Goals and Goal Results are visible in the test report,
the Controller Input instance and Controller Output instance are implied.</t>

<t>For example, any setup for conditionally (or unconditionally)
compliant <xref target="RFC2544"></xref> throughput testing
can be understood as a MLRsearch architecture,
as long as there is enough data to reconstruct the Relevant Upper Bound.
See the next subsection for an equivalent Search Goal.</t>

<t>Any test procedure that can be understood as one call to the Manager of
MLRsearch architecture is said to be compliant with MLRsearch Specification.</t>

</section>
<section anchor="mlrsearch-compliant-with-rfc2544"><name>MLRsearch Compliant with RFC2544</name>

<t>The following Search Goal instance makes the corresponding Search Result
unconditionally compliant with <xref target="RFC2544"></xref> (Section 24).</t>

<t><list style="symbols">
  <t>Goal Final Trial Duration = 60 seconds</t>
  <t>Goal Duration Sum = 60 seconds</t>
  <t>Goal Loss Ratio = 0%</t>
  <t>Goal Exceed Ratio = 0%</t>
</list></t>

<t>The latter two attributes, Goal Loss Ratio and Goal Exceed Ratio,
are enough to make the Search Goal conditionally compliant.
Adding the first attribute, Goal Final Trial Duration,
makes the Search Goal unconditionally compliant.</t>

<t>The second attribute (Goal Duration Sum) only prevents MLRsearch
from repeating zero-loss Full-Length Trials.</t>

<t>The presence of other Search Goals does not affect the compliance
of this Goal Result.
The Relevant Lower Bound and the Conditional Throughput are in this case
equal to each other, and the value is the <xref target="RFC2544"></xref> throughput.</t>

<t>Non-zero exceed ratio is not strictly disallowed, but it could
needlessly prolong the search when Low-Loss short trials are present.</t>

</section>
<section anchor="mlrsearch-compliant-with-tst009"><name>MLRsearch Compliant with TST009</name>

<t>One of the alternatives to <xref target="RFC2544"></xref> is Binary search with loss verification
as described in <xref target="TST009"></xref> (Section 12.3.3).</t>

<t>The idea there is to repeat high-loss trials, hoping for zero loss on second try,
so the results are closer to the noiseless end of performance sprectum,
thus more repeatable and comparable.</t>

<t>Only the variant with &quot;z = infinity&quot; is achievable with MLRsearch.</t>

<t>For example, for &quot;max(r) = 2&quot; variant, the following Search Goal instance
should be used to get compatible Search Result:</t>

<t><list style="symbols">
  <t>Goal Final Trial Duration = 60 seconds</t>
  <t>Goal Duration Sum = 120 seconds</t>
  <t>Goal Loss Ratio = 0%</t>
  <t>Goal Exceed Ratio = 50%</t>
</list></t>

<t>If the first 60s trial has zero loss, it is enough for MLRsearch to stop
measuring at that load, as even a second high-loss trial
would still fit within the exceed ratio.</t>

<t>But if the first trial is high-loss, MLRsearch needs to perform also
the second trial to classify that load.
Goal Duration Sum is twice as long as Goal Final Trial Duration,
so third full-length trial is never needed.</t>

</section>
</section>
</section>
<section anchor="further-explanations"><name>Further Explanations</name>

<t>This chapter provides further explanations of MLRsearch behavior,
mainly in comparison to a simple bisection for <xref target="RFC2544"></xref> Throughput.</t>

<section anchor="binary-search"><name>Binary Search</name>

<t>A typical binary search implementation for <xref target="RFC2544"></xref>
tracks only the two tightest bounds.
To start, the search needs both Max Load and Min Load values.
Then, one trial is used to confirm Max Load is an Upper Bound,
and one trial to confirm Min Load is a Lower Bound.</t>

<t>Then, next Trial Load is chosen as the mean of the current tightest upper bound
and the current tightest lower bound, and becomes a new tightest bound
depending on the Trial Loss Ratio.</t>

<t>After some number of trials, the tightest lower bound becomes the throughput,
but <xref target="RFC2544"></xref> does not specify when, if ever, the search should stop.
In practice, the search stops either at some distance
between the tightest upper bound and the tightest lower bound,
or after some number of Trials.</t>

<t>For a given pair of Max Load and Min Load values,
there is one-to-one correspondence between number of Trials
and final distance between the tightest bounds.
Thus, the search always takes the same time,
assuming initial bounds are confirmed.</t>

</section>
<section anchor="stopping-conditions-and-precision"><name>Stopping Conditions and Precision</name>

<t>MLRsearch specification requires listing both Relevant Bounds for each
Search Goal, and the difference between the bounds implies
whether the result precision is achieved.
Therefore, it is not necessary to report the specific stopping condition used.</t>

<t>MLRsearch Implementations may use Goal Width
to allow direct control of result precision,
and indirect control of the Search Duration.</t>

<t>Other MLRsearch Implementations may use different stopping conditions;
for example based on the Search Duration, trading off precision control
for duration control.</t>

<t>Due to various possible time optimizations, there is no longer a strict
correspondence between the Search Duration and Goal Width values.
In practice, noisy SUT performance increases both average search time
and its variance.</t>

</section>
<section anchor="loss-ratios-and-loss-inversion"><name>Loss Ratios and Loss Inversion</name>

<t>The most obvious difference between MLRsearch and <xref target="RFC2544"></xref> binary search
is in the goals of the search.
<xref target="RFC2544"></xref> has a single goal, based on classifying a single full-length trial
as either zero-loss or non-zero-loss.
MLRsearch supports searching for multiple Search Goals at once,
usually differing in their Goal Loss Ratio values.</t>

<section anchor="single-goal-and-hard-bounds"><name>Single Goal and Hard Bounds</name>

<t>Each bound in <xref target="RFC2544"></xref> simple binary search is &quot;hard&quot;,
in the sense that all further Trial Load values
are smaller than any current upper bound and larger than any current lower bound.</t>

<t>This is also possible for MLRsearch Implementations,
when the search is started with only one Search Goal instance.</t>

</section>
<section anchor="multiple-goals-and-loss-inversion"><name>Multiple Goals and Loss Inversion</name>

<t>MLRsearch supports multiple Search Goals, making the search procedure
more complicated compared to binary search with single goal,
but most of the complications do not affect the final results much.
Except for one phenomenon: Loss Inversion.</t>

<t>Depending on Search Goal attributes, Load Classification results may be resistant
to small amounts of <xref target="inconsistent-trial-results">Inconsistent Trial Results</xref>.
But for larger amounts, a Load that is classified
as an Upper Bound for one Search Goal
may still be a Lower Bound for another Search Goal.
And, due to this other goal, MLRsearch will probably perform subsequent Trials
at Trial Loads even larger than the original value.</t>

<t>This introduces questions any many-goals search algorithm has to address.
What to do when all such larger load trials happen to have zero loss?
Does it mean the earlier upper bound was not real?
Does it mean the later Low-Loss trials are not considered a lower bound?</t>

<t>The situation where a smaller Load is classified as an Upper Bound,
while a larger Load is classified as a Lower Bound (for the same search goal),
is called Loss Inversion.</t>

<t>Conversely, only single-goal search algorithms can have hard bounds
that shield them from Loss Inversion.</t>

</section>
<section anchor="conservativeness-and-relevant-bounds"><name>Conservativeness and Relevant Bounds</name>

<t>MLRsearch is conservative when dealing with Loss Inversion:
the Upper Bound is considered real, and the Lower Bound
is considered to be a fluke, at least when computing the final result.</t>

<t>This is formalized using definitions of
<xref target="relevant-upper-bound">Relevant Upper Bound</xref> and
<xref target="relevant-lower-bound">Relevant Lower Bound</xref>.</t>

<t>The Relevant Upper Bound (for specific goal) is the smallest Load classified
as an Upper Bound. But the Relevant Lower Bound is not simply
the largest among Lower Bounds. It is the largest Load among Loads
that are Lower Bounds while also being smaller than the Relevant Upper Bound.</t>

<t>With these definitions, the Relevant Lower Bound is always smaller
than the Relevant Upper Bound (if both exist), and the two relevant bounds
are used analogously as the two tightest bounds in the binary search.
When they meet the stopping conditions, the Relevant Bounds are used in the output.</t>

</section>
<section anchor="consequences"><name>Consequences</name>

<t>The consequence of the way the Relevant Bounds are defined is that
every Trial Result can have an impact
on any current Relevant Bound larger than that Trial Load,
namely by becoming a new Upper Bound.</t>

<t>This also applies when that Load is measured
before another Load gets enough measurements to become a current Relevant Bound.</t>

<t>This also implies that if the SUT tested (or the Traffic Generator used)
needs a warm-up, it should be warmed up before starting the Search,
otherwise the first few measurements could become unjustly limiting.</t>

<t>For MLRsearch Implementations, it means it is better to measure
at smaller Loads first, so bounds found earlier are less likely
to get invalidated later.</t>

</section>
</section>
<section anchor="exceed-ratio-and-multiple-trials"><name>Exceed Ratio and Multiple Trials</name>

<t>The idea of performing multiple Trials at the same Trial Load comes from
a model where some Trial Results (those with high Trial Loss Ratio) are affected
by infrequent effects, causing poor repeatability of <xref target="RFC2544"></xref> Throughput results.
See the discussion about noiseful and noiseless ends
of the SUT performance spectrum in section <xref target="dut-in-sut">DUT in SUT</xref>.
Stable results are closer to the noiseless end of the SUT performance spectrum,
so MLRsearch may need to allow some frequency of high-loss trials
to ignore the rare but big effects near the noiseful end.</t>

<t>For MLRsearch to perform such Trial Result filtering, it needs
a configuration option to tell how frequent the &quot;infrequent&quot; big loss can be.
This option is called the <xref target="goal-exceed-ratio">Goal Exceed Ratio</xref>.
It tells MLRsearch what ratio of trials (more specifically,
what ratio of Trial Effective Duration seconds)
can have a <xref target="trial-loss-ratio">Trial Loss Ratio</xref>
larger than the <xref target="goal-loss-ratio">Goal Loss Ratio</xref>
and still be classified as a <xref target="lower-bound">Lower Bound</xref>.</t>

<t>Zero exceed ratio means all Trials must have a Trial Loss Ratio
equal to or lower than the Goal Loss Ratio.</t>

<t>When more than one Trial is intended to classify a Load,
MLRsearch also needs something that controls the number of trials needed.
Therefore, each goal also has an attribute called Goal Duration Sum.</t>

<t>The meaning of a <xref target="goal-duration-sum">Goal Duration Sum</xref> is that
when a Load has (Full-Length) Trials
whose Trial Effective Durations when summed up give a value at least as big
as the Goal Duration Sum value,
the Load is guaranteed to be classified either as an Upper Bound
or a Lower Bound for that Search Goal instance.</t>

</section>
<section anchor="short-trials-and-duration-selection"><name>Short Trials and Duration Selection</name>

<t>MLRsearch requires each Searcg Goal to specify its Goal Final Trial Duration.</t>

<t>Section 24 of <xref target="RFC2544"></xref> already anticipates possible time savings
when Short Trials are used.</t>

<t>Any MLRsearch Implementation may include its own configuration options
which control when and how MLRsearch chooses to use short trial durations.</t>

<t>While MLRsearch Implementations are free to use any logic to select
Trial Input values, comparability between MLRsearch Implementations
is only assured when the Load Classification logic
handles any possible set of Trial Results in the same way.</t>

<t>The presence of Short Trial Results complicates
the Load Classification logic, see details in
<xref target="load-classification-logic">Load Classification Logic</xref> chapter.</t>

<t>While the Load Classification algorithm is designed to avoid any unneeded Trials,
for explainability reasons it is recommended for users to use
such Controller Input instances that lead to all Trial Duration values
selected by Controller to be the same,
e.g. by setting any Goal Initial Trial Duration to be a single value
also used in all Goal Final Trial Duration attributes.</t>

</section>
<section anchor="generalized-throughput"><name>Generalized Throughput</name>

<t>Due to the fact that testing equipment takes the Intended Load
as an input parameter for a Trial measurement,
any load search algorithm needs to deal with Intended Load values internally.</t>

<t>But in the presence of Search Goals with a non-zero
<xref target="goal-loss-ratio">Goal Loss Ratio</xref>, the Load usually does not match
the user&#39;s intuition of what a throughput is.
The forwarding rate as defined in <xref target="RFC2285"></xref> (Section 3.6.1) is better,
but it is not obvious how to generalize it
for Loads with multiple Trials and a non-zero Goal Loss Ratio.</t>

<t>The best example is also the main motivation: hard performance limit.</t>

<section anchor="hard-performance-limit"><name>Hard Performance Limit</name>

<t>Even if bandwidth of the medium allows higher performance,
the SUT interfaces may have their additional own limitations,
e.g. a specific frames-per-second limit on the NIC (a common occurence).</t>

<t>Ideally, those should be known and provided as <xref target="max-load">Max Load</xref>.
But if Max Load is set larger than what the interface can receive or transmit,
there will be a &quot;hard limit&quot; behavior observed in Trial Results.</t>

<t>Imagine the hard limit is at hundred million frames per second (100 Mfps),
Max Load is larger, and the Goal Loss Ratio is 0.5%.
If DUT has no additional losses, 0.5% Trial Loss Ratio will be achieved
at Relevant Lower Bound of 100.5025 Mfps.
But it is not intuitive to report SUT performance as a value that is
larger than the known hard limit.
We need a generalization of RFC2544 throughput,
different from just the Relevant Lower Bound.</t>

<t>MLRsearch defines one such generalization,
the <xref target="conditional-throughput">Conditional Throughput</xref>.
It is the Trial Forwarding Rate from one of the Full-Length Trials
performed at the Relevant Lower Bound.
The algorithm to determine which trial exactly is in
<xref target="appendix-b-conditional-throughput">Appendix B: Conditional Throughput</xref>.</t>

<t>In the hard limit example, 100.5025 Mfps Load will still have
only 100.0 Mfps forwarding rate, nicely confirming the known limitation.</t>

</section>
<section anchor="performance-variability"><name>Performance Variability</name>

<t>With non-zero Goal Loss Ratio, and without hard performance limits,
Low-Loss trials at the same Load may achieve different Trial Forwarding Rate
values just due to DUT performance variability.</t>

<t>By comparing the best case (all Relevant Lower Bound trials have zero loss)
and the worst case (all Trial Loss Ratios at Relevant Lower Bound
are equal to the Goal Loss Ratio), we find the possible Conditional Throughput
values may have up to the Goal Loss Ratio relative difference.</t>

<t>Setting the Goal Width below the Goal Loss Ratio
may cause the Conditional Throughput for a larger Goal Loss Ratio to become smaller
than a Conditional Throughput for a goal with a lower Goal Loss Ratio,
which is counter-intuitive, considering they come from the same Search.
Therefore it is RECOMMENDED to set the Goal Width to a value no lower
than the Goal Loss Ratio of the higher-loss Search Goal.</t>

<t>Despite this variability, in practice Conditional Throughput behaves better
than Relevant Lower Bound for comparability purposes,
especially if deterministic Load selection is likely to produce
exactly the same Relevant Lower Bound value across multiple runs.</t>

</section>
</section>
</section>
<section anchor="mlrsearch-logic-and-example"><name>MLRsearch Logic and Example</name>

<t>This section uses informal language to describe two pieces of MLRsearch logic,
Load Classification and Conditional Throughput,
reflecting formal pseudocode representation present in
<xref target="appendix-a-load-classification">Appendix A: Load Classification</xref>
and <xref target="appendix-b-conditional-throughput">Appendix B: Conditional Throughput</xref>.
This is followed by example search.</t>

<t>The logic as described here is equivalent but not identical to the pseudocode
on appendices. The pseudocode is designed to be short and frequently
combines multiple operation into one expression.
The logic as described here lists each operation separately
and uses more intuitive names for te intermediate values.</t>

<section anchor="load-classification-logic"><name>Load Classification Logic</name>

<t>Note: For explanation clarity variables are taged as (I)nput,
(T)emporary, (O)utput.</t>

<t><list style="symbols">
  <t>Take all Trial Result instances (I) measured at a given load.</t>
  <t>Full-length high-loss sum (T) is the sum of Trial Effective Duration
values of all full-length high-loss trials (I).</t>
  <t>Full-length low-loss sum (T) is the sum of Trial Effective Duration
values of all full-length low-loss trials (I).</t>
  <t>Short high-loss sum is the sum (T)  of Trial Effective Duration values
of all short high-loss trials (I).</t>
  <t>Short low-loss sum is the sum (T) of Trial Effective Duration values
of all short low-loss trials (I).</t>
  <t>Subceed ratio (T) is One minus the Goal Exceed Ratio (I).</t>
  <t>Exceed coefficient (T) is the Goal Exceed Ratio divided by the subceed
ratio.</t>
  <t>Balancing sum (T) is the short low-loss sum
multiplied by the exceed coefficient.</t>
  <t>Excess sum (T) is the short high-loss sum minus the balancing sum.</t>
  <t>Positive excess sum (T) is the maximum of zero and excess sum.</t>
  <t>Effective high-loss sum (T) is the full-length high-loss sum
plus the positive excess sum.</t>
  <t>Effective full sum (T) is the effective high-loss sum
plus the full-length low-loss sum.</t>
  <t>Effective whole sum (T) is the larger of the effective full sum
and the Goal Duration Sum.</t>
  <t>Missing sum (T) is the effective whole sum minus the effective full sum.</t>
  <t>Pessimistic high-loss sum (T) is the effective high-loss sum
plus the missing sum.</t>
  <t>Optimistic exceed ratio (T) is the effective high-loss sum
divided by the effective whole sum.</t>
  <t>Pessimistic exceed ratio (T) is the pessimistic high-loss sum
divided by the effective whole sum.</t>
  <t>The load is classified as an Upper Bound (O) if the optimistic exceed
ratio is larger than the Goal Exceed Ratio.</t>
  <t>The load is classified as a Lower Bound (O) if the pessimistic exceed
ratio is not larger than the Goal Exceed Ratio.</t>
  <t>The load is classified as undecided (O) otherwise.</t>
</list></t>

</section>
<section anchor="conditional-throughput-logic"><name>Conditional Throughput Logic</name>

<t>Note: For explanation clarity variables are taged as (I)nput,
(T)emporary, (O)utput.</t>

<t><list style="symbols">
  <t>Take all Trial Result instances (I) measured at a given Load.</t>
  <t>Full-length high-loss sum (T) is the sum of Trial Effective Duration
values of all full-length high-loss trials (I).</t>
  <t>Full-length low-loss sum (T) is the sum of Trial Effective Duration
values of all full-length low-loss trials (I).</t>
  <t>Full-length sum (T) is the full-length high-loss sum (I) plus the
full-length low-loss sum (I).</t>
  <t>Subceed ratio (T) is One minus the Goal Exceed Ratio (I) is called.</t>
  <t>Remaining sum (T) initially is full-lengths sum multiplied by subceed
ratio.</t>
  <t>Current loss ratio (T) initially is 100%.</t>
  <t>For each full-length trial result, sorted in increasing order by Trial
Loss Ratio:
  <list style="symbols">
      <t>If remaining sum is not larger than zero, exit the loop.</t>
      <t>Set current loss ratio to this trial&#39;s Trial Loss Ratio (I).</t>
      <t>Decrease the remaining sum by this trial&#39;s Trial Effective Duration (I).</t>
    </list></t>
  <t>Current forwarding ratio (T) is One minus the current loss ratio.</t>
  <t>Conditional Throughput (T) is the current forwarding ratio multiplied
by the Load value.</t>
</list></t>

<t>This shows that Conditional Throughput is partially related to Load Classification.
If a Load is classified as a Relevant Lower Bound for a Search Goal instance,
the Conditional Throughput comes from a Trial Result
that is guaranteed to have Trial Loss Ratio no larger than the Goal Loss Ratio.
The converse is not true if Goal Width is smaller than the Goal Loss Ratio,
as in that case it is possible for the Conditional Throughput
to be larger than the Relevant Upper Bound.</t>

</section>
<section anchor="sut-behaviors"><name>SUT Behaviors</name>

<t>In <xref target="dut-in-sut">DUT in SUT</xref>, the notion of noise has been introduced.
In this section we rely on new terms defined since then
to describe possible SUT behaviors more precisely.</t>

<t>From measurement point of view, noise is visible as inconsistent trial results.
See <xref target="inconsistent-trial-results">Inconsistent Trial Results</xref> for general points
and <xref target="loss-ratios-and-loss-inversion">Loss Ratios and Loss Inversion</xref>
for specifics when comparing different Load values.</t>

<t>Load Classification and Conditional Throughput apply to a single Load value,
but even the set of Trial Results measured at that Trial Load value
may appear inconsistent.</t>

<t>As MLRsearch aims to save time, it executes only a small number of Trials,
getting only a limited amount of information about SUT behavior.
It is useful to introduce an &quot;SUT expert&quot; point of view to contrast
with that limited information.</t>

<section anchor="expert-predictions"><name>Expert Predictions</name>

<t>Imagine that before the Search starts, a human expert had unlimited time
to measure SUT and obtain all reliable information about it.
The information is not perfect, as there is still random noise influencing SUT.
But the expert is familiar with possible noise events, even the rare ones,
and thus the expert can do probabilistic predictions about future Trial Outputs.</t>

<t>When several outcomes are possible,
the expert can asses probability of each outcome.</t>

</section>
<section anchor="exceed-probability"><name>Exceed Probability</name>

<t>When the Controller selects new Trial Duration and Trial Load,
and just before the Measurer starts performing the Trial,
the SUT expert can envision possible Trial Results.</t>

<t>With respect to a particular Search Goal instance, the possibilities
can be summarized into a single number: Exceed Probability.
It is the probability (according to the expert) that the measured
Trial Loss Ratio will be higher than the Goal Loss Ratio.</t>

</section>
<section anchor="trial-duration-dependence"><name>Trial Duration Dependence</name>

<t>When comparing Exceed Probability values for the same Trial Load value
but different Trial Duration values,
there are several patterns that commonly occur in practice.</t>

<section anchor="strong-increase"><name>Strong Increase</name>

<t>Exceed Probability is very low at short durations but very high at full-length.
This SUT behavior is undesirable, and may hint at faulty SUT,
e.g. SUT leaks resources and is unable to sustain the desired performance.</t>

<t>But this behavior is also seen when SUT uses large amount of buffers.
This is the main reasons users may want to set large Goal Final Trial Duration.</t>

</section>
<section anchor="mild-increase"><name>Mild Increase</name>

<t>Short trials have lower exceed probability, but the difference is not as high.
This behavior is quite common if the noise contains infrequent but large
loss spikes, as the more performant parts of a full-length trial
are unable to compensate for all the frame loss from a less performant part.</t>

</section>
<section anchor="independence"><name>Independence</name>

<t>Short trials have basically the same Exceed Probability as full-length trials.
This is possible only if loss spikes are small (so other parts can compensate)
and if Goal Loss Ratio is more than zero (otherwise other parts
cannot compensate at all).</t>

</section>
<section anchor="decrease"><name>Decrease</name>

<t>Short trials have larger Exceed Probability than full-length trials.
This can be possible only for non-zero Goal Loss Ratio,
for example if SUT needs to &quot;warm up&quot; to best performance within each trial.
Not sommonly seen in practice.</t>

</section>
</section>
</section>
<section anchor="example-search"><name>Example Search</name>

<t>The following example Search is related to
one hypothetical run of a Search test procedure
that has been started with multiple Search Goals.
Several points in time are chosen, in order to show how the logic works,
with specific sets of Trial Result available.
The trial results themselves are not very realistic, as
the intention is to show several corner cases of the logic.</t>

<t>In all Trials, the Effective Trial Duration is equal to Trial Duration.</t>

<t>Only one Trial Load is in focus, its value is one million frames per second.
Trial Results at other Trial Loads are not mentioned,
as the parts of logic present here do not depend on those.
In practice, Trial Results at other Load values would be present,
e.g. MLRsearch will look for a Lower Bound smaller than any Upper Bound found.</t>

<t>In all points in time, only one Search Goal instance is marked as &quot;in focus&quot;.
That explains Trial Duration of the new Trials,
but is otherwise unrelated to the logic applied.</t>

<t>MLRsearch Implementations are not required to &quot;focus&quot; on one goal at time,
but this example is useful to show a load can be classified
also for goals not &quot;in focus&quot;.</t>

<section anchor="example-goals"><name>Example Goals</name>

<t>The following four Search Goal instances are selected for the example Search.
Each goal has a readable name and dense code,
the code is useful to show Search Goal attribute values.</t>

<t>As the variable &quot;exceed coefficient&quot; does not depend on trial results,
it is also precomputed here.</t>

<t>Goal 1:</t>

<figure><artwork><![CDATA[
name: RFC2544
Goal Final Trial Duration: 60s
Goal Duration Sum: 60s
Goal Loss Ratio: 0%
Goal Exceed Ratio: 0%
exceed coefficient: 0% / (100% / 0%) = 0.0
code: 60f60d0l0e
]]></artwork></figure>

<t>Goal 2:</t>

<figure><artwork><![CDATA[
name: TST009
Goal Final Trial Duration: 60s
Goal Duration Sum: 120s
Goal Loss Ratio: 0%
Goal Exceed Ratio: 50%
exceed coefficient: 50% / (100% - 50%) = 1.0
code: 60f120d0l50e
]]></artwork></figure>

<t>Goal 3:</t>

<figure><artwork><![CDATA[
name: 1s final
Goal Final Trial Duration: 1s
Goal Duration Sum: 120s
Goal Loss Ratio: 0.5%
Goal Exceed Ratio: 50%
exceed coefficient: 50% / (100% - 50%) = 1.0
code: 1f120d.5l50e
]]></artwork></figure>

<t>Goal 4:</t>

<figure><artwork><![CDATA[
name: 20% exceed
Goal Final Trial Duration: 60s
Goal Duration Sum: 60s
Goal Loss Ratio: 0.5%
Goal Exceed Ratio: 20%
exceed coefficient: 20% / (100% - 20%) = 0.25
code: 60f60d0.5l20e
]]></artwork></figure>

<t>The first two goals are important for compliance reasons,
the other two cover less frequent cases.</t>

</section>
<section anchor="example-trial-results"><name>Example Trial Results</name>

<t>The following six sets of trial results are selected for the example Search.
The sets are defined as points in time, describing which Trial Results
were added since the previous point.</t>

<t>Each point has a readable name and dense code,
the code is useful to show Trial Output attribute values
and number of times identical results were added.</t>

<t>Point 1:</t>

<figure><artwork><![CDATA[
name: first short good
goal in focus: 1s final (1f120d.5l50e)
added Trial Results: 59 trials, each 1 second and 0% loss
code: 59x1s0l
]]></artwork></figure>

<t>Point 2:</t>

<figure><artwork><![CDATA[
name: first short bad
goal in focus: 1s final (1f120d.5l50e)
added Trial Result: one trial, 1 second, 1% loss
code: 59x1s0l+1x1s1l
]]></artwork></figure>

<t>Point 3:</t>

<figure><artwork><![CDATA[
name: last short bad
goal in focus: 1s final (1f120d.5l50e)
added Trial Results: 59 trials, 1 second each, 1% loss each
code: 59x1s0l+60x1s1l
]]></artwork></figure>

<t>Point 4:</t>

<figure><artwork><![CDATA[
name: last short good
goal in focus: 1s final (1f120d.5l50e)
added Trial Results: one trial 1 second, 0% loss
code: 60x1s0l+60x1s1l
]]></artwork></figure>

<t>Point 5:</t>

<figure><artwork><![CDATA[
name: first long bad
goal in focus: TST009 (60f120d0l50e)
added Trial Results: one trial, 60 seconds, 0.1% loss
code: 60x1s0l+60x1s1l+1x60s.1l
]]></artwork></figure>

<t>Point 6:</t>

<figure><artwork><![CDATA[
name: first long good
goal in focus: TST009 (60f120d0l50e)
added Trial Results: one trial, 60 seconds, 0% loss
code: 60x1s0l+60x1s1l+1x60s.1l+1x60s0l
]]></artwork></figure>

<t>Comments on point in time naming:</t>

<t><list style="symbols">
  <t>When a name contains &quot;short&quot;, it means the added trial
had Trial Duration of 1 second, which is Short Trial for 3 of the Search Goals,
but it is a Full-Length Trial for the &quot;1s final&quot; goal.</t>
  <t>Similarly, &quot;long&quot; in name means the added trial
had Trial Duration of 60 seconds, which is Full-Length Trial for 3 goals
but Long Trial for the &quot;1s final&quot; goal.</t>
  <t>When a name contains &quot;good&quot; it means the added trial is Low-Loss Trial
for all the goals.</t>
  <t>When a name contains &quot;short bad&quot; it means the added trial is High-Loss Trial
for all the goals.</t>
  <t>When a name contains &quot;long bad&quot;, it means the added trial
is a High-Loss Trial for goals &quot;RFC2544&quot; and &quot;TST009&quot;,
but it is a Low-Loss Trial for the two other goals.</t>
</list></t>

</section>
<section anchor="load-classification-computations"><name>Load Classification Computations</name>

<t>This section shows how Load Classification logic is applied
by listing all temporary values at the specific time point.</t>

<section anchor="point-1"><name>Point 1</name>

<t>This is the &quot;first short good&quot; point.
Code for available results is: 59x1s0l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>Short high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Short low-loss sum</c>
      <c>59s</c>
      <c>59s</c>
      <c>0s</c>
      <c>59s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>14.75s</c>
      <c>Excess sum</c>
      <c>0s</c>
      <c>-59s</c>
      <c>0s</c>
      <c>-14.75s</c>
      <c>Positive excess sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Effective high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Effective full sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>Effective whole sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>120s</c>
      <c>60s</c>
      <c>Missing sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>61s</c>
      <c>60s</c>
      <c>Pessimistic high-loss sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>61s</c>
      <c>60s</c>
      <c>Optimistic exceed ratio</c>
      <c>0%</c>
      <c>0%</c>
      <c>0%</c>
      <c>0%</c>
      <c>Pessimistic exceed ratio</c>
      <c>100%</c>
      <c>100%</c>
      <c>50.833%</c>
      <c>100%</c>
      <c>Classification Result</c>
      <c>Undecided</c>
      <c>Undecided</c>
      <c>Undecided</c>
      <c>Undecided</c>
</texttable>

<t>This is the last point in time where all goals have this load as Undecided.</t>

</section>
<section anchor="point-2"><name>Point 2</name>

<t>This is the &quot;first short bad&quot; point.
Code for available results is: 59x1s0l+1x1s1l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>1s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>Short high-loss sum</c>
      <c>1s</c>
      <c>1s</c>
      <c>0s</c>
      <c>1s</c>
      <c>Short low-loss sum</c>
      <c>59s</c>
      <c>59s</c>
      <c>0s</c>
      <c>59s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>14.75s</c>
      <c>Excess sum</c>
      <c>1s</c>
      <c>-58s</c>
      <c>0s</c>
      <c>-13.75s</c>
      <c>Positive excess sum</c>
      <c>1s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Effective high-loss sum</c>
      <c>1s</c>
      <c>0s</c>
      <c>1s</c>
      <c>0s</c>
      <c>Effective full sum</c>
      <c>1s</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Effective whole sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>120s</c>
      <c>60s</c>
      <c>Missing sum</c>
      <c>59s</c>
      <c>120s</c>
      <c>60s</c>
      <c>60s</c>
      <c>Pessimistic high-loss sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>61s</c>
      <c>60s</c>
      <c>Optimistic exceed ratio</c>
      <c>1.667%</c>
      <c>0%</c>
      <c>0.833%</c>
      <c>0%</c>
      <c>Pessimistic exceed ratio</c>
      <c>100%</c>
      <c>100%</c>
      <c>50.833%</c>
      <c>100%</c>
      <c>Classification Result</c>
      <c>Upper Bound</c>
      <c>Undecided</c>
      <c>Undecided</c>
      <c>Undecided</c>
</texttable>

<t>Due to zero Goal Loss Ratio, RFC2544 goal must have mild or strong increase
of exceed probability, so the one lossy trial would be lossy even if measured
at 60 second duration.
Due to zero exceed ratio, one High-Loss Trial is enough to preclude this Load
from becoming a Lower Bound for RFC2544. That is why this Load
is classified as an Upper Bound for RFC2544 this early.</t>

<t>This is an example how significant time can be saved, compared to 60-second trials.</t>

</section>
<section anchor="point-3"><name>Point 3</name>

<t>This is the &quot;last short bad&quot; point.
Code for available trial results is: 59x1s0l+60x1s1l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>Short high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Short low-loss sum</c>
      <c>59s</c>
      <c>59s</c>
      <c>0s</c>
      <c>59s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>59s</c>
      <c>0s</c>
      <c>14.75s</c>
      <c>Excess sum</c>
      <c>60s</c>
      <c>1s</c>
      <c>0s</c>
      <c>45.25s</c>
      <c>Positive excess sum</c>
      <c>60s</c>
      <c>1s</c>
      <c>0s</c>
      <c>45.25s</c>
      <c>Effective high-loss sum</c>
      <c>60s</c>
      <c>1s</c>
      <c>60s</c>
      <c>45.25s</c>
      <c>Effective full sum</c>
      <c>60s</c>
      <c>1s</c>
      <c>119s</c>
      <c>45.25s</c>
      <c>Effective whole sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>120s</c>
      <c>60s</c>
      <c>Missing sum</c>
      <c>0s</c>
      <c>119s</c>
      <c>1s</c>
      <c>14.75s</c>
      <c>Pessimistic high-loss sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>61s</c>
      <c>60s</c>
      <c>Optimistic exceed ratio</c>
      <c>100%</c>
      <c>0.833%</c>
      <c>50%</c>
      <c>75.417%</c>
      <c>Pessimistic exceed ratio</c>
      <c>100%</c>
      <c>100%</c>
      <c>50.833%</c>
      <c>100%</c>
      <c>Classification Result</c>
      <c>Upper Bound</c>
      <c>Undecided</c>
      <c>Undecided</c>
      <c>Upper Bound</c>
</texttable>

<t>This is the last point for &quot;1s final&quot; goal to have this Load still Undecided.
Only one 1-second trial is missing within the 120-second Goal Duration Sum,
but its result will decide the classification result.</t>

<t>The &quot;20% exceed&quot; started to classify this load as an Upper Bound
somewhere between points 2 and 3.</t>

</section>
<section anchor="point-4"><name>Point 4</name>

<t>This is the &quot;last short good&quot; point.
Code for available trial results is: 60x1s0l+60x1s1l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Short high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Short low-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>15s</c>
      <c>Excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Positive excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Effective high-loss sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>45s</c>
      <c>Effective full sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>120s</c>
      <c>45s</c>
      <c>Effective whole sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>120s</c>
      <c>60s</c>
      <c>Missing sum</c>
      <c>0s</c>
      <c>120s</c>
      <c>0s</c>
      <c>15s</c>
      <c>Pessimistic high-loss sum</c>
      <c>60s</c>
      <c>120s</c>
      <c>60s</c>
      <c>60s</c>
      <c>Optimistic exceed ratio</c>
      <c>100%</c>
      <c>0%</c>
      <c>50%</c>
      <c>75%</c>
      <c>Pessimistic exceed ratio</c>
      <c>100%</c>
      <c>100%</c>
      <c>50%</c>
      <c>100%</c>
      <c>Classification Result</c>
      <c>Upper Bound</c>
      <c>Undecided</c>
      <c>Lower Bound</c>
      <c>Upper Bound</c>
</texttable>

<t>The one missing trial for &quot;1s final&quot; was Low-Loss,
half of trial results are Low-Loss which exactly matches 50% exceed ratio.
This shows time savings are not guaranteed.</t>

</section>
<section anchor="point-5"><name>Point 5</name>

<t>This is the &quot;first long bad&quot; point.
Code for available trial results is: 60x1s0l+60x1s1l+1x60s.1l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>120s</c>
      <c>60s</c>
      <c>Short high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Short low-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>15s</c>
      <c>Excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Positive excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Effective high-loss sum</c>
      <c>120s</c>
      <c>60s</c>
      <c>60s</c>
      <c>45s</c>
      <c>Effective full sum</c>
      <c>120s</c>
      <c>60s</c>
      <c>180s</c>
      <c>105s</c>
      <c>Effective whole sum</c>
      <c>120s</c>
      <c>120s</c>
      <c>180s</c>
      <c>105s</c>
      <c>Missing sum</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Pessimistic high-loss sum</c>
      <c>120s</c>
      <c>120s</c>
      <c>60s</c>
      <c>45s</c>
      <c>Optimistic exceed ratio</c>
      <c>100%</c>
      <c>50%</c>
      <c>33.333%</c>
      <c>42.857%</c>
      <c>Pessimistic exceed ratio</c>
      <c>100%</c>
      <c>100%</c>
      <c>33.333%</c>
      <c>42.857%</c>
      <c>Classification Result</c>
      <c>Upper Bound</c>
      <c>Undecided</c>
      <c>Lower Bound</c>
      <c>Lower Bound</c>
</texttable>

<t>As designed for TST009 goal, one Full-Length High-Loss Trial can be tolerated.
120s worth of 1-second trials is not useful, as this is allowed when
Exceed Probability does not depend on Trial Duration.
As Goal Loss Ratio is zero, it is not really possible for 60-second trials
to compensate for losses seen in 1-second results.
But Load Classification logic does not have that knowledge hardcoded,
so optimistic exceed ratio is still only 50%.</t>

<t>But the 0.1% Trial Loss Ratio is lower than &quot;20% exceed&quot; Goal Loss Ratio,
so this unexpected Full-Length Low-Loss trial changed the classification result
of this Load to Lower Bound.</t>

</section>
<section anchor="point-6"><name>Point 6</name>

<t>This is the &quot;first long good&quot; point.
Code for available trial results is: 60x1s0l+60x1s1l+1x60s.1l+1x60s0l</t>

<texttable>
      <ttcol align='left'>Goal name</ttcol>
      <ttcol align='left'>RFC2544</ttcol>
      <ttcol align='left'>TST009</ttcol>
      <ttcol align='left'>1s final</ttcol>
      <ttcol align='left'>20% exceed</ttcol>
      <c>Goal code</c>
      <c>60f60d0l0e</c>
      <c>60f120d0l50e</c>
      <c>1f120d.5l50e</c>
      <c>60f60d0.5l20e</c>
      <c>Full-length high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>Full-length low-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>180s</c>
      <c>120s</c>
      <c>Short high-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Short low-loss sum</c>
      <c>60s</c>
      <c>60s</c>
      <c>0s</c>
      <c>60s</c>
      <c>Balancing sum</c>
      <c>0s</c>
      <c>60s</c>
      <c>0s</c>
      <c>15s</c>
      <c>Excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Positive excess sum</c>
      <c>60s</c>
      <c>0s</c>
      <c>0s</c>
      <c>45s</c>
      <c>Effective high-loss sum</c>
      <c>120s</c>
      <c>60s</c>
      <c>60s</c>
      <c>45s</c>
      <c>Effective full sum</c>
      <c>180s</c>
      <c>120s</c>
      <c>240s</c>
      <c>165s</c>
      <c>Effective whole sum</c>
      <c>180s</c>
      <c>120s</c>
      <c>240s</c>
      <c>165s</c>
      <c>Missing sum</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>0s</c>
      <c>Pessimistic high-loss sum</c>
      <c>120s</c>
      <c>60s</c>
      <c>60s</c>
      <c>45s</c>
      <c>Optimistic exceed ratio</c>
      <c>66.667%</c>
      <c>50%</c>
      <c>25%</c>
      <c>27.273%</c>
      <c>Pessimistic exceed ratio</c>
      <c>66.667%</c>
      <c>50%</c>
      <c>25%</c>
      <c>27.273%</c>
      <c>Classification Result</c>
      <c>Upper Bound</c>
      <c>Lower Bound</c>
      <c>Lower Bound</c>
      <c>Lower Bound</c>
</texttable>

<t>This is the Low-Loss Trial the &quot;TST009&quot; goal was waiting for.
This Load is now classified for all goals, the search may end.
Or, more realistically, it can focus on larger load only,
as the three goals will want an Upper Bound (unless this Load is Max Load).</t>

</section>
</section>
<section anchor="conditional-throughput-computations"><name>Conditional Throughput Computations</name>

<t>At the end of the hypothetical search, &quot;RFC2544&quot; goal has this load
classified as an Upper Bound, so it is not eligible for Conditional Throughput
calculations. But the remaining three goals calssify this Load as a Lower Bound,
and if we assume it has also became the Relevant Lower Bound,
we can compute Conditional Throughput values for all three goals.</t>

<t>As a reminder, the Load value is one million frames per second.</t>

<section anchor="goal-2"><name>Goal 2</name>

<t>The Conditional Throughput is computed from sorted list
of Full-Length Trial results. As TST009 Goal Final Trial Duration is 60 seconds,
only two of 122 Trials are considered Full-Length Trials.
One has Trial Loss Ratio of 0%, the other of 0.1%.</t>

<t><list style="symbols">
  <t>Full-length high-loss sum is 60 seconds.</t>
  <t>Full-length low-loss sum is 60 seconds.</t>
  <t>Full-length is 120 seconds.</t>
  <t>Subceed ratio is 50%.</t>
  <t>Remaining sum initially is 0.5x12s = 60 seconds.</t>
  <t>Current loss ratio initially is 100%.</t>
  <t>For first result (duration 60s, loss 0%):
  <list style="symbols">
      <t>Remaining sum is larger than zero, not exiting the loop.</t>
      <t>Set current loss ratio to this trial&#39;s Trial Loss Ratio which is 0%.</t>
      <t>Decrease the remaining sum by this trial&#39;s Trial Effective Duration.</t>
      <t>New remaining sum is 60s - 60s = 0s.</t>
    </list></t>
  <t>For second result (duration 60s, loss 0.1%):</t>
  <t>Remaining sum is not larger than zero, exiting the loop.</t>
  <t>Current forwarding ratio was most recently set to 0%.</t>
  <t>Current forwarding ratio is one minus the current loss ratio, so 100%.</t>
  <t>Conditional Throughput is the current forwarding ratio multiplied by the Load value.</t>
  <t>Conditional Throughput is one million frames per second.</t>
</list></t>

</section>
<section anchor="goal-3"><name>Goal 3</name>

<t>The &quot;1s final&quot; has Goal Final Trial Duration of 1 second,
so all 122 Trial Results are considered Full-Length Trials.
They are ordered like this:</t>

<figure><artwork><![CDATA[
60 1-second 0% loss trials,
1 60-second 0% loss trial,
1 60-second 0.1% loss trial,
60 1-second 1% loss trials.
]]></artwork></figure>

<t>The result does not depend on the order of 0% loss trials.</t>

<t><list style="symbols">
  <t>Full-length high-loss sum is 60 seconds.</t>
  <t>Full-length low-loss sum is 180 seconds.</t>
  <t>Full-length is 240 seconds.</t>
  <t>Subceed ratio is 50%.</t>
  <t>Remaining sum initially is 0.5x240s = 120 seconds.</t>
  <t>Current loss ratio initially is 100%.</t>
  <t>For first 61 results (duration varies, loss 0%):
  <list style="symbols">
      <t>Remaining sum is larger than zero, not exiting the loop.</t>
      <t>Set current loss ratio to this trial&#39;s Trial Loss Ratio which is 0%.</t>
      <t>Decrease the remaining sum by this trial&#39;s Trial Effective Duration.</t>
      <t>New remaining sum varies.</t>
    </list></t>
  <t>After 61 trials, we have subtracted 60x1s + 1x60s from 120s, remaining 0s.</t>
  <t>For 62-th result (duration 60s, loss 0.1%):
  <list style="symbols">
      <t>Remaining sum is not larger than zero, exiting the loop.</t>
    </list></t>
  <t>Current forwarding ratio was most recently set to 0%.</t>
  <t>Current forwarding ratio is one minus the current loss ratio, so 100%.</t>
  <t>Conditional Throughput is the current forwarding ratio multiplied by the Load value.</t>
  <t>Conditional Throughput is one million frames per second.</t>
</list></t>

</section>
<section anchor="goal-4"><name>Goal 4</name>

<t>The Conditional Throughput is computed from sorted list
of Full-Length Trial results. As &quot;20% exceed&quot; Goal Final Trial Duration
is 60 seconds, only two of 122 Trials are considered Full-Length Trials.
One has Trial Loss Ratio of 0%, the other of 0.1%.</t>

<t><list style="symbols">
  <t>Full-length high-loss sum is 60 seconds.</t>
  <t>Full-length low-loss sum is 60 seconds.</t>
  <t>Full-length is 120 seconds.</t>
  <t>Subceed ratio is 80%.</t>
  <t>Remaining sum initially is 0.8x120s = 96 seconds.</t>
  <t>Current loss ratio initially is 100%.</t>
  <t>For first result (duration 60s, loss 0%):
  <list style="symbols">
      <t>Remaining sum is larger than zero, not exiting the loop.</t>
      <t>Set current loss ratio to this trial&#39;s Trial Loss Ratio which is 0%.</t>
      <t>Decrease the remaining sum by this trial&#39;s Trial Effective Duration.</t>
      <t>New remaining sum is 96s - 60s = 36s.</t>
    </list></t>
  <t>For second result (duration 60s, loss 0.1%):
  <list style="symbols">
      <t>Remaining sum is larger than zero, not exiting the loop.</t>
      <t>Set current loss ratio to this trial&#39;s Trial Loss Ratio which is 0.1%.</t>
      <t>Decrease the remaining sum by this trial&#39;s Trial Effective Duration.</t>
      <t>New remaining sum is 36s - 60s = -24s.</t>
    </list></t>
  <t>No more trials (and also remaining sum is not larger than zero), exiting loop.</t>
  <t>Current forwarding ratio was most recently set to 0.1%.</t>
  <t>Current forwarding ratio is one minus the current loss ratio, so 99.9%.</t>
  <t>Conditional Throughput is the current forwarding ratio multiplied by the Load value.</t>
  <t>Conditional Throughput is 999 thousand frames per second.</t>
</list></t>

<t>Due to stricter Goal Exceed Ratio, this Conditional Throughput
is smaller than Conditional Throughput of the other two goals.</t>

</section>
</section>
</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>No requests of IANA.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>Benchmarking activities as described in this memo are limited to
technology characterization of a DUT/SUT using controlled stimuli in a
laboratory environment, with dedicated address space and the constraints
specified in the sections above.</t>

<t>The benchmarking network topology will be an independent test setup and
MUST NOT be connected to devices that may forward the test traffic into
a production network or misroute traffic to the test management network.</t>

<t>Further, benchmarking is performed on a &quot;black-box&quot; basis, relying
solely on measurements observable external to the DUT/SUT.</t>

<t>Special capabilities SHOULD NOT exist in the DUT/SUT specifically for
benchmarking purposes. Any implications for network security arising
from the DUT/SUT SHOULD be identical in the lab and in production
networks.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Special wholehearted gratitude and thanks to the late Al Morton for his
thorough reviews filled with very specific feedback and constructive
guidelines. Thank You Al for the close collaboration over the years, Your Mentorship,
Your continuous unwavering encouragement full of empathy and energizing
positive attitude. Al, You are dearly missed.</t>

<t>Thanks to Gabor Lencse, Giuseppe Fioccola and BMWG contributors for good
discussions and thorough reviews, guiding and helping us to improve the
clarity and formality of this document.</t>

<t>Many thanks to Alec Hothan of the OPNFV NFVbench project for a thorough
review and numerous useful comments and suggestions in the earlier
versions of this document.</t>

</section>
<section anchor="appendix-a-load-classification"><name>Appendix A: Load Classification</name>

<t>This section specifies how to perform the Load Classification.</t>

<t>Any Trial Load value can be classified,
according to a given <xref target="search-goal">Search Goal</xref> instance.</t>

<t>The algorithm uses (some subsets of) the set of all available Trial Results
from Trials measured at a given Load at the end of the Search.</t>

<t>The block at the end of this appendix holds pseudocode
which computes two values, stored in variables named
<spanx style="verb">optimistic_is_lower</spanx> and <spanx style="verb">pessimistic_is_lower</spanx>.</t>

<t>The pseudocode happens to be valid Python code.</t>

<t>If values of both variables are computed to be true, the Load in question
is classified as a Lower Bound according to the given Search Goal instance.
If values of both variables are false, the Load is classified as an Upper Bound.
Otherwise, the load is classified as Undecided.</t>

<t>The pseudocode expects the following variables to hold the following values:</t>

<t><list style="symbols">
  <t><spanx style="verb">goal_duration_sum</spanx>: The Goal Duration Sum value of the given Search Goal.</t>
  <t><spanx style="verb">goal_exceed_ratio</spanx>: The Goal Exceed Ratio value of the given Search Goal.</t>
  <t><spanx style="verb">full_length_low_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration at least equal to the Goal Final Trial Dduration
and with Trial Loss Ratio not higher than the Goal Loss Ratio
(across Full-Length Low-Loss Trials).</t>
  <t><spanx style="verb">full_length_high_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration at least equal to the Goal Final Trial Duration
and with Trial Loss Ratio higher than the Goal Loss Ratio
(across Full-Length High-Loss Trials).</t>
  <t><spanx style="verb">short_low_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration shorter than the Goal Final Trial Duration
and with Trial Loss Ratio not higher than the Goal Loss Ratio
(across Short Low-Loss Trials).</t>
  <t><spanx style="verb">short_high_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration shorter than the Goal Final Trial Duration
and with Trial Loss Ratio higher than the Goal Loss Ratio
(across Short High-Loss Trials).</t>
</list></t>

<t>The code works correctly also when there are no Trial Results at a given Load.</t>

<figure><sourcecode type="python"><![CDATA[
exceed_coefficient = goal_exceed_ratio / (1.0 - goal_exceed_ratio)
balancing_sum = short_low_loss_sum * exceed_coefficient
positive_excess_sum = max(0.0, short_high_loss_sum - balancing_sum)
effective_high_loss_sum = full_length_high_loss_sum + positive_excess_sum
effective_full_length_sum = full_length_low_loss_sum + effective_high_loss_sum
effective_whole_sum = max(effective_full_length_sum, goal_duration_sum)
quantile_duration_sum = effective_whole_sum * goal_exceed_ratio
pessimistic_high_loss_sum = effective_whole_sum - full_length_low_loss_sum
pessimistic_is_lower = pessimistic_high_loss_sum <= quantile_duration_sum
optimistic_is_lower = effective_high_loss_sum <= quantile_duration_sum
]]></sourcecode></figure>

</section>
<section anchor="appendix-b-conditional-throughput"><name>Appendix B: Conditional Throughput</name>

<t>This section specifies how to compute Conditional Throughput,
as referred to in section <xref target="conditional-throughput">Conditional Throughput</xref>.</t>

<t>Any Load value can be used as the basis for the following computation,
but only the Relevant Lower Bound (at the end of the Search)
leads to the value called the Conditional Throughput for a given Search Goal.</t>

<t>The algorithm uses (some subsets of) the set of all available Trial Results
from Trials measured at a given Load at the end of the Search.</t>

<t>The block at the end of this appendix holds pseudocode
which computes a value stored as variable <spanx style="verb">conditional_throughput</spanx>.</t>

<t>The pseudocode happens to be valid Python code.</t>

<t>The pseudocode expects the following variables to hold the following values:</t>

<t><list style="symbols">
  <t><spanx style="verb">goal_duration_sum</spanx>: The Goal Duration Sum value of the given Search Goal.</t>
  <t><spanx style="verb">goal_exceed_ratio</spanx>: The Goal Exceed Ratio value of the given Search Goal.</t>
  <t><spanx style="verb">full_length_low_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration at least equal to the Goal Final Trial Dduration
and with Trial Loss Ratio not higher than the Goal Loss Ratio
(across Full-Length Low-Loss Trials).</t>
  <t><spanx style="verb">full_length_high_loss_sum</spanx>: Sum of Trial Effective Durations across Trials
with Trial Duration at least equal to the Goal Final Trial Duration
and with Trial Loss Ratio higher than the Goal Loss Ratio
(across Full-Length High-Loss Trials).</t>
  <t><spanx style="verb">full_length_trials</spanx>: An iterable of all Trial Results from Trials
with Trial Duration at least equal to the Goal Final Trial Duration
(all Full-Length Trials), sorted by increasing Trial Loss Ratio.
One item <spanx style="verb">trial</spanx> is a composite with the following two attributes available:  <list style="symbols">
      <t><spanx style="verb">trial.loss_ratio</spanx>: The Trial Loss Ratio as measured for this Trial.</t>
      <t><spanx style="verb">trial.effective_duration</spanx>: The Trial Effective Duration of this Trial.</t>
    </list></t>
</list></t>

<t>The code works correctly only when there if there is at least one
Trial Tesult measured at the given Load.</t>

<figure><sourcecode type="python"><![CDATA[
full_length_sum = full_length_low_loss_sum + full_length_high_loss_sum
whole_sum = max(goal_duration_sum, full_length_sum)
remaining = whole_sum * (1.0 - goal_exceed_ratio)
quantile_loss_ratio = None
for trial in full_length_trials:
    if quantile_loss_ratio is None or remaining > 0.0:
        quantile_loss_ratio = trial.loss_ratio
        remaining -= trial.effective_duration
    else:
        break
else:
    if remaining > 0.0:
        quantile_loss_ratio = 1.0
conditional_throughput = intended_load * (1.0 - quantile_loss_ratio)
]]></sourcecode></figure>

</section>
<section anchor="index"><name>Index</name>


<t><list style="symbols">
  <t>Bound: Lower Bound or Upper Bound.</t>
  <t>Bounds: Lower Bound and Upper Bound.</t>
  <t>Conditional Throughput: defined in <xref target="conditional-throughput">Conditional Throughput</xref>, discussed in <xref target="generalized-throughput">Generalized Throughput</xref>.</t>
  <t>Controller: introduced in <xref target="overview">Overview </xref>, defined in <xref target="controller">Controller </xref>.</t>
  <t>Controller Input: defined in <xref target="controller-input">Controller Input</xref>.</t>
  <t>Controller Output: defined in <xref target="controller-output">Controller Output</xref>.</t>
  <t>Full-Length Trial: defined in <xref target="full-length-trial">Full-Length Trial</xref>.</t>
  <t>Goal Duration Sum: defined in <xref target="goal-duration-sum">Goal Duration Sum</xref>, discussed in <xref target="exceed-ratio-and-multiple-trials">Exceed Ratio and Multiple Trials</xref>.</t>
  <t>Goal Exceed Ratio: defined in <xref target="goal-exceed-ratio">Goal Exceed Ratio</xref>, discussed in <xref target="exceed-ratio-and-multiple-trials">Exceed Ratio and Multiple Trials</xref>.</t>
  <t>Goal Final Trial Duration: defined in <xref target="goal-final-trial-duration">Goal Final Trial Duration</xref>.</t>
  <t>Goal Initial Trial Duration: defined in <xref target="goal-initial-trial-duration">Goal Initial Trial Duration</xref>.</t>
  <t>Goal Loss Ratio: defined in <xref target="goal-loss-ratio">Goal Loss Ratio</xref>.</t>
  <t>Goal Result: defined in <xref target="goal-result">Goal Result</xref>.</t>
  <t>Goal Width: defined in <xref target="goal-width">Goal Width</xref>.</t>
  <t>Exceed Probability: defined in <xref target="exceed-probability">Exceed Probability</xref></t>
  <t>High-Loss Trial: defined in <xref target="high-loss-trial">High-Loss Trial</xref>.</t>
  <t>Intended Load: defined in <xref target="RFC2285"></xref> (Section 3.5.1).</t>
  <t>Irregular Goal Result: defined in <xref target="irregular-goal-result">Irregular Goal Result</xref>.</t>
  <t>Load: introduced in <xref target="trial-load">Trial Load</xref>.</t>
  <t>Load Classification: Introduced in <xref target="overview">Overview </xref>, defined in <xref target="load-classification">Load Classification</xref>, discussed in <xref target="load-classification-logic">Load Classification Logic</xref>.</t>
  <t>Loss Inversion: Situation introduced in <xref target="inconsistent-trial-results">Inconsistent Trial Results</xref>, defined in <xref target="loss-ratios-and-loss-inversion">Loss Ratios and Loss Inversion</xref>.</t>
  <t>Low-Loss Trial: defined in <xref target="low-loss-trial">Low-Loss Trial</xref>.</t>
  <t>Lower Bound: defined in <xref target="lower-bound">Lower Bound</xref>.</t>
  <t>Manager: introduced in <xref target="overview">Overview </xref>, defined in <xref target="manager">Manager </xref>.</t>
  <t>Max Load: defined in <xref target="max-load">Max Load</xref>.</t>
  <t>Measurer: introduced in <xref target="overview">Overview </xref>, defined in <xref target="measurer">Meaurer </xref>.</t>
  <t>Min Load: defined in <xref target="min-load">Min Load</xref>.</t>
  <t>MLRsearch Specification: introduced in <xref target="purpose-and-scope">Purpose and Scope</xref>
and in <xref target="overview">Overview </xref>, defined in <xref target="test-procedure-compliant-with-mlrsearch">Test Procedure Compliant with MLRsearch</xref>.</t>
  <t>MLRsearch Implementation: defined in <xref target="test-procedure-compliant-with-mlrsearch">Test Procedure Compliant with MLRsearch</xref>.</t>
  <t>Offered Load: defined in <xref target="RFC2285"></xref> (Section 3.5.2).</t>
  <t>Regular Goal Result: defined in <xref target="regular-goal-result">Regular Goal Result</xref>.</t>
  <t>Relevant Bound: Relevant Lower Bound or Relevant Upper Bound.</t>
  <t>Relevant Bounds: Relevant Lower Bound and Relevant Upper Bound.</t>
  <t>Relevant Lower Bound: defined in <xref target="relevant-lower-bound">Relevant Lower Bound</xref>, discussed in <xref target="conservativeness-and-relevant-bounds">Conservativeness and Relevant Bounds</xref>.</t>
  <t>Relevant Upper Bound: defined in <xref target="relevant-upper-bound">Relevant Upper Bound</xref>.</t>
  <t>Search: defined in <xref target="overview">Overview </xref>.</t>
  <t>Search Duration: introduced in <xref target="purpose-and-scope">Purpose and Scope</xref> and in <xref target="long-search-duration">Long Search Duration</xref>, discussed in <xref target="stopping-conditions-and-precision">Stopping Conditions and Precision</xref>.</t>
  <t>Search Goal: defined in <xref target="search-goal">Search Goal</xref>.</t>
  <t>Search Result: defined in <xref target="search-result">Search Result</xref>.</t>
  <t>Short Trial: defined in <xref target="short-trial">Short Trial</xref>.</t>
  <t>Throughput: defined in <xref target="RFC1242"></xref> (Section 3.17), Methodology specified in <xref target="RFC2544"></xref> (Section 26.1).</t>
  <t>Trial: defined in <xref target="trial">Trial </xref>.</t>
  <t>Trial Duration: defined in <xref target="trial-duration">Trial Duration</xref>.</t>
  <t>Trial Effective Duration: defined in <xref target="trial-effective-duration">Trial Effective Duration</xref>.</t>
  <t>Trial Forwarding Rate: defined in <xref target="trial-forwarding-rate">Trial Forwarding Rate</xref>.</t>
  <t>Trial Forwarding Ratio: defined in <xref target="trial-forwarding-ratio">Trial Forwarding Ratio</xref>.</t>
  <t>Trial Input: defined in <xref target="trial-input">Trial Input</xref>.</t>
  <t>Trial Loss Ratio: defined in <xref target="trial-loss-ratio">Trial Loss Ratio</xref>.</t>
  <t>Trial Load: defined in <xref target="trial-load">Trial Load</xref>.</t>
  <t>Trial Output: defined in <xref target="trial-output">Trial Output</xref>.</t>
  <t>Trial Result: defined in <xref target="trial-result">Trial Result</xref>.</t>
  <t>Undecided: defined in <xref target="undecided">Undecided </xref>.</t>
  <t>Upper Bound: defined in <xref target="upper-bound">Upper Bound</xref>.</t>
</list></t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC1242;
&RFC2285;
&RFC2544;
&RFC5180;
&RFC8219;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC6349;
<reference anchor="TST009" target="https://www.etsi.org/deliver/etsi_gs/NFV-TST/001_099/009/03.04.01_60/gs_NFV-TST009v030401p.pdf">
  <front>
    <title>TST 009</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="FDio-CSIT-MLRsearch" target="https://csit.fd.io/cdocs/methodology/measurements/data_plane_throughput/mlr_search/">
  <front>
    <title>FD.io CSIT Test Methodology - MLRsearch</title>
    <author >
      <organization></organization>
    </author>
    <date year="2023" month="October"/>
  </front>
</reference>
<reference anchor="PyPI-MLRsearch" target="https://pypi.org/project/MLRsearch/1.2.1/">
  <front>
    <title>MLRsearch 1.2.1, Python Package Index</title>
    <author >
      <organization></organization>
    </author>
    <date year="2023" month="October"/>
  </front>
</reference>
<reference anchor="Lencze-Shima" target="https://datatracker.ietf.org/doc/html/draft-lencse-bmwg-rfc2544-bis-00">
  <front>
    <title>An Upgrade to Benchmarking Methodology for Network Interconnect Devices</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="Lencze-Kovacs-Shima" target="http://dx.doi.org/10.11601/ijates.v9i2.288">
  <front>
    <title>Gaming with the Throughput and the Latency Benchmarking Measurement Procedures of RFC 2544</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="Ott-Mathis-Semke-Mahdavi" target="https://www.cs.cornell.edu/people/egs/cornellonly/syslunch/fall02/ott.pdf">
  <front>
    <title>The Macroscopic Behavior of the TCP Congestion Avoidance Algorithm</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 2817?>




  </back>

<!-- ##markdown-source:
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

-->

</rfc>

