Multicellular Auto-evo

Expanding auto-evo into the multicellular stage scares people. I think the main reason is the combinatoric magnitude of multiplying the number of ways you could add a cell times the number of organelles you could add to a cell (gonna feel strange not calling it “a microbe” for a while). This, fortunately, is a matter that mutation strategies were conceived to address.

Here’s an example set of mutation strategies that can make a wide variety of creatures. Lets start with this simple starting clump:

  • Differentiate forward: make a new cell type, mutate it once, place it on the front of the central column

  • Differentiate Backwards: As before, but you add it to the bottom of the central column:

  • Grow Forwards(cell_type): For all instances of that cell type, if the front-left and front-right positions are empty, but another instance of that cell in that spot:

  • Grow Backwards(cell_type): As before, but with the rear-left and rear-right spots:

With these four rules, here’s a few species I can make with five mutations:

These shapes can be made by not iterating over possible positions in the grid, only iterating over mutation strategies. That gives you 2 + 2 * the number of cell types possible moves to try, with the differentiate strategy probably inherently having some subtypes that involve special differentiating mutations in the new cell (but not every miche has every mutation as a mutation strategy). This set of rules also happens to force all species to be bilaterally symmetrical, and won’t permit, for example, this species to emerge

It’s possible to limit (or eliminate) these restrictions with enough mutation strategies, but I would actually discourage it. First off, this might result in some really cursed looking creatures, but more importantly we have a much better source of originality: the player. Even a small change a player makes early in multicellular changes the set of possible designs for that run, most of which won’t look at all like a copy-cat of what the player actually made. As species start having more shapes and taking on “personality”, making sure the same species don’t show up game after game will become more important. Remember: the goal of mutation strategies is not to capture all possible actions in the editor, or even to ensure that any body plan can be made eventually, but to ensure a wide enough variety of potentially viable body plans to create diversity.

So what scares me in multicellular auto-evo? The selection pressures. In microbe stage, placement of organelles doesn’t matter most of the time, and microbes are are roughly circular exempting some very long line cells that don’t evolve until very late in microbe stage, if at all. In multicellular, cells of different types are on opposite parts of the body, and geometry starts to matter. Grasping tentacles are very advantageous (and awesome), but if they are not near the mouth, don’t pull things towards a mouth, or are surrounded on all sides by a hard shell, they do nothing.

Clever use of mutation strategies might help us a little here: the differentiation strategy that mutates a cell to have pulling cillia might only branch off from a cell that can engulf, for example. Simple geometry rules can also help: If you can engulf, but all six adjacent slots have a cell in them, then that doesn’t matter very much. In many (particularly heterotrophic) cases, however, I expect things to get tricky, and we will likely need to be smarter.

I think multicellular is the right time to start bringing up the idea of miches not directly reflected in the gameplay itself. For example, drought resistant plants are important in an alien biosphere, but we might never actually implement droughts in-game, because we decide generations aren’t lasting that long in later stages for example. Particularly while we still work out how gameplay really works in multicellular, I would suggest starting out with a few “silly” miches just to get some basic designs on the field, and start playing with and against them:

  • a “snowflake” miche that rewards maximizing surface area
  • a “blob” miche for minimizing surface area
  • a miche for maxing out single-target damage (without starving to death)
  • a miche for the widest “mouth” (vaguely defined)

As other parts of multi-cell solidify, a couple of these might solidify into something backed by science and or gameplay, and others will get removed. With our dreams of getting multicellular done much faster than we did microbe, however, I don’t think we have time to wait until the gameplay of multicell is fully fleshed out before scaffolding for auto-evo is built, nor do I think we will be able to try out gameplay very well until other species are forming into anything interesting.

5 Likes

Very nice to see thought on auto-evo for the Multicellular already. That was one thing that spooked me a bit, so I’m glad the miche grandfather is going for it.

