fix: SVC: some more post-review refactoring

This commit is contained in:
Volodymyr Orlov
2020-10-26 16:27:54 -07:00
parent bf8d0c081f
commit 1773ed0e6e
+21 -11
View File
@@ -468,7 +468,6 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
idx_2: Option<usize>, idx_2: Option<usize>,
cache: &mut Cache<T, M, K>, cache: &mut Cache<T, M, K>,
) -> Option<(usize, usize, T)> { ) -> Option<(usize, usize, T)> {
match (idx_1, idx_2) { match (idx_1, idx_2) {
(None, None) => { (None, None) => {
if self.gmax > -self.gmin { if self.gmax > -self.gmin {
@@ -476,7 +475,7 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
} else { } else {
self.select_pair(Some(self.svmin), None, cache) self.select_pair(Some(self.svmin), None, cache)
} }
}, }
(Some(idx_1), None) => { (Some(idx_1), None) => {
let sv1 = &self.sv[idx_1]; let sv1 = &self.sv[idx_1];
let mut idx_2 = None; let mut idx_2 = None;
@@ -493,7 +492,8 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
curv = self.tau; curv = self.tau;
} }
let mu = z / curv; let mu = z / curv;
if (mu > T::zero() && v.alpha < v.cmax) || (mu < T::zero() && v.alpha > v.cmin) { if (mu > T::zero() && v.alpha < v.cmax) || (mu < T::zero() && v.alpha > v.cmin)
{
let gain = z * mu; let gain = z * mu;
if gain > best { if gain > best {
best = gain; best = gain;
@@ -504,9 +504,13 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
} }
idx_2.map(|idx_2| { idx_2.map(|idx_2| {
(idx_1, idx_2, k_v_12.unwrap_or(self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x))) (
idx_1,
idx_2,
k_v_12.unwrap_or(self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x)),
)
}) })
}, }
(None, Some(idx_2)) => { (None, Some(idx_2)) => {
let mut idx_1 = None; let mut idx_1 = None;
let sv2 = &self.sv[idx_2]; let sv2 = &self.sv[idx_2];
@@ -524,7 +528,8 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
} }
let mu = z / curv; let mu = z / curv;
if (mu > T::zero() && v.alpha > v.cmin) || (mu < T::zero() && v.alpha < v.cmax) { if (mu > T::zero() && v.alpha > v.cmin) || (mu < T::zero() && v.alpha < v.cmax)
{
let gain = z * mu; let gain = z * mu;
if gain > best { if gain > best {
best = gain; best = gain;
@@ -535,14 +540,19 @@ impl<'a, T: RealNumber, M: Matrix<T>, K: Kernel<T, M::RowVector>> Optimizer<'a,
} }
idx_1.map(|idx_1| { idx_1.map(|idx_1| {
(idx_1, idx_2, k_v_12.unwrap_or(self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x))) (
idx_1,
idx_2,
k_v_12.unwrap_or(self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x)),
)
}) })
},
(Some(idx_1), Some(idx_2)) => {
Some((idx_1, idx_2, self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x)))
} }
(Some(idx_1), Some(idx_2)) => Some((
idx_1,
idx_2,
self.kernel.apply(&self.sv[idx_1].x, &self.sv[idx_2].x),
)),
} }
} }
fn smo( fn smo(