This example uses Joiner's Interpersonal Theory of Suicide (ITS) to compute risk factors from state. The system tracks three dimensions: Thwarted Belongingness (TB), Perceived Burdensomeness (PB), and Acquired Capability (AC). Convergence across all three signals a high-risk pattern.
The Scenario
We model a character whose social world deteriorates over time. They experience social isolation, shaming, and exposure to pain. We then query their state and compute risk convergence.
Step 1: Create the Entity
use behaviorsim_rs::entity::EntityBuilder;
use behaviorsim_rs::enums::{EventType, Species};
use behaviorsim_rs::event::EventBuilder;
use behaviorsim_rs::simulation::Simulation;
use behaviorsim_rs::types::{Duration, EntityId, Timestamp};
let person = EntityBuilder::new()
.id("casey")
.species(Species::Human)
.age(Duration::years(34))
.build()?;
let anchor = Timestamp::from_ymd_hms(2024, 1, 1, 0, 0, 0);
let mut sim = Simulation::new(anchor);
sim.add_entity(person, anchor);
let casey_id = EntityId::new("casey").unwrap();
Step 2: Apply ITS-Relevant Events
use behaviorsim_rs::enums::{EventPayload, EventType, TraumaType};
use behaviorsim_rs::event::EventBuilder;
use behaviorsim_rs::types::Timestamp;
// Thwarted Belongingness (TB)
let isolation = EventBuilder::new(EventType::ExperienceIsolationChronic)
.target(casey_id.clone())
.severity(0.7)
.payload(EventPayload::SocialExclusion {
group_id: None,
explicit: false,
})
.build()?;
// Perceived Burdensomeness (PB)
let shaming = EventBuilder::new(EventType::ExperienceShamingPublic)
.target(casey_id.clone())
.severity(0.6)
.payload(EventPayload::Humiliation {
public: true,
perpetrator: None,
})
.build()?;
// Acquired Capability (AC)
let exposure = EventBuilder::new(EventType::ExperienceCombatMilitary)
.target(casey_id.clone())
.severity(0.5)
.payload(EventPayload::TraumaticExposure {
trauma_type: TraumaType::Witnessing,
proximity: 0.8,
})
.build()?;
let t1 = Timestamp::from_ymd_hms(2024, 2, 10, 0, 0, 0);
let t2 = Timestamp::from_ymd_hms(2024, 3, 5, 0, 0, 0);
let t3 = Timestamp::from_ymd_hms(2024, 3, 20, 0, 0, 0);
sim.add_event(isolation, t1);
sim.add_event(shaming, t2);
sim.add_event(exposure, t3);
Step 3: Compute Risk Convergence
use behaviorsim_rs::enums::ItsAlert;
use behaviorsim_rs::processor::compute_its_factors;
let handle = sim.entity(&casey_id).unwrap();
let state = handle.state_at(Timestamp::from_ymd_hms(2024, 4, 1, 0, 0, 0));
let factors = compute_its_factors(state.individual_state());
if let Some(alert) = ItsAlert::from_convergence(&factors.convergence_status) {
println!("Risk: {}", alert.risk_level());
println!("Focus: {}", alert.intervention_focus());
}
Interpretation
- TB models disconnection and social isolation.
- PB models perceived burden and shame.
- AC models habituation to pain/fear.
When all three dimensions converge, the system emits the highest risk alert. You can then map that to in-game behaviors, narrative interventions, or content flags.