@@ -61,17 +61,43 @@ pub enum AccumStrategy {
61
61
Dist ,
62
62
}
63
63
64
- // TODO: lazy diam
65
- // TODO: encapsulation
66
64
/// Structure provides an interface for leverages with CASR report clusters
67
65
#[ derive( Clone , Debug ) ]
68
66
pub struct Cluster {
69
67
/// Cluster number
70
68
pub number : usize ,
71
69
/// Cluster report stacktraces
72
- pub stacktraces : Vec < Stacktrace > ,
70
+ stacktraces : Vec < Stacktrace > ,
73
71
/// Cluster diameter
74
- pub diam : f64 ,
72
+ diam : Option < f64 > ,
73
+ }
74
+
75
+ impl Cluster {
76
+ /// Create new `Cluster`
77
+ pub fn new ( number : usize , stacktraces : Vec < Stacktrace > ) -> Self {
78
+ Cluster {
79
+ number,
80
+ stacktraces,
81
+ diam : None ,
82
+ }
83
+ }
84
+ /// Get CASR report stactraces
85
+ pub fn stacktraces ( & self ) -> Vec < Stacktrace > {
86
+ self . stacktraces . clone ( )
87
+ }
88
+ /// Add CASR report stacktrace to cluster
89
+ pub fn push ( & mut self , stacktrace : Stacktrace ) {
90
+ self . stacktraces . push ( stacktrace) ;
91
+ self . diam = None ;
92
+ }
93
+ /// Get cluster diameter
94
+ pub fn diam ( & mut self ) -> f64 {
95
+ if self . diam . is_none ( ) {
96
+ diam ( & self . stacktraces )
97
+ } else {
98
+ self . diam . unwrap ( )
99
+ }
100
+ }
75
101
}
76
102
77
103
/// This macro updates variables used to remove trusted functions from stack trace
@@ -339,7 +365,7 @@ pub fn dedup_crashlines(crashlines: &[String], clusters: &mut [usize]) -> usize
339
365
/// # Return value
340
366
///
341
367
/// Value of diameter
342
- pub fn diam ( stacktraces : & [ Stacktrace ] ) -> f64 {
368
+ fn diam ( stacktraces : & [ Stacktrace ] ) -> f64 {
343
369
let mut diam = 0f64 ;
344
370
let len = stacktraces. len ( ) ;
345
371
for i in 0 ..len {
@@ -370,15 +396,15 @@ pub fn diam(stacktraces: &[Stacktrace]) -> f64 {
370
396
/// `Relation` enum with measure according specified strategy
371
397
pub fn relation (
372
398
new : & Stacktrace ,
373
- cluster : & Cluster ,
399
+ cluster : & mut Cluster ,
374
400
inner_strategy : AccumStrategy ,
375
401
outer_strategy : AccumStrategy ,
376
402
) -> Relation {
377
- let diam = cluster. diam ;
403
+ let diam = cluster. diam ( ) ;
378
404
let mut min = MAX ;
379
405
let mut max = 0f64 ;
380
- for stacktrace in & cluster. stacktraces {
381
- let dist = 1.0 - similarity ( new, stacktrace) ;
406
+ for stacktrace in cluster. stacktraces ( ) {
407
+ let dist = 1.0 - similarity ( new, & stacktrace) ;
382
408
if dist == 0.0 {
383
409
return Relation :: Dup ;
384
410
} else if dist > THRESHOLD {
0 commit comments