Not sure I have much substance to add as to the quality of your points. One thing I brought up on Discord briefly in regards to auto-evo, that may or may not be addressed by this post - I wonder if it’s possible to decrease the granularity of adaptation considered for the Multicellular Stage.

In the Microbe Stage, mutation seems to be based on a part-by-part basis. With the Multicellular Stage - like you mention - shape and macrostructure becomes more important. So what if instead of auto-evo thinking in terms of “should I put a merabolosome here?” it thinks “would it be best to make the entire perimeter of my organism rigid?” or “should I put on a whole lot of slime jets to seriously boost speed?”

This could very well easily already be handled, or be dealt with cohesively with your writing here. For example, you mentioning the “biggest mouth” or “fat blob” miche kind of is in that same direction. Not an auto-evo wizard - just sounding out thoughts :sweat_smile:

2 Likes

Glad to see some thought going into this, as it’s definitely very important. What you’ve lined out for mutation strategies seems like a good base to get started on making things look interesting.


One thing I want to say right from the start though. I have mainly stated this in the multicellular concepts thread, so many people will have missed it:

Our current pattern of “enter Multicellular Stage with one cell, then build, differentiate and design from there” is a very poor fit for the real-life development of multicellular life and is an awkward transition from potentially living several generations mainly in colonies. For both of these reasons, it would be in my opinion much preferable to start the stage with a little blob of identical cells that you then start differentiating.

So it would be good for auto-evo concepts to have some notion of adapting cells already on the grid into different cell types.

For me as well. Because you haven’t mentioned it, but these selection pressures also apply to the player species, that’s how the population calculations work. So the scoring systems need to handle player-made cells decently well, or we’re going to get the same problem as what I have been trying to eliminate from Microbe Stage: The player very well designing an effective organism, but the auto-evo system saying “Nah, that’s terrible, you’re going extinct.”

One option is to go a bit mild on geometry-related scoring so that players don’t get destroyed and use mutation strategies that can only make “good” geometry like you said. But I think there are limits to that.

Microbe stage auto-evo does take positioning into account for some of the organelles, like movement tools (and in my ongoing PR I’ve added pili to this). Could we do something similar with cell placement in macroscopic? “Mouth cells” should go towards the front, etc.?

I also have had plans for this in the Microbe Stage that I still want to do. But the only thing holding me back from this is auto-evo calculation times. And I don’t think that’s going to get any easier for Multicellular.


Other assorted thoughts:

Cell differentiation

You briefly referenced it, but we functionally have two layers of editing here: cell level and organism level. So I’ve been wondering if we can have a two-layer auto-evo.

I think Deus and I have settled on the idea that creating specialised cell types is a big theme of the Stage. So what I would want to do is have the organism-level auto-evo decide “We want to have mouth cells on the front”, then makes a new cell-type, names it “Mouth” and slaps it on the front.

It then passes the buck to the cell-specific auto-evo which uses the mechanics of our Microbe Stage auto-evo with a special set of miches to evaluate how good of a mouth this mouth cell is, and evolve it in that direction. The organism-level auto-evo only gets fed back that score and decides when it wants to improve some cell-type.

To add another example:

This would be a case of organism-scale auto-evo wanting to maintain a perimeter of “skin” cells, and then instructing that cell type to use the “skin” miche nodes.

Time-scale split

I want to actively advocate for having Multicellular Stage on a separate time-scale from Microbe Stage. Meaning that once you enter it, auto-evo spends most of it time on Multicellular Auto-evo, only occasionally doing a round on Microbe-stage species. Auto-evo calculating times are already limiting for just Microbe Stage. So I think we need to do this to have any depth in Multicellular auto-evo.

3 Likes

I accept this title, mostly due to the logical implication that @Gamedungeon is now “miche daddy”

My hope would be that mutations across a cell type would achieve some of this. There’s also nothing wrong with a “spend all your remaining mutation points on X” mutation strategy; they don’t need to resemble single editor moves.

