@@ -434,6 +434,45 @@ pub fn randomize_coord_rw_directional<R: Rng>(upper_constraints: &Vec<u64>,
434434 cur_coord
435435}
436436
437+ /// Generate a random coordinate using a mix between a random walk
438+ /// coordinate and a random landmark coordinate
439+ pub fn randomize_coord_rw_mix < R : Rng > ( upper_constraints : & Vec < u64 > ,
440+ landmarks : & Vec < usize > , coords : & Vec < Vec < u64 > > ,
441+ mut rng : & mut R ) -> Vec < u64 > {
442+
443+ /*
444+ let mut rw_coord = randomize_coord_rw_directional(upper_constraints,
445+ landmarks, coords, rng);
446+ */
447+
448+ let rlcoord = randomize_coord_landmarks_coords ( landmarks, coords, rng) ;
449+
450+ let mut rw_coord = vec ! [ 0 ; upper_constraints. len( ) ] ;
451+
452+ let entry_range: Range < usize > = Range :: new ( 0 , landmarks. len ( ) ) ;
453+ let diag_range: Range < u64 > = Range :: new ( 0 , 0x1000 ) ;
454+
455+ // Get a random landmark:
456+ let rlandmark_coord1 = coords[ landmarks[ entry_range. ind_sample ( rng) ] ] . clone ( ) ;
457+ let rlandmark_coord2 = coords[ landmarks[ entry_range. ind_sample ( rng) ] ] . clone ( ) ;
458+ let rlandmark_coord3 = coords[ landmarks[ entry_range. ind_sample ( rng) ] ] . clone ( ) ;
459+
460+ let diag_val1 = diag_range. ind_sample ( rng) ;
461+ let diag_val2 = diag_range. ind_sample ( rng) ;
462+ let diag_val3 = diag_range. ind_sample ( rng) ;
463+
464+ // Go to the middle between rw coordinate and landmark coordinate.
465+ for i in 0 .. rw_coord. len ( ) {
466+ rw_coord[ i] = ( 5 * ( rlandmark_coord1[ i] + diag_val1) +
467+ ( rlandmark_coord2[ i] + diag_val2) +
468+ ( rlandmark_coord3[ i] + diag_val3) ) / 7 ;
469+ // rw_coord[i] = (3*rw_coord[i] + rlcoord[i]) / 4
470+ }
471+
472+ rw_coord
473+
474+ }
475+
437476//////////////////////////////////////////
438477
439478/// Slightly change a coordinate (randomly), leaving all entries >= 0
0 commit comments