step: develop jit-bayes loop.

This commit is contained in:
NunoSempere 2023-05-24 15:56:08 -07:00
parent c2e2836df5
commit d70eac48f0
2 changed files with 58 additions and 22 deletions

Binary file not shown.

View File

@ -4,20 +4,10 @@ import sequtils
import std/sugar import std/sugar
import std/algorithm import std/algorithm
## Define type ## Prediction type & helpers.
type prediction = (string, float) type prediction = (string, float)
# string represents a hypothesis, # string represents a hypothesis,
# prediction represents the predictionability mass # 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 = proc comparePredictions (x: prediction, y: prediction): int =
let (_, p1) = x let (_, p1) = x
let (_, p2) = y let (_, p2) = y
@ -33,6 +23,14 @@ proc getHypothesis (t: prediction): string =
let (h, _) = t let (h, _) = t
return h return h
## 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
## Get sequences ## Get sequences
let file_path = "../data/one_to_three" let file_path = "../data/one_to_three"
## let file_path = "../data/stripped" ## let file_path = "../data/stripped"
@ -71,12 +69,12 @@ proc getSequencesWithStart(seqs: seq[seq[string]], start: seq[string]): seq[seq[
return continuations return continuations
## Pretty print sequences ## Pretty print sequences
# var start = @["1", "2", "3", "4", "5"] # var start = @["1", "2", "3", "4", "5"]
# var continuations = getSequencesWithStart(seqs, start) # var continuations = getSequencesWithStart(seqs, start)
# print continuations # print continuations
proc predictContinuation(seqs: seq[seq[string]], observations: seq[string]): seq[prediction] = proc predictContinuation(seqs: seq[seq[string]], observations: seq[string]): seq[prediction] =
let continuations = getSequencesWithStart(seqs, observations) let continuations = getSequencesWithStart(seqs, observations)
let l = observations.len let l = observations.len
var nexts: seq[string] var nexts: seq[string]
@ -121,25 +119,63 @@ proc jitBayesLoop(
initial_num_hypotheses: int, initial_num_hypotheses: int,
num_hypotheses_step: int, num_hypotheses_step: int,
) = ) =
let l = observations.len print "## Prediction with limited number of hypotheses (~JIT-Bayes)"
if n_observations_seen < 1:
echo "in jitBayesLoop function, n_observations_seen must be 1 or greater"
return
var hypotheses = seqs[0..initial_num_hypotheses] var num_hypotheses = initial_num_hypotheses
for i in n_observations_seen..<l: var hypotheses = seqs[0..<num_hypotheses]
let l = observations.len
for i in n_observations_seen..<l: # to do: make so that this can start at 0.
let predictions = predictContinuation(hypotheses, observations[0..<i]) let predictions = predictContinuation(hypotheses, observations[0..<i])
echo "Prediction after seeing ", i, " observations: ", observations[0..<i] echo "### Prediction after seeing ", i, " observations: ", observations[0..<i]
print predictions print predictions
## let possible_continuations = predictions.map() let correct_continuation = observations[i]
let considered_continuations = predictions.map(prediction => getHypothesis(prediction))
let correct_continuation_index = findIndex(considered_continuations, correct_continuation)
if correct_continuation_index == -1:
echo "Correct continuation not found in set of hypotheses of size ", num_hypotheses, "/", seqs.len, ". Increasing size of the set of hypotheses."
var found_concordant_hypothesis = false
var concordant_hypotheses: seq[seq[string]]
while (not found_concordant_hypothesis) and ( num_hypotheses < seqs.len ):
num_hypotheses = num_hypotheses + num_hypotheses_step
if num_hypotheses > seqs.len:
num_hypotheses = seqs.len
hypotheses = seqs[0..<num_hypotheses]
concordant_hypotheses = filter(hypotheses, proc(h: seq[string]): bool = (h.len > i) and h[i] == observations[i])
if concordant_hypotheses.len > 0:
found_concordant_hypothesis = true
if not found_concordant_hypothesis:
echo "Increased number of hypotheses to ", num_hypotheses, ", but didn't find any hypotheses concordant with observations. Giving up."
return
else:
echo "Increased number of hypotheses to ", num_hypotheses, ", and found ", concordant_hypotheses.len, " concordant hypotheses. Continuing"
else:
echo "Correct continuation was ", correct_continuation
echo "It was assigned a probability of ", getProbability(predictions[correct_continuation_index])
echo ""
## Display outputs ## Display outputs
var observations = @["1", "2", "3", "4", "5", "6"] echo ""
echo "Initial sequence", observations
print "Full prediction with access to all hypotheses (~Solomonoff)" ## var observations = @["1", "2", "3", "4", "5", "6"]
var observations = @["1", "2", "3", "109", "5", "6"]
echo "## Full prediction with access to all hypotheses (~Solomonoff)"
echo "## Initial sequence: ", observations
let continuation_probabilities = predictContinuation(seqs, observations) let continuation_probabilities = predictContinuation(seqs, observations)
print continuation_probabilities print continuation_probabilities
echo ""
print "Prediction with limited number of hypotheses (~JIT-Bayes)" jitBayesLoop(seqs, observations, 3, 1_000, 2_000)
jitBayesLoop(seqs, observations, 3, 1_000, 1_000)
echo ""