def _normalisedInPlace(pmf: adhoc) -> adhoc: total = 0 for k, v in pmf._nvs(): if isinstance(v, (float, int)): total += v factor = 1 / total for k, v in pmf._nvs(): if isinstance(v, (float, int)): pmf[k] = v * factor return pmf
def subset(a:adhoc, f2:pyfunc) -> pytuple: A, B = adhoc(), adhoc() for k, v in a._nvs(): if f2(k, v): A[k] = v else: B[k] = v return A, B
def override(a:adhoc, b:adhoc) -> adhoc: answer = adhoc(a) answer._update(b._nvs()) return answer
def sort(x: adhoc) -> adhoc: return adhoc(sorted(x._nvs(), key=None, reverse=False))
def where(s:adhoc, bools) -> adhoc: assert isinstance(s, adhoc) answer = adhoc(s) for f, v in s._nvs(): answer[f] = v[bools].view(tvarray) return answer
def rename(d:adhoc, old, new): d = adhoc(d) d[new] = d._pop(old) return d
def values(x:adhoc) -> pylist: return list(x._values())
def nvs(x:adhoc) -> pydict_items: return x._nvs()
def names(s:adhoc) -> pydict_keys: return s._names()
def select(d: adhoc, f2) -> adhoc: filteredKVs = [] for k, v in d._nvs(): if f2(k, v): filteredKVs.append((k, v)) return adhoc(filteredKVs)
def sameNames(a:adhoc, b:adhoc) -> pybool: return a._names() == b._names()
def inject(s:adhoc, seed, f3): prior = seed for f, v in s._nvs(): prior = f3(prior, f, v) return prior
def eachV(a:adhoc, fn1) -> pylist: answer = list() for v in a._values(): answer.append(fn1(v)) return answer
def each(a:adhoc, fn2) -> adhoc: answer = adhoc() for f, v in a._nvs(): answer[f] = fn2(f, v) return answer
def to(x: adhoc, t: pydict) -> pydict: return dict(x._nvs())