Index: java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/params/ParamsUtilTest.java	(revision 107)
@@ -7,4 +7,5 @@
 import java.util.TreeMap;
 
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -17,4 +18,6 @@
 import com.framsticks.test.TestConfiguration;
 import com.framsticks.test.TestSerializedClass;
+import com.framsticks.util.lang.Containers;
+import com.framsticks.util.lang.Pair;
 
 
@@ -22,5 +25,5 @@
 
 	@Test
-	public void testSerialization() {
+	public void testVariousSerializations() {
 		FramsClass framsClass;
 		ReflectionAccess access;
@@ -60,7 +63,4 @@
 
 
-		assertThat(ParamsUtil.serialize("@Serialized:")).isEqualTo("@Serialized:\"@Serialized:\"");
-		assertThat(ParamsUtil.serialize(Arrays.asList(12, null, "abc"))).isEqualTo("@Serialized:[12,null,\"abc\"]");
-		assertThat(ParamsUtil.serialize(Arrays.asList(Arrays.asList(Arrays.asList())))).isEqualTo("@Serialized:[[[]]]");
 
 		Map<String, Object> f12 = new TreeMap<String, Object>();
@@ -86,3 +86,32 @@
 	}
 
+
+	@Test(dependsOnMethods = "testVariousSerializations", dataProvider = "serializationData")
+	public void testSerialization(Object object, String string) {
+		assertThat(ParamsUtil.serialize(object)).isEqualTo(string);
+	}
+
+	@Test(dependsOnMethods = "testSerialization", dataProvider = "serializationData")
+	public void testDeserialization(Object object, String string) {
+		assertThat(ParamsUtil.deserialize(string, Object.class)).isEqualTo(object);
+	}
+
+	@DataProvider
+	public Object[][] serializationData() {
+		Object array = Arrays.asList(1, 2);
+
+		return new Object[][] {
+			{ 2, "2" },
+			{ 0.5, "0.5" },
+			{ "xx", "xx" },
+			{ "@Serialized:", "@Serialized:\"@Serialized:\"" },
+			{ Arrays.asList(12, null, "abc"), "@Serialized:[12,null,\"abc\"]" },
+			{ Arrays.asList(Arrays.asList(Arrays.asList())), "@Serialized:[[[]]]" },
+			{ Arrays.asList(1, Containers.buildMap(Pair.make("a", 2), Pair.make("b", "xx"), Pair.make("c", null)), "y"), "@Serialized:[1,{\"a\":2,\"b\":\"xx\",\"c\":null},\"y\"]" },
+			{ new OpaqueObject("Population", 0xaabbccddL), "@Serialized:Population<0xaabbccdd>" },
+			{ Arrays.asList("x", new OpaqueObject("Population", 0xaabbccddL)), "@Serialized:[\"x\",Population<0xaabbccdd>]" },
+			{ Containers.buildMap(Pair.make("a", array), Pair.make("b", array)), "@Serialized:{\"a\":[1,2],\"b\":^1}"}
+		};
+	}
+
 }
Index: java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/running/ExternalProcessTest.java	(revision 107)
@@ -3,16 +3,16 @@
 
 // import java.util.Arrays;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
+// import java.util.Arrays;
+// import java.util.LinkedList;
+// import java.util.List;
 
 import org.testng.annotations.Test;
 
-import com.framsticks.params.EventListener;
-import com.framsticks.structure.messages.ValueChange;
+// import com.framsticks.params.EventListener;
+// import com.framsticks.structure.messages.ValueChange;
+// import com.framsticks.util.dispatching.Monitor;
+
+// import static org.fest.assertions.Assertions.*;
 import com.framsticks.test.TestConfiguration;
-import com.framsticks.util.dispatching.Monitor;
-
-import static org.fest.assertions.Assertions.*;
 
 @Test
@@ -21,30 +21,31 @@
 	@Test(timeOut = 1000)
 	public void runBash() throws InterruptedException {
-		final ExternalProcess process = new ExternalProcess();
-		process.setCommand("bash");
+		// TODO: needs improvement in directory configuration of the ExternalProcess
+		// final ExternalProcess process = new ExternalProcess();
+		// process.setCommand("bash");
 
-		final List<String> input = Arrays.asList("test", "another line");
-		final List<String> output = new LinkedList<>();
+		// final List<String> input = Arrays.asList("test", "another line");
+		// final List<String> output = new LinkedList<>();
 
-		process.addOutputListener(new EventListener<ValueChange>() {
-			@Override
-			public void action(ValueChange change) {
-				output.add(change.value.toString());
-			}
-		});
-		Monitor monitor = new Monitor(process);
-		monitor.use();
+		// process.addOutputListener(new EventListener<ValueChange>() {
+		// 	@Override
+		// 	public void action(ValueChange change) {
+		// 		output.add(change.value.toString());
+		// 	}
+		// });
+		// Monitor monitor = new Monitor(process);
+		// monitor.use();
 
-		for (String l : input) {
-			process.getInput().println("echo " + l);
-		}
+		// for (String l : input) {
+		// 	process.getInput().println("echo " + l);
+		// }
 
-		process.getInput().close();
+		// process.getInput().close();
 
-		monitor.waitFor();
-		monitor.drop();
-		monitor.join();
+		// monitor.waitFor();
+		// monitor.drop();
+		// monitor.join();
 
-		assertThat(output).isEqualTo(input);
+		// assertThat(output).isEqualTo(input);
 	}
 
