1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
extern crate ocl;
extern crate rand;
extern crate num_traits;
extern crate futures;
#[macro_use] extern crate failure;
pub mod sub_buffer_pool;
pub mod command_graph;
pub mod work_pool;
pub mod full_device_info;
pub use self::sub_buffer_pool::SubBufferPool;
pub use self::command_graph::{CommandGraph, Command, CommandDetails, KernelArgBuffer, RwCmdIdxs};
pub use self::work_pool::WorkPool;
use rand::distributions::{IndependentSample, Range as RandRange};
use rand::distributions::range::SampleRange;
use num_traits::FromPrimitive;
use ocl::OclScl;
pub fn scrambled_vec<T: OclScl + SampleRange>(vals: (T, T), size: usize) -> Vec<T> {
assert!(size > 0, "\nbuffer::shuffled_vec(): Vector size must be greater than zero.");
assert!(vals.0 < vals.1, "\nbuffer::shuffled_vec(): Minimum value must be less than maximum.");
let mut rng = rand::weak_rng();
let range = RandRange::new(vals.0, vals.1);
(0..size).map(|_| range.ind_sample(&mut rng)).take(size as usize).collect()
}
pub fn shuffled_vec<T: OclScl>(vals: (T, T), size: usize) -> Vec<T> {
let mut vec: Vec<T> = Vec::with_capacity(size);
assert!(size > 0, "\nbuffer::shuffled_vec(): Vector size must be greater than zero.");
assert!(vals.0 < vals.1, "\nbuffer::shuffled_vec(): Minimum value must be less than maximum.");
let min = vals.0.to_i64().expect("\nbuffer::shuffled_vec(), min");
let max = vals.1.to_i64().expect("\nbuffer::shuffled_vec(), max") + 1;
let mut range = (min..max).cycle();
for _ in 0..size {
vec.push(FromPrimitive::from_i64(range.next().expect("\nbuffer::shuffled_vec(), range"))
.expect("\nbuffer::shuffled_vec(), from_usize"));
}
shuffle(&mut vec);
vec
}
pub fn shuffle<T: OclScl>(vec: &mut [T]) {
let len = vec.len();
let mut rng = rand::weak_rng();
let mut ridx: usize;
let mut tmp: T;
for i in 0..len {
ridx = RandRange::new(i, len).ind_sample(&mut rng);
tmp = vec[i];
vec[i] = vec[ridx];
vec[ridx] = tmp;
}
}