Skip to content

Commit

Permalink
make eq/neq use tolerance
Browse files Browse the repository at this point in the history
  • Loading branch information
Martmists-GH committed Dec 18, 2024
1 parent 7041298 commit 339911f
Show file tree
Hide file tree
Showing 26 changed files with 195 additions and 122 deletions.
2 changes: 0 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,6 @@ if (isProduction) {
}
}



publications {
withType<MavenPublication> {
version = releaseVersion
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ kotlin.incremental.native=true
kotlin.native.ignoreDisabledTargets=true
kotlin.mpp.enableCInteropCommonization=true
kotlin.mpp.enableCInteropCommonization.nowarn=true
production=true
38 changes: 34 additions & 4 deletions src/commonMain/kotlin/com/martmists/ndarray/simd/F64Array.kt
Original file line number Diff line number Diff line change
Expand Up @@ -827,7 +827,11 @@ interface F64Array {
*
* @param other the other array, must have the same shape as this array
*/
fun eqInPlace(other: F64Array) = zipTransformInPlace(other) { a, b -> if (a == b) 1.0 else 0.0 }
fun eqInPlace(other: F64Array) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
zipTransformInPlace(other) { a, b -> if (abs(a - b) <= (atol + rtol * abs(b)) || (allowNan && a.isNaN() && b.isNaN())) 1.0 else 0.0 }
}

/**
* Compares if each element in the array is equal to another array.
Expand All @@ -842,7 +846,11 @@ interface F64Array {
*
* @param other the scalar
*/
fun eqInPlace(other: Double) = transformInPlace { if (it == other) 1.0 else 0.0 }
fun eqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
transformInPlace { a -> if (abs(a - other) <= (atol + rtol * abs(other)) || (allowNan && a.isNaN())) 1.0 else 0.0 }
}

/**
* Compares if each element in the array is equal to a scalar.
Expand All @@ -857,7 +865,11 @@ interface F64Array {
*
* @param other the other array, must have the same shape as this array
*/
fun neqInPlace(other: F64Array) = zipTransformInPlace(other) { a, b -> if (a != b) 1.0 else 0.0 }
fun neqInPlace(other: F64Array) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
zipTransformInPlace(other) { a, b -> if (abs(a - b) <= (atol + rtol * abs(b)) || (allowNan && a.isNaN() && b.isNaN())) 0.0 else 1.0 }
}

/**
* Compares if each element in the array is not equal to another array.
Expand All @@ -872,7 +884,11 @@ interface F64Array {
*
* @param other the scalar
*/
fun neqInPlace(other: Double) = transformInPlace { if (it != other) 1.0 else 0.0 }
fun neqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
transformInPlace { a -> if (abs(a - other) <= (atol + rtol * abs(other)) || (allowNan && a.isNaN())) 0.0 else 1.0 }
}

/**
* Compares if each element in the array is not equal to a scalar.
Expand Down Expand Up @@ -1412,6 +1428,20 @@ interface F64Array {
*/
val simdSize by lazy { NativeSpeedup.getSimdSize() * 2 }

/**
* The relative and absolute tolerance for eq/neq.
* This is implemented similar to numpy: `absolute(a - b) <= (atol + rtol * absolute(b))`
*
* @since 1.2.2
*/
var tolerance = 1e-05 to 1e-08

/**
* Whether or not nan == nan for eq/neq.
* @since 1.2.2
*/
var equalNan = false

