1 #ifndef __JTOOLS__JPOLINT__
2 #define __JTOOLS__JPOLINT__
24 namespace JPP {
using namespace JTOOLS; }
37 template<
unsigned int N,
39 template<
class,
class>
class JCollection_t,
52 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
58 public JCollection_t<JElement_t, JDistance_t>,
59 public JFunction<typename JElement_t::abscissa_type,
60 typename JResultType<typename JElement_t::ordinate_type>::result_type>
73 typedef typename collection_type::iterator
iterator;
99 if (this->size() <= 1
u) {
100 return this->getExceptionHandler().action(
JFunctionalException(
"JPolintFunction<>::evaluate() not enough data."));
107 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
108 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
109 return this->getExceptionHandler().action(
JValueOutOfRange(
"JPolintFunction::evaluate() x out of range."));
115 const int n = std::min((
int) (
N + 1), (
int) this->size());
117 for (
int i = n/2; i != 0 && p != this->end(); --i, ++p) {}
118 for (
int i = n ; i != 0 && p != this->begin(); --i, --p) {}
123 for (
int i = 0; i !=
n; ++p, ++i) {
129 if (fabs(
u[i]) < fabs(
u[j])) {
139 for (
int m = 1; m !=
n; ++m) {
141 for (
int i = 0; i != n-m; ++i) {
143 const double ho =
u[ i ];
144 const double hp =
u[i+m];
145 const double dx = ho - hp;
173 mutable double u[
N+1];
183 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
189 public JCollection_t<JElement_t, JDistance_t>,
190 public JFunction<typename JElement_t::abscissa_type,
191 typename JResultType<typename JElement_t::ordinate_type>::result_type>
204 typedef typename collection_type::iterator
iterator;
230 if (this->size() <= 1
u) {
231 return this->getExceptionHandler().action(
JFunctionalException(
"JPolintFunction<>::evaluate() not enough data."));
238 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
239 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
241 return this->getExceptionHandler().action(
JValueOutOfRange(
"JPolintFunction::evaluate() x out of range."));
268 template<
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
274 public JCollection_t<JElement_t, JDistance_t>,
275 public JFunction<typename JElement_t::abscissa_type,
276 typename JResultType<typename JElement_t::ordinate_type>::result_type>
289 typedef typename collection_type::iterator
iterator;
315 if (this->size() <= 1
u) {
316 return this->getExceptionHandler().action(
JFunctionalException(
"JPolintFunction<>::evaluate() not enough data."));
323 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
324 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
326 return this->getExceptionHandler().action(
JValueOutOfRange(
"JPolintFunction::evaluate() x out of range."));
334 const double dx = this->
getDistance(p->getX(), q->getX());
336 const double b = 1.0 -
a;
373 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
379 public JCollection_t<JElement_t, JDistance_t>,
380 public JFunction<typename JElement_t::abscissa_type,
381 JResultPDF<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
394 typedef typename collection_type::iterator
iterator;
422 if (this->size() <= 1
u) {
423 return this->getExceptionHandler().action(
JFunctionalException(
"JPolintFunction<>::evaluate() not enough data."));
430 if (p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) {
439 result.V = this->rbegin()->getIntegral();
447 }
else if (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision) {
455 result.v = this->rbegin()->getIntegral();
456 result.V = this->rbegin()->getIntegral();
468 const int n = std::min((
int) (
N + 1), (
int) this->size());
470 for (
int i = n/2; i != 0 && p != this->end(); --i, ++p) {}
471 for (
int i = n ; i != 0 && p != this->begin(); --i, --p) {}
476 for (
int i = 0; i !=
n; ++p, ++i) {
482 w[i][2] =
v[i][2] = p->getIntegral();
484 if (fabs(
u[i]) < fabs(
u[j])) {
493 result.V = this->rbegin()->getIntegral();
497 for (
int m = 1; m !=
n; ++m) {
499 for (
int i = 0; i != n-m; ++i) {
501 const double ho =
u[ i ];
502 const double hp =
u[i+m];
503 const double dx = ho - hp;
505 for (
int k = 0;
k != 3; ++
k) {
506 r[
k] = (
v[i+1][
k] -
w[i][
k]) / dx;
511 v[i][1] = ho * r[1] - r[0];
512 w[i][1] = hp * r[1] - r[0];
517 if (2*(j+1) < n - m) {
549 this->begin()->setIntegral(V);
551 for (
iterator j = this->begin(), i =
j++;
j != this->end(); ++i, ++
j) {
558 const abscissa_type x = 0.5 * (xmax + xmin + m->getX() * (xmax - xmin));
570 mutable double u[
N+1];
582 template<
unsigned int N,
584 template<
class,
class>
class JCollection_t,
595 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t,
unsigned int M>
601 public JCollection_t<JElement_t, JDistance_t>,
607 typedef JCollection_t<JElement_t, JDistance_t> collection_type;
609 typedef typename collection_type::abscissa_type abscissa_type;
610 typedef typename collection_type::ordinate_type ordinate_type;
611 typedef typename collection_type::value_type value_type;
612 typedef typename collection_type::distance_type distance_type;
614 typedef typename collection_type::const_iterator const_iterator;
615 typedef typename collection_type::const_reverse_iterator const_reverse_iterator;
616 typedef typename collection_type::iterator iterator;
617 typedef typename collection_type::reverse_iterator reverse_iterator;
619 typedef typename JResultType<ordinate_type>::result_type data_type;
620 typedef JFunction<abscissa_type, JResultPolynome<M, data_type> > function_type;
622 typedef typename function_type::argument_type argument_type;
623 typedef typename function_type::result_type result_type;
625 using JFunctional<>::compile;
641 result_type evaluate(const argument_type* pX) const
643 if (this->size() <= N) {
644 THROW(JFunctionalException, "JPolintFunction<>::evaluate() not enough data.");
647 const argument_type x = *pX;
649 const_iterator p = this->lower_bound(x);
651 if ((p == this->begin() && this->
getDistance(x, (p++)->getX()) > distance_type::precision) ||
652 (p == this->end() && this->
getDistance((--p)->getX(), x) > distance_type::precision)) {
660 const int n = std::min((
int) (
N + 1), (
int) this->size());
662 for (
int i =
n/2; i != 0 && p != this->end(); --i, ++p) {}
663 for (
int i =
n ; i != 0 && p != this->begin(); --i, --p) {}
668 for (
int i = 0; i !=
n; ++p, ++i) {
674 for (
unsigned int k = 1;
k !=
M+1; ++
k) {
678 if (fabs(
u[i]) < fabs(
u[
j])) {
684 for (
unsigned int k = 0;
k !=
M+1; ++
k) {
690 for (
int m = 1; m !=
n; ++m) {
692 for (
int i = 0; i !=
n-m; ++i) {
694 const double ho =
u[ i ];
695 const double hp =
u[i+m];
696 const double dx = ho - hp;
698 for (
int k = 0;
k !=
M+1; ++
k) {
699 r[
k] = (
v[i+1][
k] -
w[i][
k]) / dx;
705 for (
int k = 1;
k !=
M+1; ++
k) {
706 v[i][
k] = ho * r[
k] -
k * r[
k-1];
707 w[i][
k] = hp * r[
k] -
k * r[
k-1];
711 if (2*(
j+1) <
n - m) {
713 for (
int k = 0;
k !=
M+1; ++
k) {
719 for (
int k = 0;
k !=
M+1; ++
k) {
739 mutable double u[
N+1];
740 mutable data_type
v[
N+1][
M+1];
741 mutable data_type
w[
N+1][
M+1];
742 mutable data_type
r[
M+1];
744 mutable result_type
result;
751 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t,
unsigned int M>
760 JResultPolynome<M, typename JResultType<typename JElement_t::ordinate_type>::result_type>,
762 public JFunction<typename JElement_t::abscissa_type,
763 JResultPolynome<N, typename JResultType<typename JElement_t::ordinate_type>::result_type> >
780 typedef typename collection_type::iterator
iterator;
807 return collection_type::evaluate(pX);
810 return this->getExceptionHandler().action(error);
819 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
828 JResultPolynome<1, typename JResultType<typename JElement_t::ordinate_type>::result_type>,
830 public JFunction<typename JElement_t::abscissa_type,
831 JResultDerivative<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
848 typedef typename collection_type::iterator
iterator;
877 return collection_type::evaluate(pX);
880 return this->getExceptionHandler().action(error);
889 template<
unsigned int N,
class JElement_t,
template<
class,
class>
class JCollection_t,
class JDistance_t>
898 JResultPolynome<2, typename JResultType<typename JElement_t::ordinate_type>::result_type>,
900 public JFunction<typename JElement_t::abscissa_type,
901 JResultHesse<typename JResultType<typename JElement_t::ordinate_type>::result_type> >
918 typedef typename collection_type::iterator
iterator;
947 return collection_type::evaluate(pX);
950 return this->getExceptionHandler().action(error);
961 template<
unsigned int N,
963 template<
class,
class>
class JCollection_t,
964 class JResult_t =
typename JElement_t::ordinate_type,
967 public JPolintFunction<N, JElement_t, JCollection_t, JResult_t, JDistance_t>,
968 public JFunction1D<typename JElement_t::abscissa_type, JResult_t>
1004 template<
class JAbscissa_t,
class JOrdinate_t>
1007 template<
template<
class,
class,
class>
class JMap_t>
1014 template<
unsigned int N,
1017 template<
class,
class,
class>
class JMap_t,
1022 JElement2D<JKey_t, JValue_t>,
1023 JMapCollection<JMap_t>::template collection_type,
1068 template<
unsigned int N,
1070 template<
class,
class>
class JCollection_t,
1073 inline typename JElement_t::ordinate_type
1092 template<
unsigned int N,
1094 template<
class,
class>
class JCollection_t,
1097 inline typename JElement_t::ordinate_type
1102 typedef typename JElement_t::abscissa_type abscissa_type;
1103 typedef typename JElement_t::ordinate_type ordinate_type;
1108 if (input.getSize() > 1) {
1110 output.
put(input.begin()->getX(), V);
1114 for (const_iterator
j = input.begin(), i =
j++;
j != input.end(); ++i, ++
j) {
1116 const abscissa_type xmin = i->getX();
1117 const abscissa_type xmax =
j->getX();
1121 const abscissa_type x = 0.5 * (xmax + xmin + m->getX() * (xmax - xmin));
1122 const ordinate_type
v = 0.5 * (xmax - xmin) * m->getY() *
get_value(input(x));
1127 output.
put(xmax, V);
1145 template<
class JElement_t,
1146 template<
class,
class>
class JCollection_t,
1149 inline typename JElement_t::ordinate_type
1154 typedef typename JElement_t::ordinate_type ordinate_type;
1159 if (input.getSize() > 1) {
1161 output.
put(input.begin()->getX(), V);
1163 for (const_iterator
j = input.begin(), i =
j++;
j != input.end(); ++i, ++
j) {
1165 V += input.getDistance(i->getX(),
j->getX()) *
j->getY();
1167 output.
put(
j->getX(), V);
1185 template<
class JElement_t,
1186 template<
class,
class>
class JCollection_t,
1189 inline typename JElement_t::ordinate_type
1194 typedef typename JElement_t::ordinate_type ordinate_type;
1199 if (input.getSize() > 1) {
1201 output.
put(input.begin()->getX(), V);
1203 for (const_iterator
j = input.begin(), i =
j++;
j != input.end(); ++i, ++
j) {
1205 V += 0.5 * input.getDistance(i->getX(),
j->getX()) * (i->getY() +
j->getY());
1207 output.
put(
j->getX(), V);
double getValue(const JScale_t scale)
Get numerical value corresponding to scale.
Exception for a functional operation.
The elements in a collection are sorted according to their abscissa values and a given distance opera...
This include file containes various data structures that can be used as specific return types for the...
then fatal No sound hydrophone file $HYDROPHONE_TXT fi JGraph f $HYDROPHONE_TXT o $HYDROPHONE_ROOT sort gr k
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
static const JZero zero
Function object to assign zero value.
Generation of compiler error.
size_t getSize(T(&array)[N])
Get size of c-array.
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
Auxiliary template class for type bool.
Exception for numerical precision error.
Auxiliary classes for numerical integration.
alias put_queue eval echo n
Exception for accessing a value in a collection that is outside of its range.
then usage $script[input file[working directory[option]]] nWhere option can be N
do if[[!-f $ACOUSTICS_WORKDIR/${KEY}.txt]]