src/bisection_tree/btfn.rs

branch
dev
changeset 77
cf8ef9463664
parent 29
7fd0984743b5
equal deleted inserted replaced
30:9f2214c961cb 77:cf8ef9463664
418 self.bt.iter_at(&x) 418 self.bt.iter_at(&x)
419 .map(|&d| self.generator.support_for(d).apply(x)).sum() 419 .map(|&d| self.generator.support_for(d).apply(x)).sum()
420 } 420 }
421 } 421 }
422 422
423 impl<'a, F : Float, G, BT, V, const N : usize> Differentiable<&'a Loc<F, N>> 423 impl<'a, F : Float, G, BT, V, W, const N : usize> Differentiable<&'a Loc<F, N>>
424 for BTFN<F, G, BT, N> 424 for BTFN<F, G, BT, N>
425 where BT : BTImpl<F, N>, 425 where BT : BTImpl<F, N>,
426 G : SupportGenerator<F, N, Id=BT::Data>, 426 G : SupportGenerator<F, N, Id=BT::Data>,
427 G::SupportType : LocalAnalysis<F, BT::Agg, N> + Differentiable<&'a Loc<F, N>, Output = V>, 427 G::SupportType : LocalAnalysis<F, BT::Agg, N>
428 V : Sum { 428 + Differentiable<&'a Loc<F, N>, Output = V>
429 + Apply<&'a Loc<F, N>, Output = W>,
430 V : Sum,
431 W : Sum {
429 432
430 type Output = V; 433 type Output = V;
431 434
432 fn differential(&self, x : &'a Loc<F, N>) -> Self::Output { 435 fn differential(&self, x : &'a Loc<F, N>) -> V {
433 self.bt.iter_at(x) 436 self.bt.iter_at(x)
434 .map(|&d| self.generator.support_for(d).differential(x)) 437 .map(|&d| self.generator.support_for(d).differential(x))
435 .sum() 438 .sum()
436 } 439 }
437 } 440
438 441 fn linearisation_error_gen(&self, x : &'a Loc<F, N>, y : &'a Loc<F, N>, z : &'a Loc<F, N>) -> W {
439 impl<F : Float, G, BT, V, const N : usize> Differentiable<Loc<F, N>> 442 self.bt.iter_at(x)
443 .map(|&d| self.generator.support_for(d).linearisation_error_gen(x, y, z)).sum()
444 }
445
446 fn linearisation_error(&self, x : &'a Loc<F, N>, y : &'a Loc<F, N>) -> W {
447 self.bt.iter_at(x)
448 .map(|&d| self.generator.support_for(d).linearisation_error(x, y)).sum()
449 }
450 }
451
452 impl<F : Float, G, BT, V, W, const N : usize> Differentiable<Loc<F, N>>
440 for BTFN<F, G, BT, N> 453 for BTFN<F, G, BT, N>
441 where BT : BTImpl<F, N>, 454 where BT : BTImpl<F, N>,
442 G : SupportGenerator<F, N, Id=BT::Data>, 455 G : SupportGenerator<F, N, Id=BT::Data>,
443 G::SupportType : LocalAnalysis<F, BT::Agg, N> + Differentiable<Loc<F, N>, Output = V>, 456 G::SupportType : LocalAnalysis<F, BT::Agg, N>
444 V : Sum { 457 + Differentiable<Loc<F, N>, Output = V>
458 + Apply<Loc<F, N>, Output = W>,
459 V : Sum,
460 W : Sum {
445 461
446 type Output = V; 462 type Output = V;
447 463
448 fn differential(&self, x : Loc<F, N>) -> Self::Output { 464 fn differential(&self, x : Loc<F, N>) -> V {
449 self.bt.iter_at(&x) 465 self.bt.iter_at(&x)
450 .map(|&d| self.generator.support_for(d).differential(x)) 466 .map(|&d| self.generator.support_for(d).differential(x))
451 .sum() 467 .sum()
468 }
469
470 fn linearisation_error_gen(&self, x : Loc<F, N>, y : Loc<F, N>, z : Loc<F, N>) -> W {
471 self.bt.iter_at(&x)
472 .map(|&d| self.generator.support_for(d).linearisation_error_gen(x, y, z)).sum()
473 }
474
475 fn linearisation_error(&self, x : Loc<F, N>, y : Loc<F, N>) -> W {
476 self.bt.iter_at(&x)
477 .map(|&d| self.generator.support_for(d).linearisation_error(x, y)).sum()
452 } 478 }
453 } 479 }
454 480
455 // 481 //
456 // GlobalAnalysis 482 // GlobalAnalysis

mercurial