Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Lane 2 · kotlin-core] Precision/Recall/F1 — Averaging enum + internal ConfusionMatrixAccumulator

Open
#1,226 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
Half a day
Newbie friendliness
48/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Quiet
Tech stack
kotlin

Research direction

First read Accuracy.kt, the helpers from #1225, and the contract decisions in #1224; this issue is blocked on both. Implement the public Averaging enum and the internal accumulator and reducer in sk.ainet.lang.nn.metrics, then test the reducer’s modes and zero-division case. Run ./gradlew :skainet-lang:skainet-lang-core:apiDump; done means the API dump adds Averaging only and the fixture produces the specified counts.

Written by the indexing model from the issue text.

Description

coding size:s skill:kotlin-core sub-issue training

Sub-issue of #1222 (Precision, Recall and F1Score metrics).

Lane: 2 · Kotlin core
Skill needed: Kotlin; read Accuracy.kt and the helpers from #1225 first.
Size: s (~3–4 h)
Blocked by: #1225 (helpers) and the contract decisions from #1224 (zero-division, macro class set, binary mode).

What to do

  1. Add public enum class Averaging { BINARY, MACRO, MICRO } in
    sk.ainet.lang.nn.metrics (own file, KDoc on each value — this is public API).
    Semantics per #1224; the working definitions are:
    • BINARY — report class 1 (the positive class) only; requires ≤ 2 classes;
    • MACRO — unweighted mean of the per-class value over the class set decided in #1224;
    • MICRO — pool TP / FP / FN over all classes, then apply the formula once.
  2. Add internal class ConfusionMatrixAccumulator(dim: Int = -1, threshold: Float? = null)
    with
    • fun <T : DType, V> update(predictions: Tensor<T, V>, targets: Tensor<out DType, *>)
      — walks every sample via the #1225 helper and increments per-class tp / fp / fn
      (Long counters keyed by class index; a wrong prediction is one FP for the predicted
      class and one FN for the target class);
    • fun counts(): Map<Int, ClassCounts> (a small internal data class ClassCounts(tp, fp, fn));
    • fun reset().
  3. Add internal fun reduce(counts, averaging, perClass: (tp: Long, fp: Long, fn: Long) -> Double): Double
    implementing the three averaging modes and the zero-division convention from #1224
    in one place, so Precision, Recall and F1Score each contribute only a formula.
  4. Tests: the accumulator is internal to skainet-lang-core, and the metric tests live
    in skainet-backend-cpu (they need DirectCpuExecutionContext to build tensors). Two
    options — pick one and say which in the PR:
    • test it through Precision / Recall in #1227 / #1228 (then this PR ships
      with a reduce() unit test only, which needs no tensors), or
    • put an accumulator test in skainet-lang-core's commonTest, building tensors with
      DenseTensorDataFactory().fromFloatArray(...) + SimpleTensor(...) the way
      OperationExecutor.createTensor does.
  5. ./gradlew :skainet-lang:skainet-lang-core:apiDump — the dump gains Averaging and
    nothing else.

Acceptance

  • Averaging public, documented, in the API dump
  • ConfusionMatrixAccumulator + reduce() internal, no public surface
  • reduce() tested for macro / micro / binary and the zero-division case
  • Reference fixture from #1224 (pred [2,0,1,2], target [2,1,1,0]) yields counts
    {0: (0,1,1), 1: (1,0,1), 2: (1,1,0)} as (tp, fp, fn)

Notes

Don't build Precision / Recall / F1Score here even though it's tempting — they are
separate good first issues (#1227, #1228, #1229) precisely so three people can each
ship one small PR against this accumulator.

Dominant language
Kotlin
Stars
52
Forks
15
Avg merge
1d 15h
Merged PRs (30d)
36

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from SKaiNET-developers/SKaiNET

All issues in SKaiNET-developers/SKaiNET

Similar issues

More Kotlin issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.