fix needless-range and clippy::ptr_arg warnings. (#36)
* Fix needless for loop range * Do not ignore clippy::ptr_arg
This commit is contained in:
@@ -187,42 +187,42 @@ impl<T: RealNumber> Node<T> {
|
||||
|
||||
struct NodeVisitor<'a, T: RealNumber, M: Matrix<T>> {
|
||||
x: &'a M,
|
||||
y: &'a Vec<usize>,
|
||||
y: &'a [usize],
|
||||
node: usize,
|
||||
samples: Vec<usize>,
|
||||
order: &'a Vec<Vec<usize>>,
|
||||
order: &'a [Vec<usize>],
|
||||
true_child_output: usize,
|
||||
false_child_output: usize,
|
||||
level: u16,
|
||||
phantom: PhantomData<&'a T>,
|
||||
}
|
||||
|
||||
fn impurity<T: RealNumber>(criterion: &SplitCriterion, count: &Vec<usize>, n: usize) -> T {
|
||||
fn impurity<T: RealNumber>(criterion: &SplitCriterion, count: &[usize], n: usize) -> T {
|
||||
let mut impurity = T::zero();
|
||||
|
||||
match criterion {
|
||||
SplitCriterion::Gini => {
|
||||
impurity = T::one();
|
||||
for i in 0..count.len() {
|
||||
if count[i] > 0 {
|
||||
let p = T::from(count[i]).unwrap() / T::from(n).unwrap();
|
||||
for count_i in count.iter() {
|
||||
if *count_i > 0 {
|
||||
let p = T::from(*count_i).unwrap() / T::from(n).unwrap();
|
||||
impurity -= p * p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SplitCriterion::Entropy => {
|
||||
for i in 0..count.len() {
|
||||
if count[i] > 0 {
|
||||
let p = T::from(count[i]).unwrap() / T::from(n).unwrap();
|
||||
for count_i in count.iter() {
|
||||
if *count_i > 0 {
|
||||
let p = T::from(*count_i).unwrap() / T::from(n).unwrap();
|
||||
impurity -= p * p.log2();
|
||||
}
|
||||
}
|
||||
}
|
||||
SplitCriterion::ClassificationError => {
|
||||
for i in 0..count.len() {
|
||||
if count[i] > 0 {
|
||||
impurity = impurity.max(T::from(count[i]).unwrap() / T::from(n).unwrap());
|
||||
for count_i in count.iter() {
|
||||
if *count_i > 0 {
|
||||
impurity = impurity.max(T::from(*count_i).unwrap() / T::from(n).unwrap());
|
||||
}
|
||||
}
|
||||
impurity = (T::one() - impurity).abs();
|
||||
@@ -236,9 +236,9 @@ impl<'a, T: RealNumber, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
||||
fn new(
|
||||
node_id: usize,
|
||||
samples: Vec<usize>,
|
||||
order: &'a Vec<Vec<usize>>,
|
||||
order: &'a [Vec<usize>],
|
||||
x: &'a M,
|
||||
y: &'a Vec<usize>,
|
||||
y: &'a [usize],
|
||||
level: u16,
|
||||
) -> Self {
|
||||
NodeVisitor {
|
||||
@@ -255,13 +255,13 @@ impl<'a, T: RealNumber, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(in crate) fn which_max(x: &Vec<usize>) -> usize {
|
||||
pub(in crate) fn which_max(x: &[usize]) -> usize {
|
||||
let mut m = x[0];
|
||||
let mut which = 0;
|
||||
|
||||
for i in 1..x.len() {
|
||||
if x[i] > m {
|
||||
m = x[i];
|
||||
for (i, x_i) in x.iter().enumerate().skip(1) {
|
||||
if *x_i > m {
|
||||
m = *x_i;
|
||||
which = i;
|
||||
}
|
||||
}
|
||||
@@ -304,9 +304,9 @@ impl<T: RealNumber> DecisionTreeClassifier<T> {
|
||||
|
||||
let mut yi: Vec<usize> = vec![0; y_ncols];
|
||||
|
||||
for i in 0..y_ncols {
|
||||
for (i, yi_i) in yi.iter_mut().enumerate().take(y_ncols) {
|
||||
let yc = y_m.get(0, i);
|
||||
yi[i] = classes.iter().position(|c| yc == *c).unwrap();
|
||||
*yi_i = classes.iter().position(|c| yc == *c).unwrap();
|
||||
}
|
||||
|
||||
let mut nodes: Vec<Node<T>> = Vec::new();
|
||||
@@ -431,23 +431,20 @@ impl<T: RealNumber> DecisionTreeClassifier<T> {
|
||||
|
||||
let parent_impurity = impurity(&self.parameters.criterion, &count, n);
|
||||
|
||||
let mut variables = vec![0; n_attr];
|
||||
for i in 0..n_attr {
|
||||
variables[i] = i;
|
||||
}
|
||||
let mut variables = (0..n_attr).collect::<Vec<_>>();
|
||||
|
||||
if mtry < n_attr {
|
||||
variables.shuffle(&mut rand::thread_rng());
|
||||
}
|
||||
|
||||
for j in 0..mtry {
|
||||
for variable in variables.iter().take(mtry) {
|
||||
self.find_best_split(
|
||||
visitor,
|
||||
n,
|
||||
&count,
|
||||
&mut false_count,
|
||||
parent_impurity,
|
||||
variables[j],
|
||||
*variable,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -458,7 +455,7 @@ impl<T: RealNumber> DecisionTreeClassifier<T> {
|
||||
&mut self,
|
||||
visitor: &mut NodeVisitor<'_, T, M>,
|
||||
n: usize,
|
||||
count: &Vec<usize>,
|
||||
count: &[usize],
|
||||
false_count: &mut Vec<usize>,
|
||||
parent_impurity: T,
|
||||
j: usize,
|
||||
@@ -527,13 +524,13 @@ impl<T: RealNumber> DecisionTreeClassifier<T> {
|
||||
let mut fc = 0;
|
||||
let mut true_samples: Vec<usize> = vec![0; n];
|
||||
|
||||
for i in 0..n {
|
||||
for (i, true_sample) in true_samples.iter_mut().enumerate().take(n) {
|
||||
if visitor.samples[i] > 0 {
|
||||
if visitor.x.get(i, self.nodes[visitor.node].split_feature)
|
||||
<= self.nodes[visitor.node].split_value.unwrap_or_else(T::nan)
|
||||
{
|
||||
true_samples[i] = visitor.samples[i];
|
||||
tc += true_samples[i];
|
||||
*true_sample = visitor.samples[i];
|
||||
tc += *true_sample;
|
||||
visitor.samples[i] = 0;
|
||||
} else {
|
||||
fc += visitor.samples[i];
|
||||
|
||||
@@ -161,7 +161,7 @@ struct NodeVisitor<'a, T: RealNumber, M: Matrix<T>> {
|
||||
y: &'a M,
|
||||
node: usize,
|
||||
samples: Vec<usize>,
|
||||
order: &'a Vec<Vec<usize>>,
|
||||
order: &'a [Vec<usize>],
|
||||
true_child_output: T,
|
||||
false_child_output: T,
|
||||
level: u16,
|
||||
@@ -171,7 +171,7 @@ impl<'a, T: RealNumber, M: Matrix<T>> NodeVisitor<'a, T, M> {
|
||||
fn new(
|
||||
node_id: usize,
|
||||
samples: Vec<usize>,
|
||||
order: &'a Vec<Vec<usize>>,
|
||||
order: &'a [Vec<usize>],
|
||||
x: &'a M,
|
||||
y: &'a M,
|
||||
level: u16,
|
||||
@@ -219,9 +219,9 @@ impl<T: RealNumber> DecisionTreeRegressor<T> {
|
||||
|
||||
let mut n = 0;
|
||||
let mut sum = T::zero();
|
||||
for i in 0..y_ncols {
|
||||
n += samples[i];
|
||||
sum += T::from(samples[i]).unwrap() * y_m.get(0, i);
|
||||
for (i, sample_i) in samples.iter().enumerate().take(y_ncols) {
|
||||
n += *sample_i;
|
||||
sum += T::from(*sample_i).unwrap() * y_m.get(0, i);
|
||||
}
|
||||
|
||||
let root = Node::new(0, sum / T::from(n).unwrap());
|
||||
@@ -312,10 +312,7 @@ impl<T: RealNumber> DecisionTreeRegressor<T> {
|
||||
|
||||
let sum = self.nodes[visitor.node].output * T::from(n).unwrap();
|
||||
|
||||
let mut variables = vec![0; n_attr];
|
||||
for i in 0..n_attr {
|
||||
variables[i] = i;
|
||||
}
|
||||
let mut variables = (0..n_attr).collect::<Vec<_>>();
|
||||
|
||||
if mtry < n_attr {
|
||||
variables.shuffle(&mut rand::thread_rng());
|
||||
@@ -324,8 +321,8 @@ impl<T: RealNumber> DecisionTreeRegressor<T> {
|
||||
let parent_gain =
|
||||
T::from(n).unwrap() * self.nodes[visitor.node].output * self.nodes[visitor.node].output;
|
||||
|
||||
for j in 0..mtry {
|
||||
self.find_best_split(visitor, n, sum, parent_gain, variables[j]);
|
||||
for variable in variables.iter().take(mtry) {
|
||||
self.find_best_split(visitor, n, sum, parent_gain, *variable);
|
||||
}
|
||||
|
||||
self.nodes[visitor.node].split_score != Option::None
|
||||
@@ -399,13 +396,13 @@ impl<T: RealNumber> DecisionTreeRegressor<T> {
|
||||
let mut fc = 0;
|
||||
let mut true_samples: Vec<usize> = vec![0; n];
|
||||
|
||||
for i in 0..n {
|
||||
for (i, true_sample) in true_samples.iter_mut().enumerate().take(n) {
|
||||
if visitor.samples[i] > 0 {
|
||||
if visitor.x.get(i, self.nodes[visitor.node].split_feature)
|
||||
<= self.nodes[visitor.node].split_value.unwrap_or_else(T::nan)
|
||||
{
|
||||
true_samples[i] = visitor.samples[i];
|
||||
tc += true_samples[i];
|
||||
*true_sample = visitor.samples[i];
|
||||
tc += *true_sample;
|
||||
visitor.samples[i] = 0;
|
||||
} else {
|
||||
fc += visitor.samples[i];
|
||||
|
||||
Reference in New Issue
Block a user