-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
d75c006
commit 358ba73
Showing
1 changed file
with
93 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# Pantheon Generator | ||
|
||
This library procedurally generates `Gods` with internally-coherent domains, | ||
and `Pantheons` comprising generations of `Gods` that feel related to one | ||
another. To achieve a good mix of cohesiveness and novelty, it employs the | ||
metaphor of sexual reproduction: | ||
|
||
* Words are **chromosomes**. | ||
* A **genome** is a list of 46 words. | ||
* A **gamete** (an egg or sperm) is a list of 23 words. | ||
* A **gene pool** is a list of tokens drawn from different texts. | ||
* **Asexual reproduction** occurs when a user generates a `God` from two strings. | ||
* **Sexual reproduction** occurs when a user generates a `Pantheon` from two `Gods`. | ||
|
||
### How to Use the Library | ||
|
||
The user selects two seed words and uses them to generate a `God`: | ||
|
||
> God("hunting", "art") | ||
The result is Chetan, God of Illustrators, Prints, and Drawings. The user does | ||
this a second time: | ||
|
||
> God("agriculture", "science") | ||
The result is Kapilla, Goddess of Orchards and Schools. The user combines these | ||
two `Gods` to generate a `Pantheon`: | ||
|
||
> Pantheon(Chetan, Kapilla) | ||
The deities reproduce for several generations. The result in a `Pantheon` with a | ||
few dozen `Gods` in it. One of these is Ajit, Demi-God of Talents, Crafts, and | ||
Prancing. | ||
|
||
|
||
|
||
# Models | ||
|
||
### Attributes of a `God` | ||
|
||
* **chromosomes**: Either `XX` or `XY`. | ||
* **gender**: Either `male`, `female`, or `non_binary`. | ||
* **genome**: A list of up to 46 words. | ||
* **generation**: An integer set during a `pantheon.spawn()`. | ||
* **divinity**: Either `god`, `demi_god`, or `human`. | ||
* **name**: A string pulled at random from a list of `female_names`, `male_names`, or `nb_names`. | ||
* **epithet**: A string that combines a title (God, Goddess, Divine Being, ...) with between 1 and 4 domains. A domain is a word randomly selected from the `God's` genome. Example: Goddess of hunting and war. | ||
* **parents**: The `Gods` whose egg and sperm combined to create this `God`. | ||
|
||
### Attributes of a `Pantheon` | ||
|
||
* **gods**: A dictionary mapping names to `Gods`. | ||
|
||
# Reproduction | ||
|
||
### Spawning [Gods](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py) | ||
|
||
Given two `Gods`, one `XX` **egg donor** and one `XY` **sperm donor**... | ||
|
||
1. Select a random word from the `God.genome` of the **egg donor**. | ||
1. Use spaCy to pull 23 related words from the **gene pool**. This is the **egg**. | ||
1. Select a random word from the `God.genome` of the **sperm donor**. | ||
1. Use spaCy to pull 23 related words from the **gene pool**. This is the **sperm**. | ||
1. Add the **egg** and **sperm** together. This list of 46 words is the *genome* for the new `God`. | ||
|
||
_Note: because a `God's` genome is populated with words **related** to seeds from its parents' genomes, a `God` feels **genetically related** to its parents. But, because the seeds are selected at **random** from the parents' genomes, there's room for **genetic drift**._ | ||
|
||
### Spawning [Pantheons](https://github.com/carawarner/pantheon/blob/master/scripts/pantheons.py) | ||
|
||
Given two `Gods`, one `XX` **egg donor** and one `XY` **sperm donor**, and a number of generations **N**... | ||
|
||
1. Declare a list of **egg donors** and a list of **sperm donors**. | ||
1. Iterate **N** times, once for each generation... | ||
1. At the start of each generation breed the **egg donors**. | ||
1. At the end of each generation, add mature offspring to the breeding pool. | ||
1. At the end of each generation, remove elder `Gods` from the breeding pool. | ||
|
||
|
||
# Code Imitating Nature | ||
|
||
The model blends randomness and probability to echo the beauty of nature. | ||
|
||
**[Gender](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py#L26-L35)**: There's a 7% chance a `God` will be transgendered and a 3% chance a `God` will be non-gendered or gender-queer. For this reason the model refers to 'egg donors' and 'sperm donors' not 'mothers' and 'fathers'. Two male `Gods` can procreate, as can two female `Gods`, or a gender-queer `God` and another `God`, as long as one parent is `XX` and one is `XY`. | ||
|
||
**[Sex](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py#L57)**: When a new `God` spawns, its sex chromosomes are chosen at random. It's possible for several `Gods` in a row to be `XX` or `XY`. An unexpected consequence of this: some Pantheons grow much faster than others. The rate of growth is determined by the number of `XX` gods born in each generation. | ||
|
||
**[Mutation](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py#L170-L172)**: The related words that spaCy finds in a list of plural nouns often feel "more related" than the ones it finds in a list of gerunds. This is just something I observed. 80% of the time this model pulls gametes from `primary_tokens`, which is a list of NNS; the other 20% of the time it pulls gametes from `secondary_tokens`, which is a list of VBG. The result is some children look a lot like their parents and some look very different; there's variety in how far the apple falls from the tree. | ||
|
||
**[Power Level](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py#L12-L24)**: Many traditions describe old gods as more powerful than young gods. When two `Gods` procreate there's a 30% chance their offspring will be a 'demi-god' rather than a full blown god. That chance jumps to 50% when a 'god' and 'demi-god' procreate, and when two 'demi-gods' procreate there's a 25% chance their offspring will be a lowly human. | ||
|
||
**[Twinning](https://github.com/carawarner/pantheon/blob/master/scripts/pantheons.py#L65)**: 20% of the time coupling produces twins; the other 80% of the time it produces a single child. | ||
|
||
**[Epithets](https://github.com/carawarner/pantheon/blob/master/scripts/gods.py#L149)**: Most gods (55%) represent 3 domains: God of X, Y, and Z. Slightly fewer gods (35%) represent two domains: God of X and Y. The remaining gods represent 1 or 4 domains. |