quantrs2_sim/advanced_variational_algorithms/
finitedifferencegradient_traits.rs1use crate::circuit_interfaces::{InterfaceCircuit, InterfaceGate, InterfaceGateType};
12use crate::error::{Result, SimulatorError};
13use scirs2_core::random::prelude::*;
14
15use super::functions::{CostFunction, GradientCalculator};
16use super::types::FiniteDifferenceGradient;
17
18impl GradientCalculator for FiniteDifferenceGradient {
19 fn calculate_gradient(
20 &self,
21 parameters: &[f64],
22 cost_function: &dyn CostFunction,
23 circuit: &InterfaceCircuit,
24 ) -> Result<Vec<f64>> {
25 let mut gradient = Vec::with_capacity(parameters.len());
26 for i in 0..parameters.len() {
27 let mut params_plus = parameters.to_vec();
28 let mut params_minus = parameters.to_vec();
29 params_plus[i] += self.epsilon;
30 params_minus[i] -= self.epsilon;
31 let cost_plus = cost_function.evaluate(¶ms_plus, circuit)?;
32 let cost_minus = cost_function.evaluate(¶ms_minus, circuit)?;
33 let grad = (cost_plus - cost_minus) / (2.0 * self.epsilon);
34 gradient.push(grad);
35 }
36 Ok(gradient)
37 }
38 fn method_name(&self) -> &'static str {
39 "FiniteDifference"
40 }
41}