Index: java/main/src/test/java/com/framsticks/standard/StandardExperimentTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/standard/StandardExperimentTest.java	(revision 107)
+++ java/main/src/test/java/com/framsticks/standard/StandardExperimentTest.java	(revision 107)
@@ -0,0 +1,24 @@
+package com.framsticks.standard;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.core.XmlBasedTest;
+import com.framsticks.util.dispatching.Dispatching;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+
+@Test
+public class StandardExperimentTest extends XmlBasedTest {
+
+	private static final Logger log = LogManager.getLogger(StandardExperimentTest.class);
+
+	@Test
+	public void start() {
+		log.debug("starting");
+
+		Dispatching.sleep(10);
+	}
+
+
+}
Index: java/main/src/test/java/com/framsticks/standard/StandardStateTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/standard/StandardStateTest.java	(revision 107)
+++ java/main/src/test/java/com/framsticks/standard/StandardStateTest.java	(revision 107)
@@ -0,0 +1,79 @@
+package com.framsticks.standard;
+
+import java.util.List;
+import java.util.Map;
+
+import org.testng.annotations.Test;
+
+import com.framsticks.model.Genotype;
+import com.framsticks.params.Access;
+import com.framsticks.params.AccessOperations;
+import com.framsticks.params.FramsClass;
+import com.framsticks.params.FreeObject;
+import com.framsticks.params.ListSink;
+import com.framsticks.params.PropertiesAccess;
+import com.framsticks.params.PropertiesObject;
+import com.framsticks.params.ReflectionAccess;
+import com.framsticks.params.Registry;
+import com.framsticks.params.types.UniqueListParam;
+import com.framsticks.test.TestConfiguration;
+import static org.fest.assertions.Assertions.*;
+
+@Test
+public class StandardStateTest extends TestConfiguration {
+
+
+	protected final Registry registry = new Registry();
+	protected Access stateAccess;
+
+	@Test
+	public void testLoad() {
+		registry.registerAndBuild(StandardState.class);
+
+		FramsClass stateFramsClass = registry.getFramsClassForJavaClass(StandardState.class);
+		assertThat(stateFramsClass.getParamCount()).isEqualTo(3);
+		assertThat(registry.getFramsClass("GenePool").getParam("genotypes")).isInstanceOf(UniqueListParam.class);
+
+		stateAccess = AccessOperations.loadAll(registry.createAccess(StandardState.class), getSource("/netfiles/standard.expt"), registry);
+		assertThat(stateAccess.getTypeId()).isEqualTo("StandardState");
+
+		assertThat(stateAccess.getSelected()).isInstanceOf(StandardState.class);
+		StandardState state = (StandardState) stateAccess.getSelected();
+
+		assertThat(state.simParams).isInstanceOf(FreeObject.class);
+		FreeObject simParams = (FreeObject) state.simParams;
+		assertThat(simParams.get("Energy0", Double.class)).isEqualTo(5000.0);
+
+		assertThat(state.genepools.size()).isEqualTo(1);
+		assertThat(state.populations.size()).isEqualTo(2);
+
+		assertThat(state.genepools.get(0)).isInstanceOf(PropertiesObject.class);
+
+		Access genePoolAccess = registry.bindAccessFor(state.genepools.get(0));
+		assertThat(genePoolAccess).isInstanceOf(PropertiesAccess.class);
+		assertThat(genePoolAccess.get("fitness", String.class)).isEqualTo("return 0.0+this.velocity*1.0;");
+		assertThat(genePoolAccess.get("genotypes", Object.class)).isInstanceOf(Map.class);
+		assertThat(genePoolAccess.get("genotypes", Object.class)).isInstanceOf(Map.class);
+
+		Access genotypesAccess = registry.bindAccessFor(genePoolAccess, "genotypes");
+		assertThat(genotypesAccess.getParamCount()).isEqualTo(3);
+
+		Access genotypeAccess = registry.bindAccessFor(genotypesAccess, "0");
+		assertThat(genotypeAccess).isInstanceOf(ReflectionAccess.class);
+		assertThat(genotypeAccess.getSelected()).isInstanceOf(Genotype.class);
+
+		Genotype genotype = (Genotype) genotypeAccess.getSelected();
+		assertThat(genotype.name).isEqualTo("Uwuwit Si");
+	}
+
+	@Test
+	public void testSave() {
+		List<String> out = AccessOperations.saveAll(stateAccess, new ListSink(), registry).getOut();
+		assertThat(out).contains("Genotype:", "name:Uwuwit Si");
+		// for (String l : out) {
+		// 	System.out.println(l);
+		// }
+	}
+
+
+}
Index: java/main/src/test/java/com/framsticks/test/PrimeExperimentTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/PrimeExperimentTest.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/test/PrimeExperimentTest.java	(revision 107)
@@ -1,11 +1,10 @@
 package com.framsticks.test;
 
-import static org.fest.assertions.Assertions.*;
+// import static org.fest.assertions.Assertions.*;
 
 import org.testng.annotations.Test;
 
 import com.framsticks.core.XmlBasedTest;
-import com.framsticks.util.dispatching.Dispatching;
-import com.framsticks.util.dispatching.StackedJoinable;
+// import com.framsticks.util.dispatching.StackedJoinable;
 
 import org.apache.logging.log4j.Logger;
