Skip to content

Commit 8a69d23

Browse files
Merge pull request #54 from NetLogo/model-reporting
Model reporting This looks good. Excellent work @arthurhjorth!
2 parents 5e4d08f + e4e2fb7 commit 8a69d23

2 files changed

Lines changed: 77 additions & 42 deletions

File tree

src/main/ChildModel.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.nlogo.prim.*;
1919
import org.nlogo.workspace.AbstractWorkspace;
2020

21-
2221
public abstract class ChildModel {
2322
private final World parentWorld;
2423
private JobOwner owner;
@@ -185,17 +184,19 @@ public LogoList listBreeds() {
185184

186185
public LogoList listBreedsOwns() {
187186
LogoListBuilder llb = new LogoListBuilder();
187+
// add turtle vars as a separate tuple
188+
LogoListBuilder tuple = new LogoListBuilder();
189+
LogoListBuilder vars = new LogoListBuilder();
190+
vars.addAll(workspace().world().program().turtlesOwn());
191+
tuple.add("TURTLES");
192+
tuple.add(vars.toLogoList());
193+
llb.add(tuple.toLogoList());
194+
188195
for (Map.Entry<String, List<String>> entry : workspace().world().program().breedsOwn().entrySet())
189196
{
190-
LogoListBuilder tuple = new LogoListBuilder();
191-
LogoListBuilder vars = new LogoListBuilder();
192-
for (String s : entry.getValue()){
193-
vars.add(s);
194-
}
195-
// add turtles own to all of them too
196-
for (String s: workspace().world().program().turtlesOwn()){
197-
vars.add(s);
198-
}
197+
tuple = new LogoListBuilder();
198+
vars = new LogoListBuilder();
199+
vars.addAll(entry.getValue());
199200
tuple.add(entry.getKey());
200201
tuple.add(vars.toLogoList());
201202
llb.add(tuple.toLogoList());
@@ -204,12 +205,18 @@ public LogoList listBreedsOwns() {
204205

205206
}
206207

208+
public LogoList listObserverProcedures(){
209+
return null;
210+
}
211+
212+
public LogoList listTurtleProcedures(){
213+
return null;
214+
}
215+
207216
public LogoList listGlobals() {
208217
LogoListBuilder llb = new LogoListBuilder();
209218

210219
for (int i = 0; i < workspace().world().observer().getVariableCount(); i++){
211-
// theList.add(myWS.world().observer().variableName(i));
212-
// we add all of them. We can manually edit the json file later.
213220
llb.add(workspace().world().observer().variableName(i));
214221
}
215222
return llb.toLogoList();
@@ -359,4 +366,25 @@ private Procedure getCommandRunner(Reporter task, Object[] taskArgs) {
359366
commandRunner.code[0].args = makeArgumentArray(task, taskArgs);
360367
return commandRunner;
361368
}
369+
370+
public LogoList getProcedures() {
371+
LogoListBuilder outerLLB = new LogoListBuilder();
372+
for (String pName : workspace().getProcedures().keySet()){
373+
LogoListBuilder pList = new LogoListBuilder();
374+
Procedure p = workspace().getProcedures().get(pName);
375+
pList.add(pName);
376+
pList.add(p.tyype.toString());
377+
pList.add(p.usableBy);
378+
LogoListBuilder argLLB = new LogoListBuilder();
379+
// args contains dummies (temp 'lets') so we don't include them.
380+
// localsCount contains number of lets so we just subtract that
381+
for (int i = 0; i < p.args.size() - p.localsCount;i++){
382+
String theString = p.args.get(i);
383+
argLLB.add(theString);
384+
}
385+
pList.add(argLLB.toLogoList());
386+
outerLLB.add(pList.toLogoList());
387+
}
388+
return outerLLB.toLogoList();
389+
}
362390
}

src/main/LevelsSpace.java

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.nlogo.api.Syntax;
2929
import org.nlogo.app.ToolsMenu;
3030
import org.nlogo.nvm.*;
31+
import org.nlogo.nvm.ReporterTask;
3132
import org.nlogo.window.SpeedSliderPanel;
3233
import org.nlogo.window.ViewUpdatePanel;
3334

@@ -74,10 +75,12 @@ public void load(PrimitiveManager primitiveManager) throws ExtensionException {
7475
primitiveManager.addPrimitive("hide", new Hide());
7576
primitiveManager.addPrimitive("_list-breeds", new ListBreeds());
7677
primitiveManager.addPrimitive("_globals", new Globals());
77-
// primitiveManager.addPrimitive("_breeds-own", new BreedsOwns());
7878
primitiveManager.addPrimitive("ask-descendant", new HierarchicalAsk());
7979
primitiveManager.addPrimitive("of-descendant", new HierarchicalOf());
8080
primitiveManager.addPrimitive("uses-level-space?", new UsesLevelSpace());
81+
primitiveManager.addPrimitive("_model-procedures", new ModelProcedures());
82+
primitiveManager.addPrimitive("to-OTPL", new ToOTPL());
83+
8184

8285
if (useGUI()) {
8386
// Adding event listener to Halt for halting child models
@@ -242,7 +245,7 @@ public void perform(Argument[] args, Context context) throws LogoException, Exte
242245
String command = args[1].getString();
243246
Object[] actuals = getActuals(args, 2);
244247
for (ChildModel model : toModelList(args[0])) {
245-
model.ask(command, actuals);
248+
model.ask(command, actuals);
246249
}
247250
}
248251
}
@@ -381,6 +384,26 @@ public Object report(Argument[] args, Context arg1)
381384

382385
}
383386

387+
public static class ToOTPL extends DefaultReporter {
388+
public Syntax getSyntax(){
389+
return Syntax.reporterSyntax(new int[] {Syntax.CommandTaskType() | Syntax.ReporterTaskType() },
390+
Syntax.StringType());
391+
}
392+
@Override
393+
public Object report(Argument[] args, Context arg1)
394+
throws ExtensionException, LogoException {
395+
Object task = args[0].get();
396+
if (task instanceof ReporterTask) {
397+
ReporterTask rTask = (ReporterTask) task;
398+
return rTask.body().agentClassString;
399+
} else {
400+
org.nlogo.nvm.CommandTask cTask = (org.nlogo.nvm.CommandTask) task;
401+
return cTask.procedure().syntax().agentClassString();
402+
}
403+
}
404+
405+
}
406+
384407

385408
public static class CloseModel extends DefaultCommand {
386409
public Syntax getSyntax() {
@@ -460,6 +483,18 @@ public Object report(Argument[] args, Context context) throws ExtensionException
460483
}
461484
}
462485

486+
// this returns the path of the model
487+
public static class ModelProcedures extends DefaultReporter{
488+
public Syntax getSyntax(){
489+
return Syntax.reporterSyntax(new int[] {Syntax.NumberType()},
490+
Syntax.ListType());
491+
}
492+
public Object report(Argument[] args, Context context) throws ExtensionException, LogoException {
493+
int modelNumber = args[0].getIntValue();
494+
return getModel(modelNumber).getProcedures();
495+
}
496+
}
497+
463498
public static class SetName extends DefaultCommand {
464499

465500
@Override
@@ -506,34 +541,6 @@ public Object report(Argument args[], Context context)
506541
}
507542
}
508543

509-
510-
public static class BreedsOwns extends DefaultReporter {
511-
public Syntax getSyntax() {
512-
return Syntax.reporterSyntax(
513-
// we take in int[] {modelNumber, varName}
514-
new int[] { Syntax.NumberType() },
515-
// and return a number
516-
Syntax.ListType());
517-
}
518-
519-
public Object report(Argument args[], Context context)
520-
throws ExtensionException, org.nlogo.api.LogoException {
521-
// get model number from args
522-
int modelNumber = (int) args[0].getDoubleValue();
523-
524-
// find the model. if it exists, get all breeds + owns
525-
if(models.containsKey(modelNumber))
526-
{
527-
ChildModel theModel = models.get(modelNumber);
528-
return theModel.listBreedsOwns();
529-
530-
}
531-
else{
532-
return false;
533-
}
534-
535-
}
536-
}
537544
public static class ListBreeds extends DefaultReporter {
538545
public Syntax getSyntax() {
539546
return Syntax.reporterSyntax(

0 commit comments

Comments
 (0)