You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.3 KiB
73 lines
2.3 KiB
from __future__ import annotations
|
|
from typing import Literal
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class Location(BaseModel):
|
|
id: str
|
|
name: str
|
|
type: Literal["public", "commerce", "governance", "residential", "social"]
|
|
description: str
|
|
|
|
|
|
class TimeConfig(BaseModel):
|
|
total_days: int = 365
|
|
rounds_per_day: int = 3
|
|
active_agents_per_round_min: int = 3
|
|
active_agents_per_round_max: int = 10
|
|
|
|
|
|
class WorldBlueprint(BaseModel):
|
|
name: str
|
|
description: str
|
|
rules: list[str]
|
|
locations: list[Location]
|
|
resources: list[str]
|
|
initial_tensions: list[str]
|
|
time_config: TimeConfig
|
|
|
|
|
|
class WorldMetrics(BaseModel):
|
|
stability: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
prosperity: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
trust: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
freedom: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
conflict: float = Field(default=0.2, ge=0.0, le=1.0)
|
|
brand_sentiment: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
purchase_intent: float = Field(default=0.5, ge=0.0, le=1.0)
|
|
word_of_mouth: float = Field(default=0.0, ge=0.0, le=1.0)
|
|
churn_risk: float = Field(default=0.2, ge=0.0, le=1.0)
|
|
adoption_rate: float = Field(default=0.0, ge=0.0, le=1.0)
|
|
information_spread: float = Field(default=0.0, ge=0.0, le=1.0)
|
|
echo_chamber_index: float = Field(default=0.0, ge=0.0, le=1.0)
|
|
rumor_distortion: float = Field(default=0.0, ge=0.0, le=1.0)
|
|
|
|
|
|
class Institution(BaseModel):
|
|
name: str
|
|
purpose: str
|
|
founder_id: int
|
|
member_ids: list[int] = Field(default_factory=list)
|
|
rules: list[str] = Field(default_factory=list)
|
|
created_day: int = 0
|
|
|
|
|
|
class Proposal(BaseModel):
|
|
id: str
|
|
proposer_id: int
|
|
content: str
|
|
votes_for: list[int] = Field(default_factory=list)
|
|
votes_against: list[int] = Field(default_factory=list)
|
|
status: Literal["open", "passed", "rejected"] = "open"
|
|
created_round: int = 0
|
|
|
|
|
|
class WorldState(BaseModel):
|
|
blueprint: WorldBlueprint
|
|
metrics: WorldMetrics = Field(default_factory=WorldMetrics)
|
|
institutions: list[Institution] = Field(default_factory=list)
|
|
proposals: list[Proposal] = Field(default_factory=list)
|
|
day: int = 1
|
|
round_in_day: int = 0
|
|
active_disputes: list[str] = Field(default_factory=list)
|
|
community_rules: list[str] = Field(default_factory=list)
|
|
|