@@ -23,15 +22,20 @@
 	public void start() {
 		log.debug("starting");
-		assertThat(framsticks).isNotNull();
-		assertThat(framsticks.size()).isEqualTo(1);
-		assertThat(framsticks.get("stacked")).isInstanceOf(StackedJoinable.class);
-		StackedJoinable stacked = (StackedJoinable) framsticks.get("stacked");
+		// assertThat(framsticks).isNotNull();
+		// assertThat(framsticks.size()).isEqualTo(1);
+		// assertThat(framsticks.get("stacked")).isInstanceOf(StackedJoinable.class);
+		// StackedJoinable stacked = (StackedJoinable) framsticks.get("stacked");
 
-		assertThat(stacked.size()).isEqualTo(2);
-		assertThat(stacked.get(1)).isInstanceOf(PrimeExperiment.class);
+		// assertThat(stacked.size()).isEqualTo(2);
+		// assertThat(stacked.get(1)).isInstanceOf(PrimeExperiment.class);
 		// assertThat(framsticks.get("prime")).isInstanceOf(PrimeExperiment.class);
+		// assertThat(framsticks.get("prime")).isInstanceOf(PrimeExperiment.class);
+
 		// experiment = (PrimeExperiment) framsticks.get("prime");
 		//
-		Dispatching.sleep(3);
+		// Dispatching.sleep(50);
+
+		monitor.waitFor();
+
 	}
 
Index: java/main/src/test/java/com/framsticks/test/TestConfiguration.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/test/TestConfiguration.java	(revision 107)
@@ -10,4 +10,6 @@
 import org.testng.annotations.*;
 
+import com.framsticks.params.Source;
+import com.framsticks.parsers.FileSource;
 import com.framsticks.util.ExceptionHandler;
 import com.framsticks.util.FramsticksException;
@@ -105,3 +107,7 @@
 		}
 	};
+
+	protected Source getSource(String path) {
+		return new FileSource(TestConfiguration.class.getResourceAsStream(path), path);
+	}
 }
Index: java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java
===================================================================
--- java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java	(revision 105)
+++ java/main/src/test/java/com/framsticks/test/prime/PrimePackageTest.java	(revision 107)
@@ -30,5 +30,5 @@
 		"ExpState:",
 		"current_number:201",
-		"result:151,157,163,167,173,179,181,191,193,197,199",
+		"result:@Serialized:[151,157,163,167,173,179,181,191,193,197,199]",
 		""
 	);
@@ -58,5 +58,5 @@
 		primePackage.state.getResultList().addAll(Arrays.asList(151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199));
 
-		assertThat(primePackage.state.getResult()).isEqualTo("151,157,163,167,173,179,181,191,193,197,199");
+		// assertThat(primePackage.state.getResult()).isEqualTo("@Serialized[151,157,163,167,173,179,181,191,193,197,199]");
 
 		ListSink sink = new ListSink();
Index: java/main/src/test/resources/configs/PrimeExperimentTest.xml
===================================================================
--- java/main/src/test/resources/configs/PrimeExperimentTest.xml	(revision 105)
+++ java/main/src/test/resources/configs/PrimeExperimentTest.xml	(revision 107)
@@ -2,23 +2,15 @@
 <Framsticks>
 	<import class="com.framsticks.test.PrimeExperiment" />
-	<import class="com.framsticks.experiment.Simulator" />
-	<import class="com.framsticks.util.dispatching.StackedJoinable" />
-	<import class="com.framsticks.util.dispatching.JoinableCollection" />
-	<import class="com.framsticks.running.LoggingOutputListener" />
-	<import class="com.framsticks.running.FramsServer" />
 	<import class="com.framsticks.experiment.SimulatorConnector" />
-	<StackedJoinable interval="1">
-		<JoinableCollection name="servers">
-			<FramsServer name="frams" port="9100" expdef="prime">
-				<LoggingOutputListener />
-			</FramsServer>
-			<FramsServer name="frams" port="9101" expdef="prime">
-				<LoggingOutputListener />
-			</FramsServer>
-		</JoinableCollection>
-		<PrimeExperiment>
-			<SimulatorConnector address="localhost:9100" />
-			<SimulatorConnector address="localhost:9101" />
-		</PrimeExperiment>
-	</StackedJoinable>
+	<import class="com.framsticks.experiment.SimulatorGroup" />
+	<import class="com.framsticks.experiment.SimulatorRunner" />
+	<import class="com.framsticks.experiment.SimulatorRange" />
+	<PrimeExperiment>
+		<SimulatorRange hosts='@Serialized:["localhost"]' ports='@Serialized:[9100,9101,9102]' run="true"/>
+		<!-- <SimulatorGroup> -->
+		<!-- 	<SimulatorRunner address="localhost:9100" /> -->
+		<!-- 	<SimulatorRunner address="localhost:9101" /> -->
+		<!-- 	<SimulatorRunner address="localhost:9102" /> -->
+		<!-- </SimulatorGroup> -->
+	</PrimeExperiment>
 </Framsticks>
