pub mod collectors;
pub mod compat;
pub mod decay;
#[cfg(feature = "hdc")]
pub mod hdc;
pub mod i18n;
pub mod weights;
#[cfg(test)]
mod tests;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SovereignDimension {
EpistemicIntegrity,
ThermodynamicYield,
NetworkResilience,
EconomicVelocity,
CivicParticipation,
StewardshipCare,
SemanticResonance,
DomainCompetence,
}
impl SovereignDimension {
pub const ALL: [Self; 8] = [
Self::EpistemicIntegrity,
Self::ThermodynamicYield,
Self::NetworkResilience,
Self::EconomicVelocity,
Self::CivicParticipation,
Self::StewardshipCare,
Self::SemanticResonance,
Self::DomainCompetence,
];
pub fn index(&self) -> usize {
match self {
Self::EpistemicIntegrity => 0,
Self::ThermodynamicYield => 1,
Self::NetworkResilience => 2,
Self::EconomicVelocity => 3,
Self::CivicParticipation => 4,
Self::StewardshipCare => 5,
Self::SemanticResonance => 6,
Self::DomainCompetence => 7,
}
}
pub fn key(&self) -> &'static str {
match self {
Self::EpistemicIntegrity => "epistemic_integrity",
Self::ThermodynamicYield => "thermodynamic_yield",
Self::NetworkResilience => "network_resilience",
Self::EconomicVelocity => "economic_velocity",
Self::CivicParticipation => "civic_participation",
Self::StewardshipCare => "stewardship_care",
Self::SemanticResonance => "semantic_resonance",
Self::DomainCompetence => "domain_competence",
}
}
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SovereignProfile {
pub epistemic_integrity: f64,
pub thermodynamic_yield: f64,
pub network_resilience: f64,
pub economic_velocity: f64,
pub civic_participation: f64,
pub stewardship_care: f64,
pub semantic_resonance: f64,
pub domain_competence: f64,
}
impl SovereignProfile {
pub fn zero() -> Self {
Self {
epistemic_integrity: 0.0,
thermodynamic_yield: 0.0,
network_resilience: 0.0,
economic_velocity: 0.0,
civic_participation: 0.0,
stewardship_care: 0.0,
semantic_resonance: 0.0,
domain_competence: 0.0,
}
}
pub fn get(&self, dim: SovereignDimension) -> f64 {
match dim {
SovereignDimension::EpistemicIntegrity => self.epistemic_integrity,
SovereignDimension::ThermodynamicYield => self.thermodynamic_yield,
SovereignDimension::NetworkResilience => self.network_resilience,
SovereignDimension::EconomicVelocity => self.economic_velocity,
SovereignDimension::CivicParticipation => self.civic_participation,
SovereignDimension::StewardshipCare => self.stewardship_care,
SovereignDimension::SemanticResonance => self.semantic_resonance,
SovereignDimension::DomainCompetence => self.domain_competence,
}
}
pub fn set(&mut self, dim: SovereignDimension, value: f64) {
let target = match dim {
SovereignDimension::EpistemicIntegrity => &mut self.epistemic_integrity,
SovereignDimension::ThermodynamicYield => &mut self.thermodynamic_yield,
SovereignDimension::NetworkResilience => &mut self.network_resilience,
SovereignDimension::EconomicVelocity => &mut self.economic_velocity,
SovereignDimension::CivicParticipation => &mut self.civic_participation,
SovereignDimension::StewardshipCare => &mut self.stewardship_care,
SovereignDimension::SemanticResonance => &mut self.semantic_resonance,
SovereignDimension::DomainCompetence => &mut self.domain_competence,
};
*target = value;
}
pub fn as_array(&self) -> [f64; 8] {
[
self.epistemic_integrity,
self.thermodynamic_yield,
self.network_resilience,
self.economic_velocity,
self.civic_participation,
self.stewardship_care,
self.semantic_resonance,
self.domain_competence,
]
}
pub fn from_array(values: [f64; 8]) -> Self {
Self {
epistemic_integrity: values[0],
thermodynamic_yield: values[1],
network_resilience: values[2],
economic_velocity: values[3],
civic_participation: values[4],
stewardship_care: values[5],
semantic_resonance: values[6],
domain_competence: values[7],
}
}
fn sanitize(v: f64) -> f64 {
if v.is_finite() {
v.clamp(0.0, 1.0)
} else {
0.0
}
}
pub fn combined_score(&self, weights: &weights::DimensionWeights) -> f64 {
let dims = self.as_array();
let w = &weights.weights;
let mut score = 0.0;
for i in 0..8 {
score += Self::sanitize(dims[i]) * w[i];
}
score.clamp(0.0, 1.0)
}
pub fn tier(&self, weights: &weights::DimensionWeights) -> CivicTier {
CivicTier::from_score(self.combined_score(weights))
}
pub fn meets_requirement(
&self,
requirement: &CivicRequirement,
weights: &weights::DimensionWeights,
) -> bool {
let tier = self.tier(weights);
if tier < requirement.min_tier {
return false;
}
for &(dim, min_value) in &requirement.min_dimensions {
if Self::sanitize(self.get(dim)) < min_value {
return false;
}
}
true
}
}
impl Default for SovereignProfile {
fn default() -> Self {
Self::zero()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum CivicTier {
Observer,
Participant,
Citizen,
Steward,
Guardian,
}
impl CivicTier {
pub fn min_score(&self) -> f64 {
match self {
Self::Observer => 0.0,
Self::Participant => 0.3,
Self::Citizen => 0.4,
Self::Steward => 0.6,
Self::Guardian => 0.8,
}
}
pub fn from_score(score: f64) -> Self {
if score >= 0.8 {
Self::Guardian
} else if score >= 0.6 {
Self::Steward
} else if score >= 0.4 {
Self::Citizen
} else if score >= 0.3 {
Self::Participant
} else {
Self::Observer
}
}
pub fn vote_weight_bp(&self) -> u32 {
match self {
Self::Observer => 0,
Self::Participant => 5_000,
Self::Citizen => 7_500,
Self::Steward => 10_000,
Self::Guardian => 10_000,
}
}
pub fn key(&self) -> &'static str {
match self {
Self::Observer => "observer",
Self::Participant => "participant",
Self::Citizen => "citizen",
Self::Steward => "steward",
Self::Guardian => "guardian",
}
}
pub fn label(&self) -> &'static str {
match self {
Self::Observer => "Observer",
Self::Participant => "Participant",
Self::Citizen => "Citizen",
Self::Steward => "Steward",
Self::Guardian => "Guardian",
}
}
pub fn css_class(&self) -> &'static str {
match self {
Self::Observer => "observer",
Self::Participant => "participant",
Self::Citizen => "citizen",
Self::Steward => "steward",
Self::Guardian => "guardian",
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CivicRequirement {
pub min_tier: CivicTier,
pub min_dimensions: Vec<(SovereignDimension, f64)>,
}
pub fn civic_requirement_basic() -> CivicRequirement {
CivicRequirement {
min_tier: CivicTier::Participant,
min_dimensions: vec![],
}
}
pub fn civic_requirement_proposal() -> CivicRequirement {
CivicRequirement {
min_tier: CivicTier::Participant,
min_dimensions: vec![(SovereignDimension::EpistemicIntegrity, 0.25)],
}
}
pub fn civic_requirement_voting() -> CivicRequirement {
CivicRequirement {
min_tier: CivicTier::Citizen,
min_dimensions: vec![(SovereignDimension::EpistemicIntegrity, 0.25)],
}
}
pub fn civic_requirement_constitutional() -> CivicRequirement {
CivicRequirement {
min_tier: CivicTier::Steward,
min_dimensions: vec![
(SovereignDimension::EpistemicIntegrity, 0.5),
(SovereignDimension::CivicParticipation, 0.3),
],
}
}
pub fn civic_requirement_guardian() -> CivicRequirement {
CivicRequirement {
min_tier: CivicTier::Guardian,
min_dimensions: vec![
(SovereignDimension::EpistemicIntegrity, 0.7),
(SovereignDimension::CivicParticipation, 0.5),
],
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SovereignCredential {
pub did: String,
pub profile: SovereignProfile,
pub tier: CivicTier,
pub issued_at: u64,
pub expires_at: u64,
pub issuer: String,
pub extensions: Vec<(String, Vec<u8>)>,
}