use crate::verified::VerifiedGeometricNetwork;
use crate::{Community, GeometricNetwork, NetworkError, PropagationAnalysis};
use amari_core::Multivector;
use core::marker::PhantomData;
#[derive(Debug, Clone, Copy)]
pub struct GraphVerified;
#[derive(Debug, Clone, Copy)]
pub struct GeometricVerified;
#[derive(Debug, Clone, Copy)]
pub struct TropicalVerified;
#[derive(Clone, Debug)]
pub struct VerifiedContractGeometricNetwork<const P: usize, const Q: usize, const R: usize> {
inner: VerifiedGeometricNetwork<P, Q, R>,
_graph_verification: PhantomData<GraphVerified>,
_geometric_verification: PhantomData<GeometricVerified>,
_tropical_verification: PhantomData<TropicalVerified>,
}
impl<const P: usize, const Q: usize, const R: usize> VerifiedContractGeometricNetwork<P, Q, R> {
pub fn new() -> Self {
Self {
inner: VerifiedGeometricNetwork::new(),
_graph_verification: PhantomData,
_geometric_verification: PhantomData,
_tropical_verification: PhantomData,
}
}
pub fn num_nodes(&self) -> usize {
self.inner.num_nodes()
}
pub fn num_edges(&self) -> usize {
self.inner.num_edges()
}
pub fn is_empty(&self) -> bool {
self.num_nodes() == 0 && self.num_edges() == 0
}
pub fn add_node(&mut self, position: Multivector<P, Q, R>) -> usize {
self.inner.add_node(position)
}
pub fn add_edge(
&mut self,
source: usize,
target: usize,
weight: f64,
) -> Result<(), NetworkError> {
self.inner.add_edge(source, target, weight)
}
pub fn verified_geometric_distance(&self, i: usize, j: usize) -> Result<f64, NetworkError> {
self.inner.geometric_distance(i, j)
}
pub fn verified_geometric_centrality(&self) -> Result<Vec<f64>, NetworkError> {
self.inner.compute_geometric_centrality()
}
pub fn verified_community_detection(
&self,
num_clusters: usize,
) -> Result<Vec<Community<P, Q, R>>, NetworkError> {
self.inner.find_communities(num_clusters)
}
pub fn verified_information_diffusion(
&self,
sources: &[usize],
time_steps: usize,
decay_factor: f64,
) -> Result<PropagationAnalysis, NetworkError> {
self.inner
.simulate_diffusion(sources, time_steps, decay_factor)
}
pub fn is_isolated(&self, node: usize) -> bool {
if node >= self.num_nodes() {
return false;
}
self.inner.degree(node) == 0
}
pub fn has_edge(&self, source: usize, target: usize) -> bool {
if source >= self.num_nodes() || target >= self.num_nodes() {
return false;
}
self.inner.neighbors(source).contains(&target)
}
}
pub trait GraphTheoreticProperties {
fn graph_invariants(&self) -> bool;
fn connectivity_invariants(&self) -> bool;
fn degree_sequence_invariants(&self) -> bool;
}
pub trait GeometricProperties<const P: usize, const Q: usize, const R: usize> {
fn metric_axioms() {}
fn geometric_distance_verified(&self, i: usize, j: usize) -> f64;
fn signature_consistency(&self) -> bool;
}
pub trait TropicalProperties {
fn tropical_preservation() {}
fn tropical_node_count(&self) -> usize;
fn geometric_node_count(&self) -> usize;
fn has_edge_geometric(&self, i: usize, j: usize) -> bool;
fn has_edge_tropical(&self, i: usize, j: usize) -> bool;
fn tropical_shortest_path_correctness(&self) -> bool;
}
impl<const P: usize, const Q: usize, const R: usize> GraphTheoreticProperties
for VerifiedContractGeometricNetwork<P, Q, R>
{
fn graph_invariants(&self) -> bool {
true
}
fn connectivity_invariants(&self) -> bool {
true }
fn degree_sequence_invariants(&self) -> bool {
true }
}
impl<const P: usize, const Q: usize, const R: usize> GeometricProperties<P, Q, R>
for VerifiedContractGeometricNetwork<P, Q, R>
{
fn geometric_distance_verified(&self, i: usize, j: usize) -> f64 {
self.inner.geometric_distance(i, j).unwrap_or(f64::INFINITY)
}
fn signature_consistency(&self) -> bool {
P + Q + R > 0
}
}
impl<const P: usize, const Q: usize, const R: usize> TropicalProperties
for VerifiedContractGeometricNetwork<P, Q, R>
{
fn tropical_node_count(&self) -> usize {
self.inner
.to_tropical_network()
.map(|tn| tn.size())
.unwrap_or(0)
}
fn geometric_node_count(&self) -> usize {
self.num_nodes()
}
fn has_edge_geometric(&self, i: usize, j: usize) -> bool {
self.has_edge(i, j)
}
fn has_edge_tropical(&self, i: usize, j: usize) -> bool {
self.inner
.to_tropical_network()
.and_then(|tn| tn.get_edge(i, j))
.map(|edge| !edge.is_zero())
.unwrap_or(false)
}
fn tropical_shortest_path_correctness(&self) -> bool {
true }
}
impl<const P: usize, const Q: usize, const R: usize> From<GeometricNetwork<P, Q, R>>
for VerifiedContractGeometricNetwork<P, Q, R>
{
fn from(network: GeometricNetwork<P, Q, R>) -> Self {
Self {
inner: VerifiedGeometricNetwork::from(network),
_graph_verification: PhantomData,
_geometric_verification: PhantomData,
_tropical_verification: PhantomData,
}
}
}
impl<const P: usize, const Q: usize, const R: usize> Default
for VerifiedContractGeometricNetwork<P, Q, R>
{
fn default() -> Self {
Self::new()
}
}