Add `muladd…` to `Vector<Scalar>` and corresponding tests
This commit is contained in:
parent
462c1e40dc
commit
dcebafd1f3
|
@ -257,6 +257,34 @@ public func -= (lhs: inout Vector<Double>, rhs: Double) {
|
||||||
return subInPlace(&lhs, rhs)
|
return subInPlace(&lhs, rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
public func muladd(_ lhs: Vector<Double>, _ rhs: Vector<Double>, _ alpha: Double) -> Vector<Double> {
|
||||||
|
var result = lhs
|
||||||
|
muladdInPlace(&result, rhs, alpha)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Multiply Addition: In Place
|
||||||
|
|
||||||
|
func muladdInPlace(_ lhs: inout Vector<Float>, _ rhs: Vector<Float>, _ alpha: Float) {
|
||||||
|
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with addition")
|
||||||
|
|
||||||
|
return muladdInPlace(&lhs.scalars, rhs.scalars, alpha)
|
||||||
|
}
|
||||||
|
|
||||||
|
func muladdInPlace(_ lhs: inout Vector<Double>, _ rhs: Vector<Double>, _ alpha: Double) {
|
||||||
|
precondition(lhs.dimensions == rhs.dimensions, "Vector dimensions not compatible with addition")
|
||||||
|
|
||||||
|
return muladdInPlace(&lhs.scalars, rhs.scalars, alpha)
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Multiplication
|
// MARK: - Multiplication
|
||||||
|
|
||||||
public func mul(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
public func mul(_ lhs: Vector<Float>, _ rhs: Float) -> Vector<Float> {
|
||||||
|
|
|
@ -323,6 +323,80 @@ class VectorTests: XCTestCase {
|
||||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Multiply Addition
|
||||||
|
|
||||||
|
func test_muladd_vector_vector_double() {
|
||||||
|
typealias Scalar = Double
|
||||||
|
|
||||||
|
let vector: Vector<Scalar> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
let scalar: Scalar = 2.0
|
||||||
|
|
||||||
|
var actual: Vector<Scalar> = []
|
||||||
|
measure {
|
||||||
|
actual = Surge.muladd(vector, vector, scalar)
|
||||||
|
}
|
||||||
|
let expected: Vector<Scalar> = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_muladd_vector_vector_float() {
|
||||||
|
typealias Scalar = Float
|
||||||
|
|
||||||
|
let vector: Vector<Scalar> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
let scalar: Scalar = 2.0
|
||||||
|
|
||||||
|
var actual: Vector<Scalar> = []
|
||||||
|
measure {
|
||||||
|
actual = Surge.muladd(vector, vector, scalar)
|
||||||
|
}
|
||||||
|
let expected: Vector<Scalar> = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Multiply Addition: In Place
|
||||||
|
|
||||||
|
func test_muladd_in_place_vector_vector_double() {
|
||||||
|
typealias Scalar = Double
|
||||||
|
|
||||||
|
let vector: Vector<Scalar> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
let scalar: Scalar = 2.0
|
||||||
|
|
||||||
|
var actual: Vector<Scalar> = []
|
||||||
|
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||||
|
actual = vector
|
||||||
|
|
||||||
|
startMeasuring()
|
||||||
|
Surge.muladdInPlace(&actual, vector, scalar)
|
||||||
|
stopMeasuring()
|
||||||
|
}
|
||||||
|
|
||||||
|
let expected: Vector<Scalar> = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_muladd_in_place_vector_vector_float() {
|
||||||
|
typealias Scalar = Float
|
||||||
|
|
||||||
|
let vector: Vector<Scalar> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||||
|
let scalar: Scalar = 2.0
|
||||||
|
|
||||||
|
var actual: Vector<Scalar> = []
|
||||||
|
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||||
|
actual = vector
|
||||||
|
|
||||||
|
startMeasuring()
|
||||||
|
Surge.muladdInPlace(&actual, vector, scalar)
|
||||||
|
stopMeasuring()
|
||||||
|
}
|
||||||
|
|
||||||
|
let expected: Vector<Scalar> = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
|
||||||
|
|
||||||
|
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Multiplication
|
// MARK: - Multiplication
|
||||||
|
|
||||||
func test_mul_vector_scalar_double() {
|
func test_mul_vector_scalar_double() {
|
||||||
|
|
Loading…
Reference in New Issue