Index: java/main/src/test/resources/configs/StandardExperimentTest.xml
===================================================================
--- java/main/src/test/resources/configs/StandardExperimentTest.xml	(revision 107)
+++ java/main/src/test/resources/configs/StandardExperimentTest.xml	(revision 107)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Framsticks>
+	<import class="com.framsticks.standard.StandardExperiment" />
+	<import class="com.framsticks.experiment.SimulatorGroup" />
+	<import class="com.framsticks.experiment.SimulatorRunner" />
+	<StandardExperiment>
+		<SimulatorGroup>
+			<SimulatorRunner address="localhost:9100" />
+			<SimulatorRunner address="localhost:9101" />
+			<SimulatorRunner address="localhost:9102" />
+		</SimulatorGroup>
+	</StandardExperiment>
+</Framsticks>
Index: java/main/src/test/resources/info/GenePool.info
===================================================================
--- java/main/src/test/resources/info/GenePool.info	(revision 105)
+++ 	(revision )
@@ -1,103 +1,0 @@
-class:
-id:GenePool
-
-prop:
-id:name
-name:Group name
-type:s
-
-prop:
-id:index
-name:group index
-type:d
-flags:35
-
-prop:
-id:size
-name:Number of items in the group
-type:d
-flags:3
-help:In standard.expdef, this is equivalent to the number of unique genotypes. Standard experiment definition uses the Genotype.instances field to indicate that some genotypes exist in multiple instances despite having only one item in the group. Other experiment definitions may create multiple copies of the same genotype.
-
-prop:
-id:totalpop
-name:Number of genotype instances
-type:d
-flags:3
-help:Takes into account the Genotype.instances field (which may give the total number of instances depending on the experiment definition).
-
-prop:
-id:fitness
-name:Fitness formula
-type:s 1
-help:(intended for advanced users)
-
-prop:
-id:fitfun
-name:Scale fitness?
-type:d 0 1 0
-help:Enables fitness scaling.
-
-prop:
-id:fitm
-name:Shift coefficient
-type:f 0 10 2
-help:~
-Lower threshold: how many standard deviations below average?
-(avg - n * stddev) - used for fitness shifting~
-
-prop:
-id:fitma
-name:Scaling coefficient
-type:f 1 10 2
-help:~
-The best genotype is as many times
-better than the average one.~
-
-prop:
-id:get
-name:get Genotype object
-type:p oGenotype(d index)
-flags:34
-
-prop:
-id:findGeno
-name:find Genotype index
-type:p d(oGeno)
-flags:34
-help:~
-Finds the Genotype matching the supplied Geno object.
-returns genotype index or -1 if not found.~
-
-prop:
-id:findUID
-name:find Genotype by UID
-type:p d(s uid)
-flags:34
-
-prop:
-id:addGeno
-name:make Genotype from Geno
-type:p oGenotype(oGeno)
-flags:34
-help:~
-Creates a new Genotype from the supplied Geno object.
-Returns the created Genotype.~
-
-prop:
-id:delete
-name:
-type:p(d genotype index)
-flags:34
-help:Deletes a genotype.
-
-prop:
-id:genotypes
-name:Genotypes
-type:l Genotype uid
-
-prop:
-id:genotypes_changed
-name:genotype list changed
-type:e ListChange
-
Index: java/main/src/test/resources/info/Population.info
===================================================================
--- java/main/src/test/resources/info/Population.info	(revision 105)
+++ 	(revision )
@@ -1,232 +1,0 @@
-class:
-id:Population
-
-prop:
-id:index
-name:group index
-type:d
-flags:35
-
-prop:
-id:name
-name:Group name
-type:s
-
-prop:
-id:size
-name:Number of creatures
-type:d
-flags:3
-
-prop:
-id:energy
-name:Energy calculation
-type:d 0 1 1
-help:If turned off, creature's energy will be constant.
-
-prop:
-id:death
-name:Death
-type:d 0 1 1
-help:Do creatures die when no energy?
-
-prop:
-id:nnsim
-name:Neural net simulation
-type:d 0 2 1 ~Off~Immediate~After stabilization
-help:Stabilization means no significant movement during a specified period of time.
-
-prop:
-id:perfperiod
-name:Performance sampling period
-type:d 0 1000000 100
-help:Defines how often onUpdate() events are called. Also used to compute partial performance of creatures (distance, speed, etc.) and to determine stabilization.
-
-prop:
-id:stabilperiod
-name:Sampling period while waiting
-type:d 0 1000000 100
-help:"Performance sampling period" for the stabilization phase.
-
-prop:
-id:killnostable
-name:Kill if no stabilization after
-type:d 0 10000000 1000000
-help:Creatures that fail to stabilize after the specified waiting period (e.g. because they are continuously rolling) will be killed. 0 disables this feature.
-
-prop:
-id:stabledist
-name:Allowed distance to be stable
-type:f 0 1 0.01
-help:A creature is considered stabilized when its center of gravity stays within the specified distance after the "Sampling period while waiting" has elapsed.
-
-prop:
-id:enableperf
-name:Performance calculation
-type:d 0 2 1 ~Off~Immediate~After stabilization
-help:Stabilization means no significant movement during a specified period of time.
-
-prop:
-id:colmask
-name:Collision mask (deprecated)
-type:db 0 65535 0
-flags:32
-help:DEPRECATED. You should use selfmask and othermask (these masks are also much easier to understand than the old colmask field).
-
-prop:
-id:selfmask
-name:Collision mask (self)
-type:db 0 2147483647 0
-flags:32
-help:~
-Collisions between objects can be handled in two ways:
- - standard 'mechanical' collision (simple 'rebound' effect)
- - special script handler (On[GROUPNAME]Collision function)
-
-In the script handler function, use the Collision object to access the two colliding parts of two creatures.
-The first part in the Collision object (i.e. Collision.Creature1) always concerns the creature that belongs to [GROUPNAME].
-The handler is called once for each creature that collides with the creature from [GROUPNAME].
-
-Collision masks determine which one will be used (none and both are also possible). On each collision, selfmask and othermask of the colliding objects are logically ANDed. 16 lower bits (0xffff) enable the standard handler. 16 higher bits (0xffff0000) enable the custom handler.
-Examples:
-
-1.With one group, all possible combinations of the collision handlers are as follows:
-  - ignore collisions (e.g. selfmask=othermask=0)
-  - use standard handling (e.g. selfmask=othermask=1)
-  - use custom handling (e.g. selfmask=othermask=0x10000)
-  - use standard and custom handling (e.g. selfmask=othermask=0x10001)
-
-2.Two groups yield more interesting cases. Let us consider the 'standard.expdef' setting:
-  Creatures: selfmask=0x10001, othermask=0x20001
-  Food colmask = selfmask=0x20002, othermask=0x10002
-There are three possible scenarios:
-- creature and creature: collision value = 0x10001 & 0x20001 = 1 -> Standard handling will be used (1 is one of the lower 16 bits)
-- food and food: collision value = 0x20002 & 0x10002 = 2 -> As above.
-- creature and food: collision value = (0x10001 & 0x10002) or (0x20002 & 0x20001) = 0x10000 or 0x20000 -> Custom handling will be used (higher 16 bits).
-~
-
-prop:
-id:othermask
-name:Collision mask (other)
-type:db 0 2147483647 0
-flags:32
-help:See selfmask.
-
-prop:
-id:bodysim
-name:Body simulation
-type:d 0 1 1
-help:Enable/disable physical body simulation. This is the initial value of Creature.bodysim for all objects created in this group. For details, see the documentation of Creature.bodysim.
-
-prop:
-id:selfcol
-name:Detect self-collisions
-type:d 0 1 0
-help:Detect collisions within creature bodies (only applicable for the ODE simulation engine). This is the initial value of Creature.selfcol for all objects created in this group. If enabled, creatures with self-colliding genotypes are not born, and others will have their sticks collide during lifespan.
-
-prop:
-id:em_stat
-name:Muscle static work
-type:f 0 1 0
-help:~
-Energy requirements for a muscle
-resisting an external force~
-
-prop:
-id:em_dyn
-name:Muscle dynamic work
-type:f 0 1 0
-help:~
-Energy requirements for a muscle
-moving a stick~
-
-prop:
-id:en_assim
-name:Assimilation productivity
-type:f 0 1 0
-help:~
-Maximal energy gain produced by a vertical specialized stick.
-Horizontal specialized sticks get half of this value.~
-
-prop:
-id:createFromGenotype
-name:
-type:p oCreature()
-flags:34
-help:Uses the selected Genotype object
-
-prop:
-id:createFromString
-name:
-type:p oCreature(s genotype)
-flags:34
-help:Uses the supplied string argument
-
-prop:
-id:createFromGeno
-name:
-type:p oCreature(oGeno)
-flags:34
-help:Uses the supplied Geno object
-
-prop:
-id:findUID
-name:find creature by UID
-type:p d(s uid)
-flags:34
-
-prop:
-id:get
-name:get creature object
-type:p oCreature(d index)
-flags:34
-
-prop:
-id:senseCreaturesProperty
-name:senseCreaturesProperty
-type:p f(f x,f y,f z,s propertyname,oCreature exclude)
-flags:34
-help:~
-arguments:
- - x,y,z (sensor position)
- - property (name, name[index] or Class:id). name[index] can be used for Vector objects inside the user fields, eg "user2[10]"
- - exclude (creature object)
-works like a smell sensor for a given property (for all creatures in this group except "exclude").
-The following function reproduces the "classic" framsticks "S" sensor:
-function smellReceptorValue(x,y,z,exclude)
-{
-var i,s=0; for(i=0;i<Populations.size;i++)
-	s+=Populations[0].senseCreaturesProperty(x,y,z,"energy",exclude);
-return s;
-}~
-
-prop:
-id:findCreatureAt
-name:
-type:p oCreature(oVector point,oVector vector)
-flags:34
-
-prop:
-id:delete
-name:
-type:p(d creature index)
-flags:34
-help:delete creature
-
-prop:
-id:kill
-name:
-type:p(d creature index)
-flags:34
-help:kill creature
-
-prop:
-id:creatures
-name:Creatures
-type:l Creature uid
-
-prop:
-id:creatures_changed
-name:creatures list changed
-type:e ListChange
-
Index: java/main/src/test/resources/log4j2.xml
===================================================================
--- java/main/src/test/resources/log4j2.xml	(revision 105)
+++ java/main/src/test/resources/log4j2.xml	(revision 107)
@@ -9,4 +9,7 @@
 		<logger name="com.framsticks" level="info" />
 		<logger name="com.framsticks.test.TestConfiguration" level="info" />
