CDR

Brain Information

The brain model in Creatures 3 is very different from that in the previous Creatures games. The gene for the brain is totally different and very little information is available at the moment. My genetics editor for C3 only displays limited information on the various genes related to brain lobes.The Brain-in-a-vat program, available at the Creatures Developer Network, has lots of useful information and I recommend getting that.

I've done quite a bit of digging into the C3 brains and brain related genetics and I'll be putting the information here as I work things out. In the meantime, here is a post I recently put on the CDN newsgroups, about working out the new state variable rules in C3 brain lobes. More to come!

I've made some progress on working out the state variable rules for brain lobes. I've been experimenting with the noun lobe and I can now manually work through the svrules for that lobe and get the same values that the brain in a vat works out for the neuron values of that lobe. I'll show what I've got so far - if you've got the C3 genetics kit or know how these things work, don't laugh too hard at my attempt to work it out below :-)

If you look at the noun lobe using my genetics editor, in the hex dump of the lobe data, the svrule for neuron state update starts at byte offset 0045 (all numbers in hex). Each svrule line is 3 bytes long. The first byte seems to be a general opcode and the next two relate to what arguments are passed to that opcode. A full update svrule seems to be 10 (hex) statements of 3 bytes. So from 0045 -> 0074 is the update svrule in a lobe.

Working through the noun lobe line by line:

0045: 1E 03 03

Opcode 1E seems to be ignored - that is, the whole svline is skipped.

0048: 13 0B 9E

The '0B' means to take the literal floating point value for that line and use it as the argument to the first byte (the 13). The literal floating point value of a line can be displayed using BRN: DMPL and set using SETL. These are the svrule values displayed in b-in-a-v. They appear to be set by default to a value based on the third byte of each svrule line - in this case the 9E. b-in-a-v displays the value for this line as +0.637 [input signficance]. 0.637 is very close to 9E divided by FF - and this seems to be close to how this value is worked for all lines - not exactly though so I'm not quite sure how it is derived. So, the '0B 9E' means take the value 0.637 and use it as the argument to '13'. The '13' means multiply the current svrule value by the argument. As this is the first svrule line, the current svrule value is zero. So this first line, the first time through, seems to do nothing.

004B: 10 03 00

The '03' says to look up the neuron state value indexed by the third byte for the current neuron being computed. So '03 00' gets the state value 0 for the current neuron. Let's say this value is currently 1.0. The '10' means Add the value of its argument to the current state rule value. So we've got 0 + 1.0 = current state rule value of 1.0.

004E: 18 0B 0C

As before, the '0B 0C' says grab the floating point literal value - 0C translates to +0.048 and in b-in-a-v this is defined as [relaxation rate]. The '18' says get the absolute value of its arguments and store in state rule value 2 (seems to be some sort of temporary calculation holding point). The state rule value is still 1.0 at this point.

0051: 19 09 00

The '09' is a code for floating point value '0.0'. The '19' is a calculation that works out the following:

(1.0 - state_rule_value_2) * current_state_rule_value + (argument * state_rule_value_2)

Which in this case is (1.0 - 0.048) * 1.0 + (0.0 * 0.048) = 0.952. This current state rule value is set to the result of this calculation. So the current svrule value is 0.952.

0054: 02 03 00

The '02' means store the current svrule value somewhere. The '03 00' is where to store it. In this case '03' means in the neuron state variable indexed by the '00'. If the value is < -1.0 or > 1.0 it is set to -1.0 or 1.0 respectively. So the state variable number 0 of the current neuron is set to 0.952.

0057: 06 0B 01

'0B 01' is the literal value +0.004. '06' is a conditional statement that says if(current_state_rule_value > literal) then do the next statement otherwise go to the following statement. So in this case we do the next statement.

0059: 00 0B 01

The '00' means to stop processing. So we've finished and the neuron state value has been set to .952.

If you use b-in-a-v and set a noun lobe neuron to 1.0 and single step, you'll see it does go to .952. Then .906 which the formulae above work out as well when starting with .952. If the value drops below .004 in the previous statement then the next svrule line would be processed but I'm giving up at this point...need some zzzz's.

I've worked out quite a few of the other opcodes and will post some more info later. Hope the above helps your looking into how the lobes work things out.

Cheers,
Chris.