Added adjusted (filters out outliers) keypress and slider end times

This commit is contained in:
nise.moe 2024-02-16 06:35:51 +01:00
parent 58513bf3b1
commit e72945c93d
7 changed files with 67 additions and 3 deletions

View File

@ -275,6 +275,28 @@ open class Scores(
*/ */
val SLIDEREND_RELEASE_STANDARD_DEVIATION: TableField<ScoresRecord, Double?> = createField(DSL.name("sliderend_release_standard_deviation"), SQLDataType.DOUBLE, this, "") val SLIDEREND_RELEASE_STANDARD_DEVIATION: TableField<ScoresRecord, Double?> = createField(DSL.name("sliderend_release_standard_deviation"), SQLDataType.DOUBLE, this, "")
/**
* The column <code>public.scores.keypresses_median_adjusted</code>.
*/
val KEYPRESSES_MEDIAN_ADJUSTED: TableField<ScoresRecord, Double?> = createField(DSL.name("keypresses_median_adjusted"), SQLDataType.DOUBLE, this, "")
/**
* The column
* <code>public.scores.keypresses_standard_deviation_adjusted</code>.
*/
val KEYPRESSES_STANDARD_DEVIATION_ADJUSTED: TableField<ScoresRecord, Double?> = createField(DSL.name("keypresses_standard_deviation_adjusted"), SQLDataType.DOUBLE, this, "")
/**
* The column <code>public.scores.sliderend_release_median_adjusted</code>.
*/
val SLIDEREND_RELEASE_MEDIAN_ADJUSTED: TableField<ScoresRecord, Double?> = createField(DSL.name("sliderend_release_median_adjusted"), SQLDataType.DOUBLE, this, "")
/**
* The column
* <code>public.scores.sliderend_release_standard_deviation_adjusted</code>.
*/
val SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED: TableField<ScoresRecord, Double?> = createField(DSL.name("sliderend_release_standard_deviation_adjusted"), SQLDataType.DOUBLE, this, "")
private constructor(alias: Name, aliased: Table<ScoresRecord>?): this(alias, null, null, aliased, null) private constructor(alias: Name, aliased: Table<ScoresRecord>?): this(alias, null, null, aliased, null)
private constructor(alias: Name, aliased: Table<ScoresRecord>?, parameters: Array<Field<*>?>?): this(alias, null, null, aliased, parameters) private constructor(alias: Name, aliased: Table<ScoresRecord>?, parameters: Array<Field<*>?>?): this(alias, null, null, aliased, parameters)

View File

@ -185,6 +185,22 @@ open class ScoresRecord private constructor() : UpdatableRecordImpl<ScoresRecord
set(value): Unit = set(40, value) set(value): Unit = set(40, value)
get(): Double? = get(40) as Double? get(): Double? = get(40) as Double?
open var keypressesMedianAdjusted: Double?
set(value): Unit = set(41, value)
get(): Double? = get(41) as Double?
open var keypressesStandardDeviationAdjusted: Double?
set(value): Unit = set(42, value)
get(): Double? = get(42) as Double?
open var sliderendReleaseMedianAdjusted: Double?
set(value): Unit = set(43, value)
get(): Double? = get(43) as Double?
open var sliderendReleaseStandardDeviationAdjusted: Double?
set(value): Unit = set(44, value)
get(): Double? = get(44) as Double?
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// Primary key information // Primary key information
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@ -194,7 +210,7 @@ open class ScoresRecord private constructor() : UpdatableRecordImpl<ScoresRecord
/** /**
* Create a detached, initialised ScoresRecord * Create a detached, initialised ScoresRecord
*/ */
constructor(id: Int? = null, beatmapId: Int? = null, count_100: Int? = null, count_300: Int? = null, count_50: Int? = null, countMiss: Int? = null, date: LocalDateTime? = null, maxCombo: Int? = null, mods: Int? = null, perfect: Boolean? = null, pp: Double? = null, rank: String? = null, replayAvailable: Boolean? = null, replayId: Long? = null, score: Long? = null, userId: Long? = null, replay: ByteArray? = null, ur: Double? = null, frametime: Double? = null, edgeHits: Int? = null, snaps: Int? = null, isBanned: Boolean? = null, adjustedUr: Double? = null, meanError: Double? = null, errorVariance: Double? = null, errorStandardDeviation: Double? = null, minimumError: Double? = null, maximumError: Double? = null, errorRange: Double? = null, errorCoefficientOfVariation: Double? = null, errorKurtosis: Double? = null, errorSkewness: Double? = null, sentDiscordNotification: Boolean? = null, addedAt: OffsetDateTime? = null, version: Int? = null, keypressesTimes: Array<Double?>? = null, keypressesMedian: Double? = null, keypressesStandardDeviation: Double? = null, sliderendReleaseTimes: Array<Double?>? = null, sliderendReleaseMedian: Double? = null, sliderendReleaseStandardDeviation: Double? = null): this() { constructor(id: Int? = null, beatmapId: Int? = null, count_100: Int? = null, count_300: Int? = null, count_50: Int? = null, countMiss: Int? = null, date: LocalDateTime? = null, maxCombo: Int? = null, mods: Int? = null, perfect: Boolean? = null, pp: Double? = null, rank: String? = null, replayAvailable: Boolean? = null, replayId: Long? = null, score: Long? = null, userId: Long? = null, replay: ByteArray? = null, ur: Double? = null, frametime: Double? = null, edgeHits: Int? = null, snaps: Int? = null, isBanned: Boolean? = null, adjustedUr: Double? = null, meanError: Double? = null, errorVariance: Double? = null, errorStandardDeviation: Double? = null, minimumError: Double? = null, maximumError: Double? = null, errorRange: Double? = null, errorCoefficientOfVariation: Double? = null, errorKurtosis: Double? = null, errorSkewness: Double? = null, sentDiscordNotification: Boolean? = null, addedAt: OffsetDateTime? = null, version: Int? = null, keypressesTimes: Array<Double?>? = null, keypressesMedian: Double? = null, keypressesStandardDeviation: Double? = null, sliderendReleaseTimes: Array<Double?>? = null, sliderendReleaseMedian: Double? = null, sliderendReleaseStandardDeviation: Double? = null, keypressesMedianAdjusted: Double? = null, keypressesStandardDeviationAdjusted: Double? = null, sliderendReleaseMedianAdjusted: Double? = null, sliderendReleaseStandardDeviationAdjusted: Double? = null): this() {
this.id = id this.id = id
this.beatmapId = beatmapId this.beatmapId = beatmapId
this.count_100 = count_100 this.count_100 = count_100
@ -236,6 +252,10 @@ open class ScoresRecord private constructor() : UpdatableRecordImpl<ScoresRecord
this.sliderendReleaseTimes = sliderendReleaseTimes this.sliderendReleaseTimes = sliderendReleaseTimes
this.sliderendReleaseMedian = sliderendReleaseMedian this.sliderendReleaseMedian = sliderendReleaseMedian
this.sliderendReleaseStandardDeviation = sliderendReleaseStandardDeviation this.sliderendReleaseStandardDeviation = sliderendReleaseStandardDeviation
this.keypressesMedianAdjusted = keypressesMedianAdjusted
this.keypressesStandardDeviationAdjusted = keypressesStandardDeviationAdjusted
this.sliderendReleaseMedianAdjusted = sliderendReleaseMedianAdjusted
this.sliderendReleaseStandardDeviationAdjusted = sliderendReleaseStandardDeviationAdjusted
resetChangedOnNotNull() resetChangedOnNotNull()
} }
} }

