Nav apraksta

shkolnick-kun fb8be02b3a Added CoC. 3 gadi atpakaļ
doc 0c54372a02 Python manual done! 3 gadi atpakaļ
src c637a452bb Python manual in progress. 3 gadi atpakaļ
tests c637a452bb Python manual in progress. 3 gadi atpakaļ
.gitignore a752a5ad90 Making proper setup ... 3 gadi atpakaļ
CODE_OF_CONDUCT.md fb8be02b3a Added CoC. 3 gadi atpakaļ
LICENSE 25cd8457d2 Initial commit 3 gadi atpakaļ
MANIFEST.in 361247ba0c Added CYTHONIZE when yaflpy.c is not a file. 3 gadi atpakaļ
README.md c012baf760 C-manual in progress. 3 gadi atpakaļ
pyproject.toml 3fbf22d3c1 Fixed source distribution. 3 gadi atpakaļ
requirements-dev.txt b0e3adea04 Made proper setup 3 gadi atpakaļ
requirements.txt b0e3adea04 Made proper setup 3 gadi atpakaļ
setup.cfg 361247ba0c Added CYTHONIZE when yaflpy.c is not a file. 3 gadi atpakaļ
setup.py f88ec6657c Working on Readme.md... 3 gadi atpakaļ

README.md

Yet Another Filtering library

YAFL means Yet Another Filtering Library.

The library

Here you can find some Kalman filter variants:

Algorithm family Basic Adaptive Robust Adaptive robust
SUD EKF
SUD UKF
UD UKF

where:

  • SUD means Sequential UD-factorized
  • UD means UD-factorized
  • EKF means Extended Kalman Filter
  • UKF means Unscented Kalman Filter
  • Basic means basic algorithm
  • Adaptive means a Kalman filter with adaptive divergence correction. We use H-infinity filter to correct the divergence
  • Robust means Robustified Kalman filter, see West1981

For all EKF variants we have Bierman and Joseph updates. For sequential UD-factorized UKF only Bierman updates are available.

And yes, we can actually use EKF tricks with UKF!

The library is written in C and is intended for embedded systems usage:

  • We use static memory allocation
  • We use cache-friendly algorithms when available.
  • Regularization techniques used if necessary. The code is numerically stable.
  • Depends only on C standard library.

To use the library you need to:

/*yafl_config.h*/

#ifndef YAFL_CONFIG_H
#define YAFL_CONFIG_H

#include <math.h>
#include <stdint.h>

#ifdef DEBUG
    /*
    In this example we will use standard output.
    You can actually use any printf implementation you want.
    */
#   include <stdio.h>
#   define YAFL_LOG(...) fprintf(stderr, __VA_ARGS__)

    /*
    Using branch speculation may save some clocks...
    */
#   ifdef __GNUC__
#       define YAFL_UNLIKELY(x) __builtin_expect((x), 0)
#   else /*__GNUC__*/
#       define YAFL_UNLIKELY(x) (x)
#   endif/*__GNUC__*/

#else /*DEBUG*/

    /*
    Here we have "Never" actually, but you can use some of above definitions if you want.
    */
#   define YAFL_UNLIKELY(x) (0)

#endif/*DEBUG*/

#define YAFL_EPS  (1.0e-7)

#define YAFL_SQRT sqrtf
#define YAFL_ABS  fabs

typedef float   yaflFloat;
typedef int32_t   yaflInt;

/* WARNING!!!
Fast UKF SSR updates may give dramatically incorrect results in case of adaptive Bierman filter
*/
//#define YAFL_USE_FAST_UKF

#endif // YAFL_CONFIG_H

  • read the C-Manual for usage details,
  • write some usefull code which use our library in you project.

Using with Python

We also have a Python extension for prototyping purposes. Python 3.5+ with 64bit is supproted.

To use the extension you need to:

  • go to Releases,
  • download latest yaflpy-<latest version>.tar.gz,
  • install it:

    # Cython, numpy, scipy, setuptools, wheel
    # are needed at this point
    pip install path_to/yaflpy-\<latest version\>.tar.gz
    
    • read the Python-Manual for usage details.
    • import the extension: Python import yaflpy
  • write some code which use the extension.

References

[West1981] M. West, "Robust Sequential Approximate Bayesian Estimation", J. R. Statist. Soc. B (1981), 43, No. 2, pp. 157-166