| 2 use numeric_literals::replace_float_literals; |
2 use numeric_literals::replace_float_literals; |
| 3 use std::iter::Sum; |
3 use std::iter::Sum; |
| 4 use std::marker::PhantomData; |
4 use std::marker::PhantomData; |
| 5 use std::sync::Arc; |
5 use std::sync::Arc; |
| 6 use crate::types::Float; |
6 use crate::types::Float; |
| 7 use crate::mapping::{Apply, Mapping}; |
7 use crate::mapping::{Apply, Mapping, Differentiate}; |
| 8 //use crate::linops::{Apply, Linear}; |
8 //use crate::linops::{Apply, Linear}; |
| 9 use crate::sets::Set; |
9 use crate::sets::Set; |
| 10 use crate::sets::Cube; |
10 use crate::sets::Cube; |
| 11 use crate::loc::Loc; |
11 use crate::loc::Loc; |
| 12 use super::support::*; |
12 use super::support::*; |
| 384 } |
384 } |
| 385 } |
385 } |
| 386 |
386 |
| 387 make_btfn_unaryop!(Neg, neg); |
387 make_btfn_unaryop!(Neg, neg); |
| 388 |
388 |
| 389 |
|
| 390 |
|
| 391 // |
389 // |
| 392 // Mapping |
390 // Apply, Mapping, Differentiate |
| 393 // |
391 // |
| 394 |
392 |
| 395 impl<'a, F : Float, G, BT, V, const N : usize> Apply<&'a Loc<F, N>> |
393 impl<'a, F : Float, G, BT, V, const N : usize> Apply<&'a Loc<F, N>> |
| 396 for BTFN<F, G, BT, N> |
394 for BTFN<F, G, BT, N> |
| 397 where BT : BTImpl<F, N>, |
395 where BT : BTImpl<F, N>, |
| 419 fn apply(&self, x : Loc<F, N>) -> Self::Output { |
417 fn apply(&self, x : Loc<F, N>) -> Self::Output { |
| 420 self.bt.iter_at(&x) |
418 self.bt.iter_at(&x) |
| 421 .map(|&d| self.generator.support_for(d).apply(x)).sum() |
419 .map(|&d| self.generator.support_for(d).apply(x)).sum() |
| 422 } |
420 } |
| 423 } |
421 } |
| |
422 |
| |
423 impl<'a, F : Float, G, BT, V, const N : usize> Differentiate<&'a Loc<F, N>> |
| |
424 for BTFN<F, G, BT, N> |
| |
425 where BT : BTImpl<F, N>, |
| |
426 G : SupportGenerator<F, N, Id=BT::Data>, |
| |
427 G::SupportType : LocalAnalysis<F, BT::Agg, N> + Differentiate<&'a Loc<F, N>, Output = V>, |
| |
428 V : Sum { |
| |
429 |
| |
430 type Output = V; |
| |
431 |
| |
432 fn differential(&self, x : &'a Loc<F, N>) -> Self::Output { |
| |
433 self.bt.iter_at(x) |
| |
434 .map(|&d| self.generator.support_for(d).differential(x)) |
| |
435 .sum() |
| |
436 } |
| |
437 } |
| |
438 |
| |
439 impl<F : Float, G, BT, V, const N : usize> Differentiate<Loc<F, N>> |
| |
440 for BTFN<F, G, BT, N> |
| |
441 where BT : BTImpl<F, N>, |
| |
442 G : SupportGenerator<F, N, Id=BT::Data>, |
| |
443 G::SupportType : LocalAnalysis<F, BT::Agg, N> + Differentiate<Loc<F, N>, Output = V>, |
| |
444 V : Sum { |
| |
445 |
| |
446 type Output = V; |
| |
447 |
| |
448 fn differential(&self, x : Loc<F, N>) -> Self::Output { |
| |
449 self.bt.iter_at(&x) |
| |
450 .map(|&d| self.generator.support_for(d).differential(x)) |
| |
451 .sum() |
| |
452 } |
| |
453 } |
| |
454 |
| |
455 // |
| |
456 // GlobalAnalysis |
| |
457 // |
| 424 |
458 |
| 425 impl<F : Float, G, BT, const N : usize> GlobalAnalysis<F, BT::Agg> |
459 impl<F : Float, G, BT, const N : usize> GlobalAnalysis<F, BT::Agg> |
| 426 for BTFN<F, G, BT, N> |
460 for BTFN<F, G, BT, N> |
| 427 where BT : BTImpl<F, N>, |
461 where BT : BTImpl<F, N>, |
| 428 G : SupportGenerator<F, N, Id=BT::Data>, |
462 G : SupportGenerator<F, N, Id=BT::Data>, |