+		<logger name="com.framsticks.standard" level="debug" />
+		<!-- <logger name="com.framsticks.experiment" level="debug" /> -->
+		<!-- <logger name="com.framsticks.test.PrimeExperiment" level="debug" /> -->
 
 		<!-- <logger name="com.framsticks.running.ExternalProcess" level="debug" /> -->
@@ -15,5 +18,5 @@
 		<!-- <logger name="com.framsticks.experiment.NetLoadSaveLogic" level="debug" /> -->
 		<!-- <logger name="com.framsticks.experiment.WorkPackageLogic" level="debug" /> -->
-		<!-- <logger name="com.framsticks.params.AccessOperations" level="debug" /> -->
+		<!-- <logger name="com.framsticks.params.AccessOperations" level="trace" /> -->
 		<!-- <logger name="com.framsticks.util.dispatching.AbstractJoinable" level="debug" /> -->
 		<!-- <logger name="com.framsticks.util.dispatching.AbstractJoinable.Report" level="info" /> -->
Index: java/main/src/test/resources/netfiles/standard.expt
===================================================================
--- java/main/src/test/resources/netfiles/standard.expt	(revision 105)
+++ java/main/src/test/resources/netfiles/standard.expt	(revision 107)
@@ -5,4 +5,5 @@
 overwrite:1
 filecomm:1
+lastCheckpoint:@Serialized:165
 createrr:1
 creatwarnfail:0
@@ -11,4 +12,6 @@
 groupchk:0
 resetonexpdef:1
