Changed tests to only check each operation’s base function (e.g. `func addInPlace`), not a derived wrapper function (e.g. `func add` or `func +`, etc.)
This also removed any previously added benchmarks. But not to worry we’ll add them back in a dedicated `SurgeBenchmarkTests` test target.
This commit is contained in:
parent
d715204aa2
commit
7168c8ca2d
|
@ -19,47 +19,14 @@
|
|||
// THE SOFTWARE.
|
||||
|
||||
import Foundation
|
||||
import Surge
|
||||
import XCTest
|
||||
|
||||
@testable import Surge
|
||||
|
||||
// swiftlint:disable nesting type_body_length
|
||||
|
||||
class ArithmeticTests: XCTestCase {
|
||||
let n = 100_000
|
||||
|
||||
// MARK: - Addition
|
||||
|
||||
func test_add_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .+ rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 + $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_add_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .+ rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 + $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
let n = 1_000
|
||||
|
||||
// MARK: - Addition: In Place
|
||||
|
||||
|
@ -69,14 +36,8 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .+= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.addInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 + $1 }
|
||||
|
||||
|
@ -89,54 +50,14 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .+= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.addInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 + $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Subtraction
|
||||
|
||||
func test_sub_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .- rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_sub_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .- rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Subtraction: In Place
|
||||
|
||||
func test_sub_in_place_array_array_float() {
|
||||
|
@ -145,14 +66,8 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .-= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.subInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
|
||||
|
@ -165,54 +80,14 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .-= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.subInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Multiplication
|
||||
|
||||
func test_mul_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .* rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 * $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_mul_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .* rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 * $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Multiplication: In Place
|
||||
|
||||
func test_mul_in_place_array_array_float() {
|
||||
|
@ -221,14 +96,8 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .*= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.mulInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 * $1 }
|
||||
|
||||
|
@ -241,54 +110,14 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual .*= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.mulInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 * $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Division
|
||||
|
||||
func test_div_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs ./ rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 / $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
}
|
||||
|
||||
func test_div_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs ./ rhs
|
||||
}
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 / $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Division: In Place
|
||||
|
||||
func test_div_in_place_array_array_float() {
|
||||
|
@ -297,14 +126,8 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual ./= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.divInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 / $1 }
|
||||
|
||||
|
@ -317,276 +140,238 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measureMetrics([.wallClockTime], automaticallyStartMeasuring: false) {
|
||||
actual = lhs
|
||||
|
||||
startMeasuring()
|
||||
actual ./= rhs
|
||||
stopMeasuring()
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.divInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { $0 / $1 }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Modulo
|
||||
// MARK: - Modulo: In Place
|
||||
|
||||
func test_mod_array_array_float() {
|
||||
func test_mod_in_place_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
let rhs: [Scalar] = Array(repeating: 42, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .% rhs
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.modInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { fmod($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_mod_array_array_double() {
|
||||
func test_mod_in_place_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
let rhs: [Scalar] = Array(repeating: 42, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = lhs .% rhs
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.modInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { fmod($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Remainder
|
||||
// MARK: - Remainder: In Place
|
||||
|
||||
func test_remainder_array_array_float() {
|
||||
func test_remainder_in_place_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
let rhs: [Scalar] = Array(repeating: -42, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.remainder(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.remainderInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { remainder($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_remainder_array_array_double() {
|
||||
func test_remainder_in_place_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
let rhs: [Scalar] = Array(repeating: -42, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.remainder(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.remainderInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { remainder($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Exponential
|
||||
// MARK: - Exponential: In Place
|
||||
|
||||
func test_exp_array_float() {
|
||||
func test_exp_in_place_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.exp(values)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.expInPlace(&actual)
|
||||
|
||||
let expected = values.map { exp($0) }
|
||||
let expected = lhs.map { exp($0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
}
|
||||
|
||||
func test_exp_array_double() {
|
||||
func test_exp_in_place_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.exp(values)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.expInPlace(&actual)
|
||||
|
||||
let expected = values.map { exp($0) }
|
||||
let expected = lhs.map { exp($0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Square Exponentiation
|
||||
// MARK: - Square Exponential: In Place
|
||||
|
||||
func test_exp2_array_float() {
|
||||
func test_exp2_in_place_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.exp2(values)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.exp2InPlace(&actual)
|
||||
|
||||
let expected = values.map { exp2($0) }
|
||||
let expected = lhs.map { exp2($0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
}
|
||||
|
||||
func test_exp2_array_double() {
|
||||
func test_exp2_in_place_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.exp2(values)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.exp2InPlace(&actual)
|
||||
|
||||
let expected = values.map { exp2($0) }
|
||||
let expected = lhs.map { exp2($0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Power
|
||||
// MARK: - Power: In Place
|
||||
|
||||
func test_pow_array_array_float() {
|
||||
func test_pow_in_place_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = Array(repeating: 2.0, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.pow(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.powInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { pow($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-5)
|
||||
}
|
||||
|
||||
func test_pow_array_array_double() {
|
||||
func test_pow_in_place_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = Array(repeating: 2.0, count: n)
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.pow(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.powInPlace(&actual, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).map { pow($0, $1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_pow_array_scalar_float() {
|
||||
func test_pow_in_place_array_scalar_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: Scalar = 2.0
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.pow(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.powInPlace(&actual, rhs)
|
||||
|
||||
let expected = lhs.map { pow($0, rhs) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-5)
|
||||
}
|
||||
|
||||
func test_pow_array_scalar_double() {
|
||||
func test_pow_in_place_array_scalar_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: Scalar = 2.0
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.pow(lhs, rhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.powInPlace(&actual, rhs)
|
||||
|
||||
let expected = lhs.map { pow($0, rhs) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Square
|
||||
// MARK: - Square: In Place
|
||||
|
||||
func test_sq_array_float() {
|
||||
func test_sq_in_place_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.sq(lhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.sqInPlace(&actual)
|
||||
|
||||
let expected = lhs.map { pow($0, 2.0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-5)
|
||||
}
|
||||
|
||||
func test_sq_array_double() {
|
||||
func test_sq_in_place_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.sq(lhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.sqInPlace(&actual)
|
||||
|
||||
let expected = lhs.map { pow($0, 2.0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Square Root
|
||||
// MARK: - Square Root: In Place
|
||||
|
||||
func test_sqrt_array_array_float() {
|
||||
func test_sqrt_in_place_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.sqrt(lhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.sqrtInPlace(&actual)
|
||||
|
||||
let expected = lhs.map { sqrt($0) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_sqrt_array_array_double() {
|
||||
func test_sqrt_in_place_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) }
|
||||
|
||||
var actual: [Scalar] = []
|
||||
measure {
|
||||
actual = Surge.sqrt(lhs)
|
||||
}
|
||||
var actual: [Scalar] = lhs
|
||||
Surge.sqrtInPlace(&actual)
|
||||
|
||||
let expected = lhs.map { sqrt($0) }
|
||||
|
||||
|
@ -601,14 +386,9 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0
|
||||
measure {
|
||||
actual = lhs • rhs
|
||||
}
|
||||
let actual: Scalar = Surge.dot(lhs, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).reduce(0) {
|
||||
$0 + $1.0 * $1.1
|
||||
}
|
||||
let expected = Swift.zip(lhs, rhs).reduce(0) { $0 + ($1.0 * $1.1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-1)
|
||||
}
|
||||
|
@ -619,78 +399,61 @@ class ArithmeticTests: XCTestCase {
|
|||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0
|
||||
measure {
|
||||
actual = lhs • rhs
|
||||
}
|
||||
let actual: Scalar = Surge.dot(lhs, rhs)
|
||||
|
||||
let expected = Swift.zip(lhs, rhs).reduce(0) {
|
||||
$0 + $1.0 * $1.1
|
||||
}
|
||||
let expected = Swift.zip(lhs, rhs).reduce(0) { $0 + ($1.0 * $1.1) }
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Summation
|
||||
|
||||
func test_sum_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = sum(values)
|
||||
}
|
||||
|
||||
let expected: Scalar = values.reduce(0, +)
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
func test_sum_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let values: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = sum(values)
|
||||
}
|
||||
let actual: Scalar = Surge.sum(lhs)
|
||||
|
||||
let expected: Scalar = values.reduce(0, +)
|
||||
let expected: Scalar = lhs.reduce(0, +)
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-1)
|
||||
}
|
||||
|
||||
// MARK: - Distance
|
||||
|
||||
func test_dist_array_array_double() {
|
||||
func test_sum_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = dist(lhs, rhs)
|
||||
}
|
||||
let actual: Scalar = Surge.sum(lhs)
|
||||
|
||||
let expected: Scalar = sqrt(Swift.zip(lhs, rhs).map({ $0 - $1 }).map({ $0 * $0 }).reduce(0.0, +))
|
||||
let expected: Scalar = lhs.reduce(0, +)
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-8)
|
||||
}
|
||||
|
||||
// MARK: - Distance
|
||||
|
||||
func test_dist_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = dist(lhs, rhs)
|
||||
}
|
||||
let actual: Scalar = Surge.dist(lhs, rhs)
|
||||
|
||||
let expected: Scalar = sqrt(Swift.zip(lhs, rhs).map({ $0 - $1 }).map({ $0 * $0 }).reduce(0.0, +))
|
||||
|
||||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
}
|
||||
|
||||
func test_dist_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
let actual: Scalar = Surge.dist(lhs, rhs)
|
||||
|
||||
let expected: Scalar = sqrt(Swift.zip(lhs, rhs).map({ $0 - $1 }).map({ $0 * $0 }).reduce(0.0, +))
|
||||
|
||||
|
@ -699,16 +462,13 @@ class ArithmeticTests: XCTestCase {
|
|||
|
||||
// MARK: - Distance Squared
|
||||
|
||||
func test_distsq_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
func test_distsq_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = distSq(lhs, rhs)
|
||||
}
|
||||
let actual: Scalar = Surge.distSq(lhs, rhs)
|
||||
|
||||
let partialDistances: [Scalar] = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
let partialDistancesSquared: [Scalar] = partialDistances.map { $0 * $0 }
|
||||
|
@ -717,16 +477,13 @@ class ArithmeticTests: XCTestCase {
|
|||
XCTAssertEqual(actual, expected, accuracy: 1e-6)
|
||||
}
|
||||
|
||||
func test_distsq_array_array_float() {
|
||||
typealias Scalar = Float
|
||||
func test_distsq_array_array_double() {
|
||||
typealias Scalar = Double
|
||||
|
||||
let lhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
let rhs: [Scalar] = (1...n).map { Scalar($0) / Scalar(n) }
|
||||
|
||||
var actual: Scalar = 0.0
|
||||
measure {
|
||||
actual = distSq(lhs, rhs)
|
||||
}
|
||||
let actual: Scalar = Surge.distSq(lhs, rhs)
|
||||
|
||||
let partialDistances: [Scalar] = Swift.zip(lhs, rhs).map { $0 - $1 }
|
||||
let partialDistancesSquared: [Scalar] = partialDistances.map { $0 * $0 }
|
||||
|
|
Loading…
Reference in New Issue