last change, promise

This commit is contained in:
dtookey 2023-09-05 09:54:54 -04:00
parent 28bb5e30e0
commit a985417f83
2 changed files with 10 additions and 10 deletions

View File

@ -6,46 +6,46 @@ import kotlin.math.pow
interface Metric<T: Number> { interface Metric<T: Number> {
val metricName: String val metricName: String
fun mapToMetric(results: List<AttackResult>): T fun computeMetricFromResults(results: List<AttackResult>): T
fun formatResults(result: T): String fun formatResultLabel(result: T): String
fun toResult(results: T): MetricResult { fun toResult(results: T): MetricResult {
return MetricResult(this.metricName, this.formatResults(results), results.toDouble()) return MetricResult(this.metricName, this.formatResultLabel(results), results.toDouble())
} }
} }
private fun Boolean.toInt(): Int = if (this) 1 else 0 private fun Boolean.toInt(): Int = if (this) 1 else 0
class AverageMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Long) : Metric<Double> { class AverageMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Long) : Metric<Double> {
override fun mapToMetric(results: List<AttackResult>): Double { override fun computeMetricFromResults(results: List<AttackResult>): Double {
return results.map(fieldMapFn).average() return results.map(fieldMapFn).average()
} }
override fun formatResults(result: Double): String { override fun formatResultLabel(result: Double): String {
return "$metricName: %.2f".format(result) return "$metricName: %.2f".format(result)
} }
} }
class RateMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Boolean) : Metric<Double> { class RateMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Boolean) : Metric<Double> {
override fun mapToMetric(results: List<AttackResult>): Double { override fun computeMetricFromResults(results: List<AttackResult>): Double {
return results.map(fieldMapFn).map(Boolean::toInt).average() * 100.0 return results.map(fieldMapFn).map(Boolean::toInt).average() * 100.0
} }
override fun formatResults(result: Double): String { override fun formatResultLabel(result: Double): String {
return "$metricName: %.2f".format(result) + "%" return "$metricName: %.2f".format(result) + "%"
} }
} }
class StdDevMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Long) : Metric<Double> { class StdDevMetric(override val metricName: String, private val fieldMapFn: (AttackResult) -> Long) : Metric<Double> {
override fun mapToMetric(results: List<AttackResult>): Double { override fun computeMetricFromResults(results: List<AttackResult>): Double {
val mean = results.map(fieldMapFn).average() val mean = results.map(fieldMapFn).average()
return results.map(fieldMapFn).map { (it - mean).pow(2) }.average().pow(0.5) return results.map(fieldMapFn).map { (it - mean).pow(2) }.average().pow(0.5)
} }
override fun formatResults(result: Double): String { override fun formatResultLabel(result: Double): String {
return "$metricName: %.2f".format(result) return "$metricName: %.2f".format(result)
} }

View File

@ -42,7 +42,7 @@ interface Report {
fun computeResults(results: List<AttackResult>): MetricReport { fun computeResults(results: List<AttackResult>): MetricReport {
val m = ArrayList<MetricResult>(metrics.size) val m = ArrayList<MetricResult>(metrics.size)
metrics.forEach { metrics.forEach {
val value = it.mapToMetric(results) val value = it.computeMetricFromResults(results)
m.add(it.toResult(value)) m.add(it.toResult(value))
} }
return MetricReport(name, m) return MetricReport(name, m)