/**
* Creates a new array with the specified shape.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ internal expect object NativeSpeedup {
fun vecRShiftVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
fun vecRShiftScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Int)

fun vecEqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
fun vecEqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
fun vecNeqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
fun vecNeqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
fun vecEqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int, rtol: Double, atol: Double, allowNan: Boolean)
fun vecEqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double, rtol: Double, atol: Double, allowNan: Boolean)
fun vecNeqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int, rtol: Double, atol: Double, allowNan: Boolean)
fun vecNeqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double, rtol: Double, atol: Double, allowNan: Boolean)
fun vecLtVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
fun vecLtScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
fun vecLteVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,10 +277,26 @@ internal open class F64FlatArrayImpl internal constructor(
override fun gtInPlace(other: Double) = transformInPlace { if (it > other) 1.0 else 0.0 }
override fun gteInPlace(other: F64Array) = zipTransformInPlace(other) { a, b -> if (a >= b) 1.0 else 0.0 }
override fun gteInPlace(other: Double) = transformInPlace { if (it >= other) 1.0 else 0.0 }
override fun eqInPlace(other: F64Array) = zipTransformInPlace(other) { a, b -> if (a == b) 1.0 else 0.0 }
override fun eqInPlace(other: Double) = transformInPlace { if (it == other) 1.0 else 0.0 }
override fun neqInPlace(other: F64Array) = zipTransformInPlace(other) { a, b -> if (a != b) 1.0 else 0.0 }
override fun neqInPlace(other: Double) = transformInPlace { if (it != other) 1.0 else 0.0 }
override fun eqInPlace(other: F64Array) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
zipTransformInPlace(other) { a, b -> if (abs(a - b) <= (atol + rtol * abs(b)) || (allowNan && a.isNaN() && b.isNaN())) 1.0 else 0.0 }
}
override fun eqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
transformInPlace { a -> if (abs(a - other) <= (atol + rtol * abs(other)) || (allowNan && a.isNaN())) 1.0 else 0.0 }
}
override fun neqInPlace(other: F64Array) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
zipTransformInPlace(other) { a, b -> if (abs(a - b) <= (atol + rtol * abs(b)) || (allowNan && a.isNaN() && b.isNaN())) 0.0 else 1.0 }
}
override fun neqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
transformInPlace { a -> if (abs(a - other) <= (atol + rtol * abs(other)) || (allowNan && a.isNaN())) 0.0 else 1.0 }
}
override fun isNanInPlace() = transformInPlace { if (it.isNaN()) 1.0 else 0.0 }
override fun isInfInPlace() = transformInPlace { if (it.isInfinite()) 1.0 else 0.0 }
override fun isFiniteInPlace() = transformInPlace { if (it.isFinite()) 1.0 else 0.0 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,22 +129,34 @@ internal class F64LargeDenseFlatArrayImpl(
override fun eqInPlace(other: F64Array) {
if (other is F64LargeDenseFlatArrayImpl) {
checkShape(other)
NativeSpeedup.vecEqVec(data, offset, length, other.data, other.offset)
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
NativeSpeedup.vecEqVec(data, offset, length, other.data, other.offset, rtol, atol, allowNan)
} else {
super.eqInPlace(other)
}
}
override fun eqInPlace(other: Double) = NativeSpeedup.vecEqScalar(data, offset, length, other)
override fun eqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
NativeSpeedup.vecEqScalar(data, offset, length, other, rtol, atol, allowNan)
}

override fun neqInPlace(other: F64Array) {
if (other is F64LargeDenseFlatArrayImpl) {
checkShape(other)
NativeSpeedup.vecNeqVec(data, offset, length, other.data, other.offset)
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan
NativeSpeedup.vecNeqVec(data, offset, length, other.data, other.offset, rtol, atol, allowNan)
} else {
super.neqInPlace(other)
}
}
override fun neqInPlace(other: Double) = NativeSpeedup.vecNeqScalar(data, offset, length, other)
override fun neqInPlace(other: Double) {
val (rtol, atol) = F64Array.tolerance
val allowNan = F64Array.equalNan && other.isNaN()
NativeSpeedup.vecNeqScalar(data, offset, length, other, rtol, atol, allowNan)
}

override fun isNanInPlace() = NativeSpeedup.vecIsNan(data, offset, length)
override fun isInfInPlace() = NativeSpeedup.vecIsInf(data, offset, length)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ internal actual object NativeSpeedup {
actual external fun vecRShiftVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
actual external fun vecRShiftScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Int)

actual external fun vecEqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
actual external fun vecEqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
actual external fun vecNeqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
actual external fun vecNeqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
actual external fun vecEqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int, rtol: Double, atol: Double, allowNan: Boolean)
actual external fun vecEqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double, rtol: Double, atol: Double, allowNan: Boolean)
actual external fun vecNeqVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int, rtol: Double, atol: Double, allowNan: Boolean)
actual external fun vecNeqScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double, rtol: Double, atol: Double, allowNan: Boolean)
actual external fun vecLtVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
actual external fun vecLtScalar(a: DoubleArray, aOffset: Int, aSize: Int, b: Double)
actual external fun vecLteVec(a: DoubleArray, aOffset: Int, aSize: Int, b: DoubleArray, bOffset: Int)
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/avx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::avx>(xsimd::avx, double *, i
template void _vec_rshift_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::avx>(xsimd::avx, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::avx>(xsimd::avx, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/avx2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *,
template void _vec_rshift_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::avx2>(xsimd::avx2, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::avx2>(xsimd::avx2, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/fma3_avx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma
template void _vec_rshift_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::fma3<xsimd::avx>>(xsimd::fma3<xsimd::avx>, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/fma3_avx2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fm
template void _vec_rshift_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::fma3<xsimd::avx2>>(xsimd::fma3<xsimd::avx2>, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/fma3_sse4_2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::
template void _vec_rshift_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::fma3<xsimd::sse4_2>>(xsimd::fma3<xsimd::sse4_2>, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/fma4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *,
template void _vec_rshift_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::fma4>(xsimd::fma4, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::fma4>(xsimd::fma4, double *, double, int);
Expand Down
8 changes: 4 additions & 4 deletions src/lib/arch/neon64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ template void _vec_rshift_scalar::operator()<xsimd::neon64>(xsimd::neon64, doubl
template void _vec_rshift_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int);

// Compare
template void _vec_eq_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int);
template void _vec_eq_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int);
template void _vec_neq_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int);
template void _vec_neq_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int);
template void _vec_eq_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int, double, double, bool);
template void _vec_eq_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int, double, double, bool);
template void _vec_neq_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int, double, double, bool);
template void _vec_neq_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int, double, double, bool);
template void _vec_lt_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int);
template void _vec_lt_vec::operator()<xsimd::neon64>(xsimd::neon64, double *, double *, int);
template void _vec_gt_scalar::operator()<xsimd::neon64>(xsimd::neon64, double *, double, int);
Expand Down
Loading

0 comments on commit 339911f

Please sign in to comment.