Segregation
Segregation: residential sorting of agents and its dissimilarity index.
BlockMovesInteraction(label, *, target, width=20, height=20, side=5, probability=1.0, phase=None)
Bases: MovementInteraction
Moves of the stochastic Schelling model, from an agent's cell to a random empty cell of another block.
A visited agent proposes to move to a random empty cell of the grid, and stays when the cell lies in its own block.
With block densities rho_i before and rho_f' after the move, the proposal is accepted with probability
1 / (1 + exp(beta * dU)), where dU = (1 - altruism) * (u(rho_f') - u(rho_i)) + altruism * dU_global and
dU_global is the change of M * sum_q rho_q u(rho_q) over the blocks of M cells. The densities are the counts
of the block states of the group. In stochastic_schelling, a phase of visits draws as many agents with
replacement as there are agents every step, and a MapInteraction sets the block of an agent after its move.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
label
|
str
|
The label of the interaction. |
required |
target
|
Annotated[str, RoleSpec()]
|
The path of the group of dwellers. |
required |
width
|
int
|
The number of columns of the grid. |
20
|
height
|
int
|
The number of rows of the grid. |
20
|
side
|
int
|
The side of a square block in cells, which divides the width and the height. |
5
|
probability
|
float
|
The probability that a visited agent proposes a move. |
1.0
|
phase
|
str | None
|
The phase of the step the moves run in, or |
None
|
Examples:
>>> from skcomplex.models.social.segregation import BlockMovesInteraction
>>> BlockMovesInteraction('moves', target='dwellers', side=4).check().schedule
'member'
Source code in src/skcomplex/models/social/segregation/_block_moves.py
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | |
get_block(agent, model)
Return the index of the block that holds the cell of an agent.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
agent
|
AgentViewProtocol
|
The dweller. |
required |
model
|
ModelViewProtocol
|
The model view. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
block |
float
|
The index of the block. |
Source code in src/skcomplex/models/social/segregation/_block_moves.py
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | |
DwellerElement(label, visual=None, *, block=0.0, beta=3.0, altruism=0.5, slope=-4.0 / 3.0, intercept=1.0)
Bases: Element
Agent of the stochastic Schelling model, whose utility a * rho + b depends on the density of its block.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
label
|
str
|
The label of the agent or group. |
required |
visual
|
VisualSpec | None
|
How the agent is drawn, or |
None
|
block
|
Annotated[float, StateSpec(domain=NN)]
|
The index of the agent's block, which |
0.0
|
beta
|
Annotated[float, ParameterSpec(domain=closed_open(0, oo))]
|
The inverse temperature of the moves. |
3.0
|
altruism
|
Annotated[float, ParameterSpec(domain=closed_open(0, oo))]
|
The weight of the change of the global utility against the agent's own utility. |
0.5
|
slope
|
Annotated[float, ParameterSpec()]
|
The slope |
-4.0 / 3.0
|
intercept
|
Annotated[float, ParameterSpec()]
|
The intercept |
1.0
|
Examples:
>>> from skcomplex.core.elements import GroupElement
>>> from skcomplex.models.social.segregation import DwellerElement
>>> group = GroupElement('dwellers', element=DwellerElement, size=10, values={'beta': 3.0})
>>> group.label, group.element.__name__, group.size
('dwellers', 'DwellerElement', 10)
Source code in src/skcomplex/models/social/segregation/_dweller.py
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | |
DwellerView(agent, stepper)
Bases: AgentView
View of a dweller of the stochastic Schelling model, with its states and parameters as attributes.
Source code in src/skcomplex/engine/solvers/_mesa.py
513 514 515 | |
RelocationInteraction(label, *, target, probability=1.0, phase=None)
Bases: MovementInteraction
Relocation of the Schelling model, where every resident with too few similar neighbours moves to an empty cell.
Every step every resident, in random order, moves to a random empty cell when the share of its neighbours of its own kind is below its threshold.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
label
|
str
|
The label of the interaction. |
required |
target
|
Annotated[str, RoleSpec()]
|
The path of the group of residents. |
required |
probability
|
Annotated[float, ParameterSpec(domain=closed(0, 1))]
|
The probability that an unhappy resident moves in a step. |
1.0
|
phase
|
str | None
|
The phase of the step the relocation runs in, or |
None
|
Examples:
>>> from skcomplex.models.social.segregation import RelocationInteraction
>>> RelocationInteraction('relocation', target='residents').target
'residents'
Source code in src/skcomplex/models/social/segregation/_relocation.py
42 43 44 45 46 47 48 49 50 | |
ResidentElement(label, visual=VisualSpec('agents', {'color_by': 'kind', 'color_range': (0.0, 1.0)}), *, kind=0.0, threshold=0.5)
Bases: Element
Resident of the Schelling model, who moves to an empty cell while too few neighbours share its kind.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
label
|
str
|
The label of the agent or group. |
required |
visual
|
VisualSpec | None
|
How the agent is drawn, or |
VisualSpec('agents', {'color_by': 'kind', 'color_range': (0.0, 1.0)})
|
kind
|
Annotated[float, StateSpec(domain=NN)]
|
The kind of the resident, 0 or 1. |
0.0
|
threshold
|
Annotated[float, ParameterSpec(domain=closed_open(0, oo))]
|
The smallest share of neighbours of the same kind that keeps a resident in place. |
0.5
|
Examples:
>>> from skcomplex.core.elements import GroupElement
>>> from skcomplex.models.social.segregation import ResidentElement
>>> group = GroupElement('residents', element=ResidentElement, size=10, values={'kind': 1.0})
>>> group.label, group.element.__name__, group.size
('residents', 'ResidentElement', 10)
Source code in src/skcomplex/models/social/segregation/_resident.py
40 41 42 43 44 45 46 47 48 49 50 | |
ResidentView(agent, stepper)
Bases: AgentView
View of a resident of the Schelling model, with its states and parameters as attributes.
Source code in src/skcomplex/engine/solvers/_mesa.py
513 514 515 | |
schelling(width=20, height=20, *, density=0.8, minority=0.3, threshold=0.5, random_state=0)
Return a Schelling segregation model on a grid with at most one resident per cell.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
int
|
The number of columns. |
20
|
height
|
int
|
The number of rows. |
20
|
density
|
float
|
The share of cells with a resident. |
0.8
|
minority
|
float
|
The share of residents of kind 1. |
0.3
|
threshold
|
float
|
The smallest share of similar neighbours that keeps a resident in place. |
0.5
|
random_state
|
int | Generator | None
|
The seed or generator of the kinds. |
0
|
Returns:
| Name | Type | Description |
|---|---|---|
system |
System
|
The model, with the group |
Examples:
>>> from skcomplex.models.social.segregation import schelling
>>> schelling(10, 10, density=0.5).elements[0].check().prepare().size_
50
Source code in src/skcomplex/models/social/segregation/_schelling.py
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | |
stochastic_schelling(width=20, height=20, *, side=5, density=0.5, beta=3.0, altruism=0.5, slope=-4.0 / 3.0, intercept=1.0, random_state=0)
Return the stochastic Schelling model of agents moving between blocks, which segregates above beta = 2.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
int
|
The number of columns, a multiple of the block side. |
20
|
height
|
int
|
The number of rows, a multiple of the block side. |
20
|
side
|
int
|
The side of a square block in cells. |
5
|
density
|
float
|
The share of cells with an agent. |
0.5
|
beta
|
float
|
The inverse temperature of the moves. |
3.0
|
altruism
|
float
|
The weight of the change of the global utility. |
0.5
|
slope
|
float
|
The slope of the utility in the block density. |
-4.0 / 3.0
|
intercept
|
float
|
The intercept of the utility. |
1.0
|
random_state
|
int | Generator | None
|
The seed or generator of the initial cells. |
0
|
Returns:
| Name | Type | Description |
|---|---|---|
system |
System
|
The model, with the group |
Examples:
>>> from skcomplex.models.social.segregation import stochastic_schelling
>>> stochastic_schelling(8, 8, side=4, random_state=0).elements[0].check().prepare().size_
32
Source code in src/skcomplex/models/social/segregation/_blocks.py
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | |