# `objc.simd` – SIMD support for PyObjC

## Introduction

The module `objc.simd` provides types that are used to support SIMD types in PyObjC.

The module contains two groups of types:

1. Vector types

   These types behave like numbers and support the usual numerical operators, as well as matrix multiplication.

2. Matrix types

   These are structs containing an array of vector types and don’t support numerical operators.

Note

This module only defines the SIMD types either used in Cocoa frameworks as wrapped by PyObjC, or needed to fully implement those types.

This means that there obvious holes in the types described below. That is intentional.

### Vector types

Only the first vector types is fully described. The other types follow the same pattern, dropping fields as needed (that is, a 4 element vector has attributes named x, y, z, w to represent elements, a 2 element vector only has x and y).

The exception to the rule is `vector_uchar16`: This type does not support the complicated `__init__` signature and does not support named accessors to elements.

class objc.simd.vector_double4

  A vector of 4 floating point values. In C these values are C double values.

  __init__(self, x: float )

    Initialize all elements of the vector to the same value

  __init__(self, x: float, y: float, z: float, w: float )

    Initialize the 4 elements of the vector

  __init__(self, xy: vector_float2, z: float, w: float )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, x: float, yz: vector_float2, w: float )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, x: float, y: float, zw: vector_float2 )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, xy: vector_float2, zw: vector_float2 )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, x: float, yzw: vector_float3 )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, xyz: vector_float3, w: float )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  __init__(self, xxyz: vector_float4 )

    Initialize the 4 elements of the vector after unpacking the vector argument.

  x: float

    First element of the vector

  y: float

    Second element of the vector

  z: float

    Third element of the vector

  w: float

    Fourth element of the vector

  xy

    A `vector_double2` with the first and second elements.

  yz

    A `vector_double2` with the second and third elements.

  zw

    A `vector_double2` with the third and fourth elements.

  xyz

    A `vector_double3` with the first, second and third elements.

  yzw

    A `vector_double3` with the second, third and fourth elements.

  xyzw

    A copy of the vector.

  __getitem__(index: int ) → float

    Return the `index``th element, for ``idx` in the range 1 to 4 (inclusive).

  __setitem__(index: int, value: float )

    Replace element at indx with value.

  __add__(self, other: vector_double4 ) → vector_double4

    Return a `vector_double4` with the pairwise addition of self and other.

  __add__(self, other: float | int ) → vector_double4

    Return a `vector_double4` with other added to all elements of self.

  __mul__(self, other: vector_double4 ) → vector_double4

    Return a `vector_double4` with the pairwise multiplication of self and other.

  __mul__(self, other: float | int ) → vector_double4

    Return a `vector_double4` with all elements of self multiplied by other.

  __div__(self, other: vector_double4 ) → vector_double4

    Return a `vector_double4` with the pairwise division of self and other.

  __div__(self, other: float | int ) → vector_double4

    Return a `vector_double4` with all elements of self divided by other.

  __matmul__(self, other: vector_double4 ) → float

    Return the inner product of self and other

  __abs__(self) → vector_double4

    Return a `vector_double4` with the absolute value of all elements of self.

  __neg__(self) → vector_double4

    Return a `vector_double4` with the negated value of all elements of self

  __pos__(self) → vector_double4

    Return a copy of self.

  __eq__(self, other)

    Return True if self and other are equal after casting other to `vector_double4`

  __ne__(self, other)

    Return False if self and other are equal after casting other to `vector_double4`

  __lt__(self, other)

    Return True if self is less than other after casting other to `vector_double4`

  __le__(self, other)

    Return True if self is less than or equal to other after casting other to `vector_double4`

  __gt__(self, other)

    Return True if self is greater than other after casting other to `vector_double4`

  __ge__(self, other)

    Return True if self is greater than or equal to other after casting other to `vector_double4`

class objc.simd.vector_double2

  A vector of 2 floating point values. In C these values are C double values.

class objc.simd.vector_double3

  A vector of 3 floating point values. In C these values are C double values.

