blob: 7e68c84a08497a3a406707ba2833a0fdf3e9e4de [file] [log] [blame]
import metaabm;
import metaabm::act;
import metaabm::function;
import emf;
extension metaabm::tmpl::types;
extension metaabm::tmpl::names;
extension metaabm::tmpl::infer;
extension metaabm::ascape::tmpl::namesascape;
cached String toHost(String wrapped) :
"((org.ascape.model.CellOccupant" + ") " + wrapped.expl() + ").getHostCell()";
cached String toAgent(String wrapped) :
"((org.ascape.model.HostCell" + ") " + wrapped.expl() + ").getOccupant()";
cached Boolean isDiscrete(SAgent agent) :
!agent.owner.rootActivity.members().typeSelect(ABuildGrid).collect(a | a.agents).contains(agent);
cached String extendType(SAgent agent) :
agent.isDiscrete()
? (agent.isHost()
? "HostCell"
: "CellOccupant")
: "LocatedAgent";
cached String asHost(ASelect act) :
act.agent.isHost()
? act.selid()
: act.selid().toHost();
cached String asAgent(ASelect act) :
!act.agent.isHost()
? act.selid()
: act.selid().toAgent();
cached String asAgent(SAgent agent) :
!agent.isHost()
? agent.id()
: agent.id().toAgent();
cached Boolean returnsHost(AAct act) :
act.selector().space != null && act.selector().space.isHost() && (!act.hasControl("neighbor") || act.hasControl("available"));
cached String fillAgentType(ABuildGrid act) :
act.fillAgent != null ? act.fillAgent.typeName() : "HostCell";
cached Boolean findFromHost(AAct act) :
!act.selector().selected.agent.isHost() && act.returnsHost();
cached String convertedAgent(AAct act, String wrapped) :
act.convertToAgent() ? wrapped.toAgent() : wrapped;
cached Boolean convertToAgent(AAct act) :
act.selector().space != null && act.selector().space.isHost() && !act.selector().isHost() && act.returnsHost();
cached Boolean convertToHost(AAct act) :
(act.selector().space != null && act.selector().agent == act.reference && act.selector().space.isHost() && act.selector().isHost() && !act.returnsHost()) || (act.hasControl("here") && !act.selector().selected.agent.isHost() && act.selector().agent.isHost());
cached String convertedHost(AAct act, String wrapped) :
act.convertToHost() ? wrapped.toHost() : wrapped;
cached Boolean convert(AAct act) :
act.convertToAgent() || act.convertToHost();
cached String converted(AAct act, String wrapped) :
act.selector().space.isHost() ? act.convertedAgent(act.convertedHost(wrapped)) : wrapped;
cached String actMover(AAct act) :
act.selfrom().selid();
cached String method(AAct act, List[AAct] path, Boolean inner) :
act.id();
cached String method(ADie act, List[AAct] path, Boolean inner) :
"die";
cached String method(ALeave act, List[AAct] path, Boolean inner) :
"leave";
cached String method(AMove act, List[AAct] path, Boolean inner) :
path.last().hasControl("toward") ? "moveToward" :
(path.last().hasControl("away") ? "moveAway" : "moveTo");
cached String graphCall(ANetwork act) :
"InternalError in inferascape.ext";
cached String network(ANetwork net) :
"((" + pkgs() + "Graph) " + net.selected.getterPath(net.within, false) + ".getSpace()).";
cached String spacePath(ASelect act, List[AAct] path, Boolean inner) :
act.selector().agent.getterPath(act.reference.parent, false) + ".get" + act.agent.scape().toFirstUpper() + "().getSpace()";
cached String destTerm(ASelect sel) :
sel.agent != null
? sel.asHost().expl()
: (sel.space.metaType == SContinuousSpace
? "((Coordinate)" + sel.id() + ")"
: "((HostCell)" +sel.id() + ")");
cached String call(AMove act, List[AAct] path, Boolean inner) :
act.selected.asAgent().pre() + act.method(path, inner) + "(" + act.destination.destTerm() + ");";
cached String call(ACreateAgents act, List[AAct] path, Boolean inner) :
act.agent.typeName() + " " + act.id() + " = (" + act.agent.typeName() + ")" + spacePath(act, path, inner) + ".newLocation(false);";
cached String call(ADie act, List[AAct] path, Boolean inner) :
act.selected.local(act.selected.id()).expl().pre() + "die();";
cached String call(ALeave act, List[AAct] path, Boolean inner) :
act.selected.local(act.selected.id()).expl().pre() + "leave();";
cached String call(AReplace act, List[AAct] path, Boolean inner) :
act.network() + "replaceNeighbor(" + act.actMover().expl() + ", " + act.findDest() + ", " + act.directed + ");";
cached String call(AConnect act, List[AAct] path, Boolean inner) :
act.network() + "addNeighborSafe(" + act.selfrom().local(act.selfrom().id()).expl() + ", " + act.findDest() +", " + act.directed + ");";
cached String call(ADisconnect act, List[AAct] path, Boolean inner) :
act.network() + "clearNeighbors(" + act.actMover().expl() + ");";
cached String call(AAct act, List[AAct] path, Boolean inner) :
act.method(path, inner) + "()";
cached String call(AReplace act, Boolean inner) :
"((" + pkgs() + "Graph) " + act.dest().getterPath(act.within, inner) + ".getSpace())." + act.graphCall();
cached String call(ANetwork act, Boolean inner) :
"((" + pkgs() + "Graph) " + act.dest().getterPath(act.within, inner) + ".getSpace())." + act.graphCall();
cached String graphCall(AConnect act) :
"addNeighborSafe(" + act.actMover().expl() + ", " + act.dest().id() + ", " + act.directed + ")";
cached String graphCall(ADisconnect act) :
"clearNeighbors(" + act.actMover().expl()+ ")";
cached String graphCall(AReplace act) :
"replaceNeighbor(" + act.actMover().expl() + ", " + act.findDest() + ", " + act.directed + ")";
cached List[AAct] conditionForState(AAct act) :
act.selector().targets.queries().nonSpatial().intersect(act.allSources.union({act}));
cached Boolean conditionForAscape(AControl act) :
(act.conditionFor() || act.convertToAgent() || !act.selector().isHost()) && !act.hasControl("here") && !act.selector().isRoot();
cached Boolean conditionForAscape(ASelect act) :
act.conditionFor() || act.convertToAgent();
cached Boolean conditionForAscape(AAct act) :
false;
cached String findSpace(AAct act) :
act.selector().space != null
? ((act.selector().space.metaType != SGrid && act.selector().space.metaType != SNetwork)
? act.selector().getterPath(act.selector().space, false) + ".getSpace()."
: "((org.ascape.model.space.Discrete)" + act.selector().getterPath(act.selector().space, false) + ".getSpace()).")
: (act.selector().agent == act.reference
? "getScape()."
: act.selector().agent.owner.getterName() + "().get" + act.selector().agent.scape().toFirstUpper() + "().");
cached Boolean allTerms(AAct act) :
act.hasControl("nearest") || act.hasControl("within") || act.hasMinMax();
cached Boolean hasParent(SAgent child, SAgent candidate) :
child.parent == candidate || child.parent != null && ((SAgent) child.parent).hasParent(candidate);
cached String locationAgent(AAct act) :
act.selector().agent == null || !act.reference.hasParent(act.selector().agent)
? (act.findFromHost()
? act.selector().selected.selid().toHost()
: act.selector().selected.selid())
: act.selector().agent.getterName() + "()";
cached String dataPoint(ASink sink) :
sink.function.id().toUpperCase() + "_" + sink.inputs.value.get(0).id().toUpperCase();
cached String locationTerm(AAct act) :
(act.hasControl("includeSelf") || act.hasControl("neighbor") || act.allTerms())
? act.locationAgent().expl() +
(act.hasMinMax()
? ".getCoordinate()"
:"")
: "";
cached String conditionTerm(AAct act) :
!act.hasMinMax()
? (act.conditionForAscape()
? act.selector().selid() + "Condition"
: (act.hasControl("available") && act.hasControl("within")
? "null"
: ""))
: (act.conditionForAscape()
? act.selector().selid() + "Condition"
: (act.hasControl("available")
? "HostCell.IS_AVAILABLE"
: "null"));
cached String includeSelfTerm(AAct act) :
act.hasControl("includeSelf")
? "true"
: (act.allTerms()
? "false"
: "");
cached String distanceTerm(AAct act, List[AAct] path) :
act.allTerms()
? act.actDistance(path)
: "";
cached String dataPointTerm(AAct act) :
act.hasMinMax()
? act.minOrMax().dataPoint()
: "";
cached boolean findIsList(AAct act) :
act.hasControl("all");
cached AQuery minOrMax(AAct act) :
act.hasControl("maximize")
? act.controlFunction("maximize")
: (act.hasControl("minimize")
? act.controlFunction("minimize")
: "");
cached String findParams(AAct act, List[AAct] path) :
{act.locationTerm(), act.dataPointTerm(), act.conditionTerm(), act.includeSelfTerm(), act.distanceTerm(path)}.select(e | e.length > 0).toString(", ");
cached String nearestTerm(AAct act) :
act.hasControl("nearest") ? "Nearest" : "";
cached Boolean hasMinMax(AAct act) :
act.hasControl("minimize") || act.hasControl("maximize");
cached String randomTerm(AAct act) :
!(act.hasControl("nearest") || act.hasControl("all") || act.hasMinMax()) ? "Random" : "";
cached String availableTerm(AAct act) :
act.hasControl("available") && !act.hasMinMax() ? "Available" : "";
cached String functionTerm(AAct act) :
act.hasControl("minimize") ? "Minimum" : (act.hasControl("maximize") ? "Maximum" : "");
cached String functionName(FFunction f) :
f.id() == "maximize" ? "maximum" : (f.id() == "minimize" ? "minimum" : "error");
cached String withinTerm(AAct act) :
act.hasMinMax() || act.hasControl("within") && !act.hasControl("nearest") && !act.hasControl("available") ? "Within" : "";
cached String neighborTerm(AAct act) :
act.hasControl("neighbor") && !act.hasMinMax() ? "Neighbor" : "";
cached String continuousTerm(AAct act) :
act.selector().space.metaType == SContinuousSpace ? "Coordinate" : "";
cached String findMethod(AAct act) :
"find" + act.nearestTerm() + act.randomTerm() + act.functionTerm() + act.availableTerm() + act.withinTerm() + act.neighborTerm();
// : (act.hasControl("here")
// ? "(" + act.selector().selected.asHost().expl() + "==" + act.rootSelected.asHost().expl() + " ? " + act.selector().selected.selid().expl() + " : null);"
cached String findStatement(AAct act, List[AAct] path) :
!act.selector().isRoot() && !act.hasControl("here") && !(act.hasControl("toward") && act.controlCompound().spatial().size == 1)
? act.findSpace() + act.findMethod() + "(" + act.findParams(path) + ")"
: act.selector().selected.selid().expl();
cached String findAgentStatement(AAct act, List[AAct] path) :
!act.findIsList()
? act.findStatement(path)
: "(" + (act.convert() ? "Location" : act.selector().typeName()) + ") next" + act.selector().id().toFirstUpper();
cached Collection[AAct] hereQueries(AAct act) :
((Collection[AAct]) act.selector().targets.intersect(act.allSources)).controlFunction("here");
cached SAttribute outer(SAttribute inner, SAttribute outer) :
outer == inner ? inner : outer;
cached String statSig(SAttribute attr) :
attr.numeric() ? "double getValue" : "boolean meetsCondition";
cached Boolean statCond(SAttribute typed) :
typed.sType == SAttributeType::Boolean;
cached Boolean statCond(SState outer) :
true;
cached String statCondTerm(SAttribute typed) :
statCond(typed) ? "Cond" : "CSAMM";
cached String statLabel(SAttribute inner, SAttribute outer, String desc) :
(inner.parent().parent().parent() != null ? "getName() + \" " : "\"") + inner.parent().label + " " + desc.spaceTrail() + (outer != inner ? outer.label.spaceTrail() : "") + inner.label + "\"";
cached int gridDimSize(SGrid grid) :
grid.attributes.size > 1 ? grid.attributes.get(1).defaultValue.asInteger() : 20;
cached int agentPixelSize(SGrid grid) :
(grid.gridDimSize() < 100) ? (400 / grid.gridDimSize()) : 3;
cached List[AAct] orderBuild(List[AAct] acts) :
acts.sortBy(e | (e.metaType == ACreateAgents ? -2 : 0) + ((e.metaType == ACreateAgents && ((ACreateAgents) e).agent.isHost()) ? 4 : 0));
cached String setTo(SAttribute attr, String val) :
((SAgent) attr.owner).asAgent() + "." + attr.setterName() + "(" + val + ")";
cached List setterSpace(SState attr) :
attr.gatherData ? attr.options.collect(a | {a.label + " " + attr.label, attr.setTo(a.typeName())}) : {};
cached List setterSpace(SAttribute attr) :
attr.gatherData && attr.sType == SAttributeType::Boolean ? {{"is " + attr.label, attr.setTo("true")}, {"is not " + attr.label, attr.setTo("false")}} : {};
cached List setterSpace(SStyle style) :
style.agent.attributes.setterSpace();