From da8e41a8ffd186948b57900273ac4a92ee26bdb6 Mon Sep 17 00:00:00 2001 From: "andrei.kislitsyn" Date: Tue, 18 Feb 2025 14:11:44 +0400 Subject: [PATCH 1/2] remove median public extensions --- .../kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt | 4 ++-- .../kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt index ccc8859fb5..8ba1366734 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull -import org.jetbrains.kotlinx.dataframe.math.medianOrNull +import org.jetbrains.kotlinx.dataframe.math.median import kotlin.reflect.KProperty // region DataColumn @@ -45,7 +45,7 @@ public fun AnyRow.rowMedianOrNull(): Any? = public fun AnyRow.rowMedian(): Any = rowMedianOrNull().suggestIfNull("rowMedian") -public inline fun > AnyRow.rowMedianOfOrNull(): T? = valuesOf().medianOrNull() +public inline fun > AnyRow.rowMedianOfOrNull(): T? = valuesOf().median() public inline fun > AnyRow.rowMedianOf(): T = rowMedianOfOrNull().suggestIfNull("rowMedianOf") diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt index 7fe4df949b..263405e7d6 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt @@ -6,14 +6,10 @@ import java.math.BigInteger import kotlin.reflect.KType import kotlin.reflect.typeOf -public inline fun > Iterable.medianOrNull(): T? = median(typeOf()) - -public inline fun > Iterable.median(): T = medianOrNull()!! - // TODO median always returns the same type, but this can be confusing for iterables of even length // TODO (e.g. median of [1, 2] should be 1.5, but the type is Int, so it returns 1), Issue #558 @PublishedApi -internal inline fun > Iterable.median(type: KType): T? { +internal inline fun > Iterable.median(type: KType = typeOf()): T? { val list = if (type.isMarkedNullable) filterNotNull() else (this as Iterable).asList() val size = list.size if (size == 0) return null From 148560749ed2e5734f7e948cf57266c933292aff Mon Sep 17 00:00:00 2001 From: "andrei.kislitsyn" Date: Tue, 18 Feb 2025 14:26:01 +0400 Subject: [PATCH 2/2] remove public statistical extensions --- core/api/core.api | 53 ------------------- .../jetbrains/kotlinx/dataframe/api/median.kt | 1 + .../kotlinx/dataframe/api/percentile.kt | 4 +- .../jetbrains/kotlinx/dataframe/math/mean.kt | 20 +++---- .../kotlinx/dataframe/math/median.kt | 10 +--- .../kotlinx/dataframe/math/percentile.kt | 25 ++------- .../jetbrains/kotlinx/dataframe/math/std.kt | 13 ++--- .../kotlinx/dataframe/math/stdMean.kt | 16 +++--- 8 files changed, 34 insertions(+), 108 deletions(-) diff --git a/core/api/core.api b/core/api/core.api index fa71b6b95a..fe11e63730 100644 --- a/core/api/core.api +++ b/core/api/core.api @@ -10796,39 +10796,9 @@ public final class org/jetbrains/kotlinx/dataframe/jupyter/RenderedContent$Compa public final fun truncatedText (Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/kotlinx/dataframe/jupyter/RenderedContent; } -public final class org/jetbrains/kotlinx/dataframe/math/BasicStats { - public fun (IDD)V - public final fun component1 ()I - public final fun component2 ()D - public final fun component3 ()D - public final fun copy (IDD)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static synthetic fun copy$default (Lorg/jetbrains/kotlinx/dataframe/math/BasicStats;IDDILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public fun equals (Ljava/lang/Object;)Z - public final fun getCount ()I - public final fun getMean ()D - public final fun getVariance ()D - public fun hashCode ()I - public final fun std (I)D - public fun toString ()Ljava/lang/String; -} - public final class org/jetbrains/kotlinx/dataframe/math/MeanKt { - public static final fun bigDecimalMean (Ljava/lang/Iterable;)D - public static final fun bigIntegerMean (Ljava/lang/Iterable;)D - public static final fun byteMean (Ljava/lang/Iterable;)D - public static final fun doubleMean (Ljava/lang/Iterable;Z)D - public static synthetic fun doubleMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)D - public static final fun floatMean (Ljava/lang/Iterable;Z)D - public static synthetic fun floatMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)D - public static final fun intMean (Ljava/lang/Iterable;)D - public static final fun longMean (Ljava/lang/Iterable;)D public static final fun mean (Ljava/lang/Iterable;Lkotlin/reflect/KType;Z)D - public static final fun mean (Lkotlin/sequences/Sequence;Z)D public static synthetic fun mean$default (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZILjava/lang/Object;)D - public static synthetic fun mean$default (Lkotlin/sequences/Sequence;ZILjava/lang/Object;)D - public static final fun meanFloat (Lkotlin/sequences/Sequence;Z)D - public static synthetic fun meanFloat$default (Lkotlin/sequences/Sequence;ZILjava/lang/Object;)D - public static final fun shortMean (Ljava/lang/Iterable;)D } public final class org/jetbrains/kotlinx/dataframe/math/PercentileKt { @@ -10836,33 +10806,10 @@ public final class org/jetbrains/kotlinx/dataframe/math/PercentileKt { } public final class org/jetbrains/kotlinx/dataframe/math/StdKt { - public static final fun bigDecimalStd (Ljava/lang/Iterable;I)D - public static synthetic fun bigDecimalStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D - public static final fun bigIntegerStd (Ljava/lang/Iterable;I)D - public static synthetic fun bigIntegerStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D - public static final fun doubleStd (Ljava/lang/Iterable;ZI)D - public static synthetic fun doubleStd$default (Ljava/lang/Iterable;ZIILjava/lang/Object;)D - public static final fun floatStd (Ljava/lang/Iterable;ZI)D - public static synthetic fun floatStd$default (Ljava/lang/Iterable;ZIILjava/lang/Object;)D - public static final fun intStd (Ljava/lang/Iterable;I)D - public static synthetic fun intStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D - public static final fun longStd (Ljava/lang/Iterable;I)D - public static synthetic fun longStd$default (Ljava/lang/Iterable;IILjava/lang/Object;)D public static final fun std (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZI)D public static synthetic fun std$default (Ljava/lang/Iterable;Lkotlin/reflect/KType;ZIILjava/lang/Object;)D } -public final class org/jetbrains/kotlinx/dataframe/math/StdMeanKt { - public static final fun bigDecimalVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static final fun bigIntegerVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static final fun doubleVarianceAndMean (Ljava/lang/Iterable;Z)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static synthetic fun doubleVarianceAndMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static final fun floatVarianceAndMean (Ljava/lang/Iterable;Z)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static synthetic fun floatVarianceAndMean$default (Ljava/lang/Iterable;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static final fun intVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; - public static final fun longVarianceAndMean (Ljava/lang/Iterable;)Lorg/jetbrains/kotlinx/dataframe/math/BasicStats; -} - public final class org/jetbrains/kotlinx/dataframe/math/SumKt { public static final fun sum (Ljava/lang/Iterable;)Ljava/math/BigDecimal; public static final fun sum (Ljava/lang/Iterable;)Ljava/math/BigInteger; diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt index 8ba1366734..f2cdbb390e 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/median.kt @@ -82,6 +82,7 @@ public fun > DataFrame.median(vararg columns: ColumnRefe public fun > DataFrame.median(vararg columns: KProperty): C = median { columns.toColumnSet() } +@Suppress("UNCHECKED_CAST") public fun > DataFrame.medianOrNull(columns: ColumnsSelector): C? = Aggregators.median.aggregateAll(this, columns) as C? diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/percentile.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/percentile.kt index 358a23fb96..34c482612d 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/percentile.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/percentile.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.aggregateOf import org.jetbrains.kotlinx.dataframe.impl.aggregation.modes.of import org.jetbrains.kotlinx.dataframe.impl.columns.toComparableColumns import org.jetbrains.kotlinx.dataframe.impl.suggestIfNull -import org.jetbrains.kotlinx.dataframe.math.percentileOrNull +import org.jetbrains.kotlinx.dataframe.math.percentile import kotlin.reflect.KProperty // region DataColumn @@ -53,7 +53,7 @@ public fun AnyRow.rowPercentile(percentile: Double): Any = rowPercentileOrNull(percentile).suggestIfNull("rowPercentile") public inline fun > AnyRow.rowPercentileOfOrNull(percentile: Double): T? = - valuesOf().percentileOrNull(percentile) + valuesOf().percentile(percentile) public inline fun > AnyRow.rowPercentileOf(percentile: Double): T = rowPercentileOfOrNull(percentile).suggestIfNull("rowPercentileOf") diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/mean.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/mean.kt index 40fe9bbce1..a1ab845624 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/mean.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/mean.kt @@ -43,7 +43,7 @@ internal fun Sequence.mean(type: KType, skipNA: Boolean = skipNA } } -public fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { +internal fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { var count = 0 var sum: Double = 0.toDouble() for (element in this) { @@ -61,7 +61,7 @@ public fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { } @JvmName("meanFloat") -public fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { +internal fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { var count = 0 var sum: Double = 0.toDouble() for (element in this) { @@ -79,13 +79,13 @@ public fun Sequence.mean(skipNA: Boolean = skipNA_default): Double { } @JvmName("doubleMean") -public fun Iterable.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA) +internal fun Iterable.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA) @JvmName("floatMean") -public fun Iterable.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA) +internal fun Iterable.mean(skipNA: Boolean = skipNA_default): Double = asSequence().mean(skipNA) @JvmName("intMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sumOf { it.toDouble() } / size else Double.NaN } else { @@ -98,7 +98,7 @@ public fun Iterable.mean(): Double = } @JvmName("shortMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sumOf { it.toDouble() } / size else Double.NaN } else { @@ -111,7 +111,7 @@ public fun Iterable.mean(): Double = } @JvmName("byteMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sumOf { it.toDouble() } / size else Double.NaN } else { @@ -124,7 +124,7 @@ public fun Iterable.mean(): Double = } @JvmName("longMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sumOf { it.toDouble() } / size else Double.NaN } else { @@ -138,7 +138,7 @@ public fun Iterable.mean(): Double = // TODO result is Double, but should be BigDecimal, Issue #558 @JvmName("bigIntegerMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sumOf { it.toDouble() } / size else Double.NaN } else { @@ -152,7 +152,7 @@ public fun Iterable.mean(): Double = // TODO result is Double, but should be BigDecimal, Issue #558 @JvmName("bigDecimalMean") -public fun Iterable.mean(): Double = +internal fun Iterable.mean(): Double = if (this is Collection) { if (size > 0) sum().toDouble() / size else Double.NaN } else { diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt index f3ce349069..42756681e2 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/median.kt @@ -1,16 +1,10 @@ package org.jetbrains.kotlinx.dataframe.math -import org.jetbrains.kotlinx.dataframe.impl.asList -import java.math.BigDecimal -import java.math.BigInteger import kotlin.reflect.KType import kotlin.reflect.typeOf -public inline fun > Iterable.medianOrNull(): T? = median(typeOf()) - -public inline fun > Iterable.median(): T = medianOrNull()!! - // TODO median always returns the same type, but this can be confusing for iterables of even length // TODO (e.g. median of [1, 2] should be 1.5, but the type is Int, so it returns 1), Issue #558 @PublishedApi -internal inline fun > Iterable.median(type: KType): T? = percentile(50.0, type) +internal inline fun > Iterable.median(type: KType = typeOf()): T? = + percentile(50.0, type) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/percentile.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/percentile.kt index cd27c4b150..97dbe611f0 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/percentile.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/percentile.kt @@ -6,28 +6,11 @@ import java.math.BigInteger import kotlin.reflect.KType import kotlin.reflect.typeOf -public inline fun > Iterable.percentileOrNull(percentile: Double): T? = - percentile(percentile, typeOf()) - -public inline fun > Iterable.percentile(percentile: Double): T = - percentileOrNull(percentile)!! - -public inline fun > Iterable.q1OrNull(): T? = q1(typeOf()) - -public inline fun > Iterable.q1(): T = q1OrNull()!! - -public inline fun > Iterable.q3OrNull(): T? = q3(typeOf()) - -public inline fun > Iterable.q3(): T = q3OrNull()!! - -@PublishedApi -internal inline fun > Iterable.q1(type: KType): T? = percentile(25.0, type) - -@PublishedApi -internal inline fun > Iterable.q3(type: KType): T? = percentile(75.0, type) - @PublishedApi -internal inline fun > Iterable.percentile(percentile: Double, type: KType): T? { +internal inline fun > Iterable.percentile( + percentile: Double, + type: KType = typeOf(), +): T? { require(percentile in 0.0..100.0) { "Percentile must be in range [0, 100]" } @Suppress("UNCHECKED_CAST") diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/std.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/std.kt index ab38f8c9c0..052556ba59 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/std.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/std.kt @@ -8,6 +8,7 @@ import java.math.BigInteger import kotlin.reflect.KType import kotlin.reflect.full.withNullability +@Suppress("UNCHECKED_CAST") @PublishedApi internal fun Iterable.std( type: KType, @@ -35,21 +36,21 @@ internal fun Iterable.std( } @JvmName("doubleStd") -public fun Iterable.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double = +internal fun Iterable.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double = varianceAndMean(skipNA)?.std(ddof) ?: Double.NaN @JvmName("floatStd") -public fun Iterable.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double = +internal fun Iterable.std(skipNA: Boolean = skipNA_default, ddof: Int = ddof_default): Double = varianceAndMean(skipNA)?.std(ddof) ?: Double.NaN @JvmName("intStd") -public fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) +internal fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) @JvmName("longStd") -public fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) +internal fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) @JvmName("bigDecimalStd") -public fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) +internal fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) @JvmName("bigIntegerStd") -public fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) +internal fun Iterable.std(ddof: Int = ddof_default): Double = varianceAndMean().std(ddof) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/stdMean.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/stdMean.kt index 8deb8c1eff..b9276c62a4 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/stdMean.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/math/stdMean.kt @@ -7,16 +7,16 @@ import java.math.BigDecimal import java.math.BigInteger import kotlin.math.sqrt -public data class BasicStats(val count: Int, val mean: Double, val variance: Double) { +internal data class BasicStats(val count: Int, val mean: Double, val variance: Double) { - public fun std(ddof: Int): Double { + fun std(ddof: Int): Double { if (count <= ddof) return Double.NaN return sqrt(variance / (count - ddof)) } } @JvmName("doubleVarianceAndMean") -public fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? { +internal fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? { var count = 0 var sum = .0 for (element in this) { @@ -41,7 +41,7 @@ public fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): B } @JvmName("floatVarianceAndMean") -public fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? { +internal fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): BasicStats? { var count = 0 var sum = .0 for (element in this) { @@ -66,7 +66,7 @@ public fun Iterable.varianceAndMean(skipNA: Boolean = skipNA_default): Ba } @JvmName("intVarianceAndMean") -public fun Iterable.varianceAndMean(): BasicStats { +internal fun Iterable.varianceAndMean(): BasicStats { var count = 0 var sum = .0 for (element in this) { @@ -83,7 +83,7 @@ public fun Iterable.varianceAndMean(): BasicStats { } @JvmName("longVarianceAndMean") -public fun Iterable.varianceAndMean(): BasicStats { +internal fun Iterable.varianceAndMean(): BasicStats { var count = 0 var sum = .0 for (element in this) { @@ -100,7 +100,7 @@ public fun Iterable.varianceAndMean(): BasicStats { } @JvmName("bigDecimalVarianceAndMean") -public fun Iterable.varianceAndMean(): BasicStats { +internal fun Iterable.varianceAndMean(): BasicStats { var count = 0 var sum = BigDecimal.ZERO for (element in this) { @@ -117,7 +117,7 @@ public fun Iterable.varianceAndMean(): BasicStats { } @JvmName("bigIntegerVarianceAndMean") -public fun Iterable.varianceAndMean(): BasicStats { +internal fun Iterable.varianceAndMean(): BasicStats { var count = 0 var sum = BigInteger.ZERO for (element in this) {