Skip to content

Derivation Operators

Derivation operators transform raw data into platial structures. They embody platial theory, not ad-hoc heuristics.

Encounter Extraction

Extract encounters from GPS traces:

from chora.derive import extract_encounters, TracePoint, EncounterExtractionConfig
from datetime import datetime

# GPS trace data
trace = [
    TracePoint(datetime(2024, 1, 1, 10, 0), -0.127, 51.507),
    TracePoint(datetime(2024, 1, 1, 10, 15), -0.127, 51.507),
    TracePoint(datetime(2024, 1, 1, 10, 30), -0.127, 51.507),
    TracePoint(datetime(2024, 1, 1, 11, 0), -0.130, 51.510),
]

# Extract encounters at predefined extents
encounters = extract_encounters(trace, agent_id, extents)

# Or cluster without predefined extents
from chora.derive import extract_encounters_from_trace
encounters = extract_encounters_from_trace(trace, agent_id)

Familiarity Updates

Update familiarity based on encounters:

from chora.derive import update_familiarity, compute_familiarity_trajectory

# Update from single encounter
familiarity = update_familiarity(graph, encounter)
print(f"New familiarity: {familiarity.value:.2f}")

# Compute trajectory over time
trajectory = compute_familiarity_trajectory(
    encounters, agent_id, extent_id,
    decay_half_life_days=14.0
)
for timestamp, value in trajectory:
    print(f"{timestamp}: {value:.2f}")

# Apply decay to all familiarities
from chora.derive import decay_all_familiarities
count = decay_all_familiarities(graph)

Practice Detection

Detect routines and patterns:

from chora.derive import detect_practices, detect_routines, PracticeDetectionConfig

config = PracticeDetectionConfig(
    min_occurrences=3,
    time_window_days=30,
    min_regularity=0.5
)

practices = detect_practices(encounters, agent_id, config)

for practice in practices:
    print(f"{practice.name}: regularity={practice.regularity:.2f}")

Liminality Inference

Detect liminal zones from transitions:

from chora.derive import infer_liminality, detect_boundary_crossings

liminal_zones = infer_liminality(encounters, extents)

for zone in liminal_zones:
    print(f"{zone.transitional_from}{zone.transitional_to}")
    print(f"  Intensity: {zone.intensity:.2f}")

Affect Derivation

Attach affect from context:

from chora.derive import attach_affect, derive_affect_from_context

# Explicit attachment
affect = attach_affect(encounter, valence=0.7, arousal=0.3, source="survey")

# Derive from context
affect = derive_affect_from_context(encounter, contexts)
print(f"Derived valence: {affect.valence:.2f}")

Meaning Derivation

Derive meanings from practices:

from chora.derive import attach_meaning, derive_meaning_from_practices

# Explicit attachment
meaning = attach_meaning(
    agent_id, extent_id,
    content="My daily exercise spot",
    symbols=["health", "routine"]
)

# Derive from practice patterns
meanings = derive_meaning_from_practices(practices, agent_id, extent_id)

Place Emergence

Extract emergent place as subgraph:

from chora.derive import extract_place, find_emergent_places

# Single place for agent-extent pair
place = extract_place(graph, extent_id, agent_id)
print(f"Familiarity: {place.familiarity_score:.2f}")
print(f"Character: {place.character}")
print(f"Encounter count: {place.encounter_count}")

# Find all significant places
places = find_emergent_places(graph, agent_id, min_encounters=3)
for p in places:
    print(f"{p.extent.name}: {p.character}")