+user:@Serialized:null
+identity:-1
 initialgen:X
 capacity:200
@@ -17,32 +20,32 @@
 rotation:0
 creath:0.1
-p_nop:20
+p_nop:20.0
 evalcount:0
-p_mut:64
-p_xov:16
-xov_mins:0
+p_mut:64.0
+p_xov:16.0
+xov_mins:0.0
 selrule:2
 delrule:0
-cr_c:0
-cr_life:0
-cr_v:1
-cr_gl:0
-cr_joints:0
-cr_nnsiz:0
-cr_nncon:0
-cr_di:0
-cr_vpos:0
-cr_vvel:0
+cr_c:0.0
+cr_life:0.0
+cr_v:1.0
+cr_gl:0.0
+cr_joints:0.0
+cr_nnsiz:0.0
+cr_nncon:0.0
+cr_di:0.0
+cr_vpos:0.0
+cr_vvel:0.0
 cr_norm:0
 cr_simi:0
-Energy0:5000
-e_meta:1
+Energy0:5000.0
+e_meta:1.0
 feed:0
-feede0:200
+feede0:200.0
 foodgen:
-feedtrans:1
+feedtrans:1.0
 aging:0
 stagnation:0
-minfitness:0
+minfitness:0.0
 boostphase:1
 makesound:0
@@ -50,22 +53,22 @@
 log:0
 notes:
-totaltestedcr:36
-totaltests:36
+totaltestedcr:165
+totaltests:165
 wrldtyp:0
-wrldsiz:20
+wrldsiz:20.0
 wrldmap:
-wrldwat:-1
+wrldwat:-1.0
 wrldbnd:0
-wrldg:1
+wrldg:1.0
 simtype:0
-nnspeed:1
+nnspeed:1.0
 odeshape:0
 odestep:0.05
-odemusclemin:0
-odemusclemax:10
-odemusclespeed:1
+odemusclemin:0.0
+odemusclemax:10.0
+odemusclespeed:1.0
 odeairdrag:0.01
 odewaterdrag:0.5
-odewaterbuoy:1
+odewaterbuoy:1.0
 odeseed:0
 odesepsticks:0
@@ -73,15 +76,15 @@
 odeworldcfm:1e-05
 odecolmumin:0.1
-odecolmumax:5
+odecolmumax:5.0
 odecolbounce:0.1
 odecolbouncevel:0.01
-odecolsoftcfm:0
-odecolsofterp:0
+odecolsoftcfm:0.0
+odecolsofterp:0.0
 odecol2mumin:0.1
-odecol2mumax:1
+odecol2mumax:1.0
 odecol2bounce:0.1
 odecol2bouncevel:0.01
-odecol2softcfm:0
-odecol2softerp:0
+odecol2softcfm:0.0
+odecol2softerp:0.0
 gen_hilite:1
 gen_extmutinfo:0
@@ -123,27 +126,27 @@
 f0_nodel_tag:1
 f0_nomod_tag:1
-f0_p_new:5
-f0_p_del:5
-f0_p_swp:10
-f0_p_pos:10
-f0_p_mas:10
-f0_p_frc:10
-f0_p_ing:10
-f0_p_asm:10
-f0_p_vsiz:0
-f0_j_new:5
-f0_j_del:5
-f0_j_stm:10
-f0_j_stf:10
-f0_j_rsf:10
-f0_j_vred:0
-f0_j_vgrn:0
-f0_j_vblu:0
-f0_n_new:5
-f0_n_del:5
-f0_n_prp:10
-f0_c_new:5
-f0_c_del:5
-f0_c_wei:10
+f0_p_new:5.0
+f0_p_del:5.0
+f0_p_swp:10.0
+f0_p_pos:10.0
+f0_p_mas:10.0
+f0_p_frc:10.0
+f0_p_ing:10.0
+f0_p_asm:10.0
+f0_p_vsiz:0.0
+f0_j_new:5.0
+f0_j_del:5.0
+f0_j_stm:10.0
+f0_j_stf:10.0
+f0_j_rsf:10.0
+f0_j_vred:0.0
+f0_j_vgrn:0.0
+f0_j_vblu:0.0
+f0_n_new:5.0
+f0_n_del:5.0
+f0_n_prp:10.0
+f0_c_new:5.0
+f0_c_del:5.0
+f0_c_wei:10.0
 f1_xo_propor:0
 f1_smX:0.05
@@ -155,5 +158,5 @@
 f1_nmConn:0.1
 f1_nmProp:0.1
-f1_nmWei:1
+f1_nmWei:1.0
 f1_nmVal:0.05
 f2_mutAddOper:0.4
@@ -173,12 +176,12 @@
 f3_xovGeneTransfer:0.8
 f3_xovCrossingOver:0.2
-f4_mut_add:50
-f4_mut_add_div:20
-f4_mut_add_conn:15
-f4_mut_add_neupar:5
-f4_mut_add_rep:10
-f4_mut_add_simp:50
-f4_mut_del:20
-f4_mut_mod:30
+f4_mut_add:50.0
+f4_mut_add_div:20.0
+f4_mut_add_conn:15.0
+f4_mut_add_neupar:5.0
+f4_mut_add_rep:10.0
+f4_mut_add_simp:50.0
+f4_mut_del:20.0
+f4_mut_mod:30.0
 genkonw0:1
 genkonw1:1
@@ -187,8 +190,8 @@
 genkonw4:1
 randinit:0.01
-nnoise:0
-touchrange:1
-bnoise_struct:0
-bnoise_vel:0
+nnoise:0.0
+touchrange:1.0
+bnoise_struct:0.0
+bnoise_vel:0.0
 ncl_N:1
 ncl_Nu:1
