Added convenience helper functions for wrapping `…InPlace` functions with value-semantics
This commit is contained in:
parent
1f2093a189
commit
75369fea1a
|
@ -20,18 +20,21 @@
|
|||
|
||||
import Accelerate
|
||||
|
||||
@inline(__always)
|
||||
func withArray<T, S>(from sequence: S, _ closure: (inout [T]) -> ()) -> [T] where S: Sequence, S.Element == T {
|
||||
var array = Array(sequence)
|
||||
closure(&array)
|
||||
return array
|
||||
}
|
||||
|
||||
// MARK: - Addition
|
||||
|
||||
public func add<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Float) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
addInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func add<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Double) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
addInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func + <L: UnsafeMemoryAccessible>(lhs: L, rhs: Float) -> [Float] where L.Element == Float {
|
||||
|
@ -107,15 +110,11 @@ public func .+= <L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible>(lh
|
|||
// MARK: - Subtraction
|
||||
|
||||
public func sub<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Float) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
subInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func sub<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Double) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
subInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func - <L: UnsafeMemoryAccessible>(lhs: L, rhs: Float) -> [Float] where L.Element == Float {
|
||||
|
@ -183,15 +182,11 @@ public func .-= <L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible>(lh
|
|||
// MARK: - Element-wise Multiply Addition
|
||||
|
||||
func elmuladd<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R, _ alpha: Float) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
var results = Array(lhs)
|
||||
elmuladdInPlace(&results, rhs, alpha)
|
||||
return results
|
||||
return withArray(from: lhs) { elmuladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
func elmuladd<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R, _ alpha: Double) -> [Double] where L.Element == Double, R.Element == Double {
|
||||
var results = Array(lhs)
|
||||
elmuladdInPlace(&results, rhs, alpha)
|
||||
return results
|
||||
return withArray(from: lhs) { elmuladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
// MARK: - Element-wise Multiply Addition: In Place
|
||||
|
@ -217,15 +212,11 @@ func elmuladdInPlace<L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible
|
|||
// MARK: - Multiplication
|
||||
|
||||
public func mul<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Float) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
mulInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { mulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func mul<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Double) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
mulInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { mulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func * <L: UnsafeMemoryAccessible>(lhs: L, rhs: Float) -> [Float] where L.Element == Float {
|
||||
|
@ -263,15 +254,11 @@ public func *=<L: UnsafeMutableMemoryAccessible>(lhs: inout L, rhs: Double) wher
|
|||
// MARK: - Element-wise Multiplication
|
||||
|
||||
public func elmul<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
var results = Array(lhs)
|
||||
elmulInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { elmulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func elmul<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Double] where L.Element == Double, R.Element == Double {
|
||||
var results = Array(lhs)
|
||||
elmulInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { elmulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func .* <L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(lhs: L, rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
|
@ -313,15 +300,11 @@ public func .*= <L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible>(lh
|
|||
// MARK: - Division
|
||||
|
||||
public func div<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Float) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
divInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { divInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func div<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Double) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
divInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { divInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func / <L: UnsafeMemoryAccessible>(lhs: L, rhs: Float) -> [Float] where L.Element == Float {
|
||||
|
@ -359,15 +342,11 @@ public func /=<L: UnsafeMutableMemoryAccessible>(lhs: inout L, rhs: Double) wher
|
|||
// MARK: - Element-wise Division
|
||||
|
||||
public func div<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
var results = Array(lhs)
|
||||
eldivInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { eldivInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func div<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Double] where L.Element == Double, R.Element == Double {
|
||||
var results = Array(lhs)
|
||||
eldivInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { eldivInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func ./ <L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(lhs: L, rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
|
@ -410,16 +389,12 @@ public func ./= <L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible>(lh
|
|||
|
||||
/// - Warning: Allocates a temporary array from `rhs` via `Array(repeating: rhs, count: lhs.count)`.
|
||||
public func mod<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Float) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
modInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { modInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: Allocates a temporary array from `rhs` via `Array(repeating: rhs, count: lhs.count)`.
|
||||
public func mod<L: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: Double) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
modInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { modInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: Allocates a temporary array from `rhs` via `Array(repeating: rhs, count: lhs.count)`.
|
||||
|
@ -464,16 +439,12 @@ public func .%= <L: UnsafeMutableMemoryAccessible>(lhs: inout L, rhs: Double) wh
|
|||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func mod<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
var results = Array(lhs)
|
||||
modInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { modInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func mod<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Double] where L.Element == Double, R.Element == Double {
|
||||
var results = Array(lhs)
|
||||
modInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { modInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func .% <L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(lhs: L, rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
|
@ -520,16 +491,12 @@ public func .%= <L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessible>(lh
|
|||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func remainder<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Float] where L.Element == Float, R.Element == Float {
|
||||
var results = Array(lhs)
|
||||
remainderInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { remainderInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func remainder<L: UnsafeMemoryAccessible, R: UnsafeMemoryAccessible>(_ lhs: L, _ rhs: R) -> [Double] where L.Element == Double, R.Element == Double {
|
||||
var results = Array(lhs)
|
||||
remainderInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { remainderInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
// MARK: - Remainder: In Place
|
||||
|
@ -560,16 +527,12 @@ func remainderInPlace<L: UnsafeMutableMemoryAccessible, R: UnsafeMemoryAccessibl
|
|||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func exp<X: UnsafeMemoryAccessible>(_ lhs: X) -> [Float] where X.Element == Float {
|
||||
var results = Array(lhs)
|
||||
expInPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { expInPlace(&$0) }
|
||||
}
|
||||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func exp<X: UnsafeMemoryAccessible>(_ lhs: X) -> [Double] where X.Element == Double {
|
||||
var results = Array(lhs)
|
||||
expInPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { expInPlace(&$0) }
|
||||
}
|
||||
|
||||
// MARK: - Exponential: In Place
|
||||
|
@ -596,16 +559,12 @@ func expInPlace<X: UnsafeMutableMemoryAccessible>(_ lhs: inout X) where X.Elemen
|
|||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func exp2<X: UnsafeMemoryAccessible>(_ lhs: X) -> [Float] where X.Element == Float {
|
||||
var results = Array(lhs)
|
||||
exp2InPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { exp2InPlace(&$0) }
|
||||
}
|
||||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func exp2<X: UnsafeMemoryAccessible>(_ lhs: X) -> [Double] where X.Element == Double {
|
||||
var results = Array(lhs)
|
||||
exp2InPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { exp2InPlace(&$0) }
|
||||
}
|
||||
|
||||
// MARK: - Square Exponentiation: In Place
|
||||
|
@ -632,30 +591,22 @@ func exp2InPlace<X: UnsafeMutableMemoryAccessible>(_ lhs: inout X) where X.Eleme
|
|||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func pow<X: UnsafeMemoryAccessible, Y: UnsafeMemoryAccessible>(_ lhs: X, _ rhs: Y) -> [Float] where X.Element == Float, Y.Element == Float {
|
||||
var results = Array(lhs)
|
||||
powInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func pow<X: UnsafeMemoryAccessible, Y: UnsafeMemoryAccessible>(_ lhs: X, _ rhs: Y) -> [Double] where X.Element == Double, Y.Element == Double {
|
||||
var results = Array(lhs)
|
||||
powInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: Allocates a temporary array from `rhs` via `Array(repeating: rhs, count: lhs.count)`.
|
||||
public func pow<X: UnsafeMemoryAccessible>(_ lhs: X, _ rhs: Float) -> [Float] where X.Element == Float {
|
||||
var results = Array(lhs)
|
||||
powInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
/// - Warning: Allocates a temporary array from `rhs` via `Array(repeating: rhs, count: lhs.count)`.
|
||||
public func pow<X: UnsafeMemoryAccessible>(_ lhs: X, _ rhs: Double) -> [Double] where X.Element == Double {
|
||||
var results = Array(lhs)
|
||||
powInPlace(&results, rhs)
|
||||
return results
|
||||
return withArray(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
// MARK: - Power: In Place
|
||||
|
@ -701,15 +652,11 @@ func powInPlace<X: UnsafeMutableMemoryAccessible>(_ lhs: inout X, _ rhs: Double)
|
|||
//// MARK: - Square
|
||||
|
||||
public func sq<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Float] where L.Element == Float {
|
||||
var results = Array(lhs)
|
||||
sqInPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { sqInPlace(&$0) }
|
||||
}
|
||||
|
||||
public func sq<L: UnsafeMemoryAccessible>(_ lhs: L) -> [Double] where L.Element == Double {
|
||||
var results = Array(lhs)
|
||||
sqInPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { sqInPlace(&$0) }
|
||||
}
|
||||
|
||||
// MARK: - Square: In Place
|
||||
|
@ -732,9 +679,14 @@ public func sqInPlace<L: UnsafeMutableMemoryAccessible>(_ lhs: inout L) where L.
|
|||
///
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func sqrt<C: UnsafeMemoryAccessible>(_ lhs: C) -> [Float] where C.Element == Float {
|
||||
var results = Array(lhs)
|
||||
sqrtInPlace(&results)
|
||||
return results
|
||||
return withArray(from: lhs) { sqrtInPlace(&$0) }
|
||||
}
|
||||
|
||||
/// Elemen-wise square root.
|
||||
///
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func sqrt<C: UnsafeMemoryAccessible>(_ lhs: C) -> [Double] where C.Element == Double {
|
||||
return withArray(from: lhs) { sqrtInPlace(&$0) }
|
||||
}
|
||||
|
||||
/// Elemen-wise square root with custom output storage.
|
||||
|
@ -750,15 +702,6 @@ public func sqrt<MI: UnsafeMemoryAccessible, MO: UnsafeMutableMemoryAccessible>(
|
|||
}
|
||||
}
|
||||
|
||||
/// Elemen-wise square root.
|
||||
///
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
public func sqrt<C: UnsafeMemoryAccessible>(_ lhs: C) -> [Double] where C.Element == Double {
|
||||
var results = Array(lhs)
|
||||
sqrtInPlace(&results)
|
||||
return results
|
||||
}
|
||||
|
||||
/// Elemen-wise square root with custom output storage.
|
||||
///
|
||||
/// - Warning: does not support memory stride (assumes stride is 1).
|
||||
|
|
|
@ -264,22 +264,21 @@ public func ==<T> (lhs: Matrix<T>, rhs: Matrix<T>) -> Bool {
|
|||
return lhs.rows == rhs.rows && lhs.columns == rhs.columns && lhs.grid == rhs.grid
|
||||
}
|
||||
|
||||
@inline(__always)
|
||||
func withMatrix<Scalar>(from matrix: Matrix<Scalar>, _ closure: (inout Matrix<Scalar>) -> ()) -> Matrix<Scalar> {
|
||||
var copy = matrix
|
||||
closure(©)
|
||||
return copy
|
||||
}
|
||||
|
||||
// MARK: - Addition
|
||||
|
||||
public func add(_ lhs: Matrix<Float>, _ rhs: Matrix<Float>) -> Matrix<Float> {
|
||||
var result = lhs
|
||||
|
||||
result += rhs
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func add(_ lhs: Matrix<Double>, _ rhs: Matrix<Double>) -> Matrix<Double> {
|
||||
var result = lhs
|
||||
|
||||
result += rhs
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func + (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {
|
||||
|
@ -311,17 +310,11 @@ public func += (lhs: inout Matrix<Double>, rhs: Matrix<Double>) {
|
|||
// MARK: - Subtraction
|
||||
|
||||
public func sub(_ lhs: Matrix<Float>, _ rhs: Matrix<Float>) -> Matrix<Float> {
|
||||
var result = lhs
|
||||
result -= rhs
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func sub(_ lhs: Matrix<Double>, _ rhs: Matrix<Double>) -> Matrix<Double> {
|
||||
var result = lhs
|
||||
result -= rhs
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func - (lhs: Matrix<Float>, rhs: Matrix<Float>) -> Matrix<Float> {
|
||||
|
@ -353,19 +346,11 @@ public func -= (lhs: inout Matrix<Double>, rhs: Matrix<Double>) {
|
|||
// MARK: - Multiply Addition
|
||||
|
||||
func muladd(_ lhs: Matrix<Float>, _ rhs: Matrix<Float>, _ alpha: Float) -> Matrix<Float> {
|
||||
var result = lhs
|
||||
|
||||
muladdInPlace(&result, rhs, alpha)
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { muladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
func muladd(_ lhs: Matrix<Double>, _ rhs: Matrix<Double>, _ alpha: Double) -> Matrix<Double> {
|
||||
var result = lhs
|
||||
|
||||
muladdInPlace(&result, rhs, alpha)
|
||||
|
||||
return result
|
||||
return withMatrix(from: lhs) { muladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
// MARK: - Multiply Addition: In Place
|
||||
|
|
|
@ -105,18 +105,21 @@ public func ==<T> (lhs: Vector<T>, rhs: Vector<T>) -> Bool {
|
|||
return lhs.scalars == rhs.scalars
|
||||
}
|
||||
|
||||
@inline(__always)
|
||||
func withVector<Scalar>(from vector: Vector<Scalar>, _ closure: (inout Vector<Scalar>) -> ()) -> Vector<Scalar> {
|
||||
var copy = vector
|
||||
closure(©)
|
||||
return copy
|
||||
}
|
||||
|
||||
// MARK: - Addition
|
||||
|
||||
public func add(_ lhs: Vector<Float>, _ rhs: Vector<Float>) -> Vector<Float> {
|
||||
var result = lhs
|
||||
addInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func add(_ lhs: Vector<Double>, _ rhs: Vector<Double>) -> Vector<Double> {
|
||||
var result = lhs
|
||||
addInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func + (lhs: Vector<Float>, rhs: Vector<Float>) -> Vector<Float> {
|
||||
|
@ -128,15 +131,11 @@ public func + (lhs: Vector<Double>, rhs: Vector<Double>) -> Vector<Double> {
|
|||
}
|
||||
|
||||
public func add(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
addInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func add(_ lhs: Vector<Double>, _ rhs: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
addInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { addInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func + (lhs: Vector<Float>, rhs: Float) -> Vector<Float> {
|
||||
|
@ -188,15 +187,11 @@ public func += (lhs: inout Vector<Double>, rhs: Double) {
|
|||
// MARK: - Subtraction
|
||||
|
||||
public func sub(_ lhs: Vector<Float>, _ rhs: Vector<Float>) -> Vector<Float> {
|
||||
var result = lhs
|
||||
subInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func sub(_ lhs: Vector<Double>, _ rhs: Vector<Double>) -> Vector<Double> {
|
||||
var result = lhs
|
||||
subInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func - (lhs: Vector<Float>, rhs: Vector<Float>) -> Vector<Float> {
|
||||
|
@ -208,15 +203,11 @@ public func - (lhs: Vector<Double>, rhs: Vector<Double>) -> Vector<Double> {
|
|||
}
|
||||
|
||||
public func sub(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
subInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func sub(_ lhs: Vector<Double>, _ rhs: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
subInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { subInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func - (lhs: Vector<Float>, rhs: Float) -> Vector<Float> {
|
||||
|
@ -268,15 +259,11 @@ public func -= (lhs: inout Vector<Double>, rhs: Double) {
|
|||
// MARK: - Multiply Addition
|
||||
|
||||
public func muladd(_ lhs: Vector<Float>, _ rhs: Vector<Float>, _ alpha: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
muladdInPlace(&result, rhs, alpha)
|
||||
return result
|
||||
return withVector(from: lhs) { muladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
public func muladd(_ lhs: Vector<Double>, _ rhs: Vector<Double>, _ alpha: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
muladdInPlace(&result, rhs, alpha)
|
||||
return result
|
||||
return withVector(from: lhs) { muladdInPlace(&$0, rhs, alpha) }
|
||||
}
|
||||
|
||||
// MARK: - Multiply Addition: In Place
|
||||
|
@ -296,15 +283,11 @@ func muladdInPlace(_ lhs: inout Vector<Double>, _ rhs: Vector<Double>, _ alpha:
|
|||
// MARK: - Multiplication
|
||||
|
||||
public func mul(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
mulInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { mulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func mul(_ lhs: Vector<Double>, _ rhs: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
mulInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { mulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func * (lhs: Vector<Float>, rhs: Float) -> Vector<Float> {
|
||||
|
@ -388,15 +371,11 @@ public func *= (lhs: inout Vector<Double>, rhs: Double) {
|
|||
// MARK: - Division
|
||||
|
||||
public func div(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
divInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { divInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func div(_ lhs: Vector<Double>, _ rhs: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
divInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { divInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func / (lhs: Vector<Double>, rhs: Double) -> Vector<Double> {
|
||||
|
@ -428,19 +407,11 @@ public func /= (lhs: inout Vector<Double>, rhs: Double) {
|
|||
// MARK: - Element-wise Multiplication
|
||||
|
||||
public func elmul(_ lhs: Vector<Double>, _ rhs: Vector<Double>) -> Vector<Double> {
|
||||
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with element-wise multiplication")
|
||||
|
||||
var result = lhs
|
||||
elmulInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { elmulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func elmul(_ lhs: Vector<Float>, _ rhs: Vector<Float>) -> Vector<Float> {
|
||||
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with element-wise multiplication")
|
||||
|
||||
var result = lhs
|
||||
elmulInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { elmulInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func .* (lhs: Vector<Float>, rhs: Vector<Float>) -> Vector<Float> {
|
||||
|
@ -476,19 +447,11 @@ public func .*= (lhs: inout Vector<Double>, rhs: Vector<Double>) {
|
|||
// MARK: - Element-wise Division
|
||||
|
||||
public func eldiv(_ lhs: Vector<Double>, _ rhs: Vector<Double>) -> Vector<Double> {
|
||||
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with element-wise division")
|
||||
|
||||
var result = lhs
|
||||
eldivInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { eldivInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func eldiv(_ lhs: Vector<Float>, _ rhs: Vector<Float>) -> Vector<Float> {
|
||||
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with element-wise division")
|
||||
|
||||
var result = lhs
|
||||
eldivInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { eldivInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func ./ (lhs: Vector<Double>, rhs: Vector<Double>) -> Vector<Double> {
|
||||
|
@ -547,15 +510,11 @@ public func • (lhs: Vector<Float>, rhs: Vector<Float>) -> Float {
|
|||
// MARK: - Power
|
||||
|
||||
public func pow(_ lhs: Vector<Double>, _ rhs: Double) -> Vector<Double> {
|
||||
var result = lhs
|
||||
powInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
public func pow(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||
var result = lhs
|
||||
powInPlace(&result, rhs)
|
||||
return result
|
||||
return withVector(from: lhs) { powInPlace(&$0, rhs) }
|
||||
}
|
||||
|
||||
// MARK: - Power: In Place
|
||||
|
@ -571,15 +530,11 @@ func powInPlace(_ lhs: inout Vector<Float>, _ rhs: Float) {
|
|||
// MARK: - Exponential
|
||||
|
||||
public func exp(_ lhs: Vector<Double>) -> Vector<Double> {
|
||||
var result = lhs
|
||||
expInPlace(&result)
|
||||
return result
|
||||
return withVector(from: lhs) { expInPlace(&$0) }
|
||||
}
|
||||
|
||||
public func exp(_ lhs: Vector<Float>) -> Vector<Float> {
|
||||
var result = lhs
|
||||
expInPlace(&result)
|
||||
return result
|
||||
return withVector(from: lhs) { expInPlace(&$0) }
|
||||
}
|
||||
|
||||
// MARK: - Exponential: In Place
|
||||
|
|
Loading…
Reference in New Issue