aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py')
-rw-r--r--resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py35
1 files changed, 25 insertions, 10 deletions
diff --git a/resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py b/resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py
index c732e66026..c52934530e 100644
--- a/resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py
+++ b/resources/libraries/python/MLRsearch/ReceiveRateMeasurement.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2020 Cisco and/or its affiliates.
+# Copyright (c) 2021 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
@@ -19,7 +19,8 @@ class ReceiveRateMeasurement:
def __init__(
self, duration, target_tr, transmit_count, loss_count,
- approximated_duration=0.0, partial_transmit_count=0):
+ approximated_duration=0.0, partial_transmit_count=0,
+ effective_loss_ratio=None):
"""Constructor, normalize primary and compute secondary quantities.
If approximated_duration is nonzero, it is stored.
@@ -27,7 +28,7 @@ class ReceiveRateMeasurement:
Either way, additional secondary quantities are computed
from the store value.
- If there is zero transmit_count, fractions are set to zero.
+ If there is zero transmit_count, ratios are set to zero.
In some cases, traffic generator does not attempt all the needed
transactions. In that case, nonzero partial_transmit_count
@@ -36,6 +37,14 @@ class ReceiveRateMeasurement:
TODO: Use None instead of zero?
+ Field effective_loss_ratio is specific for use in MLRsearch,
+ where measurements with lower loss ratio at higher target_tr
+ cannot be relied upon if there is a measurement with higher loss ratio
+ at lower target_tr. In this case, the higher loss ratio from
+ other measurement is stored as effective loss ratio in this measurement.
+ If None, the computed loss ratio of this measurement is used.
+ If not None, the computed ratio can still be apllied if it is larger.
+
:param duration: Measurement duration [s].
:param target_tr: Target transmit rate [pps].
If bidirectional traffic is measured, this is bidirectional rate.
@@ -44,6 +53,7 @@ class ReceiveRateMeasurement:
:param approximated_duration: Estimate of the actual time of the trial.
:param partial_transmit_count: Estimate count of actually attempted
transactions.
+ :param effective_loss_ratio: None or highest loss ratio so far.
:type duration: float
:type target_tr: float
:type transmit_count: int
@@ -59,11 +69,15 @@ class ReceiveRateMeasurement:
self.transmit_rate = transmit_count / self.duration
self.loss_rate = loss_count / self.duration
self.receive_rate = self.receive_count / self.duration
- self.loss_fraction = (
+ self.loss_ratio = (
float(self.loss_count) / self.transmit_count
if self.transmit_count > 0 else 1.0
)
- self.receive_fraction = (
+ self.effective_loss_ratio = self.loss_ratio
+ if effective_loss_ratio is not None:
+ if effective_loss_ratio > self.loss_ratio:
+ self.effective_loss_ratio = float(effective_loss_ratio)
+ self.receive_ratio = (
float(self.receive_count) / self.transmit_count
if self.transmit_count > 0 else 0.0
)
@@ -81,12 +95,12 @@ class ReceiveRateMeasurement:
int(partial_transmit_count) if partial_transmit_count
else self.transmit_count
)
- self.partial_receive_fraction = (
+ self.partial_receive_ratio = (
float(self.receive_count) / self.partial_transmit_count
if self.partial_transmit_count > 0 else 0.0
)
self.partial_receive_rate = (
- self.target_tr * self.partial_receive_fraction
+ self.target_tr * self.partial_receive_ratio
)
# We use relative packet ratios in order to support cases
# where target_tr is in transactions per second,
@@ -96,9 +110,9 @@ class ReceiveRateMeasurement:
)
def __str__(self):
- """Return string reporting input and loss fraction."""
+ """Return string reporting input and loss ratio."""
return f"d={self.duration!s},Tr={self.target_tr!s}," \
- f"Df={self.loss_fraction!s}"
+ f"Df={self.loss_ratio!s}"
def __repr__(self):
"""Return string evaluable as a constructor call."""
@@ -107,4 +121,5 @@ class ReceiveRateMeasurement:
f"transmit_count={self.transmit_count!r}," \
f"loss_count={self.loss_count!r}," \
f"approximated_duration={self.approximated_duration!r}," \
- f"partial_transmit_count={self.partial_transmit_count!r})"
+ f"partial_transmit_count={self.partial_transmit_count!r}," \
+ f"effective_loss_ratio={self.effective_loss_ratio!r})"