1use std::collections::BTreeMap;
2
3use cxx::{CxxVector, UniquePtr};
4use miette::IntoDiagnostic;
5
6use crate::{
7 base::Algorithm,
8 base::DynAlgorithm,
9 bridge::{self, *},
10 community::ValueIter,
11 tools::NodeIter,
12};
13
14pub trait STSP: Algorithm {
15 fn get_path(&self) -> NodeIter;
16 fn get_predecessors(&self) -> NodeIter;
17 fn get_distance(&self) -> f64;
18 fn get_distances(&self) -> ValueIter;
19 fn set_source(&mut self, u: u64);
20 fn set_target(&mut self, v: u64);
21 fn set_targets(&mut self, vs: &[u64]);
22 fn get_target_index_map(&self) -> BTreeMap<u64, u64>;
23}
24
25pub trait SSSP: Algorithm {
26 fn distance(&self, t: u64) -> f64;
27 fn get_distances(&mut self) -> ValueIter;
28 fn number_of_paths(&self, t: u64) -> f64;
29 fn get_predecessors(&self, t: u64) -> NodeIter;
30 fn get_path(&self, t: u64, forward: bool) -> NodeIter;
31 fn get_paths(&self, t: u64, forward: bool) -> Vec<Vec<u64>>;
32 fn get_node_sorted_by_distances(&self) -> NodeIter;
33 fn get_num_reachable_nodes(&self) -> u64;
34 fn set_source(&mut self, u: u64);
35 fn set_target(&mut self, v: u64);
36 fn get_sum_of_distances(&self) -> f64;
37}
38
39pub trait DynSSSP: SSSP + DynAlgorithm {
40 fn modified(&mut self) -> bool;
41 fn set_target_node(&mut self, t: u64);
42}
43
44pub trait NodeDistance {
45 fn preprocess(&mut self);
46 fn distance(&mut self, u: u64, v: u64) -> f64;
47 fn get_edge_scores(&self) -> ValueIter;
48}
49
50pub struct APSP {
51 inner: UniquePtr<bridge::APSP>,
52}
53
54impl APSP {
55 pub fn new(g: &crate::Graph) -> Self {
56 Self { inner: NewAPSP(g) }
57 }
58 pub fn get_distance(&self, u: u64, v: u64) -> f64 {
59 self.inner.getDistance(u, v)
60 }
61 pub fn get_distances(&self) -> BTreeMap<u64, BTreeMap<u64, f64>> {
62 let mut ret: BTreeMap<u64, BTreeMap<u64, f64>> = BTreeMap::new();
63 let mut r = vec![];
64 let n = APSPGetDistances(&self.inner, &mut r);
65 for (i, wt) in r.into_iter().enumerate() {
66 let i = i as u64;
67 let src = i / n;
68 let dst = i % n;
69 ret.entry(src).or_default().insert(dst, wt);
70 }
71 ret
72 }
73}
74
75impl Algorithm for APSP {
76 fn run(&mut self) -> miette::Result<()> {
77 self.inner.pin_mut().run().into_diagnostic()
78 }
79
80 fn has_finished(&self) -> bool {
81 self.inner.hasFinished()
82 }
83}
84
85pub struct AStar {
86 inner: UniquePtr<bridge::AStar>,
87 _heu: UniquePtr<CxxVector<f64>>,
88}
89
90impl AStar {
91 pub fn new(g: &crate::Graph, heuristic: &[f64], src: u64, dst: u64, store_pred: bool) -> Self {
92 let heu = MakeWeightVector(heuristic);
93 let inner = NewAStar(g, &heu, src, dst, store_pred);
94 Self { inner, _heu: heu }
95 }
96}
97
98impl Algorithm for AStar {
99 fn run(&mut self) -> miette::Result<()> {
100 self.inner.pin_mut().run().into_diagnostic()
101 }
102
103 fn has_finished(&self) -> bool {
104 self.inner.hasFinished()
105 }
106}
107
108impl STSP for AStar {
109 fn get_path(&self) -> NodeIter {
110 NodeIter {
111 at: 0,
112 nodes: AStarGetPath(&self.inner),
113 }
114 }
115
116 fn get_predecessors(&self) -> NodeIter {
117 NodeIter {
118 at: 0,
119 nodes: AStarGetPredecessors(&self.inner),
120 }
121 }
122
123 fn set_source(&mut self, u: u64) {
124 self.inner.pin_mut().setSource(u)
125 }
126
127 fn set_target(&mut self, v: u64) {
128 self.inner.pin_mut().setTarget(v)
129 }
130
131 fn set_targets(&mut self, vs: &[u64]) {
132 AStarSetTargets(self.inner.pin_mut(), vs);
133 }
134
135 fn get_target_index_map(&self) -> BTreeMap<u64, u64> {
136 let mut ks = vec![];
137 let mut vs = vec![];
138 AStarGetTargetIndexMap(&self.inner, &mut ks, &mut vs);
139 ks.into_iter().zip(vs).collect()
140 }
141
142 fn get_distance(&self) -> f64 {
143 self.inner.getDistance()
144 }
145
146 fn get_distances(&self) -> ValueIter {
147 ValueIter {
148 inner: AStarGetDistances(&self.inner),
149 at: 0,
150 }
151 }
152}
153
154pub struct AdamicAdarDistance {
155 inner: UniquePtr<bridge::AdamicAdarDistance>,
156}
157
158impl AdamicAdarDistance {
159 pub fn new(g: &crate::Graph) -> Self {
160 Self {
161 inner: NewAdamicAdarDistance(g),
162 }
163 }
164}
165
166impl NodeDistance for AdamicAdarDistance {
167 fn preprocess(&mut self) {
168 self.inner.pin_mut().preprocess()
169 }
170
171 fn distance(&mut self, u: u64, v: u64) -> f64 {
172 self.inner.pin_mut().distance(u, v)
173 }
174
175 fn get_edge_scores(&self) -> ValueIter {
176 ValueIter {
177 at: 0,
178 inner: AdamicAdarDistanceGetEdgeScores(&self.inner),
179 }
180 }
181}
182
183pub struct AlgebraicDistance {
184 inner: UniquePtr<bridge::AlgebraicDistance>,
185}
186
187impl AlgebraicDistance {
188 pub fn new(
189 g: &crate::Graph,
190 n_systems: Option<u64>,
191 n_iterations: Option<u64>,
192 omega: Option<f64>,
193 norm: Option<u64>,
194 with_edge_scores: bool,
195 ) -> Self {
196 Self {
197 inner: NewAlgebraicDistance(
198 g,
199 n_systems.unwrap_or(10),
200 n_iterations.unwrap_or(30),
201 omega.unwrap_or(0.5),
202 norm.unwrap_or(0),
203 with_edge_scores,
204 ),
205 }
206 }
207}
208
209impl NodeDistance for AlgebraicDistance {
210 fn preprocess(&mut self) {
211 self.inner.pin_mut().preprocess()
212 }
213
214 fn distance(&mut self, u: u64, v: u64) -> f64 {
215 self.inner.pin_mut().distance(u, v)
216 }
217
218 fn get_edge_scores(&self) -> ValueIter {
219 ValueIter {
220 at: 0,
221 inner: AlgebraicDistanceGetEdgeScores(&self.inner),
222 }
223 }
224}
225
226pub struct AllSimplePaths {
227 inner: UniquePtr<bridge::AllSimplePaths>,
228}
229
230impl AllSimplePaths {
231 pub fn new(g: &crate::Graph, src: u64, dst: u64, cutoff: u64) -> Self {
232 Self {
233 inner: NewAllSimplePaths(g, src, dst, cutoff),
234 }
235 }
236
237 pub fn number_of_simple_paths(&mut self) -> u64 {
238 self.inner.pin_mut().numberOfSimplePaths()
239 }
240
241 pub fn get_all_simple_paths(&mut self) -> Vec<Vec<u64>> {
242 let mut temp = vec![];
243 AllSimplePathsGetAllSimplePaths(self.inner.pin_mut(), &mut temp);
244 let mut ret = vec![];
245 let mut cur = vec![];
246 for n in temp {
247 if n == u64::MAX {
248 ret.push(cur);
249 cur = vec![];
250 } else {
251 cur.push(n);
252 }
253 }
254 ret
255 }
256}
257
258impl Algorithm for AllSimplePaths {
259 fn run(&mut self) -> miette::Result<()> {
260 self.inner.pin_mut().run().into_diagnostic()
261 }
262
263 fn has_finished(&self) -> bool {
264 self.inner.hasFinished()
265 }
266}
267
268pub struct Dijkstra {
269 inner: UniquePtr<bridge::Dijkstra>,
270}
271
272impl Dijkstra {
273 pub fn new(
274 g: &crate::Graph,
275 src: u64,
276 store_paths: bool,
277 store_nodes_sorted_by_distance: bool,
278 dst: Option<u64>,
279 ) -> Self {
280 Self {
281 inner: NewDijkstra(
282 g,
283 src,
284 store_paths,
285 store_nodes_sorted_by_distance,
286 dst.unwrap_or(u64::MAX),
287 ),
288 }
289 }
290}
291
292impl Algorithm for Dijkstra {
293 fn run(&mut self) -> miette::Result<()> {
294 self.inner.pin_mut().run().into_diagnostic()
295 }
296
297 fn has_finished(&self) -> bool {
298 self.inner.hasFinished()
299 }
300}
301
302impl SSSP for Dijkstra {
303 fn distance(&self, t: u64) -> f64 {
304 self.inner.distance(t)
305 }
306
307 fn get_distances(&mut self) -> ValueIter {
308 ValueIter {
309 at: 0,
310 inner: DijkstraGetDistances(self.inner.pin_mut()),
311 }
312 }
313
314 fn number_of_paths(&self, t: u64) -> f64 {
315 self.inner._numberOfPaths(t)
316 }
317
318 fn get_predecessors(&self, t: u64) -> NodeIter {
319 NodeIter {
320 at: 0,
321 nodes: DijkstraGetPredecessors(&self.inner, t),
322 }
323 }
324
325 fn get_path(&self, t: u64, forward: bool) -> NodeIter {
326 NodeIter {
327 at: 0,
328 nodes: DijkstraGetPath(&self.inner, t, forward),
329 }
330 }
331
332 fn get_paths(&self, t: u64, forward: bool) -> Vec<Vec<u64>> {
333 let mut temp = vec![];
334 DijkstraGetPaths(&self.inner, t, forward, &mut temp);
335 let mut ret = vec![];
336 let mut cur = vec![];
337 for n in temp {
338 if n == u64::MAX {
339 ret.push(cur);
340 cur = vec![];
341 } else {
342 cur.push(n);
343 }
344 }
345 ret
346 }
347
348 fn get_node_sorted_by_distances(&self) -> NodeIter {
349 NodeIter {
350 at: 0,
351 nodes: DijkstraGetNodeSortedByDistance(&self.inner),
352 }
353 }
354
355 fn get_num_reachable_nodes(&self) -> u64 {
356 self.inner.getReachableNodes()
357 }
358
359 fn set_source(&mut self, u: u64) {
360 self.inner.pin_mut().setSource(u)
361 }
362
363 fn set_target(&mut self, v: u64) {
364 self.inner.pin_mut().setTarget(v)
365 }
366
367 fn get_sum_of_distances(&self) -> f64 {
368 self.inner.getSumOfDistances()
369 }
370}
371
372pub struct BidirectionalBFS {
373 inner: UniquePtr<bridge::BidirectionalBFS>,
374}
375
376impl BidirectionalBFS {
377 pub fn new(g: &crate::Graph, src: u64, dst: u64, store_pred: bool) -> Self {
378 let inner = NewBidirectionalBFS(g, src, dst, store_pred);
379 Self { inner }
380 }
381}
382
383impl Algorithm for BidirectionalBFS {
384 fn run(&mut self) -> miette::Result<()> {
385 self.inner.pin_mut().run().into_diagnostic()
386 }
387
388 fn has_finished(&self) -> bool {
389 self.inner.hasFinished()
390 }
391}
392
393impl STSP for BidirectionalBFS {
394 fn get_path(&self) -> NodeIter {
395 NodeIter {
396 at: 0,
397 nodes: BidirectionalBFSGetPath(&self.inner),
398 }
399 }
400
401 fn get_predecessors(&self) -> NodeIter {
402 NodeIter {
403 at: 0,
404 nodes: BidirectionalBFSGetPredecessors(&self.inner),
405 }
406 }
407
408 fn set_source(&mut self, u: u64) {
409 self.inner.pin_mut().setSource(u)
410 }
411
412 fn set_target(&mut self, v: u64) {
413 self.inner.pin_mut().setTarget(v)
414 }
415
416 fn set_targets(&mut self, vs: &[u64]) {
417 BidirectionalBFSSetTargets(self.inner.pin_mut(), vs);
418 }
419
420 fn get_target_index_map(&self) -> BTreeMap<u64, u64> {
421 let mut ks = vec![];
422 let mut vs = vec![];
423 BidirectionalBFSGetTargetIndexMap(&self.inner, &mut ks, &mut vs);
424 ks.into_iter().zip(vs).collect()
425 }
426
427 fn get_distance(&self) -> f64 {
428 self.inner.getDistance()
429 }
430
431 fn get_distances(&self) -> ValueIter {
432 ValueIter {
433 inner: BidirectionalBFSGetDistances(&self.inner),
434 at: 0,
435 }
436 }
437}
438
439pub struct BidirectionalDijkstra {
440 inner: UniquePtr<bridge::BidirectionalDijkstra>,
441}
442
443impl BidirectionalDijkstra {
444 pub fn new(g: &crate::Graph, src: u64, dst: u64, store_pred: bool) -> Self {
445 let inner = NewBidirectionalDijkstra(g, src, dst, store_pred);
446 Self { inner }
447 }
448}
449
450impl Algorithm for BidirectionalDijkstra {
451 fn run(&mut self) -> miette::Result<()> {
452 self.inner.pin_mut().run().into_diagnostic()
453 }
454
455 fn has_finished(&self) -> bool {
456 self.inner.hasFinished()
457 }
458}
459
460impl STSP for BidirectionalDijkstra {
461 fn get_path(&self) -> NodeIter {
462 NodeIter {
463 at: 0,
464 nodes: BidirectionalDijkstraGetPath(&self.inner),
465 }
466 }
467
468 fn get_predecessors(&self) -> NodeIter {
469 NodeIter {
470 at: 0,
471 nodes: BidirectionalDijkstraGetPredecessors(&self.inner),
472 }
473 }
474
475 fn set_source(&mut self, u: u64) {
476 self.inner.pin_mut().setSource(u)
477 }
478
479 fn set_target(&mut self, v: u64) {
480 self.inner.pin_mut().setTarget(v)
481 }
482
483 fn set_targets(&mut self, vs: &[u64]) {
484 BidirectionalDijkstraSetTargets(self.inner.pin_mut(), vs);
485 }
486
487 fn get_target_index_map(&self) -> BTreeMap<u64, u64> {
488 let mut ks = vec![];
489 let mut vs = vec![];
490 BidirectionalDijkstraGetTargetIndexMap(&self.inner, &mut ks, &mut vs);
491 ks.into_iter().zip(vs).collect()
492 }
493
494 fn get_distance(&self) -> f64 {
495 self.inner.getDistance()
496 }
497
498 fn get_distances(&self) -> ValueIter {
499 ValueIter {
500 inner: BidirectionalDijkstraGetDistances(&self.inner),
501 at: 0,
502 }
503 }
504}
505
506pub struct CommuteTimeDistance {
507 inner: UniquePtr<bridge::CommuteTimeDistance>,
508}
509
510impl CommuteTimeDistance {
511 pub fn new(g: &crate::Graph, tol: Option<f64>) -> Self {
512 let inner = NewCommuteTimeDistance(g, tol.unwrap_or(0.1));
513 Self { inner }
514 }
515
516 pub fn run_approximation(&mut self) {
517 self.inner.pin_mut().runApproximation()
518 }
519 pub fn run_parallel_approximation(&mut self) {
520 self.inner.pin_mut().runParallelApproximation()
521 }
522 pub fn get_startup_time(&self) -> u64 {
523 self.inner.getSetupTime()
524 }
525 pub fn run_single_pair(&mut self, u: u64, v: u64) -> f64 {
526 self.inner.pin_mut().runSinglePair(u, v)
527 }
528 pub fn distance(&mut self, u: u64, v: u64) -> f64 {
529 self.inner.pin_mut().distance(u, v)
530 }
531 pub fn run_single_source(&mut self, u: u64) -> f64 {
532 self.inner.pin_mut().runSingleSource(u)
533 }
534}
535
536impl Algorithm for CommuteTimeDistance {
537 fn run(&mut self) -> miette::Result<()> {
538 self.inner.pin_mut().run().into_diagnostic()
539 }
540
541 fn has_finished(&self) -> bool {
542 self.inner.hasFinished()
543 }
544}
545
546pub struct Diameter {
547 inner: UniquePtr<bridge::Diameter>,
548}
549
550#[derive(Default, Copy, Clone, Eq, PartialEq)]
551#[repr(u8)]
552
553pub enum DiameterAlgorithm {
554 #[default]
555 Automatic = 0,
556 Exact = 1,
557 EstimatedRange = 2,
558 EstimatedSamples = 3,
559 EstimatedPedantic = 4,
560}
561
562impl Diameter {
563 pub fn new(
564 g: &crate::Graph,
565 algo: DiameterAlgorithm,
566 error: Option<f64>,
567 n_samples: Option<u64>,
568 ) -> Self {
569 let inner = NewDiameter(g, algo as u8, error.unwrap_or(-1.), n_samples.unwrap_or(0));
570 Self { inner }
571 }
572 pub fn get_diameter(&self) -> (u64, u64) {
573 let mut lower = 0;
574 let mut upper = 0;
575 DiameterGetDiameter(&self.inner, &mut lower, &mut upper);
576 (lower, upper)
577 }
578}
579
580impl Algorithm for Diameter {
581 fn run(&mut self) -> miette::Result<()> {
582 self.inner.pin_mut().run().into_diagnostic()
583 }
584
585 fn has_finished(&self) -> bool {
586 self.inner.hasFinished()
587 }
588}
589
590pub struct BFS {
591 inner: UniquePtr<bridge::BFS>,
592}
593
594impl BFS {
595 pub fn new(
596 g: &crate::Graph,
597 src: u64,
598 store_paths: bool,
599 store_nodes_sorted_by_distance: bool,
600 dst: Option<u64>,
601 ) -> Self {
602 Self {
603 inner: NewBFS(
604 g,
605 src,
606 store_paths,
607 store_nodes_sorted_by_distance,
608 dst.unwrap_or(u64::MAX),
609 ),
610 }
611 }
612}
613
614impl Algorithm for BFS {
615 fn run(&mut self) -> miette::Result<()> {
616 self.inner.pin_mut().run().into_diagnostic()
617 }
618
619 fn has_finished(&self) -> bool {
620 self.inner.hasFinished()
621 }
622}
623
624impl SSSP for BFS {
625 fn distance(&self, t: u64) -> f64 {
626 self.inner.distance(t)
627 }
628
629 fn get_distances(&mut self) -> ValueIter {
630 ValueIter {
631 at: 0,
632 inner: BFSGetDistances(self.inner.pin_mut()),
633 }
634 }
635
636 fn number_of_paths(&self, t: u64) -> f64 {
637 self.inner._numberOfPaths(t)
638 }
639
640 fn get_predecessors(&self, t: u64) -> NodeIter {
641 NodeIter {
642 at: 0,
643 nodes: BFSGetPredecessors(&self.inner, t),
644 }
645 }
646
647 fn get_path(&self, t: u64, forward: bool) -> NodeIter {
648 NodeIter {
649 at: 0,
650 nodes: BFSGetPath(&self.inner, t, forward),
651 }
652 }
653
654 fn get_paths(&self, t: u64, forward: bool) -> Vec<Vec<u64>> {
655 let mut temp = vec![];
656 BFSGetPaths(&self.inner, t, forward, &mut temp);
657 let mut ret = vec![];
658 let mut cur = vec![];
659 for n in temp {
660 if n == u64::MAX {
661 ret.push(cur);
662 cur = vec![];
663 } else {
664 cur.push(n);
665 }
666 }
667 ret
668 }
669
670 fn get_node_sorted_by_distances(&self) -> NodeIter {
671 NodeIter {
672 at: 0,
673 nodes: BFSGetNodeSortedByDistance(&self.inner),
674 }
675 }
676
677 fn get_num_reachable_nodes(&self) -> u64 {
678 self.inner.getReachableNodes()
679 }
680
681 fn set_source(&mut self, u: u64) {
682 self.inner.pin_mut().setSource(u)
683 }
684
685 fn set_target(&mut self, v: u64) {
686 self.inner.pin_mut().setTarget(v)
687 }
688
689 fn get_sum_of_distances(&self) -> f64 {
690 self.inner.getSumOfDistances()
691 }
692}
693
694pub struct DynAPSP {
695 inner: UniquePtr<bridge::DynAPSP>,
696}
697
698impl DynAPSP {
699 pub fn new(g: &mut crate::Graph) -> Self {
700 Self {
701 inner: NewDynAPSP(g.inner.pin_mut()),
702 }
703 }
704 pub fn get_distance(&self, u: u64, v: u64) -> f64 {
705 self.inner.getDistance(u, v)
706 }
707 pub fn get_distances(&self) -> BTreeMap<u64, BTreeMap<u64, f64>> {
708 let mut ret: BTreeMap<u64, BTreeMap<u64, f64>> = BTreeMap::new();
709 let mut r = vec![];
710 let n = DynAPSPGetDistances(&self.inner, &mut r);
711 for (i, wt) in r.into_iter().enumerate() {
712 let i = i as u64;
713 let src = i / n;
714 let dst = i % n;
715 ret.entry(src).or_default().insert(dst, wt);
716 }
717 ret
718 }
719}
720
721impl Algorithm for DynAPSP {
722 fn run(&mut self) -> miette::Result<()> {
723 self.inner.pin_mut().run().into_diagnostic()
724 }
725
726 fn has_finished(&self) -> bool {
727 self.inner.hasFinished()
728 }
729}
730
731impl DynAlgorithm for DynAPSP {
732 fn update(&mut self, e: crate::base::GraphEvent) {
733 DynAPSPUpdate(self.inner.pin_mut(), e.kind as u8, e.u, e.v, e.ew)
734 }
735
736 fn update_batch(&mut self, es: &[crate::base::GraphEvent]) {
737 let mut kinds = Vec::with_capacity(es.len());
738 let mut us = Vec::with_capacity(es.len());
739 let mut vs = Vec::with_capacity(es.len());
740 let mut ews = Vec::with_capacity(es.len());
741 for ev in es {
742 kinds.push(ev.kind as u8);
743 us.push(ev.u);
744 vs.push(ev.v);
745 ews.push(ev.ew);
746 }
747 DynAPSPUpdateBatch(self.inner.pin_mut(), &kinds, &us, &vs, &ews);
748 }
749}
750
751pub struct DynBFS {
752 inner: UniquePtr<bridge::DynBFS>,
753}
754
755impl DynBFS {
756 pub fn new(g: &crate::Graph, src: u64, store_predecessors: bool) -> Self {
757 Self {
758 inner: NewDynBFS(g, src, store_predecessors),
759 }
760 }
761}
762
763impl Algorithm for DynBFS {
764 fn run(&mut self) -> miette::Result<()> {
765 self.inner.pin_mut().run().into_diagnostic()
766 }
767
768 fn has_finished(&self) -> bool {
769 self.inner.hasFinished()
770 }
771}
772
773impl SSSP for DynBFS {
774 fn distance(&self, t: u64) -> f64 {
775 self.inner.distance(t)
776 }
777
778 fn get_distances(&mut self) -> ValueIter {
779 ValueIter {
780 at: 0,
781 inner: DynBFSGetDistances(self.inner.pin_mut()),
782 }
783 }
784
785 fn number_of_paths(&self, t: u64) -> f64 {
786 self.inner._numberOfPaths(t)
787 }
788
789 fn get_predecessors(&self, t: u64) -> NodeIter {
790 NodeIter {
791 at: 0,
792 nodes: DynBFSGetPredecessors(&self.inner, t),
793 }
794 }
795
796 fn get_path(&self, t: u64, forward: bool) -> NodeIter {
797 NodeIter {
798 at: 0,
799 nodes: DynBFSGetPath(&self.inner, t, forward),
800 }
801 }
802
803 fn get_paths(&self, t: u64, forward: bool) -> Vec<Vec<u64>> {
804 let mut temp = vec![];
805 DynBFSGetPaths(&self.inner, t, forward, &mut temp);
806 let mut ret = vec![];
807 let mut cur = vec![];
808 for n in temp {
809 if n == u64::MAX {
810 ret.push(cur);
811 cur = vec![];
812 } else {
813 cur.push(n);
814 }
815 }
816 ret
817 }
818
819 fn get_node_sorted_by_distances(&self) -> NodeIter {
820 NodeIter {
821 at: 0,
822 nodes: DynBFSGetNodeSortedByDistance(&self.inner),
823 }
824 }
825
826 fn get_num_reachable_nodes(&self) -> u64 {
827 self.inner.getReachableNodes()
828 }
829
830 fn set_source(&mut self, u: u64) {
831 self.inner.pin_mut().setSource(u)
832 }
833
834 fn set_target(&mut self, v: u64) {
835 self.inner.pin_mut().setTarget(v)
836 }
837
838 fn get_sum_of_distances(&self) -> f64 {
839 self.inner.getSumOfDistances()
840 }
841}
842
843impl DynAlgorithm for DynBFS {
844 fn update(&mut self, e: crate::base::GraphEvent) {
845 DynBFSUpdate(self.inner.pin_mut(), e.kind as u8, e.u, e.v, e.ew)
846 }
847
848 fn update_batch(&mut self, es: &[crate::base::GraphEvent]) {
849 let mut kinds = Vec::with_capacity(es.len());
850 let mut us = Vec::with_capacity(es.len());
851 let mut vs = Vec::with_capacity(es.len());
852 let mut ews = Vec::with_capacity(es.len());
853 for ev in es {
854 kinds.push(ev.kind as u8);
855 us.push(ev.u);
856 vs.push(ev.v);
857 ews.push(ev.ew);
858 }
859 DynBFSUpdateBatch(self.inner.pin_mut(), &kinds, &us, &vs, &ews);
860 }
861}
862
863impl DynSSSP for DynBFS {
864 fn modified(&mut self) -> bool {
865 self.inner.pin_mut().modified()
866 }
867
868 fn set_target_node(&mut self, t: u64) {
869 self.inner.pin_mut().setTargetNode(t)
870 }
871}
872
873pub struct Eccentricity;
874
875impl Eccentricity {
876 pub fn get_value(g: &crate::Graph, u: u64) -> (u64, u64) {
877 let mut fartherest = 0;
878 let mut dist = 0;
879 EccentricityGetValue(g, u, &mut fartherest, &mut dist);
880 (fartherest, dist)
881 }
882}
883
884pub struct EffectiveDiameter {
885 inner: UniquePtr<bridge::EffectiveDiameter>,
886}
887
888impl EffectiveDiameter {
889 pub fn new(g: &crate::Graph, ratio: Option<f64>) -> Self {
890 let inner = NewEffectiveDiameter(g, ratio.unwrap_or(0.9));
891 Self { inner }
892 }
893 pub fn get_effective_diameter(&self) -> f64 {
894 self.inner.getEffectiveDiameter()
895 }
896}
897
898impl Algorithm for EffectiveDiameter {
899 fn run(&mut self) -> miette::Result<()> {
900 self.inner.pin_mut().run().into_diagnostic()
901 }
902
903 fn has_finished(&self) -> bool {
904 self.inner.hasFinished()
905 }
906}
907
908pub struct EffectiveDiameterApproximation {
909 inner: UniquePtr<bridge::EffectiveDiameterApproximation>,
910}
911
912impl EffectiveDiameterApproximation {
913 pub fn new(g: &crate::Graph, ratio: Option<f64>, k: Option<u64>, r: Option<u64>) -> Self {
914 let inner = NewEffectiveDiameterApproximation(
915 g,
916 ratio.unwrap_or(0.9),
917 k.unwrap_or(64),
918 r.unwrap_or(7),
919 );
920 Self { inner }
921 }
922 pub fn get_effective_diameter(&self) -> f64 {
923 self.inner.getEffectiveDiameter()
924 }
925}
926
927impl Algorithm for EffectiveDiameterApproximation {
928 fn run(&mut self) -> miette::Result<()> {
929 self.inner.pin_mut().run().into_diagnostic()
930 }
931
932 fn has_finished(&self) -> bool {
933 self.inner.hasFinished()
934 }
935}
936
937pub struct HopPlotApproximation {
938 inner: UniquePtr<bridge::HopPlotApproximation>,
939}
940
941impl HopPlotApproximation {
942 pub fn new(
943 g: &crate::Graph,
944 max_distance: Option<u64>,
945 k: Option<u64>,
946 r: Option<u64>,
947 ) -> Self {
948 let inner = NewHopPlotApproximation(
949 g,
950 max_distance.unwrap_or(0),
951 k.unwrap_or(64),
952 r.unwrap_or(7),
953 );
954 Self { inner }
955 }
956 pub fn get_hop_plot(&self) -> BTreeMap<u64, f64> {
957 let mut ks = vec![];
958 let mut vs = vec![];
959 HopPlotApproximationGetHopPlot(&self.inner, &mut ks, &mut vs);
960 ks.into_iter().zip(vs).collect()
961 }
962}
963
964impl Algorithm for HopPlotApproximation {
965 fn run(&mut self) -> miette::Result<()> {
966 self.inner.pin_mut().run().into_diagnostic()
967 }
968
969 fn has_finished(&self) -> bool {
970 self.inner.hasFinished()
971 }
972}
973
974pub struct JaccardDistance {
975 inner: UniquePtr<bridge::JaccardDistance>,
976 _triangles: UniquePtr<CxxVector<u64>>,
977}
978
979impl JaccardDistance {
980 pub fn new(g: &crate::Graph, triangles: &[u64]) -> Self {
981 let t = MakeCountVector(triangles);
982 let inner = NewJaccardDistance(g, &t);
983 Self {
984 inner,
985 _triangles: t,
986 }
987 }
988}
989
990impl NodeDistance for JaccardDistance {
991 fn preprocess(&mut self) {
992 self.inner.pin_mut().preprocess()
993 }
994
995 fn distance(&mut self, u: u64, v: u64) -> f64 {
996 self.inner.pin_mut().distance(u, v)
997 }
998
999 fn get_edge_scores(&self) -> ValueIter {
1000 ValueIter {
1001 at: 0,
1002 inner: JaccardDistanceGetEdgeScores(&self.inner),
1003 }
1004 }
1005}
1006
1007pub struct MultiTargetBFS {
1008 inner: UniquePtr<bridge::MultiTargetBFS>,
1009}
1010
1011impl MultiTargetBFS {
1012 pub fn new(g: &crate::Graph, src: u64, targets: &[u64]) -> Self {
1013 let inner = NewMultiTargetBFS(g, src, targets);
1014 Self { inner }
1015 }
1016}
1017
1018impl Algorithm for MultiTargetBFS {
1019 fn run(&mut self) -> miette::Result<()> {
1020 self.inner.pin_mut().run().into_diagnostic()
1021 }
1022
1023 fn has_finished(&self) -> bool {
1024 self.inner.hasFinished()
1025 }
1026}
1027
1028impl STSP for MultiTargetBFS {
1029 fn get_path(&self) -> NodeIter {
1030 NodeIter {
1031 at: 0,
1032 nodes: MultiTargetBFSGetPath(&self.inner),
1033 }
1034 }
1035
1036 fn get_predecessors(&self) -> NodeIter {
1037 NodeIter {
1038 at: 0,
1039 nodes: MultiTargetBFSGetPredecessors(&self.inner),
1040 }
1041 }
1042
1043 fn set_source(&mut self, u: u64) {
1044 self.inner.pin_mut().setSource(u)
1045 }
1046
1047 fn set_target(&mut self, v: u64) {
1048 self.inner.pin_mut().setTarget(v)
1049 }
1050
1051 fn set_targets(&mut self, vs: &[u64]) {
1052 MultiTargetBFSSetTargets(self.inner.pin_mut(), vs);
1053 }
1054
1055 fn get_target_index_map(&self) -> BTreeMap<u64, u64> {
1056 let mut ks = vec![];
1057 let mut vs = vec![];
1058 MultiTargetBFSGetTargetIndexMap(&self.inner, &mut ks, &mut vs);
1059 ks.into_iter().zip(vs).collect()
1060 }
1061
1062 fn get_distance(&self) -> f64 {
1063 self.inner.getDistance()
1064 }
1065
1066 fn get_distances(&self) -> ValueIter {
1067 ValueIter {
1068 inner: MultiTargetBFSGetDistances(&self.inner),
1069 at: 0,
1070 }
1071 }
1072}
1073
1074pub struct MultiTargetDijkstra {
1075 inner: UniquePtr<bridge::MultiTargetDijkstra>,
1076}
1077
1078impl MultiTargetDijkstra {
1079 pub fn new(g: &crate::Graph, src: u64, targets: &[u64]) -> Self {
1080 let inner = NewMultiTargetDijkstra(g, src, targets);
1081 Self { inner }
1082 }
1083}
1084
1085impl Algorithm for MultiTargetDijkstra {
1086 fn run(&mut self) -> miette::Result<()> {
1087 self.inner.pin_mut().run().into_diagnostic()
1088 }
1089
1090 fn has_finished(&self) -> bool {
1091 self.inner.hasFinished()
1092 }
1093}
1094
1095impl STSP for MultiTargetDijkstra {
1096 fn get_path(&self) -> NodeIter {
1097 NodeIter {
1098 at: 0,
1099 nodes: MultiTargetDijkstraGetPath(&self.inner),
1100 }
1101 }
1102
1103 fn get_predecessors(&self) -> NodeIter {
1104 NodeIter {
1105 at: 0,
1106 nodes: MultiTargetDijkstraGetPredecessors(&self.inner),
1107 }
1108 }
1109
1110 fn set_source(&mut self, u: u64) {
1111 self.inner.pin_mut().setSource(u)
1112 }
1113
1114 fn set_target(&mut self, v: u64) {
1115 self.inner.pin_mut().setTarget(v)
1116 }
1117
1118 fn set_targets(&mut self, vs: &[u64]) {
1119 MultiTargetDijkstraSetTargets(self.inner.pin_mut(), vs);
1120 }
1121
1122 fn get_target_index_map(&self) -> BTreeMap<u64, u64> {
1123 let mut ks = vec![];
1124 let mut vs = vec![];
1125 MultiTargetDijkstraGetTargetIndexMap(&self.inner, &mut ks, &mut vs);
1126 ks.into_iter().zip(vs).collect()
1127 }
1128
1129 fn get_distance(&self) -> f64 {
1130 self.inner.getDistance()
1131 }
1132
1133 fn get_distances(&self) -> ValueIter {
1134 ValueIter {
1135 inner: MultiTargetDijkstraGetDistances(&self.inner),
1136 at: 0,
1137 }
1138 }
1139}
1140
1141pub struct NeighborhoodFunction {
1142 inner: UniquePtr<bridge::NeighborhoodFunction>,
1143}
1144
1145impl NeighborhoodFunction {
1146 pub fn new(g: &crate::Graph) -> Self {
1147 let inner = NewNeighborhoodFunction(g);
1148 Self { inner }
1149 }
1150 pub fn get_neighbourhood_function(&self) -> NodeIter {
1151 NodeIter {
1152 at: 0,
1153 nodes: NeighborhoodFunctionGetNeighborhoodFunction(&self.inner),
1154 }
1155 }
1156}
1157
1158impl Algorithm for NeighborhoodFunction {
1159 fn run(&mut self) -> miette::Result<()> {
1160 self.inner.pin_mut().run().into_diagnostic()
1161 }
1162
1163 fn has_finished(&self) -> bool {
1164 self.inner.hasFinished()
1165 }
1166}
1167
1168pub struct NeighborhoodFunctionApproximation {
1169 inner: UniquePtr<bridge::NeighborhoodFunctionApproximation>,
1170}
1171
1172impl NeighborhoodFunctionApproximation {
1173 pub fn new(g: &crate::Graph, k: Option<u64>, r: Option<u64>) -> Self {
1174 let inner = NewNeighborhoodFunctionApproximation(g, k.unwrap_or(64), r.unwrap_or(7));
1175 Self { inner }
1176 }
1177 pub fn get_neighbourhood_function(&self) -> NodeIter {
1178 NodeIter {
1179 at: 0,
1180 nodes: NeighborhoodFunctionApproximationGetNeighborhoodFunction(&self.inner),
1181 }
1182 }
1183}
1184
1185impl Algorithm for NeighborhoodFunctionApproximation {
1186 fn run(&mut self) -> miette::Result<()> {
1187 self.inner.pin_mut().run().into_diagnostic()
1188 }
1189
1190 fn has_finished(&self) -> bool {
1191 self.inner.hasFinished()
1192 }
1193}
1194
1195pub struct NeighborhoodFunctionHeuristic {
1196 inner: UniquePtr<bridge::NeighborhoodFunctionHeuristic>,
1197}
1198
1199#[derive(Default, Copy, Clone, Eq, PartialEq)]
1200#[repr(u8)]
1201
1202pub enum NeighborhoodFunctionHeuristicStrategy {
1203 Random = 0,
1204 #[default]
1205 Split = 1,
1206}
1207
1208impl NeighborhoodFunctionHeuristic {
1209 pub fn new(
1210 g: &crate::Graph,
1211 n_samples: Option<u64>,
1212 strategy: NeighborhoodFunctionHeuristicStrategy,
1213 ) -> Self {
1214 let inner = NewNeighborhoodFunctionHeuristic(g, n_samples.unwrap_or(0), strategy as u8);
1215 Self { inner }
1216 }
1217 pub fn get_neighbourhood_function(&self) -> NodeIter {
1218 NodeIter {
1219 at: 0,
1220 nodes: NeighborhoodFunctionHeuristicGetNeighborhoodFunction(&self.inner),
1221 }
1222 }
1223}
1224
1225impl Algorithm for NeighborhoodFunctionHeuristic {
1226 fn run(&mut self) -> miette::Result<()> {
1227 self.inner.pin_mut().run().into_diagnostic()
1228 }
1229
1230 fn has_finished(&self) -> bool {
1231 self.inner.hasFinished()
1232 }
1233}
1234
1235pub struct PrunedLandmarkLabeling {
1236 inner: UniquePtr<bridge::PrunedLandmarkLabeling>,
1237}
1238
1239impl PrunedLandmarkLabeling {
1240 pub fn new(g: &crate::Graph) -> Self {
1241 let inner = NewPrunedLandmarkLabeling(g);
1242 Self { inner }
1243 }
1244 pub fn query(&self, u: u64, v: u64) -> u64 {
1245 self.inner.query(u, v)
1246 }
1247}
1248
1249impl Algorithm for PrunedLandmarkLabeling {
1250 fn run(&mut self) -> miette::Result<()> {
1251 self.inner.pin_mut().run().into_diagnostic()
1252 }
1253
1254 fn has_finished(&self) -> bool {
1255 self.inner.hasFinished()
1256 }
1257}
1258
1259pub struct ReverseBFS {
1260 inner: UniquePtr<bridge::ReverseBFS>,
1261}
1262
1263impl ReverseBFS {
1264 pub fn new(
1265 g: &crate::Graph,
1266 src: u64,
1267 store_paths: bool,
1268 store_nodes_sorted_by_distance: bool,
1269 dst: Option<u64>,
1270 ) -> Self {
1271 Self {
1272 inner: NewReverseBFS(
1273 g,
1274 src,
1275 store_paths,
1276 store_nodes_sorted_by_distance,
1277 dst.unwrap_or(u64::MAX),
1278 ),
1279 }
1280 }
1281}
1282
1283impl Algorithm for ReverseBFS {
1284 fn run(&mut self) -> miette::Result<()> {
1285 self.inner.pin_mut().run().into_diagnostic()
1286 }
1287
1288 fn has_finished(&self) -> bool {
1289 self.inner.hasFinished()
1290 }
1291}
1292
1293impl SSSP for ReverseBFS {
1294 fn distance(&self, t: u64) -> f64 {
1295 self.inner.distance(t)
1296 }
1297
1298 fn get_distances(&mut self) -> ValueIter {
1299 ValueIter {
1300 at: 0,
1301 inner: ReverseBFSGetDistances(self.inner.pin_mut()),
1302 }
1303 }
1304
1305 fn number_of_paths(&self, t: u64) -> f64 {
1306 self.inner._numberOfPaths(t)
1307 }
1308
1309 fn get_predecessors(&self, t: u64) -> NodeIter {
1310 NodeIter {
1311 at: 0,
1312 nodes: ReverseBFSGetPredecessors(&self.inner, t),
1313 }
1314 }
1315
1316 fn get_path(&self, t: u64, forward: bool) -> NodeIter {
1317 NodeIter {
1318 at: 0,
1319 nodes: ReverseBFSGetPath(&self.inner, t, forward),
1320 }
1321 }
1322
1323 fn get_paths(&self, t: u64, forward: bool) -> Vec<Vec<u64>> {
1324 let mut temp = vec![];
1325 ReverseBFSGetPaths(&self.inner, t, forward, &mut temp);
1326 let mut ret = vec![];
1327 let mut cur = vec![];
1328 for n in temp {
1329 if n == u64::MAX {
1330 ret.push(cur);
1331 cur = vec![];
1332 } else {
1333 cur.push(n);
1334 }
1335 }
1336 ret
1337 }
1338
1339 fn get_node_sorted_by_distances(&self) -> NodeIter {
1340 NodeIter {
1341 at: 0,
1342 nodes: ReverseBFSGetNodeSortedByDistance(&self.inner),
1343 }
1344 }
1345
1346 fn get_num_reachable_nodes(&self) -> u64 {
1347 self.inner.getReachableNodes()
1348 }
1349
1350 fn set_source(&mut self, u: u64) {
1351 self.inner.pin_mut().setSource(u)
1352 }
1353
1354 fn set_target(&mut self, v: u64) {
1355 self.inner.pin_mut().setTarget(v)
1356 }
1357
1358 fn get_sum_of_distances(&self) -> f64 {
1359 self.inner.getSumOfDistances()
1360 }
1361}
1362
1363pub struct Volume;
1364
1365impl Volume {
1366 pub fn volume(g: &crate::Graph, radius: f64, n_samples: u64) -> f64 {
1367 VolumeVolume(g, radius, n_samples)
1368 }
1369 pub fn volumes(g: &crate::Graph, radii: &[f64], n_samples: u64) -> ValueIter {
1370 ValueIter {
1371 at: 0,
1372 inner: VolumeVolumes(g, radii, n_samples),
1373 }
1374 }
1375}