public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { String asrt = ""; if (params_Renamed.Length > 0) { Deffact fact = null; if (params_Renamed[0].Value is Deffact) { fact = (Deffact)params_Renamed[0].Value; } else { Deftemplate tmpl = (Deftemplate)engine.CurrentFocus.getTemplate(params_Renamed[0].StringValue); if (tmpl == null) { throw new AssertException("Deftemplate named " + params_Renamed[0].StringValue + " was not found."); } fact = (Deffact)tmpl.createFact((Object[])params_Renamed[1].Value, -1); } if (fact.hasBinding()) { fact.resolveValues(engine, triggerFacts); fact = fact.cloneFact(); } try { engine.assertFact(fact); // if the fact id is still -1, it means it wasn't asserted // if it was asserted, we return the fact id, otherwise // we return "false". if (fact.FactId > 0) { asrt = fact.FactId.ToString(); } else { asrt = "false"; } } catch (AssertException e) { // we should log this and output an error asrt = "false"; } } else { asrt = "false"; } DefaultReturnVector ret = new DefaultReturnVector(); DefaultReturnValue rv = new DefaultReturnValue(Constants.STRING_TYPE, asrt); ret.addReturnValue(rv); return(ret); }
public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { DefaultReturnVector rv = new DefaultReturnVector(); if (params_Renamed != null && params_Renamed.Length >= 1) { for (int idx = 0; idx < params_Renamed.Length; idx++) { if (params_Renamed[idx] is BoundParam) { BoundParam bp = (BoundParam)params_Renamed[idx]; Deffact fact = (Deffact)bp.Fact; try { if (bp.ObjectBinding) { engine.retractObject(fact.ObjectInstance); } else { engine.retractFact(fact); } DefaultReturnValue rval = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, true); rv.addReturnValue(rval); } catch (RetractException e) { DefaultReturnValue rval = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, false); rv.addReturnValue(rval); } } else if (params_Renamed[idx] is ValueParam) { Decimal bi = params_Renamed[idx].BigDecimalValue; try { engine.retractById(Decimal.ToInt64(bi)); DefaultReturnValue rval = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, true); rv.addReturnValue(rval); } catch (RetractException e) { DefaultReturnValue rval = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, false); rv.addReturnValue(rval); } } } } return(rv); }
public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { bool exec = false; if (engine != null && params_Renamed != null && params_Renamed.Length >= 2 && params_Renamed[0].ObjectBinding) { BoundParam bp = (BoundParam)params_Renamed[0]; Deffact fact = (Deffact)bp.Fact; try { // first retract the fact engine.retractFact(fact); // now modify the fact SlotParam[] sp = new SlotParam[params_Renamed.Length - 1]; for (int idx = 0; idx < sp.Length; idx++) { IParameter p = params_Renamed[idx + 1]; if (p is SlotParam) { sp[idx] = (SlotParam)p; } } fact.updateSlots(engine, convertToSlots(sp, fact.Deftemplate)); if (fact.hasBinding()) { fact.resolveValues(engine, triggerFacts); fact = fact.cloneFact(); } // now assert the fact using the same fact-id engine.assertFact(fact); exec = true; } catch (RetractException e) { engine.writeMessage(e.Message); } catch (AssertException e) { engine.writeMessage(e.Message); } } DefaultReturnVector rv = new DefaultReturnVector(); DefaultReturnValue rval = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, exec); rv.addReturnValue(rval); return(rv); }
/// <summary> Configure will lookup the function and set it /// </summary> public virtual void configure(Rete.Rete engine, IRule util) { if (functionName != null && engine.findFunction(functionName) != null) { faction = engine.findFunction(functionName); } // now setup the BoundParameters if there are any for (int idx = 0; idx < parameters.Length; idx++) { if (parameters[idx] is BoundParam) { BoundParam bp = (BoundParam)parameters[idx]; Binding bd = util.getBinding(bp.VariableName); if (bd != null) { bp.Row = bd.LeftRow; bp.Column = bd.LeftIndex; } } else if (parameters[idx] is FunctionParam2) { FunctionParam2 fp2 = (FunctionParam2)parameters[idx]; fp2.configure(engine, util); } else if (parameters[idx] is ValueParam) { ValueParam vp = (ValueParam)parameters[idx]; // if the value is a deffact, we need to check and make sure // the slots with BoundParam value are compiled properly if (vp.Value is Deffact) { ((Deffact)vp.Value).compileBinding(util); } } } // in the case of Assert, we do further compilation if (faction is AssertFunction) { Deftemplate tmpl = (Deftemplate)engine.CurrentFocus.getTemplate(parameters[0].StringValue); Deffact fact = (Deffact)tmpl.createFact((Object[])parameters[1].Value, -1); fact.compileBinding(util); parameters = new ValueParam[1]; parameters[0] = new ValueParam(Constants.OBJECT_TYPE, fact); } }
public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { bool saved = false; bool sortid = true; DefaultReturnVector rv = new DefaultReturnVector(); if (params_Renamed != null && params_Renamed.Length >= 1) { if (params_Renamed[1] != null && params_Renamed[1].StringValue.Equals("template")) { sortid = false; } try { StreamWriter writer = new StreamWriter(params_Renamed[0].StringValue); System.Collections.Generic.IList <Object> facts = engine.AllFacts; Object[] sorted = null; if (sortid) { sorted = FactUtils.sortFacts(facts); } else { sorted = FactUtils.sortFactsByTemplate(facts); } for (int idx = 0; idx < sorted.Length; idx++) { Deffact ft = (Deffact)sorted[idx]; writer.Write(ft.toPPString() + Constants.LINEBREAK); } writer.Close(); saved = true; } catch (IOException e) { // we should log this } } DefaultReturnValue drv = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, saved); rv.addReturnValue(drv); return(rv); }
public virtual String toPPString(IParameter[] params_Renamed, int indents) { if (params_Renamed != null && params_Renamed.Length > 0) { StringBuilder buf = new StringBuilder(); buf.Append("(assert-temporal "); for (int idx = 0; idx < params_Renamed.Length; idx++) { // the parameter should be a deffact Deffact fact = (Deffact)params_Renamed[idx].Value; buf.Append(fact.toPPString()); } buf.Append(" )"); return(buf.ToString()); } else { return("(assert-temporal [deffact])"); } }
public static void main(String[] args) { String rulefile = "./benchmark_files/4K_rules_50Kdata_sequential.clp"; //String datafile = "./benchmark_files/test.clp"; //bool keepopen = false; if (args != null && args.Length > 0) { rulefile = args[0]; } //if (args.Length >= 2) //{ // if (args[1].Equals("true", StringComparison.InvariantCultureIgnoreCase)) // { // keepopen = true; // } //} Console.WriteLine("Using file " + rulefile); MemoryBenchmark2 mb = new MemoryBenchmark2(); long begin = DateTime.Now.Ticks; long totalET = 0; long parseET = 0; ArrayList facts = new ArrayList(50000); // Runtime rt = Runtime.getRuntime(); long total1 = GC.GetTotalMemory(true); //long free1 = rt.freeMemory(); //long used1 = total1 - free1; int loopcount = 5; Console.WriteLine("Used memory before creating engine " + total1 + " bytes " + (total1 / 1024) + " Kb"); for (int loop = 0; loop < loopcount; loop++) { Console.WriteLine(" ---------------------------------- "); Rete engine = new Rete(); facts.Clear(); long total2 = GC.GetTotalMemory(true); //long free2 = rt.freeMemory(); //long used2 = total2 - free2; Console.WriteLine("Used memory after creating engine " + total2 + " bytes " + (total2 / 1024) + " Kb"); try { StreamReader freader = new StreamReader(rulefile); CLIPSParser parser = new CLIPSParser(engine, freader); long start = DateTime.Now.Ticks; mb.parse(engine, parser, facts); long end = DateTime.Now.Ticks; long el = end - start; parser.close(); //rt.gc(); parseET += el; long total3 = GC.GetTotalMemory(true); //long free3 = rt.freeMemory(); //long used3 = total3 - free3; Console.WriteLine("Used memory after loading rules, and parsing data " + (total3 / 1024) + " Kb " + (total3 / 1024 / 1024) + " Mb"); Console.WriteLine("elapsed time to parse the rules and data " + el + " ms"); Console.WriteLine("Number of rules: " + engine.CurrentFocus.RuleCount); // now assert the facts IEnumerator itr = facts.GetEnumerator(); long start2 = DateTime.Now.Ticks; while (itr.MoveNext()) { Deffact fct = (Deffact)itr.Current; engine.assertFact(fct); } int actCount = engine.ActivationList.size(); long end2 = DateTime.Now.Ticks; long et2 = end2 - start2; totalET += et2; // now fire the rules long start3 = 0; long end3 = 0; int fired = 0; try { start3 = DateTime.Now.Ticks; fired = engine.fire(); end3 = DateTime.Now.Ticks; } catch (Exception e) { Console.WriteLine(e.Message); } facts.Clear(); long total4 = GC.GetTotalMemory(true); //long free4 = rt.freeMemory(); //long used4 = total4 - free4; Console.WriteLine(""); Console.WriteLine("Number of facts - " + engine.DeffactCount); Console.WriteLine("Time to assert facts " + et2 + " ms"); Console.WriteLine("Used memory after assert " + (total4 / 1024) + " Kb " + (total4 / 1024 / 1024) + " Mb"); engine.printWorkingMemory(true, false); Console.WriteLine("number of activations " + actCount); Console.WriteLine("rules fired " + fired); Console.WriteLine("time to fire rules " + (end3 - start3) + " ms"); } catch (FileNotFoundException e) { Console.WriteLine(e.Message); } catch (AssertException e) { Console.WriteLine(e.Message); } engine.close(); engine = null; //rt.gc();engine.close(); } long finished = DateTime.Now.Ticks; Console.WriteLine("average parse ET - " + parseET / loopcount + " ms"); Console.WriteLine("average assert ET - " + totalET / loopcount + " ms"); Console.WriteLine("total run time " + (finished - begin) + " ms"); }
public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { DefaultReturnVector ret = new DefaultReturnVector(); bool echo = false; IList <Object> facts = null; String output = null; if (params_Renamed != null && params_Renamed.Length >= 1) { Defrule r = (Defrule)engine.CurrentFocus.findRule(params_Renamed[0].StringValue); if (params_Renamed.Length == 2) { if (params_Renamed[1].BooleanValue) { echo = true; } } // if there's 3 parameters, it means we should save the fact // to a file if (params_Renamed.Length == 3) { output = params_Renamed[2].StringValue; } facts = GenerateFacts.generateFacts(r, engine); if (facts.Count > 0) { if (echo) { IEnumerator itr = facts.GetEnumerator(); while (itr.MoveNext()) { Object data = itr.Current; if (data is Deffact) { Deffact f = (Deffact)data; engine.writeMessage(f.toFactString()); } else { engine.writeMessage(data.ToString()); } } } if (output != null) { // we need to save facts to a file IOUtilities.saveFacts(facts, output); } object[] ary = new object[facts.Count]; facts.CopyTo(ary, 0); DefaultReturnValue rv = new DefaultReturnValue(Constants.OBJECT_TYPE, ary); ret.addReturnValue(rv); } else { DefaultReturnValue rv = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, false); ret.addReturnValue(rv); } } return(ret); }
public virtual IReturnVector executeFunction(Rete engine, IParameter[] params_Renamed) { DefaultReturnVector rv = new DefaultReturnVector(); bool loaded = true; if (params_Renamed != null && params_Renamed.Length > 0) { for (int idx = 0; idx < params_Renamed.Length; idx++) { String input = null; if (params_Renamed[idx] is ValueParam) { input = ((ValueParam)params_Renamed[idx]).StringValue; } else if (params_Renamed[idx] is BoundParam) { } if (input.IndexOf((Char)'\\') > -1) { input.Replace("\\", "/"); } // check to see if the path is an absolute windows path // or absolute unix path if (input.IndexOf(":") < 0 && !input.StartsWith("/") && !input.StartsWith("./")) { input = "./" + input; } try { Stream inStream = null; if (Regex.IsMatch(input, "^[a-zA-Z]+://.*")) { Uri url = new Uri(input); inStream = ((HttpWebRequest)WebRequest.Create(url)).GetResponse().GetResponseStream(); // Otherwise treat it as normal file on the Filesystem } else { inStream = new FileStream(new FileInfo(input).FullName, FileMode.Open, FileAccess.Read); } CLIPSParser parser = new CLIPSParser(inStream); IList data = parser.loadExpr(); IEnumerator itr = data.GetEnumerator(); while (itr.MoveNext()) { Object val = itr.Current; ValueParam[] vp = (ValueParam[])val; Deftemplate tmpl = (Deftemplate)engine.CurrentFocus.getTemplate(vp[0].StringValue); Deffact fact = (Deffact)tmpl.createFact((Object[])vp[1].Value, -1); engine.assertFact(fact); } } catch (FileNotFoundException e) { loaded = false; engine.writeMessage(e.Message + Constants.LINEBREAK, Constants.DEFAULT_OUTPUT); } catch (ParseException e) { loaded = false; engine.writeMessage(e.Message + Constants.LINEBREAK, Constants.DEFAULT_OUTPUT); } catch (AssertException e) { loaded = false; engine.writeMessage(e.Message + Constants.LINEBREAK, Constants.DEFAULT_OUTPUT); } catch (IOException e) { loaded = false; engine.writeMessage(e.Message + Constants.LINEBREAK, Constants.DEFAULT_OUTPUT); } } } else { loaded = false; } DefaultReturnValue drv = new DefaultReturnValue(Constants.BOOLEAN_OBJECT, loaded); rv.addReturnValue(drv); return(rv); }