mirror of
https://asciireactor.com/otho/psdlag-agn.git
synced 2024-11-25 03:05:05 +00:00
updated to latest version of psdlag, compiles well provided libalglib-dev is installed, looks to still be reading headers from the src/inc directory, this could cause problems
This commit is contained in:
parent
27a61c97bb
commit
ed7a5d8920
BIN
src/archive/newsrc.tar
Normal file
BIN
src/archive/newsrc.tar
Normal file
Binary file not shown.
BIN
src/archive/oldsrc.tar
Normal file
BIN
src/archive/oldsrc.tar
Normal file
Binary file not shown.
15919
src/inc/alglib/alglibinternal.cpp
Normal file
15919
src/inc/alglib/alglibinternal.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1074
src/inc/alglib/alglibinternal.h
Normal file
1074
src/inc/alglib/alglibinternal.h
Normal file
File diff suppressed because it is too large
Load Diff
3611
src/inc/alglib/alglibmisc.cpp
Normal file
3611
src/inc/alglib/alglibmisc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
769
src/inc/alglib/alglibmisc.h
Normal file
769
src/inc/alglib/alglibmisc.h
Normal file
@ -0,0 +1,769 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
Copyright (c) Sergey Bochkanov (ALGLIB project).
|
||||||
|
|
||||||
|
>>> SOURCE LICENSE >>>
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation (www.fsf.org); either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
A copy of the GNU General Public License is available at
|
||||||
|
http://www.fsf.org/licensing/licenses
|
||||||
|
>>> END OF LICENSE >>>
|
||||||
|
*************************************************************************/
|
||||||
|
#ifndef _alglibmisc_pkg_h
|
||||||
|
#define _alglibmisc_pkg_h
|
||||||
|
#include "ap.h"
|
||||||
|
#include "alglibinternal.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (DATATYPES)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ae_int_t s1;
|
||||||
|
ae_int_t s2;
|
||||||
|
ae_int_t magicv;
|
||||||
|
} hqrndstate;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ae_int_t n;
|
||||||
|
ae_int_t nx;
|
||||||
|
ae_int_t ny;
|
||||||
|
ae_int_t normtype;
|
||||||
|
ae_matrix xy;
|
||||||
|
ae_vector tags;
|
||||||
|
ae_vector boxmin;
|
||||||
|
ae_vector boxmax;
|
||||||
|
ae_vector nodes;
|
||||||
|
ae_vector splits;
|
||||||
|
ae_vector x;
|
||||||
|
ae_int_t kneeded;
|
||||||
|
double rneeded;
|
||||||
|
ae_bool selfmatch;
|
||||||
|
double approxf;
|
||||||
|
ae_int_t kcur;
|
||||||
|
ae_vector idx;
|
||||||
|
ae_vector r;
|
||||||
|
ae_vector buf;
|
||||||
|
ae_vector curboxmin;
|
||||||
|
ae_vector curboxmax;
|
||||||
|
double curdist;
|
||||||
|
ae_int_t debugcounter;
|
||||||
|
} kdtree;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS C++ INTERFACE
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib
|
||||||
|
{
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Portable high quality random number generator state.
|
||||||
|
Initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
Fields:
|
||||||
|
S1, S2 - seed values
|
||||||
|
V - precomputed value
|
||||||
|
MagicV - 'magic' value used to determine whether State structure
|
||||||
|
was correctly initialized.
|
||||||
|
*************************************************************************/
|
||||||
|
class _hqrndstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_hqrndstate_owner();
|
||||||
|
_hqrndstate_owner(const _hqrndstate_owner &rhs);
|
||||||
|
_hqrndstate_owner& operator=(const _hqrndstate_owner &rhs);
|
||||||
|
virtual ~_hqrndstate_owner();
|
||||||
|
alglib_impl::hqrndstate* c_ptr();
|
||||||
|
alglib_impl::hqrndstate* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::hqrndstate *p_struct;
|
||||||
|
};
|
||||||
|
class hqrndstate : public _hqrndstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
hqrndstate();
|
||||||
|
hqrndstate(const hqrndstate &rhs);
|
||||||
|
hqrndstate& operator=(const hqrndstate &rhs);
|
||||||
|
virtual ~hqrndstate();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
class _kdtree_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_kdtree_owner();
|
||||||
|
_kdtree_owner(const _kdtree_owner &rhs);
|
||||||
|
_kdtree_owner& operator=(const _kdtree_owner &rhs);
|
||||||
|
virtual ~_kdtree_owner();
|
||||||
|
alglib_impl::kdtree* c_ptr();
|
||||||
|
alglib_impl::kdtree* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::kdtree *p_struct;
|
||||||
|
};
|
||||||
|
class kdtree : public _kdtree_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
kdtree();
|
||||||
|
kdtree(const kdtree &rhs);
|
||||||
|
kdtree& operator=(const kdtree &rhs);
|
||||||
|
virtual ~kdtree();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
HQRNDState initialization with random values which come from standard
|
||||||
|
RNG.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void hqrndrandomize(hqrndstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
HQRNDState initialization with seed values
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void hqrndseed(const ae_int_t s1, const ae_int_t s2, hqrndstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function generates random real number in (0,1),
|
||||||
|
not including interval boundaries
|
||||||
|
|
||||||
|
State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
double hqrnduniformr(const hqrndstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function generates random integer number in [0, N)
|
||||||
|
|
||||||
|
1. State structure must be initialized with HQRNDRandomize() or HQRNDSeed()
|
||||||
|
2. N can be any positive number except for very large numbers:
|
||||||
|
* close to 2^31 on 32-bit systems
|
||||||
|
* close to 2^62 on 64-bit systems
|
||||||
|
An exception will be generated if N is too large.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
ae_int_t hqrnduniformi(const hqrndstate &state, const ae_int_t n);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Random number generator: normal numbers
|
||||||
|
|
||||||
|
This function generates one random number from normal distribution.
|
||||||
|
Its performance is equal to that of HQRNDNormal2()
|
||||||
|
|
||||||
|
State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
double hqrndnormal(const hqrndstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Random number generator: random X and Y such that X^2+Y^2=1
|
||||||
|
|
||||||
|
State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void hqrndunit2(const hqrndstate &state, double &x, double &y);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Random number generator: normal numbers
|
||||||
|
|
||||||
|
This function generates two independent random numbers from normal
|
||||||
|
distribution. Its performance is equal to that of HQRNDNormal()
|
||||||
|
|
||||||
|
State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 02.12.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void hqrndnormal2(const hqrndstate &state, double &x1, double &x2);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Random number generator: exponential distribution
|
||||||
|
|
||||||
|
State structure must be initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 11.08.2007 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
double hqrndexponential(const hqrndstate &state, const double lambdav);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function generates random number from discrete distribution given by
|
||||||
|
finite sample X.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
State - high quality random number generator, must be
|
||||||
|
initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
X - finite sample
|
||||||
|
N - number of elements to use, N>=1
|
||||||
|
|
||||||
|
RESULT
|
||||||
|
this function returns one of the X[i] for random i=0..N-1
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 08.11.2011 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
double hqrnddiscrete(const hqrndstate &state, const real_1d_array &x, const ae_int_t n);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function generates random number from continuous distribution given
|
||||||
|
by finite sample X.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
State - high quality random number generator, must be
|
||||||
|
initialized with HQRNDRandomize() or HQRNDSeed().
|
||||||
|
X - finite sample, array[N] (can be larger, in this case only
|
||||||
|
leading N elements are used). THIS ARRAY MUST BE SORTED BY
|
||||||
|
ASCENDING.
|
||||||
|
N - number of elements to use, N>=1
|
||||||
|
|
||||||
|
RESULT
|
||||||
|
this function returns random number from continuous distribution which
|
||||||
|
tries to approximate X as mush as possible. min(X)<=Result<=max(X).
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 08.11.2011 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
double hqrndcontinuous(const hqrndstate &state, const real_1d_array &x, const ae_int_t n);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function serializes data structure to string.
|
||||||
|
|
||||||
|
Important properties of s_out:
|
||||||
|
* it contains alphanumeric characters, dots, underscores, minus signs
|
||||||
|
* these symbols are grouped into words, which are separated by spaces
|
||||||
|
and Windows-style (CR+LF) newlines
|
||||||
|
* although serializer uses spaces and CR+LF as separators, you can
|
||||||
|
replace any separator character by arbitrary combination of spaces,
|
||||||
|
tabs, Windows or Unix newlines. It allows flexible reformatting of
|
||||||
|
the string in case you want to include it into text or XML file.
|
||||||
|
But you should not insert separators into the middle of the "words"
|
||||||
|
nor you should change case of letters.
|
||||||
|
* s_out can be freely moved between 32-bit and 64-bit systems, little
|
||||||
|
and big endian machines, and so on. You can serialize structure on
|
||||||
|
32-bit machine and unserialize it on 64-bit one (or vice versa), or
|
||||||
|
serialize it on SPARC and unserialize on x86. You can also
|
||||||
|
serialize it in C++ version of ALGLIB and unserialize in C# one,
|
||||||
|
and vice versa.
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreeserialize(kdtree &obj, std::string &s_out);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function unserializes data structure from string.
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreeunserialize(std::string &s_in, kdtree &obj);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
KD-tree creation
|
||||||
|
|
||||||
|
This subroutine creates KD-tree from set of X-values and optional Y-values
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
XY - dataset, array[0..N-1,0..NX+NY-1].
|
||||||
|
one row corresponds to one point.
|
||||||
|
first NX columns contain X-values, next NY (NY may be zero)
|
||||||
|
columns may contain associated Y-values
|
||||||
|
N - number of points, N>=0.
|
||||||
|
NX - space dimension, NX>=1.
|
||||||
|
NY - number of optional Y-values, NY>=0.
|
||||||
|
NormType- norm type:
|
||||||
|
* 0 denotes infinity-norm
|
||||||
|
* 1 denotes 1-norm
|
||||||
|
* 2 denotes 2-norm (Euclidean norm)
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
|
||||||
|
1. KD-tree creation have O(N*logN) complexity and O(N*(2*NX+NY)) memory
|
||||||
|
requirements.
|
||||||
|
2. Although KD-trees may be used with any combination of N and NX, they
|
||||||
|
are more efficient than brute-force search only when N >> 4^NX. So they
|
||||||
|
are most useful in low-dimensional tasks (NX=2, NX=3). NX=1 is another
|
||||||
|
inefficient case, because simple binary search (without additional
|
||||||
|
structures) is much more efficient in such tasks than KD-trees.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreebuild(const real_2d_array &xy, const ae_int_t n, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt);
|
||||||
|
void kdtreebuild(const real_2d_array &xy, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
KD-tree creation
|
||||||
|
|
||||||
|
This subroutine creates KD-tree from set of X-values, integer tags and
|
||||||
|
optional Y-values
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
XY - dataset, array[0..N-1,0..NX+NY-1].
|
||||||
|
one row corresponds to one point.
|
||||||
|
first NX columns contain X-values, next NY (NY may be zero)
|
||||||
|
columns may contain associated Y-values
|
||||||
|
Tags - tags, array[0..N-1], contains integer tags associated
|
||||||
|
with points.
|
||||||
|
N - number of points, N>=0
|
||||||
|
NX - space dimension, NX>=1.
|
||||||
|
NY - number of optional Y-values, NY>=0.
|
||||||
|
NormType- norm type:
|
||||||
|
* 0 denotes infinity-norm
|
||||||
|
* 1 denotes 1-norm
|
||||||
|
* 2 denotes 2-norm (Euclidean norm)
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
|
||||||
|
1. KD-tree creation have O(N*logN) complexity and O(N*(2*NX+NY)) memory
|
||||||
|
requirements.
|
||||||
|
2. Although KD-trees may be used with any combination of N and NX, they
|
||||||
|
are more efficient than brute-force search only when N >> 4^NX. So they
|
||||||
|
are most useful in low-dimensional tasks (NX=2, NX=3). NX=1 is another
|
||||||
|
inefficient case, because simple binary search (without additional
|
||||||
|
structures) is much more efficient in such tasks than KD-trees.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreebuildtagged(const real_2d_array &xy, const integer_1d_array &tags, const ae_int_t n, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt);
|
||||||
|
void kdtreebuildtagged(const real_2d_array &xy, const integer_1d_array &tags, const ae_int_t nx, const ae_int_t ny, const ae_int_t normtype, kdtree &kdt);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
K-NN query: K nearest neighbors
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
X - point, array[0..NX-1].
|
||||||
|
K - number of neighbors to return, K>=1
|
||||||
|
SelfMatch - whether self-matches are allowed:
|
||||||
|
* if True, nearest neighbor may be the point itself
|
||||||
|
(if it exists in original dataset)
|
||||||
|
* if False, then only points with non-zero distance
|
||||||
|
are returned
|
||||||
|
* if not given, considered True
|
||||||
|
|
||||||
|
RESULT
|
||||||
|
number of actual neighbors found (either K or N, if K>N).
|
||||||
|
|
||||||
|
This subroutine performs query and stores its result in the internal
|
||||||
|
structures of the KD-tree. You can use following subroutines to obtain
|
||||||
|
these results:
|
||||||
|
* KDTreeQueryResultsX() to get X-values
|
||||||
|
* KDTreeQueryResultsXY() to get X- and Y-values
|
||||||
|
* KDTreeQueryResultsTags() to get tag values
|
||||||
|
* KDTreeQueryResultsDistances() to get distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
ae_int_t kdtreequeryknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const bool selfmatch);
|
||||||
|
ae_int_t kdtreequeryknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
R-NN query: all points within R-sphere centered at X
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
X - point, array[0..NX-1].
|
||||||
|
R - radius of sphere (in corresponding norm), R>0
|
||||||
|
SelfMatch - whether self-matches are allowed:
|
||||||
|
* if True, nearest neighbor may be the point itself
|
||||||
|
(if it exists in original dataset)
|
||||||
|
* if False, then only points with non-zero distance
|
||||||
|
are returned
|
||||||
|
* if not given, considered True
|
||||||
|
|
||||||
|
RESULT
|
||||||
|
number of neighbors found, >=0
|
||||||
|
|
||||||
|
This subroutine performs query and stores its result in the internal
|
||||||
|
structures of the KD-tree. You can use following subroutines to obtain
|
||||||
|
actual results:
|
||||||
|
* KDTreeQueryResultsX() to get X-values
|
||||||
|
* KDTreeQueryResultsXY() to get X- and Y-values
|
||||||
|
* KDTreeQueryResultsTags() to get tag values
|
||||||
|
* KDTreeQueryResultsDistances() to get distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
ae_int_t kdtreequeryrnn(const kdtree &kdt, const real_1d_array &x, const double r, const bool selfmatch);
|
||||||
|
ae_int_t kdtreequeryrnn(const kdtree &kdt, const real_1d_array &x, const double r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
K-NN query: approximate K nearest neighbors
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
X - point, array[0..NX-1].
|
||||||
|
K - number of neighbors to return, K>=1
|
||||||
|
SelfMatch - whether self-matches are allowed:
|
||||||
|
* if True, nearest neighbor may be the point itself
|
||||||
|
(if it exists in original dataset)
|
||||||
|
* if False, then only points with non-zero distance
|
||||||
|
are returned
|
||||||
|
* if not given, considered True
|
||||||
|
Eps - approximation factor, Eps>=0. eps-approximate nearest
|
||||||
|
neighbor is a neighbor whose distance from X is at
|
||||||
|
most (1+eps) times distance of true nearest neighbor.
|
||||||
|
|
||||||
|
RESULT
|
||||||
|
number of actual neighbors found (either K or N, if K>N).
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
significant performance gain may be achieved only when Eps is is on
|
||||||
|
the order of magnitude of 1 or larger.
|
||||||
|
|
||||||
|
This subroutine performs query and stores its result in the internal
|
||||||
|
structures of the KD-tree. You can use following subroutines to obtain
|
||||||
|
these results:
|
||||||
|
* KDTreeQueryResultsX() to get X-values
|
||||||
|
* KDTreeQueryResultsXY() to get X- and Y-values
|
||||||
|
* KDTreeQueryResultsTags() to get tag values
|
||||||
|
* KDTreeQueryResultsDistances() to get distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
ae_int_t kdtreequeryaknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const bool selfmatch, const double eps);
|
||||||
|
ae_int_t kdtreequeryaknn(const kdtree &kdt, const real_1d_array &x, const ae_int_t k, const double eps);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
X-values from last query
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
X - possibly pre-allocated buffer. If X is too small to store
|
||||||
|
result, it is resized. If size(X) is enough to store
|
||||||
|
result, it is left unchanged.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
X - rows are filled with X-values
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
1. points are ordered by distance from the query point (first = closest)
|
||||||
|
2. if XY is larger than required to store result, only leading part will
|
||||||
|
be overwritten; trailing part will be left unchanged. So if on input
|
||||||
|
XY = [[A,B],[C,D]], and result is [1,2], then on exit we will get
|
||||||
|
XY = [[1,2],[C,D]]. This is done purposely to increase performance; if
|
||||||
|
you want function to resize array according to result size, use
|
||||||
|
function with same name and suffix 'I'.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
* KDTreeQueryResultsXY() X- and Y-values
|
||||||
|
* KDTreeQueryResultsTags() tag values
|
||||||
|
* KDTreeQueryResultsDistances() distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsx(const kdtree &kdt, real_2d_array &x);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
X- and Y-values from last query
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
XY - possibly pre-allocated buffer. If XY is too small to store
|
||||||
|
result, it is resized. If size(XY) is enough to store
|
||||||
|
result, it is left unchanged.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
XY - rows are filled with points: first NX columns with
|
||||||
|
X-values, next NY columns - with Y-values.
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
1. points are ordered by distance from the query point (first = closest)
|
||||||
|
2. if XY is larger than required to store result, only leading part will
|
||||||
|
be overwritten; trailing part will be left unchanged. So if on input
|
||||||
|
XY = [[A,B],[C,D]], and result is [1,2], then on exit we will get
|
||||||
|
XY = [[1,2],[C,D]]. This is done purposely to increase performance; if
|
||||||
|
you want function to resize array according to result size, use
|
||||||
|
function with same name and suffix 'I'.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
* KDTreeQueryResultsX() X-values
|
||||||
|
* KDTreeQueryResultsTags() tag values
|
||||||
|
* KDTreeQueryResultsDistances() distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsxy(const kdtree &kdt, real_2d_array &xy);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Tags from last query
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
Tags - possibly pre-allocated buffer. If X is too small to store
|
||||||
|
result, it is resized. If size(X) is enough to store
|
||||||
|
result, it is left unchanged.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
Tags - filled with tags associated with points,
|
||||||
|
or, when no tags were supplied, with zeros
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
1. points are ordered by distance from the query point (first = closest)
|
||||||
|
2. if XY is larger than required to store result, only leading part will
|
||||||
|
be overwritten; trailing part will be left unchanged. So if on input
|
||||||
|
XY = [[A,B],[C,D]], and result is [1,2], then on exit we will get
|
||||||
|
XY = [[1,2],[C,D]]. This is done purposely to increase performance; if
|
||||||
|
you want function to resize array according to result size, use
|
||||||
|
function with same name and suffix 'I'.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
* KDTreeQueryResultsX() X-values
|
||||||
|
* KDTreeQueryResultsXY() X- and Y-values
|
||||||
|
* KDTreeQueryResultsDistances() distances
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultstags(const kdtree &kdt, integer_1d_array &tags);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Distances from last query
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
KDT - KD-tree
|
||||||
|
R - possibly pre-allocated buffer. If X is too small to store
|
||||||
|
result, it is resized. If size(X) is enough to store
|
||||||
|
result, it is left unchanged.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - filled with distances (in corresponding norm)
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
1. points are ordered by distance from the query point (first = closest)
|
||||||
|
2. if XY is larger than required to store result, only leading part will
|
||||||
|
be overwritten; trailing part will be left unchanged. So if on input
|
||||||
|
XY = [[A,B],[C,D]], and result is [1,2], then on exit we will get
|
||||||
|
XY = [[1,2],[C,D]]. This is done purposely to increase performance; if
|
||||||
|
you want function to resize array according to result size, use
|
||||||
|
function with same name and suffix 'I'.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
* KDTreeQueryResultsX() X-values
|
||||||
|
* KDTreeQueryResultsXY() X- and Y-values
|
||||||
|
* KDTreeQueryResultsTags() tag values
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsdistances(const kdtree &kdt, real_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
X-values from last query; 'interactive' variant for languages like Python
|
||||||
|
which support constructs like "X = KDTreeQueryResultsXI(KDT)" and
|
||||||
|
interactive mode of interpreter.
|
||||||
|
|
||||||
|
This function allocates new array on each call, so it is significantly
|
||||||
|
slower than its 'non-interactive' counterpart, but it is more convenient
|
||||||
|
when you call it from command line.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsxi(const kdtree &kdt, real_2d_array &x);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
XY-values from last query; 'interactive' variant for languages like Python
|
||||||
|
which support constructs like "XY = KDTreeQueryResultsXYI(KDT)" and
|
||||||
|
interactive mode of interpreter.
|
||||||
|
|
||||||
|
This function allocates new array on each call, so it is significantly
|
||||||
|
slower than its 'non-interactive' counterpart, but it is more convenient
|
||||||
|
when you call it from command line.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsxyi(const kdtree &kdt, real_2d_array &xy);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Tags from last query; 'interactive' variant for languages like Python
|
||||||
|
which support constructs like "Tags = KDTreeQueryResultsTagsI(KDT)" and
|
||||||
|
interactive mode of interpreter.
|
||||||
|
|
||||||
|
This function allocates new array on each call, so it is significantly
|
||||||
|
slower than its 'non-interactive' counterpart, but it is more convenient
|
||||||
|
when you call it from command line.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultstagsi(const kdtree &kdt, integer_1d_array &tags);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Distances from last query; 'interactive' variant for languages like Python
|
||||||
|
which support constructs like "R = KDTreeQueryResultsDistancesI(KDT)"
|
||||||
|
and interactive mode of interpreter.
|
||||||
|
|
||||||
|
This function allocates new array on each call, so it is significantly
|
||||||
|
slower than its 'non-interactive' counterpart, but it is more convenient
|
||||||
|
when you call it from command line.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 28.02.2010 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void kdtreequeryresultsdistancesi(const kdtree &kdt, real_1d_array &r);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (FUNCTIONS)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
void hqrndrandomize(hqrndstate* state, ae_state *_state);
|
||||||
|
void hqrndseed(ae_int_t s1,
|
||||||
|
ae_int_t s2,
|
||||||
|
hqrndstate* state,
|
||||||
|
ae_state *_state);
|
||||||
|
double hqrnduniformr(hqrndstate* state, ae_state *_state);
|
||||||
|
ae_int_t hqrnduniformi(hqrndstate* state, ae_int_t n, ae_state *_state);
|
||||||
|
double hqrndnormal(hqrndstate* state, ae_state *_state);
|
||||||
|
void hqrndunit2(hqrndstate* state, double* x, double* y, ae_state *_state);
|
||||||
|
void hqrndnormal2(hqrndstate* state,
|
||||||
|
double* x1,
|
||||||
|
double* x2,
|
||||||
|
ae_state *_state);
|
||||||
|
double hqrndexponential(hqrndstate* state,
|
||||||
|
double lambdav,
|
||||||
|
ae_state *_state);
|
||||||
|
double hqrnddiscrete(hqrndstate* state,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_state *_state);
|
||||||
|
double hqrndcontinuous(hqrndstate* state,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_bool _hqrndstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _hqrndstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _hqrndstate_clear(void* _p);
|
||||||
|
void _hqrndstate_destroy(void* _p);
|
||||||
|
void kdtreebuild(/* Real */ ae_matrix* xy,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t nx,
|
||||||
|
ae_int_t ny,
|
||||||
|
ae_int_t normtype,
|
||||||
|
kdtree* kdt,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreebuildtagged(/* Real */ ae_matrix* xy,
|
||||||
|
/* Integer */ ae_vector* tags,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t nx,
|
||||||
|
ae_int_t ny,
|
||||||
|
ae_int_t normtype,
|
||||||
|
kdtree* kdt,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_int_t kdtreequeryknn(kdtree* kdt,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
ae_int_t k,
|
||||||
|
ae_bool selfmatch,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_int_t kdtreequeryrnn(kdtree* kdt,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
double r,
|
||||||
|
ae_bool selfmatch,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_int_t kdtreequeryaknn(kdtree* kdt,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
ae_int_t k,
|
||||||
|
ae_bool selfmatch,
|
||||||
|
double eps,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsx(kdtree* kdt,
|
||||||
|
/* Real */ ae_matrix* x,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsxy(kdtree* kdt,
|
||||||
|
/* Real */ ae_matrix* xy,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultstags(kdtree* kdt,
|
||||||
|
/* Integer */ ae_vector* tags,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsdistances(kdtree* kdt,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsxi(kdtree* kdt,
|
||||||
|
/* Real */ ae_matrix* x,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsxyi(kdtree* kdt,
|
||||||
|
/* Real */ ae_matrix* xy,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultstagsi(kdtree* kdt,
|
||||||
|
/* Integer */ ae_vector* tags,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreequeryresultsdistancesi(kdtree* kdt,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void kdtreealloc(ae_serializer* s, kdtree* tree, ae_state *_state);
|
||||||
|
void kdtreeserialize(ae_serializer* s, kdtree* tree, ae_state *_state);
|
||||||
|
void kdtreeunserialize(ae_serializer* s, kdtree* tree, ae_state *_state);
|
||||||
|
ae_bool _kdtree_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _kdtree_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _kdtree_clear(void* _p);
|
||||||
|
void _kdtree_destroy(void* _p);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
10661
src/inc/alglib/ap.cpp
Normal file
10661
src/inc/alglib/ap.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1575
src/inc/alglib/ap.h
Normal file
1575
src/inc/alglib/ap.h
Normal file
File diff suppressed because it is too large
Load Diff
35078
src/inc/alglib/dataanalysis.cpp
Normal file
35078
src/inc/alglib/dataanalysis.cpp
Normal file
File diff suppressed because it is too large
Load Diff
7394
src/inc/alglib/dataanalysis.h
Normal file
7394
src/inc/alglib/dataanalysis.h
Normal file
File diff suppressed because it is too large
Load Diff
1187
src/inc/alglib/diffequations.cpp
Normal file
1187
src/inc/alglib/diffequations.cpp
Normal file
File diff suppressed because it is too large
Load Diff
267
src/inc/alglib/diffequations.h
Normal file
267
src/inc/alglib/diffequations.h
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
Copyright (c) Sergey Bochkanov (ALGLIB project).
|
||||||
|
|
||||||
|
>>> SOURCE LICENSE >>>
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation (www.fsf.org); either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
A copy of the GNU General Public License is available at
|
||||||
|
http://www.fsf.org/licensing/licenses
|
||||||
|
>>> END OF LICENSE >>>
|
||||||
|
*************************************************************************/
|
||||||
|
#ifndef _diffequations_pkg_h
|
||||||
|
#define _diffequations_pkg_h
|
||||||
|
#include "ap.h"
|
||||||
|
#include "alglibinternal.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (DATATYPES)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ae_int_t n;
|
||||||
|
ae_int_t m;
|
||||||
|
double xscale;
|
||||||
|
double h;
|
||||||
|
double eps;
|
||||||
|
ae_bool fraceps;
|
||||||
|
ae_vector yc;
|
||||||
|
ae_vector escale;
|
||||||
|
ae_vector xg;
|
||||||
|
ae_int_t solvertype;
|
||||||
|
ae_bool needdy;
|
||||||
|
double x;
|
||||||
|
ae_vector y;
|
||||||
|
ae_vector dy;
|
||||||
|
ae_matrix ytbl;
|
||||||
|
ae_int_t repterminationtype;
|
||||||
|
ae_int_t repnfev;
|
||||||
|
ae_vector yn;
|
||||||
|
ae_vector yns;
|
||||||
|
ae_vector rka;
|
||||||
|
ae_vector rkc;
|
||||||
|
ae_vector rkcs;
|
||||||
|
ae_matrix rkb;
|
||||||
|
ae_matrix rkk;
|
||||||
|
rcommstate rstate;
|
||||||
|
} odesolverstate;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ae_int_t nfev;
|
||||||
|
ae_int_t terminationtype;
|
||||||
|
} odesolverreport;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS C++ INTERFACE
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib
|
||||||
|
{
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
class _odesolverstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_odesolverstate_owner();
|
||||||
|
_odesolverstate_owner(const _odesolverstate_owner &rhs);
|
||||||
|
_odesolverstate_owner& operator=(const _odesolverstate_owner &rhs);
|
||||||
|
virtual ~_odesolverstate_owner();
|
||||||
|
alglib_impl::odesolverstate* c_ptr();
|
||||||
|
alglib_impl::odesolverstate* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::odesolverstate *p_struct;
|
||||||
|
};
|
||||||
|
class odesolverstate : public _odesolverstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
odesolverstate();
|
||||||
|
odesolverstate(const odesolverstate &rhs);
|
||||||
|
odesolverstate& operator=(const odesolverstate &rhs);
|
||||||
|
virtual ~odesolverstate();
|
||||||
|
ae_bool &needdy;
|
||||||
|
real_1d_array y;
|
||||||
|
real_1d_array dy;
|
||||||
|
double &x;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
class _odesolverreport_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_odesolverreport_owner();
|
||||||
|
_odesolverreport_owner(const _odesolverreport_owner &rhs);
|
||||||
|
_odesolverreport_owner& operator=(const _odesolverreport_owner &rhs);
|
||||||
|
virtual ~_odesolverreport_owner();
|
||||||
|
alglib_impl::odesolverreport* c_ptr();
|
||||||
|
alglib_impl::odesolverreport* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::odesolverreport *p_struct;
|
||||||
|
};
|
||||||
|
class odesolverreport : public _odesolverreport_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
odesolverreport();
|
||||||
|
odesolverreport(const odesolverreport &rhs);
|
||||||
|
odesolverreport& operator=(const odesolverreport &rhs);
|
||||||
|
virtual ~odesolverreport();
|
||||||
|
ae_int_t &nfev;
|
||||||
|
ae_int_t &terminationtype;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Cash-Karp adaptive ODE solver.
|
||||||
|
|
||||||
|
This subroutine solves ODE Y'=f(Y,x) with initial conditions Y(xs)=Ys
|
||||||
|
(here Y may be single variable or vector of N variables).
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
Y - initial conditions, array[0..N-1].
|
||||||
|
contains values of Y[] at X[0]
|
||||||
|
N - system size
|
||||||
|
X - points at which Y should be tabulated, array[0..M-1]
|
||||||
|
integrations starts at X[0], ends at X[M-1], intermediate
|
||||||
|
values at X[i] are returned too.
|
||||||
|
SHOULD BE ORDERED BY ASCENDING OR BY DESCENDING!!!!
|
||||||
|
M - number of intermediate points + first point + last point:
|
||||||
|
* M>2 means that you need both Y(X[M-1]) and M-2 values at
|
||||||
|
intermediate points
|
||||||
|
* M=2 means that you want just to integrate from X[0] to
|
||||||
|
X[1] and don't interested in intermediate values.
|
||||||
|
* M=1 means that you don't want to integrate :)
|
||||||
|
it is degenerate case, but it will be handled correctly.
|
||||||
|
* M<1 means error
|
||||||
|
Eps - tolerance (absolute/relative error on each step will be
|
||||||
|
less than Eps). When passing:
|
||||||
|
* Eps>0, it means desired ABSOLUTE error
|
||||||
|
* Eps<0, it means desired RELATIVE error. Relative errors
|
||||||
|
are calculated with respect to maximum values of Y seen
|
||||||
|
so far. Be careful to use this criterion when starting
|
||||||
|
from Y[] that are close to zero.
|
||||||
|
H - initial step lenth, it will be adjusted automatically
|
||||||
|
after the first step. If H=0, step will be selected
|
||||||
|
automatically (usualy it will be equal to 0.001 of
|
||||||
|
min(x[i]-x[j])).
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
State - structure which stores algorithm state between subsequent
|
||||||
|
calls of OdeSolverIteration. Used for reverse communication.
|
||||||
|
This structure should be passed to the OdeSolverIteration
|
||||||
|
subroutine.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
AutoGKSmoothW, AutoGKSingular, AutoGKIteration, AutoGKResults.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 01.09.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void odesolverrkck(const real_1d_array &y, const ae_int_t n, const real_1d_array &x, const ae_int_t m, const double eps, const double h, odesolverstate &state);
|
||||||
|
void odesolverrkck(const real_1d_array &y, const real_1d_array &x, const double eps, const double h, odesolverstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function provides reverse communication interface
|
||||||
|
Reverse communication interface is not documented or recommended to use.
|
||||||
|
See below for functions which provide better documented API
|
||||||
|
*************************************************************************/
|
||||||
|
bool odesolveriteration(const odesolverstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function is used to launcn iterations of ODE solver
|
||||||
|
|
||||||
|
It accepts following parameters:
|
||||||
|
diff - callback which calculates dy/dx for given y and x
|
||||||
|
ptr - optional pointer which is passed to diff; can be NULL
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 01.09.2009 by Bochkanov Sergey
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
void odesolversolve(odesolverstate &state,
|
||||||
|
void (*diff)(const real_1d_array &y, double x, real_1d_array &dy, void *ptr),
|
||||||
|
void *ptr = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
ODE solver results
|
||||||
|
|
||||||
|
Called after OdeSolverIteration returned False.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
State - algorithm state (used by OdeSolverIteration).
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
M - number of tabulated values, M>=1
|
||||||
|
XTbl - array[0..M-1], values of X
|
||||||
|
YTbl - array[0..M-1,0..N-1], values of Y in X[i]
|
||||||
|
Rep - solver report:
|
||||||
|
* Rep.TerminationType completetion code:
|
||||||
|
* -2 X is not ordered by ascending/descending or
|
||||||
|
there are non-distinct X[], i.e. X[i]=X[i+1]
|
||||||
|
* -1 incorrect parameters were specified
|
||||||
|
* 1 task has been solved
|
||||||
|
* Rep.NFEV contains number of function calculations
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 01.09.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void odesolverresults(const odesolverstate &state, ae_int_t &m, real_1d_array &xtbl, real_2d_array &ytbl, odesolverreport &rep);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (FUNCTIONS)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
void odesolverrkck(/* Real */ ae_vector* y,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
ae_int_t m,
|
||||||
|
double eps,
|
||||||
|
double h,
|
||||||
|
odesolverstate* state,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_bool odesolveriteration(odesolverstate* state, ae_state *_state);
|
||||||
|
void odesolverresults(odesolverstate* state,
|
||||||
|
ae_int_t* m,
|
||||||
|
/* Real */ ae_vector* xtbl,
|
||||||
|
/* Real */ ae_matrix* ytbl,
|
||||||
|
odesolverreport* rep,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_bool _odesolverstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _odesolverstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _odesolverstate_clear(void* _p);
|
||||||
|
void _odesolverstate_destroy(void* _p);
|
||||||
|
ae_bool _odesolverreport_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _odesolverreport_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _odesolverreport_clear(void* _p);
|
||||||
|
void _odesolverreport_destroy(void* _p);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
3554
src/inc/alglib/fasttransforms.cpp
Normal file
3554
src/inc/alglib/fasttransforms.cpp
Normal file
File diff suppressed because it is too large
Load Diff
691
src/inc/alglib/fasttransforms.h
Normal file
691
src/inc/alglib/fasttransforms.h
Normal file
@ -0,0 +1,691 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
Copyright (c) Sergey Bochkanov (ALGLIB project).
|
||||||
|
|
||||||
|
>>> SOURCE LICENSE >>>
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation (www.fsf.org); either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
A copy of the GNU General Public License is available at
|
||||||
|
http://www.fsf.org/licensing/licenses
|
||||||
|
>>> END OF LICENSE >>>
|
||||||
|
*************************************************************************/
|
||||||
|
#ifndef _fasttransforms_pkg_h
|
||||||
|
#define _fasttransforms_pkg_h
|
||||||
|
#include "ap.h"
|
||||||
|
#include "alglibinternal.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (DATATYPES)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS C++ INTERFACE
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex FFT.
|
||||||
|
|
||||||
|
Array size N may be arbitrary number (composite or prime). Composite N's
|
||||||
|
are handled with cache-oblivious variation of a Cooley-Tukey algorithm.
|
||||||
|
Small prime-factors are transformed using hard coded codelets (similar to
|
||||||
|
FFTW codelets, but without low-level optimization), large prime-factors
|
||||||
|
are handled with Bluestein's algorithm.
|
||||||
|
|
||||||
|
Fastests transforms are for smooth N's (prime factors are 2, 3, 5 only),
|
||||||
|
most fast for powers of 2. When N have prime factors larger than these,
|
||||||
|
but orders of magnitude smaller than N, computations will be about 4 times
|
||||||
|
slower than for nearby highly composite N's. When N itself is prime, speed
|
||||||
|
will be 6 times lower.
|
||||||
|
|
||||||
|
Algorithm has O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..N-1] - complex function to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
A - DFT of a input array, array[0..N-1]
|
||||||
|
A_out[j] = SUM(A_in[k]*exp(-2*pi*sqrt(-1)*j*k/N), k = 0..N-1)
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 29.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fftc1d(complex_1d_array &a, const ae_int_t n);
|
||||||
|
void fftc1d(complex_1d_array &a);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex inverse FFT.
|
||||||
|
|
||||||
|
Array size N may be arbitrary number (composite or prime). Algorithm has
|
||||||
|
O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
See FFTC1D() description for more information about algorithm performance.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..N-1] - complex array to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
A - inverse DFT of a input array, array[0..N-1]
|
||||||
|
A_out[j] = SUM(A_in[k]/N*exp(+2*pi*sqrt(-1)*j*k/N), k = 0..N-1)
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 29.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fftc1dinv(complex_1d_array &a, const ae_int_t n);
|
||||||
|
void fftc1dinv(complex_1d_array &a);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional real FFT.
|
||||||
|
|
||||||
|
Algorithm has O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..N-1] - real function to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
F - DFT of a input array, array[0..N-1]
|
||||||
|
F[j] = SUM(A[k]*exp(-2*pi*sqrt(-1)*j*k/N), k = 0..N-1)
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
F[] satisfies symmetry property F[k] = conj(F[N-k]), so just one half
|
||||||
|
of array is usually needed. But for convinience subroutine returns full
|
||||||
|
complex array (with frequencies above N/2), so its result may be used by
|
||||||
|
other FFT-related subroutines.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 01.06.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fftr1d(const real_1d_array &a, const ae_int_t n, complex_1d_array &f);
|
||||||
|
void fftr1d(const real_1d_array &a, complex_1d_array &f);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional real inverse FFT.
|
||||||
|
|
||||||
|
Algorithm has O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
F - array[0..floor(N/2)] - frequencies from forward real FFT
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
A - inverse DFT of a input array, array[0..N-1]
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
F[] should satisfy symmetry property F[k] = conj(F[N-k]), so just one
|
||||||
|
half of frequencies array is needed - elements from 0 to floor(N/2). F[0]
|
||||||
|
is ALWAYS real. If N is even F[floor(N/2)] is real too. If N is odd, then
|
||||||
|
F[floor(N/2)] has no special properties.
|
||||||
|
|
||||||
|
Relying on properties noted above, FFTR1DInv subroutine uses only elements
|
||||||
|
from 0th to floor(N/2)-th. It ignores imaginary part of F[0], and in case
|
||||||
|
N is even it ignores imaginary part of F[floor(N/2)] too.
|
||||||
|
|
||||||
|
When you call this function using full arguments list - "FFTR1DInv(F,N,A)"
|
||||||
|
- you can pass either either frequencies array with N elements or reduced
|
||||||
|
array with roughly N/2 elements - subroutine will successfully transform
|
||||||
|
both.
|
||||||
|
|
||||||
|
If you call this function using reduced arguments list - "FFTR1DInv(F,A)"
|
||||||
|
- you must pass FULL array with N elements (although higher N/2 are still
|
||||||
|
not used) because array size is used to automatically determine FFT length
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 01.06.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fftr1dinv(const complex_1d_array &f, const ae_int_t n, real_1d_array &a);
|
||||||
|
void fftr1dinv(const complex_1d_array &f, real_1d_array &a);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex convolution.
|
||||||
|
|
||||||
|
For given A/B returns conv(A,B) (non-circular). Subroutine can automatically
|
||||||
|
choose between three implementations: straightforward O(M*N) formula for
|
||||||
|
very small N (or M), overlap-add algorithm for cases where max(M,N) is
|
||||||
|
significantly larger than min(M,N), but O(M*N) algorithm is too slow, and
|
||||||
|
general FFT-based formula for cases where two previois algorithms are too
|
||||||
|
slow.
|
||||||
|
|
||||||
|
Algorithm has max(M,N)*log(max(M,N)) complexity for any M/N.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - complex function to be transformed
|
||||||
|
M - problem size
|
||||||
|
B - array[0..N-1] - complex function to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..N+M-2].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that A is zero at T<0, B is zero too. If one or both
|
||||||
|
functions have non-zero values at negative T's, you can still use this
|
||||||
|
subroutine - just shift its result correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convc1d(const complex_1d_array &a, const ae_int_t m, const complex_1d_array &b, const ae_int_t n, complex_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex non-circular deconvolution (inverse of ConvC1D()).
|
||||||
|
|
||||||
|
Algorithm has M*log(M)) complexity for any M (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - convolved signal, A = conv(R, B)
|
||||||
|
M - convolved signal length
|
||||||
|
B - array[0..N-1] - response
|
||||||
|
N - response length, N<=M
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - deconvolved signal. array[0..M-N].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
deconvolution is unstable process and may result in division by zero
|
||||||
|
(if your response function is degenerate, i.e. has zero Fourier coefficient).
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that A is zero at T<0, B is zero too. If one or both
|
||||||
|
functions have non-zero values at negative T's, you can still use this
|
||||||
|
subroutine - just shift its result correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convc1dinv(const complex_1d_array &a, const ae_int_t m, const complex_1d_array &b, const ae_int_t n, complex_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional circular complex convolution.
|
||||||
|
|
||||||
|
For given S/R returns conv(S,R) (circular). Algorithm has linearithmic
|
||||||
|
complexity for any M/N.
|
||||||
|
|
||||||
|
IMPORTANT: normal convolution is commutative, i.e. it is symmetric -
|
||||||
|
conv(A,B)=conv(B,A). Cyclic convolution IS NOT. One function - S - is a
|
||||||
|
signal, periodic function, and another - R - is a response, non-periodic
|
||||||
|
function with limited length.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
S - array[0..M-1] - complex periodic signal
|
||||||
|
M - problem size
|
||||||
|
B - array[0..N-1] - complex non-periodic response
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..M-1].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that B is zero at T<0. If it has non-zero values at
|
||||||
|
negative T's, you can still use this subroutine - just shift its result
|
||||||
|
correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convc1dcircular(const complex_1d_array &s, const ae_int_t m, const complex_1d_array &r, const ae_int_t n, complex_1d_array &c);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional circular complex deconvolution (inverse of ConvC1DCircular()).
|
||||||
|
|
||||||
|
Algorithm has M*log(M)) complexity for any M (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - convolved periodic signal, A = conv(R, B)
|
||||||
|
M - convolved signal length
|
||||||
|
B - array[0..N-1] - non-periodic response
|
||||||
|
N - response length
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - deconvolved signal. array[0..M-1].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
deconvolution is unstable process and may result in division by zero
|
||||||
|
(if your response function is degenerate, i.e. has zero Fourier coefficient).
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that B is zero at T<0. If it has non-zero values at
|
||||||
|
negative T's, you can still use this subroutine - just shift its result
|
||||||
|
correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convc1dcircularinv(const complex_1d_array &a, const ae_int_t m, const complex_1d_array &b, const ae_int_t n, complex_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional real convolution.
|
||||||
|
|
||||||
|
Analogous to ConvC1D(), see ConvC1D() comments for more details.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - real function to be transformed
|
||||||
|
M - problem size
|
||||||
|
B - array[0..N-1] - real function to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..N+M-2].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that A is zero at T<0, B is zero too. If one or both
|
||||||
|
functions have non-zero values at negative T's, you can still use this
|
||||||
|
subroutine - just shift its result correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convr1d(const real_1d_array &a, const ae_int_t m, const real_1d_array &b, const ae_int_t n, real_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional real deconvolution (inverse of ConvC1D()).
|
||||||
|
|
||||||
|
Algorithm has M*log(M)) complexity for any M (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - convolved signal, A = conv(R, B)
|
||||||
|
M - convolved signal length
|
||||||
|
B - array[0..N-1] - response
|
||||||
|
N - response length, N<=M
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - deconvolved signal. array[0..M-N].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
deconvolution is unstable process and may result in division by zero
|
||||||
|
(if your response function is degenerate, i.e. has zero Fourier coefficient).
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that A is zero at T<0, B is zero too. If one or both
|
||||||
|
functions have non-zero values at negative T's, you can still use this
|
||||||
|
subroutine - just shift its result correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convr1dinv(const real_1d_array &a, const ae_int_t m, const real_1d_array &b, const ae_int_t n, real_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional circular real convolution.
|
||||||
|
|
||||||
|
Analogous to ConvC1DCircular(), see ConvC1DCircular() comments for more details.
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
S - array[0..M-1] - real signal
|
||||||
|
M - problem size
|
||||||
|
B - array[0..N-1] - real response
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..M-1].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that B is zero at T<0. If it has non-zero values at
|
||||||
|
negative T's, you can still use this subroutine - just shift its result
|
||||||
|
correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convr1dcircular(const real_1d_array &s, const ae_int_t m, const real_1d_array &r, const ae_int_t n, real_1d_array &c);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex deconvolution (inverse of ConvC1D()).
|
||||||
|
|
||||||
|
Algorithm has M*log(M)) complexity for any M (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..M-1] - convolved signal, A = conv(R, B)
|
||||||
|
M - convolved signal length
|
||||||
|
B - array[0..N-1] - response
|
||||||
|
N - response length
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - deconvolved signal. array[0..M-N].
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
deconvolution is unstable process and may result in division by zero
|
||||||
|
(if your response function is degenerate, i.e. has zero Fourier coefficient).
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that B is zero at T<0. If it has non-zero values at
|
||||||
|
negative T's, you can still use this subroutine - just shift its result
|
||||||
|
correspondingly.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void convr1dcircularinv(const real_1d_array &a, const ae_int_t m, const real_1d_array &b, const ae_int_t n, real_1d_array &r);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional complex cross-correlation.
|
||||||
|
|
||||||
|
For given Pattern/Signal returns corr(Pattern,Signal) (non-circular).
|
||||||
|
|
||||||
|
Correlation is calculated using reduction to convolution. Algorithm with
|
||||||
|
max(N,N)*log(max(N,N)) complexity is used (see ConvC1D() for more info
|
||||||
|
about performance).
|
||||||
|
|
||||||
|
IMPORTANT:
|
||||||
|
for historical reasons subroutine accepts its parameters in reversed
|
||||||
|
order: CorrC1D(Signal, Pattern) = Pattern x Signal (using traditional
|
||||||
|
definition of cross-correlation, denoting cross-correlation as "x").
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
Signal - array[0..N-1] - complex function to be transformed,
|
||||||
|
signal containing pattern
|
||||||
|
N - problem size
|
||||||
|
Pattern - array[0..M-1] - complex function to be transformed,
|
||||||
|
pattern to search withing signal
|
||||||
|
M - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - cross-correlation, array[0..N+M-2]:
|
||||||
|
* positive lags are stored in R[0..N-1],
|
||||||
|
R[i] = sum(conj(pattern[j])*signal[i+j]
|
||||||
|
* negative lags are stored in R[N..N+M-2],
|
||||||
|
R[N+M-1-i] = sum(conj(pattern[j])*signal[-i+j]
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that pattern domain is [0..M-1]. If Pattern is non-zero
|
||||||
|
on [-K..M-1], you can still use this subroutine, just shift result by K.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void corrc1d(const complex_1d_array &signal, const ae_int_t n, const complex_1d_array &pattern, const ae_int_t m, complex_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional circular complex cross-correlation.
|
||||||
|
|
||||||
|
For given Pattern/Signal returns corr(Pattern,Signal) (circular).
|
||||||
|
Algorithm has linearithmic complexity for any M/N.
|
||||||
|
|
||||||
|
IMPORTANT:
|
||||||
|
for historical reasons subroutine accepts its parameters in reversed
|
||||||
|
order: CorrC1DCircular(Signal, Pattern) = Pattern x Signal (using
|
||||||
|
traditional definition of cross-correlation, denoting cross-correlation
|
||||||
|
as "x").
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
Signal - array[0..N-1] - complex function to be transformed,
|
||||||
|
periodic signal containing pattern
|
||||||
|
N - problem size
|
||||||
|
Pattern - array[0..M-1] - complex function to be transformed,
|
||||||
|
non-periodic pattern to search withing signal
|
||||||
|
M - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..M-1].
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void corrc1dcircular(const complex_1d_array &signal, const ae_int_t m, const complex_1d_array &pattern, const ae_int_t n, complex_1d_array &c);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional real cross-correlation.
|
||||||
|
|
||||||
|
For given Pattern/Signal returns corr(Pattern,Signal) (non-circular).
|
||||||
|
|
||||||
|
Correlation is calculated using reduction to convolution. Algorithm with
|
||||||
|
max(N,N)*log(max(N,N)) complexity is used (see ConvC1D() for more info
|
||||||
|
about performance).
|
||||||
|
|
||||||
|
IMPORTANT:
|
||||||
|
for historical reasons subroutine accepts its parameters in reversed
|
||||||
|
order: CorrR1D(Signal, Pattern) = Pattern x Signal (using traditional
|
||||||
|
definition of cross-correlation, denoting cross-correlation as "x").
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
Signal - array[0..N-1] - real function to be transformed,
|
||||||
|
signal containing pattern
|
||||||
|
N - problem size
|
||||||
|
Pattern - array[0..M-1] - real function to be transformed,
|
||||||
|
pattern to search withing signal
|
||||||
|
M - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - cross-correlation, array[0..N+M-2]:
|
||||||
|
* positive lags are stored in R[0..N-1],
|
||||||
|
R[i] = sum(pattern[j]*signal[i+j]
|
||||||
|
* negative lags are stored in R[N..N+M-2],
|
||||||
|
R[N+M-1-i] = sum(pattern[j]*signal[-i+j]
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
It is assumed that pattern domain is [0..M-1]. If Pattern is non-zero
|
||||||
|
on [-K..M-1], you can still use this subroutine, just shift result by K.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void corrr1d(const real_1d_array &signal, const ae_int_t n, const real_1d_array &pattern, const ae_int_t m, real_1d_array &r);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional circular real cross-correlation.
|
||||||
|
|
||||||
|
For given Pattern/Signal returns corr(Pattern,Signal) (circular).
|
||||||
|
Algorithm has linearithmic complexity for any M/N.
|
||||||
|
|
||||||
|
IMPORTANT:
|
||||||
|
for historical reasons subroutine accepts its parameters in reversed
|
||||||
|
order: CorrR1DCircular(Signal, Pattern) = Pattern x Signal (using
|
||||||
|
traditional definition of cross-correlation, denoting cross-correlation
|
||||||
|
as "x").
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
Signal - array[0..N-1] - real function to be transformed,
|
||||||
|
periodic signal containing pattern
|
||||||
|
N - problem size
|
||||||
|
Pattern - array[0..M-1] - real function to be transformed,
|
||||||
|
non-periodic pattern to search withing signal
|
||||||
|
M - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
R - convolution: A*B. array[0..M-1].
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 21.07.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void corrr1dcircular(const real_1d_array &signal, const ae_int_t m, const real_1d_array &pattern, const ae_int_t n, real_1d_array &c);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional Fast Hartley Transform.
|
||||||
|
|
||||||
|
Algorithm has O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..N-1] - real function to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
A - FHT of a input array, array[0..N-1],
|
||||||
|
A_out[k] = sum(A_in[j]*(cos(2*pi*j*k/N)+sin(2*pi*j*k/N)), j=0..N-1)
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 04.06.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fhtr1d(real_1d_array &a, const ae_int_t n);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
1-dimensional inverse FHT.
|
||||||
|
|
||||||
|
Algorithm has O(N*logN) complexity for any N (composite or prime).
|
||||||
|
|
||||||
|
INPUT PARAMETERS
|
||||||
|
A - array[0..N-1] - complex array to be transformed
|
||||||
|
N - problem size
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
A - inverse FHT of a input array, array[0..N-1]
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 29.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void fhtr1dinv(real_1d_array &a, const ae_int_t n);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (FUNCTIONS)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
void fftc1d(/* Complex */ ae_vector* a, ae_int_t n, ae_state *_state);
|
||||||
|
void fftc1dinv(/* Complex */ ae_vector* a, ae_int_t n, ae_state *_state);
|
||||||
|
void fftr1d(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* f,
|
||||||
|
ae_state *_state);
|
||||||
|
void fftr1dinv(/* Complex */ ae_vector* f,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* a,
|
||||||
|
ae_state *_state);
|
||||||
|
void fftr1dinternaleven(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* buf,
|
||||||
|
fasttransformplan* plan,
|
||||||
|
ae_state *_state);
|
||||||
|
void fftr1dinvinternaleven(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* buf,
|
||||||
|
fasttransformplan* plan,
|
||||||
|
ae_state *_state);
|
||||||
|
void convc1d(/* Complex */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convc1dinv(/* Complex */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convc1dcircular(/* Complex */ ae_vector* s,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* c,
|
||||||
|
ae_state *_state);
|
||||||
|
void convc1dcircularinv(/* Complex */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convr1d(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convr1dinv(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convr1dcircular(/* Real */ ae_vector* s,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* c,
|
||||||
|
ae_state *_state);
|
||||||
|
void convr1dcircularinv(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convc1dx(/* Complex */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_bool circular,
|
||||||
|
ae_int_t alg,
|
||||||
|
ae_int_t q,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void convr1dx(/* Real */ ae_vector* a,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* b,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_bool circular,
|
||||||
|
ae_int_t alg,
|
||||||
|
ae_int_t q,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void corrc1d(/* Complex */ ae_vector* signal,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* pattern,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void corrc1dcircular(/* Complex */ ae_vector* signal,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Complex */ ae_vector* pattern,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Complex */ ae_vector* c,
|
||||||
|
ae_state *_state);
|
||||||
|
void corrr1d(/* Real */ ae_vector* signal,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* pattern,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* r,
|
||||||
|
ae_state *_state);
|
||||||
|
void corrr1dcircular(/* Real */ ae_vector* signal,
|
||||||
|
ae_int_t m,
|
||||||
|
/* Real */ ae_vector* pattern,
|
||||||
|
ae_int_t n,
|
||||||
|
/* Real */ ae_vector* c,
|
||||||
|
ae_state *_state);
|
||||||
|
void fhtr1d(/* Real */ ae_vector* a, ae_int_t n, ae_state *_state);
|
||||||
|
void fhtr1dinv(/* Real */ ae_vector* a, ae_int_t n, ae_state *_state);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
3961
src/inc/alglib/integration.cpp
Normal file
3961
src/inc/alglib/integration.cpp
Normal file
File diff suppressed because it is too large
Load Diff
837
src/inc/alglib/integration.h
Normal file
837
src/inc/alglib/integration.h
Normal file
@ -0,0 +1,837 @@
|
|||||||
|
/*************************************************************************
|
||||||
|
Copyright (c) Sergey Bochkanov (ALGLIB project).
|
||||||
|
|
||||||
|
>>> SOURCE LICENSE >>>
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation (www.fsf.org); either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
A copy of the GNU General Public License is available at
|
||||||
|
http://www.fsf.org/licensing/licenses
|
||||||
|
>>> END OF LICENSE >>>
|
||||||
|
*************************************************************************/
|
||||||
|
#ifndef _integration_pkg_h
|
||||||
|
#define _integration_pkg_h
|
||||||
|
#include "ap.h"
|
||||||
|
#include "alglibinternal.h"
|
||||||
|
#include "linalg.h"
|
||||||
|
#include "specialfunctions.h"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (DATATYPES)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
ae_int_t terminationtype;
|
||||||
|
ae_int_t nfev;
|
||||||
|
ae_int_t nintervals;
|
||||||
|
} autogkreport;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double a;
|
||||||
|
double b;
|
||||||
|
double eps;
|
||||||
|
double xwidth;
|
||||||
|
double x;
|
||||||
|
double f;
|
||||||
|
ae_int_t info;
|
||||||
|
double r;
|
||||||
|
ae_matrix heap;
|
||||||
|
ae_int_t heapsize;
|
||||||
|
ae_int_t heapwidth;
|
||||||
|
ae_int_t heapused;
|
||||||
|
double sumerr;
|
||||||
|
double sumabs;
|
||||||
|
ae_vector qn;
|
||||||
|
ae_vector wg;
|
||||||
|
ae_vector wk;
|
||||||
|
ae_vector wr;
|
||||||
|
ae_int_t n;
|
||||||
|
rcommstate rstate;
|
||||||
|
} autogkinternalstate;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double a;
|
||||||
|
double b;
|
||||||
|
double alpha;
|
||||||
|
double beta;
|
||||||
|
double xwidth;
|
||||||
|
double x;
|
||||||
|
double xminusa;
|
||||||
|
double bminusx;
|
||||||
|
ae_bool needf;
|
||||||
|
double f;
|
||||||
|
ae_int_t wrappermode;
|
||||||
|
autogkinternalstate internalstate;
|
||||||
|
rcommstate rstate;
|
||||||
|
double v;
|
||||||
|
ae_int_t terminationtype;
|
||||||
|
ae_int_t nfev;
|
||||||
|
ae_int_t nintervals;
|
||||||
|
} autogkstate;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS C++ INTERFACE
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Integration report:
|
||||||
|
* TerminationType = completetion code:
|
||||||
|
* -5 non-convergence of Gauss-Kronrod nodes
|
||||||
|
calculation subroutine.
|
||||||
|
* -1 incorrect parameters were specified
|
||||||
|
* 1 OK
|
||||||
|
* Rep.NFEV countains number of function calculations
|
||||||
|
* Rep.NIntervals contains number of intervals [a,b]
|
||||||
|
was partitioned into.
|
||||||
|
*************************************************************************/
|
||||||
|
class _autogkreport_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_autogkreport_owner();
|
||||||
|
_autogkreport_owner(const _autogkreport_owner &rhs);
|
||||||
|
_autogkreport_owner& operator=(const _autogkreport_owner &rhs);
|
||||||
|
virtual ~_autogkreport_owner();
|
||||||
|
alglib_impl::autogkreport* c_ptr();
|
||||||
|
alglib_impl::autogkreport* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::autogkreport *p_struct;
|
||||||
|
};
|
||||||
|
class autogkreport : public _autogkreport_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
autogkreport();
|
||||||
|
autogkreport(const autogkreport &rhs);
|
||||||
|
autogkreport& operator=(const autogkreport &rhs);
|
||||||
|
virtual ~autogkreport();
|
||||||
|
ae_int_t &terminationtype;
|
||||||
|
ae_int_t &nfev;
|
||||||
|
ae_int_t &nintervals;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This structure stores state of the integration algorithm.
|
||||||
|
|
||||||
|
Although this class has public fields, they are not intended for external
|
||||||
|
use. You should use ALGLIB functions to work with this class:
|
||||||
|
* autogksmooth()/AutoGKSmoothW()/... to create objects
|
||||||
|
* autogkintegrate() to begin integration
|
||||||
|
* autogkresults() to get results
|
||||||
|
*************************************************************************/
|
||||||
|
class _autogkstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
_autogkstate_owner();
|
||||||
|
_autogkstate_owner(const _autogkstate_owner &rhs);
|
||||||
|
_autogkstate_owner& operator=(const _autogkstate_owner &rhs);
|
||||||
|
virtual ~_autogkstate_owner();
|
||||||
|
alglib_impl::autogkstate* c_ptr();
|
||||||
|
alglib_impl::autogkstate* c_ptr() const;
|
||||||
|
protected:
|
||||||
|
alglib_impl::autogkstate *p_struct;
|
||||||
|
};
|
||||||
|
class autogkstate : public _autogkstate_owner
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
autogkstate();
|
||||||
|
autogkstate(const autogkstate &rhs);
|
||||||
|
autogkstate& operator=(const autogkstate &rhs);
|
||||||
|
virtual ~autogkstate();
|
||||||
|
ae_bool &needf;
|
||||||
|
double &x;
|
||||||
|
double &xminusa;
|
||||||
|
double &bminusx;
|
||||||
|
double &f;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Computation of nodes and weights for a Gauss quadrature formula
|
||||||
|
|
||||||
|
The algorithm generates the N-point Gauss quadrature formula with weight
|
||||||
|
function given by coefficients alpha and beta of a recurrence relation
|
||||||
|
which generates a system of orthogonal polynomials:
|
||||||
|
|
||||||
|
P-1(x) = 0
|
||||||
|
P0(x) = 1
|
||||||
|
Pn+1(x) = (x-alpha(n))*Pn(x) - beta(n)*Pn-1(x)
|
||||||
|
|
||||||
|
and zeroth moment Mu0
|
||||||
|
|
||||||
|
Mu0 = integral(W(x)dx,a,b)
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
Alpha – array[0..N-1], alpha coefficients
|
||||||
|
Beta – array[0..N-1], beta coefficients
|
||||||
|
Zero-indexed element is not used and may be arbitrary.
|
||||||
|
Beta[I]>0.
|
||||||
|
Mu0 – zeroth moment of the weight function.
|
||||||
|
N – number of nodes of the quadrature formula, N>=1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -2 Beta[i]<=0
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* 1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 2005-2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgeneraterec(const real_1d_array &alpha, const real_1d_array &beta, const double mu0, const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Computation of nodes and weights for a Gauss-Lobatto quadrature formula
|
||||||
|
|
||||||
|
The algorithm generates the N-point Gauss-Lobatto quadrature formula with
|
||||||
|
weight function given by coefficients alpha and beta of a recurrence which
|
||||||
|
generates a system of orthogonal polynomials.
|
||||||
|
|
||||||
|
P-1(x) = 0
|
||||||
|
P0(x) = 1
|
||||||
|
Pn+1(x) = (x-alpha(n))*Pn(x) - beta(n)*Pn-1(x)
|
||||||
|
|
||||||
|
and zeroth moment Mu0
|
||||||
|
|
||||||
|
Mu0 = integral(W(x)dx,a,b)
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
Alpha – array[0..N-2], alpha coefficients
|
||||||
|
Beta – array[0..N-2], beta coefficients.
|
||||||
|
Zero-indexed element is not used, may be arbitrary.
|
||||||
|
Beta[I]>0
|
||||||
|
Mu0 – zeroth moment of the weighting function.
|
||||||
|
A – left boundary of the integration interval.
|
||||||
|
B – right boundary of the integration interval.
|
||||||
|
N – number of nodes of the quadrature formula, N>=3
|
||||||
|
(including the left and right boundary nodes).
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -2 Beta[i]<=0
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* 1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 2005-2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategausslobattorec(const real_1d_array &alpha, const real_1d_array &beta, const double mu0, const double a, const double b, const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Computation of nodes and weights for a Gauss-Radau quadrature formula
|
||||||
|
|
||||||
|
The algorithm generates the N-point Gauss-Radau quadrature formula with
|
||||||
|
weight function given by the coefficients alpha and beta of a recurrence
|
||||||
|
which generates a system of orthogonal polynomials.
|
||||||
|
|
||||||
|
P-1(x) = 0
|
||||||
|
P0(x) = 1
|
||||||
|
Pn+1(x) = (x-alpha(n))*Pn(x) - beta(n)*Pn-1(x)
|
||||||
|
|
||||||
|
and zeroth moment Mu0
|
||||||
|
|
||||||
|
Mu0 = integral(W(x)dx,a,b)
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
Alpha – array[0..N-2], alpha coefficients.
|
||||||
|
Beta – array[0..N-1], beta coefficients
|
||||||
|
Zero-indexed element is not used.
|
||||||
|
Beta[I]>0
|
||||||
|
Mu0 – zeroth moment of the weighting function.
|
||||||
|
A – left boundary of the integration interval.
|
||||||
|
N – number of nodes of the quadrature formula, N>=2
|
||||||
|
(including the left boundary node).
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -2 Beta[i]<=0
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* 1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 2005-2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategaussradaurec(const real_1d_array &alpha, const real_1d_array &beta, const double mu0, const double a, const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns nodes/weights for Gauss-Legendre quadrature on [-1,1] with N
|
||||||
|
nodes.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of nodes, >=1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. N is too large to obtain
|
||||||
|
weights/nodes with high enough accuracy.
|
||||||
|
Try to use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategausslegendre(const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns nodes/weights for Gauss-Jacobi quadrature on [-1,1] with weight
|
||||||
|
function W(x)=Power(1-x,Alpha)*Power(1+x,Beta).
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of nodes, >=1
|
||||||
|
Alpha - power-law coefficient, Alpha>-1
|
||||||
|
Beta - power-law coefficient, Beta>-1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. Alpha or Beta are too close
|
||||||
|
to -1 to obtain weights/nodes with high enough
|
||||||
|
accuracy, or, may be, N is too large. Try to
|
||||||
|
use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N/Alpha/Beta was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategaussjacobi(const ae_int_t n, const double alpha, const double beta, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns nodes/weights for Gauss-Laguerre quadrature on [0,+inf) with
|
||||||
|
weight function W(x)=Power(x,Alpha)*Exp(-x)
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of nodes, >=1
|
||||||
|
Alpha - power-law coefficient, Alpha>-1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. Alpha is too close to -1 to
|
||||||
|
obtain weights/nodes with high enough accuracy
|
||||||
|
or, may be, N is too large. Try to use
|
||||||
|
multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N/Alpha was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategausslaguerre(const ae_int_t n, const double alpha, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns nodes/weights for Gauss-Hermite quadrature on (-inf,+inf) with
|
||||||
|
weight function W(x)=Exp(-x*x)
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of nodes, >=1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. May be, N is too large. Try to
|
||||||
|
use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N/Alpha was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
W - array[0..N-1] - array of quadrature weights.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gqgenerategausshermite(const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &w);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Computation of nodes and weights of a Gauss-Kronrod quadrature formula
|
||||||
|
|
||||||
|
The algorithm generates the N-point Gauss-Kronrod quadrature formula with
|
||||||
|
weight function given by coefficients alpha and beta of a recurrence
|
||||||
|
relation which generates a system of orthogonal polynomials:
|
||||||
|
|
||||||
|
P-1(x) = 0
|
||||||
|
P0(x) = 1
|
||||||
|
Pn+1(x) = (x-alpha(n))*Pn(x) - beta(n)*Pn-1(x)
|
||||||
|
|
||||||
|
and zero moment Mu0
|
||||||
|
|
||||||
|
Mu0 = integral(W(x)dx,a,b)
|
||||||
|
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
Alpha – alpha coefficients, array[0..floor(3*K/2)].
|
||||||
|
Beta – beta coefficients, array[0..ceil(3*K/2)].
|
||||||
|
Beta[0] is not used and may be arbitrary.
|
||||||
|
Beta[I]>0.
|
||||||
|
Mu0 – zeroth moment of the weight function.
|
||||||
|
N – number of nodes of the Gauss-Kronrod quadrature formula,
|
||||||
|
N >= 3,
|
||||||
|
N = 2*K+1.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -5 no real and positive Gauss-Kronrod formula can
|
||||||
|
be created for such a weight function with a
|
||||||
|
given number of nodes.
|
||||||
|
* -4 N is too large, task may be ill conditioned -
|
||||||
|
x[i]=x[i+1] found.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -2 Beta[i]<=0
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes,
|
||||||
|
in ascending order.
|
||||||
|
WKronrod - array[0..N-1] - Kronrod weights
|
||||||
|
WGauss - array[0..N-1] - Gauss weights (interleaved with zeros
|
||||||
|
corresponding to extended Kronrod nodes).
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 08.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gkqgeneraterec(const real_1d_array &alpha, const real_1d_array &beta, const double mu0, const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &wkronrod, real_1d_array &wgauss);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns Gauss and Gauss-Kronrod nodes/weights for Gauss-Legendre
|
||||||
|
quadrature with N points.
|
||||||
|
|
||||||
|
GKQLegendreCalc (calculation) or GKQLegendreTbl (precomputed table) is
|
||||||
|
used depending on machine precision and number of nodes.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of Kronrod nodes, must be odd number, >=3.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. N is too large to obtain
|
||||||
|
weights/nodes with high enough accuracy.
|
||||||
|
Try to use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes, ordered in
|
||||||
|
ascending order.
|
||||||
|
WKronrod - array[0..N-1] - Kronrod weights
|
||||||
|
WGauss - array[0..N-1] - Gauss weights (interleaved with zeros
|
||||||
|
corresponding to extended Kronrod nodes).
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gkqgenerategausslegendre(const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &wkronrod, real_1d_array &wgauss);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns Gauss and Gauss-Kronrod nodes/weights for Gauss-Jacobi
|
||||||
|
quadrature on [-1,1] with weight function
|
||||||
|
|
||||||
|
W(x)=Power(1-x,Alpha)*Power(1+x,Beta).
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of Kronrod nodes, must be odd number, >=3.
|
||||||
|
Alpha - power-law coefficient, Alpha>-1
|
||||||
|
Beta - power-law coefficient, Beta>-1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -5 no real and positive Gauss-Kronrod formula can
|
||||||
|
be created for such a weight function with a
|
||||||
|
given number of nodes.
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. Alpha or Beta are too close
|
||||||
|
to -1 to obtain weights/nodes with high enough
|
||||||
|
accuracy, or, may be, N is too large. Try to
|
||||||
|
use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* +1 OK
|
||||||
|
* +2 OK, but quadrature rule have exterior nodes,
|
||||||
|
x[0]<-1 or x[n-1]>+1
|
||||||
|
X - array[0..N-1] - array of quadrature nodes, ordered in
|
||||||
|
ascending order.
|
||||||
|
WKronrod - array[0..N-1] - Kronrod weights
|
||||||
|
WGauss - array[0..N-1] - Gauss weights (interleaved with zeros
|
||||||
|
corresponding to extended Kronrod nodes).
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gkqgenerategaussjacobi(const ae_int_t n, const double alpha, const double beta, ae_int_t &info, real_1d_array &x, real_1d_array &wkronrod, real_1d_array &wgauss);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns Gauss and Gauss-Kronrod nodes for quadrature with N points.
|
||||||
|
|
||||||
|
Reduction to tridiagonal eigenproblem is used.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of Kronrod nodes, must be odd number, >=3.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
Info - error code:
|
||||||
|
* -4 an error was detected when calculating
|
||||||
|
weights/nodes. N is too large to obtain
|
||||||
|
weights/nodes with high enough accuracy.
|
||||||
|
Try to use multiple precision version.
|
||||||
|
* -3 internal eigenproblem solver hasn't converged
|
||||||
|
* -1 incorrect N was passed
|
||||||
|
* +1 OK
|
||||||
|
X - array[0..N-1] - array of quadrature nodes, ordered in
|
||||||
|
ascending order.
|
||||||
|
WKronrod - array[0..N-1] - Kronrod weights
|
||||||
|
WGauss - array[0..N-1] - Gauss weights (interleaved with zeros
|
||||||
|
corresponding to extended Kronrod nodes).
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gkqlegendrecalc(const ae_int_t n, ae_int_t &info, real_1d_array &x, real_1d_array &wkronrod, real_1d_array &wgauss);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Returns Gauss and Gauss-Kronrod nodes for quadrature with N points using
|
||||||
|
pre-calculated table. Nodes/weights were computed with accuracy up to
|
||||||
|
1.0E-32 (if MPFR version of ALGLIB is used). In standard double precision
|
||||||
|
accuracy reduces to something about 2.0E-16 (depending on your compiler's
|
||||||
|
handling of long floating point constants).
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
N - number of Kronrod nodes.
|
||||||
|
N can be 15, 21, 31, 41, 51, 61.
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS:
|
||||||
|
X - array[0..N-1] - array of quadrature nodes, ordered in
|
||||||
|
ascending order.
|
||||||
|
WKronrod - array[0..N-1] - Kronrod weights
|
||||||
|
WGauss - array[0..N-1] - Gauss weights (interleaved with zeros
|
||||||
|
corresponding to extended Kronrod nodes).
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 12.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void gkqlegendretbl(const ae_int_t n, real_1d_array &x, real_1d_array &wkronrod, real_1d_array &wgauss, double &eps);
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Integration of a smooth function F(x) on a finite interval [a,b].
|
||||||
|
|
||||||
|
Fast-convergent algorithm based on a Gauss-Kronrod formula is used. Result
|
||||||
|
is calculated with accuracy close to the machine precision.
|
||||||
|
|
||||||
|
Algorithm works well only with smooth integrands. It may be used with
|
||||||
|
continuous non-smooth integrands, but with less performance.
|
||||||
|
|
||||||
|
It should never be used with integrands which have integrable singularities
|
||||||
|
at lower or upper limits - algorithm may crash. Use AutoGKSingular in such
|
||||||
|
cases.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
A, B - interval boundaries (A<B, A=B or A>B)
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
State - structure which stores algorithm state
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
AutoGKSmoothW, AutoGKSingular, AutoGKResults.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 06.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void autogksmooth(const double a, const double b, autogkstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Integration of a smooth function F(x) on a finite interval [a,b].
|
||||||
|
|
||||||
|
This subroutine is same as AutoGKSmooth(), but it guarantees that interval
|
||||||
|
[a,b] is partitioned into subintervals which have width at most XWidth.
|
||||||
|
|
||||||
|
Subroutine can be used when integrating nearly-constant function with
|
||||||
|
narrow "bumps" (about XWidth wide). If "bumps" are too narrow, AutoGKSmooth
|
||||||
|
subroutine can overlook them.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
A, B - interval boundaries (A<B, A=B or A>B)
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
State - structure which stores algorithm state
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
AutoGKSmooth, AutoGKSingular, AutoGKResults.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 06.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void autogksmoothw(const double a, const double b, const double xwidth, autogkstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Integration on a finite interval [A,B].
|
||||||
|
Integrand have integrable singularities at A/B.
|
||||||
|
|
||||||
|
F(X) must diverge as "(x-A)^alpha" at A, as "(B-x)^beta" at B, with known
|
||||||
|
alpha/beta (alpha>-1, beta>-1). If alpha/beta are not known, estimates
|
||||||
|
from below can be used (but these estimates should be greater than -1 too).
|
||||||
|
|
||||||
|
One of alpha/beta variables (or even both alpha/beta) may be equal to 0,
|
||||||
|
which means than function F(x) is non-singular at A/B. Anyway (singular at
|
||||||
|
bounds or not), function F(x) is supposed to be continuous on (A,B).
|
||||||
|
|
||||||
|
Fast-convergent algorithm based on a Gauss-Kronrod formula is used. Result
|
||||||
|
is calculated with accuracy close to the machine precision.
|
||||||
|
|
||||||
|
INPUT PARAMETERS:
|
||||||
|
A, B - interval boundaries (A<B, A=B or A>B)
|
||||||
|
Alpha - power-law coefficient of the F(x) at A,
|
||||||
|
Alpha>-1
|
||||||
|
Beta - power-law coefficient of the F(x) at B,
|
||||||
|
Beta>-1
|
||||||
|
|
||||||
|
OUTPUT PARAMETERS
|
||||||
|
State - structure which stores algorithm state
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
AutoGKSmooth, AutoGKSmoothW, AutoGKResults.
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 06.05.2009 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void autogksingular(const double a, const double b, const double alpha, const double beta, autogkstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function provides reverse communication interface
|
||||||
|
Reverse communication interface is not documented or recommended to use.
|
||||||
|
See below for functions which provide better documented API
|
||||||
|
*************************************************************************/
|
||||||
|
bool autogkiteration(const autogkstate &state);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
This function is used to launcn iterations of the 1-dimensional integrator
|
||||||
|
|
||||||
|
It accepts following parameters:
|
||||||
|
func - callback which calculates f(x) for given x
|
||||||
|
ptr - optional pointer which is passed to func; can be NULL
|
||||||
|
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 07.05.2009 by Bochkanov Sergey
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
void autogkintegrate(autogkstate &state,
|
||||||
|
void (*func)(double x, double xminusa, double bminusx, double &y, void *ptr),
|
||||||
|
void *ptr = NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
Adaptive integration results
|
||||||
|
|
||||||
|
Called after AutoGKIteration returned False.
|
||||||
|
|
||||||
|
Input parameters:
|
||||||
|
State - algorithm state (used by AutoGKIteration).
|
||||||
|
|
||||||
|
Output parameters:
|
||||||
|
V - integral(f(x)dx,a,b)
|
||||||
|
Rep - optimization report (see AutoGKReport description)
|
||||||
|
|
||||||
|
-- ALGLIB --
|
||||||
|
Copyright 14.11.2007 by Bochkanov Sergey
|
||||||
|
*************************************************************************/
|
||||||
|
void autogkresults(const autogkstate &state, double &v, autogkreport &rep);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// THIS SECTION CONTAINS COMPUTATIONAL CORE DECLARATIONS (FUNCTIONS)
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
namespace alglib_impl
|
||||||
|
{
|
||||||
|
void gqgeneraterec(/* Real */ ae_vector* alpha,
|
||||||
|
/* Real */ ae_vector* beta,
|
||||||
|
double mu0,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategausslobattorec(/* Real */ ae_vector* alpha,
|
||||||
|
/* Real */ ae_vector* beta,
|
||||||
|
double mu0,
|
||||||
|
double a,
|
||||||
|
double b,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategaussradaurec(/* Real */ ae_vector* alpha,
|
||||||
|
/* Real */ ae_vector* beta,
|
||||||
|
double mu0,
|
||||||
|
double a,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategausslegendre(ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategaussjacobi(ae_int_t n,
|
||||||
|
double alpha,
|
||||||
|
double beta,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategausslaguerre(ae_int_t n,
|
||||||
|
double alpha,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gqgenerategausshermite(ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* w,
|
||||||
|
ae_state *_state);
|
||||||
|
void gkqgeneraterec(/* Real */ ae_vector* alpha,
|
||||||
|
/* Real */ ae_vector* beta,
|
||||||
|
double mu0,
|
||||||
|
ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* wkronrod,
|
||||||
|
/* Real */ ae_vector* wgauss,
|
||||||
|
ae_state *_state);
|
||||||
|
void gkqgenerategausslegendre(ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* wkronrod,
|
||||||
|
/* Real */ ae_vector* wgauss,
|
||||||
|
ae_state *_state);
|
||||||
|
void gkqgenerategaussjacobi(ae_int_t n,
|
||||||
|
double alpha,
|
||||||
|
double beta,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* wkronrod,
|
||||||
|
/* Real */ ae_vector* wgauss,
|
||||||
|
ae_state *_state);
|
||||||
|
void gkqlegendrecalc(ae_int_t n,
|
||||||
|
ae_int_t* info,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* wkronrod,
|
||||||
|
/* Real */ ae_vector* wgauss,
|
||||||
|
ae_state *_state);
|
||||||
|
void gkqlegendretbl(ae_int_t n,
|
||||||
|
/* Real */ ae_vector* x,
|
||||||
|
/* Real */ ae_vector* wkronrod,
|
||||||
|
/* Real */ ae_vector* wgauss,
|
||||||
|
double* eps,
|
||||||
|
ae_state *_state);
|
||||||
|
void autogksmooth(double a,
|
||||||
|
double b,
|
||||||
|
autogkstate* state,
|
||||||
|
ae_state *_state);
|
||||||
|
void autogksmoothw(double a,
|
||||||
|
double b,
|
||||||
|
double xwidth,
|
||||||
|
autogkstate* state,
|
||||||
|
ae_state *_state);
|
||||||
|
void autogksingular(double a,
|
||||||
|
double b,
|
||||||
|
double alpha,
|
||||||
|
double beta,
|
||||||
|
autogkstate* state,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_bool autogkiteration(autogkstate* state, ae_state *_state);
|
||||||
|
void autogkresults(autogkstate* state,
|
||||||
|
double* v,
|
||||||
|
autogkreport* rep,
|
||||||
|
ae_state *_state);
|
||||||
|
ae_bool _autogkreport_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _autogkreport_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _autogkreport_clear(void* _p);
|
||||||
|
void _autogkreport_destroy(void* _p);
|
||||||
|
ae_bool _autogkinternalstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _autogkinternalstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _autogkinternalstate_clear(void* _p);
|
||||||
|
void _autogkinternalstate_destroy(void* _p);
|
||||||
|
ae_bool _autogkstate_init(void* _p, ae_state *_state, ae_bool make_automatic);
|
||||||
|
ae_bool _autogkstate_init_copy(void* _dst, void* _src, ae_state *_state, ae_bool make_automatic);
|
||||||
|
void _autogkstate_clear(void* _p);
|
||||||
|
void _autogkstate_destroy(void* _p);
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
30715
src/inc/alglib/interpolation.cpp
Normal file
30715
src/inc/alglib/interpolation.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5906
src/inc/alglib/interpolation.h
Normal file
5906
src/inc/alglib/interpolation.h
Normal file
File diff suppressed because it is too large
Load Diff
33805
src/inc/alglib/linalg.cpp
Normal file
33805
src/inc/alglib/linalg.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5187
src/inc/alglib/linalg.h
Normal file
5187
src/inc/alglib/linalg.h
Normal file
File diff suppressed because it is too large
Load Diff
25034
src/inc/alglib/optimization.cpp
Normal file
25034
src/inc/alglib/optimization.cpp
Normal file
File diff suppressed because it is too large
Load Diff
4379
src/inc/alglib/optimization.h
Normal file
4379
src/inc/alglib/optimization.h
Normal file
File diff suppressed because it is too large
Load Diff
8709
src/inc/alglib/solvers.cpp
Normal file
8709
src/inc/alglib/solvers.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2016
src/inc/alglib/solvers.h
Normal file
2016
src/inc/alglib/solvers.h
Normal file
File diff suppressed because it is too large
Load Diff
9637
src/inc/alglib/specialfunctions.cpp
Normal file
9637
src/inc/alglib/specialfunctions.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1976
src/inc/alglib/specialfunctions.h
Normal file
1976
src/inc/alglib/specialfunctions.h
Normal file
File diff suppressed because it is too large
Load Diff
19718
src/inc/alglib/statistics.cpp
Normal file
19718
src/inc/alglib/statistics.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1305
src/inc/alglib/statistics.h
Normal file
1305
src/inc/alglib/statistics.h
Normal file
File diff suppressed because it is too large
Load Diff
2
src/inc/alglib/stdafx.h
Normal file
2
src/inc/alglib/stdafx.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
|
58
src/inc/lag_rms.hpp
Normal file
58
src/inc/lag_rms.hpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* lag.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 1, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LAG_RMS_HPP_
|
||||||
|
#define LAG_RMS_HPP_
|
||||||
|
|
||||||
|
#include "mod.hpp"
|
||||||
|
|
||||||
|
class lag_rms : public mod {
|
||||||
|
|
||||||
|
int n1;
|
||||||
|
vec p1,p2;
|
||||||
|
ivec icx,iphi;
|
||||||
|
double mean1,mean2,mean1sq,mean2sq,mean12;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
void _dCx( vec , int );
|
||||||
|
void _dPhi( vec , int );
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
lag_rms( lcurve , lcurve , vec , vec );
|
||||||
|
virtual ~lag_rms();
|
||||||
|
|
||||||
|
void step_pars( int , vec& , vec& );
|
||||||
|
void print_pars( vec& , vec& );
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------- //
|
||||||
|
|
||||||
|
class lag10_rms : public mod {
|
||||||
|
|
||||||
|
int n1;
|
||||||
|
vec p1,p2;
|
||||||
|
ivec icx,iphi;
|
||||||
|
double mean1,mean2,mean1sq,mean2sq,mean12;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
void _dCx( vec , int );
|
||||||
|
void _dPhi( vec , int );
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
lag10_rms( lcurve , lcurve , vec , vec );
|
||||||
|
virtual ~lag10_rms();
|
||||||
|
|
||||||
|
void step_pars( int , vec& , vec& );
|
||||||
|
void print_pars( vec& , vec& );
|
||||||
|
void what_pars( int& , int& );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* LAG_HPP_ */
|
41
src/inc/psd_rms.hpp
Normal file
41
src/inc/psd_rms.hpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* psd.hpp
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PSD_RMS_HPP_
|
||||||
|
#define PSD_RMS_HPP_
|
||||||
|
|
||||||
|
#include "mod.hpp"
|
||||||
|
|
||||||
|
class psd_rms: public mod {
|
||||||
|
|
||||||
|
double mean,mean2;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
|
||||||
|
public:
|
||||||
|
psd_rms( lcurve , vec );
|
||||||
|
virtual ~psd_rms();
|
||||||
|
};
|
||||||
|
|
||||||
|
// ---------------------- //
|
||||||
|
|
||||||
|
class psd10_rms: public mod {
|
||||||
|
|
||||||
|
double mean,mean2;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
|
||||||
|
public:
|
||||||
|
psd10_rms( lcurve , vec );
|
||||||
|
virtual ~psd10_rms();
|
||||||
|
|
||||||
|
void step_pars( int , vec& , vec& );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* PSD_RMS_HPP_ */
|
56
src/inc/psdlag_rms.hpp
Normal file
56
src/inc/psdlag_rms.hpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* psdlag.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 1, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mod.hpp"
|
||||||
|
|
||||||
|
#ifndef PSDLAG_RMS_HPP_
|
||||||
|
#define PSDLAG_RMS_HPP_
|
||||||
|
|
||||||
|
class psdlag_rms : public mod {
|
||||||
|
|
||||||
|
int n1;
|
||||||
|
ivec ip1,ip2,icx,iphi;
|
||||||
|
double mean1,mean2,mean1sq,mean2sq,mean12;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
void _dP1( vec , int );
|
||||||
|
void _dP2( vec , int );
|
||||||
|
void _dCx( vec , int );
|
||||||
|
void _dPhi( vec , int );
|
||||||
|
|
||||||
|
public:
|
||||||
|
psdlag_rms( lcurve , lcurve , vec );
|
||||||
|
virtual ~psdlag_rms();
|
||||||
|
|
||||||
|
void step_pars( int , vec& , vec& );
|
||||||
|
void print_pars( vec& , vec& );
|
||||||
|
};
|
||||||
|
|
||||||
|
class psdlag10_rms : public mod {
|
||||||
|
|
||||||
|
int n1;
|
||||||
|
ivec ip1,ip2,icx,iphi;
|
||||||
|
double mean1,mean2,mean1sq,mean2sq,mean12;
|
||||||
|
|
||||||
|
void _C( vec );
|
||||||
|
void _dC( vec , int );
|
||||||
|
void _dP1( vec , int );
|
||||||
|
void _dP2( vec , int );
|
||||||
|
void _dCx( vec , int );
|
||||||
|
void _dPhi( vec , int );
|
||||||
|
|
||||||
|
public:
|
||||||
|
psdlag10_rms( lcurve , lcurve , vec );
|
||||||
|
virtual ~psdlag10_rms();
|
||||||
|
|
||||||
|
void step_pars( int , vec& , vec& );
|
||||||
|
void print_pars( vec& , vec& );
|
||||||
|
void what_pars( int&, int& );
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* PSDLAG_RMS_HPP_ */
|
230
src/lag_rms.cpp
Normal file
230
src/lag_rms.cpp
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
/*
|
||||||
|
* lag.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 1, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "inc/lag_rms.hpp"
|
||||||
|
|
||||||
|
lag_rms::lag_rms( lcurve lc1 , lcurve lc2 , vec fqL , vec pars ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n1 = lc1.len;
|
||||||
|
n = n1 + lc2.len;
|
||||||
|
dt = lc1.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean1 = lc1.demean(); mean2 = lc2.demean();
|
||||||
|
mean1sq = mean1*mean1; mean2sq = mean2*mean2; mean12 = mean1*mean2;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
lc[i] = lc1.lc[i];
|
||||||
|
lce[i] = lc1.lce[i]*lc1.lce[i];
|
||||||
|
t[i] = lc1.t[i];
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
lc[i] = lc2.lc[i-n1];
|
||||||
|
lce[i] = lc2.lce[i-n1]*lc2.lce[i-n1];
|
||||||
|
t[i] = lc2.t[i-n1];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 2 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// --------- constants and indices ---------- //
|
||||||
|
p1.setlength(nfq); p2.setlength(nfq); icx.setlength(nfq); iphi.setlength(nfq);
|
||||||
|
for( i=0 ; i<nfq ; i++ ){
|
||||||
|
p1[i] = pars[i] * mean1sq;
|
||||||
|
p2[i] = pars[i+nfq] * mean2sq;
|
||||||
|
icx[i] = i;
|
||||||
|
iphi[i] = i+nfq;
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lag_rms::~lag_rms() {}
|
||||||
|
|
||||||
|
void lag_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d;
|
||||||
|
for( i=0 ; i<nfq ; i++ ){ p[icx[i]] *= mean12;}
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p1[k]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p1[k]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p2[k]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=n1 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p2[k]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){
|
||||||
|
d += p[icx[k]] * ( Cfq[k](i,j)*cos(p[iphi[k]]) - Sfq[k](i,j)*sin(p[iphi[k]])); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag_rms::_dC( vec p , int k ){
|
||||||
|
if( k<nfq ){ _dCx( p , k );
|
||||||
|
}else{ _dPhi( p , k-nfq );}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag_rms::_dCx( vec p , int k ){
|
||||||
|
int i,j; double phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = ( Cfq[k](i,j)*cos(phi) - Sfq[k](i,j)*sin(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag_rms::_dPhi( vec p , int k ){
|
||||||
|
int i,j; double cx=p[k]*mean12,phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( -Cfq[k](i,j)*sin(phi) - Sfq[k](i,j)*cos(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void lag_rms::step_pars( int n , vec& dpar , vec& pars ){
|
||||||
|
for( int i=0 ; i<npar ; i++ ){
|
||||||
|
if( dpar[i]>3000 ){dpar[i] = 3000;} if( dpar[i]<-3000 ){dpar[i] = -3000;}
|
||||||
|
pars[i] += dpar[i]/((n<10)?10:1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void lag_rms::print_pars( vec& pars , vec& errs ){
|
||||||
|
for( int i=0 ; i<nfq ; i++ ){
|
||||||
|
if( pars[i]<0 ){ pars[i]*=-1; pars[i+nfq] += M_PI;}
|
||||||
|
while( pars[i+nfq] > M_PI ){ pars[i+nfq] -= 2*M_PI; }
|
||||||
|
while( pars[i+nfq] <-M_PI ){ pars[i+nfq] += 2*M_PI; }
|
||||||
|
}
|
||||||
|
mod::print_pars( pars , errs );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************** //
|
||||||
|
|
||||||
|
|
||||||
|
lag10_rms::lag10_rms( lcurve lc1 , lcurve lc2 , vec fqL , vec pars ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n1 = lc1.len;
|
||||||
|
n = n1 + lc2.len;
|
||||||
|
dt = lc1.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean1 = lc1.demean(); mean2 = lc2.demean();
|
||||||
|
mean1sq = mean1*mean1; mean2sq = mean2*mean2; mean12 = mean1*mean2;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
lc[i] = lc1.lc[i];
|
||||||
|
lce[i] = lc1.lce[i]*lc1.lce[i];
|
||||||
|
t[i] = lc1.t[i];
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
lc[i] = lc2.lc[i-n1];
|
||||||
|
lce[i] = lc2.lce[i-n1]*lc2.lce[i-n1];
|
||||||
|
t[i] = lc2.t[i-n1];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 2 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// --------- constants and indices ---------- //
|
||||||
|
p1.setlength(nfq); p2.setlength(nfq); icx.setlength(nfq); iphi.setlength(nfq);
|
||||||
|
for( i=0 ; i<nfq ; i++ ){
|
||||||
|
p1[i] = pow(10,pars[i]) * mean1sq;
|
||||||
|
p2[i] = pow(10,pars[i+nfq]) * mean2sq;
|
||||||
|
icx[i] = i;
|
||||||
|
iphi[i] = i+nfq;
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lag10_rms::~lag10_rms() {}
|
||||||
|
|
||||||
|
void lag10_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d; for(i=0;i<nfq;i++){p[icx[i]] = pow(10,p[i]) * mean12;}
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p1[k]*Cfq[k](i,i); }
|
||||||
|
d += f1*p1[0]*Cfq2[0](i,i) + f2*p1[nfq-1]*Cfq2[2](i,i);
|
||||||
|
d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p1[k]*Cfq[k](i,j); }
|
||||||
|
d += f1*p1[0]*Cfq2[0](i,j) + f2*p1[nfq-1]*Cfq2[2](i,j);
|
||||||
|
C(i,j) = d;}
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p2[k]*Cfq[k](i,i); }
|
||||||
|
d += f1*p2[0]*Cfq2[0](i,i) + f2*p2[nfq-1]*Cfq2[2](i,i);
|
||||||
|
d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=n1 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p2[k]*Cfq[k](i,j); }
|
||||||
|
d += f1*p2[0]*Cfq2[0](i,j) + f2*p2[nfq-1]*Cfq2[2](i,j);
|
||||||
|
C(i,j) = d;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){
|
||||||
|
d += p[icx[k]] * ( Cfq[k](i,j)*cos(p[iphi[k]]) - Sfq[k](i,j)*sin(p[iphi[k]])); }
|
||||||
|
d += f1*p[icx[0]] * ( Cfq2[0](i,j)*cos(p[iphi[0]]) - Sfq2[0](i,j)*sin(p[iphi[0]]) );
|
||||||
|
d += f2*p[icx[nfq-1]] * ( Cfq2[2](i,j)*cos(p[iphi[nfq-1]]) - Sfq2[2](i,j)*sin(p[iphi[nfq-1]]) );
|
||||||
|
C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag10_rms::_dC( vec p , int k ){
|
||||||
|
if( k<nfq ){ _dCx( p , k );
|
||||||
|
}else{ _dPhi( p , k-nfq );}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag10_rms::_dCx( vec p , int k ){
|
||||||
|
int i,j; double phi=p[iphi[k]],cx = log(10)*pow(10,p[k])*mean12;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( Cfq[k](i,j)*cos(phi) - Sfq[k](i,j)*sin(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag10_rms::_dPhi( vec p , int k ){
|
||||||
|
int i,j; double cx=pow(10,p[k])*mean12,phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( -Cfq[k](i,j)*sin(phi) - Sfq[k](i,j)*cos(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void lag10_rms::step_pars( int n , vec& dpar , vec& pars ){
|
||||||
|
for( int i=0 ; i<npar ; i++ ){
|
||||||
|
if( dpar[i]>3 ){dpar[i] = 3;} if( dpar[i]<-3 ){dpar[i] = -3;}
|
||||||
|
//pars[i] += dpar[i];
|
||||||
|
pars[i] += dpar[i]/((n<5)?10:1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void lag10_rms::print_pars( vec& pars , vec& errs ){
|
||||||
|
for( int i=0 ; i<nfq ; i++ ){
|
||||||
|
while( pars[i+nfq] > M_PI ){ pars[i+nfq] -= 2*M_PI; }
|
||||||
|
while( pars[i+nfq] <-M_PI ){ pars[i+nfq] += 2*M_PI; }
|
||||||
|
}
|
||||||
|
mod::print_pars( pars , errs );
|
||||||
|
}
|
||||||
|
|
||||||
|
void lag10_rms::what_pars( int& ip1 , int& ip2 ){
|
||||||
|
ip1 = nfq; ip2 = npar;
|
||||||
|
}
|
11
src/main.cpp
11
src/main.cpp
@ -59,20 +59,11 @@ void do_work( char* fname ){
|
|||||||
fp.close();
|
fp.close();
|
||||||
/********* END Reading the input file **********/
|
/********* END Reading the input file **********/
|
||||||
|
|
||||||
std::cout << "Completed reading file." << bin1 << bin2
|
|
||||||
<< files[0]
|
|
||||||
//<< files[1]
|
|
||||||
<< std::endl;
|
|
||||||
|
|
||||||
/********** Read the light curves **************/
|
/********** Read the light curves **************/
|
||||||
//std::cout << "hello";
|
|
||||||
//std::cout << bin1 << bin2;
|
|
||||||
vector<vector<lcurve> > LC,LC_ref;
|
vector<vector<lcurve> > LC,LC_ref;
|
||||||
if ( ref == -10 ){
|
if ( ref == -10 ){
|
||||||
//std::cout << "yo";
|
|
||||||
for(i=0;i<nfiles;i++) readLC( LC , files[i] , secL[i] , bin1 , bin2 , strict );
|
for(i=0;i<nfiles;i++) readLC( LC , files[i] , secL[i] , bin1 , bin2 , strict );
|
||||||
}else {
|
}else {
|
||||||
//std::cout << "yo2";
|
|
||||||
for(i=0;i<nfiles;i++) {
|
for(i=0;i<nfiles;i++) {
|
||||||
if( i!=ref ) { readLC( LC , files[i] , secL[i] , bin2 , -1 , strict ); }
|
if( i!=ref ) { readLC( LC , files[i] , secL[i] , bin2 , -1 , strict ); }
|
||||||
}
|
}
|
||||||
@ -80,8 +71,6 @@ void do_work( char* fname ){
|
|||||||
}
|
}
|
||||||
/******** END Read the light curves ************/
|
/******** END Read the light curves ************/
|
||||||
|
|
||||||
//std::cout << "Read lcs." << std::endl;
|
|
||||||
|
|
||||||
if( mode > 0 or mode==-1 ){
|
if( mode > 0 or mode==-1 ){
|
||||||
vec errs; errs.setlength(nfq);
|
vec errs; errs.setlength(nfq);
|
||||||
vector<lcurve> lc1; for( i=0 ; i<int(LC.size()) ; i++ ){ lc1.push_back( LC[i][0]); }
|
vector<lcurve> lc1; for( i=0 ; i<int(LC.size()) ; i++ ){ lc1.push_back( LC[i][0]); }
|
||||||
|
@ -6,5 +6,6 @@ libdir='/home/caes/science/psdlag-agn/src'
|
|||||||
incdir='/home/caes/science/psdlag-agn/src/inc'
|
incdir='/home/caes/science/psdlag-agn/src/inc'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
psdlag:
|
psdlag:
|
||||||
g++ *cpp -o psdlag -O3 -Wall -lalglib -I${incdir} -L${libdir}
|
g++ *cpp -o psdlag -O3 -Wall -lalglib -I${incdir} -L${libdir}
|
||||||
|
108
src/psd_rms.cpp
Normal file
108
src/psd_rms.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* psd.cpp
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "inc/psd_rms.hpp"
|
||||||
|
|
||||||
|
psd_rms::psd_rms( lcurve inlc , vec fqL ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n = inlc.len;
|
||||||
|
dt = inlc.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean = inlc.demean();
|
||||||
|
mean2 = mean*mean;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n ; i++ ){
|
||||||
|
lc[i] = inlc.lc[i];
|
||||||
|
lce[i] = inlc.lce[i]*inlc.lce[i];
|
||||||
|
t[i] = inlc.t[i];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 1 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
}
|
||||||
|
|
||||||
|
psd_rms::~psd_rms() {}
|
||||||
|
|
||||||
|
void psd_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d;
|
||||||
|
for( i=0 ; i<npar ; i++ ){ p[i] *= mean2; }
|
||||||
|
for( i=0 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[k]*Cfq[k](i,i); }
|
||||||
|
d += f1*p[0]*Cfq2[0](i,i) + f2*p[nfq-1]*Cfq2[2](i,i);
|
||||||
|
d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[k]*Cfq[k](i,j); }
|
||||||
|
d += f1*p[0]*Cfq2[0](i,j) + f2*p[nfq-1]*Cfq2[2](i,j);
|
||||||
|
C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psd_rms::_dC( vec p , int k ){
|
||||||
|
int i,j;
|
||||||
|
for( i=0 ; i<n ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = Cfq[k](i,j); dC(j,i) = dC(i,j);} }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ********************************************** //
|
||||||
|
// ********************************************** //
|
||||||
|
|
||||||
|
psd10_rms::psd10_rms( lcurve inlc , vec fqL ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n = inlc.len;
|
||||||
|
dt = inlc.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean = inlc.demean();
|
||||||
|
mean2 = mean*mean;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n ; i++ ){
|
||||||
|
lc[i] = inlc.lc[i];
|
||||||
|
lce[i] = inlc.lce[i]*inlc.lce[i];
|
||||||
|
t[i] = inlc.t[i];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 1 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
}
|
||||||
|
|
||||||
|
psd10_rms::~psd10_rms() {}
|
||||||
|
|
||||||
|
void psd10_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d; for(i=0;i<npar;i++){p[i]=pow(10,p[i])*mean2;}
|
||||||
|
for( i=0 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[k]*Cfq[k](i,i); }
|
||||||
|
d += f1*p[0]*Cfq2[0](i,i) + f2*p[nfq-1]*Cfq2[2](i,i);
|
||||||
|
d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[k]*Cfq[k](i,j); }
|
||||||
|
d += f1*p[0]*Cfq2[0](i,j) + f2*p[nfq-1]*Cfq2[2](i,j);
|
||||||
|
C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psd10_rms::_dC( vec p , int k ){
|
||||||
|
int i,j; double d = log(10)*pow(10,p[k])*mean2;
|
||||||
|
for( i=0 ; i<n ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = d*Cfq[k](i,j); dC(j,i) = dC(i,j);} }
|
||||||
|
}
|
||||||
|
|
||||||
|
void psd10_rms::step_pars( int n , vec& dpar , vec& pars ){
|
||||||
|
for( int i=0 ; i<npar ; i++ ){
|
||||||
|
if( dpar[i]>3 ){dpar[i] = 3;} if( dpar[i]<-3 ){dpar[i] = -3;}
|
||||||
|
pars[i] += dpar[i];
|
||||||
|
}
|
||||||
|
}
|
255
src/psdlag_rms.cpp
Normal file
255
src/psdlag_rms.cpp
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* psdlag.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 1, 2013
|
||||||
|
* Author: azoghbi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "inc/psdlag_rms.hpp"
|
||||||
|
|
||||||
|
psdlag_rms::psdlag_rms( lcurve lc1, lcurve lc2 , vec fqL ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n1 = lc1.len;
|
||||||
|
n = n1 + lc2.len;
|
||||||
|
dt = lc1.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean1 = lc1.demean(); mean2 = lc2.demean();
|
||||||
|
mean1sq = mean1*mean1; mean2sq = mean2*mean2; mean12 = mean1*mean2;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
lc[i] = lc1.lc[i];
|
||||||
|
lce[i] = lc1.lce[i]*lc1.lce[i];
|
||||||
|
t[i] = lc1.t[i];
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
lc[i] = lc2.lc[i-n1];
|
||||||
|
lce[i] = lc2.lce[i-n1]*lc2.lce[i-n1];
|
||||||
|
t[i] = lc2.t[i-n1];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 4 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// --------- constants and indices ---------- //
|
||||||
|
ip1.setlength(nfq); ip2.setlength(nfq); icx.setlength(nfq); iphi.setlength(nfq);
|
||||||
|
for( i=0 ; i<nfq ; i++ ){
|
||||||
|
ip1[i] = i;
|
||||||
|
ip2[i] = i+nfq;
|
||||||
|
icx[i] = i+2*nfq;
|
||||||
|
iphi[i] = i+3*nfq;
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
psdlag_rms::~psdlag_rms() {}
|
||||||
|
|
||||||
|
void psdlag_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d;
|
||||||
|
for( i=0 ; i<nfq ; i++ ){ p[ip1[i]] *= mean1sq; p[ip2[i]] *= mean2sq; p[icx[i]] *= mean12;}
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip1[k]]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip1[k]]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip2[k]]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=n1 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip2[k]]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){
|
||||||
|
d += p[icx[k]] * ( Cfq[k](i,j)*cos(p[iphi[k]]) - Sfq[k](i,j)*sin(p[iphi[k]])); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::_dC( vec p , int k ){
|
||||||
|
if( k<nfq ){ _dP1( p , k );
|
||||||
|
}else if( k<2*nfq ){ _dP2( p , k%nfq );
|
||||||
|
}else if( k<3*nfq ){ _dCx( p , k%nfq );
|
||||||
|
}else{ _dPhi( p , k%nfq );}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::_dP1( vec p , int k ){
|
||||||
|
int i,j;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = Cfq[k](i,j); dC(j,i) = dC(i,j);} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::_dP2( vec p , int k ){
|
||||||
|
int i,j;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = Cfq[k](i,j); dC(j,i) = dC(i,j);}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::_dCx( vec p , int k ){
|
||||||
|
int i,j; double phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = ( Cfq[k](i,j)*cos(phi) - Sfq[k](i,j)*sin(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::_dPhi( vec p , int k ){
|
||||||
|
int i,j; double cx=p[icx[k]]*mean12,phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( -Cfq[k](i,j)*sin(phi) - Sfq[k](i,j)*cos(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag_rms::step_pars( int n , vec& dpar , vec& pars ){
|
||||||
|
for( int i=0 ; i<npar ; i++ ){
|
||||||
|
if( dpar[i]>3000 ){dpar[i] = 3000;} if( dpar[i]<-3000 ){dpar[i] = -3000;}
|
||||||
|
pars[i] += dpar[i]/((n<10)?10:1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void psdlag_rms::print_pars( vec& pars , vec& errs ){
|
||||||
|
for( int i=0 ; i<nfq ; i++ ){
|
||||||
|
if( pars[i+2*nfq]<0 ){ pars[i+2*nfq]*=-1; pars[i+3*nfq] += M_PI;}
|
||||||
|
while( pars[i+3*nfq] > M_PI ){ pars[i+3*nfq] -= 2*M_PI; }
|
||||||
|
while( pars[i+3*nfq] <-M_PI ){ pars[i+3*nfq] += 2*M_PI; }
|
||||||
|
mod::print_pars( pars , errs );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++ //
|
||||||
|
|
||||||
|
psdlag10_rms::psdlag10_rms( lcurve lc1, lcurve lc2 , vec fqL ) {
|
||||||
|
|
||||||
|
// ----------- initial parameters ------------ //
|
||||||
|
n1 = lc1.len;
|
||||||
|
n = n1 + lc2.len;
|
||||||
|
dt = lc1.dt;
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
|
||||||
|
// ----------- light curve setup ------------ //
|
||||||
|
setlc();
|
||||||
|
mean1 = lc1.demean(); mean2 = lc2.demean();
|
||||||
|
mean1sq = mean1*mean1; mean2sq = mean2*mean2; mean12 = mean1*mean2;
|
||||||
|
int i;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
lc[i] = lc1.lc[i];
|
||||||
|
lce[i] = lc1.lce[i]*lc1.lce[i];
|
||||||
|
t[i] = lc1.t[i];
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
lc[i] = lc2.lc[i-n1];
|
||||||
|
lce[i] = lc2.lce[i-n1]*lc2.lce[i-n1];
|
||||||
|
t[i] = lc2.t[i-n1];
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// ----------- parent initilizer ------------ //
|
||||||
|
init( fqL , 4 );
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
// --------- constants and indices ---------- //
|
||||||
|
ip1.setlength(nfq); ip2.setlength(nfq); icx.setlength(nfq); iphi.setlength(nfq);
|
||||||
|
for( i=0 ; i<nfq ; i++ ){
|
||||||
|
ip1[i] = i;
|
||||||
|
ip2[i] = i+nfq;
|
||||||
|
icx[i] = i+2*nfq;
|
||||||
|
iphi[i] = i+3*nfq;
|
||||||
|
}
|
||||||
|
// ------------------------------------------ //
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
psdlag10_rms::~psdlag10_rms() {}
|
||||||
|
|
||||||
|
void psdlag10_rms::_C( vec p ){
|
||||||
|
int i,j,k; double d; for(i=0;i<nfq;i++){ p[ip1[i]] = pow(10,p[ip1[i]])*mean1sq; p[ip2[i]] = pow(10,p[ip2[i]])*mean2sq; p[icx[i]] = pow(10,p[icx[i]])*mean12;}
|
||||||
|
for( i=0 ; i<n1 ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip1[k]]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=0 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip1[k]]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip2[k]]*Cfq[k](i,i); } d += lce[i]; C(i,i) = d;
|
||||||
|
for( j=n1 ; j<i ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){ d += p[ip2[k]]*Cfq[k](i,j); } C(i,j) = d;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ d = 0; for( k=0 ; k<nfq ; k++ ){
|
||||||
|
d += p[icx[k]] * ( Cfq[k](i,j)*cos(p[iphi[k]]) - Sfq[k](i,j)*sin(p[iphi[k]])); } C(i,j) = d;}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::_dC( vec p , int k ){
|
||||||
|
if( k<nfq ){ _dP1( p , k );
|
||||||
|
}else if( k<2*nfq ){ _dP2( p , k%nfq );
|
||||||
|
}else if( k<3*nfq ){ _dCx( p , k%nfq );
|
||||||
|
}else{ _dPhi( p , k%nfq );}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::_dP1( vec p , int k ){
|
||||||
|
int i,j; double p1 = log(10)*pow(10,p[k])*mean1sq;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = p1 * Cfq[k](i,j); dC(j,i) = dC(i,j);} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::_dP2( vec p , int k ){
|
||||||
|
int i,j; double p2 = log(10) * pow(10,p[ip2[k]])*mean2sq;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = p2 * Cfq[k](i,j); dC(j,i) = dC(i,j);}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){ dC(i,j) = 0; dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::_dCx( vec p , int k ){
|
||||||
|
int i,j; double phi=p[iphi[k]], cx=log(10)*pow(10,p[icx[k]])*mean12;
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( Cfq[k](i,j)*cos(phi) - Sfq[k](i,j)*sin(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::_dPhi( vec p , int k ){
|
||||||
|
int i,j; double cx=pow(10,p[icx[k]])*mean12,phi=p[iphi[k]];
|
||||||
|
for( i=0 ; i<n1 ; i++ ){ for( j=0 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;} }
|
||||||
|
for( i=n1 ; i<n ; i++ ){
|
||||||
|
for( j=n1 ; j<=i ; j++ ){ dC(i,j) = 0; dC(j,i) = 0;}
|
||||||
|
for( j=0 ; j<n1 ; j++ ){
|
||||||
|
dC(i,j) = cx * ( -Cfq[k](i,j)*sin(phi) - Sfq[k](i,j)*cos(phi) ); dC(j,i) = dC(i,j);}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::step_pars( int n , vec& dpar , vec& pars ){
|
||||||
|
for( int i=0 ; i<npar ; i++ ){
|
||||||
|
if( dpar[i]>3 ){dpar[i] = 3;} if( dpar[i]<-3 ){dpar[i] = -3;}
|
||||||
|
//pars[i] += dpar[i];
|
||||||
|
pars[i] += dpar[i]/((n<5)?10:1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void psdlag10_rms::print_pars( vec& pars , vec& errs ){
|
||||||
|
for( int i=0 ; i<nfq ; i++ ){
|
||||||
|
while( pars[i+3*nfq] > M_PI ){ pars[i+3*nfq] -= 2*M_PI; }
|
||||||
|
while( pars[i+3*nfq] <-M_PI ){ pars[i+3*nfq] += 2*M_PI; }
|
||||||
|
}
|
||||||
|
mod::print_pars( pars , errs );
|
||||||
|
}
|
||||||
|
|
||||||
|
void psdlag10_rms::what_pars( int& ip1 , int& ip2 ){
|
||||||
|
ip1 = 3*nfq; ip2 = 4*nfq;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user