src/kernels/base.rs

changeset 3
0778a71cbb6a
parent 0
eb3c7813b67a
equal deleted inserted replaced
0:eb3c7813b67a 3:0778a71cbb6a
11 Support, 11 Support,
12 Bounds, 12 Bounds,
13 LocalAnalysis, 13 LocalAnalysis,
14 GlobalAnalysis, 14 GlobalAnalysis,
15 Bounded, 15 Bounded,
16 Taylor2ModelParams
16 }; 17 };
17 use alg_tools::mapping::Apply; 18 use alg_tools::mapping::Apply;
18 use alg_tools::maputil::{array_init, map2}; 19 use alg_tools::maputil::{array_init, map2};
19 use alg_tools::sets::SetOrd; 20 use alg_tools::sets::SetOrd;
20 21
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)

mercurial