At this point I consider that the cannon game-design. That’s why I started my examples with a small blob. Maybe the blob is a slightly different grouping of five cells (5 is how many you need to start multicellular, so it makes sense to me that that’s the starting size) in order to “seed” different evolutionary bodyplans in different worlds…

I would agree. I would also have the million years between editor cycles decrease with each stage accordingly just for the extra bit of accuracy.

4 Likes

Ah, I see I misunderstood the first image, I thought was already the first round of cells being added.

The main point I was trying to bring across is that the mutation strategies you proposed so far only add cells to the organism in different patterns (and differentiate to create new cell types to place). I do think it would be good to also have a chance to replace some already existing cells with a different type, or delete existing cells.

I wouldn’t count on the Stage transition requirement being a 5 cell colony staying long-term. I think there’s enough thoughts going around that it’s a bit odd that you can immediately transition the generation that you place binding agents.So I don’t think we should feel “shackled” by that number when deciding what “starting blobs” should look like.

I like the idea of starting off with different blob shapes. In the concept thread I suggested having shapes based on the cell membrane type, but something more random could also work. I think this would not just differentiate between worlds, but also between independent multicellular lineages on the same world.

I would also have the million years between editor cycles decrease with each stage accordingly just for the extra bit of accuracy.

Yes, I think this should just go hand in hand with editor frequency changes.

1 Like

I think I will have time soon to start trying to work auto-evo into the Multicellular Stage. But that raises a couple of questions that I think we should still resolve first:

Time-scale and miches:

There are two connected questions here:

  • Should the Multicellular Stage operate on a different timescale than the Microbe Stage?
  • Should Multicellular Species work on a miche tree separate from the

Firstly, the reason they are connected is because I don’t think it is a good idea in our current auto-evo set-up to have species that are evolving at different rates competing over the same miches. That would I believe result in the faster evolving species quickly taking over every miche they could theoretically fill (which in this case would be all of them), with no chance to respond and thus extinction for the species left behind, which does not seem like something we want. (with as possible exception Awakening/Society stage where “extinction due to no chance to adapt against these crazy sapients” could be a deliberate theme)

On the other hand, if Multicellular stage operates on the same time-scale, or has a separate miche tree, the above is not a problem.

I previously advocated strongly for advocated in favour of changing the time-scale (which at least @Thim agreed) with, mainly out of fear over auto-evo times. That situation is a bit less critical now, so I think we can also entertain the alternative option. (though it’s still a concern)

Meanwhile, at least @Gamedungeon has expressed an interest in using the same miche tree for Microbe and Multicellular, since in real life these compete over (mostly) the same niches (which is true). Single-celled and Multicellular life can co-exist if we add additional leaf miche node that particularly lean towards the single-celled. (though again, I strongly believe this also requires them to operate on the same time-scale)

As for the real-life accuracy perspective on the time-scale question, Wikipedia graphic for reference:

Timeline of life on earth

(Found on the Wikipedia page for the Timeline of life)

A cursory glance would suggest that the “no time-scale difference option” is reasonable. About 1500 million years of pre-cambrian Multicellular life compared to about 2750 million years of single-celled life before that. 2750 / 1500 = ~1.8

A slightly more detailed look would reveal that if we’re looking at animals specifically, the date is 750 milllion years ago at the earliest, so that would instead be ~250 million years versus ~3500 million years. 3500 / 250 = 14

Taking the latter would be a clear indication in favour of making a time split here, while the former timeline would be the opposite.


I don’t think I have a strong opinion in favour of one or the other option anymore, though making the timescale different is probably the safer option for performance.

But we do need to pick an option before development on this feature can really begin!

2 Likes

I think the situation is not as dire as this, because I think work can start on the mutation algorithms and calculations on how much energy multicellular species could get in auto-evo even before deciding if the miche trees should be combined. And maybe the timescale problem could be at least partially solved by limiting the MP that microbe stage species get (maybe like 50%).

