Skip to content

Commit

Permalink
Refactor away old, slow substitution code
Browse files Browse the repository at this point in the history
  • Loading branch information
G3Kappa committed May 22, 2024
1 parent d04bfde commit 2b807a5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 29 deletions.
42 changes: 35 additions & 7 deletions Benchmarks/Program.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
using Ergo.Facade;
using Ergo.Interpreter;
using Ergo.Lang;
using Ergo.Lang.Ast;
using Ergo.Runtime;
using System.Diagnostics;

var facade = ErgoFacade.Standard;

int N_BENCHMARKS = 100;
int N_BENCHMARKS = 10;
var times = new List<string[]>();
var interpreter = ErgoBenchmarks.MeasureInterpreterCreation(facade);
var scope = ErgoBenchmarks.MeasureInterpreterScopeCreation(interpreter.Value);
var kb = ErgoBenchmarks.MeasureKnowledgeBaseCreation(scope.Value);
var vm = ErgoBenchmarks.MeasureSpinUpTime(facade, kb.Value);

for (int i = 0; i < N_BENCHMARKS; i++)
{
var interpreter = ErgoBenchmarks.MeasureInterpreterCreation(facade);
var scope = ErgoBenchmarks.MeasureInterpreterScopeCreation(interpreter.Value);
var kb = ErgoBenchmarks.MeasureKnowledgeBaseCreation(scope.Value);
var vm = ErgoBenchmarks.MeasureSpinUpTime(facade, kb.Value);
times.Add([interpreter.Str, scope.Str, kb.Str, vm.Str]);
var query_1 = ErgoBenchmarks.MeasureQueryParseTime(scope.Value, "range(0 <= X < 1000000), Y := X * 10");
var query_1_value = query_1.Value.GetOrThrow();
var query_1_comp = ErgoBenchmarks.MeasureQueryCompileTime(vm.Value, query_1_value);
var query_1_exec = ErgoBenchmarks.MeasureQueryExecutionTime(vm.Value, query_1_comp.Value);
times.Add([query_1.Str, query_1_comp.Str, query_1_exec.Str, query_1_exec.Value.ToString()]);
}

var shell = facade.BuildShell();
shell.WriteTable(["Interpreter", "Int. Scope", "KnowledgeBase", "VM"], times.ToArray());
shell.WriteTable(["Query Parse", "Query Compile", "Query Execute", "Num Solutions"], times.ToArray());


public sealed class ErgoBenchmarks
Expand Down Expand Up @@ -52,6 +57,29 @@ public static Measured<ErgoVM> MeasureSpinUpTime(ErgoFacade facade, KnowledgeBas
return facade.BuildVM(kb);
});
}
public static Measured<Maybe<Query>> MeasureQueryParseTime(InterpreterScope scope, string str)
{
return Measured.Measure(() =>
{
return scope.Parse<Query>(str);
});
}
public static Measured<ErgoVM.Op> MeasureQueryCompileTime(ErgoVM vm, Query query)
{
return Measured.Measure(() =>
{
return vm.CompileQuery(query);
});
}
public static Measured<int> MeasureQueryExecutionTime(ErgoVM vm, ErgoVM.Op op)
{
return Measured.Measure(() =>
{
vm.Query = op;
vm.Run();
return vm.Solutions.Count();
});
}
}
public static class Measured
{
Expand Down
23 changes: 1 addition & 22 deletions Ergo/Lang/Ast/Terms/_Shared/ITerm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,28 +85,7 @@ ITerm Concat(params ITerm[] next)
return new Complex(a, next);
return this;
}

ITerm Substitute(IEnumerable<Substitution> subs)
{
if (IsGround)
return this;
var steps = subs.ToDictionary(s => s.Lhs, s => s.Rhs);
var variables = Variables.Where(var => steps.ContainsKey(var));
var @base = this;
while (variables.Any())
{
foreach (var var in variables)
{
@base = @base.Substitute(new Substitution(var, steps[var]));
}

var newVariables = @base.Variables.Where(var => steps.ContainsKey(var));
if (variables.SequenceEqual(newVariables))
break;
variables = newVariables;
}
return @base;
}
public ITerm Substitute(IEnumerable<Substitution> s) => s.Aggregate(this, (a, b) => a.Substitute(b));

ITerm StripTemporaryVariables() => Substitute(Variables
.Where(v => v.Ignored && v.Name.StartsWith("__"))
Expand Down

0 comments on commit 2b807a5

Please sign in to comment.