View File

@ -77,11 +77,15 @@ class CircleguardService {
val keypresses_times: List<Double>?, val keypresses_times: List<Double>?,
val keypresses_median: Double?, val keypresses_median: Double?,
val keypresses_median_adjusted: Double?,
val keypresses_standard_deviation: Double?, val keypresses_standard_deviation: Double?,
val keypresses_standard_deviation_adjusted: Double?,
val sliderend_release_times: List<Double>?, val sliderend_release_times: List<Double>?,
val sliderend_release_median: Double?, val sliderend_release_median: Double?,
val sliderend_release_median_adjusted: Double?,
val sliderend_release_standard_deviation: Double?, val sliderend_release_standard_deviation: Double?,
val sliderend_release_standard_deviation_adjusted: Double?,
val judgements: List<ScoreJudgement> val judgements: List<ScoreJudgement>
) )

View File

@ -31,7 +31,7 @@ class FixOldScores(
@Value("\${OLD_SCORES_PAGE_SIZE:5000}") @Value("\${OLD_SCORES_PAGE_SIZE:5000}")
private var pageSize: Int = 5000 private var pageSize: Int = 5000
val CURRENT_VERSION = 2 val CURRENT_VERSION = 3
private val logger = LoggerFactory.getLogger(javaClass) private val logger = LoggerFactory.getLogger(javaClass)
@ -131,10 +131,14 @@ class FixOldScores(
.set(SCORES.EDGE_HITS, processedReplay.edge_hits) .set(SCORES.EDGE_HITS, processedReplay.edge_hits)
.set(SCORES.KEYPRESSES_TIMES, processedReplay.keypresses_times?.toTypedArray()) .set(SCORES.KEYPRESSES_TIMES, processedReplay.keypresses_times?.toTypedArray())
.set(SCORES.KEYPRESSES_MEDIAN, processedReplay.keypresses_median) .set(SCORES.KEYPRESSES_MEDIAN, processedReplay.keypresses_median)
.set(SCORES.KEYPRESSES_MEDIAN_ADJUSTED, processedReplay.keypresses_median_adjusted)
.set(SCORES.KEYPRESSES_STANDARD_DEVIATION, processedReplay.keypresses_standard_deviation) .set(SCORES.KEYPRESSES_STANDARD_DEVIATION, processedReplay.keypresses_standard_deviation)
.set(SCORES.KEYPRESSES_STANDARD_DEVIATION_ADJUSTED, processedReplay.keypresses_standard_deviation_adjusted)
.set(SCORES.SLIDEREND_RELEASE_TIMES, processedReplay.sliderend_release_times?.toTypedArray()) .set(SCORES.SLIDEREND_RELEASE_TIMES, processedReplay.sliderend_release_times?.toTypedArray())
.set(SCORES.SLIDEREND_RELEASE_MEDIAN, processedReplay.sliderend_release_median) .set(SCORES.SLIDEREND_RELEASE_MEDIAN, processedReplay.sliderend_release_median)
.set(SCORES.SLIDEREND_RELEASE_MEDIAN_ADJUSTED, processedReplay.sliderend_release_median_adjusted)
.set(SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION, processedReplay.sliderend_release_standard_deviation) .set(SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION, processedReplay.sliderend_release_standard_deviation)
.set(SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED, processedReplay.sliderend_release_standard_deviation_adjusted)
.where(SCORES.REPLAY_ID.eq(score.replayId)) .where(SCORES.REPLAY_ID.eq(score.replayId))
.returningResult(SCORES.ID) .returningResult(SCORES.ID)
.fetchOne()?.getValue(SCORES.ID) .fetchOne()?.getValue(SCORES.ID)

View File

@ -64,7 +64,7 @@ class ImportScores(
} }
} }
val CURRENT_VERSION = 2 val CURRENT_VERSION = 3
@Value("\${WEBHOOK_URL}") @Value("\${WEBHOOK_URL}")
private lateinit var webhookUrl: String private lateinit var webhookUrl: String

