import print import strutils import sequtils import std/sugar import std/algorithm ## Get sequences ## let file_path = "../data/stripped" let file_path = "../data/one_to_three" 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.. p2: return -1 else: return 0 proc predictContinuation(seqs: seq[seq[string]], start: seq[string]): seq[(string, float)] = let continuations = getSequencesWithStart(seqs, start) let l = start.len var nexts: seq[string] var ps: seq[float] for c in continuations: let next = c[l] let i = findIndex(nexts, next) if i == -1: nexts.add(next) ps.add(1.0) else: ps[i] = ps[i] + 1.0 let sum = foldl(ps, a + b, 0.0) ps = ps.map( p => p/sum) var next_and_ps = zip(nexts, ps) # next_and_ps = sort(next_and_ps, compareTuple) sort(next_and_ps, compareTuple) # ^ sorts in place # also, openArray refers to both arrays and sequences. return next_and_ps var start = @["1", "2", "3", "4", "5", "6"] echo "Initial sequence", start print "Full prediction with access to all hypotheses:" let continuation_probabilities = predictContinuation(seqs, start) print continuation_probabilities ## Predict continuation but without access to all oeis sequences proc predictContinuationWithTruncatedHypotheses(seqs: seq[seq[string]], start: seq[string], num_hypotheses: int): seq[(string, float)] = let n = if num_hypotheses < seqs.len: num_hypotheses else: seqs.len let truncated_seqs = seqs[0..