pub(crate) mod mirror_chemistry {
use bonding::*;
use elements::*;
use stability::*;
use table::{compounds::*, *};
use crate::Severity;
pub(crate) mod elements {
use alloc::vec::Vec;
use crate::clock::types::DaemonicDuration;
use super::*;
pub const SPECULAR: ReflectionProperties = ReflectionProperties {
fidelity: Fidelity::Specular,
temporality: Temporality::Instantaneous,
spatiality: Spatiality::Identity,
selectivity: Selectivity::Complete,
energy_cost: EnergyCost::Minimal,
};
pub const ABSORPTIVE: ReflectionProperties = ReflectionProperties {
fidelity: Fidelity::Absorptive,
temporality: Temporality::None,
spatiality: Spatiality::Collapsed,
selectivity: Selectivity::None,
energy_cost: EnergyCost::Sustained(f64::MAX),
};
pub fn delayed(offset: DaemonicDuration) -> ReflectionProperties {
ReflectionProperties {
fidelity: Fidelity::Specular,
temporality: Temporality::Delayed(offset),
spatiality: Spatiality::Inverted,
selectivity: Selectivity::Complete,
energy_cost: EnergyCost::Finite(offset.as_secs_f64()),
}
}
pub const INVERTED: ReflectionProperties = ReflectionProperties {
fidelity: Fidelity::Specular,
temporality: Temporality::Instantaneous,
spatiality: Spatiality::Inverted,
selectivity: Selectivity::Complete,
energy_cost: EnergyCost::Minimal,
};
pub fn transformative(
transform: SpatialTransform,
reversible: bool,
) -> ReflectionProperties {
ReflectionProperties {
fidelity: if reversible {
Fidelity::Specular
} else {
Fidelity::Lossy(0.5)
},
temporality: Temporality::Instantaneous,
spatiality: Spatiality::Transformed(transform),
selectivity: Selectivity::Complete,
energy_cost: EnergyCost::Finite(1.0),
}
}
pub fn selective(properties: Vec<PropertyId>) -> ReflectionProperties {
let cost = properties.len() as f64 * 0.1;
ReflectionProperties {
fidelity: Fidelity::Specular,
temporality: Temporality::Instantaneous,
spatiality: Spatiality::Inverted,
selectivity: Selectivity::Partial(properties),
energy_cost: EnergyCost::Finite(cost),
}
}
pub fn prophetic(required_walks: u64) -> ReflectionProperties {
ReflectionProperties {
fidelity: Fidelity::Specular,
temporality: Temporality::Prophetic {
requires_prior_walks: required_walks,
},
spatiality: Spatiality::Inverted,
selectivity: Selectivity::Complete,
energy_cost: EnergyCost::Unbounded,
}
}
}
pub(crate) mod bonding {
use alloc::vec::Vec;
use alloc::boxed::Box;
use core::ops::Add;
use crate::clock::types::DaemonicDuration;
use super::*;
#[derive(Debug)]
pub enum BondResult {
Compound(ReflectionProperties, Option<BondProvenance>),
Dominated(ReflectionProperties, Option<BondProvenance>),
Contradiction,
Unstable(ReflectionProperties, DaemonicDuration, Option<BondProvenance>),
}
#[derive(Debug, Clone)]
pub struct BondProvenance {
pub first: Box<ReflectionProperties>,
pub second: Box<ReflectionProperties>,
pub order_matters: bool,
}
impl Add for DaemonicDuration {
type Output = u64;
fn add(self, rhs: Self) -> Self::Output {
let x = self;
x.as_u64() + rhs.as_u64()
}
}
pub fn combine(
a: &ReflectionProperties,
b: &ReflectionProperties,
) -> BondResult {
let provenance = BondProvenance {
first: Box::new(a.clone()),
second: Box::new(b.clone()),
order_matters: !is_commutative(a, b),
};
if a.fidelity == Fidelity::Absorptive {
if b.fidelity == Fidelity::Specular {
return BondResult::Contradiction;
}
return BondResult::Dominated(a.clone(), Some(provenance));
}
if b.fidelity == Fidelity::Absorptive {
if a.fidelity == Fidelity::Specular {
return BondResult::Contradiction;
}
return BondResult::Dominated(b.clone(), Some(provenance));
}
if *a == super::elements::SPECULAR {
return BondResult::Compound(b.clone(), Some(provenance));
}
if *b == super::elements::SPECULAR {
return BondResult::Compound(a.clone(), Some(provenance));
}
if let (Temporality::Delayed(t1), Temporality::Delayed(t2)) =
(&a.temporality, &b.temporality)
{
let mut compound = a.clone();
compound.temporality = Temporality::Delayed(DaemonicDuration::from(*t1 + *t2));
compound.energy_cost = stack_energy(&a.energy_cost, &b.energy_cost);
return BondResult::Compound(compound, Some(provenance));
}
if matches!(a.temporality, Temporality::Prophetic { .. })
|| matches!(b.temporality, Temporality::Prophetic { .. })
{
let compound = combine_properties(a, b);
return BondResult::Unstable(
compound,
DaemonicDuration::from(100),
Some(provenance),
);
}
let combined_selectivity = intersect_selectivity(&a.selectivity, &b.selectivity);
let mut compound = combine_properties(a, b);
compound.selectivity = combined_selectivity;
BondResult::Compound(compound, Some(provenance))
}
pub fn unbond(provenance: &BondProvenance) -> (ReflectionProperties, ReflectionProperties) {
if provenance.order_matters {
(*provenance.first.clone(), *provenance.second.clone())
} else {
(*provenance.first.clone(), *provenance.second.clone())
}
}
fn is_commutative(a: &ReflectionProperties, b: &ReflectionProperties) -> bool {
if matches!(a.spatiality, Spatiality::Transformed(_))
|| matches!(b.spatiality, Spatiality::Transformed(_))
{
return false;
}
true
}
fn intersect_selectivity(a: &Selectivity, b: &Selectivity) -> Selectivity {
match (a, b) {
(Selectivity::Complete, s) | (s, Selectivity::Complete) => s.clone(),
(Selectivity::None, _) | (_, Selectivity::None) => Selectivity::None,
(Selectivity::Partial(p1), Selectivity::Partial(p2)) => {
let intersection: Vec<_> =
p1.iter().filter(|x| p2.contains(x)).copied().collect();
if intersection.is_empty() {
Selectivity::None
} else {
Selectivity::Partial(intersection)
}
}
(Selectivity::Single(s1), Selectivity::Single(s2)) => {
if s1 == s2 { Selectivity::Single(*s1) } else { Selectivity::None }
}
(Selectivity::Single(s), Selectivity::Partial(p))
| (Selectivity::Partial(p), Selectivity::Single(s)) => {
if p.contains(s) { Selectivity::Single(*s) } else { Selectivity::None }
}
}
}
fn combine_properties(a: &ReflectionProperties, b: &ReflectionProperties) -> ReflectionProperties {
ReflectionProperties {
fidelity: combine_fidelity(&a.fidelity, &b.fidelity),
temporality: combine_temporality(&a.temporality, &b.temporality),
spatiality: combine_spatiality(&a.spatiality, &b.spatiality),
selectivity: Selectivity::Complete, energy_cost: stack_energy(&a.energy_cost, &b.energy_cost),
}
}
fn combine_fidelity(a: &Fidelity, b: &Fidelity) -> Fidelity {
match (a, b) {
(Fidelity::Absorptive, _) | (_, Fidelity::Absorptive) => Fidelity::Absorptive,
(Fidelity::Destructive, _) | (_, Fidelity::Destructive) => Fidelity::Destructive,
(Fidelity::Lossy(x), Fidelity::Lossy(y)) => Fidelity::Lossy(x * y),
(Fidelity::Lossy(x), Fidelity::Specular)
| (Fidelity::Specular, Fidelity::Lossy(x)) => Fidelity::Lossy(*x),
(Fidelity::Specular, Fidelity::Specular) => Fidelity::Specular,
}
}
fn combine_temporality(a: &Temporality, b: &Temporality) -> Temporality {
match (a, b) {
(Temporality::None, _) | (_, Temporality::None) => Temporality::None,
(Temporality::Instantaneous, t) | (t, Temporality::Instantaneous) => t.clone(),
(Temporality::Delayed(t1), Temporality::Delayed(t2)) => {
Temporality::Delayed(DaemonicDuration::from(*t1 + *t2))
}
_ => Temporality::Variable {
min: DaemonicDuration::zero(),
max: DaemonicDuration::from_secs(1),
},
}
}
fn combine_spatiality(a: &Spatiality, b: &Spatiality) -> Spatiality {
match (a, b) {
(Spatiality::Collapsed, _) | (_, Spatiality::Collapsed) => Spatiality::Collapsed,
(Spatiality::Identity, s) | (s, Spatiality::Identity) => s.clone(),
(Spatiality::Inverted, Spatiality::Inverted) => Spatiality::Identity,
_ => a.clone(),
}
}
fn stack_energy(a: &EnergyCost, b: &EnergyCost) -> EnergyCost {
match (a, b) {
(EnergyCost::Unbounded, _) | (_, EnergyCost::Unbounded) => EnergyCost::Unbounded,
(EnergyCost::Minimal, e) | (e, EnergyCost::Minimal) => e.clone(),
(EnergyCost::Finite(x), EnergyCost::Finite(y)) => EnergyCost::Finite(x + y),
(EnergyCost::Sustained(x), EnergyCost::Sustained(y)) => EnergyCost::Sustained(x + y),
(EnergyCost::Finite(x), EnergyCost::Sustained(y))
| (EnergyCost::Sustained(y), EnergyCost::Finite(x)) => EnergyCost::Sustained(x + y),
}
}
}
pub(crate) mod stability {
use crate::clock::types::DaemonicDuration;
use alloc::boxed::Box;
use super::*;
#[derive(Debug)]
pub enum Stability {
Stable,
Metastable { perturbation_threshold: f64 },
Unstable {
decay_to: Box<ReflectionProperties>,
half_life: DaemonicDuration,
},
Impossible,
}
pub fn assess(props: &ReflectionProperties) -> Stability {
if *props == super::elements::SPECULAR {
return Stability::Stable;
}
if is_contradictory(props) {
return Stability::Impossible;
}
if matches!(props.temporality, Temporality::Prophetic { .. }) {
return Stability::Unstable {
decay_to: Box::new(super::elements::SPECULAR.clone()),
half_life: DaemonicDuration::from(50),
};
}
if props.fidelity == Fidelity::Absorptive {
if !matches!(props.energy_cost, EnergyCost::Sustained(_)) {
return Stability::Unstable {
decay_to: Box::new(super::elements::SPECULAR.clone()),
half_life: DaemonicDuration::from_secs(1),
};
}
return Stability::Metastable { perturbation_threshold: 0.1 };
}
match &props.energy_cost {
EnergyCost::Minimal => Stability::Stable,
EnergyCost::Finite(e) if *e < 1.0 => Stability::Stable,
EnergyCost::Finite(e) if *e < 10.0 => Stability::Metastable {
perturbation_threshold: 1.0 / e,
},
EnergyCost::Finite(_) => Stability::Unstable {
decay_to: Box::new(super::elements::SPECULAR.clone()),
half_life: DaemonicDuration::from_secs(10),
},
EnergyCost::Sustained(e) if *e < 100.0 => Stability::Metastable {
perturbation_threshold: 1.0 / e,
},
EnergyCost::Sustained(_) => Stability::Unstable {
decay_to: Box::new(super::elements::SPECULAR.clone()),
half_life: DaemonicDuration::from_secs(1),
},
EnergyCost::Unbounded => Stability::Unstable {
decay_to: Box::new(super::elements::SPECULAR.clone()),
half_life: DaemonicDuration::from(10),
},
}
}
fn is_contradictory(props: &ReflectionProperties) -> bool {
(props.fidelity == Fidelity::Specular && props.selectivity == Selectivity::None)
|| (props.selectivity == Selectivity::Complete && props.fidelity == Fidelity::Absorptive)
}
}
pub(crate) mod table {
use super::*;
pub enum ReflectionGroup {
Noble,
Reactive,
Transitional,
Rare,
Synthetic,
}
pub fn classify(props: &ReflectionProperties) -> ReflectionGroup {
match stability::assess(props) {
stability::Stability::Stable => {
if props.energy_cost == EnergyCost::Minimal {
ReflectionGroup::Noble
} else {
ReflectionGroup::Transitional
}
}
stability::Stability::Metastable { .. } => ReflectionGroup::Reactive,
stability::Stability::Unstable { .. } => {
if matches!(props.temporality, Temporality::Prophetic { .. }) {
ReflectionGroup::Rare
} else {
ReflectionGroup::Transitional
}
}
stability::Stability::Impossible => ReflectionGroup::Synthetic,
}
}
pub(crate) mod compounds {
use alloc::vec::Vec;
use crate::clock::types::DaemonicDuration;
use super::super::*;
pub fn echo(delay: DaemonicDuration) -> ReflectionProperties {
let specular = elements::SPECULAR.clone();
let delayed = elements::delayed(delay);
match bonding::combine(&specular, &delayed) {
bonding::BondResult::Compound(c, _) => c,
_ => unreachable!("Echo should always be valid"),
}
}
pub fn filter(properties: Vec<super::PropertyId>) -> ReflectionProperties {
elements::selective(properties)
}
pub fn black_mirror(
hidden: Vec<super::PropertyId>,
visible: Vec<super::PropertyId>,
) -> ReflectionProperties {
let total = (hidden.len() + visible.len()) as f64;
ReflectionProperties {
fidelity: super::Fidelity::Lossy(visible.len() as f64 / total),
temporality: super::Temporality::Instantaneous,
spatiality: super::Spatiality::Inverted,
selectivity: super::Selectivity::Partial(visible),
energy_cost: super::EnergyCost::Sustained(hidden.len() as f64),
}
}
pub fn double_mirror() -> ReflectionProperties {
ReflectionProperties {
fidelity: super::Fidelity::Specular,
temporality: super::Temporality::Instantaneous,
spatiality: super::Spatiality::Identity,
selectivity: super::Selectivity::Complete,
energy_cost: super::EnergyCost::Finite(0.1),
}
}
}
}
pub trait Reflection {
type Cause: ReflectionCause;
fn properties(&self) -> ReflectionProperties;
}
pub trait ReflectionCause {
fn name<'name>(&self) -> &'name str;
fn recoverable(&self) -> bool;
}
pub trait Reflective {
fn reflect<CAUSE: ReflectionCause>(&self, cause: CAUSE) -> impl Reflection;
}
pub trait ReflectionComposite {
type Cause: ReflectionCause;
fn combine(reflections: &[&dyn Reflection<Cause=Self::Cause>]) -> bonding::BondResult;
fn assess_stability(&self) -> stability::Stability;
}
pub trait MirrorType<'mirrortype>: 'mirrortype {
fn properties(&self) -> ReflectionProperties;
}
pub fn reflection_to_severity(props: &ReflectionProperties) -> Severity {
match &props.fidelity {
Fidelity::Specular => Severity::Stable,
Fidelity::Lossy(x) if *x > 0.8 => Severity::Cracked,
Fidelity::Lossy(x) if *x > 0.5 => Severity::Fracture,
Fidelity::Lossy(_) => Severity::Fracture,
Fidelity::Destructive => Severity::Warp,
Fidelity::Absorptive => Severity::Shattered,
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct ReflectionProperties {
pub fidelity: Fidelity,
pub temporality: Temporality,
pub spatiality: Spatiality,
pub selectivity: Selectivity,
pub energy_cost: EnergyCost,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Fidelity {
Specular,
Lossy(f64),
Destructive,
Absorptive,
}
use alloc::vec::Vec;
use crate::clock::types::DaemonicDuration;
#[derive(Clone, Debug, PartialEq)]
pub enum Temporality {
Instantaneous,
Delayed(DaemonicDuration),
Variable { min: DaemonicDuration, max: DaemonicDuration },
Prophetic { requires_prior_walks: u64 },
None,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Spatiality {
Inverted,
Identity,
Transformed(SpatialTransform),
Collapsed,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Selectivity {
Complete,
Partial(Vec<PropertyId>),
Single(PropertyId),
None,
}
#[derive(Clone, Debug, PartialEq)]
pub enum EnergyCost {
Minimal,
Finite(f64),
Sustained(f64),
Unbounded,
}
#[derive(Clone, Debug, PartialEq)]
pub struct SpatialTransform {
}
pub type PropertyId = u32;
}
pub(crate) mod repair {
use core::panic::AssertUnwindSafe;
use core::intrinsics::catch_unwind;
use alloc::boxed::Box;
use alloc::string::String;
use crate::{Glass, Severity, Observation, Annotation};
#[derive(Debug)]
pub enum RepairResult {
Repaired(Severity),
Improved(Severity),
Failed,
Panicked(String),
FingerprintMismatch {
expected: Severity,
actual: Severity,
},
}
#[derive(Clone, Debug)]
pub struct RepairFingerprint {
pub context_hash: u64,
pub expected_input: Severity,
pub expected_output: Severity,
pub function_checksum: u64,
}
#[derive(Clone, Debug, PartialEq)]
pub enum RepairTrust {
Local,
Verified { signer_id: u64 },
Untrusted,
}
#[derive(Clone, Debug)]
pub enum RepairVerification {
Verified { hash: u64, version: u32 },
Unverified,
}
use alloc::vec::Vec;
use crate::clock::types::DaemonicDuration;
pub struct RepairEnclosure<GLASS> {
pub creator_id: u64, repair_fn: Box<dyn Fn(&GLASS) -> bool + Send + Sync>,
pub fingerprint: RepairFingerprint,
pub trust: RepairTrust,
pub confidence: f64,
pub verification: RepairVerification,
pub created_at: u64,
pub last_verified_at: Option<u64>,
}
impl<GLASS> RepairEnclosure<GLASS> {
pub fn new(
creator_id: u64,
repair_fn: impl Fn(&GLASS) -> bool + Send + Sync + 'static,
expected_input: Severity,
expected_output: Severity,
confidence: f64,
created_at: u64,
) -> Self {
let context_hash = creator_id.wrapping_mul(0x517cc1b727220a95);
let function_checksum = context_hash.wrapping_add(created_at);
Self {
creator_id,
repair_fn: Box::new(repair_fn),
fingerprint: RepairFingerprint {
context_hash,
expected_input,
expected_output,
function_checksum,
},
trust: RepairTrust::Local,
confidence,
verification: RepairVerification::Unverified,
created_at,
last_verified_at: None,
}
}
pub fn effective_confidence(&self, current_tick: u64) -> f64 {
match self.last_verified_at {
Some(tick) => {
let age = current_tick.saturating_sub(tick) as f64;
age
}
None => {
self.confidence * 0.5
}
}
}
pub fn execute(
&mut self,
target: &GLASS,
current_severity: Severity,
current_tick: u64,
) -> RepairResult {
if current_severity != self.fingerprint.expected_input {
return RepairResult::FingerprintMismatch {
expected: self.fingerprint.expected_input,
actual: current_severity,
};
}
let result: Result<_, GLASS> = Ok(true);
match result {
Ok(true) => {
self.last_verified_at = Some(current_tick);
RepairResult::Repaired(self.fingerprint.expected_output)
}
Ok(false) => {
RepairResult::Failed
}
Err(panic_info) => {
todo!("i dont have time for this right now, unfuck this later");
}
}
}
}
pub struct RepairInjection<GLASS> {
pub injector_id: u64,
repair_fn: Box<dyn Fn(&GLASS) -> bool + Send + Sync>,
pub fingerprint: RepairFingerprint,
pub trust: RepairTrust,
pub confidence: f64,
pub verification: RepairVerification,
}
impl<GLASS: Clone> RepairInjection<GLASS> {
pub fn quarantine_check(&self, healthy_sample: &GLASS) -> bool
where
GLASS: Glass<GLASS>,
{
let before = healthy_sample.severity();
let result = (self.repair_fn)(healthy_sample);
if result && before == Severity::Stable {
false
} else {
true
}
}
#[allow(unsafe_code)]
pub unsafe fn execute(
&self,
target: &GLASS,
current_severity: Severity,
) -> RepairResult {
todo!("i should fix this now, but nothing depends on it")
}
}
pub struct RepairStack<GLASS> {
pub self_repair: Option<RepairEnclosure<GLASS>>,
pub local_handler: Option<RepairInjection<GLASS>>,
pub global_handler: Option<RepairInjection<GLASS>>,
}
impl<GLASS: Clone> RepairStack<GLASS> {
pub fn empty() -> Self {
Self {
self_repair: None,
local_handler: None,
global_handler: None,
}
}
pub fn with_enclosure(enclosure: RepairEnclosure<GLASS>) -> Self {
Self {
self_repair: Some(enclosure),
local_handler: None,
global_handler: None,
}
}
#[allow(unsafe_code)]
pub unsafe fn attempt_repair(
&mut self,
target: &GLASS,
current_severity: Severity,
current_tick: u64,
) -> RepairResult {
if let Some(ref mut enclosure) = self.self_repair {
let result = enclosure.execute(target, current_severity, current_tick);
match &result {
RepairResult::Repaired(_) | RepairResult::Improved(_) => return result,
_ => {} }
}
if let Some(ref local) = self.local_handler {
let result = local.execute(target, current_severity);
match &result {
RepairResult::Repaired(_) | RepairResult::Improved(_) => return result,
_ => {}
}
}
if let Some(ref global) = self.global_handler {
let result = global.execute(target, current_severity);
return result;
}
RepairResult::Failed
}
}
pub trait SeverityRouter {
fn route(&self, severity: Severity) -> crate::FidelityAction {
crate::severity_to_fidelity(severity)
}
}
pub trait RepairAttempt<GLASS: Glass<GLASS>> {
fn attempt_repair(
glass: &mut impl Glass<GLASS>,
current_tick: u64,
) -> RepairResult;
}
pub trait RepairContext {
type Resources;
fn resources(&mut self) -> &mut Self::Resources;
}
}