use crate::{DMatrix, MarkovFlow};
pub fn sequence(adj: &DMatrix<f64>, mu: f64, influence: f64, dependency: f64) -> Vec<usize> {
let flow = MarkovFlow::new(adj, mu, true);
let influence_vector = flow.flow_matrix.row_sum();
let dependency_vector = flow.flow_matrix.column_sum();
let penalty_vector: Vec<f64> = (0..flow.dim)
.map(|i| dependency * dependency_vector[i] - influence * influence_vector[i])
.collect();
let mut sequence: Vec<usize> = (0..flow.dim).collect();
sequence.sort_by(|&i, &j| penalty_vector[i].partial_cmp(&penalty_vector[j]).unwrap());
sequence
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sequence_trivial() {
let adj = DMatrix::from_row_slice(3, 3, &[0.0, 5.0, 10.0, 1.0, 0.0, 0.0, 0.0, 10.0, 0.0]);
let seq = sequence(&adj, 2.0, 1.0, 1.0);
let reference: Vec<usize> = vec![1, 2, 0];
assert_eq!(seq, reference);
}
}