# Dot Products

> NumKong for Swift

Dot products follow a collection-first shape.

```swift
import NumKong

let a: [UInt8] = [1, 2, 3, 4]
let b: [UInt8] = [4, 3, 2, 1]

let dot = a.dot(b) // widened to UInt32, not UInt8
print(dot as Any)
```

For `Float32`, the scalar result widens to `Float64`.
For `Float16`, it widens to `Float32`.
For `Int8`, it widens to `Int32`.
For `UInt8`, it widens to `UInt32`.

`import NumKong`

## NumKongDot

A type that can compute SIMD-accelerated dot products with output type widening.

```swift
protocol NumKongDot
```

Conforming types: `[BFloat16](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#BFloat16)`, `[E5M2](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#E5M2)`, `[E4M3](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#E4M3)`, `[E3M2](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#E3M2)`, `[E2M3](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#E2M3)`, `[I4x2](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#I4x2)`, `[U4x2](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#U4x2)`, `[U1x8](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#U1x8)`, [`Double`](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#Double), [`Float`](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#Float), [`Float16`](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#Float16), [`Int8`](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#Int8), [`UInt8`](https://www.unum.cloud/docs/numkong/swift/scalar-types.md#UInt8)

## DotOutput

The type the dot product is returned in, at least as wide as `Self`.

```swift
associatedtype DotOutput
```

## dot

Computes the dot product of two vectors.

```swift
static func dot<A, B>(
    _ a: A,
    _ b: B
) -> DotOutput? where Self == A.Element, A : Sequence, B : Sequence, A.Element == B.Element
```

- `a`: The first vector.
- `b`: The second vector, as long as `a`.

