pub mod petgraph;
use std::collections::HashMap;
pub use petgraph::{EdgeData, PetgraphStableDiGraphManager, StableDiGraph};
use thiserror::Error;
use tycho_simulation::{
tycho_common::{models::Address, simulation::protocol_sim::ProtocolSim},
tycho_core::models::token::Token,
};
use crate::types::ComponentId;
#[derive(Clone, Default)]
pub struct Path<'a, D> {
pub tokens: Vec<&'a Address>,
pub edge_data: Vec<&'a EdgeData<D>>,
}
impl<'a, D> Path<'a, D> {
pub fn new() -> Self {
Self { tokens: Vec::new(), edge_data: Vec::new() }
}
pub fn add_hop(&mut self, from: &'a Address, edge_data: &'a EdgeData<D>, to: &'a Address) {
if self.tokens.is_empty() {
self.tokens.push(from);
}
self.tokens.push(to);
self.edge_data.push(edge_data);
}
pub fn len(&self) -> usize {
self.edge_data.len()
}
pub fn is_empty(&self) -> bool {
self.edge_data.is_empty()
}
pub fn edge_iter(&self) -> &[&'a EdgeData<D>] {
&self.edge_data
}
pub fn iter(&self) -> impl Iterator<Item = (&'a Address, &'a EdgeData<D>, &'a Address)> + '_ {
self.tokens
.windows(2)
.zip(self.edge_data.iter())
.map(|(tokens, edge)| (tokens[0], *edge, tokens[1]))
}
pub fn reversed(self) -> Self {
let reversed_tokens = self.tokens.into_iter().rev().collect();
let reversed_edge_data = self
.edge_data
.into_iter()
.rev()
.collect();
Self { tokens: reversed_tokens, edge_data: reversed_edge_data }
}
}
#[derive(Error, Debug)]
pub enum GraphError {
#[error("Token not found in graph: {0:?}")]
TokenNotFound(Address),
#[error("Components not found in graph: {0:?}")]
ComponentsNotFound(Vec<ComponentId>),
#[error("Components with less then 2 tokens cannot be added: {0:?}")]
InvalidComponents(Vec<ComponentId>),
#[cfg(test)]
#[error("No edge found between tokens {0:?} and {1:?} for component {2}")]
MissingComponentBetweenTokens(Address, Address, ComponentId),
}
pub trait GraphManager<G>: Send + Sync
where
G: Send + Sync,
{
fn initialize_graph(&mut self, components: &HashMap<ComponentId, Vec<Address>>);
fn graph(&self) -> &G;
}
use crate::{derived::DerivedData, feed::market_data::SharedMarketData};
pub trait EdgeWeightFromSimAndDerived: Sized {
fn from_sim_and_derived(
sim: &dyn ProtocolSim,
component_id: &ComponentId,
token_in: &Token,
token_out: &Token,
derived: &DerivedData,
) -> Option<Self>;
}
impl EdgeWeightFromSimAndDerived for () {
fn from_sim_and_derived(
_sim: &dyn ProtocolSim,
_component_id: &ComponentId,
_token_in: &Token,
_token_out: &Token,
_derived: &DerivedData,
) -> Option<Self> {
Some(())
}
}
pub trait EdgeWeightUpdaterWithDerived {
fn update_edge_weights_with_derived(
&mut self,
market: &SharedMarketData,
derived: &DerivedData,
) -> usize;
}