import print import strutils import sequtils import std/sugar import std/algorithm ## Define type type prediction = (string, float) # string represents a hypothesis, # prediction represents the predictionability mass ## Utils ## Find index (or -1) proc findIndex(xs: seq[string], y: string): int = for i, x in xs: if x == y: return i return -1 ## Do simple predictions proc comparePredictions (x: prediction, y: prediction): int = let (_, p1) = x let (_, p2) = y if p1 < p2: return 1 elif p1 > p2: return -1 else: return 0 proc getProbability (t: prediction): float = let (_, p) = t return p proc getHypothesis (t: prediction): string = let (h, _) = t return h ## Get sequences let file_path = "../data/one_to_three" ## let file_path = "../data/stripped" proc getOEIS(): seq[seq[string]] = let f = open(file_path) var i = 0 var line : string var seqs: seq[seq[string]] while f.read_line(line): if i > 3: let seq = split(line, ",") let l = seq.len let nums = seq[1..(l-2)] seqs.add(nums) i = i + 1 f.close() return seqs var seqs = getOEIS() ## Sequence helpers proc startsWithSubsequence(xs: seq[string], ys: seq[string]): bool = if xs.len == 0: return true elif ys.len == 0: return false elif xs[0] == ys[0]: return startsWithSubsequence(xs[1.. p/sum) var next_and_ps = zip(nexts, ps) sort(next_and_ps, comparePredictions) # ^ sorts in place # also, openArray refers to both arrays and sequences. return next_and_ps ## Predict continuation but without access to all oeis sequences proc predictContinuationWithTruncatedHypotheses(seqs: seq[seq[string]], start: seq[string], num_hypotheses: int): seq[prediction] = let n = if num_hypotheses < seqs.len: num_hypotheses else: seqs.len let truncated_seqs = seqs[0..