@@ -222,12 +225,12 @@
 ncl_SeeLight2:1
 simil_method:0
-simil_parts:0
-simil_partdeg:1
+simil_parts:0.0
+simil_partdeg:1.0
 simil_neuro:0.5
 symPosSteps:10
 symAlphaSteps:20
 symBetaSteps:20
-minjoint:0
-maxjoint:2
+minjoint:0.0
+maxjoint:2.0
 
 GenePool:
@@ -235,57 +238,57 @@
 fitness:return 0.0+this.velocity*1.0;
 fitfun:0
-fitm:2
-fitma:2
-
-org:
+fitm:2.0
+fitma:2.0
+
+Genotype:
 name:Uwuwit Si
 genotype:X
 info:
 num:1
-gnum:50
-popsiz:4
-lifespan:5000
-velocity:0
-distance:0
-vertvel:0
+gnum:0
+popsiz:6
+lifespan:5000.0
+velocity:0.0
+distance:0.0
+vertvel:0.0
 vertpos:-0.01
-user1:null
-user2:null
-user3:null
-uid:g6501
-
-org:
-name:Igoras Sy
-genotype:X[*]
-info:300.00% mutation of 'Uwuwit Si'
+user1:@Serialized:null
+user2:@Serialized:"2"
+user3:@Serialized:null
+uid:g1
+
+Genotype:
+name:Ezupan Si
+genotype:cX
+info:100.00% mutation of 'Uwuwit Si'
 num:2
-gnum:51
-popsiz:3
-lifespan:5000
-velocity:0
-distance:0
-vertvel:0
+gnum:1
+popsiz:2
+lifespan:5000.0
+velocity:0.0
+distance:0.0
+vertvel:0.0
 vertpos:-0.01
-user1:null
-user2:null
-user3:null
-uid:g6502
-
-org:
-name:Emofuf Sy
-genotype:wX[*]
-info:25.00% mutation of 'Igoras Sy'
+user1:@Serialized:null
+user2:@Serialized:null
+user3:@Serialized:null
+uid:g2
+
+Genotype:
+name:Omygut Sy
+genotype:cX[@]
+info:150.00% mutation of 'Ezupan Si'
 num:3
-gnum:52
-popsiz:3
-lifespan:5000
-velocity:0
-distance:0
-vertvel:0
+gnum:2
+popsiz:1
+lifespan:5000.0
+velocity:0.0
+distance:0.0
+vertvel:0.0
 vertpos:-0.01
-user1:null
-user2:null
-user3:null
-uid:g6503
+user1:@Serialized:null
+user2:@Serialized:null
+user3:@Serialized:null
+uid:g3
 
 Population:
@@ -304,7 +307,7 @@
 bodysim:1
 selfcol:0
-em_stat:0
-em_dyn:0
-en_assim:0
+em_stat:0.0
+em_dyn:0.0
+en_assim:0.0
 
 Population:
@@ -323,6 +326,6 @@
 bodysim:1
 selfcol:0
