• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_CONGESTION_CONTROLLER_PCC_UTILITY_FUNCTION_H_
12 #define MODULES_CONGESTION_CONTROLLER_PCC_UTILITY_FUNCTION_H_
13 
14 #include "modules/congestion_controller/pcc/monitor_interval.h"
15 
16 namespace webrtc {
17 namespace pcc {
18 
19 // Utility function is used by PCC to transform the performance statistics
20 // (sending rate, loss rate, packets latency) gathered at one monitor interval
21 // into a numerical value.
22 // https://www.usenix.org/conference/nsdi18/presentation/dong
23 class PccUtilityFunctionInterface {
24  public:
25   virtual double Compute(const PccMonitorInterval& monitor_interval) const = 0;
26   virtual ~PccUtilityFunctionInterface() = default;
27 };
28 
29 // Vivace utility function were suggested in the paper "PCC Vivace:
30 // Online-Learning Congestion Control", Mo Dong et all.
31 class VivaceUtilityFunction : public PccUtilityFunctionInterface {
32  public:
33   VivaceUtilityFunction(double delay_gradient_coefficient,
34                         double loss_coefficient,
35                         double throughput_coefficient,
36                         double throughput_power,
37                         double delay_gradient_threshold,
38                         double delay_gradient_negative_bound);
39   double Compute(const PccMonitorInterval& monitor_interval) const override;
40   ~VivaceUtilityFunction() override;
41 
42  private:
43   const double delay_gradient_coefficient_;
44   const double loss_coefficient_;
45   const double throughput_power_;
46   const double throughput_coefficient_;
47   const double delay_gradient_threshold_;
48   const double delay_gradient_negative_bound_;
49 };
50 
51 // This utility function were obtained by tuning Vivace utility function.
52 // The main difference is that gradient of modified utilify funtion (as well as
53 // rate updates) scales proportionally to the sending rate which leads to
54 // better performance in case of single sender.
55 class ModifiedVivaceUtilityFunction : public PccUtilityFunctionInterface {
56  public:
57   ModifiedVivaceUtilityFunction(double delay_gradient_coefficient,
58                                 double loss_coefficient,
59                                 double throughput_coefficient,
60                                 double throughput_power,
61                                 double delay_gradient_threshold,
62                                 double delay_gradient_negative_bound);
63   double Compute(const PccMonitorInterval& monitor_interval) const override;
64   ~ModifiedVivaceUtilityFunction() override;
65 
66  private:
67   const double delay_gradient_coefficient_;
68   const double loss_coefficient_;
69   const double throughput_power_;
70   const double throughput_coefficient_;
71   const double delay_gradient_threshold_;
72   const double delay_gradient_negative_bound_;
73 };
74 
75 }  // namespace pcc
76 }  // namespace webrtc
77 
78 #endif  // MODULES_CONGESTION_CONTROLLER_PCC_UTILITY_FUNCTION_H_
79