Skip to content

Commit da14026

Browse files
authored
Update median implementation (#304)
1 parent d57b74d commit da14026

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

source/mir/math/stat.d

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import core.lifetime: move;
2222
import mir.internal.utility: isFloatingPoint;
2323
import mir.math.common: fmamath;
2424
import mir.math.sum;
25-
import mir.ndslice.slice: Slice, SliceKind;
25+
import mir.ndslice.slice: Slice, SliceKind, hasAsSlice;
2626
import mir.primitives;
2727
import std.traits: Unqual, isArray, isMutable, isIterable, isIntegral, CommonType;
2828

@@ -1318,6 +1318,28 @@ template median(bool allowModify = false)
13181318
}
13191319
}
13201320

1321+
/++
1322+
Params:
1323+
ar = array
1324+
+/
1325+
meanType!(T[]) median(T)(scope const T[] ar...)
1326+
{
1327+
import mir.ndslice.slice: sliced;
1328+
1329+
alias F = typeof(return);
1330+
return median!(F, false)(ar.sliced);
1331+
}
1332+
1333+
/++
1334+
Params:
1335+
withAsSlice = input that satisfies hasAsSlice
1336+
+/
1337+
auto median(T)(T withAsSlice)
1338+
if (hasAsSlice!T)
1339+
{
1340+
return median(withAsSlice.asSlice);
1341+
}
1342+
13211343
/// Median of vector
13221344
version(mir_test)
13231345
@safe pure nothrow
@@ -1332,6 +1354,18 @@ unittest
13321354
assert(x1.median == 5);
13331355
}
13341356

1357+
/// Median of dynamic array
1358+
version(mir_test)
1359+
@safe pure nothrow
1360+
unittest
1361+
{
1362+
auto x0 = [9.0, 1, 0, 2, 3, 4, 6, 8, 7, 10, 5];
1363+
assert(x0.median == 5);
1364+
1365+
auto x1 = [9.0, 1, 0, 2, 3, 4, 6, 8, 7, 10];
1366+
assert(x1.median == 5);
1367+
}
1368+
13351369
/// Median of matrix
13361370
version(mir_test)
13371371
@safe pure
@@ -1384,6 +1418,15 @@ unittest
13841418
assert(x1.median!(float, true) == 5);
13851419
}
13861420

1421+
/// Arbitrary median
1422+
version(mir_test)
1423+
@safe pure nothrow
1424+
unittest
1425+
{
1426+
assert(median(0, 1, 2, 3, 4) == 2);
1427+
}
1428+
1429+
// @nogc test
13871430
version(mir_test)
13881431
@safe pure nothrow @nogc
13891432
unittest
@@ -1411,6 +1454,7 @@ unittest
14111454
static assert(is(typeof(y) == double));
14121455
}
14131456

1457+
// additional logic tests
14141458
version(mir_test)
14151459
@safe pure nothrow
14161460
unittest
@@ -1461,6 +1505,7 @@ unittest
14611505
assert(x.median!float.approxEqual(2.5));
14621506
}
14631507

1508+
// smallMedianImpl tests
14641509
version(mir_test)
14651510
@safe pure nothrow
14661511
unittest
@@ -1534,6 +1579,7 @@ F smallMedianImpl(F, Iterator)(Slice!Iterator slice)
15341579
}
15351580
}
15361581

1582+
// smallMedianImpl tests
15371583
version(mir_test)
15381584
@safe pure nothrow
15391585
unittest

0 commit comments

Comments
 (0)