400 match stage1 { |
401 match stage1 { |
401 Some(h) if (h - a).min(b-h) >= 0.3 * r => Some(h), |
402 Some(h) if (h - a).min(b-h) >= 0.3 * r => Some(h), |
402 _ => None |
403 _ => None |
403 } |
404 } |
404 } |
405 } |
|
406 |
|
407 pub trait Product2Taylor<F : Float, const N : usize> : Sized { |
|
408 fn product2taylor(self) -> Taylor2ModelParams<F, N>; |
|
409 |
|
410 fn product2taylor_scaled(self, sc : F) -> Taylor2ModelParams<F, N> { |
|
411 let (a, b, c, d) = self.product2taylor(); |
|
412 (a / sc, b / sc, c.map(|x| x / sc), d / sc) |
|
413 } |
|
414 } |
|
415 |
|
416 impl<F: Float> Product2Taylor<F, 1> for Loc<Loc<F, 3>, 1> { |
|
417 fn product2taylor(self) -> Taylor2ModelParams<F, 1> { |
|
418 let Loc([Loc([a, b, c])]) = self.into(); |
|
419 (a, Loc([b]), Loc([Loc([c])]), F::ZERO) |
|
420 } |
|
421 } |
|
422 |
|
423 impl<F: Float> Product2Taylor<F, 2> for Loc<Loc<F, 3>, 2> { |
|
424 fn product2taylor(self) -> Taylor2ModelParams<F, 2> { |
|
425 let Loc([Loc([a1, b1, c1]), Loc([a2, b2, c2])]) = self; |
|
426 (a1 * a2, |
|
427 Loc([b1 * a2, a1 * b2]), |
|
428 Loc([Loc([c1 * a2, b1 * b2]), Loc([b1 * b2, a1 * c2])]), |
|
429 F::ZERO) |
|
430 } |
|
431 } |
|
432 |
|
433 |
|
434 // // Zeroeth order term |
|
435 // let a = factors.iter().map(|&(p0, _p1, _p2)| p0).product() / sc; |
|
436 // // First order term |
|
437 // let b = factors.iter().zip(0..).map(|(&(_p0, p1, _p2), i)| { |
|
438 // (p1 / sc) * factors.iter() |
|
439 // .zip(0..) |
|
440 // .filter(|&(_, j)| j != i) |
|
441 // .map(|(&(q0, _q1, _q2), _)| q0) |
|
442 // .product() |
|
443 // }).into(); |
|
444 |
|
445 // // Second order term |
|
446 // let c = factors.iter().zip(0..).map(|(&(_p0, p1, p2), i)| { |
|
447 // factors.iter().zip(0..).map(|(&(_q0, q1, _q2), j)| { |
|
448 // if i == j { |
|
449 // (p2 /sc) * factors.iter() |
|
450 // .zip(0..) |
|
451 // .filter(|&(_, k)| k != i) |
|
452 // .map(|(&(w0, _w1, _w2), _)| w0) |
|
453 // .product() |
|
454 // } else { |
|
455 // (p1 * q1 / sc) * factors.iter() |
|
456 // .zip(0..) |
|
457 // .filter(|&(_, k)| k != i && k != j) |
|
458 // .map(|(&(w0, _w1, _w2), _)| w0) |
|
459 // .product() |
|
460 // } |
|
461 // }).into() |
|
462 // }).into(); |
|
463 // |
|
464 // (a, b, c, 0.0) |