Skip to main content

quantrs2_sim/advanced_variational_algorithms/
finitedifferencegradient_traits.rs

1//! # FiniteDifferenceGradient - Trait Implementations
2//!
3//! This module contains trait implementations for `FiniteDifferenceGradient`.
4//!
5//! ## Implemented Traits
6//!
7//! - `GradientCalculator`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use 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(&params_plus, circuit)?;
32            let cost_minus = cost_function.evaluate(&params_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}