class objc.simd.vector_float2

  A vector of 2 floating point values. In C these values are C float values.

class objc.simd.vector_float3

  A vector of 3 floating point values. In C these values are C float values.

class objc.simd.vector_float4

  A vector of 4 floating point values. In C these values are C float values.

class objc.simd.vector_short2

  A vector of 2 integer values. In C these values are C short values.

  The values of elements of the vector are automatically restricted to the range of a C short.

class objc.simd.vector_ushort2

  A vector of 2 integer values. In C these values are C unsigned short values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned short.

class objc.simd.vector_ushort3

  A vector of 3 integer values. In C these values are C unsigned short values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned short.

class objc.simd.vector_ushort4

  A vector of 4 integer values. In C these values are C unsigned short values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned short.

class objc.simd.vector_int2

  A vector of 2 integer values. In C these values are C int values.

  The values of elements of the vector are automatically restricted to the range of a C int.

class objc.simd.vector_int3

  A vector of 3 integer values. In C these values are C int values.

  The values of elements of the vector are automatically restricted to the range of a C int.

class objc.simd.vector_int4

  A vector of 4 integer values. In C these values are C int values.

  The values of elements of the vector are automatically restricted to the range of a C int.

class objc.simd.vector_uint2

  A vector of 2 integer values. In C these values are C unsigned int values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned int.

class objc.simd.vector_uint3

  A vector of 3 integer values. In C these values are C unsigned int values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned int.

class objc.simd.vector_uchar16

  A vector of 16 integer values. In C these values are C unsigned char values.

  The values of elements of the vector are automatically restricted to the range of a C unsigned char.

### Vector aliases

All types documented in the previous section are also available with the prefix `simd_` instead of `vector_`.

In particular:

class objc.simd.simd_int2

  Alias for vector_int2

class objc.simd.simd_uint2

  Alias for vector_uint2

class objc.simd.simd_uint3

  Alias for vector_uint3

class objc.simd.simd_double2

  Alias for vector_double2

class objc.simd.simd_double3

  Alias for vector_double3

class objc.simd.simd_double4

  Alias for vector_double4

class objc.simd.simd_float2

  Alias for vector_float2

class objc.simd.simd_float3

  Alias for vector_float3

class objc.simd.simd_float4

  Alias for vector_float4

class objc.simd.simd_short2

  Alias for vector_short2

class objc.simd.simd_ushort2

  Alias for vector_ushort

class objc.simd.simd_ushort3

  Alias for vector_ushort3

class objc.simd.simd_ushort4

  Alias for vector_ushort4

class objc.simd.simd_uchar16

  Alias for vector_uchar16

### Matrix types

class objc.simd.matrix_float2x2

  A 2 by 2 matrix of floats, represented as an array of columns where each element of the array is a `vector_float2` with the row values.

  columns

    The columns of the matrix.

class objc.simd.matrix_float3x3

  A 3 by 3 matrix of floats, represented as an array of columns where each element of the array is a `vector_float3` with the row values.

  columns

    The columns of the matrix.

class objc.simd.matrix_float4x3

  A 4 by 3 matrix of floats, represented as an array of columns where each element of the array is a `vector_float3` with the row values.

  columns

    The columns of the matrix.

class objc.simd.matrix_float4x4

  A 4 by 4 matrix of floats, represented as an array of columns where each element of the array is a `vector_float4` with the row values.

  columns

    The columns of the matrix.

class objc.simd.simd_float4x4

  A 4 by 4 matrix of floats, represented as an array of columns where each element of the array is a `vector_float4` with the row values.

  columns

    The columns of the matrix.

class objc.simd.matrix_double4x4

  A 4 by 4 matrix of floats, represented as an array of columns where each element of the array is a `vector_double4` with the row values.

  columns

    The columns of the matrix.

### Quaternions

class objc.simd.simd_quatf

  A struct wrapping a `vector_float4`

  vector

    The wrapped value

class objc.simd.simd_quatd

  A struct wrapping a `vector_doulbe4`

  vector

    The wrapped value