-em_stat:0
-em_dyn:0
-en_assim:0
-
+em_stat:0.0
+em_dyn:0.0
+en_assim:0.0
+
Index: java/main/src/test/resources/netfiles/standard_without_orgs.expt
===================================================================
--- java/main/src/test/resources/netfiles/standard_without_orgs.expt	(revision 107)
+++ java/main/src/test/resources/netfiles/standard_without_orgs.expt	(revision 107)
@@ -0,0 +1,280 @@
+sim_params:
+expdef:standard
+usercode:
+autosaveperiod:0
+overwrite:1
+filecomm:1
+lastCheckpoint:@Serialized:165
+createrr:1
+creatwarnfail:0
+importchk:0
+loadchk:0
+groupchk:0
+resetonexpdef:1
+user:@Serialized:null
+identity:-1
+initialgen:X
+capacity:200
+MaxCreated:1
+placement:0
+rotation:0
+creath:0.1
+p_nop:20.0
+evalcount:0
+p_mut:64.0
+p_xov:16.0
+xov_mins:0.0
+selrule:2
+delrule:0
+cr_c:0.0
+cr_life:0.0
+cr_v:1.0
+cr_gl:0.0
+cr_joints:0.0
+cr_nnsiz:0.0
+cr_nncon:0.0
+cr_di:0.0
+cr_vpos:0.0
+cr_vvel:0.0
+cr_norm:0
+cr_simi:0
+Energy0:5000.0
+e_meta:1.0
+feed:0
+feede0:200.0
+foodgen:
+feedtrans:1.0
+aging:0
+stagnation:0
+minfitness:0.0
+boostphase:1
+makesound:0
+savebest:0
+log:0
+notes:
+totaltestedcr:165
+totaltests:165
+wrldtyp:0
+wrldsiz:20.0
+wrldmap:
+wrldwat:-1.0
+wrldbnd:0
+wrldg:1.0
+simtype:0
+nnspeed:1.0
+odeshape:0
+odestep:0.05
+odemusclemin:0.0
+odemusclemax:10.0
+odemusclespeed:1.0
+odeairdrag:0.01
+odewaterdrag:0.5
+odewaterbuoy:1.0
+odeseed:0
+odesepsticks:0
+odeworlderp:0.2
+odeworldcfm:1e-05
+odecolmumin:0.1
+odecolmumax:5.0
+odecolbounce:0.1
+odecolbouncevel:0.01
+odecolsoftcfm:0.0
+odecolsofterp:0.0
+odecol2mumin:0.1
+odecol2mumax:1.0
+odecol2bounce:0.1
+odecol2bouncevel:0.01
+odecol2softcfm:0.0
+odecol2softerp:0.0
+gen_hilite:1
+gen_extmutinfo:0
+genoper_f0:0
+genoper_f1:0
+genoper_f2:0
+genoper_f3:0
+genoper_f4:0
+neuadd_N:1
+neuadd_Nu:0
+neuadd_G:1
+neuadd_T:1
+neuadd_S:1
+neuadd_Constant:1
+neuadd_Bend_muscle:1
+neuadd_Rotation_muscle:1
+neuadd_D:0
+neuadd_Fuzzy:0
+neuadd_VEye:0
+neuadd_VMotor:0
+neuadd_Sti:0
+neuadd_LMu:0
+neuadd_Water:0
+neuadd_Energy:0
+neuadd_Ch:0
+neuadd_ChMux:0
+neuadd_ChSel:0
+neuadd_Rnd:0
+neuadd_Sin:0
+neuadd_Delay:0
+neuadd_PIDV:0
+neuadd_Sf:0
+neuadd_Thr:0
+neuadd_Nn:0
+neuadd_SeeLight:0
+neuadd_PIDP:0
+neuadd_Light:0
+neuadd_SeeLight2:0
+f0_nodel_tag:1
+f0_nomod_tag:1
+f0_p_new:5.0
+f0_p_del:5.0
+f0_p_swp:10.0
+f0_p_pos:10.0
+f0_p_mas:10.0
+f0_p_frc:10.0
+f0_p_ing:10.0
+f0_p_asm:10.0
+f0_p_vsiz:0.0
+f0_j_new:5.0
+f0_j_del:5.0
+f0_j_stm:10.0
+f0_j_stf:10.0
+f0_j_rsf:10.0
+f0_j_vred:0.0
+f0_j_vgrn:0.0
+f0_j_vblu:0.0
+f0_n_new:5.0
+f0_n_del:5.0
+f0_n_prp:10.0
+f0_c_new:5.0
+f0_c_del:5.0
+f0_c_wei:10.0
+f1_xo_propor:0
+f1_smX:0.05
+f1_smJunct:0.02
+f1_smComma:0.02
+f1_smModif:0.1
+f1_mut_exmod:EeAaSsDdGgBbHh
+f1_nmNeu:0.05
+f1_nmConn:0.1
+f1_nmProp:0.1
+f1_nmWei:1.0
+f1_nmVal:0.05
+f2_mutAddOper:0.4
+f2_mutJointElem:0.33
+f2_mutNeuroElem:0.33
+f2_mutConnElem:0.33
+f2_mutDelOper:0.1
+f2_mutHandleOper:0.3
+f2_mutPropOper:0.2
+f3_mutSubstitution:0.6
+f3_mutSubstPerChar:0.1
+f3_mutDelIns:0.1
+f3_mutDelInsPerChar:0.05
+f3_mutDelInsLength:5
+f3_mutDuplication:0.05
+f3_mutTranslocation:0.15
+f3_xovGeneTransfer:0.8
+f3_xovCrossingOver:0.2
+f4_mut_add:50.0
+f4_mut_add_div:20.0
+f4_mut_add_conn:15.0
+f4_mut_add_neupar:5.0
+f4_mut_add_rep:10.0
+f4_mut_add_simp:50.0
+f4_mut_del:20.0
+f4_mut_mod:30.0
+genkonw0:1
+genkonw1:1
+genkonw2:1
+genkonw3:1
+genkonw4:1
+randinit:0.01
+nnoise:0.0
+touchrange:1.0
+bnoise_struct:0.0
+bnoise_vel:0.0
+ncl_N:1
+ncl_Nu:1
+ncl_G:1
+ncl_T:1
+ncl_S:1
+ncl_Constant:1
+ncl_Bend_muscle:1
+ncl_Rotation_muscle:1
+ncl_D:1
+ncl_Fuzzy:1
+ncl_VEye:1
+ncl_VMotor:1
+ncl_Sti:1
+ncl_LMu:1
+ncl_Water:1
+ncl_Energy:1
+ncl_Ch:1
+ncl_ChMux:1
+ncl_ChSel:1
+ncl_Rnd:1
+ncl_Sin:1
+ncl_Delay:1
+ncl_PIDV:1
+ncl_Sf:1
+ncl_Thr:1
+ncl_Nn:1
+ncl_SeeLight:1
+ncl_PIDP:1
+ncl_Light:1
+ncl_SeeLight2:1
+simil_method:0
+simil_parts:0.0
+simil_partdeg:1.0
+simil_neuro:0.5
+symPosSteps:10
+symAlphaSteps:20
+symBetaSteps:20
+minjoint:0.0
+maxjoint:2.0
+
+GenePool:
+name:Genotypes
+fitness:return 0.0+this.velocity*1.0;
+fitfun:0
+fitm:2.0
+fitma:2.0
+
+Population:
+name:Creatures
+energy:1
+death:1
+nnsim:2
+perfperiod:100
+stabilperiod:100
+killnostable:1000000
+stabledist:0.01
+enableperf:2
+colmask:13
+selfmask:65537
+othermask:131073
+bodysim:1
+selfcol:0
+em_stat:0.0
+em_dyn:0.0
+en_assim:0.0
+
+Population:
+name:Food
+energy:1
+death:1
+nnsim:0
+perfperiod:100
+stabilperiod:100
+killnostable:1000000
+stabledist:0.01
+enableperf:0
+colmask:148
+selfmask:131074
+othermask:65538
+bodysim:1
+selfcol:0
+em_stat:0.0
+em_dyn:0.0
+en_assim:0.0
+
