Index: cpp/frams/genetics/f4/f4_conv.cpp
===================================================================
--- cpp/frams/genetics/f4/f4_conv.cpp	(revision 1258)
+++ cpp/frams/genetics/f4/f4_conv.cpp	(revision 1259)
@@ -153,10 +153,10 @@
 f4_Cell* f4_Model::getStick(f4_Cell *C)
 {
-	if (C->type == CELL_STICK) return C;
+	if (C->type == f4_Cell_type::CELL_STICK) return C;
 	if (NULL != C->dadlink)
 		return getStick(C->dadlink);
 	// we have no more dadlinks, find any stick
 	for (int i = 0; i < cells->cell_count; i++)
-		if (cells->C[i]->type == CELL_STICK)
+		if (cells->C[i]->type == f4_Cell_type::CELL_STICK)
 			return cells->C[i];
 	// none!
@@ -177,5 +177,5 @@
 	// make sure parent is a stick
 	if (C->dadlink != NULL)
-		if (C->dadlink->type != CELL_STICK)
+		if (C->dadlink->type != f4_Cell_type::CELL_STICK)
 		{
 			C->dadlink = getStick(C->dadlink);
@@ -192,5 +192,5 @@
 	MultiRange range = C->genoRange;
 
-	if (C->type == CELL_STICK)
+	if (C->type == f4_Cell_type::CELL_STICK)
 	{
 		int jj_p1_refno;  // save for later
@@ -244,5 +244,5 @@
 	}
 
-	if (C->type == CELL_NEURON)
+	if (C->type == f4_Cell_type::CELL_NEURON)
 	{
 		const char* nclass = C->neuclass->name.c_str();
@@ -253,8 +253,4 @@
 			else
 				sprintf(tmpLine, "d=\"%s\"", nclass);
-
-			C->neuro_refno = addFromString(NeuronType, tmpLine, &range);
-			if (C->neuro_refno < 0) return -22;
-			this->checkpoint();
 		}
 		else if (C->neuclass->getPreferredLocation() == 1) // attached to Part or have no required attachment - also part
@@ -264,8 +260,4 @@
 
 			sprintf(tmpLine, "p=%d,d=\"%s\"", partno, nclass);
-
-			C->neuro_refno = addFromString(NeuronType, tmpLine, &range);
-			if (C->neuro_refno < 0) return -22;
-			this->checkpoint();
 		}
 		else // attached to Joint, assume there are only three possibilities of getPreferredLocation()
@@ -277,13 +269,14 @@
 			else if (strcmp(nclass, "|") == 0)
 			{
-				sprintf(tmpLine, "j=%d,d=\"|:p=%g,r=%g\"", jointno, C->P.muscle_power, C->dadlink->P.muscle_bend_range); //Macko 2023-05 change: we take muscle_bend_range from dadlink, not from C, because we also assign this neuron to C->dadlink->joint_refno. Without this, for example in /*4*/<<X><<<<X>N:|>X>X>X>X the muscle is attached to the junction with 3 sticks, but gets range=33% as in a four-stick junction. f1 correctly sets range=0.5 for the analogous phenotype: X(X[|],X(X,X,X))
+				sprintf(tmpLine, "j=%d,d=\"|:p=%g,r=%g\"", jointno, C->P.muscle_power, C->dadlink->P.muscle_bend_range); //Macko 2023-05 change: we take muscle_bend_range from dadlink, not from C, because we also assign this neuron to C->dadlink->joint_refno. Without this, for example in /*4*/<<X><<<<X>N:|>X>X>X>X the muscle is attached to the junction with 3 sticks, but gets range=33% as in a four-stick junction. f1 correctly sets range=0.5 (see also conv_f1_f0_branch_muscle_range) for the analogous phenotype: X(X[|],X(X,X,X))
 			}
 			else
 				sprintf(tmpLine, "j=%d,d=\"%s\"", jointno, nclass);
-
-			C->neuro_refno = addFromString(NeuronType, tmpLine, &range);
-			if (C->neuro_refno < 0) return -32;
-			this->checkpoint();
-		}
+		}
+
+		C->neuro_refno = addFromString(NeuronType, tmpLine, &range);
+		if (C->neuro_refno < 0) return -22;
+		this->checkpoint();
+
 		for (int j = 0; j < C->conns_count; j++)
 		{
Index: cpp/frams/genetics/f4/f4_general.cpp
===================================================================
--- cpp/frams/genetics/f4/f4_general.cpp	(revision 1258)
+++ cpp/frams/genetics/f4/f4_general.cpp	(revision 1259)
@@ -37,5 +37,5 @@
 {
 	nr = nnr;
-	type = CELL_UNDIFF;
+	type = f4_Cell_type::CELL_UNDIFF;
 	dadlink = ndad;
 	org = NULL;
@@ -62,5 +62,5 @@
 	{
 		// make sure it is a stick (and not a stick f4_Cell!)
-		if (ndad->type == CELL_STICK)
+		if (ndad->type == f4_Cell_type::CELL_STICK)
 		{
 			//firstend = ndad->lastend;
@@ -68,5 +68,5 @@
 			ndad->stickchildcount++;
 		}
-		if (ndad->type == CELL_NEURON)
+		if (ndad->type == f4_Cell_type::CELL_NEURON)
 		{
 			inertia = ndad->inertia;
@@ -84,5 +84,5 @@
 {
 	nr = nnr;
-	type = CELL_UNDIFF;
+	type = f4_Cell_type::CELL_UNDIFF;
 	dadlink = ndad;
 	org = nO;
@@ -112,5 +112,5 @@
 	{
 		// make sure it is a stick (and not a stick f4_Cell!)
-		if (ndad->type == CELL_STICK)
+		if (ndad->type == f4_Cell_type::CELL_STICK)
 		{
 			//firstend = ndad->lastend;
@@ -118,5 +118,5 @@
 			ndad->stickchildcount++;
 		}
-		if (ndad->type == CELL_NEURON)
+		if (ndad->type == f4_Cell_type::CELL_NEURON)
 		{
 			inertia = ndad->inertia;
@@ -173,5 +173,5 @@
 
 				// error: sticks cannot divide
-				if (type == CELL_STICK)
+				if (type == f4_Cell_type::CELL_STICK)
 				{
 					// cannot fix
@@ -181,5 +181,5 @@
 
 				// undiff divides
-				if (type == CELL_UNDIFF)
+				if (type == f4_Cell_type::CELL_UNDIFF)
 				{
 					// commacount is set only when daughter turns into X
@@ -194,5 +194,5 @@
 				}
 				// a neuron divides: create a new, duplicate connections
-				if (type == CELL_NEURON)
+				if (type == f4_Cell_type::CELL_NEURON)
 				{
 					// daughter cell
@@ -203,5 +203,5 @@
 					repeat.clear();
 					// it is a neuron from start
-					tmp->type = CELL_NEURON;
+					tmp->type = f4_Cell_type::CELL_NEURON;
 					// it has the same type as the parent neuron
 					tmp->neuclass = neuclass;
@@ -257,5 +257,5 @@
 				{
 					// error: still undiff
-					if (type == CELL_UNDIFF)
+					if (type == f4_Cell_type::CELL_UNDIFF)
 					{
 						// fix it: insert an 'X'
@@ -301,5 +301,5 @@
 			{
 				// error: if neuron
-				if (type == CELL_NEURON)
+				if (type == f4_Cell_type::CELL_NEURON)
 				{
 					// fix: delete it
@@ -331,5 +331,5 @@
 			{
 				// error: if neuron
-				if (type == CELL_NEURON) //some neurons have the same single-letter names as modifiers (for example G,S,D), but they are supposed to have is_neuroclass==true so they should indeed not be handled here
+				if (type == f4_Cell_type::CELL_NEURON) //some neurons have the same single-letter names as modifiers (for example G,S,D), but they are supposed to have is_neuroclass==true so they should indeed not be handled here
 				{//however, what we see here is actually modifiers such as IdqEbWL (so not valid neuroclasses) that occurred within an already differentiated cell of type==CELL_NEURON.
 					//printf("Handled as a modifier, but type==CELL_NEURON: '%c'\n", name);
@@ -346,5 +346,5 @@
 				// turn undiff. cell into a stick
 				// error: already differentiated
-				if (type != CELL_UNDIFF)
+				if (type != f4_Cell_type::CELL_UNDIFF)
 				{
 					// fix: delete this node
@@ -352,5 +352,5 @@
 					return;  // error code set -> stop further cells development
 				}
-				type = CELL_STICK;
+				type = f4_Cell_type::CELL_STICK;
 				// fix dad commacount and own anglepos
 				if (dadlink != NULL)
@@ -367,5 +367,5 @@
 				// connection to neuron
 				// error: not a neuron
-				if (type != CELL_NEURON)
+				if (type != f4_Cell_type::CELL_NEURON)
 				{
 					// fix: delete it
@@ -384,5 +384,5 @@
 				for (int i = 0; i < org->cell_count; i++)
 				{
-					if (org->C[i]->type == CELL_NEURON) neu_counter++;
+					if (org->C[i]->type == f4_Cell_type::CELL_NEURON) neu_counter++;
 					if (org->C[i] == this) { this_index = neu_counter - 1; break; }
 				}
@@ -398,5 +398,5 @@
 				for (from = 0; from < org->cell_count; from++)
 				{
-					if (org->C[from]->type == CELL_NEURON) neu_counter++;
+					if (org->C[from]->type == f4_Cell_type::CELL_NEURON) neu_counter++;
 					if (from_index == (neu_counter - 1)) break;
 				}
@@ -457,5 +457,5 @@
 				// neuron parameter
 				// error: not a neuron
-				if (type != CELL_NEURON)
+				if (type != f4_Cell_type::CELL_NEURON)
 				{
 					// fix: delete it
@@ -513,5 +513,5 @@
 		{
 			genoRange.add(gcur->pos, gcur->pos + int(gcur->name.length()) + 2 - 1); // +2 for N:
-			if (type != CELL_UNDIFF)
+			if (type != f4_Cell_type::CELL_UNDIFF)
 			{
 				// fix: delete this node
@@ -527,5 +527,5 @@
 			}
 			neuclass = gcur->neuclass;
-			type = CELL_NEURON;
+			type = f4_Cell_type::CELL_NEURON;
 			// change of type also halts development, to give other
 			// cells a chance for adjustment.  Namely, it is important
@@ -567,5 +567,5 @@
 	{
 		if (org->C[i]->dadlink == this)
-			if (org->C[i]->type == CELL_STICK)
+			if (org->C[i]->type == f4_Cell_type::CELL_STICK)
 				stickchildcount++;
 	}
@@ -575,7 +575,7 @@
 	else
 		P.muscle_bend_range = 1.0 / std::max(1, dadlink->stickchildcount); //bend range in f1: 0, 1 (line XX[|]) -> 100%, 2 (Y-shape X(X[|],X)) -> 50%, 3 (cross X(X[|],X,X)) -> 33%
-	//MacKo 2023-05: but shouldn't this formula ^^ also take commacount into consideration, like in f1?
-
-	if (type == CELL_STICK)
+	//MacKo 2023-05: but shouldn't this formula ^^ also take commacount into consideration, like in f1? Note: in f0, the range of a newly added muscle has the default value (1.0) until modified by mutation, and the range can be set to any value completely unrelated to the junction where the muscle is located. In f1, the range of a newly added muscle depends on the number of branches (commas) in the junction including empty branches (see also conv_f1_f0_branch_muscle_range), but can be overridden by the genotype due to mutation and any value can be directly set just as in f0 - e.g. X[|,r:0.8] - so the value based on the number of commas only serves as a default. Compared to f0 and f1, f4 enforces a specific range here and this cannot be changed in any way, because as of now (2023-05) there is no support to mutate neural properties except for the N neuron.
+
+	if (type == f4_Cell_type::CELL_STICK)
 	{
 		if (dadlink == NULL)
@@ -716,7 +716,7 @@
 	for (int i = 0; i < cell_count; i++)
 	{
-		if (C[i]->type == CELL_NEURON)
-		{
-			while (C[i]->dadlink->type == CELL_NEURON)
+		if (C[i]->type == f4_Cell_type::CELL_NEURON)
+		{
+			while (C[i]->dadlink->type == f4_Cell_type::CELL_NEURON)
 			{
 				C[i]->dadlink = C[i]->dadlink->dadlink;
@@ -729,7 +729,7 @@
 	for (int i = 0; i < cell_count; i++)
 	{
-		if (C[i]->type == CELL_UNDIFF)
-		{
-			C[i]->type = CELL_STICK;
+		if (C[i]->type == f4_Cell_type::CELL_UNDIFF)
+		{
+			C[i]->type = f4_Cell_type::CELL_STICK;
 			//setError();
 		}
@@ -764,8 +764,8 @@
 		switch (c->type)
 		{
-		case CELL_UNDIFF: type = "undiff"; break;
-		case CELL_STICK:  type = "STICK"; break;
-		case CELL_NEURON: type = string("NEURON:") + c->neuclass->name.c_str(); break;
-		default: type = std::to_string(c->type);
+		case f4_Cell_type::CELL_UNDIFF: type = "undiff"; break;
+		case f4_Cell_type::CELL_STICK:  type = "STICK"; break;
+		case f4_Cell_type::CELL_NEURON: type = string("NEURON:") + c->neuclass->name.c_str(); break;
+		default: type = std::to_string(static_cast<int>(c->type));
 		}
 		const char *status = c->gcur == c->old_gcur ? (c->gcur != NULL ? "no progress" : "") : (c->gcur != NULL ? "progress" : "finished"); //progress or no progress means the cell is yielding = not finished but decided to halt development and wait for other cells. New cells may be created in case of "no progress" status.
@@ -893,5 +893,5 @@
 	if (curc >= cell_count) return;
 
-	if (C[curc]->type != CELL_STICK) return;
+	if (C[curc]->type != f4_Cell_type::CELL_STICK) return;
 
 	f4_Cell *thisti = C[curc];
@@ -899,6 +899,12 @@
 		*tmpcel = *(thisti->dadlink);
 
-	// adjust length, curvedness, etc.
+	// Adjust length, curvedness, etc.
 	tmpcel->P.propagateAlong(false);
+
+	// The sequence of "while" loops below is a fast and simple heuristic (decrease as long as the value is too big, then increase as long as the value is too small).
+	// However, since every different sequence of upper- and lower-case modifiers produces a different value of a given property,
+	// all 2^N sequences should be tested to discover the best approximation of the target value of a given property using N modifiers.
+	// This issue is TODO if anybody needed this function (and modifier sequences it produces) for any serious use. Also, add support for Qq.
+	// See also GenoOperators::simplifiedModifiers() and geneprops_test.cpp.
 	while (tmpcel->P.length > thisti->P.length)
 	{
@@ -938,5 +944,5 @@
 	for (int i = 0; i < cell_count; i++)
 	{
-		if (C[i]->type == CELL_NEURON)
+		if (C[i]->type == f4_Cell_type::CELL_NEURON)
 		{
 			if (C[i]->dadlink == thisti)
@@ -971,5 +977,5 @@
 	for (int i = 0; i < cell_count; i++)
 	{
-		if (C[i]->type == CELL_STICK)
+		if (C[i]->type == f4_Cell_type::CELL_STICK)
 		{
 			if (C[i]->dadlink == thisti)
Index: cpp/frams/genetics/f4/f4_general.h
===================================================================
--- cpp/frams/genetics/f4/f4_general.h	(revision 1258)
+++ cpp/frams/genetics/f4/f4_general.h	(revision 1259)
@@ -33,12 +33,9 @@
 class f4_Cells;  // later
 
-
-/** @name Types of f4_Cell's */
-//@{
-#define CELL_UNDIFF 40 ///<undifferentiated cell
-#define CELL_STICK  41 ///<differentiated to stick, cannot divide
-#define CELL_NEURON 42 ///<differentiated to neuron, can divide
-//@}
-
+enum class f4_Cell_type {
+	CELL_UNDIFF, ///<undifferentiated cell
+	CELL_STICK,  ///<differentiated to stick, cannot divide
+	CELL_NEURON  ///<differentiated to neuron, can divide
+};
 
 class f4_CellConn;
@@ -154,5 +151,5 @@
 	 * at least once. If one cell requires another one to develop, oneStep
 	 * should be deployed again on this cell.
-	 * 
+	 *
 	 * This method, unlike genotype tree creation, checks semantics. This means that
 	 * this function will fail (set error code) if:
@@ -184,5 +181,5 @@
 
 	int        nr;                 ///<number of cell (seems to be used only in the approximate f1 converter for neuron connections)
-	int        type;               ///<type
+	f4_Cell_type type;             ///<type
 	f4_Cell *dadlink;              ///<pointer to cell parent
 	f4_Cells  *org;	               ///<uplink to organism
@@ -462,21 +459,21 @@
  * @return a pointer to the f4_Node object representing the f4 tree root
  */
-//f4_Node* f4_processTree(const char *geno);
-
-/**
- * Scans a genotype string starting from a given position. This recursive method creates
- * a tree of f4_Node objects. This method extracts each potentially functional element
- * of a genotype string to a separate f4_Nodes. When the branching character '<' occurs,
- * f4_processRecur is deployed for the latest f4_Node element. This method does not
- * analyse the genotype semantically, it only checks if the syntax is proper. The only
- * semantic aspect is neuron class name extraction, where the GenoOperators
- * class is used to parse the potential neuron class name.
- * This is an internal function; for regular cases, use f4_process().
- * @param genot the string with the entire genotype
- * @param genot_len length of genot (precomputed for efficiency)
- * @param pos_inout the current position of processing in string (advanced by the function)
- * @param parent current parent of the analysed branch of the genotype
- * @return 0 if processing was successful, otherwise returns the position of an error in the genotype
- */
+ //f4_Node* f4_processTree(const char *geno);
+
+ /**
+  * Scans a genotype string starting from a given position. This recursive method creates
+  * a tree of f4_Node objects. This method extracts each potentially functional element
+  * of a genotype string to a separate f4_Nodes. When the branching character '<' occurs,
+  * f4_processRecur is deployed for the latest f4_Node element. This method does not
+  * analyse the genotype semantically, it only checks if the syntax is proper. The only
+  * semantic aspect is neuron class name extraction, where the GenoOperators
+  * class is used to parse the potential neuron class name.
+  * This is an internal function; for regular cases, use f4_process().
+  * @param genot the string with the entire genotype
+  * @param genot_len length of genot (precomputed for efficiency)
+  * @param pos_inout the current position of processing in string (advanced by the function)
+  * @param parent current parent of the analysed branch of the genotype
+  * @return 0 if processing was successful, otherwise returns the position of an error in the genotype
+  */
 int f4_processRecur(const char *genot, const int genot_len, int &pos_inout, f4_Node *parent);
 
Index: cpp/frams/genetics/f4/f4_oper.cpp
===================================================================
--- cpp/frams/genetics/f4/f4_oper.cpp	(revision 1258)
+++ cpp/frams/genetics/f4/f4_oper.cpp	(revision 1259)
@@ -15,9 +15,10 @@
 //
 // TODO the behavior of neuron input indexes during mutation seems badly implemented (see also TREAT_BAD_CONNECTIONS_AS_INVALID_GENO). Are they kept properly maintained when nodes are added and removed? This could be done well because during mutation we operate on the tree structure with cross-references between nodes (so they should not be affected by local changes in the tree), and then convert the tree back to string. Yet, the f4_Node.conn_from is an integer and these fields in nodes do not seem to be maintained on tree node adding/removal... change these integer offsets to references to node objects? But actually, do the offsets that constitute relative connection references concern the f4_Node tree structure (and all these sophisticated calculations of offsets during mutation are useful) or rather they concern the f4_Cells development? verify all situations in f4_Cell::oneStep(), case '['.
-// TODO in mutation, adding the '#' gene does not seem to be effective. The gene is added and genotypes are valid, but hardly ever #n is effective, i.e., it hardly ever multiplicates body or brain parts... investigate! And maybe, during repair or mutations, simplify/remove ineffective #N genes, if there is no chance/hardly any chance that they will be turned effective after future mutation (or crossover)
+// TODO in mutation, adding the '#' gene does not seem to be effective. The gene is added and genotypes are valid, but hardly ever #n is effective, i.e., it hardly ever multiplicates body or brain parts... investigate! Maybe most places it is added at are ineffective. And maybe, during repair or mutations, simplify/remove ineffective #N genes, if there is no chance/hardly any chance that they will be turned effective after future mutation (or crossover)
 // TODO add support for properties of (any class of) neurons - not just sigmoid/force/intertia (':' syntax) for N
 // TODO add mapping genotype character ranges for neural [connections]
-// TODO The f0 genotypes for /*4*/<<RX>X>X> and RX(X,X) are identical, but if you replace R with Q or C, there are small differences (they were present both before and after the Q,C change in f1 in 2023-05) - check why and perhaps unify?
+// TODO The f0 genotypes for /*4*/<<RX>X>X> and RX(X,X) are identical, but if you replace R with C or Q, there are small differences (they were present both before and after the change in C,Q effects in the f1 converter in 2023-06, see conv_f1_f0_cq_influence) - check why (modifiers affecting cells=sticks are applied differently or skip some initial sticks?) and perhaps unify with f1?
 // TODO F4_SIMPLIFY_MODIFIERS in f4_general.cpp: currently it works while parsing (which is a bit "cheating": we get a phenotype that is a processed version of the genotype, thus some changes in modifiers in the genotype have no effect on its phenotype). Another (likely better) option, instead of simplifying while parsing, would be during mutations (like it is done in f1): when mutations add/modify/remove a modifier node, they could "clean" the tree by simplifying modifiers on the same subpath just as GenoOperators::simplifiedModifiers() does. This way, simplifying would be only performed when we actually modify a part of a genotype, not each time we interpret it, and there would be no hidden mechanism: all visible genes would have an expected effect on the phenotype.
+// TODO improve the way modifiers are handled in the f4->f1 approximate converter (used extremely rarely just for illustration)
 
 
@@ -43,16 +44,16 @@
 {
 	{ "Genetics: f4", 1, F4_COUNT + F4_ADD_COUNT + F4_MODNEU_COUNT + 2, },
-	{ "f4_mut_add", 0, 0, "Add node", "f 0 100 50", FIELD(prob[F4_ADD]), "Mutation: probability of adding a node", },
-	{ "f4_mut_add_div", 0, 0, "- add division", "f 0 100 20", FIELD(probadd[F4_ADD_DIV]), "Add node mutation: probability of adding a division", },
-	{ "f4_mut_add_conn", 0, 0, "- add connection", "f 0 100 15", FIELD(probadd[F4_ADD_CONN]), "Add node mutation: probability of adding a neural connection", },
-	{ "f4_mut_add_neupar", 0, 0, "- add neuron property", "f 0 100 5", FIELD(probadd[F4_ADD_NEUPAR]), "Add node mutation: probability of adding a neuron property/modifier", },
-	{ "f4_mut_add_rep", 0, 0, "- add repetition '#'", "f 0 100 10", FIELD(probadd[F4_ADD_REP]), "Add node mutation: probability of adding the '#' repetition gene", },
-	{ "f4_mut_add_simp", 0, 0, "- add simple node", "f 0 100 50", FIELD(probadd[F4_ADD_SIMP]), "Add node mutation: probability of adding a random, simple gene", },
-
-	{ "f4_mut_del", 0, 0, "Delete node", "f 0 100 20", FIELD(prob[F4_DEL]), "Mutation: probability of deleting a node", },
-
-	{ "f4_mut_mod", 0, 0, "Modify node", "f 0 100 30", FIELD(prob[F4_MOD]), "Mutation: probability of changing a node", },
-	{ "f4_mut_modneu_conn", 0, 0, "- neuron input: modify source", "f 0 100 60", FIELD(probmodneu[F4_MODNEU_CONN]), "Neuron input mutation: probability of changing its source neuron", },
-	{ "f4_mut_modneu_weight", 0, 0, "- neuron input: modify weight", "f 0 100 40", FIELD(probmodneu[F4_MODNEU_WEIGHT]), "Neuron input mutation: probability of changing its weight", },
+	{ "f4_mut_add", 0, 0, "Add node", "f 0 100 4", FIELD(prob[F4_ADD]), "Mutation: probability of adding a node", },
+	{ "f4_mut_add_div", 0, 0, "- add division", "f 0 100 4", FIELD(probadd[F4_ADD_DIV]), "Add node mutation: probability of adding a division", },
+	{ "f4_mut_add_conn", 0, 0, "- add connection", "f 0 100 1", FIELD(probadd[F4_ADD_CONN]), "Add node mutation: probability of adding a neural connection", },
+	{ "f4_mut_add_neupar", 0, 0, "- add neuron property", "f 0 100 1", FIELD(probadd[F4_ADD_NEUPAR]), "Add node mutation: probability of adding a neuron property/modifier", },
+	{ "f4_mut_add_rep", 0, 0, "- add repetition '#'", "f 0 100 1", FIELD(probadd[F4_ADD_REP]), "Add node mutation: probability of adding the '#' repetition gene", },
+	{ "f4_mut_add_simp", 0, 0, "- add simple node", "f 0 100 4", FIELD(probadd[F4_ADD_SIMP]), "Add node mutation: probability of adding a random, simple gene", },
+
+	{ "f4_mut_del", 0, 0, "Delete node", "f 0 100 1", FIELD(prob[F4_DEL]), "Mutation: probability of deleting a node", },
+
+	{ "f4_mut_mod", 0, 0, "Modify node", "f 0 100 1", FIELD(prob[F4_MOD]), "Mutation: probability of changing a node", },
+	{ "f4_mut_modneu_conn", 0, 0, "- neuron input: modify source", "f 0 100 3", FIELD(probmodneu[F4_MODNEU_CONN]), "Neuron input mutation: probability of changing its source neuron", },
+	{ "f4_mut_modneu_weight", 0, 0, "- neuron input: modify weight", "f 0 100 3", FIELD(probmodneu[F4_MODNEU_WEIGHT]), "Neuron input mutation: probability of changing its weight", },
 
 	{ "f4_mut_max_rep", 1, 0, "Maximum number for '#' repetitions", "d 2 20 6", FIELD(mut_max_rep), "Maximum allowed number of repetitions for the '#' repetition gene", },
