<!--
{
  "availability" : [
    "iOS: 14.0.0 - 18.0.0",
    "iPadOS: 14.0.0 - 18.0.0",
    "macCatalyst: 14.0.0 - 18.0.0",
    "macOS: 11.0.0 - 15.0.0",
    "tvOS: 14.0.0 - 18.0.0",
    "visionOS: 1.0.0 - 2.0.0",
    "watchOS: 7.0.0 - 11.0.0"
  ],
  "documentType" : "symbol",
  "framework" : "Accelerate",
  "identifier" : "/documentation/Accelerate/BNNSOptimizerStep(_:_:_:_:_:_:_:)",
  "metadataVersion" : "0.1.0",
  "role" : "Function",
  "symbol" : {
    "kind" : "Function",
    "modules" : [
      "Accelerate"
    ],
    "preciseIdentifier" : "c:@F@BNNSOptimizerStep"
  },
  "title" : "BNNSOptimizerStep(_:_:_:_:_:_:_:)"
}
-->

# BNNSOptimizerStep(_:_:_:_:_:_:_:)

Applies a single optimization step to one or more parameters.

```
func BNNSOptimizerStep(_ function: BNNSOptimizerFunction, _ OptimizerAlgFields: UnsafeRawPointer, _ number_of_parameters: Int, _ parameters: UnsafeMutablePointer<UnsafeMutablePointer<BNNSNDArrayDescriptor>>, _ gradients: UnsafeMutablePointer<UnsafePointer<BNNSNDArrayDescriptor>>, _ accumulators: UnsafeMutablePointer<UnsafeMutablePointer<BNNSNDArrayDescriptor>?>?, _ filter_params: UnsafePointer<BNNSFilterParameters>?) -> Int32
```

## Parameters

`function`

The optimization algorithm.

`OptimizerAlgFields`

A pointer to parameters for optimization function.

`number_of_parameters`

The number of parameters the step updates.

`parameters`

An array of pointers to parameter descriptors.

`gradients`

An array of pointers to gradient descriptors.

`accumulators`

An array of pointers to accumulator descriptors.

`filter_params`

The filter runtime parameters.

## Discussion

Use [`BNNSOptimizerStep(_:_:_:_:_:_:_:)`](/documentation/Accelerate/BNNSOptimizerStep(_:_:_:_:_:_:_:)) to update a set of parameters using a supplied optimization algorithm.

> Important:
> Parameter, gradient, and accumulator descriptors must have the same sizes and strides and be of type `float`.

For example, the following shows the code required to update the weights data described by `weightsDescriptor` using an Adam optimizer.

```swift
var weightsDescriptor: BNNSNDArrayDescriptor = ...
var deltaDescriptor: BNNSNDArrayDescriptor = ...
var accumulatorOneDescriptor: BNNSNDArrayDescriptor = ...
var accumulatorTwoDescriptor: BNNSNDArrayDescriptor = ...
var adamFields: BNNSOptimizerAdamFields = ...

withUnsafeMutablePointer(to: &weightsDescriptor) { weightsDescriptorPtr in
    withUnsafePointer(to: &deltaDescriptor) { deltaDescriptorPtr in
        withUnsafeMutablePointer(to: &accumulatorOneDescriptor) { accumulatorOneDescriptorPtr in
            withUnsafeMutablePointer(to: &accumulatorTwoDescriptor) { accumulatorTwoDescriptorPtr in
                
                var paramaters = [ weightsDescriptorPtr ]
                var gradients = [ deltaDescriptorPtr ]
                var accumulators = [ Optional(accumulatorOneDescriptorPtr),
                                     Optional(accumulatorTwoDescriptorPtr) ]
                
                let error = withUnsafePointer(to: &adamFields) { adamFieldsPointer in
                    BNNSOptimizerStep(BNNSOptimizerFunctionAdam,
                                      adamFieldsPointer, 1,
                                      &paramaters,
                                      &gradients,
                                      &accumulators,
                                      nil)
                }
                
                if error != 0 {
                    fatalError("BNNSOptimizerStep failed.")
                }
            }
        }
    }
}
```

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)