Though I do agree that one of the biggest design questions for multicellular auto-evo is the timescale and whether they share a miche tree with microbe species.

1 Like

I’m about ready to start on getting Multicellular auto-evo working. I will likely work on getting the scoring working first. From previous discussion, I think the consensus was to use the same selection pressures as for Microbes. Though that will later require either the addition of more miches so that single-celled life does not go extinct, or the seperation of Multicellullar Species into a different Miche tree. (Optionally also with a time scale split) But the scoring should work for both scenarios.

So I will start by modifying the scoring for each SelectionPressure to work for Multicellular Species in addition to microbe species. (In addition to letting the auto-evo/population system work on them at all).

But I still have a few questions on how exactly we want to implement things code-wise.

  • Right now lots of critical methods like GetCompoundGeneratedFrom in the SimulationCache are explicit about needing to be passed a MicrobeSpecies specifically. Should these be made to receive any type of species and then split into Microbe or Multicellular afterwards, or do we want to create parallel versions of these methods exclusively for Multicellular species?
  • As said, not something that I would work on first, but same question as above, for MutationStrategies.

(The SelectionPressures themselves do seem to have been written with expansion to other species types in mind.)

I am sure there will be other questions along the way I have not thought of yet, so if anyone has any warnings or tips for me, now would be a good time.

2 Likes

There should be parallel methods. We use C# so we can have as many functions with the same name as we like, as long as at least one given parameter type is different.

Theoretically if the code would work for any species it would be fine to just take in the base species, but it’s going to be a very long time until macroscopic species work in auto-evo so that’s why I’d like to keep it explicit what the code supports and what when tried to be passed in would actually just blow up auto-evo.

2 Likes

Originally the miche system had multicell support, it just got dropped when trying to port it back into the main thrive tree (link). IMutationStrategy takes in a species when it is declared (IMutationStrategy<MicrobeSpecies>) I think it was generally assumed that mutation strategies for microbes would be fully incompatible with multicell so we need to make a complete set of new ones. Under the list of mutation strategies for microbe there was a second list for multicell. Simulation Cache just took in Species for all of the keys. Most of these design decisions were made in Thim’s prototype, and we can change any of them, but that is the current status quo.

4 Likes

To recap, Auto-evo is now:

  • Giving scores on a basic level similar to what is done for Microbes.
  • Creating new species from existing Multicellular species
  • Creating new cell types for new organelle types (and then placing one)
  • Deleting organelles from individual cell types
  • Editing some general species functions like environmental tolerance and behaviour.

It is not yet:

  • Turning non-player Microbes into Multicellular species.
  • Placing more organelles in existing cell types.
  • Using more location-dependent score calculations. (no, that pilus pointing inwards into another cell is not useful)
  • Trying to place cells with highly location-dependent organelles more intelligently.

A while back I created another thread, mainly because I wanted to see if we could make some fundamental changes to the architecture before adding more features (that would make the conversion harder). While some other structural changes came from that, that original reason I started that thread ended up not happening yet. However, I don’t think I can further postpone adding more features if we want to have Multicellular auto-evo in a presentable state by the end of the year.


First on the list is having non-player Microbe Species become Multicellular independently. Doing this by method of a new Mutation Strategy has gone well so far, with new mutants being successfully created as branches from existing species and showing up in the results. However, I did hit something of a roadblock: applying mutations to existing species. In the cases where auto-evo decides to add a new Multicellular lineage as a branch things work fine, but when it takes a Multicellular Mutant as being the overall best choice, it tries to apply it to the original MicrobeSpecies, which obviously fails.

I can see broadly two ways to resolve this:

  1. Find a way to replace the original Microbe Species with a Multicellular Species. This would be closest to what happens with the player, but it can’t use the exactly the same method (unmodified) I believe.
  2. Find a way to force a Multicellular mutation to not be picked as the primary mutation, and instead only be used to create a new branch species. This would have the benefit of always giving them a fully new name, if that is desired.