View File

@ -0,0 +1,5 @@
ALTER TABLE public.scores
ADD COLUMN keypresses_median_adjusted float8,
ADD COLUMN keypresses_standard_deviation_adjusted float8,
ADD COLUMN sliderend_release_median_adjusted float8,
ADD COLUMN sliderend_release_standard_deviation_adjusted float8;

View File

@ -10,6 +10,7 @@ import numpy as np
import scipy import scipy
from brparser import Replay, BeatmapOsu, Mod from brparser import Replay, BeatmapOsu, Mod
from circleguard import Circleguard, ReplayString, Hit from circleguard import Circleguard, ReplayString, Hit
from circleguard.utils import filter_outliers
from flask import Flask, request, jsonify, abort from flask import Flask, request, jsonify, abort
from src.WriteStreamWrapper import WriteStreamWrapper from src.WriteStreamWrapper import WriteStreamWrapper
@ -60,11 +61,15 @@ class ReplayResponse:
keypresses_times: List[int] keypresses_times: List[int]
keypresses_median: float keypresses_median: float
keypresses_median_adjusted: float
keypresses_standard_deviation: float keypresses_standard_deviation: float
keypresses_standard_deviation_adjusted: float
sliderend_release_times: List[int] sliderend_release_times: List[int]
sliderend_release_median: float sliderend_release_median: float
sliderend_release_median_adjusted: float
sliderend_release_standard_deviation: float sliderend_release_standard_deviation: float
sliderend_release_standard_deviation_adjusted: float
judgements: List[Hit] judgements: List[Hit]
@ -174,11 +179,15 @@ def process_replay():
keypresses_times=kp, keypresses_times=kp,
keypresses_median=np.median(kp), keypresses_median=np.median(kp),
keypresses_median_adjusted=np.median(filter_outliers(kp)),
keypresses_standard_deviation=np.std(kp, ddof=1), keypresses_standard_deviation=np.std(kp, ddof=1),
keypresses_standard_deviation_adjusted=np.std(filter_outliers(kp), ddof=1),
sliderend_release_times=se, sliderend_release_times=se,
sliderend_release_median=np.median(se), sliderend_release_median=np.median(se),
sliderend_release_median_adjusted=np.median(filter_outliers(se)),
sliderend_release_standard_deviation=np.std(se, ddof=1), sliderend_release_standard_deviation=np.std(se, ddof=1),
sliderend_release_standard_deviation_adjusted=np.std(filter_outliers(se), ddof=1),
judgements=judgements judgements=judgements
) )