From 8fe69a9224071efea10e8fa6c1c76c807f6925e3 Mon Sep 17 00:00:00 2001 From: Theo Butler Date: Wed, 29 Nov 2023 09:21:09 -0500 Subject: [PATCH] fix(budget): reduce windup --- graph-gateway/src/budgets.rs | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/graph-gateway/src/budgets.rs b/graph-gateway/src/budgets.rs index e0a52a9b9..bf21d2af0 100644 --- a/graph-gateway/src/budgets.rs +++ b/graph-gateway/src/budgets.rs @@ -97,13 +97,11 @@ struct Controller { impl Controller { fn new(target_query_fees: USD) -> Self { - let mut error_history = FastDecayBuffer::default(); - *error_history.current_mut() = target_query_fees.0.into(); Self { target_query_fees, recent_fees: USD(UDecimal18::from(0)), recent_query_count: 0, - error_history, + error_history: FastDecayBuffer::default(), } } @@ -123,12 +121,12 @@ impl Controller { self.recent_query_count = 0; self.error_history.decay(); let error = f64::from(self.target_query_fees.0) - process_variable; - *self.error_history.current_mut() = error; + *self.error_history.current_mut() += error; let i: f64 = self.error_history.frames().iter().sum(); - let k_i = 1.2; - let correction = UDecimal18::try_from(i * k_i).unwrap_or_default(); - self.target_query_fees.0 + correction + let k_i = 30e3; + self.target_query_fees.0 + * (UDecimal18::from(1) + UDecimal18::try_from(i * k_i).unwrap_or_default()) } } @@ -147,7 +145,7 @@ mod tests { ) { let setpoint: f64 = controller.target_query_fees.0.into(); let mut process_variable = 0.0; - for i in 0..20 { + for i in 0..60 { let control_variable: f64 = controller.control_variable().into(); process_variable = control_variable * process_variable_multiplier; println!( @@ -159,19 +157,20 @@ mod tests { assert_within(process_variable, setpoint, tolerance); } + let tolerance = 1.0e-6; for setpoint in [10e-6, 20e-6, 50e-6] { let setpoint = USD(UDecimal18::try_from(setpoint).unwrap()); let mut controller = Controller::new(setpoint); - test_controller(&mut controller, 0.2, 1e-6); + test_controller(&mut controller, 0.2, tolerance); let mut controller = Controller::new(setpoint); - test_controller(&mut controller, 0.6, 1e-6); + test_controller(&mut controller, 0.6, tolerance); let mut controller = Controller::new(setpoint); - test_controller(&mut controller, 0.8, 1e-6); + test_controller(&mut controller, 0.8, tolerance); let mut controller = Controller::new(setpoint); - test_controller(&mut controller, 0.2, 1e-6); - test_controller(&mut controller, 0.6, 1e-6); - test_controller(&mut controller, 0.7, 1e-6); + test_controller(&mut controller, 0.2, tolerance); + test_controller(&mut controller, 0.6, tolerance); + test_controller(&mut controller, 0.7, tolerance); } } }