I am overall leaning towards option 1, but I am happy to hear any suggestions.

3 Likes

Well I think from code side 2 might be easier. And also it would be useful to have a different path for species advancing stages for the future where we need to do stuff like show a countdown like “10 generations until species X is advancing to the next stage” (like once it is basically a time limit for the player). So from that side as well it would be useful to leave species turning into another stage as a separate function of auto-evo and not just go through the normal mutations path for it.

1 Like

Alright, I’ll give that a try first then!

Well, right now I do just have it as a mutation option, so that auto-evo can decide as usual whether it’s actually a good idea. But also because I am not entirely where and how else, and under what conditions, we would want the transition to be triggered. Using mutations, I do think I can manage on the post-mutations auto-evo side to “hold up” any Multicellular Species that get generated too early once we have things like a time limit.

Otherwise, I would have to indeed look at auto-evo before the mutation system is run. I can probably also implement it there, but the question would then indeed be when to actually run it. (The mutation system has the advantage of only generating multicellular species when it seems advantageous to the species).

Even though it’s technically not absolutely necessary yet because of the Microbe and Multicellular operating on the same timescales, I do plan to add a difficulty option for “disallow other species progressing to the next stage before the player.” Though probably not in the same PR, to keep the the PR size more manageable.

I’m not arguing against having that. But I think we need an additional layer:
→ auto-evo decides it is a good idea to go to the next stage
→ a difficulty-based filter prevents species from advancing past the player too early
→ We show a countdown warning in the GUI to show how many generations the player has to get to the next stage
→ Only after the countdown is done do we allow the mutation to the next stage to pass through

1 Like

WIP implementation is now in a state where it can create Multicellular species without issues. Currently the likelihood is low to absent, due to what I suspect to be:

  • Low occurrence of Binding Agents (sometimes)
  • A flaw in the auto-evo movement estimation for Multicellular Species that should get fixed soon.
  • Potentially other auto-evo balance, like counting overall energy consumption to strongly. (though perhaps not, large eukaryotes are quite common)

Right now, as said before, I have it implemented as a mutation strategy in the Avoid Predation pressure (Both in Thrive an hypothesised IRL to be one of the main benefits of being multicellular), which mixes in Multicellular mutant with the others, and then RegisterSpecies ensures they are only created as new branches, instead of trying to apply them as mutants to the Microbe parent.

This does have the downside that it’s theoretically possible to have all potential mutants for a Microbe be multicellular. Which might be a problem once I implement blocks on this, such as not being allowed to progress before the player. Giving a specific mutation strategy access to game settings and the world setting might be a bit awkward? And otherwise the block would have to happen in RegisterSpecies, which risks leaving species with 0 mutants, even though there should be good microbe options also.

An alternative to the MutationStrategy approach would be to make potential new Multicellular Species in the main ModifyExistingSpecies, right before mutations are generated. And then, if the generation goes ahead, separately generate mutants for the Multicellular Species (they can still be pooled for testing afterwards). It think that would make controls easier and ensure Multicellular mutants to a Microbe don’t crowd out the “normal” ones. But, it would lead to more auto-evo time spent on these bordering Microbes.

Why would the generated multicellular variant need further mutations? Isn’t it a big enough change for a single auto-evo step for a species to become multicellular?

You could make that argument, but that’s certainly not how it works for the player right now. Becoming multicellular is effectively a 0 MP edit that gives you a full editor session afterwards. You even yourself made sure the AI immediately splits other Multicellular species off from you when you do that. So I never really considered it as an option, I suppose?

Blocking other mutations could make it severely detrimental and unlikely to happen, as they would be completely unable to adapt to changes. Look at changes in environmental tolerances, for example.

