package org.jactr.core.module.procedural; /* * default logging */ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.commonreality.time.IClock; import org.jactr.core.chunk.IChunk; import org.jactr.core.chunktype.IChunkType; import org.jactr.core.logging.Logger; import org.jactr.core.logging.impl.DefaultModelLogger; import org.jactr.core.model.IModel; import org.jactr.core.module.ModuleTest; import org.jactr.core.module.declarative.IDeclarativeModule; import org.jactr.core.production.IProduction; import org.jactr.core.production.condition.ChunkTypeCondition; import org.jactr.core.runtime.ACTRRuntime; import org.jactr.core.runtime.controller.DefaultController; import org.jactr.core.runtime.controller.IController; import org.jactr.core.slot.BasicSlot; import org.jactr.core.slot.DefaultConditionalSlot; import org.jactr.core.slot.IConditionalSlot; public class ProceduralPerformanceTest extends ModuleTest { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ProceduralPerformanceTest.class); public void testProductionInstantiation() throws Exception { setUpProductionTest(getModel(), 100); // attachLogger(getModel()); execute(getModel(), 1000); } protected void attachLogger(IModel model) { DefaultModelLogger dml = new DefaultModelLogger(); // dml.setParameter(Logger.CYCLE,"out"); dml.setParameter(Logger.Stream.TIME.toString(), "out"); // dml.setParameter(Logger.Stream.GOAL.toString(), "err"); dml.setParameter(Logger.Stream.PROCEDURAL.toString(), "out"); // dml.setParameter(Logger.CONFLICT_RESOLUTION, "out"); // dml.setParameter(Logger.CONFLICT_SET, "out"); // dml.setParameter(Logger.ACTIVATION_BUFFER,"out"); // dml.setParameter(Logger.MATCHES,"out"); // dml.setParameter(Logger.EXACT_MATCH,"out"); // dml.setParameter(Logger.PARTIAL_MATCH,"out"); model.install(dml); } private void execute(IModel model, int seconds) throws Exception { // make sure we are using profiling for maximum info System.setProperty("jactr.profiling", "true"); IController controller = new DefaultController(); ACTRRuntime.getRuntime().setController(controller); ACTRRuntime.getRuntime().addModel(model); try { // start assertTrue(controller.start().get()); IClock clock = ACTRRuntime.getRuntime().getClock(model); for (double percent = 0; percent < 1; percent += 0.1) { clock.waitForTime(percent * seconds); System.out.println((int) (percent * 100) + "%"); System.out.flush(); } assertTrue(controller.stop().get()); } finally { ACTRRuntime.getRuntime().removeModel(model); ACTRRuntime.getRuntime().setController(null); } } /** * creates totalProductions mock production and one real production for * instantiation testing.. * * @param module * @param totalProductions */ private void setUpProductionTest(IModel model, int totalProductions) throws Exception { IDeclarativeModule dm = model.getDeclarativeModule(); /* * first we need the test chunktype */ IChunkType test = dm.createChunkType((IChunkType)null, "test").get(); test.getSymbolicChunkType().addSlot(new BasicSlot("slot")); test = dm.addChunkType(test).get(); /* * and the actual goal */ IChunkType chunk = dm.getChunkType("chunk").get(); IChunk target = dm.createChunk(chunk, "target").get(); target = dm.addChunk(target).get(); IChunk goal = dm.createChunk(test, "goal").get(); goal.getSymbolicChunk().addSlot(new BasicSlot("slot", target)); /* * stick it in the buffer */ model.getActivationBuffer("goal").addSourceChunk(goal); /* * now we need to create all the foils.. */ IProceduralModule pm = model.getProceduralModule(); for (int i = 0; i < totalProductions; i++) { IChunk foil = dm.createChunk(chunk, "foil-" + i).get(); foil = dm.addChunk(foil).get(); /* * and the production */ IProduction fProduction = pm.createProduction("foil-" + i).get(); /* * single condition.. */ ChunkTypeCondition condition = new ChunkTypeCondition("goal", test); condition.addSlot(new DefaultConditionalSlot("slot", IConditionalSlot.EQUALS, foil)); fProduction.getSymbolicProduction().addCondition(condition); /* * and a trivial action */ // ModifyAction action = new ModifyAction("goal"); // action.addSlot(new BasicSlot("slot", foil)); // fProduction.getSymbolicProduction().addAction(action); fProduction = pm.addProduction(fProduction).get(); } /* * and the actual production */ IProduction tProduction = pm.createProduction("target").get(); /* * single condition.. */ ChunkTypeCondition condition = new ChunkTypeCondition("goal", test); condition.addSlot(new DefaultConditionalSlot("slot", IConditionalSlot.EQUALS, target)); tProduction.getSymbolicProduction().addCondition(condition); /* * and a trivial action */ // ModifyAction action = new ModifyAction("goal"); // action.addSlot(new BasicSlot("slot", target)); // tProduction.getSymbolicProduction().addAction(action); tProduction = pm.addProduction(tProduction).get(); } }