def count_raw.go

unified-nsga-iii@0.2.2.0 · survival.bend:300

import unified-nsga-iii@0.2.2.0/survival.bend as Survival
import Base
import unified-nsga-iii@0.2.2.0/util.bend as Util

300# Histogram increments commute. Mid-split asgs, then add count vectors.
301def count_raw.go(+n: Nat, +fuel: Nat, asgs: List<&2, Assignment>) -> List<&2, Nat>:
302  match fuel asgs:
303    case 0n Nil{}:
304      Util.zeros_nat(n)
305    case 0n a <> rest:
306      Util.inc_at(count_raw.go(n, 0n, rest), asg_ref(a))
307    case 1n+p Nil{}:
308      Util.zeros_nat(n)
309    case 1n+p a <> Nil{}:
310      Util.inc_at(Util.zeros_nat(n), asg_ref(a))
311    case 1n+p h <> t:
312      +all = {h <> t : List<&2, Assignment>}
313      +mid = Nat.div(Util.list_len(Assignment, all), 2n)
314      lo hi = count_raw.go(n, p, List.take(&2, Assignment, all, mid)) count_raw.go(n, p, List.drop(&2, Assignment, all, mid))
315      Util.nats_add(lo, hi)

Uses (11)

Used by (1)