public static List <Solution> ContextualEtcAbduction(List <Literal> obs, List <Literal> window, Knowledgebase kb, List <Solution> previous, int maxdepth, int beam, int iteration) { var ln_pr_to_beat = double.NegativeInfinity; var n_best = new List <Solution>(); var n_best_ln_pr = new List <Double>(); foreach (Solution previous_solution in previous) { var previous_solution_jlpr = JointLnProbability(previous_solution); var context = GetContext(previous_solution, obs, kb); var list_of_lists = new List <List <Solution> >(); foreach (Literal c in window) { var remaining = new List <Literal>() { c }; list_of_lists.Add(ContextualAndOrLeaflists(remaining, kb, maxdepth, context, new List <Literal>(), new List <Literal>())); } var combiner = new Combiner(list_of_lists); foreach (Solution s in combiner) { if (BestCaseLnProbability(s) > ln_pr_to_beat) // maybe! { foreach (Solution solution in Abduction.Crunch(s)) { var jlpr = JointLnProbability(solution) + previous_solution_jlpr; //add ln if (jlpr > ln_pr_to_beat) { solution.AddRange(previous_solution); // important! var insert_at = n_best_ln_pr.Count; for (int i = 0; i < n_best_ln_pr.Count; i++) { if (n_best_ln_pr[i] > jlpr) { insert_at = i; break; } } n_best.Insert(insert_at, solution); n_best_ln_pr.Insert(insert_at, jlpr); if (n_best.Count > beam) { n_best.RemoveAt(0); n_best_ln_pr.RemoveAt(0); ln_pr_to_beat = n_best_ln_pr[0]; // second worst [0] is now lowest } } } } } } n_best.Reverse(); // 0 is now highest; var pre = "$" + iteration.ToString() + ":"; var res = new List <Solution>(); foreach (Solution c in n_best) { res.Add(skolemize_with_prefix(c, pre)); } return(res); }
public static List <Solution> NBest(List <Literal> obs, Knowledgebase kb, int maxdepth, int n, bool sk) { var ln_pr_to_beat = double.NegativeInfinity; var n_best = new List <Solution>(); var n_best_ln_pr = new List <Double>(); var list_of_lists = new List <List <Solution> >(); foreach (Literal c in obs) { var remaining = new List <Literal>() { c }; list_of_lists.Add(Abduction.AndOrLeaflists(remaining, kb, maxdepth, new List <Literal>(), new List <Literal>())); } var combiner = new Combiner(list_of_lists); foreach (Solution s in combiner) { if (BestCaseLnProbability(s) > ln_pr_to_beat) { foreach (Solution solution in Abduction.Crunch(s)) { var jpr = JointLnProbability(solution); if (jpr > ln_pr_to_beat) { var insert_at = n_best_ln_pr.Count; for (int i = 0; i < n_best_ln_pr.Count; i++) { if (n_best_ln_pr[i] > jpr) { insert_at = i; break; } } n_best.Insert(insert_at, solution); n_best_ln_pr.Insert(insert_at, jpr); if (n_best.Count > n) { n_best.RemoveAt(0); n_best_ln_pr.RemoveAt(0); //ln_pr_to_beat = jpr; // shouldn't this be the last item instead? ln_pr_to_beat = n_best_ln_pr[0]; // second worst [0] is now lowest } } } } } n_best.Reverse(); // 0 is now highest; if (sk) // skolemize here { var res = new List <Solution>(); foreach (Solution c in n_best) { res.Add(skolemize(c)); } return(res); } else { return(n_best); } }