[INFO] crate treez 0.12.0 is already in cache [INFO] extracting crate treez 0.12.0 into work/ex/clippy-test-run/sources/stable/reg/treez/0.12.0 [INFO] extracting crate treez 0.12.0 into work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/treez/0.12.0 [INFO] validating manifest of treez-0.12.0 on toolchain stable [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] validating manifest of treez-0.12.0 on toolchain stable+rustflags=-Dclippy::into_iter_on_array [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "read-manifest" "--manifest-path" "Cargo.toml"` [INFO] started frobbing treez-0.12.0 [INFO] finished frobbing treez-0.12.0 [INFO] frobbed toml for treez-0.12.0 written to work/ex/clippy-test-run/sources/stable/reg/treez/0.12.0/Cargo.toml [INFO] started frobbing treez-0.12.0 [INFO] finished frobbing treez-0.12.0 [INFO] frobbed toml for treez-0.12.0 written to work/ex/clippy-test-run/sources/stable+rustflags=-Dclippy%3A%3Ainto_iter_on_array/reg/treez/0.12.0/Cargo.toml [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "generate-lockfile" "--manifest-path" "Cargo.toml" "-Zno-index-update"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] running `"/mnt/big/crater/work/local/cargo-home/bin/cargo" "+stable" "fetch" "--locked" "--manifest-path" "Cargo.toml"` [INFO] linting treez-0.12.0 against stable for clippy-test-run [INFO] running `"docker" "create" "-v" "/mnt/big/crater/work/local/target-dirs/clippy-test-run/worker-2/stable:/opt/crater/target:rw,Z" "-v" "/mnt/big/crater/work/ex/clippy-test-run/sources/stable/reg/treez/0.12.0:/opt/crater/workdir:ro,Z" "-v" "/mnt/big/crater/work/local/cargo-home:/opt/crater/cargo-home:ro,Z" "-v" "/mnt/big/crater/work/local/rustup-home:/opt/crater/rustup-home:ro,Z" "-e" "USER_ID=1000" "-e" "SOURCE_DIR=/opt/crater/workdir" "-e" "MAP_USER_ID=1000" "-e" "CARGO_TARGET_DIR=/opt/crater/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/crater/cargo-home" "-e" "RUSTUP_HOME=/opt/crater/rustup-home" "-w" "/opt/crater/workdir" "-m" "1536M" "--network" "none" "rustops/crates-build-env" "/opt/crater/cargo-home/bin/cargo" "+stable" "clippy" "--frozen" "--all" "--all-targets"` [INFO] [stdout] 6c99dde46b2885e497eabfe016b5eda538e66158301716c0bf81de0aa9f3dedf [INFO] running `"docker" "start" "-a" "6c99dde46b2885e497eabfe016b5eda538e66158301716c0bf81de0aa9f3dedf"` [INFO] [stderr] Checking mazth v0.0.0 [INFO] [stderr] Checking crossbeam-utils v0.6.5 [INFO] [stderr] Checking crossbeam-epoch v0.5.2 [INFO] [stderr] Checking chrono v0.4.6 [INFO] [stderr] Checking crossbeam-epoch v0.6.1 [INFO] [stderr] Checking crossbeam-deque v0.5.2 [INFO] [stderr] Checking crossbeam-channel v0.2.6 [INFO] [stderr] Checking crossbeam v0.4.1 [INFO] [stderr] Checking treez v0.12.0 (/opt/crater/workdir) [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/seg.rs:169:9 [INFO] [stderr] | [INFO] [stderr] 169 | ret [INFO] [stderr] | ^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/seg.rs:168:19 [INFO] [stderr] | [INFO] [stderr] 168 | let ret = hs.drain().cloned().collect(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/prefix.rs:71:9 [INFO] [stderr] | [INFO] [stderr] 71 | b [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/prefix.rs:69:17 [INFO] [stderr] | [INFO] [stderr] 69 | let b = a & v; [INFO] [stderr] | ^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/seg.rs:169:9 [INFO] [stderr] | [INFO] [stderr] 169 | ret [INFO] [stderr] | ^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/seg.rs:168:19 [INFO] [stderr] | [INFO] [stderr] 168 | let ret = hs.drain().cloned().collect(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> src/prefix.rs:71:9 [INFO] [stderr] | [INFO] [stderr] 71 | b [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> src/prefix.rs:69:17 [INFO] [stderr] | [INFO] [stderr] 69 | let b = a & v; [INFO] [stderr] | ^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/seg.rs:122:19 [INFO] [stderr] | [INFO] [stderr] 122 | while q.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!q.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/seg.rs:152:19 [INFO] [stderr] | [INFO] [stderr] 152 | while q.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!q.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `rb::TreeRb` [INFO] [stderr] --> src/rb.rs:51:5 [INFO] [stderr] | [INFO] [stderr] 51 | / pub fn new() -> TreeRb< K, V > { [INFO] [stderr] 52 | | TreeRb { [INFO] [stderr] 53 | | _root: -1isize, [INFO] [stderr] 54 | | _buf: vec![], [INFO] [stderr] ... | [INFO] [stderr] 62 | | } [INFO] [stderr] 63 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 42 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of left operand [INFO] [stderr] --> src/rb.rs:281:23 [INFO] [stderr] | [INFO] [stderr] 281 | } else if &key < k { [INFO] [stderr] | ----^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: use the left value directly: `key` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::op_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of left operand [INFO] [stderr] --> src/rb.rs:296:23 [INFO] [stderr] | [INFO] [stderr] 296 | } else if &key < k { [INFO] [stderr] | ----^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: use the left value directly: `key` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:335:13 [INFO] [stderr] | [INFO] [stderr] 335 | / match self.get_node(n_p)._colour { [INFO] [stderr] 336 | | Colour::Black => { [INFO] [stderr] 337 | | // println!("break 2"); [INFO] [stderr] 338 | | break; [INFO] [stderr] 339 | | }, [INFO] [stderr] 340 | | _ => (), [INFO] [stderr] 341 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 335 | if let Colour::Black = self.get_node(n_p)._colour { [INFO] [stderr] 336 | // println!("break 2"); [INFO] [stderr] 337 | break; [INFO] [stderr] 338 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:425:13 [INFO] [stderr] | [INFO] [stderr] 425 | / match self.get_node(x)._colour { [INFO] [stderr] 426 | | Colour::Red => { [INFO] [stderr] 427 | | // println!("fixup remove node {} is red, break", x ); [INFO] [stderr] 428 | | break; [INFO] [stderr] 429 | | }, [INFO] [stderr] 430 | | _ => {}, [INFO] [stderr] 431 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 425 | if let Colour::Red = self.get_node(x)._colour { [INFO] [stderr] 426 | // println!("fixup remove node {} is red, break", x ); [INFO] [stderr] 427 | break; [INFO] [stderr] 428 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:438:17 [INFO] [stderr] | [INFO] [stderr] 438 | / match w_colour { [INFO] [stderr] 439 | | Colour::Red => { [INFO] [stderr] 440 | | // println!("fixup remove left case 1, node w: {}", w); [INFO] [stderr] 441 | | //case 1 [INFO] [stderr] ... | [INFO] [stderr] 447 | | _ => {}, [INFO] [stderr] 448 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 438 | if let Colour::Red = w_colour { [INFO] [stderr] 439 | // println!("fixup remove left case 1, node w: {}", w); [INFO] [stderr] 440 | //case 1 [INFO] [stderr] 441 | self.get_node_mut(w)._colour = Colour::Black; [INFO] [stderr] 442 | self.get_node_mut(x_p)._colour = Colour::Red; [INFO] [stderr] 443 | self.rotate_left( x_p ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:463:25 [INFO] [stderr] | [INFO] [stderr] 463 | / match w_right_colour { [INFO] [stderr] 464 | | Colour::Black => { [INFO] [stderr] 465 | | // println!("fixup remove left case 3, node w: {}", w); [INFO] [stderr] 466 | | //case 3 [INFO] [stderr] ... | [INFO] [stderr] 473 | | _ => {}, [INFO] [stderr] 474 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 463 | if let Colour::Black = w_right_colour { [INFO] [stderr] 464 | // println!("fixup remove left case 3, node w: {}", w); [INFO] [stderr] 465 | //case 3 [INFO] [stderr] 466 | self.get_node_mut(w_left)._colour = Colour::Black; [INFO] [stderr] 467 | self.get_node_mut(w)._colour = Colour::Red; [INFO] [stderr] 468 | self.rotate_right( w ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:492:17 [INFO] [stderr] | [INFO] [stderr] 492 | / match w_colour { [INFO] [stderr] 493 | | Colour::Red => { [INFO] [stderr] 494 | | // println!("fixup remove right case 1, node w: {}", w); [INFO] [stderr] 495 | | //case 1 [INFO] [stderr] ... | [INFO] [stderr] 501 | | _ => {}, [INFO] [stderr] 502 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 492 | if let Colour::Red = w_colour { [INFO] [stderr] 493 | // println!("fixup remove right case 1, node w: {}", w); [INFO] [stderr] 494 | //case 1 [INFO] [stderr] 495 | self.get_node_mut(w)._colour = Colour::Black; [INFO] [stderr] 496 | self.get_node_mut(x_p)._colour = Colour::Red; [INFO] [stderr] 497 | self.rotate_right( x_p ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:521:25 [INFO] [stderr] | [INFO] [stderr] 521 | / match w_left_colour { [INFO] [stderr] 522 | | Colour::Black => { [INFO] [stderr] 523 | | //case 3 [INFO] [stderr] 524 | | // println!("fixup remove right case 3, node w: {}", w); [INFO] [stderr] ... | [INFO] [stderr] 531 | | _ => {}, [INFO] [stderr] 532 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 521 | if let Colour::Black = w_left_colour { [INFO] [stderr] 522 | //case 3 [INFO] [stderr] 523 | // println!("fixup remove right case 3, node w: {}", w); [INFO] [stderr] 524 | self.get_node_mut(w_right)._colour = Colour::Black; [INFO] [stderr] 525 | self.get_node_mut(w)._colour = Colour::Red; [INFO] [stderr] 526 | self.rotate_left( w ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rb.rs:782:15 [INFO] [stderr] | [INFO] [stderr] 782 | while v.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rb.rs:797:15 [INFO] [stderr] | [INFO] [stderr] 797 | while v.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:817:17 [INFO] [stderr] | [INFO] [stderr] 817 | / match hm.insert( n, count ) { [INFO] [stderr] 818 | | Some(v) => { assert!( v == count ); break; }, [INFO] [stderr] 819 | | _ => {}, [INFO] [stderr] 820 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Some(v) = hm.insert( n, count ) { assert!( v == count ); break; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:822:17 [INFO] [stderr] | [INFO] [stderr] 822 | / match c { [INFO] [stderr] 823 | | Colour::Black => { count += 1; }, [INFO] [stderr] 824 | | _ => {}, [INFO] [stderr] 825 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Colour::Black = c { count += 1; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:830:13 [INFO] [stderr] | [INFO] [stderr] 830 | / match self._buf[x as usize]._colour { [INFO] [stderr] 831 | | Colour::Red => { panic!("root colour incorrect"); }, [INFO] [stderr] 832 | | _ => {}, [INFO] [stderr] 833 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Colour::Red = self._buf[x as usize]._colour { panic!("root colour incorrect"); }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:99:24 [INFO] [stderr] | [INFO] [stderr] 99 | let index_y = *self._id_map.get(&y).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&y]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:100:24 [INFO] [stderr] | [INFO] [stderr] 100 | let index_x = *self._id_map.get(&x).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&x]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:110:24 [INFO] [stderr] | [INFO] [stderr] 110 | let index_y = *self._id_map.get(&y).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&y]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/autograd.rs:116:13 [INFO] [stderr] | [INFO] [stderr] 116 | let ref mut link = & mut self._buf[..]; [INFO] [stderr] | ----^^^^^^^^^^^^----------------------- help: try: `let link = &mut (& mut self._buf[..]);` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:125:30 [INFO] [stderr] | [INFO] [stderr] 125 | let index_y_order = *self._eval_order_map.get( & index_y ).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._eval_order_map[& index_y]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:127:12 [INFO] [stderr] | [INFO] [stderr] 127 | if self._eval_order.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self._eval_order.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:136:32 [INFO] [stderr] | [INFO] [stderr] 136 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/autograd.rs:147:24 [INFO] [stderr] | [INFO] [stderr] 147 | let v = { link[*i].get_precedent().iter().cloned().collect:: >() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] warning: the variable `index` is used as a loop counter. Consider using `for (index, item) in v.enumerate()` or similar iterators [INFO] [stderr] --> src/autograd.rs:150:22 [INFO] [stderr] | [INFO] [stderr] 150 | for j in v { //for each precedent [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:152:32 [INFO] [stderr] | [INFO] [stderr] 152 | let index_j = *self._id_map.get(&j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:174:83 [INFO] [stderr] | [INFO] [stderr] 174 | let mut l : Vec< usize > = link.iter().enumerate().filter_map( |(_,x)| if x._precedent.len() == 0 { Some(x._id) } else { None } ).collect(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `x._precedent.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:194:28 [INFO] [stderr] | [INFO] [stderr] 194 | let index_i = *self._id_map.get(&i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&i]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:200:15 [INFO] [stderr] | [INFO] [stderr] 200 | while l.len() > 0 || temp.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:200:30 [INFO] [stderr] | [INFO] [stderr] 200 | while l.len() > 0 || temp.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!temp.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:205:32 [INFO] [stderr] | [INFO] [stderr] 205 | let index_i = *self._id_map.get(i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[i]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:216:40 [INFO] [stderr] | [INFO] [stderr] 216 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:248:40 [INFO] [stderr] | [INFO] [stderr] 248 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:255:20 [INFO] [stderr] | [INFO] [stderr] 255 | if ret.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!ret.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:267:36 [INFO] [stderr] | [INFO] [stderr] 267 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/autograd.rs:268:24 [INFO] [stderr] | [INFO] [stderr] 268 | if checked[index_j] == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!checked[index_j]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:611:18 [INFO] [stderr] | [INFO] [stderr] 611 | assert!( input.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `input.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/sarsa_parallel.rs:47:13 [INFO] [stderr] | [INFO] [stderr] 47 | / match self._policy_select_method { [INFO] [stderr] 48 | | PolicySelectMethod::EpsilonGreedy( x ) => { if x < 0. || x > 1.0 { return Err( "search criteria out of range" ) } }, [INFO] [stderr] 49 | | _ => {}, [INFO] [stderr] 50 | | } [INFO] [stderr] | |_____________^ help: try this: `if let PolicySelectMethod::EpsilonGreedy( x ) = self._policy_select_method { if x < 0. || x > 1.0 { return Err( "search criteria out of range" ) } }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/sarsa_parallel.rs:91:39 [INFO] [stderr] | [INFO] [stderr] 91 | -> Result< ( HashMap< ( State, Action ), f64 >, [INFO] [stderr] | _______________________________________^ [INFO] [stderr] 92 | | HashMap< State, Vec< ( Action, f64 ) > >, [INFO] [stderr] 93 | | HashMap< State, f64 >, [INFO] [stderr] 94 | | u64 ), & 'static str > [INFO] [stderr] | |______________________________________________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::type_complexity)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let' [INFO] [stderr] --> src/sarsa_parallel.rs:115:8 [INFO] [stderr] | [INFO] [stderr] 115 | if { let g_arc = g.clone(); [INFO] [stderr] | ________^ [INFO] [stderr] 116 | | let mut g_access = g_arc.lock().unwrap(); [INFO] [stderr] 117 | | !g_access.is_state_terminal( & state_init ) } { [INFO] [stderr] | |______________________________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::block_in_if_condition_stmt)] on by default [INFO] [stderr] = help: try [INFO] [stderr] let res = { let g_arc = g.clone(); [INFO] [stderr] let mut g_access = g_arc.lock().unwrap(); [INFO] [stderr] !g_access.is_state_terminal( & state_init ) }; [INFO] [stderr] if res { [INFO] [stderr] [INFO] [stderr] let mut arr_data = vec![]; [INFO] [stderr] [INFO] [stderr] for _ in 0..num_threads { [INFO] [stderr] [INFO] [stderr] let s : &State = state_init.deref(); [INFO] [stderr] [INFO] [stderr] let g_arc = g.clone(); [INFO] [stderr] let g_access = g_arc.lock().unwrap(); [INFO] [stderr] let g_copy : G = g_access.clone(); [INFO] [stderr] [INFO] [stderr] arr_data.push( ( s.clone(), criteria.clone(), g_copy, g_arc.clone(), policy_values.clone() ) ); [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] loop { [INFO] [stderr] crossbeam::scope( |scope| { [INFO] [stderr] [INFO] [stderr] for (_k, data) in arr_data.iter_mut().enumerate() { [INFO] [stderr] [INFO] [stderr] scope.spawn( move || { [INFO] [stderr] [INFO] [stderr] let mut eligibility_trace : HashMap< (State, Action), f64 > = HashMap::new(); [INFO] [stderr] [INFO] [stderr] // println!("thread {}", _k ); [INFO] [stderr] [INFO] [stderr] //initialization prior to rollout [INFO] [stderr] let s_orig : & mut State = & mut data.0; [INFO] [stderr] let mut s_context : State = s_orig.clone(); [INFO] [stderr] [INFO] [stderr] let cri_context: & SearchCriteria = & mut data.1; [INFO] [stderr] let g_context : & mut G = & mut data.2; [INFO] [stderr] let g_global = & mut data.3; [INFO] [stderr] *g_context = { [INFO] [stderr] let g_global : & G = &g_global.lock().unwrap(); [INFO] [stderr] g_global.clone() [INFO] [stderr] }; [INFO] [stderr] let policy_global : & mut Arc>> = & mut data.4; [INFO] [stderr] [INFO] [stderr] //choose initial action [INFO] [stderr] let mut action : Action = { [INFO] [stderr] let possible_actions = g_context.gen_possible_actions( & s_context ); [INFO] [stderr] [INFO] [stderr] match cri_context._policy_select_method { [INFO] [stderr] PolicySelectMethod::EpsilonGreedy( epsilon ) => { [INFO] [stderr] let action_greedy = policy::get_greedy_action_at_state( & policy_global.lock().unwrap(), & s_context ); [INFO] [stderr] policy::e_greedy_select( epsilon, possible_actions.as_slice(), & action_greedy ) [INFO] [stderr] }, [INFO] [stderr] PolicySelectMethod::Softmax => { [INFO] [stderr] //obtain policy values for currently available actions at current state [INFO] [stderr] let mut vals = softmax::Distr(vec![]); [INFO] [stderr] for (_k,i) in possible_actions.iter().enumerate() { [INFO] [stderr] let val = match policy_global.lock().unwrap().get( &( s_context.clone(), i.clone() ) ) { [INFO] [stderr] Some( x ) => *x, [INFO] [stderr] None => 0., [INFO] [stderr] }; [INFO] [stderr] vals.0.push(val); [INFO] [stderr] } [INFO] [stderr] policy::softmax_select( possible_actions.as_slice(), & vals ) [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] // let mut inner_iter = 0u64; [INFO] [stderr] //perform rollout [INFO] [stderr] loop { [INFO] [stderr] if g_context.is_state_terminal( & s_context ) { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] let ( reward, state_next ) = g_context.do_action( & s_context, & action ); [INFO] [stderr] [INFO] [stderr] //choose action using e-greedy policy selection [INFO] [stderr] let action_next : Action = { [INFO] [stderr] let possible_actions = g_context.gen_possible_actions( & state_next ); [INFO] [stderr] [INFO] [stderr] match cri_context._policy_select_method { [INFO] [stderr] PolicySelectMethod::EpsilonGreedy( epsilon ) => { [INFO] [stderr] let action_greedy = policy::get_greedy_action_at_state( & policy_global.lock().unwrap(), & state_next ); [INFO] [stderr] policy::e_greedy_select( epsilon, possible_actions.as_slice(), & action_greedy ) [INFO] [stderr] }, [INFO] [stderr] PolicySelectMethod::Softmax => { [INFO] [stderr] //obtain policy values for currently available actions at current state [INFO] [stderr] let mut vals = softmax::Distr(vec![]); [INFO] [stderr] for (_k,i) in possible_actions.iter().enumerate() { [INFO] [stderr] let val = match policy_global.lock().unwrap().get( &( state_next.clone(), i.clone() ) ) { [INFO] [stderr] Some( x ) => *x, [INFO] [stderr] None => 0., [INFO] [stderr] }; [INFO] [stderr] vals.0.push(val); [INFO] [stderr] } [INFO] [stderr] policy::softmax_select( possible_actions.as_slice(), & vals ) [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] let td_error = { [INFO] [stderr] [INFO] [stderr] let q_next = { policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] let q = { policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] reward.0 + criteria._gamma * q_next - q [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] //update eligibility trace [INFO] [stderr] { [INFO] [stderr] let eligibility = eligibility_trace.entry( ( s_context.clone(), action.clone() ) ).or_insert( 0. ); [INFO] [stderr] *eligibility = 1.; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] //remove loops and zero out eligibility values for items in loops [INFO] [stderr] let mut loop_detector = HashMap::new(); [INFO] [stderr] let mut items_in_path = HashSet::new(); [INFO] [stderr] let mut items_in_loops = HashSet::new(); [INFO] [stderr] let trace = g_context.get_state_history(); [INFO] [stderr] [INFO] [stderr] for i in 0..trace.len() { [INFO] [stderr] let t = & trace[i]; [INFO] [stderr] let exists = match loop_detector.get( t ) { [INFO] [stderr] None => { false }, [INFO] [stderr] Some(_) => { true }, [INFO] [stderr] }; [INFO] [stderr] if exists { [INFO] [stderr] let index = *loop_detector.get( t ).unwrap(); [INFO] [stderr] for j in index..i { [INFO] [stderr] items_in_path.remove( &j ); [INFO] [stderr] items_in_loops.insert( j ); [INFO] [stderr] } [INFO] [stderr] loop_detector.insert( t.clone(), i ); [INFO] [stderr] items_in_path.insert( i ); [INFO] [stderr] items_in_loops.remove( &i ); [INFO] [stderr] } else { [INFO] [stderr] loop_detector.insert( t.clone(), i ); [INFO] [stderr] items_in_path.insert( i ); [INFO] [stderr] items_in_loops.remove( &i ); [INFO] [stderr] } [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] // for i in items_in_loops.iter() { [INFO] [stderr] // let t = & trace[ *i ]; [INFO] [stderr] // let v = eligibility_trace.get_mut( t ).unwrap(); [INFO] [stderr] // //eligibility trace decay [INFO] [stderr] // *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] // } [INFO] [stderr] [INFO] [stderr] let normalized_policies = normalized_policy_actions( & policy_global.lock().unwrap() ); [INFO] [stderr] [INFO] [stderr] //todo: consider possibly only updating a limited number of policy values close to the current state [INFO] [stderr] for i in items_in_path.iter().take(2) { [INFO] [stderr] let t = & trace[ *i ]; [INFO] [stderr] [INFO] [stderr] //update policy value [INFO] [stderr] let qq = *policy_global.lock().unwrap().get( t ).unwrap_or(& 0.); [INFO] [stderr] [INFO] [stderr] let v = eligibility_trace.get_mut( t ).unwrap(); [INFO] [stderr] [INFO] [stderr] let alpha_adjust = match normalized_policies.get( t ) { [INFO] [stderr] Some(x) => { ( 1. - if x.is_nan() { 0. } else { *x } ) * criteria._alpha }, [INFO] [stderr] None => { criteria._alpha }, [INFO] [stderr] }; [INFO] [stderr] let n = qq + alpha_adjust * td_error * *v / num_threads as f64; [INFO] [stderr] [INFO] [stderr] policy_global.lock().unwrap().insert( ( t.0.clone(), t.1.clone() ), n ); [INFO] [stderr] [INFO] [stderr] //eligibility trace decay [INFO] [stderr] *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] //filter out loops in trace history [INFO] [stderr] let mut sorted_index = items_in_path.iter().cloned().collect:: >(); [INFO] [stderr] sorted_index.sort(); [INFO] [stderr] let history_filtered : Vec< (State, Action) > = sorted_index.iter().map( |x| trace[*x].clone() ).collect(); [INFO] [stderr] g_context.set_state_history( history_filtered.as_slice() ); [INFO] [stderr] [INFO] [stderr] //save state and action [INFO] [stderr] s_context = state_next; [INFO] [stderr] action = action_next; [INFO] [stderr] [INFO] [stderr] //stopping condition check [INFO] [stderr] let t1 = Local::now(); [INFO] [stderr] match criteria._stop_limit { [INFO] [stderr] StopCondition::TimeMicro(t) => { [INFO] [stderr] let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] if t_delta >= t { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] _ => {}, [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] // if inner_iter >= 100 { [INFO] [stderr] // break; [INFO] [stderr] // } [INFO] [stderr] // inner_iter += 1; [INFO] [stderr] // println!("thread: {}, iter: {}", _k, inner_iter ); [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] } ); [INFO] [stderr] } [INFO] [stderr] }); [INFO] [stderr] [INFO] [stderr] //stopping condition check [INFO] [stderr] let t1 = Local::now(); [INFO] [stderr] match criteria._stop_limit { [INFO] [stderr] StopCondition::TimeMicro(t) => { [INFO] [stderr] let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] if t_delta >= t { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] StopCondition::EpisodeIter(n) => { [INFO] [stderr] if iter >= n { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] iter += 1; [INFO] [stderr] // println!("outer iter: {}", iter ); [INFO] [stderr] } [INFO] [stderr] } ... [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#block_in_if_condition_stmt [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:215:48 [INFO] [stderr] | [INFO] [stderr] 215 | let q_next = { policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:216:43 [INFO] [stderr] | [INFO] [stderr] 216 | let q = { policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.)` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `trace` [INFO] [stderr] --> src/sarsa_parallel.rs:232:38 [INFO] [stderr] | [INFO] [stderr] 232 | for i in 0..trace.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 232 | for (i, ) in trace.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/sarsa_parallel.rs:239:50 [INFO] [stderr] | [INFO] [stderr] 239 | let index = *loop_detector.get( t ).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&loop_detector[t]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: casting i32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/sarsa_parallel.rs:276:77 [INFO] [stderr] | [INFO] [stderr] 276 | let n = qq + alpha_adjust * td_error * *v / num_threads as f64; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try: `f64::from(num_threads)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/sarsa_parallel.rs:281:33 [INFO] [stderr] | [INFO] [stderr] 281 | *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `*v *= criteria._gamma * criteria._lambda` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/sarsa_parallel.rs:296:29 [INFO] [stderr] | [INFO] [stderr] 296 | / match criteria._stop_limit { [INFO] [stderr] 297 | | StopCondition::TimeMicro(t) => { [INFO] [stderr] 298 | | let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] 299 | | if t_delta >= t { [INFO] [stderr] ... | [INFO] [stderr] 303 | | _ => {}, [INFO] [stderr] 304 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 296 | if let StopCondition::TimeMicro(t) = criteria._stop_limit { [INFO] [stderr] 297 | let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] 298 | if t_delta >= t { [INFO] [stderr] 299 | break; [INFO] [stderr] 300 | } [INFO] [stderr] 301 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `or_insert` followed by a function call [INFO] [stderr] --> src/sarsa_parallel.rs:365:44 [INFO] [stderr] | [INFO] [stderr] 365 | let v = h.entry( (i.0).0.clone() ).or_insert( vec![] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(|| vec![])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:386:55 [INFO] [stderr] | [INFO] [stderr] 386 | ret.insert( ( i.0.clone(), j.0.clone() ), j.1.clone() ); [INFO] [stderr] | ^^^^^^^^^^^ help: try removing the `clone` call: `j.1` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: use of `or_insert` followed by a function call [INFO] [stderr] --> src/sarsa_parallel.rs:398:44 [INFO] [stderr] | [INFO] [stderr] 398 | let v = h.entry( (i.0).0.clone() ).or_insert( vec![] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(|| vec![])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/policy.rs:41:59 [INFO] [stderr] | [INFO] [stderr] 41 | pub fn get_greedy_action_at_state< State, Action >( hm: & HashMap< (State,Action), f64 >, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::implicit_hasher)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 41 | pub fn get_greedy_action_at_state< State, Action , S: ::std::hash::BuildHasher>( hm: & HashMap<(State,Action), f64, S>, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/policy.rs:46:105 [INFO] [stderr] | [INFO] [stderr] 46 | let v: Vec< ((State, Action), f64) > = hm.iter().filter( |x| (x.0).0 == *s ).map(|x| ( x.0.clone(), x.1.clone() ) ).collect(); [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*x.1` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/policy.rs:61:14 [INFO] [stderr] | [INFO] [stderr] 61 | assert!( cdf.len() > 0 ); [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!cdf.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `cdf` [INFO] [stderr] --> src/policy.rs:68:18 [INFO] [stderr] | [INFO] [stderr] 68 | for i in 0..cdf.len() { [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 68 | for (i, ) in cdf.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/seg.rs:122:19 [INFO] [stderr] | [INFO] [stderr] 122 | while q.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!q.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/seg.rs:152:19 [INFO] [stderr] | [INFO] [stderr] 152 | while q.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!q.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you should consider deriving a `Default` implementation for `rb::TreeRb` [INFO] [stderr] --> src/rb.rs:51:5 [INFO] [stderr] | [INFO] [stderr] 51 | / pub fn new() -> TreeRb< K, V > { [INFO] [stderr] 52 | | TreeRb { [INFO] [stderr] 53 | | _root: -1isize, [INFO] [stderr] 54 | | _buf: vec![], [INFO] [stderr] ... | [INFO] [stderr] 62 | | } [INFO] [stderr] 63 | | } [INFO] [stderr] | |_____^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::new_without_default_derive)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default_derive [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 42 | #[derive(Default)] [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of left operand [INFO] [stderr] --> src/rb.rs:281:23 [INFO] [stderr] | [INFO] [stderr] 281 | } else if &key < k { [INFO] [stderr] | ----^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: use the left value directly: `key` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::op_ref)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] [INFO] [stderr] warning: needlessly taken reference of left operand [INFO] [stderr] --> src/rb.rs:296:23 [INFO] [stderr] | [INFO] [stderr] 296 | } else if &key < k { [INFO] [stderr] | ----^^^^ [INFO] [stderr] | | [INFO] [stderr] | help: use the left value directly: `key` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#op_ref [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:335:13 [INFO] [stderr] | [INFO] [stderr] 335 | / match self.get_node(n_p)._colour { [INFO] [stderr] 336 | | Colour::Black => { [INFO] [stderr] 337 | | // println!("break 2"); [INFO] [stderr] 338 | | break; [INFO] [stderr] 339 | | }, [INFO] [stderr] 340 | | _ => (), [INFO] [stderr] 341 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 335 | if let Colour::Black = self.get_node(n_p)._colour { [INFO] [stderr] 336 | // println!("break 2"); [INFO] [stderr] 337 | break; [INFO] [stderr] 338 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:425:13 [INFO] [stderr] | [INFO] [stderr] 425 | / match self.get_node(x)._colour { [INFO] [stderr] 426 | | Colour::Red => { [INFO] [stderr] 427 | | // println!("fixup remove node {} is red, break", x ); [INFO] [stderr] 428 | | break; [INFO] [stderr] 429 | | }, [INFO] [stderr] 430 | | _ => {}, [INFO] [stderr] 431 | | } [INFO] [stderr] | |_____________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 425 | if let Colour::Red = self.get_node(x)._colour { [INFO] [stderr] 426 | // println!("fixup remove node {} is red, break", x ); [INFO] [stderr] 427 | break; [INFO] [stderr] 428 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:438:17 [INFO] [stderr] | [INFO] [stderr] 438 | / match w_colour { [INFO] [stderr] 439 | | Colour::Red => { [INFO] [stderr] 440 | | // println!("fixup remove left case 1, node w: {}", w); [INFO] [stderr] 441 | | //case 1 [INFO] [stderr] ... | [INFO] [stderr] 447 | | _ => {}, [INFO] [stderr] 448 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 438 | if let Colour::Red = w_colour { [INFO] [stderr] 439 | // println!("fixup remove left case 1, node w: {}", w); [INFO] [stderr] 440 | //case 1 [INFO] [stderr] 441 | self.get_node_mut(w)._colour = Colour::Black; [INFO] [stderr] 442 | self.get_node_mut(x_p)._colour = Colour::Red; [INFO] [stderr] 443 | self.rotate_left( x_p ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:463:25 [INFO] [stderr] | [INFO] [stderr] 463 | / match w_right_colour { [INFO] [stderr] 464 | | Colour::Black => { [INFO] [stderr] 465 | | // println!("fixup remove left case 3, node w: {}", w); [INFO] [stderr] 466 | | //case 3 [INFO] [stderr] ... | [INFO] [stderr] 473 | | _ => {}, [INFO] [stderr] 474 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 463 | if let Colour::Black = w_right_colour { [INFO] [stderr] 464 | // println!("fixup remove left case 3, node w: {}", w); [INFO] [stderr] 465 | //case 3 [INFO] [stderr] 466 | self.get_node_mut(w_left)._colour = Colour::Black; [INFO] [stderr] 467 | self.get_node_mut(w)._colour = Colour::Red; [INFO] [stderr] 468 | self.rotate_right( w ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:492:17 [INFO] [stderr] | [INFO] [stderr] 492 | / match w_colour { [INFO] [stderr] 493 | | Colour::Red => { [INFO] [stderr] 494 | | // println!("fixup remove right case 1, node w: {}", w); [INFO] [stderr] 495 | | //case 1 [INFO] [stderr] ... | [INFO] [stderr] 501 | | _ => {}, [INFO] [stderr] 502 | | } [INFO] [stderr] | |_________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 492 | if let Colour::Red = w_colour { [INFO] [stderr] 493 | // println!("fixup remove right case 1, node w: {}", w); [INFO] [stderr] 494 | //case 1 [INFO] [stderr] 495 | self.get_node_mut(w)._colour = Colour::Black; [INFO] [stderr] 496 | self.get_node_mut(x_p)._colour = Colour::Red; [INFO] [stderr] 497 | self.rotate_right( x_p ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:521:25 [INFO] [stderr] | [INFO] [stderr] 521 | / match w_left_colour { [INFO] [stderr] 522 | | Colour::Black => { [INFO] [stderr] 523 | | //case 3 [INFO] [stderr] 524 | | // println!("fixup remove right case 3, node w: {}", w); [INFO] [stderr] ... | [INFO] [stderr] 531 | | _ => {}, [INFO] [stderr] 532 | | } [INFO] [stderr] | |_________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 521 | if let Colour::Black = w_left_colour { [INFO] [stderr] 522 | //case 3 [INFO] [stderr] 523 | // println!("fixup remove right case 3, node w: {}", w); [INFO] [stderr] 524 | self.get_node_mut(w_right)._colour = Colour::Black; [INFO] [stderr] 525 | self.get_node_mut(w)._colour = Colour::Red; [INFO] [stderr] 526 | self.rotate_left( w ); [INFO] [stderr] ... [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rb.rs:782:15 [INFO] [stderr] | [INFO] [stderr] 782 | while v.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/rb.rs:797:15 [INFO] [stderr] | [INFO] [stderr] 797 | while v.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!v.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:817:17 [INFO] [stderr] | [INFO] [stderr] 817 | / match hm.insert( n, count ) { [INFO] [stderr] 818 | | Some(v) => { assert!( v == count ); break; }, [INFO] [stderr] 819 | | _ => {}, [INFO] [stderr] 820 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Some(v) = hm.insert( n, count ) { assert!( v == count ); break; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:822:17 [INFO] [stderr] | [INFO] [stderr] 822 | / match c { [INFO] [stderr] 823 | | Colour::Black => { count += 1; }, [INFO] [stderr] 824 | | _ => {}, [INFO] [stderr] 825 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Colour::Black = c { count += 1; }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/rb.rs:830:13 [INFO] [stderr] | [INFO] [stderr] 830 | / match self._buf[x as usize]._colour { [INFO] [stderr] 831 | | Colour::Red => { panic!("root colour incorrect"); }, [INFO] [stderr] 832 | | _ => {}, [INFO] [stderr] 833 | | } [INFO] [stderr] | |_____________^ help: try this: `if let Colour::Red = self._buf[x as usize]._colour { panic!("root colour incorrect"); }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:99:24 [INFO] [stderr] | [INFO] [stderr] 99 | let index_y = *self._id_map.get(&y).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&y]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:100:24 [INFO] [stderr] | [INFO] [stderr] 100 | let index_x = *self._id_map.get(&x).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&x]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:110:24 [INFO] [stderr] | [INFO] [stderr] 110 | let index_y = *self._id_map.get(&y).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&y]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: `ref` on an entire `let` pattern is discouraged, take a reference with `&` instead [INFO] [stderr] --> src/autograd.rs:116:13 [INFO] [stderr] | [INFO] [stderr] 116 | let ref mut link = & mut self._buf[..]; [INFO] [stderr] | ----^^^^^^^^^^^^----------------------- help: try: `let link = &mut (& mut self._buf[..]);` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::toplevel_ref_arg)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#toplevel_ref_arg [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:125:30 [INFO] [stderr] | [INFO] [stderr] 125 | let index_y_order = *self._eval_order_map.get( & index_y ).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._eval_order_map[& index_y]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:127:12 [INFO] [stderr] | [INFO] [stderr] 127 | if self._eval_order.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!self._eval_order.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:136:32 [INFO] [stderr] | [INFO] [stderr] 136 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `cloned().collect()` on a slice to create a `Vec`. Calling `to_vec()` is both faster and more readable [INFO] [stderr] --> src/autograd.rs:147:24 [INFO] [stderr] | [INFO] [stderr] 147 | let v = { link[*i].get_precedent().iter().cloned().collect:: >() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::iter_cloned_collect)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#iter_cloned_collect [INFO] [stderr] [INFO] [stderr] warning: the variable `index` is used as a loop counter. Consider using `for (index, item) in v.enumerate()` or similar iterators [INFO] [stderr] --> src/autograd.rs:150:22 [INFO] [stderr] | [INFO] [stderr] 150 | for j in v { //for each precedent [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:152:32 [INFO] [stderr] | [INFO] [stderr] 152 | let index_j = *self._id_map.get(&j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:174:83 [INFO] [stderr] | [INFO] [stderr] 174 | let mut l : Vec< usize > = link.iter().enumerate().filter_map( |(_,x)| if x._precedent.len() == 0 { Some(x._id) } else { None } ).collect(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `x._precedent.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:194:28 [INFO] [stderr] | [INFO] [stderr] 194 | let index_i = *self._id_map.get(&i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[&i]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:200:15 [INFO] [stderr] | [INFO] [stderr] 200 | while l.len() > 0 || temp.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!l.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:200:30 [INFO] [stderr] | [INFO] [stderr] 200 | while l.len() > 0 || temp.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!temp.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:205:32 [INFO] [stderr] | [INFO] [stderr] 205 | let index_i = *self._id_map.get(i).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[i]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:216:40 [INFO] [stderr] | [INFO] [stderr] 216 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:248:40 [INFO] [stderr] | [INFO] [stderr] 248 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:255:20 [INFO] [stderr] | [INFO] [stderr] 255 | if ret.len() > 0 { [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!ret.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/autograd.rs:267:36 [INFO] [stderr] | [INFO] [stderr] 267 | let index_j = *self._id_map.get(j).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&self._id_map[j]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: equality checks against false can be replaced by a negation [INFO] [stderr] --> src/autograd.rs:268:24 [INFO] [stderr] | [INFO] [stderr] 268 | if checked[index_j] == false { [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try simplifying it as shown: `!checked[index_j]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/autograd.rs:611:18 [INFO] [stderr] | [INFO] [stderr] 611 | assert!( input.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `input.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/sarsa_parallel.rs:47:13 [INFO] [stderr] | [INFO] [stderr] 47 | / match self._policy_select_method { [INFO] [stderr] 48 | | PolicySelectMethod::EpsilonGreedy( x ) => { if x < 0. || x > 1.0 { return Err( "search criteria out of range" ) } }, [INFO] [stderr] 49 | | _ => {}, [INFO] [stderr] 50 | | } [INFO] [stderr] | |_____________^ help: try this: `if let PolicySelectMethod::EpsilonGreedy( x ) = self._policy_select_method { if x < 0. || x > 1.0 { return Err( "search criteria out of range" ) } }` [INFO] [stderr] warning: using `print!()` with a format string that ends in a single newline, consider using `println!()` instead [INFO] [stderr] --> tests/test_sarsa.rs:183:9 [INFO] [stderr] | [INFO] [stderr] 183 | print!( "\n" ); [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::print_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#print_with_newline [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: very complex type used. Consider factoring parts into `type` definitions [INFO] [stderr] --> src/sarsa_parallel.rs:91:39 [INFO] [stderr] | [INFO] [stderr] 91 | -> Result< ( HashMap< ( State, Action ), f64 >, [INFO] [stderr] | _______________________________________^ [INFO] [stderr] 92 | | HashMap< State, Vec< ( Action, f64 ) > >, [INFO] [stderr] 93 | | HashMap< State, f64 >, [INFO] [stderr] 94 | | u64 ), & 'static str > [INFO] [stderr] | |______________________________________________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::type_complexity)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity [INFO] [stderr] [INFO] [stderr] warning: in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let' [INFO] [stderr] --> src/sarsa_parallel.rs:115:8 [INFO] [stderr] | [INFO] [stderr] 115 | if { let g_arc = g.clone(); [INFO] [stderr] | ________^ [INFO] [stderr] 116 | | let mut g_access = g_arc.lock().unwrap(); [INFO] [stderr] 117 | | !g_access.is_state_terminal( & state_init ) } { [INFO] [stderr] | |______________________________________________________^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::block_in_if_condition_stmt)] on by default [INFO] [stderr] = help: try [INFO] [stderr] let res = { let g_arc = g.clone(); [INFO] [stderr] let mut g_access = g_arc.lock().unwrap(); [INFO] [stderr] !g_access.is_state_terminal( & state_init ) }; [INFO] [stderr] if res { [INFO] [stderr] [INFO] [stderr] let mut arr_data = vec![]; [INFO] [stderr] [INFO] [stderr] for _ in 0..num_threads { [INFO] [stderr] [INFO] [stderr] let s : &State = state_init.deref(); [INFO] [stderr] [INFO] [stderr] let g_arc = g.clone(); [INFO] [stderr] let g_access = g_arc.lock().unwrap(); [INFO] [stderr] let g_copy : G = g_access.clone(); [INFO] [stderr] [INFO] [stderr] arr_data.push( ( s.clone(), criteria.clone(), g_copy, g_arc.clone(), policy_values.clone() ) ); [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] loop { [INFO] [stderr] crossbeam::scope( |scope| { [INFO] [stderr] [INFO] [stderr] for (_k, data) in arr_data.iter_mut().enumerate() { [INFO] [stderr] [INFO] [stderr] scope.spawn( move || { [INFO] [stderr] [INFO] [stderr] let mut eligibility_trace : HashMap< (State, Action), f64 > = HashMap::new(); [INFO] [stderr] [INFO] [stderr] // println!("thread {}", _k ); [INFO] [stderr] [INFO] [stderr] //initialization prior to rollout [INFO] [stderr] let s_orig : & mut State = & mut data.0; [INFO] [stderr] let mut s_context : State = s_orig.clone(); [INFO] [stderr] [INFO] [stderr] let cri_context: & SearchCriteria = & mut data.1; [INFO] [stderr] let g_context : & mut G = & mut data.2; [INFO] [stderr] let g_global = & mut data.3; [INFO] [stderr] *g_context = { [INFO] [stderr] let g_global : & G = &g_global.lock().unwrap(); [INFO] [stderr] g_global.clone() [INFO] [stderr] }; [INFO] [stderr] let policy_global : & mut Arc>> = & mut data.4; [INFO] [stderr] [INFO] [stderr] //choose initial action [INFO] [stderr] let mut action : Action = { [INFO] [stderr] let possible_actions = g_context.gen_possible_actions( & s_context ); [INFO] [stderr] [INFO] [stderr] match cri_context._policy_select_method { [INFO] [stderr] PolicySelectMethod::EpsilonGreedy( epsilon ) => { [INFO] [stderr] let action_greedy = policy::get_greedy_action_at_state( & policy_global.lock().unwrap(), & s_context ); [INFO] [stderr] policy::e_greedy_select( epsilon, possible_actions.as_slice(), & action_greedy ) [INFO] [stderr] }, [INFO] [stderr] PolicySelectMethod::Softmax => { [INFO] [stderr] //obtain policy values for currently available actions at current state [INFO] [stderr] let mut vals = softmax::Distr(vec![]); [INFO] [stderr] for (_k,i) in possible_actions.iter().enumerate() { [INFO] [stderr] let val = match policy_global.lock().unwrap().get( &( s_context.clone(), i.clone() ) ) { [INFO] [stderr] Some( x ) => *x, [INFO] [stderr] None => 0., [INFO] [stderr] }; [INFO] [stderr] vals.0.push(val); [INFO] [stderr] } [INFO] [stderr] policy::softmax_select( possible_actions.as_slice(), & vals ) [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] // let mut inner_iter = 0u64; [INFO] [stderr] //perform rollout [INFO] [stderr] loop { [INFO] [stderr] if g_context.is_state_terminal( & s_context ) { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] let ( reward, state_next ) = g_context.do_action( & s_context, & action ); [INFO] [stderr] [INFO] [stderr] //choose action using e-greedy policy selection [INFO] [stderr] let action_next : Action = { [INFO] [stderr] let possible_actions = g_context.gen_possible_actions( & state_next ); [INFO] [stderr] [INFO] [stderr] match cri_context._policy_select_method { [INFO] [stderr] PolicySelectMethod::EpsilonGreedy( epsilon ) => { [INFO] [stderr] let action_greedy = policy::get_greedy_action_at_state( & policy_global.lock().unwrap(), & state_next ); [INFO] [stderr] policy::e_greedy_select( epsilon, possible_actions.as_slice(), & action_greedy ) [INFO] [stderr] }, [INFO] [stderr] PolicySelectMethod::Softmax => { [INFO] [stderr] //obtain policy values for currently available actions at current state [INFO] [stderr] let mut vals = softmax::Distr(vec![]); [INFO] [stderr] for (_k,i) in possible_actions.iter().enumerate() { [INFO] [stderr] let val = match policy_global.lock().unwrap().get( &( state_next.clone(), i.clone() ) ) { [INFO] [stderr] Some( x ) => *x, [INFO] [stderr] None => 0., [INFO] [stderr] }; [INFO] [stderr] vals.0.push(val); [INFO] [stderr] } [INFO] [stderr] policy::softmax_select( possible_actions.as_slice(), & vals ) [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] let td_error = { [INFO] [stderr] [INFO] [stderr] let q_next = { policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] let q = { policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] reward.0 + criteria._gamma * q_next - q [INFO] [stderr] }; [INFO] [stderr] [INFO] [stderr] //update eligibility trace [INFO] [stderr] { [INFO] [stderr] let eligibility = eligibility_trace.entry( ( s_context.clone(), action.clone() ) ).or_insert( 0. ); [INFO] [stderr] *eligibility = 1.; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] //remove loops and zero out eligibility values for items in loops [INFO] [stderr] let mut loop_detector = HashMap::new(); [INFO] [stderr] let mut items_in_path = HashSet::new(); [INFO] [stderr] let mut items_in_loops = HashSet::new(); [INFO] [stderr] let trace = g_context.get_state_history(); [INFO] [stderr] [INFO] [stderr] for i in 0..trace.len() { [INFO] [stderr] let t = & trace[i]; [INFO] [stderr] let exists = match loop_detector.get( t ) { [INFO] [stderr] None => { false }, [INFO] [stderr] Some(_) => { true }, [INFO] [stderr] }; [INFO] [stderr] if exists { [INFO] [stderr] let index = *loop_detector.get( t ).unwrap(); [INFO] [stderr] for j in index..i { [INFO] [stderr] items_in_path.remove( &j ); [INFO] [stderr] items_in_loops.insert( j ); [INFO] [stderr] } [INFO] [stderr] loop_detector.insert( t.clone(), i ); [INFO] [stderr] items_in_path.insert( i ); [INFO] [stderr] items_in_loops.remove( &i ); [INFO] [stderr] } else { [INFO] [stderr] loop_detector.insert( t.clone(), i ); [INFO] [stderr] items_in_path.insert( i ); [INFO] [stderr] items_in_loops.remove( &i ); [INFO] [stderr] } [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] // for i in items_in_loops.iter() { [INFO] [stderr] // let t = & trace[ *i ]; [INFO] [stderr] // let v = eligibility_trace.get_mut( t ).unwrap(); [INFO] [stderr] // //eligibility trace decay [INFO] [stderr] // *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] // } [INFO] [stderr] [INFO] [stderr] let normalized_policies = normalized_policy_actions( & policy_global.lock().unwrap() ); [INFO] [stderr] [INFO] [stderr] //todo: consider possibly only updating a limited number of policy values close to the current state [INFO] [stderr] for i in items_in_path.iter().take(2) { [INFO] [stderr] let t = & trace[ *i ]; [INFO] [stderr] [INFO] [stderr] //update policy value [INFO] [stderr] let qq = *policy_global.lock().unwrap().get( t ).unwrap_or(& 0.); [INFO] [stderr] [INFO] [stderr] let v = eligibility_trace.get_mut( t ).unwrap(); [INFO] [stderr] [INFO] [stderr] let alpha_adjust = match normalized_policies.get( t ) { [INFO] [stderr] Some(x) => { ( 1. - if x.is_nan() { 0. } else { *x } ) * criteria._alpha }, [INFO] [stderr] None => { criteria._alpha }, [INFO] [stderr] }; [INFO] [stderr] let n = qq + alpha_adjust * td_error * *v / num_threads as f64; [INFO] [stderr] [INFO] [stderr] policy_global.lock().unwrap().insert( ( t.0.clone(), t.1.clone() ), n ); [INFO] [stderr] [INFO] [stderr] //eligibility trace decay [INFO] [stderr] *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] //filter out loops in trace history [INFO] [stderr] let mut sorted_index = items_in_path.iter().cloned().collect:: >(); [INFO] [stderr] sorted_index.sort(); [INFO] [stderr] let history_filtered : Vec< (State, Action) > = sorted_index.iter().map( |x| trace[*x].clone() ).collect(); [INFO] [stderr] g_context.set_state_history( history_filtered.as_slice() ); [INFO] [stderr] [INFO] [stderr] //save state and action [INFO] [stderr] s_context = state_next; [INFO] [stderr] action = action_next; [INFO] [stderr] [INFO] [stderr] //stopping condition check [INFO] [stderr] let t1 = Local::now(); [INFO] [stderr] match criteria._stop_limit { [INFO] [stderr] StopCondition::TimeMicro(t) => { [INFO] [stderr] let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] if t_delta >= t { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] _ => {}, [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] // if inner_iter >= 100 { [INFO] [stderr] // break; [INFO] [stderr] // } [INFO] [stderr] // inner_iter += 1; [INFO] [stderr] // println!("thread: {}, iter: {}", _k, inner_iter ); [INFO] [stderr] } [INFO] [stderr] [INFO] [stderr] } ); [INFO] [stderr] } [INFO] [stderr] }); [INFO] [stderr] [INFO] [stderr] //stopping condition check [INFO] [stderr] let t1 = Local::now(); [INFO] [stderr] match criteria._stop_limit { [INFO] [stderr] StopCondition::TimeMicro(t) => { [INFO] [stderr] let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] if t_delta >= t { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] StopCondition::EpisodeIter(n) => { [INFO] [stderr] if iter >= n { [INFO] [stderr] break; [INFO] [stderr] } [INFO] [stderr] }, [INFO] [stderr] } [INFO] [stderr] iter += 1; [INFO] [stderr] // println!("outer iter: {}", iter ); [INFO] [stderr] } [INFO] [stderr] } ... [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#block_in_if_condition_stmt [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:215:48 [INFO] [stderr] | [INFO] [stderr] 215 | let q_next = { policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*policy_global.lock().unwrap().get( &( state_next.clone(), action_next.clone() ) ).unwrap_or(&0.)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::clone_on_copy)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:216:43 [INFO] [stderr] | [INFO] [stderr] 216 | let q = { policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.).clone() }; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try dereferencing it: `*policy_global.lock().unwrap().get( &( s_context.clone(), action.clone() ) ).unwrap_or(&0.)` [INFO] [stderr] warning: using `print!()` with a format string that ends in a single newline, consider using `println!()` instead [INFO] [stderr] --> tests/test_sarsa.rs:183:9 [INFO] [stderr] | [INFO] [stderr] 183 | print!( "\n" ); [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::print_with_newline)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#print_with_newline [INFO] [stderr] [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `trace` [INFO] [stderr] --> src/sarsa_parallel.rs:232:38 [INFO] [stderr] | [INFO] [stderr] 232 | for i in 0..trace.len() { [INFO] [stderr] | ^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 232 | for (i, ) in trace.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> src/sarsa_parallel.rs:239:50 [INFO] [stderr] | [INFO] [stderr] 239 | let index = *loop_detector.get( t ).unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&loop_detector[t]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: casting i32 to f64 may become silently lossy if types change [INFO] [stderr] --> src/sarsa_parallel.rs:276:77 [INFO] [stderr] | [INFO] [stderr] 276 | let n = qq + alpha_adjust * td_error * *v / num_threads as f64; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^ help: try: `f64::from(num_threads)` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::cast_lossless)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#cast_lossless [INFO] [stderr] [INFO] [stderr] warning: manual implementation of an assign operation [INFO] [stderr] --> src/sarsa_parallel.rs:281:33 [INFO] [stderr] | [INFO] [stderr] 281 | *v = criteria._gamma * criteria._lambda * *v; [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `*v *= criteria._gamma * criteria._lambda` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::assign_op_pattern)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> src/sarsa_parallel.rs:296:29 [INFO] [stderr] | [INFO] [stderr] 296 | / match criteria._stop_limit { [INFO] [stderr] 297 | | StopCondition::TimeMicro(t) => { [INFO] [stderr] 298 | | let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] 299 | | if t_delta >= t { [INFO] [stderr] ... | [INFO] [stderr] 303 | | _ => {}, [INFO] [stderr] 304 | | } [INFO] [stderr] | |_____________________________^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] help: try this [INFO] [stderr] | [INFO] [stderr] 296 | if let StopCondition::TimeMicro(t) = criteria._stop_limit { [INFO] [stderr] 297 | let t_delta = t1.signed_duration_since(t0).num_microseconds().unwrap() as f64; [INFO] [stderr] 298 | if t_delta >= t { [INFO] [stderr] 299 | break; [INFO] [stderr] 300 | } [INFO] [stderr] 301 | } [INFO] [stderr] | [INFO] [stderr] [INFO] [stderr] warning: use of `or_insert` followed by a function call [INFO] [stderr] --> src/sarsa_parallel.rs:365:44 [INFO] [stderr] | [INFO] [stderr] 365 | let v = h.entry( (i.0).0.clone() ).or_insert( vec![] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(|| vec![])` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::or_fun_call)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/sarsa_parallel.rs:386:55 [INFO] [stderr] | [INFO] [stderr] 386 | ret.insert( ( i.0.clone(), j.0.clone() ), j.1.clone() ); [INFO] [stderr] | ^^^^^^^^^^^ help: try removing the `clone` call: `j.1` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: use of `or_insert` followed by a function call [INFO] [stderr] --> src/sarsa_parallel.rs:398:44 [INFO] [stderr] | [INFO] [stderr] 398 | let v = h.entry( (i.0).0.clone() ).or_insert( vec![] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(|| vec![])` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#or_fun_call [INFO] [stderr] [INFO] [stderr] warning: parameter of type `HashMap` should be generalized over different hashers [INFO] [stderr] --> src/policy.rs:41:59 [INFO] [stderr] | [INFO] [stderr] 41 | pub fn get_greedy_action_at_state< State, Action >( hm: & HashMap< (State,Action), f64 >, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::implicit_hasher)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#implicit_hasher [INFO] [stderr] help: consider adding a type parameter [INFO] [stderr] | [INFO] [stderr] 41 | pub fn get_greedy_action_at_state< State, Action , S: ::std::hash::BuildHasher>( hm: & HashMap<(State,Action), f64, S>, [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: using `clone` on a `Copy` type [INFO] [stderr] --> src/policy.rs:46:105 [INFO] [stderr] | [INFO] [stderr] 46 | let v: Vec< ((State, Action), f64) > = hm.iter().filter( |x| (x.0).0 == *s ).map(|x| ( x.0.clone(), x.1.clone() ) ).collect(); [INFO] [stderr] | ^^^^^^^^^^^ help: try dereferencing it: `*x.1` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#clone_on_copy [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> src/policy.rs:61:14 [INFO] [stderr] | [INFO] [stderr] 61 | assert!( cdf.len() > 0 ); [INFO] [stderr] | ^^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `!cdf.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `cdf` [INFO] [stderr] --> src/policy.rs:68:18 [INFO] [stderr] | [INFO] [stderr] 68 | for i in 0..cdf.len() { [INFO] [stderr] | ^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 68 | for (i, ) in cdf.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> tests/test_sarsa.rs:31:9 [INFO] [stderr] | [INFO] [stderr] 31 | s [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> tests/test_sarsa.rs:30:17 [INFO] [stderr] | [INFO] [stderr] 30 | let s = State( self._start.0, self._start.1 ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> tests/test_sarsa.rs:62:133 [INFO] [stderr] | [INFO] [stderr] 62 | let v : Vec< Action > = actions.iter().zip( &[ Action::RIGHT, Action::LEFT, Action::UP, Action::DOWN ] ).filter_map( |x| if *x.0 == true { Some( x.1.clone() ) } else { None } ).collect(); [INFO] [stderr] | ^^^^^^^^^^^^ help: try simplifying it as shown: `*x.0` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:255:31 [INFO] [stderr] | [INFO] [stderr] 255 | let bounds = Range::new( -1000000, 1000000 ); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:255:40 [INFO] [stderr] | [INFO] [stderr] 255 | let bounds = Range::new( -1000000, 1000000 ); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:256:37 [INFO] [stderr] | [INFO] [stderr] 256 | let mut nums : Vec = (0..1000000).enumerate().map( |(_,_)| bounds.ind_sample( & mut rng ) ).collect(); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:288:135 [INFO] [stderr] | [INFO] [stderr] 288 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:289:135 [INFO] [stderr] | [INFO] [stderr] 289 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:319:135 [INFO] [stderr] | [INFO] [stderr] 319 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:320:135 [INFO] [stderr] | [INFO] [stderr] 320 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:350:135 [INFO] [stderr] | [INFO] [stderr] 350 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:351:135 [INFO] [stderr] | [INFO] [stderr] 351 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> tests/test_rb.rs:58:9 [INFO] [stderr] | [INFO] [stderr] 58 | / match t.get( i ) { [INFO] [stderr] 59 | | Some(_) => { panic!( "get() unsuccessfil" ); }, [INFO] [stderr] 60 | | None => (), [INFO] [stderr] 61 | | } [INFO] [stderr] | |_________^ help: try this: `if let Some(_) = t.get( i ) { panic!( "get() unsuccessfil" ); }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:67:14 [INFO] [stderr] | [INFO] [stderr] 67 | assert!( t.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:83:14 [INFO] [stderr] | [INFO] [stderr] 83 | assert!( t.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 8..9.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:113:14 [INFO] [stderr] | [INFO] [stderr] 113 | for i in 8..9 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 4..5.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:134:14 [INFO] [stderr] | [INFO] [stderr] 134 | for i in 4..5 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 7..8.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:155:14 [INFO] [stderr] | [INFO] [stderr] 155 | for i in 7..8 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 1..2.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:176:14 [INFO] [stderr] | [INFO] [stderr] 176 | for i in 1..2 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 5..6.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:197:14 [INFO] [stderr] | [INFO] [stderr] 197 | for i in 5..6 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> tests/test_rb.rs:242:17 [INFO] [stderr] | [INFO] [stderr] 242 | / match t.remove( &r ) { [INFO] [stderr] 243 | | Some( _v ) => { panic!( "remove unsuccessful" ); }, [INFO] [stderr] 244 | | _ => {}, [INFO] [stderr] 245 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Some( _v ) = t.remove( &r ) { panic!( "remove unsuccessful" ); }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:268:18 [INFO] [stderr] | [INFO] [stderr] 268 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 268 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:275:18 [INFO] [stderr] | [INFO] [stderr] 275 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 275 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:283:17 [INFO] [stderr] | [INFO] [stderr] 283 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:299:18 [INFO] [stderr] | [INFO] [stderr] 299 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 299 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:306:18 [INFO] [stderr] | [INFO] [stderr] 306 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 306 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:314:17 [INFO] [stderr] | [INFO] [stderr] 314 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:330:18 [INFO] [stderr] | [INFO] [stderr] 330 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 330 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:337:18 [INFO] [stderr] | [INFO] [stderr] 337 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 337 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:345:17 [INFO] [stderr] | [INFO] [stderr] 345 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:33:21 [INFO] [stderr] | [INFO] [stderr] 33 | let b_id = *var_map.get(&"b").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:39:32 [INFO] [stderr] | [INFO] [stderr] 39 | assert_eq!( c.get_var(*var_map.get(&"z").unwrap()).unwrap()._val, &[ 42f64, 15f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:40:32 [INFO] [stderr] | [INFO] [stderr] 40 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val, &[ 6f64, 5f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:41:32 [INFO] [stderr] | [INFO] [stderr] 41 | assert_eq!( c.get_var(*var_map.get(&"y").unwrap()).unwrap()._val, &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:42:32 [INFO] [stderr] | [INFO] [stderr] 42 | assert_eq!( c.get_var(*var_map.get(&"b").unwrap()).unwrap()._val, &[ 45f64, 23f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:43:32 [INFO] [stderr] | [INFO] [stderr] 43 | assert_eq!( c.get_var(*var_map.get(&"a").unwrap()).unwrap()._val, &[ 3f64, 8f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:46:21 [INFO] [stderr] | [INFO] [stderr] 46 | assert_eq!( var_grad.get(&"z").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:47:21 [INFO] [stderr] | [INFO] [stderr] 47 | assert_eq!( var_grad.get(&"x").unwrap(), &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:48:21 [INFO] [stderr] | [INFO] [stderr] 48 | assert_eq!( var_grad.get(&"y").unwrap(), &[ 6f64, 5f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:49:21 [INFO] [stderr] | [INFO] [stderr] 49 | assert_eq!( var_grad.get(&"b").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:50:21 [INFO] [stderr] | [INFO] [stderr] 50 | assert_eq!( var_grad.get(&"a").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:55:21 [INFO] [stderr] | [INFO] [stderr] 55 | let z_id = *var_map.get(&"z").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:56:21 [INFO] [stderr] | [INFO] [stderr] 56 | let a_id = *var_map.get(&"a").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:89:21 [INFO] [stderr] | [INFO] [stderr] 89 | let b_id = *var_map.get(&"b").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:96:32 [INFO] [stderr] | [INFO] [stderr] 96 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val.len(), 2usize ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:97:32 [INFO] [stderr] | [INFO] [stderr] 97 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._grad.len(), 2usize ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:99:32 [INFO] [stderr] | [INFO] [stderr] 99 | assert_eq!( c.get_var(*var_map.get(&"z").unwrap()).unwrap()._val, &[ 42f64, 18f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:100:32 [INFO] [stderr] | [INFO] [stderr] 100 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val, &[ 6f64, 6f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:101:32 [INFO] [stderr] | [INFO] [stderr] 101 | assert_eq!( c.get_var(*var_map.get(&"y").unwrap()).unwrap()._val, &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:102:32 [INFO] [stderr] | [INFO] [stderr] 102 | assert_eq!( c.get_var(*var_map.get(&"b").unwrap()).unwrap()._val, &[ 45f64, 26f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:103:32 [INFO] [stderr] | [INFO] [stderr] 103 | assert_eq!( c.get_var(*var_map.get(&"a").unwrap()).unwrap()._val, &[ 3f64, 8f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:106:21 [INFO] [stderr] | [INFO] [stderr] 106 | assert_eq!( var_grad.get(&"z").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:107:21 [INFO] [stderr] | [INFO] [stderr] 107 | assert_eq!( var_grad.get(&"x").unwrap(), &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:108:21 [INFO] [stderr] | [INFO] [stderr] 108 | assert_eq!( var_grad.get(&"y").unwrap(), &[ 6f64, 6f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:109:21 [INFO] [stderr] | [INFO] [stderr] 109 | assert_eq!( var_grad.get(&"b").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:110:21 [INFO] [stderr] | [INFO] [stderr] 110 | assert_eq!( var_grad.get(&"a").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:115:21 [INFO] [stderr] | [INFO] [stderr] 115 | let z_id = *var_map.get(&"z").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:116:21 [INFO] [stderr] | [INFO] [stderr] 116 | let a_id = *var_map.get(&"a").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:255:31 [INFO] [stderr] | [INFO] [stderr] 255 | let bounds = Range::new( -1000000, 1000000 ); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::unreadable_literal)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:255:40 [INFO] [stderr] | [INFO] [stderr] 255 | let bounds = Range::new( -1000000, 1000000 ); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:256:37 [INFO] [stderr] | [INFO] [stderr] 256 | let mut nums : Vec = (0..1000000).enumerate().map( |(_,_)| bounds.ind_sample( & mut rng ) ).collect(); [INFO] [stderr] | ^^^^^^^ help: consider: `1_000_000` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:288:135 [INFO] [stderr] | [INFO] [stderr] 288 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:289:135 [INFO] [stderr] | [INFO] [stderr] 289 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:319:135 [INFO] [stderr] | [INFO] [stderr] 319 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:320:135 [INFO] [stderr] | [INFO] [stderr] 320 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:350:135 [INFO] [stderr] | [INFO] [stderr] 350 | println!("insertion: count: {}, time: {}s, rate: {:.6} inserts/s, {:.6} us/insert", nums.len(), t_insert, nums.len() as f64 * 1000000f64 / t_insert, t_insert / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: long literal lacking separators [INFO] [stderr] --> tests/test_rb.rs:351:135 [INFO] [stderr] | [INFO] [stderr] 351 | println!("insertion: count: {}, time: {}s, rate: {:.6} removes/s, {:.6} us/remove", nums.len(), t_remove, nums.len() as f64 * 1000000f64 / t_remove, t_remove / nums.len() as f64 ); [INFO] [stderr] | ^^^^^^^^^^ help: consider: `1_000_000f64` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unreadable_literal [INFO] [stderr] [INFO] [stderr] warning: returning the result of a let binding from a block. Consider returning the expression directly. [INFO] [stderr] --> tests/test_sarsa.rs:31:9 [INFO] [stderr] | [INFO] [stderr] 31 | s [INFO] [stderr] | ^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::let_and_return)] on by default [INFO] [stderr] note: this expression can be directly returned [INFO] [stderr] --> tests/test_sarsa.rs:30:17 [INFO] [stderr] | [INFO] [stderr] 30 | let s = State( self._start.0, self._start.1 ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#let_and_return [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> tests/test_rb.rs:58:9 [INFO] [stderr] | [INFO] [stderr] 58 | / match t.get( i ) { [INFO] [stderr] 59 | | Some(_) => { panic!( "get() unsuccessfil" ); }, [INFO] [stderr] 60 | | None => (), [INFO] [stderr] 61 | | } [INFO] [stderr] | |_________^ help: try this: `if let Some(_) = t.get( i ) { panic!( "get() unsuccessfil" ); }` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::single_match)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:67:14 [INFO] [stderr] | [INFO] [stderr] 67 | assert!( t.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::len_zero)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:83:14 [INFO] [stderr] | [INFO] [stderr] 83 | assert!( t.len() == 0 ); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 8..9.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:113:14 [INFO] [stderr] | [INFO] [stderr] 113 | for i in 8..9 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::explicit_counter_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 4..5.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:134:14 [INFO] [stderr] | [INFO] [stderr] 134 | for i in 4..5 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 7..8.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:155:14 [INFO] [stderr] | [INFO] [stderr] 155 | for i in 7..8 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 1..2.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:176:14 [INFO] [stderr] | [INFO] [stderr] 176 | for i in 1..2 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: the variable `count_remove` is used as a loop counter. Consider using `for (count_remove, item) in 5..6.enumerate()` or similar iterators [INFO] [stderr] --> tests/test_rb.rs:197:14 [INFO] [stderr] | [INFO] [stderr] 197 | for i in 5..6 { [INFO] [stderr] | ^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#explicit_counter_loop [INFO] [stderr] [INFO] [stderr] warning: you seem to be trying to use match for destructuring a single pattern. Consider using `if let` [INFO] [stderr] --> tests/test_rb.rs:242:17 [INFO] [stderr] | [INFO] [stderr] 242 | / match t.remove( &r ) { [INFO] [stderr] 243 | | Some( _v ) => { panic!( "remove unsuccessful" ); }, [INFO] [stderr] 244 | | _ => {}, [INFO] [stderr] 245 | | } [INFO] [stderr] | |_________________^ help: try this: `if let Some( _v ) = t.remove( &r ) { panic!( "remove unsuccessful" ); }` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:268:18 [INFO] [stderr] | [INFO] [stderr] 268 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::needless_range_loop)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 268 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:275:18 [INFO] [stderr] | [INFO] [stderr] 275 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 275 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:283:17 [INFO] [stderr] | [INFO] [stderr] 283 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:299:18 [INFO] [stderr] | [INFO] [stderr] 299 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 299 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:306:18 [INFO] [stderr] | [INFO] [stderr] 306 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 306 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:314:17 [INFO] [stderr] | [INFO] [stderr] 314 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is used to index `nums` [INFO] [stderr] --> tests/test_rb.rs:330:18 [INFO] [stderr] | [INFO] [stderr] 330 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 330 | for (i, ) in nums.iter().enumerate() { [INFO] [stderr] | ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stderr] [INFO] [stderr] warning: the loop variable `i` is only used to index `nums`. [INFO] [stderr] --> tests/test_rb.rs:337:18 [INFO] [stderr] | [INFO] [stderr] 337 | for i in 0..nums.len() { [INFO] [stderr] | ^^^^^^^^^^^^^ [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_range_loop [INFO] [stderr] help: consider using an iterator [INFO] [stderr] | [INFO] [stderr] 337 | for in &nums { [INFO] [stderr] | ^^^^^^ ^^^^^ [INFO] [stderr] [INFO] [stderr] warning: length comparison to zero [INFO] [stderr] --> tests/test_rb.rs:345:17 [INFO] [stderr] | [INFO] [stderr] 345 | assert!(t.len() == 0); [INFO] [stderr] | ^^^^^^^^^^^^ help: using `is_empty` is clearer and more explicit: `t.is_empty()` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:33:21 [INFO] [stderr] | [INFO] [stderr] 33 | let b_id = *var_map.get(&"b").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::get_unwrap)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:39:32 [INFO] [stderr] | [INFO] [stderr] 39 | assert_eq!( c.get_var(*var_map.get(&"z").unwrap()).unwrap()._val, &[ 42f64, 15f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:40:32 [INFO] [stderr] | [INFO] [stderr] 40 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val, &[ 6f64, 5f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:41:32 [INFO] [stderr] | [INFO] [stderr] 41 | assert_eq!( c.get_var(*var_map.get(&"y").unwrap()).unwrap()._val, &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:42:32 [INFO] [stderr] | [INFO] [stderr] 42 | assert_eq!( c.get_var(*var_map.get(&"b").unwrap()).unwrap()._val, &[ 45f64, 23f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:43:32 [INFO] [stderr] | [INFO] [stderr] 43 | assert_eq!( c.get_var(*var_map.get(&"a").unwrap()).unwrap()._val, &[ 3f64, 8f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:46:21 [INFO] [stderr] | [INFO] [stderr] 46 | assert_eq!( var_grad.get(&"z").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:47:21 [INFO] [stderr] | [INFO] [stderr] 47 | assert_eq!( var_grad.get(&"x").unwrap(), &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:48:21 [INFO] [stderr] | [INFO] [stderr] 48 | assert_eq!( var_grad.get(&"y").unwrap(), &[ 6f64, 5f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:49:21 [INFO] [stderr] | [INFO] [stderr] 49 | assert_eq!( var_grad.get(&"b").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:50:21 [INFO] [stderr] | [INFO] [stderr] 50 | assert_eq!( var_grad.get(&"a").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:55:21 [INFO] [stderr] | [INFO] [stderr] 55 | let z_id = *var_map.get(&"z").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:56:21 [INFO] [stderr] | [INFO] [stderr] 56 | let a_id = *var_map.get(&"a").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:89:21 [INFO] [stderr] | [INFO] [stderr] 89 | let b_id = *var_map.get(&"b").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:96:32 [INFO] [stderr] | [INFO] [stderr] 96 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val.len(), 2usize ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:97:32 [INFO] [stderr] | [INFO] [stderr] 97 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._grad.len(), 2usize ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:99:32 [INFO] [stderr] | [INFO] [stderr] 99 | assert_eq!( c.get_var(*var_map.get(&"z").unwrap()).unwrap()._val, &[ 42f64, 18f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:100:32 [INFO] [stderr] | [INFO] [stderr] 100 | assert_eq!( c.get_var(*var_map.get(&"x").unwrap()).unwrap()._val, &[ 6f64, 6f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:101:32 [INFO] [stderr] | [INFO] [stderr] 101 | assert_eq!( c.get_var(*var_map.get(&"y").unwrap()).unwrap()._val, &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:102:32 [INFO] [stderr] | [INFO] [stderr] 102 | assert_eq!( c.get_var(*var_map.get(&"b").unwrap()).unwrap()._val, &[ 45f64, 26f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:103:32 [INFO] [stderr] | [INFO] [stderr] 103 | assert_eq!( c.get_var(*var_map.get(&"a").unwrap()).unwrap()._val, &[ 3f64, 8f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:106:21 [INFO] [stderr] | [INFO] [stderr] 106 | assert_eq!( var_grad.get(&"z").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:107:21 [INFO] [stderr] | [INFO] [stderr] 107 | assert_eq!( var_grad.get(&"x").unwrap(), &[ 7f64, 3f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"x"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:108:21 [INFO] [stderr] | [INFO] [stderr] 108 | assert_eq!( var_grad.get(&"y").unwrap(), &[ 6f64, 6f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"y"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:109:21 [INFO] [stderr] | [INFO] [stderr] 109 | assert_eq!( var_grad.get(&"b").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"b"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:110:21 [INFO] [stderr] | [INFO] [stderr] 110 | assert_eq!( var_grad.get(&"a").unwrap(), &[ 1f64, 1f64 ] ); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_grad[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:115:21 [INFO] [stderr] | [INFO] [stderr] 115 | let z_id = *var_map.get(&"z").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"z"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise [INFO] [stderr] --> tests/test_autograd.rs:116:21 [INFO] [stderr] | [INFO] [stderr] 116 | let a_id = *var_map.get(&"a").unwrap(); [INFO] [stderr] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&var_map[&"a"]` [INFO] [stderr] | [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_unwrap [INFO] [stderr] [INFO] [stderr] warning: equality checks against true are unnecessary [INFO] [stderr] --> tests/test_sarsa.rs:62:133 [INFO] [stderr] | [INFO] [stderr] 62 | let v : Vec< Action > = actions.iter().zip( &[ Action::RIGHT, Action::LEFT, Action::UP, Action::DOWN ] ).filter_map( |x| if *x.0 == true { Some( x.1.clone() ) } else { None } ).collect(); [INFO] [stderr] | ^^^^^^^^^^^^ help: try simplifying it as shown: `*x.0` [INFO] [stderr] | [INFO] [stderr] = note: #[warn(clippy::bool_comparison)] on by default [INFO] [stderr] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#bool_comparison [INFO] [stderr] [INFO] [stderr] Finished dev [unoptimized + debuginfo] target(s) in 18.88s [INFO] running `"docker" "inspect" "6c99dde46b2885e497eabfe016b5eda538e66158301716c0bf81de0aa9f3dedf"` [INFO] running `"docker" "rm" "-f" "6c99dde46b2885e497eabfe016b5eda538e66158301716c0bf81de0aa9f3dedf"` [INFO] [stdout] 6c99dde46b2885e497eabfe016b5eda538e66158301716c0bf81de0aa9f3dedf