Well I guess. I’ve not been particularly worried about auto-evo being unfair to the AI species as I used to be and then some people tweaked auto-evo to totally detach it from player’s requirements… so ever since that event (many years ago), I haven’t worried about fairness.

True enough about the environmental tolerances, but shouldn’t most species be already pretty “stable” once the time comes to become multicellular? It’s just that it sounds like that allowing the multicellular variant to also mutate further basically doubles auto-evo calculations for any species that is near enough to qualifying for multicellular. That doesn’t sound very good to me from a loading screen duration perspective.

1 Like

That would indeed be true if we always run it for every “Multicellular candidate Microbe”.
But, we can directly limit how often that actually happens, based on random chance, decreasing it if there are already similar Multicellular Species around, etc.

The advantage of the pure MutationStrategy approach is that it never calculates double. It’s just that some Multicellular mutants may take the place of some Microbe mutants, and they don’t get calculated much at all if they’re definitely not good. So that would leave every “Multicellular candidate Microbe” just taking up somewhere in between a Microbe and Multicellular Species amount of auto-evo time. (But it has the downsides I mentioned in the previous comment unless I can feed more information into the MutationStrategy)

Okay, auto-evo is now creating MulticellularSpecies from non-player MicrobeSpecies, though with no restrictions other than them having binding agents. In the end, the solution taken was to generate a multicellular version of eligible species in ModifyExistingSpecies, and then running mutations for both the Microbe and Multicellular mutations, then selecting mutants from the combined pool.

There are still some things I want to make sure to add to auto-evo this year to have things mostly complete:

  • Add difficulty-setting-controlled (And I do think it should be in the actual difficulty settings this time?) restrictions on non-player MicrobeSpecies generating MulticellularSpecies.
    This needs some design work done actually:
    • What should the setting and the possible options look like? It’s been previously discussed as disallow/allow with little warning/allow with 5 “turn” warning. So would that be a drop-down with those three options, or one switch and a selectable number through a slider?
    • I suppose there’s the question on where exactly the block should be put in, but I’m pretty sure this should be right before ModifyExistingSpecies attempts to create a multicellular version.
      Right now, any eligible species transitions quite quickly anyway, and putting the block here saves the most performance, since no actual mutations or score checks take place if it is blocked.
    • The player will need to be informed of this, so there probably needs to be some kind of pop-up with a countdown.
      • When and where exactly should this appear?
        I am currently thinking of showing a pop-up screen right when you enter the editor.
      • I probably need some guidance on how to technically implement this, or its simply going to take a while for me to figure it out.
  • Score calculation and mutations for reproduction modes. Obviously, this is a big feature of this stage and auto-evo should use it, and acknowledge player changes in it. This will require quite a bit of thinking and experimentation to get right, I think. One option I have been considering is for a very limited selection of score calculations to look at not just the fully grown adult, but also the juvenile form. That would mean changes to reproduction mode (and celltypes therein) automatically affect score through the code we have already. But there is a risk of heavy performance reduction unless we are very careful with what calculations to select.
  • Add the option to add an additional copy of a cell part to an existing cell type (to the cell type that has the highest amount of it already) as an alternative to placing more of that cell.
  • Add a custom MutationStrategy for adding organelles specifically for fixing an ATP deficit in cell types. (this might also replace the system of “placing any ATP-producing cell part” for MicrobeSpecies).
  • Updating score calculations for cells entirely hidden behind other cells. Pili, engulfment and I believe even toxins, do not work if they’re blocked by other cells, and score calculations should recognise that so that more functional species are created.

There are also some things that I would like to do, but are of lesser priority:

  • I want to explore other limits on generating multicellular species that are universal and do not depend on the difficulty settings. For example, blocking it when there are already very closely related multicellular species. This would cut down the total number of mutations and score calculations made.
  • Explore adding additional miches for Microbes and Multicellular to co-exist while minimising performance impact.
1 Like