mirror of
https://github.com/aportelli/LatAnalyze.git
synced 2025-06-13 03:17:06 +01:00
Compare commits
198 Commits
3.3.1
...
4988f351f2
Author | SHA1 | Date | |
---|---|---|---|
4988f351f2 | |||
89b540d074 | |||
bdfbaa80b9 | |||
6fbb0f70ef | |||
f4dff86ce6 | |||
c3cf22532e | |||
d0ca6493bd | |||
febaa059c2 | |||
79803007ff | |||
3bf3e15def | |||
79ca0069c5 | |||
442624912e | |||
e8b0565164 | |||
c93cdf5c5a | |||
81c4dc1248 | |||
f5b3e33fc8 | |||
a0c654003d | |||
ccdc54243e | |||
7d55fc30b5 | |||
f4dcadd3bb | |||
656ae91fe5 | |||
341b4bc73b | |||
cc0154f58c | |||
d786524508 | |||
534013fd87 | |||
1c8add56ef | |||
cce9faaba6 | |||
4419139bd1 | |||
0b5c6e851c | |||
0b5da3866e | |||
4823426d55 | |||
a620ff7b1c | |||
00cf854408 | |||
b938a855e3 | |||
83e09b82fc | |||
fde57d79f3 | |||
145155f733 | |||
6739019c83 | |||
13fddf4947 | |||
1604b4712f | |||
c73b609ac5 | |||
05138baa08 | |||
a0bdbfd9dd | |||
7fd31d1fcc | |||
f0c3fd4d7d | |||
470aff3b4a | |||
c9ea23dc92 | |||
58a355478a | |||
4f919bc007 | |||
9455e2c66e | |||
43dd295f94 | |||
9afd40a1ad | |||
9e78b96260 | |||
65a656f257 | |||
47d0b3f040 | |||
35f6733292 | |||
ebc1bd4c2e | |||
857a8e59c9 | |||
0de8091f3c | |||
e4cefae515 | |||
8cd29c2bee | |||
bac8356de5 | |||
60d91cbff5 | |||
adf2c9cc69 | |||
24a7b9c203 | |||
57c6004797 | |||
c796187d1e | |||
b92fb84e9d | |||
5e04a0321e | |||
78351a9b76 | |||
fe8c6c6630 | |||
5f192ad30f | |||
ccb837a244 | |||
499e173bac | |||
75485219d8 | |||
a3054a0f44 | |||
d6e5ba724d | |||
9341a31cf4 | |||
b4b6bd22fa | |||
68d22eca11 | |||
d4704267d6 | |||
2de70a2775 | |||
d67a25245e | |||
cfb2c0c5e8 | |||
0160c88c29 | |||
376bdfc38b | |||
0cec36dded | |||
0cda9e20cd | |||
2b9508c20f | |||
417e068485 | |||
524c11d2ba | |||
3602bbd368 | |||
bb4e9e1d42 | |||
4347511e39 | |||
e944f9c4aa | |||
3e70792a06 | |||
f014003593 | |||
c37e6e1bfd | |||
0e8b9d2a8f | |||
1d6a66263d | |||
1775f4992b | |||
685d433032 | |||
1bde8822b1 | |||
f826f30e82 | |||
51efb2a81f | |||
5f5ecf241f | |||
d85860a2ef | |||
d894aa185c | |||
0fbe00da0d | |||
caeb78b143 | |||
9f98ed42c3 | |||
d43197ccc7 | |||
4b5ad9014c | |||
2e2e676196 | |||
c0dac8063e | |||
29863a348b | |||
a1fae4356e | |||
5e891063e1 | |||
97267c196f | |||
c81316ef32 | |||
f356700a4f | |||
267bd33a97 | |||
dfaea5f156 | |||
7163a55775 | |||
c7ed995052 | |||
1c55c93669 | |||
21812e1fd7 | |||
0ca4e0ef17 | |||
d30303bb54 | |||
ae77d9a2fd | |||
4e1f9db6fd | |||
87e15f8331 | |||
c3d0f93e1a | |||
6fe58aba18 | |||
f047cd9821 | |||
ec5e6c6920 | |||
8cfbaeb9ce | |||
35a20ed713 | |||
161c06292e | |||
2096238ff6 | |||
4cab49cd92 | |||
eb73d2f269 | |||
e44460c9fd | |||
b3bf75f93a | |||
b04338bf36 | |||
070f91a4ed | |||
11ecea3c6d | |||
c49da2ec2d | |||
4a95bc39c8 | |||
cb2f6bf0aa | |||
e37f2ab124 | |||
0bf6d8c8ae | |||
3918d3a9b8 | |||
61c18b7f2d | |||
302934de01 | |||
f899d9e64a | |||
d41d0d544f | |||
b5e0d5c054 | |||
2ac6255031 | |||
1a5d263512 | |||
be14739695 | |||
64aff77cd7 | |||
d380751e9a | |||
f16b26e04c | |||
7bb8ee4a1d | |||
125ad02159 | |||
e1aab20845 | |||
83d5428c3a | |||
6addec5e14 | |||
9f101686fa | |||
7bdc561992 | |||
8f52731513 | |||
b378f2fe6d | |||
7a087944ff | |||
64d2616e24 | |||
281663230d | |||
545a146f49 | |||
f8ad5c4da0 | |||
6dd82f33dc | |||
7993a1a7f7 | |||
86f7f89106 | |||
36fb53b0f6 | |||
be165aab20 | |||
7f2d434614 | |||
146953d513 | |||
9d45d2e7a5 | |||
82d41d0b5d | |||
741762f17b | |||
1919497b49 | |||
5dfe91ddb4 | |||
61fa8e14ed | |||
37a1700c02 | |||
005158e2ed | |||
32a8495026 | |||
8b9494029c | |||
b4ad61406f | |||
c62f3a4b69 | |||
0735cd54ce |
26
.github/workflows/build-macos.yml
vendored
Normal file
26
.github/workflows/build-macos.yml
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
name: Build macOS
|
||||
|
||||
on: [push, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-11
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install basic dependencies
|
||||
run: brew install automake autoconf libtool bison flex
|
||||
- name: Build dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
export PATH=/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:${PATH}
|
||||
cd ci-scripts
|
||||
./install-deps.sh prefix 6
|
||||
- name: Build LatAnalyze
|
||||
shell: bash
|
||||
run: |
|
||||
export PATH=/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:${PATH}
|
||||
cd ci-scripts
|
||||
./install-latan.sh prefix 6
|
26
.github/workflows/build-ubuntu.yml
vendored
Normal file
26
.github/workflows/build-ubuntu.yml
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
name: Build Ubuntu
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install basic dependencies
|
||||
run: |
|
||||
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
|
||||
sudo apt install cmake bison flex
|
||||
- name: Build dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
cd ci-scripts
|
||||
CC=clang CXX=clang++ ./install-deps.sh prefix 6
|
||||
- name: Build LatAnalyze
|
||||
shell: bash
|
||||
run: |
|
||||
cd ci-scripts
|
||||
CC=clang CXX=clang++ ./install-latan.sh prefix 6
|
31
.gitignore
vendored
31
.gitignore
vendored
@ -1,7 +1,5 @@
|
||||
# builds
|
||||
build/*
|
||||
build_debug/*
|
||||
sandbox/*
|
||||
build
|
||||
|
||||
# Apple stuff
|
||||
*.xcodeproj
|
||||
@ -10,31 +8,12 @@ sandbox/*
|
||||
# VIM
|
||||
*.swp
|
||||
|
||||
# autotools
|
||||
autom4te.cache/*
|
||||
*.in
|
||||
*.in~
|
||||
config.h*
|
||||
configure
|
||||
.buildutils/*
|
||||
aclocal.m4
|
||||
|
||||
# bison/flex generated sources
|
||||
lib/*Lexer.cpp
|
||||
lib/*Parser.cpp
|
||||
lib/*Parser.hpp
|
||||
|
||||
# Eigen headers
|
||||
lib/Eigen/*
|
||||
lib/eigen_files.mk
|
||||
# Eigen headers and archives
|
||||
/lib/LatAnalyze/Eigen
|
||||
eigen-*.tar.bz2
|
||||
|
||||
# CI builds
|
||||
ci-scripts/local/*
|
||||
|
||||
# CLion stuff
|
||||
.idea/*
|
||||
CMakeLists.txt
|
||||
cmake-build-debug/*
|
||||
/ci-scripts/local
|
||||
|
||||
# VS Code Studio stuff
|
||||
.vscode
|
||||
|
91
.travis.yml
91
.travis.yml
@ -1,91 +0,0 @@
|
||||
language: cpp
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
slack: ukqcd:mQLXCtz8D2cg89xT8j1a4wku
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- ci-scripts/local
|
||||
- ci-scripts/clang
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
osx_image: xcode7.2
|
||||
compiler: clang
|
||||
- os: osx
|
||||
osx_image: xcode7.2
|
||||
compiler: gcc
|
||||
env: VERSION=-5
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.9
|
||||
- libgsl0-dev
|
||||
- flex
|
||||
- bison
|
||||
env: VERSION=-4.9
|
||||
- compiler: gcc
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
- libgsl0-dev
|
||||
- flex
|
||||
- bison
|
||||
env: VERSION=-5
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
- libgsl0-dev
|
||||
- flex
|
||||
- bison
|
||||
env: CLANG_LINK=http://llvm.org/releases/3.6.0/clang+llvm-3.6.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
|
||||
- compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
- libgsl0-dev
|
||||
- flex
|
||||
- bison
|
||||
env: CLANG_LINK=http://llvm.org/releases/3.7.0/clang+llvm-3.7.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
|
||||
|
||||
before_install:
|
||||
- export LATDIR=`pwd`
|
||||
- cd ci-scripts
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]] && [ ! -e clang/bin ]; then wget $CLANG_LINK; tar -xf `basename $CLANG_LINK`; mkdir clang; mv clang+*/* clang/; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export PATH="${LATDIR}/ci-scripts/clang/bin:${PATH}"; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$CC" == "clang" ]]; then export LD_LIBRARY_PATH="${LATDIR}/ci-scripts/clang/lib:${LD_LIBRARY_PATH}"; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install gsl; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install bison flex; export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]] && [[ "$CC" == "gcc" ]]; then brew install gcc5; fi
|
||||
|
||||
install:
|
||||
- export CC=$CC$VERSION
|
||||
- export CXX=$CXX$VERSION
|
||||
- echo $PATH
|
||||
- which $CC
|
||||
- $CC --version
|
||||
- which $CXX
|
||||
- $CXX --version
|
||||
- ./install-deps.sh `pwd`/local
|
||||
- cd ..
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export LD_LIBRARY_PATH=${LATDIR}/ci-scripts/local/lib:$LD_LIBRARY_PATH; fi
|
||||
|
||||
script:
|
||||
- cd ci-scripts
|
||||
- ./install-latan.sh `pwd`/local $TRAVIS_OS_NAME
|
94
CMakeLists.txt
Normal file
94
CMakeLists.txt
Normal file
@ -0,0 +1,94 @@
|
||||
# package config
|
||||
cmake_minimum_required(VERSION 3.11.0)
|
||||
project(
|
||||
LatAnalyze
|
||||
VERSION 3.6
|
||||
LANGUAGES C CXX)
|
||||
|
||||
# includes
|
||||
include(CheckCXXCompilerFlag)
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(FetchContent)
|
||||
include(FindPackageMessage)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# C++ compile flags
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
check_cxx_compiler_flag("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
|
||||
if(COMPILER_SUPPORTS_MARCH_NATIVE)
|
||||
set(MARCH_FLAG "-march=native")
|
||||
endif()
|
||||
check_cxx_compiler_flag("-mtune=native" COMPILER_SUPPORTS_MTUNE_NATIVE)
|
||||
if(COMPILER_SUPPORTS_MTUNE_NATIVE)
|
||||
set(MTUNE_FLAG "-mtune=native")
|
||||
endif()
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG ${MARCH_FLAG} ${MTUNE_FLAG}")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
|
||||
"-O3 -g -DNDEBUG ${MARCH_FLAG} ${MTUNE_FLAG}")
|
||||
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
|
||||
add_library(compiler_flags INTERFACE)
|
||||
target_compile_features(compiler_flags INTERFACE cxx_std_17)
|
||||
target_compile_options(
|
||||
compiler_flags
|
||||
INTERFACE "$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>")
|
||||
|
||||
# position idependent code
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
# installation rpath setup
|
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
|
||||
|
||||
# fetch and create symbolic link to Eigen headers
|
||||
set(FETCHCONTENT_BASE_DIR ${CMAKE_BINARY_DIR}/deps)
|
||||
FetchContent_Declare(
|
||||
Eigen3
|
||||
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
|
||||
GIT_TAG 3.4.0)
|
||||
FetchContent_GetProperties(Eigen3)
|
||||
if(NOT eigen3_POPULATED)
|
||||
FetchContent_Populate(Eigen3)
|
||||
message(STATUS "Eigen3 fetched")
|
||||
endif()
|
||||
file(CREATE_LINK ${eigen3_SOURCE_DIR}/Eigen
|
||||
${CMAKE_SOURCE_DIR}/lib/LatAnalyze/Eigen SYMBOLIC)
|
||||
|
||||
# dependencies
|
||||
find_package(Threads REQUIRED)
|
||||
find_package(GSL REQUIRED)
|
||||
find_package(HDF5 REQUIRED COMPONENTS C CXX)
|
||||
find_package(Minuit2 QUIET)
|
||||
if(Minuit2_FOUND)
|
||||
set(Minuit2_MSG "yes")
|
||||
find_package_message(
|
||||
Minuit2
|
||||
"Found Minuit2: ${Minuit2_DIR} (found version \"${Minuit2_VERSION}\")" " ")
|
||||
else()
|
||||
set(Minuit2_MSG "no")
|
||||
message(STATUS "Minuit2 not found")
|
||||
endif()
|
||||
find_package(NLopt QUIET)
|
||||
if(NLopt_FOUND)
|
||||
set(NLopt_MSG "yes")
|
||||
find_package_message(
|
||||
NLopt "Found NLopt: ${NLopt_DIR} (found version \"${NLopt_VERSION}\")" " ")
|
||||
else()
|
||||
set(NLopt_MSG "no")
|
||||
message(STATUS "NLopt not found")
|
||||
endif()
|
||||
|
||||
# subdirectories
|
||||
add_subdirectory(lib)
|
||||
add_subdirectory(examples)
|
||||
add_subdirectory(physics)
|
||||
add_subdirectory(utils)
|
||||
|
||||
# summary
|
||||
message(STATUS "---------------------------")
|
||||
message(STATUS "LatAnalyze v${PROJECT_VERSION} configured")
|
||||
message(STATUS "---------------------------")
|
||||
message(STATUS " install prefix: ${CMAKE_INSTALL_PREFIX}")
|
||||
message(STATUS "Minuit2 minimisers: ${Minuit2_MSG}")
|
||||
message(STATUS " NLopt minimisers: ${NLopt_MSG}")
|
||||
message(STATUS "---------------------------")
|
@ -1,3 +0,0 @@
|
||||
SUBDIRS = lib utils physics examples
|
||||
|
||||
ACLOCAL_AMFLAGS = -I .buildutils/m4
|
127
Readme.md
127
Readme.md
@ -1,37 +1,21 @@
|
||||
# LatAnalyze
|
||||
Contributors: Antonin Portelli, Matt Spraggs
|
||||
|
||||
License: GNU General Public License v3
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Last stable release</td>
|
||||
<td><a href="https://travis-ci.org/aportelli/LatAnalyze">
|
||||
<img src="https://travis-ci.org/aportelli/LatAnalyze.svg?branch=master"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Development branch</td>
|
||||
<td><a href="https://travis-ci.org/aportelli/LatAnalyze">
|
||||
<img src="https://travis-ci.org/aportelli/LatAnalyze.svg?branch=develop"></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
[](https://www.gnu.org/licenses/gpl-3.0) [](https://zenodo.org/badge/latestdoi/10201777) [](https://github.com/aportelli/LatAnalyze/actions/workflows/build-ubuntu.yml) [](https://github.com/aportelli/LatAnalyze/actions/workflows/build-macos.yml)
|
||||
|
||||
## Description
|
||||
LatAnalyze is a C++11 library for statistical data analysis based on bootstrap
|
||||
LatAnalyze is a C++14 library for statistical data analysis based on bootstrap
|
||||
resampling. It has been written with lattice QCD data analysis in mind (hence
|
||||
the name), but its features are not lattice specific and can be used more general statistical context.
|
||||
|
||||
Sadly a proper documentation was never written, but some comprehensive examples covering most features can be found in the `examples` directory.
|
||||
Sadly a proper documentation was never written, but some comprehensive examples covering several key features can be found in the `examples` directory.
|
||||
|
||||
The main features are the following:
|
||||
|
||||
* Array and matrix types with fast arithmetic operations based on [Eigen](http://eigen.tuxfamily.org).
|
||||
* High-level types for bootstrap sample manipulation (including various statistical estimators and histogramming).
|
||||
* Mathematical expression parser for runtime defined functions.
|
||||
* Data I/O in ASCII and HDF5 (optional).
|
||||
* High-level wrappers to minimisation routines from the [GSL](http://www.gnu.org/software/gsl/), [Minuit](http://seal.web.cern.ch/seal/snapshot/work-packages/mathlibs/minuit/) (optional) and [NLopt](http://ab-initio.mit.edu/wiki/index.php/NLopt).
|
||||
* Data I/O in ASCII, XML, and HDF5.
|
||||
* High-level wrappers to minimisation routines from the [GSL](http://www.gnu.org/software/gsl/), [Minuit 2](https://github.com/root-project/root/tree/master/math/minuit2) (optional) and [NLopt](http://ab-initio.mit.edu/wiki/index.php/NLopt).
|
||||
* Non-linear regression with error on independent variables (through total least squares).
|
||||
* High-level wrappers to numerical integrator and non-linear solver from the [GSL](http://www.gnu.org/software/gsl/).
|
||||
* High-level functional types for function of model. General functions can be defined from C pointers, C++ objects, strings of mathematical expressions or tabulated data.
|
||||
@ -40,21 +24,104 @@ The main features are the following:
|
||||
## Installation
|
||||
The head of the `master` branch always points to the latest stable release. The `develop` branch is the main unstable branch of LatAnalyze.
|
||||
|
||||
LatAnalyze is written in C++11 and requires a rather recent C++ compiler to be built. It has been successfully built on various Linux and OS X platforms using clang (from 3.7), GCC (from 4.9) and the Intel C++ compiler (2016).
|
||||
The strict dependencies are the [GSL](http://www.gnu.org/software/gsl/) and [LatCore](https://github.com/aportelli/LatCore).
|
||||
Additionally, autoconf, automake (from 1.11), libtool, bison (from 3.0) and flex are necessary to build the library. Unless you use a very exotic system, these tools are standard on any Unix platform and should be already present or easy to install through a package manager.
|
||||
Optional dependencies are [HDF5](https://www.hdfgroup.org/HDF5/) (built with C++ support), [Minuit](http://seal.web.cern.ch/seal/snapshot/work-packages/mathlibs/minuit/) and [NLopt](http://ab-initio.mit.edu/wiki/index.php/NLopt).
|
||||
LatAnalyze is written in C++14. It has been successfully built on various Unix platform using reasonably recent versions of Clang or GCC.
|
||||
The only strict dependencies are the [GSL](http://www.gnu.org/software/gsl/) and [HDF5](https://www.hdfgroup.org/HDF5/) (built with C++ support).
|
||||
Additionally, cmake (from 3.11), bison (from 3.0) and flex are necessary to build the library. Unless you use a very exotic system, these tools are standard on any Unix platform and should be already present or easy to install through a package manager.
|
||||
Optional dependencies are [Minuit 2](https://github.com/root-project/root/tree/master/math/minuit2) and [NLopt](http://ab-initio.mit.edu/wiki/index.php/NLopt).
|
||||
|
||||
LatAnalyze is built through CMake. Below are example instructions for compiling and installing LatAnalyze.
|
||||
|
||||
### Portable quick installation
|
||||
For a quick installation with all possible extensions execute:
|
||||
```
|
||||
./install-latan.sh <prefix> {osx|linux}
|
||||
./install-latan.sh <prefix>
|
||||
```
|
||||
in the `ci-scripts` directory where `<prefix>` is where you want LatAnalyze (and its dependencies) to be installed and `{osx|linux}` should be the name of your OS. This script will automatically download, build and install LatCore, HDF5, Minuit and NLopt. It is assumed that the GSL can be found in a standard location (_e.g._ it has been installed through a package manager for Linux and is present in `/usr/local` for OS X).
|
||||
in the `ci-scripts` directory where `<prefix>` is where you want LatAnalyze (and its dependencies) to be installed. This script will automatically download, build and install GSL, HDF5, Minuit, and NLopt.
|
||||
|
||||
For a more customised installation, one first needs to generate the build system by running `./bootstrap.sh` in the root directory. Then the library can be built and installed through the usual GNU mantra `./configure <options> && make && make install`. Use `./configure --help` to obtain a list of possible options for `./configure`. Because Eigen expressions rely a lot on inlining and compiler optimisations it is strongly recommended to set the `CXXFLAGS` variable to `-O3 -march=native -mtune=native`.
|
||||
### Quick installation on macOS with dependencies through Homebrew
|
||||
All the dependencies of LatAnalyze can be installed through the [Homebrew](https://brew.sh) package manager.
|
||||
```
|
||||
brew install automake autoconf libtool bison flex gsl minuit2 nlopt hdf5
|
||||
```
|
||||
Then build the library with `cmake`
|
||||
```
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_INSTALL_PREFIX=<prefix> -DCMAKE_BUILD_TYPE=Release ..
|
||||
make -j <n>
|
||||
make install
|
||||
```
|
||||
where `<prefix>` should be replaced by the desired prefix for LatAnalyze installation, and `<n>` is the number of parallel build processes.
|
||||
|
||||
### Dependencies through Homebrew/Linuxbrew
|
||||
If you use Homebrew/Linuxbrew to manage packages, the following command can install all the dependencies of LatAnalyze (including optional ones)
|
||||
|
||||
## Using LatAnalyze in CMake projects
|
||||
When LatAnalyze is installed, the necessary CMake module configuration files to link against the library are available in the installation prefix.
|
||||
|
||||
To link against LatAnalyze in a downstream CMake project, simply use
|
||||
```cmake
|
||||
find_package(LatAnalyze)
|
||||
target_link_libraries(<my_app> LatAnalyze::LatAnalyze)
|
||||
```
|
||||
where `<my_app>` is a CMake target. If LatAnalyze was installed in a non-standard prefix, you might have to set `CMAKE_PREFIX_PATH` accordingly for `find_package` to be successful.
|
||||
|
||||
You can additionally modify the `find_package` to ensure specific components are supported
|
||||
```cmake
|
||||
find_package(LatAnalyze REQUIRED COMPONENTS <...>)
|
||||
```
|
||||
where `<...>` is a space separated list of components. Currently available components are
|
||||
- `MINUIT2`: Minuit 2 minimisers
|
||||
- `NLOPT`: NLopt minimisers
|
||||
|
||||
## History
|
||||
#### v3.6
|
||||
Build system:
|
||||
* automake build discontinued, now using CMake
|
||||
* CI through GitHub Actions
|
||||
|
||||
Additions:
|
||||
* Discrete wavelet transform
|
||||
* Thread pools
|
||||
* Correlation dynamic range (CDR) calculation
|
||||
* Data filtering and CDR optimisation
|
||||
|
||||
Changes:
|
||||
* Significant optimisation of covariance matrix calculation
|
||||
* Covariance matrix available for any `StatArray` (not only resampled arrays)
|
||||
|
||||
#### v3.5.1
|
||||
Various fixes and cleaning of outdated code.
|
||||
|
||||
#### v3.5
|
||||
Additions:
|
||||
* 'Impulse' & line type plots
|
||||
* Plot line width & dash modifiers
|
||||
* Plot palettes (`category10` by default)
|
||||
* Multivariate Gaussian RNG
|
||||
* 2-pt fitter 'scan' mode over all possible fit ranges
|
||||
* Command line utility for plotting data
|
||||
|
||||
Changes:
|
||||
* Complete overhaul of the header structure
|
||||
* Integration of LatCore in LatAnalyze
|
||||
* p-value is now a 2-sided chi^2 test, 1-sided value kept as 'chi^2 CCDF'
|
||||
|
||||
Fixes:
|
||||
* Matrix plot data now saving correctly
|
||||
* Many compatibility fixes
|
||||
|
||||
#### v3.4
|
||||
Additions:
|
||||
* `latan-config` utility to easily compile LatAnalyze-based programs
|
||||
* Linear and constant models to the 2-point fitter
|
||||
|
||||
Changes:
|
||||
* HDF5 is now a compulsory dependency
|
||||
|
||||
Fixes:
|
||||
* Variance matrix computation fix.
|
||||
|
||||
#### v3.3
|
||||
Additions:
|
||||
* Sample plot CL utility.
|
||||
@ -78,7 +145,7 @@ Fixes:
|
||||
* Variance matrix computation fix.
|
||||
|
||||
#### v3.2.1
|
||||
Fix:
|
||||
Fixes:
|
||||
* Wrong argument number check in `latan-resample`
|
||||
|
||||
#### v3.2 (needs LatCore 1.1)
|
||||
@ -116,4 +183,4 @@ Fixes:
|
||||
#### v3.0
|
||||
Commit `7b4f2884a5e99bbfab4d4bd7623f609a55403c39`.
|
||||
First 'stable' version of LatAnalyze in C++. The v2.0 refers to the [C version](https://github.com/aportelli/LatAnalyze-legacy) and v1.0 to an old undistributed version.
|
||||
**This version compiles fine on OS X with clang but does have many portability issues to other platforms/compilers, v3.1 is the first real release.**
|
||||
**This version compiles fine on OS X with clang but does have many portability issues to other platforms/compilers, v3.1 is the first real release.**
|
||||
|
542
acinclude.m4
542
acinclude.m4
@ -1,542 +0,0 @@
|
||||
AC_DEFUN([AX_GCC_OPTION], [
|
||||
AC_REQUIRE([AC_PROG_CC])
|
||||
|
||||
AC_MSG_CHECKING([if gcc accepts $1 option])
|
||||
|
||||
AS_IF([ test "x$GCC" = "xyes" ],[
|
||||
AS_IF([ test -z "$3" ],[
|
||||
ax_gcc_option_test="int main()
|
||||
{
|
||||
return 0;
|
||||
}"
|
||||
],[
|
||||
ax_gcc_option_test="$3"
|
||||
])
|
||||
|
||||
# Dump the test program to file
|
||||
cat <<EOF > conftest.c
|
||||
$ax_gcc_option_test
|
||||
EOF
|
||||
|
||||
# Dump back the file to the log, useful for debugging purposes
|
||||
AC_TRY_COMMAND(cat conftest.c 1>&AS_MESSAGE_LOG_FD)
|
||||
|
||||
AS_IF([ AC_TRY_COMMAND($CC $2 $1 -c conftest.c 1>&AS_MESSAGE_LOG_FD) ],[
|
||||
AC_MSG_RESULT([yes])
|
||||
$4
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
$5
|
||||
])
|
||||
],[
|
||||
AC_MSG_RESULT([no gcc available])
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([AX_GCC_VERSION], [
|
||||
GCC_VERSION=""
|
||||
AX_GCC_OPTION([-dumpversion],[],[],[
|
||||
ax_gcc_version_option=yes
|
||||
],[
|
||||
ax_gcc_version_option=no
|
||||
])
|
||||
AS_IF([test "x$GCC" = "xyes"],[
|
||||
AS_IF([test "x$ax_gcc_version_option" != "xno"],[
|
||||
AC_CACHE_CHECK([gcc version],[ax_cv_gcc_version],[
|
||||
ax_cv_gcc_version="`$CC -dumpversion`"
|
||||
AS_IF([test "x$ax_cv_gcc_version" = "x"],[
|
||||
ax_cv_gcc_version=""
|
||||
])
|
||||
])
|
||||
GCC_VERSION=$ax_cv_gcc_version
|
||||
])
|
||||
])
|
||||
AC_SUBST([GCC_VERSION])
|
||||
])
|
||||
|
||||
AC_DEFUN([AX_GXX_VERSION], [
|
||||
GXX_VERSION=""
|
||||
AX_GCC_OPTION([-dumpversion],[],[],[
|
||||
ax_gcc_version_option=yes
|
||||
],[
|
||||
ax_gcc_version_option=no
|
||||
])
|
||||
AS_IF([test "x$GXX" = "xyes"],[
|
||||
AS_IF([test "x$ax_gxx_version_option" != "no"],[
|
||||
AC_CACHE_CHECK([gxx version],[ax_cv_gxx_version],[
|
||||
ax_cv_gxx_version="`$CXX -dumpversion`"
|
||||
AS_IF([test "x$ax_cv_gxx_version" = "x"],[
|
||||
ax_cv_gxx_version=""
|
||||
])
|
||||
])
|
||||
GXX_VERSION=$ax_cv_gxx_version
|
||||
])
|
||||
])
|
||||
AC_SUBST([GXX_VERSION])
|
||||
])
|
||||
|
||||
AC_DEFUN([AX_COMPILER_VENDOR],
|
||||
[
|
||||
AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
|
||||
[ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=unknown
|
||||
# note: don't check for gcc first since some other compilers define __GNUC__
|
||||
for ventest in intel:__ICC,__ECC,__INTEL_COMPILER ibm:__xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale:__PATHCC__,__PATHSCALE__ gnu:__GNUC__ sun:__SUNPRO_C,__SUNPRO_CC hp:__HP_cc,__HP_aCC dec:__DECC,__DECCXX,__DECC_VER,__DECCXX_VER borland:__BORLANDC__,__TURBOC__ comeau:__COMO__ cray:_CRAYC kai:__KCC lcc:__LCC__ metrowerks:__MWERKS__ sgi:__sgi,sgi microsoft:_MSC_VER watcom:__WATCOMC__ portland:__PGI; do
|
||||
vencpp="defined("`echo $ventest | cut -d: -f2 | sed 's/,/) || defined(/g'`")"
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
|
||||
#if !($vencpp)
|
||||
thisisanerror;
|
||||
#endif
|
||||
])], [ax_cv_]_AC_LANG_ABBREV[_compiler_vendor=`echo $ventest | cut -d: -f1`; break])
|
||||
done
|
||||
])
|
||||
])
|
||||
|
||||
# ============================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
|
||||
# ============================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# Check for baseline language coverage in the compiler for the C++11
|
||||
# standard; if necessary, add switches to CXXFLAGS to enable support.
|
||||
#
|
||||
# The first argument, if specified, indicates whether you insist on an
|
||||
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
|
||||
# -std=c++11). If neither is specified, you get whatever works, with
|
||||
# preference for an extended mode.
|
||||
#
|
||||
# The second argument, if specified 'mandatory' or if left unspecified,
|
||||
# indicates that baseline C++11 support is required and that the macro
|
||||
# should error out if no mode with that support is found. If specified
|
||||
# 'optional', then configuration proceeds regardless, after defining
|
||||
# HAVE_CXX11 if and only if a supporting mode is found.
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
|
||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
|
||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
|
||||
# Copyright (c) 2014 Alexey Sokolov <sokolov@google.com>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[
|
||||
template <typename T>
|
||||
struct check
|
||||
{
|
||||
static_assert(sizeof(int) <= sizeof(T), "not big enough");
|
||||
};
|
||||
|
||||
struct Base {
|
||||
virtual void f() {}
|
||||
};
|
||||
struct Child : public Base {
|
||||
virtual void f() override {}
|
||||
};
|
||||
|
||||
typedef check<check<bool>> right_angle_brackets;
|
||||
|
||||
int a;
|
||||
decltype(a) b;
|
||||
|
||||
typedef check<int> check_type;
|
||||
check_type c;
|
||||
check_type&& cr = static_cast<check_type&&>(c);
|
||||
|
||||
auto d = a;
|
||||
auto l = [](){};
|
||||
]])
|
||||
|
||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
|
||||
m4_if([$1], [], [],
|
||||
[$1], [ext], [],
|
||||
[$1], [noext], [],
|
||||
[m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
|
||||
m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
|
||||
[$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
|
||||
[$2], [optional], [ax_cxx_compile_cxx11_required=false],
|
||||
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])
|
||||
AC_LANG_PUSH([C++])dnl
|
||||
ac_success=no
|
||||
AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
|
||||
ax_cv_cxx_compile_cxx11,
|
||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
|
||||
[ax_cv_cxx_compile_cxx11=yes],
|
||||
[ax_cv_cxx_compile_cxx11=no])])
|
||||
if test x$ax_cv_cxx_compile_cxx11 = xyes; then
|
||||
ac_success=yes
|
||||
fi
|
||||
|
||||
m4_if([$1], [noext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
for switch in -std=gnu++11 -std=gnu++0x; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
|
||||
m4_if([$1], [ext], [], [dnl
|
||||
if test x$ac_success = xno; then
|
||||
for switch in -std=c++11 -std=c++0x; do
|
||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
|
||||
AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
|
||||
$cachevar,
|
||||
[ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
|
||||
[eval $cachevar=yes],
|
||||
[eval $cachevar=no])
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"])
|
||||
if eval test x\$$cachevar = xyes; then
|
||||
CXXFLAGS="$CXXFLAGS $switch"
|
||||
ac_success=yes
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi])
|
||||
AC_LANG_POP([C++])
|
||||
if test x$ax_cxx_compile_cxx11_required = xtrue; then
|
||||
if test x$ac_success = xno; then
|
||||
AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
|
||||
fi
|
||||
else
|
||||
if test x$ac_success = xno; then
|
||||
HAVE_CXX11=0
|
||||
AC_MSG_NOTICE([No compiler with C++11 support was found])
|
||||
else
|
||||
HAVE_CXX11=1
|
||||
AC_DEFINE(HAVE_CXX11,1,
|
||||
[define if the compiler supports basic C++11 syntax])
|
||||
fi
|
||||
|
||||
AC_SUBST(HAVE_CXX11)
|
||||
fi
|
||||
])
|
||||
|
||||
# ===========================================================================
|
||||
# http://www.gnu.org/software/autoconf-archive/ax_lib_hdf5.html
|
||||
# ===========================================================================
|
||||
#
|
||||
# SYNOPSIS
|
||||
#
|
||||
# AX_LIB_HDF5([serial/parallel])
|
||||
#
|
||||
# DESCRIPTION
|
||||
#
|
||||
# This macro provides tests of the availability of HDF5 library.
|
||||
#
|
||||
# The optional macro argument should be either 'serial' or 'parallel'. The
|
||||
# former only looks for serial HDF5 installations via h5cc. The latter
|
||||
# only looks for parallel HDF5 installations via h5pcc. If the optional
|
||||
# argument is omitted, serial installations will be preferred over
|
||||
# parallel ones.
|
||||
#
|
||||
# The macro adds a --with-hdf5 option accepting one of three values:
|
||||
#
|
||||
# no - do not check for the HDF5 library.
|
||||
# yes - do check for HDF5 library in standard locations.
|
||||
# path - complete path to the HDF5 helper script h5cc or h5pcc.
|
||||
#
|
||||
# If HDF5 is successfully found, this macro calls
|
||||
#
|
||||
# AC_SUBST(HDF5_VERSION)
|
||||
# AC_SUBST(HDF5_CC)
|
||||
# AC_SUBST(HDF5_CFLAGS)
|
||||
# AC_SUBST(HDF5_CPPFLAGS)
|
||||
# AC_SUBST(HDF5_LDFLAGS)
|
||||
# AC_SUBST(HDF5_LIBS)
|
||||
# AC_SUBST(HDF5_FC)
|
||||
# AC_SUBST(HDF5_FFLAGS)
|
||||
# AC_SUBST(HDF5_FLIBS)
|
||||
# AC_DEFINE(HAVE_HDF5)
|
||||
#
|
||||
# and sets with_hdf5="yes". Additionally, the macro sets
|
||||
# with_hdf5_fortran="yes" if a matching Fortran wrapper script is found.
|
||||
# Note that Autconf's Fortran support is not used to perform this check.
|
||||
# H5CC and H5FC will contain the appropriate serial or parallel HDF5
|
||||
# wrapper script locations.
|
||||
#
|
||||
# If HDF5 is disabled or not found, this macros sets with_hdf5="no" and
|
||||
# with_hdf5_fortran="no".
|
||||
#
|
||||
# Your configuration script can test $with_hdf to take any further
|
||||
# actions. HDF5_{C,CPP,LD}FLAGS may be used when building with C or C++.
|
||||
# HDF5_F{FLAGS,LIBS} should be used when building Fortran applications.
|
||||
#
|
||||
# To use the macro, one would code one of the following in "configure.ac"
|
||||
# before AC_OUTPUT:
|
||||
#
|
||||
# 1) dnl Check for HDF5 support
|
||||
# AX_LIB_HDF5()
|
||||
#
|
||||
# 2) dnl Check for serial HDF5 support
|
||||
# AX_LIB_HDF5([serial])
|
||||
#
|
||||
# 3) dnl Check for parallel HDF5 support
|
||||
# AX_LIB_HDF5([parallel])
|
||||
#
|
||||
# One could test $with_hdf5 for the outcome or display it as follows
|
||||
#
|
||||
# echo "HDF5 support: $with_hdf5"
|
||||
#
|
||||
# You could also for example, override the default CC in "configure.ac" to
|
||||
# enforce compilation with the compiler that HDF5 uses:
|
||||
#
|
||||
# AX_LIB_HDF5([parallel])
|
||||
# if test "$with_hdf5" = "yes"; then
|
||||
# CC="$HDF5_CC"
|
||||
# else
|
||||
# AC_MSG_ERROR([Unable to find HDF5, we need parallel HDF5.])
|
||||
# fi
|
||||
#
|
||||
# LICENSE
|
||||
#
|
||||
# Copyright (c) 2009 Timothy Brown <tbrown@freeshell.org>
|
||||
# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com>
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice
|
||||
# and this notice are preserved. This file is offered as-is, without any
|
||||
# warranty.
|
||||
|
||||
AC_DEFUN([AX_LIB_HDF5], [
|
||||
|
||||
AC_REQUIRE([AC_PROG_SED])
|
||||
AC_REQUIRE([AC_PROG_AWK])
|
||||
AC_REQUIRE([AC_PROG_GREP])
|
||||
|
||||
dnl Check first argument is one of the recognized values.
|
||||
dnl Fail eagerly if is incorrect as this simplifies case statements below.
|
||||
if test "m4_normalize(m4_default([$1],[]))" = "" ; then
|
||||
: # Recognized value
|
||||
elif test "m4_normalize(m4_default([$1],[]))" = "serial" ; then
|
||||
: # Recognized value
|
||||
elif test "m4_normalize(m4_default([$1],[]))" = "parallel"; then
|
||||
: # Recognized value
|
||||
else
|
||||
AC_MSG_ERROR([
|
||||
Unrecognized value for AX[]_LIB_HDF5 within configure.ac.
|
||||
If supplied, argument 1 must be either 'serial' or 'parallel'.
|
||||
])
|
||||
fi
|
||||
|
||||
dnl Add a default --with-hdf5 configuration option.
|
||||
AC_ARG_WITH([hdf5],
|
||||
AS_HELP_STRING(
|
||||
[--with-hdf5=[yes/no/PATH]],
|
||||
m4_case(m4_normalize([$1]),
|
||||
[serial], [location of h5cc for serial HDF5 configuration],
|
||||
[parallel], [location of h5pcc for parallel HDF5 configuration],
|
||||
[location of h5cc or h5pcc for HDF5 configuration])
|
||||
),
|
||||
[if test "$withval" = "no"; then
|
||||
with_hdf5="no"
|
||||
elif test "$withval" = "yes"; then
|
||||
with_hdf5="yes"
|
||||
else
|
||||
with_hdf5="yes"
|
||||
H5CC="$withval"
|
||||
fi],
|
||||
[with_hdf5="yes"]
|
||||
)
|
||||
|
||||
dnl Set defaults to blank
|
||||
HDF5_CC=""
|
||||
HDF5_VERSION=""
|
||||
HDF5_CFLAGS=""
|
||||
HDF5_CPPFLAGS=""
|
||||
HDF5_LDFLAGS=""
|
||||
HDF5_LIBS=""
|
||||
HDF5_FC=""
|
||||
HDF5_FFLAGS=""
|
||||
HDF5_FLIBS=""
|
||||
|
||||
dnl Try and find hdf5 compiler tools and options.
|
||||
if test "$with_hdf5" = "yes"; then
|
||||
if test -z "$H5CC"; then
|
||||
dnl Check to see if H5CC is in the path.
|
||||
AC_PATH_PROGS(
|
||||
[H5CC],
|
||||
m4_case(m4_normalize([$1]),
|
||||
[serial], [h5cc],
|
||||
[parallel], [h5pcc],
|
||||
[h5cc h5pcc]),
|
||||
[])
|
||||
else
|
||||
AC_MSG_CHECKING([Using provided HDF5 C wrapper])
|
||||
AC_MSG_RESULT([$H5CC])
|
||||
fi
|
||||
AC_MSG_CHECKING([for HDF5 libraries])
|
||||
if test ! -f "$H5CC" || test ! -x "$H5CC"; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_WARN(m4_case(m4_normalize([$1]),
|
||||
[serial], [
|
||||
Unable to locate serial HDF5 compilation helper script 'h5cc'.
|
||||
Please specify --with-hdf5=<LOCATION> as the full path to h5cc.
|
||||
HDF5 support is being disabled (equivalent to --with-hdf5=no).
|
||||
], [parallel],[
|
||||
Unable to locate parallel HDF5 compilation helper script 'h5pcc'.
|
||||
Please specify --with-hdf5=<LOCATION> as the full path to h5pcc.
|
||||
HDF5 support is being disabled (equivalent to --with-hdf5=no).
|
||||
], [
|
||||
Unable to locate HDF5 compilation helper scripts 'h5cc' or 'h5pcc'.
|
||||
Please specify --with-hdf5=<LOCATION> as the full path to h5cc or h5pcc.
|
||||
HDF5 support is being disabled (equivalent to --with-hdf5=no).
|
||||
]))
|
||||
with_hdf5="no"
|
||||
with_hdf5_fortran="no"
|
||||
else
|
||||
dnl Get the h5cc output
|
||||
HDF5_SHOW=$(eval $H5CC -show)
|
||||
|
||||
dnl Get the actual compiler used
|
||||
HDF5_CC=$(eval $H5CC -show | $AWK '{print $[]1}')
|
||||
if test "$HDF5_CC" = "ccache"; then
|
||||
HDF5_CC=$(eval $H5CC -show | $AWK '{print $[]2}')
|
||||
fi
|
||||
|
||||
dnl h5cc provides both AM_ and non-AM_ options
|
||||
dnl depending on how it was compiled either one of
|
||||
dnl these are empty. Lets roll them both into one.
|
||||
|
||||
dnl Look for "HDF5 Version: X.Y.Z"
|
||||
HDF5_VERSION=$(eval $H5CC -showconfig | $GREP 'HDF5 Version:' \
|
||||
| $AWK '{print $[]3}')
|
||||
|
||||
dnl A ideal situation would be where everything we needed was
|
||||
dnl in the AM_* variables. However most systems are not like this
|
||||
dnl and seem to have the values in the non-AM variables.
|
||||
dnl
|
||||
dnl We try the following to find the flags:
|
||||
dnl (1) Look for "NAME:" tags
|
||||
dnl (2) Look for "H5_NAME:" tags
|
||||
dnl (3) Look for "AM_NAME:" tags
|
||||
dnl
|
||||
HDF5_tmp_flags=$(eval $H5CC -showconfig \
|
||||
| $GREP 'FLAGS\|Extra libraries:' \
|
||||
| $AWK -F: '{printf("%s "), $[]2}' )
|
||||
|
||||
dnl Find the installation directory and append include/
|
||||
HDF5_tmp_inst=$(eval $H5CC -showconfig \
|
||||
| $GREP 'Installation point:' \
|
||||
| $AWK '{print $[]NF}' )
|
||||
|
||||
dnl Add this to the CPPFLAGS
|
||||
HDF5_CPPFLAGS="-I${HDF5_tmp_inst}/include"
|
||||
|
||||
dnl Now sort the flags out based upon their prefixes
|
||||
for arg in $HDF5_SHOW $HDF5_tmp_flags ; do
|
||||
case "$arg" in
|
||||
-I*) echo $HDF5_CPPFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \
|
||||
|| HDF5_CPPFLAGS="$arg $HDF5_CPPFLAGS"
|
||||
;;
|
||||
-L*) echo $HDF5_LDFLAGS | $GREP -e "$arg" 2>&1 >/dev/null \
|
||||
|| HDF5_LDFLAGS="$arg $HDF5_LDFLAGS"
|
||||
;;
|
||||
-l*) echo $HDF5_LIBS | $GREP -e "$arg" 2>&1 >/dev/null \
|
||||
|| HDF5_LIBS="$arg $HDF5_LIBS"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
HDF5_LIBS="$HDF5_LIBS -lhdf5"
|
||||
AC_MSG_RESULT([yes (version $[HDF5_VERSION])])
|
||||
|
||||
dnl See if we can compile
|
||||
ax_lib_hdf5_save_CC=$CC
|
||||
ax_lib_hdf5_save_CPPFLAGS=$CPPFLAGS
|
||||
ax_lib_hdf5_save_LIBS=$LIBS
|
||||
ax_lib_hdf5_save_LDFLAGS=$LDFLAGS
|
||||
CC=$HDF5_CC
|
||||
CPPFLAGS=$HDF5_CPPFLAGS
|
||||
LIBS=$HDF5_LIBS
|
||||
LDFLAGS=$HDF5_LDFLAGS
|
||||
AC_CHECK_HEADER([hdf5.h], [ac_cv_hadf5_h=yes], [ac_cv_hadf5_h=no])
|
||||
AC_CHECK_LIB([hdf5], [H5Fcreate], [ac_cv_libhdf5=yes],
|
||||
[ac_cv_libhdf5=no])
|
||||
if test "$ac_cv_hadf5_h" = "no" && test "$ac_cv_libhdf5" = "no" ; then
|
||||
AC_MSG_WARN([Unable to compile HDF5 test program])
|
||||
fi
|
||||
dnl Look for HDF5's high level library
|
||||
AC_HAVE_LIBRARY([hdf5_hl], [HDF5_LIBS="$HDF5_LIBS -lhdf5_hl"], [], [])
|
||||
|
||||
CC=$ax_lib_hdf5_save_CC
|
||||
CPPFLAGS=$ax_lib_hdf5_save_CPPFLAGS
|
||||
LIBS=$ax_lib_hdf5_save_LIBS
|
||||
LDFLAGS=$ax_lib_hdf5_save_LDFLAGS
|
||||
|
||||
AC_MSG_CHECKING([for matching HDF5 Fortran wrapper])
|
||||
dnl Presume HDF5 Fortran wrapper is just a name variant from H5CC
|
||||
H5FC=$(eval echo -n $H5CC | $SED -n 's/cc$/fc/p')
|
||||
if test -x "$H5FC"; then
|
||||
AC_MSG_RESULT([$H5FC])
|
||||
with_hdf5_fortran="yes"
|
||||
AC_SUBST([H5FC])
|
||||
|
||||
dnl Again, pry any remaining -Idir/-Ldir from compiler wrapper
|
||||
for arg in `$H5FC -show`
|
||||
do
|
||||
case "$arg" in #(
|
||||
-I*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \
|
||||
|| HDF5_FFLAGS="$arg $HDF5_FFLAGS"
|
||||
;;#(
|
||||
-L*) echo $HDF5_FFLAGS | $GREP -e "$arg" >/dev/null \
|
||||
|| HDF5_FFLAGS="$arg $HDF5_FFLAGS"
|
||||
dnl HDF5 installs .mod files in with libraries,
|
||||
dnl but some compilers need to find them with -I
|
||||
echo $HDF5_FFLAGS | $GREP -e "-I${arg#-L}" >/dev/null \
|
||||
|| HDF5_FFLAGS="-I${arg#-L} $HDF5_FFLAGS"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
dnl Make Fortran link line by inserting Fortran libraries
|
||||
for arg in $HDF5_LIBS
|
||||
do
|
||||
case "$arg" in #(
|
||||
-lhdf5_hl) HDF5_FLIBS="$HDF5_FLIBS -lhdf5hl_fortran $arg"
|
||||
;; #(
|
||||
-lhdf5) HDF5_FLIBS="$HDF5_FLIBS -lhdf5_fortran $arg"
|
||||
;; #(
|
||||
*) HDF5_FLIBS="$HDF5_FLIBS $arg"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
with_hdf5_fortran="no"
|
||||
fi
|
||||
|
||||
AC_SUBST([HDF5_VERSION])
|
||||
AC_SUBST([HDF5_CC])
|
||||
AC_SUBST([HDF5_CFLAGS])
|
||||
AC_SUBST([HDF5_CPPFLAGS])
|
||||
AC_SUBST([HDF5_LDFLAGS])
|
||||
AC_SUBST([HDF5_LIBS])
|
||||
AC_SUBST([HDF5_FC])
|
||||
AC_SUBST([HDF5_FFLAGS])
|
||||
AC_SUBST([HDF5_FLIBS])
|
||||
AC_DEFINE([HAVE_HDF5], [1], [Defined if you have HDF5 support])
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
rm -rf .buildutils
|
||||
mkdir -p .buildutils/m4
|
||||
autoreconf -fvi
|
24
build.sh
24
build.sh
@ -1,24 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
PREFIX=`cat Makefile | grep '^prefix =' | awk '{print $3}'`
|
||||
case $1 in
|
||||
'')
|
||||
echo '-- building...'
|
||||
make -j8
|
||||
echo '-- installing...'
|
||||
make uninstall 1>/dev/null
|
||||
make install 1>/dev/null;;
|
||||
# if [[ `basename \`pwd\`` == "lib" ]]
|
||||
# then
|
||||
# echo '-- creating debug symbols...'
|
||||
# dsymutil .libs/libLatAnalyze.0.dylib -o ${PREFIX}/lib/libLatAnalyze.0.dylib.dSYM
|
||||
# fi;;
|
||||
'clean')
|
||||
echo '-- cleaning...'
|
||||
make -j8 clean;;
|
||||
*)
|
||||
echo 'error: unknown action' 1>&2
|
||||
exit 1;;
|
||||
esac
|
@ -1,16 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if (( $# != 1 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
mkdir -p local/build
|
||||
for d in nlopt minuit hdf5; do
|
||||
for d in gsl nlopt minuit hdf5; do
|
||||
if [ ! -e local/.built.${d} ]; then
|
||||
./install-${d}.sh ${PREFIX}
|
||||
./install-${d}.sh "${prefix}" "${ntasks}"
|
||||
fi
|
||||
done
|
||||
./install-latcore.sh ${PREFIX}
|
||||
|
27
ci-scripts/install-gsl.sh
Executable file
27
ci-scripts/install-gsl.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
name='gsl-2.6'
|
||||
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
init_dir=$(pwd -P)
|
||||
mkdir -p "${prefix}"
|
||||
cd "${prefix}"
|
||||
prefix=$(pwd -P)
|
||||
cd "${init_dir}/local/build"
|
||||
wget http://ftpmirror.gnu.org/gsl/${name}.tar.gz
|
||||
tar -xzvf ${name}.tar.gz
|
||||
mkdir -p ${name}/build
|
||||
cd ${name}/build
|
||||
../configure --prefix="${prefix}"
|
||||
make -j"${ntasks}"
|
||||
make install
|
||||
cd "${init_dir}/local"
|
||||
touch .built.gsl
|
||||
cd "${init_dir}"
|
@ -1,23 +1,27 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
NAME='hdf5-1.10.1'
|
||||
name='hdf5-1.14.3'
|
||||
|
||||
if (( $# != 1 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
INITDIR=`pwd`
|
||||
cd local/build
|
||||
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/${NAME}/src/${NAME}.tar.gz
|
||||
tar -xzvf ${NAME}.tar.gz
|
||||
mkdir ${NAME}/build
|
||||
cd ${NAME}/build
|
||||
../configure --prefix=${PREFIX} --enable-cxx
|
||||
make -j4
|
||||
init_dir=$(pwd -P)
|
||||
mkdir -p "${prefix}"
|
||||
cd "${prefix}"
|
||||
prefix=$(pwd -P)
|
||||
cd "${init_dir}/local/build"
|
||||
wget "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/${name}/src/${name}.tar.gz"
|
||||
tar -xzvf ${name}.tar.gz
|
||||
mkdir ${name}/build
|
||||
cd ${name}/build
|
||||
../configure --prefix="${prefix}" --enable-cxx
|
||||
make -j "${ntasks}"
|
||||
make install
|
||||
cd ${INITDIR}/local
|
||||
cd "${init_dir}/local"
|
||||
touch .built.hdf5
|
||||
cd ${INITDIR}
|
||||
cd "${init_dir}"
|
||||
|
@ -1,19 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if (( $# != 2 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
OS=$2
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
./install-deps.sh ${PREFIX}
|
||||
cd ..
|
||||
./bootstrap.sh
|
||||
mkdir -p build
|
||||
cd build
|
||||
if [[ "$OS" == "osx" ]]; then EXTRA_FLAGS='--with-gsl=/usr/local'; fi
|
||||
../configure --prefix=$PREFIX --with-minuit=$PREFIX --with-nlopt=$PREFIX --with-latcore=$PREFIX --with-hdf5=$PREFIX $EXTRA_FLAGS CXXFLAGS='-O3 -march=native -mtune=native'
|
||||
make -j4
|
||||
init_dir=$(pwd -P)
|
||||
mkdir -p "${prefix}"
|
||||
cd "${prefix}"
|
||||
prefix=$(pwd -P)
|
||||
cd "${init_dir}"
|
||||
./install-deps.sh "${prefix}" "${ntasks}"
|
||||
mkdir -p "${init_dir}/local/build/latan"
|
||||
cd "${init_dir}/local/build/latan"
|
||||
cmake -DCMAKE_INSTALL_PREFIX="${prefix}" -DCMAKE_PREFIX_PATH="${prefix}" \
|
||||
-DCMAKE_BUILD_TYPE="RelWithDebInfo" "${init_dir}/.."
|
||||
make -j "${ntasks}"
|
||||
make install
|
||||
|
@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if (( $# != 1 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
|
||||
set -ex
|
||||
INITDIR=`pwd`
|
||||
cd local/build
|
||||
if [ -d LatCore ]; then
|
||||
cd LatCore
|
||||
git pull origin master
|
||||
else
|
||||
git clone https://github.com/aportelli/LatCore.git
|
||||
mkdir LatCore/build
|
||||
cd LatCore
|
||||
./bootstrap.sh
|
||||
fi
|
||||
cd build
|
||||
../configure --prefix=${PREFIX}
|
||||
make -j4
|
||||
make install
|
||||
cd ${INITDIR}
|
@ -1,23 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
NAME='Minuit2-5.34.14'
|
||||
|
||||
if (( $# != 1 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
INITDIR=`pwd`
|
||||
cd local/build
|
||||
wget http://www.cern.ch/mathlibs/sw/5_34_14/Minuit2/${NAME}.tar.gz
|
||||
tar -xzvf ${NAME}.tar.gz
|
||||
mkdir -p ${NAME}/build
|
||||
cd ${NAME}/build
|
||||
../configure --prefix=${PREFIX} --disable-openmp
|
||||
make -j4
|
||||
init_dir=$(pwd -P)
|
||||
mkdir -p "${prefix}"
|
||||
cd "${prefix}"
|
||||
prefix=$(pwd -P)
|
||||
cd "${init_dir}/local/build"
|
||||
rm -rf root
|
||||
git clone https://github.com/root-project/root.git
|
||||
cd root/math/minuit2/
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -Dminuit2_standalone=ON -DCMAKE_INSTALL_PREFIX="${prefix}"
|
||||
make -j "${ntasks}"
|
||||
make install
|
||||
cd ${INITDIR}/local
|
||||
cd "${init_dir}/local"
|
||||
touch .built.minuit
|
||||
cd ${INITDIR}
|
||||
cd "${init_dir}"
|
||||
|
@ -1,23 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
NAME='nlopt-2.4.2'
|
||||
name='2.6.1'
|
||||
|
||||
if (( $# != 1 )); then
|
||||
echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
|
||||
if (($# != 2)); then
|
||||
echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
PREFIX=$1
|
||||
prefix=$1
|
||||
ntasks=$2
|
||||
|
||||
set -ex
|
||||
INITDIR=`pwd`
|
||||
cd local/build
|
||||
wget http://ab-initio.mit.edu/nlopt/${NAME}.tar.gz
|
||||
tar -xzvf ${NAME}.tar.gz
|
||||
mkdir -p ${NAME}/build
|
||||
cd ${NAME}/build
|
||||
../configure --prefix=${PREFIX} --with-cxx --without-guile --without-python --without-octave --without-matlab --with-pic
|
||||
make -j4
|
||||
init_dir=$(pwd -P)
|
||||
mkdir -p "${prefix}"
|
||||
cd "${prefix}"
|
||||
prefix=$(pwd -P)
|
||||
cd "${init_dir}/local/build"
|
||||
wget "https://github.com/stevengj/nlopt/archive/v${name}.tar.gz"
|
||||
tar -xzvf v${name}.tar.gz
|
||||
name=nlopt-${name}
|
||||
mkdir -p ${name}/build
|
||||
cd ${name}/build
|
||||
cmake -DCMAKE_INSTALL_PREFIX="${prefix}" -DCMAKE_BUILD_WITH_INSTALL_NAME_DIR=TRUE \
|
||||
-DCMAKE_INSTALL_NAME_DIR="${prefix}/lib" -DNLOPT_PYTHON=OFF -DNLOPT_OCTAVE=OFF \
|
||||
-DNLOPT_MATLAB=OFF -DNLOPT_GUILE=OFF -DNLOPT_SWIG=OFF ..
|
||||
make -j "${ntasks}"
|
||||
make install
|
||||
cd ${INITDIR}/local
|
||||
cd "${init_dir}/local"
|
||||
touch .built.nlopt
|
||||
cd ${INITDIR}
|
||||
cd "${init_dir}"
|
||||
|
151
configure.ac
151
configure.ac
@ -1,151 +0,0 @@
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
# Initialization
|
||||
AC_PREREQ([2.63])
|
||||
AC_INIT([LatAnalyze],[3.3],[antonin.portelli@me.com],[LatAnalyze])
|
||||
AC_CONFIG_AUX_DIR([.buildutils])
|
||||
AC_CONFIG_SRCDIR([lib/Global.cpp])
|
||||
AC_CONFIG_SRCDIR([utils/sample_read.cpp])
|
||||
AC_CONFIG_SRCDIR([examples/exMathInterpreter.cpp])
|
||||
AC_CONFIG_MACRO_DIR([.buildutils/m4])
|
||||
AM_INIT_AUTOMAKE([1.11 -Wall -Werror foreign])
|
||||
AM_SILENT_RULES([yes])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AM_CONDITIONAL([HAVE_AM_MINOR_LE_11],
|
||||
[test `automake --version | grep automake | awk -F '.' '{print $2}'` -le 11])
|
||||
# Checks for programs
|
||||
AC_PROG_CXX
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CC
|
||||
AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
AC_PROG_LEX
|
||||
AC_PROG_YACC
|
||||
m4_ifdef([AM_PROG_AR],[AM_PROG_AR])
|
||||
|
||||
LT_INIT
|
||||
|
||||
# Options
|
||||
AC_ARG_WITH([gsl],
|
||||
[AS_HELP_STRING([--with-gsl=prefix],
|
||||
[try this for a non-standard install prefix of the GSL library])],
|
||||
[AM_CXXFLAGS="$AM_CXXFLAGS -I$with_gsl/include"]
|
||||
[AM_LDFLAGS="$AM_LDFLAGS -L$with_gsl/lib"])
|
||||
AC_ARG_WITH([minuit],
|
||||
[AS_HELP_STRING([--with-minuit=prefix],
|
||||
[try this for a non-standard install prefix of the Minuit2 library])],
|
||||
[AM_CXXFLAGS="$AM_CXXFLAGS -I$with_minuit/include"]
|
||||
[AM_LDFLAGS="$AM_LDFLAGS -L$with_minuit/lib"])
|
||||
AC_ARG_WITH([nlopt],
|
||||
[AS_HELP_STRING([--with-nlopt=prefix],
|
||||
[try this for a non-standard install prefix of the NLopt library])],
|
||||
[AM_CXXFLAGS="$AM_CXXFLAGS -I$with_nlopt/include"]
|
||||
[AM_LDFLAGS="$AM_LDFLAGS -L$with_nlopt/lib"])
|
||||
AC_ARG_WITH([hdf5],
|
||||
[AS_HELP_STRING([--with-hdf5=prefix],
|
||||
[try this for a non-standard install prefix of the HDF5 library])],
|
||||
[AM_CXXFLAGS="$AM_CXXFLAGS -I$with_hdf5/include"]
|
||||
[AM_LDFLAGS="$AM_LDFLAGS -L$with_hdf5/lib"])
|
||||
AC_ARG_WITH([latcore],
|
||||
[AS_HELP_STRING([--with-latcore=prefix],
|
||||
[use this option for a non-standard install prefix of the LatCore library])],
|
||||
[AM_CXXFLAGS="$AM_CXXFLAGS -I$with_latcore/include"]
|
||||
[AM_LDFLAGS="$AM_LDFLAGS -L$with_latcore/lib"])
|
||||
CFLAGS="$AM_CFLAGS $CFLAGS"
|
||||
CXXFLAGS="$AM_CXXFLAGS $CXXFLAGS"
|
||||
LDFLAGS="$AM_LDFLAGS $LDFLAGS"
|
||||
|
||||
# Get compilers informations
|
||||
AX_COMPILER_VENDOR
|
||||
AC_DEFINE_UNQUOTED([C_COMP_VENDOR],["$ax_cv_c_compiler_vendor"],
|
||||
[vendor of C compiler that will compile the code])
|
||||
AM_CONDITIONAL([CC_GNU],[test $ax_cv_c_compiler_vendor = "gnu"])
|
||||
AM_CONDITIONAL([CC_INTEL],[test $ax_cv_c_compiler_vendor = "intel"])
|
||||
AC_LANG([C++])
|
||||
AX_CXX_COMPILE_STDCXX_11([noext],[mandatory])
|
||||
AX_COMPILER_VENDOR
|
||||
AC_DEFINE_UNQUOTED([CXX_COMP_VENDOR],["$ax_cv_cxx_compiler_vendor"],
|
||||
[vendor of C++ compiler that will compile the code])
|
||||
AM_CONDITIONAL([CXX_GNU],[test $ax_cv_cxx_compiler_vendor = "gnu"])
|
||||
AM_CONDITIONAL([CXX_INTEL],[test $ax_cv_cxx_compiler_vendor = "intel"])
|
||||
AX_GCC_VERSION
|
||||
AC_DEFINE_UNQUOTED([GCC_VERSION],["$GCC_VERSION"],
|
||||
[version of gcc that will compile the code])
|
||||
AX_GXX_VERSION
|
||||
AC_DEFINE_UNQUOTED([GXX_VERSION],["$GXX_VERSION"],
|
||||
[version of g++ that will compile the code])
|
||||
|
||||
# Checks for libraries.
|
||||
AC_CHECK_LIB([m],[cos],[],[AC_MSG_ERROR([libm library not found])])
|
||||
AC_CHECK_LIB([gslcblas],[cblas_dgemm],[],
|
||||
[AC_MSG_ERROR([GSL CBLAS library not found])])
|
||||
AC_CHECK_LIB([gsl],[gsl_blas_dgemm],[],[AC_MSG_ERROR([GSL library not found])])
|
||||
AC_CHECK_LIB([nlopt_cxx],[nlopt_create],
|
||||
[AC_DEFINE([HAVE_NLOPT],
|
||||
[1],
|
||||
[Define to 1 if you have the `NLopt' library (-lnlopt_cxx).])]
|
||||
[have_nlopt=true]
|
||||
[LIBS="$LIBS -lnlopt_cxx"],[])
|
||||
AM_CONDITIONAL([HAVE_NLOPT], [test x$have_nlopt = xtrue])
|
||||
AC_CHECK_LIB([hdf5_cpp],[H5Fopen],
|
||||
[AC_DEFINE([HAVE_HDF5],
|
||||
[1],
|
||||
[Define to 1 if you have the `HDF5' library (-lhdf5_cpp).])]
|
||||
[have_hdf5=true]
|
||||
[LIBS="$LIBS -lhdf5_cpp -lhdf5"],[],[-lhdf5])
|
||||
AM_CONDITIONAL([HAVE_HDF5], [test x$have_hdf5 = xtrue])
|
||||
SAVED_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -lMinuit2"
|
||||
AC_MSG_CHECKING([for ROOT::Minuit2::BasicMinimumError in -lMinuit2]);
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([#include <Minuit2/BasicMinimumError.h>],
|
||||
[ROOT::Minuit2::BasicMinimumError dummy(0)])],
|
||||
[LIBS="$LIBS -lMinuit2"]
|
||||
[AC_DEFINE([HAVE_MINUIT2],
|
||||
[1],
|
||||
[Define to 1 if you have the `Minuit2' library (-lMinuit2).])]
|
||||
[have_minuit=true]
|
||||
[AC_MSG_RESULT([yes])],
|
||||
[have_minuit=false]
|
||||
[AC_MSG_RESULT([no])])
|
||||
AM_CONDITIONAL([HAVE_MINUIT], [test x$have_minuit = xtrue])
|
||||
LDFLAGS=$SAVED_LDFLAGS
|
||||
SAVED_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -lLatCore"
|
||||
AC_MSG_CHECKING([for LatCore::XmlReader in -lLatCore]);
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_PROGRAM([#include <LatCore/XmlReader.hpp>],
|
||||
[LatCore::XmlReader dummy()])],
|
||||
[LIBS="$LIBS -lLatCore"]
|
||||
[AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])]
|
||||
[AC_MSG_ERROR([LatCore library not found])])
|
||||
LDFLAGS=$SAVED_LDFLAGS
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
|
||||
AC_SUBST([LIBS])
|
||||
AC_SUBST([AM_CFLAGS])
|
||||
AC_SUBST([AM_LDFLAGS])
|
||||
|
||||
AC_CONFIG_FILES([Makefile lib/Makefile utils/Makefile physics/Makefile
|
||||
examples/Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
echo "*********************************************"
|
||||
echo "* ${PACKAGE_NAME} v${VERSION}" build options
|
||||
echo "*********************************************"
|
||||
echo "* C++ compiler : $CXX"
|
||||
echo "* HDF5 support : `test x$HAVE_HDF5_TRUE = 'x' && echo yes \
|
||||
|| echo no`"
|
||||
echo "* Minuit minimizers: `test x$HAVE_MINUIT_TRUE = 'x' && echo yes \
|
||||
|| echo no`"
|
||||
echo "* NLopt minimizers : `test x$HAVE_NLOPT_TRUE = 'x' && echo yes \
|
||||
|| echo no`"
|
||||
echo "*********************************************"
|
||||
|
||||
|
||||
|
21
examples/CMakeLists.txt
Normal file
21
examples/CMakeLists.txt
Normal file
@ -0,0 +1,21 @@
|
||||
set(EXAMPLES_STEM
|
||||
exCompiledDoubleFunction
|
||||
exDerivative
|
||||
exDWT
|
||||
exFit
|
||||
exFitSample
|
||||
exIntegrator
|
||||
exInterp
|
||||
exMat
|
||||
exMathInterpreter
|
||||
exMin
|
||||
exPlot
|
||||
exPValue
|
||||
exRand
|
||||
exRootFinder
|
||||
exThreadPool)
|
||||
|
||||
foreach(_stem ${EXAMPLES_STEM})
|
||||
add_executable(${_stem} ${_stem}.cpp)
|
||||
target_link_libraries(${_stem} LatAnalyze compiler_flags)
|
||||
endforeach()
|
@ -1 +0,0 @@
|
||||
../lib
|
@ -1,71 +0,0 @@
|
||||
if CXX_GNU
|
||||
COM_CXXFLAGS = -Wall -W -pedantic -Wno-deprecated-declarations
|
||||
else
|
||||
if CXX_INTEL
|
||||
COM_CXXFLAGS = -wd1682 -Wall
|
||||
endif
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
exCompiledDoubleFunction\
|
||||
exDerivative \
|
||||
exFit \
|
||||
exFitSample \
|
||||
exIntegrator \
|
||||
exInterp \
|
||||
exMat \
|
||||
exMathInterpreter \
|
||||
exMin \
|
||||
exPlot \
|
||||
exRand \
|
||||
exRootFinder
|
||||
|
||||
exCompiledDoubleFunction_SOURCES = exCompiledDoubleFunction.cpp
|
||||
exCompiledDoubleFunction_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exCompiledDoubleFunction_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exDerivative_SOURCES = exDerivative.cpp
|
||||
exDerivative_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exDerivative_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exFit_SOURCES = exFit.cpp
|
||||
exFit_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exFit_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exFitSample_SOURCES = exFitSample.cpp
|
||||
exFitSample_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exFitSample_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exInterp_SOURCES = exInterp.cpp
|
||||
exInterp_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exInterp_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exIntegrator_SOURCES = exIntegrator.cpp
|
||||
exIntegrator_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exIntegrator_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exMat_SOURCES = exMat.cpp
|
||||
exMat_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exMat_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exMin_SOURCES = exMin.cpp
|
||||
exMin_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exMin_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exMathInterpreter_SOURCES = exMathInterpreter.cpp
|
||||
exMathInterpreter_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exMathInterpreter_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exPlot_SOURCES = exPlot.cpp
|
||||
exPlot_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exPlot_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exRand_SOURCES = exRand.cpp
|
||||
exRand_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exRand_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
exRootFinder_SOURCES = exRootFinder.cpp
|
||||
exRootFinder_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
exRootFinder_LDFLAGS = -L../lib/.libs -lLatAnalyze
|
||||
|
||||
ACLOCAL_AMFLAGS = -I .buildutils/m4
|
@ -1,4 +1,4 @@
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
28
examples/exDWT.cpp
Normal file
28
examples/exDWT.cpp
Normal file
@ -0,0 +1,28 @@
|
||||
#include <LatAnalyze/Numerical/DWT.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
DVec data, dataRec;
|
||||
vector<DWT::DWTLevel> dataDWT;
|
||||
DWT dwt(DWTFilters::db3);
|
||||
|
||||
cout << "-- random data" << endl;
|
||||
data.setRandom(16);
|
||||
cout << data.transpose() << endl;
|
||||
cout << "-- compute Daubechies 3 DWT" << endl;
|
||||
dataDWT = dwt.forward(data, 4);
|
||||
for (unsigned int l = 0; l < dataDWT.size(); ++l)
|
||||
{
|
||||
cout << "* level " << l << endl;
|
||||
cout << "L= " << dataDWT[l].first.transpose() << endl;
|
||||
cout << "H= " << dataDWT[l].second.transpose() << endl;
|
||||
}
|
||||
cout << "-- check inverse DWT" << endl;
|
||||
dataRec = dwt.backward(dataDWT);
|
||||
cout << "rel diff = " << 2.*(data - dataRec).norm()/(data + dataRec).norm() << endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
#include <LatAnalyze/Derivative.hpp>
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Numerical/Derivative.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,10 +1,10 @@
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <LatAnalyze/CompiledModel.hpp>
|
||||
#include <LatAnalyze/Io.hpp>
|
||||
#include <LatAnalyze/GslMinimizer.hpp>
|
||||
#include <LatAnalyze/Plot.hpp>
|
||||
#include <LatAnalyze/XYStatData.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledModel.hpp>
|
||||
#include <LatAnalyze/Io/Io.hpp>
|
||||
#include <LatAnalyze/Numerical/GslMinimizer.hpp>
|
||||
#include <LatAnalyze/Core/Plot.hpp>
|
||||
#include <LatAnalyze/Statistics/XYStatData.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,7 +1,7 @@
|
||||
#include <LatAnalyze/CompiledModel.hpp>
|
||||
#include <LatAnalyze/GslMinimizer.hpp>
|
||||
#include <LatAnalyze/Plot.hpp>
|
||||
#include <LatAnalyze/XYSampleData.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledModel.hpp>
|
||||
#include <LatAnalyze/Numerical/GslMinimizer.hpp>
|
||||
#include <LatAnalyze/Core/Plot.hpp>
|
||||
#include <LatAnalyze/Statistics/XYSampleData.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/GslQagsIntegrator.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Numerical/GslQagsIntegrator.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include <LatAnalyze/TabFunction.hpp>
|
||||
#include <LatAnalyze/Functional/TabFunction.hpp>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include <LatAnalyze/Io.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Io/Io.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/GslMinimizer.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Numerical/GslMinimizer.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
23
examples/exPValue.cpp
Normal file
23
examples/exPValue.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
double chi2, ndof;
|
||||
|
||||
if (argc != 3)
|
||||
{
|
||||
cerr << "usage: " << argv[0] << " <chi^2> <ndof>" << endl;
|
||||
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
chi2 = strTo<double>(argv[1]);
|
||||
ndof = strTo<double>(argv[2]);
|
||||
|
||||
cout << "Two-sided p-value: " << Math::chi2PValue(chi2, ndof) << endl;
|
||||
cout << "chi^2 CCDF : " << Math::chi2Ccdf(chi2, ndof) << endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Plot.hpp>
|
||||
#include <LatAnalyze/TabFunction.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/Core/Plot.hpp>
|
||||
#include <LatAnalyze/Functional/TabFunction.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
@ -1,11 +1,15 @@
|
||||
#include <LatAnalyze/Io.hpp>
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Plot.hpp>
|
||||
#include <LatAnalyze/Io/Io.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Core/Plot.hpp>
|
||||
#include <LatAnalyze/Statistics/Random.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
constexpr Index n = 8;
|
||||
constexpr Index nDraw = 20000;
|
||||
constexpr Index nSample = 2000;
|
||||
const string stateFileName = "exRand.seed";
|
||||
|
||||
int main(void)
|
||||
@ -36,5 +40,24 @@ int main(void)
|
||||
p << PlotFunction(compile("return exp(-x_0^2/2)/sqrt(2*pi);", 1), -5., 5.);
|
||||
p.display();
|
||||
|
||||
DMat var(n, n);
|
||||
DVec mean(n);
|
||||
DMatSample sample(nSample, n, 1);
|
||||
|
||||
cout << "-- generating " << nSample << " Gaussian random vectors..." << endl;
|
||||
var = DMat::Random(n, n);
|
||||
var *= var.adjoint();
|
||||
mean = DVec::Random(n);
|
||||
RandomNormal mgauss(mean, var, rd());
|
||||
sample[central] = mgauss();
|
||||
FOR_STAT_ARRAY(sample, s)
|
||||
{
|
||||
sample[s] = mgauss();
|
||||
}
|
||||
cout << "* original variance matrix:\n" << var << endl;
|
||||
cout << "* measured variance matrix:\n" << sample.varianceMatrix() << endl;
|
||||
cout << "* original mean:\n" << mean << endl;
|
||||
cout << "* measured mean:\n" << sample.mean() << endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/GslHybridRootFinder.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Numerical/GslHybridRootFinder.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
29
examples/exThreadPool.cpp
Normal file
29
examples/exThreadPool.cpp
Normal file
@ -0,0 +1,29 @@
|
||||
#include <LatAnalyze/Core/ThreadPool.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
ThreadPool pool;
|
||||
|
||||
cout << "Using " << pool.getThreadNum() << " threads" << endl;
|
||||
for (unsigned int i = 1; i <= 20; ++i)
|
||||
{
|
||||
pool.addJob([i, &pool](void)
|
||||
{
|
||||
pool.critical([i](void)
|
||||
{
|
||||
cout << "job " << i << " wait for " << i*100 << " ms" << endl;
|
||||
});
|
||||
this_thread::sleep_for(chrono::milliseconds(i*100));
|
||||
pool.critical([i](void)
|
||||
{
|
||||
cout << "job " << i << " done" << endl;
|
||||
});
|
||||
});
|
||||
}
|
||||
pool.terminate();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
101
lib/CMakeLists.txt
Normal file
101
lib/CMakeLists.txt
Normal file
@ -0,0 +1,101 @@
|
||||
# config.h header for package version and name
|
||||
execute_process(
|
||||
COMMAND git rev-parse --short HEAD
|
||||
OUTPUT_VARIABLE LATAN_SHORT_SHA
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(
|
||||
COMMAND git rev-parse HEAD
|
||||
OUTPUT_VARIABLE LATAN_SHA
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(
|
||||
COMMAND git rev-parse --abbrev-ref HEAD
|
||||
OUTPUT_VARIABLE LATAN_BRANCH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY)
|
||||
|
||||
# find bison & flex
|
||||
find_package(BISON REQUIRED)
|
||||
find_package(FLEX REQUIRED)
|
||||
|
||||
# ASCII parser
|
||||
bison_target(
|
||||
AsciiParser LatAnalyze/Io/AsciiParser.ypp
|
||||
${CMAKE_CURRENT_BINARY_DIR}/AsciiParser.cpp COMPILE_FLAGS "-Wno-deprecated")
|
||||
flex_target(AsciiLexer LatAnalyze/Io/AsciiLexer.lpp
|
||||
${CMAKE_CURRENT_BINARY_DIR}/AsciiLexer.cpp)
|
||||
add_flex_bison_dependency(AsciiLexer AsciiParser)
|
||||
|
||||
# math parser
|
||||
bison_target(
|
||||
MathParser LatAnalyze/Core/MathParser.ypp
|
||||
${CMAKE_CURRENT_BINARY_DIR}/MathParser.cpp COMPILE_FLAGS "-Wno-deprecated")
|
||||
flex_target(MathLexer LatAnalyze/Core/MathLexer.lpp
|
||||
${CMAKE_CURRENT_BINARY_DIR}/MathLexer.cpp)
|
||||
add_flex_bison_dependency(MathLexer MathParser)
|
||||
|
||||
# intermediate libraries
|
||||
add_library(parsers STATIC)
|
||||
target_include_directories(parsers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_sources(
|
||||
parsers PRIVATE ${BISON_AsciiParser_OUTPUTS} ${FLEX_AsciiLexer_OUTPUTS}
|
||||
${BISON_MathParser_OUTPUTS} ${FLEX_MathLexer_OUTPUTS})
|
||||
|
||||
add_library(tinyxml2 STATIC)
|
||||
target_include_directories(parsers PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
target_sources(tinyxml2 PRIVATE LatAnalyze/Io/Xml/tinyxml2.hpp
|
||||
LatAnalyze/Io/Xml/tinyxml2.cpp)
|
||||
|
||||
# library target
|
||||
add_library(LatAnalyze SHARED)
|
||||
file(GLOB_RECURSE EIGEN_HEADERS LatAnalyze/Eigen/*)
|
||||
target_include_directories(LatAnalyze PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||
include(source-list.cmake)
|
||||
target_sources(
|
||||
LatAnalyze
|
||||
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config.h ${LATAN_SOURCES}
|
||||
PUBLIC FILE_SET
|
||||
public_headers
|
||||
TYPE
|
||||
HEADERS
|
||||
FILES
|
||||
${EIGEN_HEADERS}
|
||||
${LATAN_HEADERS})
|
||||
target_link_libraries(LatAnalyze PRIVATE compiler_flags parsers tinyxml2)
|
||||
target_link_libraries(LatAnalyze PUBLIC GSL::gsl hdf5::hdf5 hdf5::hdf5_cpp
|
||||
${CMAKE_THREAD_LIBS_INIT})
|
||||
if(Minuit2_FOUND)
|
||||
target_link_libraries(LatAnalyze PUBLIC Minuit2::Minuit2)
|
||||
endif()
|
||||
if(NLopt_FOUND)
|
||||
target_link_libraries(LatAnalyze PUBLIC NLopt::nlopt)
|
||||
endif()
|
||||
set_target_properties(LatAnalyze PROPERTIES VERSION ${PROJECT_VERSION})
|
||||
target_include_directories(
|
||||
LatAnalyze PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||
|
||||
# installation
|
||||
install(
|
||||
TARGETS LatAnalyze
|
||||
EXPORT LatAnalyzeTargets
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
FILE_SET public_headers
|
||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
install(
|
||||
EXPORT LatAnalyzeTargets
|
||||
FILE LatAnalyzeTargets.cmake
|
||||
NAMESPACE LatAnalyze::
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LatAnalyze)
|
||||
configure_package_config_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LatAnalyzeConfig.cmake"
|
||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LatAnalyze)
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LatAnalyzeConfigVersion.cmake"
|
||||
VERSION "${PROJECT_VERSION}"
|
||||
COMPATIBILITY AnyNewerVersion)
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/LatAnalyzeConfig.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LatAnalyzeConfigVersion.cmake"
|
||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/LatAnalyze)
|
28
lib/Config.cmake.in
Normal file
28
lib/Config.cmake.in
Normal file
@ -0,0 +1,28 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
find_dependency(GSL REQUIRED)
|
||||
find_dependency(HDF5 REQUIRED COMPONENTS C CXX)
|
||||
set(HAVE_Minuit2 @Minuit2_FOUND@)
|
||||
set(HAVE_NLopt @NLopt_FOUND@)
|
||||
if(HAVE_Minuit2)
|
||||
find_dependency(Minuit2 REQUIRED)
|
||||
list(APPEND _LatAnalyze_supported_components MINUIT2)
|
||||
set(LatAnalyze_MINUIT2_FOUND True)
|
||||
endif()
|
||||
if(HAVE_NLopt)
|
||||
find_dependency(NLopt REQUIRED)
|
||||
list(APPEND _LatAnalyze_supported_components NLOPT)
|
||||
set(LatAnalyze_NLOPT_FOUND True)
|
||||
endif()
|
||||
foreach(_comp ${LatAnalyze_FIND_COMPONENTS})
|
||||
if (NOT ";${_LatAnalyze_supported_components};" MATCHES ";${_comp};")
|
||||
set(LatAnalyze_FOUND False)
|
||||
set(LatAnalyze_NOT_FOUND_MESSAGE "Unsupported LatAnalyze component: ${_comp}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/LatAnalyzeTargets.cmake")
|
||||
|
||||
check_required_components(LatAnalyze)
|
@ -1 +0,0 @@
|
||||
.
|
123
lib/LatAnalyze/Core/Eigen.hpp
Normal file
123
lib/LatAnalyze/Core/Eigen.hpp
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Eigen.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// Eigen inclusion
|
||||
#define EIGEN_DONT_PARALLELIZE
|
||||
#define EIGEN_MATRIXBASE_PLUGIN <LatAnalyze/Core/EigenPlugin.hpp>
|
||||
#include <LatAnalyze/Eigen/Dense>
|
||||
|
||||
// copy/assignement from Eigen expression
|
||||
#define EIGEN_EXPR_CTOR(ctorName, Class, Base, ExprType) \
|
||||
template <typename Derived>\
|
||||
ctorName(const ExprType<Derived> &m): Base(m) {}\
|
||||
template<typename Derived>\
|
||||
Class & operator=(const ExprType<Derived> &m)\
|
||||
{\
|
||||
this->Base::operator=(m);\
|
||||
return *this;\
|
||||
}
|
||||
|
||||
#define FOR_MAT(mat, i, j) \
|
||||
for (Latan::Index j = 0; j < mat.cols(); ++j)\
|
||||
for (Latan::Index i = 0; i < mat.rows(); ++i)
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
const int dynamic = Eigen::Dynamic;
|
||||
|
||||
// array types
|
||||
template <typename Derived>
|
||||
using ArrayExpr = Eigen::ArrayBase<Derived>;
|
||||
|
||||
template <typename T, int nRow = dynamic, int nCol = dynamic>
|
||||
using Array = Eigen::Array<T, nRow, nCol>;
|
||||
|
||||
// matrix types
|
||||
template <typename Derived>
|
||||
using MatExpr = Eigen::MatrixBase<Derived>;
|
||||
|
||||
template <typename T, int nRow = dynamic, int nCol = dynamic>
|
||||
using MatBase = Eigen::Matrix<T, nRow, nCol>;
|
||||
|
||||
template <int nRow, int nCol>
|
||||
using SFMat = Eigen::Matrix<float, nRow, nCol>;
|
||||
|
||||
template <int nRow, int nCol>
|
||||
using SDMat = Eigen::Matrix<double, nRow, nCol>;
|
||||
|
||||
template <int nRow, int nCol>
|
||||
using SCMat = Eigen::Matrix<std::complex<double>, nRow, nCol>;
|
||||
|
||||
// vector types
|
||||
template <typename T, int size = dynamic>
|
||||
using Vec = MatBase<T, size, 1>;
|
||||
|
||||
template <int size>
|
||||
using SIVec = Vec<int, size>;
|
||||
|
||||
template <int size>
|
||||
using SUVec = Vec<unsigned int, size>;
|
||||
|
||||
template <int size>
|
||||
using SFVec = Vec<float, size>;
|
||||
|
||||
template <int size>
|
||||
using SDVec = Vec<double, size>;
|
||||
|
||||
template <int size>
|
||||
using SCVec = Vec<std::complex<double>, size>;
|
||||
|
||||
typedef SIVec<dynamic> IVec;
|
||||
typedef SUVec<dynamic> UVec;
|
||||
typedef SDVec<dynamic> DVec;
|
||||
typedef SCVec<dynamic> CVec;
|
||||
|
||||
// block types
|
||||
template <typename Derived>
|
||||
using Block = Eigen::Block<Derived>;
|
||||
template <typename Derived>
|
||||
using ConstBlock = const Eigen::Block<const Derived>;
|
||||
|
||||
template <typename Derived>
|
||||
using Row = typename Derived::RowXpr;
|
||||
template <typename Derived>
|
||||
using ConstRow = typename Derived::ConstRowXpr;
|
||||
|
||||
template <typename Derived>
|
||||
using Col = typename Derived::ColXpr;
|
||||
template <typename Derived>
|
||||
using ConstCol = typename Derived::ConstColXpr;
|
||||
|
||||
// map type
|
||||
template <int stride>
|
||||
using InnerStride = Eigen::InnerStride<stride>;
|
||||
template <int rowStride, int colStride>
|
||||
using Stride = Eigen::Stride<rowStride, colStride>;
|
||||
template <typename Derived, typename StrideType = Stride<0, 0>>
|
||||
using Map = Eigen::Map<Derived, Eigen::Unaligned, StrideType>;
|
||||
template <typename Derived, typename StrideType = Stride<0, 0>>
|
||||
using ConstMap = Eigen::Map<const Derived, Eigen::Unaligned, StrideType>;
|
||||
|
||||
// Index type //////////////////////////////////////////////////////////////////
|
||||
typedef MatBase<int>::Index Index;
|
||||
|
||||
#define FOR_VEC(vec, i) for (Latan::Index i = 0; i < (vec).size(); ++i)
|
||||
#define FOR_ARRAY(ar, i) FOR_VEC(ar, i)
|
||||
|
||||
END_LATAN_NAMESPACE
|
60
lib/LatAnalyze/Core/EigenPlugin.hpp
Normal file
60
lib/LatAnalyze/Core/EigenPlugin.hpp
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* EigenPlugin.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2015 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
Derived pInverse(const double tolerance = 1.0e-10) const
|
||||
{
|
||||
auto svd = jacobiSvd(Eigen::ComputeThinU|Eigen::ComputeThinV);
|
||||
const auto u = svd.matrixU();
|
||||
const auto v = svd.matrixV();
|
||||
auto s = svd.singularValues();
|
||||
double maxsv = 0.;
|
||||
unsigned int elim = 0;
|
||||
|
||||
for (Index i = 0; i < s.rows(); ++i)
|
||||
{
|
||||
if (fabs(s(i)) > maxsv) maxsv = fabs(s(i));
|
||||
}
|
||||
for (Index i = 0; i < s.rows(); ++i)
|
||||
{
|
||||
if (fabs(s(i)) > maxsv*tolerance)
|
||||
{
|
||||
s(i) = 1./s(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
elim++;
|
||||
s(i) = 0.;
|
||||
}
|
||||
}
|
||||
if (elim)
|
||||
{
|
||||
std::cerr << "warning: pseudoinverse: " << elim << "/";
|
||||
std::cerr << s.rows() << " singular value(s) eliminated (tolerance= ";
|
||||
std::cerr << tolerance << ")" << std::endl;
|
||||
}
|
||||
|
||||
return v*s.asDiagonal()*u.transpose();
|
||||
}
|
||||
|
||||
Derived singularValues(void) const
|
||||
{
|
||||
auto svd = jacobiSvd();
|
||||
|
||||
return svd.singularValues();
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Exceptions.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Exceptions.hpp>
|
||||
#include <LatAnalyze/Core/Exceptions.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
#ifndef ERR_SUFF
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Exceptions.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Mat.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Mat.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,11 +21,7 @@
|
||||
#define Latan_Mat_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/IoObject.hpp>
|
||||
|
||||
#define FOR_MAT(mat, i, j) \
|
||||
for (Latan::Index j = 0; j < mat.cols(); ++j)\
|
||||
for (Latan::Index i = 0; i < mat.rows(); ++i)
|
||||
#include <LatAnalyze/Io/IoObject.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Math.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,8 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/Numerical/GslFFT.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include <gsl/gsl_cdf.h>
|
||||
|
||||
@ -29,7 +30,8 @@ using namespace Latan;
|
||||
******************************************************************************/
|
||||
DMat MATH_NAMESPACE::varToCorr(const DMat &var)
|
||||
{
|
||||
DMat res = var, invDiag = res.diagonal();
|
||||
DMat res = var;
|
||||
DVec invDiag = res.diagonal();
|
||||
|
||||
invDiag = invDiag.cwiseInverse().cwiseSqrt();
|
||||
res = (invDiag*invDiag.transpose()).cwiseProduct(res);
|
||||
@ -37,6 +39,54 @@ DMat MATH_NAMESPACE::varToCorr(const DMat &var)
|
||||
return res;
|
||||
}
|
||||
|
||||
DMat MATH_NAMESPACE::corrToVar(const DMat &corr, const DVec &varDiag)
|
||||
{
|
||||
DMat res = corr;
|
||||
DVec varSqrtDiag = varDiag.cwiseSqrt();
|
||||
|
||||
res = (varSqrtDiag*varSqrtDiag.transpose()).cwiseProduct(res);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
double MATH_NAMESPACE::conditionNumber(const DMat &mat)
|
||||
{
|
||||
DVec s = mat.singularValues();
|
||||
|
||||
return s.maxCoeff()/s.minCoeff();
|
||||
}
|
||||
|
||||
double MATH_NAMESPACE::cdr(const DMat &mat)
|
||||
{
|
||||
return 10.*log10(conditionNumber(mat));
|
||||
}
|
||||
|
||||
template <typename FFT>
|
||||
double nsdr(const DMat &m)
|
||||
{
|
||||
Index n = m.rows();
|
||||
FFT fft(n);
|
||||
CMat buf(n, 1);
|
||||
|
||||
FOR_VEC(buf, i)
|
||||
{
|
||||
buf(i) = 0.;
|
||||
for (Index j = 0; j < n; ++j)
|
||||
{
|
||||
buf(i) += m(j, (i+j) % n);
|
||||
}
|
||||
buf(i) /= n;
|
||||
}
|
||||
fft(buf, FFT::Forward);
|
||||
|
||||
return 10.*log10(buf.real().maxCoeff()/buf.real().minCoeff());
|
||||
}
|
||||
|
||||
double MATH_NAMESPACE::nsdr(const DMat &mat)
|
||||
{
|
||||
return ::nsdr<GslFFT>(mat);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Standard C functions *
|
||||
******************************************************************************/
|
||||
@ -107,8 +157,14 @@ DEF_STD_FUNC_1ARG(fabs)
|
||||
|
||||
// p-value
|
||||
auto chi2PValueVecFunc = [](const double arg[2])
|
||||
{
|
||||
return 2.*min(gsl_cdf_chisq_P(arg[0], arg[1]), gsl_cdf_chisq_Q(arg[0], arg[1]));
|
||||
};
|
||||
|
||||
auto chi2CcdfVecFunc = [](const double arg[2])
|
||||
{
|
||||
return gsl_cdf_chisq_Q(arg[0], arg[1]);
|
||||
};
|
||||
|
||||
DoubleFunction MATH_NAMESPACE::chi2PValue(chi2PValueVecFunc, 2);
|
||||
DoubleFunction MATH_NAMESPACE::chi2Ccdf(chi2CcdfVecFunc, 2);
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Math.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,8 +21,8 @@
|
||||
#define Latan_Math_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
@ -70,11 +70,18 @@ namespace MATH_NAMESPACE
|
||||
|
||||
// convert variance matrix to correlation matrix
|
||||
DMat varToCorr(const DMat &var);
|
||||
DMat corrToVar(const DMat &corr, const DVec &varDiag);
|
||||
|
||||
// matrix SVD dynamic range
|
||||
double conditionNumber(const DMat &mat);
|
||||
double cdr(const DMat &mat);
|
||||
double nsdr(const DMat &mat);
|
||||
|
||||
// Constants
|
||||
constexpr double pi = 3.1415926535897932384626433832795028841970;
|
||||
constexpr double e = 2.7182818284590452353602874713526624977572;
|
||||
constexpr double inf = std::numeric_limits<double>::infinity();
|
||||
constexpr double nan = std::numeric_limits<double>::quiet_NaN();
|
||||
}
|
||||
|
||||
|
||||
@ -152,6 +159,7 @@ DECL_STD_FUNC(fabs)
|
||||
namespace MATH_NAMESPACE
|
||||
{
|
||||
extern DoubleFunction chi2PValue;
|
||||
extern DoubleFunction chi2Ccdf;
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MathInterpreter.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,9 +17,9 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
@ -36,7 +36,7 @@ unsigned int RunContext::addFunction(const string &name, DoubleFunction *init)
|
||||
|
||||
return getFunctionAddress(name);
|
||||
}
|
||||
catch (Exceptions::Definition)
|
||||
catch (Exceptions::Definition &)
|
||||
{
|
||||
unsigned int address = fTable_.size();
|
||||
|
||||
@ -55,7 +55,7 @@ unsigned int RunContext::addVariable(const string &name, double init)
|
||||
|
||||
return getVariableAddress(name);
|
||||
}
|
||||
catch (Exceptions::Definition)
|
||||
catch (Exceptions::Definition &)
|
||||
{
|
||||
unsigned int address = vTable_.size();
|
||||
|
||||
@ -92,7 +92,7 @@ unsigned int RunContext::getFunctionAddress(const string &name) const
|
||||
{
|
||||
return fTable_.at(name);
|
||||
}
|
||||
catch (out_of_range)
|
||||
catch (out_of_range &)
|
||||
{
|
||||
LATAN_ERROR(Definition, "undefined function '" + name + "'");
|
||||
}
|
||||
@ -139,7 +139,7 @@ unsigned int RunContext::getVariableAddress(const string &name) const
|
||||
{
|
||||
return vTable_.at(name);
|
||||
}
|
||||
catch (out_of_range)
|
||||
catch (out_of_range &)
|
||||
{
|
||||
LATAN_ERROR(Definition, "undefined variable '" + name + "'");
|
||||
}
|
||||
@ -449,7 +449,7 @@ try\
|
||||
{\
|
||||
address = (table).at(name);\
|
||||
}\
|
||||
catch (out_of_range)\
|
||||
catch (out_of_range &)\
|
||||
{\
|
||||
address = (table).size();\
|
||||
(table)[(name)] = address;\
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MathInterpreter.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -20,9 +20,9 @@
|
||||
#ifndef Latan_MathInterpreter_hpp_
|
||||
#define Latan_MathInterpreter_hpp_
|
||||
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/ParserState.hpp>
|
||||
#include <LatAnalyze/Core/ParserState.hpp>
|
||||
|
||||
#define MAXIDLENGTH 256
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MathLexer.lpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -25,7 +25,7 @@
|
||||
%option yylineno
|
||||
|
||||
%{
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
#include "MathParser.hpp"
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* MathParser.ypp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -19,7 +19,7 @@
|
||||
|
||||
%{
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
299
lib/LatAnalyze/Core/OptParser.cpp
Normal file
299
lib/LatAnalyze/Core/OptParser.cpp
Normal file
@ -0,0 +1,299 @@
|
||||
/*
|
||||
* OptParser.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2016 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Core/OptParser.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
static char optRegex[] = "(-([a-zA-Z])(.+)?)|(--([a-zA-Z_-]+)=?(.+)?)";
|
||||
|
||||
/******************************************************************************
|
||||
* OptParser implementation *
|
||||
******************************************************************************/
|
||||
// regular expressions /////////////////////////////////////////////////////////
|
||||
const regex OptParser::optRegex_(optRegex);
|
||||
|
||||
// access //////////////////////////////////////////////////////////////////////
|
||||
void OptParser::addOption(const std::string shortName,
|
||||
const std::string longName,
|
||||
const OptType type, const bool optional,
|
||||
const std::string helpMessage,
|
||||
const std::string defaultVal)
|
||||
{
|
||||
OptPar par;
|
||||
|
||||
par.shortName = shortName;
|
||||
par.longName = longName;
|
||||
par.defaultVal = defaultVal;
|
||||
par.helpMessage = helpMessage;
|
||||
par.type = type;
|
||||
par.optional = optional;
|
||||
auto it = std::find_if(opt_.begin(), opt_.end(), [&par](const OptPar & p)
|
||||
{
|
||||
bool match = false;
|
||||
|
||||
match |= (par.shortName == p.shortName) and !par.shortName.empty();
|
||||
match |= (par.longName == p.longName) and !par.longName.empty();
|
||||
|
||||
return match;
|
||||
});
|
||||
if (it != opt_.end())
|
||||
{
|
||||
string opt;
|
||||
|
||||
if (!it->shortName.empty())
|
||||
{
|
||||
opt += "-" + it->shortName;
|
||||
}
|
||||
if (!opt.empty())
|
||||
{
|
||||
opt += "/";
|
||||
}
|
||||
if (!it->longName.empty())
|
||||
{
|
||||
opt += "--" + it->longName;
|
||||
}
|
||||
throw(logic_error("duplicate option " + opt + " (in the code, not in the command line)"));
|
||||
}
|
||||
opt_.push_back(par);
|
||||
}
|
||||
|
||||
bool OptParser::gotOption(const std::string name) const
|
||||
{
|
||||
int i = optIndex(name);
|
||||
|
||||
if (result_.size() != opt_.size())
|
||||
{
|
||||
throw(runtime_error("options not parsed"));
|
||||
}
|
||||
if (i >= 0)
|
||||
{
|
||||
return result_[i].present;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw(out_of_range("no option with name '" + name + "'"));
|
||||
}
|
||||
}
|
||||
|
||||
const vector<string> & OptParser::getArgs(void) const
|
||||
{
|
||||
return arg_;
|
||||
}
|
||||
|
||||
// parse ///////////////////////////////////////////////////////////////////////
|
||||
bool OptParser::parse(int argc, char *argv[])
|
||||
{
|
||||
smatch sm;
|
||||
queue<string> arg;
|
||||
int expectVal = -1;
|
||||
bool isCorrect = true;
|
||||
|
||||
for (int i = 1; i < argc; ++i)
|
||||
{
|
||||
arg.push(argv[i]);
|
||||
}
|
||||
result_.clear();
|
||||
result_.resize(opt_.size());
|
||||
arg_.clear();
|
||||
for (unsigned int i = 0; i < opt_.size(); ++i)
|
||||
{
|
||||
result_[i].value = opt_[i].defaultVal;
|
||||
}
|
||||
while (!arg.empty())
|
||||
{
|
||||
// option
|
||||
if (regex_match(arg.front(), sm, optRegex_))
|
||||
{
|
||||
// should it be a value?
|
||||
if (expectVal >= 0)
|
||||
{
|
||||
cerr << "warning: expected value for option ";
|
||||
cerr << optName(opt_[expectVal]);
|
||||
cerr << ", got option '" << arg.front() << "' instead" << endl;
|
||||
expectVal = -1;
|
||||
isCorrect = false;
|
||||
}
|
||||
// short option
|
||||
if (sm[1].matched)
|
||||
{
|
||||
string optName = sm[2].str();
|
||||
|
||||
// find option
|
||||
auto it = find_if(opt_.begin(), opt_.end(),
|
||||
[&optName](const OptPar &p)
|
||||
{
|
||||
return (p.shortName == optName);
|
||||
});
|
||||
|
||||
// parse if found
|
||||
if (it != opt_.end())
|
||||
{
|
||||
unsigned int i = it - opt_.begin();
|
||||
|
||||
result_[i].present = true;
|
||||
if (opt_[i].type == OptType::value)
|
||||
{
|
||||
if (sm[3].matched)
|
||||
{
|
||||
result_[i].value = sm[3].str();
|
||||
}
|
||||
else
|
||||
{
|
||||
expectVal = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
// warning if not found
|
||||
else
|
||||
{
|
||||
cerr << "warning: unknown option '" << arg.front() << "'";
|
||||
cerr << endl;
|
||||
}
|
||||
}
|
||||
// long option
|
||||
else if (sm[4].matched)
|
||||
{
|
||||
string optName = sm[5].str();
|
||||
|
||||
// find option
|
||||
auto it = find_if(opt_.begin(), opt_.end(),
|
||||
[&optName](const OptPar &p)
|
||||
{
|
||||
return (p.longName == optName);
|
||||
});
|
||||
|
||||
// parse if found
|
||||
if (it != opt_.end())
|
||||
{
|
||||
unsigned int i = it - opt_.begin();
|
||||
|
||||
result_[i].present = true;
|
||||
if (opt_[i].type == OptType::value)
|
||||
{
|
||||
if (sm[6].matched)
|
||||
{
|
||||
result_[i].value = sm[6].str();
|
||||
}
|
||||
else
|
||||
{
|
||||
expectVal = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
// warning if not found
|
||||
else
|
||||
{
|
||||
cerr << "warning: unknown option '" << arg.front() << "'";
|
||||
cerr << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (expectVal >= 0)
|
||||
{
|
||||
result_[expectVal].value = arg.front();
|
||||
expectVal = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg_.push_back(arg.front());
|
||||
}
|
||||
arg.pop();
|
||||
}
|
||||
if (expectVal >= 0)
|
||||
{
|
||||
cerr << "warning: expected value for option ";
|
||||
cerr << optName(opt_[expectVal]) << endl;
|
||||
expectVal = -1;
|
||||
isCorrect = false;
|
||||
}
|
||||
for (unsigned int i = 0; i < opt_.size(); ++i)
|
||||
{
|
||||
if (!opt_[i].optional and !result_[i].present)
|
||||
{
|
||||
cerr << "warning: mandatory option " << optName(opt_[i]);
|
||||
cerr << " is missing" << endl;
|
||||
isCorrect = false;
|
||||
}
|
||||
}
|
||||
|
||||
return isCorrect;
|
||||
}
|
||||
|
||||
// find option index ///////////////////////////////////////////////////////////
|
||||
int OptParser::optIndex(const string name) const
|
||||
{
|
||||
auto it = find_if(opt_.begin(), opt_.end(), [&name](const OptPar &p)
|
||||
{
|
||||
return (p.shortName == name) or (p.longName == name);
|
||||
});
|
||||
|
||||
if (it != opt_.end())
|
||||
{
|
||||
return static_cast<int>(it - opt_.begin());
|
||||
}
|
||||
else
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// option name for messages ////////////////////////////////////////////////////
|
||||
std::string OptParser::optName(const OptPar &opt)
|
||||
{
|
||||
std::string res = "";
|
||||
|
||||
if (!opt.shortName.empty())
|
||||
{
|
||||
res += "-" + opt.shortName;
|
||||
if (!opt.longName.empty())
|
||||
{
|
||||
res += "/";
|
||||
}
|
||||
}
|
||||
if (!opt.longName.empty())
|
||||
{
|
||||
res += "--" + opt.longName;
|
||||
if (opt.type == OptParser::OptType::value)
|
||||
{
|
||||
res += "=";
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// print option list ///////////////////////////////////////////////////////////
|
||||
std::ostream & Latan::operator<<(std::ostream &out, const OptParser &parser)
|
||||
{
|
||||
for (auto &o: parser.opt_)
|
||||
{
|
||||
out << setw(20) << OptParser::optName(o);
|
||||
out << ": " << o.helpMessage;
|
||||
if (!o.defaultVal.empty())
|
||||
{
|
||||
out << " (default: " << o.defaultVal << ")";
|
||||
}
|
||||
out << endl;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
103
lib/LatAnalyze/Core/OptParser.hpp
Normal file
103
lib/LatAnalyze/Core/OptParser.hpp
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* OptParser.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2016 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef LatAnalyze_OptParser_hpp_
|
||||
#define LatAnalyze_OptParser_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
/******************************************************************************
|
||||
* command-line option parser *
|
||||
******************************************************************************/
|
||||
class OptParser
|
||||
{
|
||||
public:
|
||||
enum class OptType {value, trigger};
|
||||
private:
|
||||
struct OptPar
|
||||
{
|
||||
std::string shortName, longName, defaultVal, helpMessage;
|
||||
OptType type;
|
||||
bool optional;
|
||||
};
|
||||
struct OptRes
|
||||
{
|
||||
std::string value;
|
||||
bool present;
|
||||
};
|
||||
public:
|
||||
// constructor
|
||||
OptParser(void) = default;
|
||||
// destructor
|
||||
virtual ~OptParser(void) = default;
|
||||
// access
|
||||
void addOption(const std::string shortName, const std::string longName,
|
||||
const OptType type, const bool optional = false,
|
||||
const std::string helpMessage = "",
|
||||
const std::string defaultVal = "");
|
||||
bool gotOption(const std::string name) const;
|
||||
template <typename T = std::string>
|
||||
T optionValue(const std::string name) const;
|
||||
const std::vector<std::string> & getArgs(void) const;
|
||||
// parse
|
||||
bool parse(int argc, char *argv[]);
|
||||
// print option list
|
||||
friend std::ostream & operator<<(std::ostream &out,
|
||||
const OptParser &parser);
|
||||
private:
|
||||
// find option index
|
||||
int optIndex(const std::string name) const;
|
||||
// option name for messages
|
||||
static std::string optName(const OptPar &opt);
|
||||
private:
|
||||
std::vector<OptPar> opt_;
|
||||
std::vector<OptRes> result_;
|
||||
std::vector<std::string> arg_;
|
||||
static const std::regex optRegex_;
|
||||
};
|
||||
|
||||
std::ostream & operator<<(std::ostream &out, const OptParser &parser);
|
||||
|
||||
/******************************************************************************
|
||||
* OptParser template implementation *
|
||||
******************************************************************************/
|
||||
template <typename T>
|
||||
T OptParser::optionValue(const std::string name) const
|
||||
{
|
||||
int i = optIndex(name);
|
||||
|
||||
if (result_.size() != opt_.size())
|
||||
{
|
||||
throw(std::runtime_error("options not parsed"));
|
||||
}
|
||||
if (i >= 0)
|
||||
{
|
||||
return strTo<T>(result_[i].value);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw(std::out_of_range("no option with name '" + name + "'"));
|
||||
}
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // LatAnalyze_OptParser_hpp_
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ParserState.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Plot.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,9 +17,9 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Plot.hpp>
|
||||
#include <LatAnalyze/Core/Plot.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
@ -72,7 +72,7 @@ string PlotObject::dumpToTmpFile(const DMat &m)
|
||||
for (Index j = 0; j < m.cols(); ++j)
|
||||
{
|
||||
}
|
||||
sprintf(tmpFileName, "%s/latan_plot_tmp.XXXXXX.dat", P_tmpdir);
|
||||
snprintf(tmpFileName, sizeof(tmpFileName), "%s/latan_plot_tmp.XXXXXX.dat", P_tmpdir);
|
||||
fd = mkstemps(tmpFileName, 4);
|
||||
if (fd == -1)
|
||||
{
|
||||
@ -112,69 +112,253 @@ PlotHeadCommand::PlotHeadCommand(const string &command)
|
||||
}
|
||||
|
||||
// PlotData constructor ////////////////////////////////////////////////////////
|
||||
PlotData::PlotData(const DMatSample &x, const DMatSample &y)
|
||||
PlotData::PlotData(const DVecPair &x, const DVecPair &y, const bool abs)
|
||||
{
|
||||
if (x[central].rows() != y[central].rows())
|
||||
if (x.first.rows() != y.first.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vector does not have the same size");
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
if (x.first.rows() != x.second.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and error vectors do not have the same size");
|
||||
}
|
||||
if (y.first.rows() != y.second.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "y and error vectors do not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x[central].rows(), 4);
|
||||
DMat d(x.first.rows(), 4);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d.col(0) = x[central];
|
||||
d.col(2) = y[central];
|
||||
d.col(1) = x.variance().cwiseSqrt();
|
||||
d.col(3) = y.variance().cwiseSqrt();
|
||||
d.col(0) = x.first.col(0);
|
||||
d.col(2) = y.first.col(0);
|
||||
d.col(1) = x.second.col(0);
|
||||
d.col(3) = y.second.col(0);
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:3:2:4 w xyerr");
|
||||
if (!abs)
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:3:2:4 w xyerr");
|
||||
}
|
||||
else
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:(abs($3)):2:4 w xyerr");
|
||||
}
|
||||
}
|
||||
|
||||
PlotData::PlotData(const DVec &x, const DMatSample &y)
|
||||
PlotData::PlotData(const DVec &x, const DVecPair &y, const bool abs)
|
||||
{
|
||||
if (x.rows() != y[central].rows())
|
||||
if (x.rows() != y.first.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vector does not have the same size");
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
if (y.first.rows() != y.second.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "y and error vectors do not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x.rows(), 3);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d.col(0) = x;
|
||||
d.col(1) = y[central];
|
||||
d.col(2) = y.variance().cwiseSqrt();
|
||||
d.col(1) = y.first.col(0);
|
||||
d.col(2) = y.second.col(0);
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2:3 w yerr");
|
||||
if (!abs)
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:2:3 w yerr");
|
||||
}
|
||||
else
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:(abs($2)):3 w yerr");
|
||||
}
|
||||
}
|
||||
|
||||
PlotData::PlotData(const DMatSample &x, const DVec &y)
|
||||
PlotData::PlotData(const DVecPair &x, const DVec &y, const bool abs)
|
||||
{
|
||||
if (x[central].rows() != y.rows())
|
||||
if (x.first.rows() != y.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vector does not have the same size");
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
if (x.first.rows() != x.second.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and error vectors do not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x[central].rows(), 3), xerr, yerr;
|
||||
DMat d(x.first.rows(), 3), xerr, yerr;
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d.col(0) = x[central];
|
||||
d.col(0) = x.first.col(0);
|
||||
d.col(2) = y;
|
||||
d.col(1) = x.variance().cwiseSqrt();
|
||||
d.col(1) = x.second.col(0);
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
if (!abs)
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:3:2 w xerr");
|
||||
}
|
||||
else
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:(abs($3)):2 w xerr");
|
||||
}
|
||||
}
|
||||
|
||||
PlotData::PlotData(const DMatSample &x, const DMatSample &y, const bool abs)
|
||||
: PlotData(DVecPair(x[central], x.variance().cwiseSqrt()),
|
||||
DVecPair(y[central], y.variance().cwiseSqrt()), abs)
|
||||
{}
|
||||
|
||||
PlotData::PlotData(const DVec &x, const DMatSample &y, const bool abs)
|
||||
: PlotData(x, DVecPair(y[central], y.variance().cwiseSqrt()), abs)
|
||||
{}
|
||||
|
||||
PlotData::PlotData(const DMatSample &x, const DVec &y, const bool abs)
|
||||
: PlotData(DVecPair(x[central], x.variance().cwiseSqrt()), y, abs)
|
||||
{}
|
||||
|
||||
PlotData::PlotData(const XYStatData &data, const Index i, const Index j, const bool abs)
|
||||
{
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
if (!abs)
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:3:4 w yerr" : "u 1:3:2:4 w xyerr";
|
||||
}
|
||||
else
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:(abs($3)):4 w yerr" : "u 1:(abs($3)):2:4 w xyerr";
|
||||
}
|
||||
|
||||
tmpFileName = dumpToTmpFile(data.getTable(i, j));
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' " + usingCmd);
|
||||
}
|
||||
|
||||
PlotData::PlotData(const XYStatData & data, XYStatData::CoordFilter f, Index i, const Index j, const bool abs)
|
||||
{
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
if (!abs)
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:3:4 w yerr" : "u 1:3:2:4 w xyerr";
|
||||
}
|
||||
else
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:(abs($3)):4 w yerr" : "u 1:(abs($3)):2:4 w xyerr";
|
||||
}
|
||||
|
||||
tmpFileName = dumpToTmpFile(data.getTable(i, j, f));
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' " + usingCmd);
|
||||
}
|
||||
|
||||
PlotData::PlotData(const XYStatData & data, XYStatData::PointFilter f, Index i, const Index j, const bool abs)
|
||||
{
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
if (!abs)
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:3:4 w yerr" : "u 1:3:2:4 w xyerr";
|
||||
}
|
||||
else
|
||||
{
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:(abs($3)):4 w yerr" : "u 1:(abs($3)):2:4 w xyerr";
|
||||
}
|
||||
|
||||
tmpFileName = dumpToTmpFile(data.getTable(i, j, f));
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' " + usingCmd);
|
||||
}
|
||||
|
||||
// PlotPoint constructor ///////////////////////////////////////////////////////
|
||||
PlotPoint::PlotPoint(const double x, const double y)
|
||||
{
|
||||
DMat d(1, 2);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d(0, 0) = x;
|
||||
d(0, 1) = y;
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2");
|
||||
}
|
||||
|
||||
PlotPoint::PlotPoint(const DSample &x, const double y)
|
||||
{
|
||||
DMat d(1, 3);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d(0, 0) = x[central];
|
||||
d(0, 2) = y;
|
||||
d(0, 1) = sqrt(x.variance());
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:3:2 w xerr");
|
||||
}
|
||||
|
||||
PlotData::PlotData(const XYStatData &data, const Index i, const Index j)
|
||||
PlotPoint::PlotPoint(const double x, const DSample &y)
|
||||
{
|
||||
DMat d(1, 3);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
usingCmd = (data.isXExact(i)) ? "u 1:3:4 w yerr" : "u 1:3:2:4 w xyerr";
|
||||
tmpFileName = dumpToTmpFile(data.getTable(i, j));
|
||||
|
||||
d(0, 0) = x;
|
||||
d(0, 1) = y[central];
|
||||
d(0, 2) = sqrt(y.variance());
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' " + usingCmd);
|
||||
setCommand("'" + tmpFileName + "' u 1:2:3 w yerr");
|
||||
}
|
||||
|
||||
PlotPoint::PlotPoint(const DSample &x, const DSample &y)
|
||||
{
|
||||
DMat d(1, 4);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d(0, 0) = x[central];
|
||||
d(0, 2) = y[central];
|
||||
d(0, 1) = sqrt(x.variance());
|
||||
d(0, 3) = sqrt(y.variance());
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:3:2:4 w xyerr");
|
||||
}
|
||||
|
||||
|
||||
// PlotLine constructor ////////////////////////////////////////////////////////
|
||||
PlotLine::PlotLine(const DVec &x, const DVec &y)
|
||||
{
|
||||
if (x.size() != y.size())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x.size(), 2);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d.col(0) = x;
|
||||
d.col(1) = y;
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2 w lines");
|
||||
}
|
||||
|
||||
// PlotPoints constructor ////////////////////////////////////////////////////////
|
||||
PlotPoints::PlotPoints(const DVec &x, const DVec &y)
|
||||
{
|
||||
if (x.size() != y.size())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x.size(), 2);
|
||||
string usingCmd, tmpFileName;
|
||||
|
||||
d.col(0) = x;
|
||||
d.col(1) = y;
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2");
|
||||
}
|
||||
|
||||
// PlotHLine constructor ///////////////////////////////////////////////////////
|
||||
@ -199,7 +383,8 @@ PlotBand::PlotBand(const double xMin, const double xMax, const double yMin,
|
||||
|
||||
// PlotFunction constructor ////////////////////////////////////////////////////
|
||||
PlotFunction::PlotFunction(const DoubleFunction &function, const double xMin,
|
||||
const double xMax, const unsigned int nPoint)
|
||||
const double xMax, const unsigned int nPoint,
|
||||
const bool abs)
|
||||
{
|
||||
DMat d(nPoint, 2);
|
||||
string tmpFileName;
|
||||
@ -212,10 +397,59 @@ PlotFunction::PlotFunction(const DoubleFunction &function, const double xMin,
|
||||
}
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2 w lines");
|
||||
if (!abs)
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:2 w lines");
|
||||
}
|
||||
else
|
||||
{
|
||||
setCommand("'" + tmpFileName + "' u 1:(abs($2)) w lines");
|
||||
}
|
||||
}
|
||||
|
||||
// PlotPredBand constructor ////////////////////////////////////////////////////
|
||||
void PlotPredBand::makePredBand(const DMat &low, const DMat &high, const double opacity)
|
||||
{
|
||||
string lowFileName, highFileName, contFileName;
|
||||
DMat contour(low.rows() + high.rows() + 1, 2);
|
||||
|
||||
FOR_MAT(low, i, j)
|
||||
{
|
||||
contour(i, j) = low(i, j);
|
||||
}
|
||||
FOR_MAT(high, i, j)
|
||||
{
|
||||
contour(low.rows() + i, j) = high(high.rows() - i - 1, j);
|
||||
}
|
||||
contour.row(low.rows() + high.rows()) = low.row(0);
|
||||
contFileName = dumpToTmpFile(contour);
|
||||
pushTmpFile(contFileName);
|
||||
setCommand("'" + contFileName + "' u 1:2 w filledcurves closed" +
|
||||
" fs solid " + strFrom(opacity) + " noborder");
|
||||
}
|
||||
|
||||
PlotPredBand::PlotPredBand(const DVec &x, const DVec &y, const DVec &yerr,
|
||||
const double opacity)
|
||||
{
|
||||
if (x.size() != y.size())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vectors do not have the same size");
|
||||
}
|
||||
if (y.size() != yerr.size())
|
||||
{
|
||||
LATAN_ERROR(Size, "y and y error vectors do not have the same size");
|
||||
}
|
||||
|
||||
Index nPoint = x.size();
|
||||
DMat dLow(nPoint, 2), dHigh(nPoint, 2);
|
||||
|
||||
dLow.col(0) = x;
|
||||
dLow.col(1) = y - yerr;
|
||||
dHigh.col(0) = x;
|
||||
dHigh.col(1) = y + yerr;
|
||||
makePredBand(dLow, dHigh, opacity);
|
||||
}
|
||||
|
||||
PlotPredBand::PlotPredBand(const DoubleFunctionSample &function,
|
||||
const double xMin, const double xMax,
|
||||
const unsigned int nPoint, const double opacity)
|
||||
@ -236,15 +470,10 @@ PlotPredBand::PlotPredBand(const DoubleFunctionSample &function,
|
||||
dHigh(i, 0) = x;
|
||||
dHigh(i, 1) = pred[central] + err;
|
||||
}
|
||||
lowFileName = dumpToTmpFile(dLow);
|
||||
highFileName = dumpToTmpFile(dHigh);
|
||||
pushTmpFile(lowFileName);
|
||||
pushTmpFile(highFileName);
|
||||
setCommand("'< (cat " + lowFileName + "; tac " + highFileName +
|
||||
"; head -n1 " + lowFileName + ")' u 1:2 w filledcurves closed" +
|
||||
" fs solid " + strFrom(opacity) + " noborder");
|
||||
makePredBand(dLow, dHigh, opacity);
|
||||
}
|
||||
|
||||
|
||||
// PlotHistogram constructor ///////////////////////////////////////////////////
|
||||
PlotHistogram::PlotHistogram(const Histogram &h)
|
||||
{
|
||||
@ -261,11 +490,33 @@ PlotHistogram::PlotHistogram(const Histogram &h)
|
||||
setCommand("'" + tmpFileName + "' u 1:2 w steps");
|
||||
}
|
||||
|
||||
// PlotImpulses constructor ////////////////////////////////////////////////////
|
||||
PlotImpulses::PlotImpulses(const DVec &x, const DVec &y)
|
||||
{
|
||||
if (x.rows() != y.rows())
|
||||
{
|
||||
LATAN_ERROR(Size, "x and y vector does not have the same size");
|
||||
}
|
||||
|
||||
DMat d(x.rows(), 2);
|
||||
string tmpFileName;
|
||||
|
||||
for (Index i = 0; i < x.rows(); ++i)
|
||||
{
|
||||
d(i, 0) = x(i);
|
||||
d(i, 1) = y(i);
|
||||
}
|
||||
tmpFileName = dumpToTmpFile(d);
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' u 1:2 w impulses");
|
||||
}
|
||||
|
||||
// PlotMatrixNoRange constructor ///////////////////////////////////////////////
|
||||
PlotMatrixNoRange::PlotMatrixNoRange(const DMat &m)
|
||||
{
|
||||
string tmpFileName = dumpToTmpFile(m);
|
||||
|
||||
pushTmpFile(tmpFileName);
|
||||
setCommand("'" + tmpFileName + "' matrix w image");
|
||||
}
|
||||
|
||||
@ -306,15 +557,39 @@ void Color::operator()(PlotOptions &option) const
|
||||
option.lineColor = color_;
|
||||
}
|
||||
|
||||
// LineWidth constructor ///////////////////////////////////////////////////////
|
||||
LineWidth::LineWidth(const unsigned int width)
|
||||
: width_(width)
|
||||
{}
|
||||
|
||||
// LineWidth modifier //////////////////////////////////////////////////////////
|
||||
void LineWidth::operator()(PlotOptions &option) const
|
||||
{
|
||||
option.lineWidth = static_cast<int>(width_);
|
||||
}
|
||||
|
||||
// Dash constructor ///////////////////////////////////////////////////////////
|
||||
Dash::Dash(const string &dash)
|
||||
: dash_(dash)
|
||||
{}
|
||||
|
||||
// Dash modifier //////////////////////////////////////////////////////////////
|
||||
void Dash::operator()(PlotOptions &option) const
|
||||
{
|
||||
option.dashType = dash_;
|
||||
}
|
||||
|
||||
// LogScale constructor ////////////////////////////////////////////////////////
|
||||
LogScale::LogScale(const Axis axis)
|
||||
LogScale::LogScale(const Axis axis, const double basis)
|
||||
: axis_(axis)
|
||||
, basis_(basis)
|
||||
{}
|
||||
|
||||
// Logscale modifier ///////////////////////////////////////////////////////////
|
||||
void LogScale::operator()(PlotOptions &option) const
|
||||
{
|
||||
option.scaleMode[static_cast<int>(axis_)] |= Plot::Scale::log;
|
||||
option.scaleMode[static_cast<int>(axis_)] |= Plot::Scale::log;
|
||||
option.logScaleBasis[static_cast<int>(axis_)] = basis_;
|
||||
}
|
||||
|
||||
// PlotRange constructors //////////////////////////////////////////////////////
|
||||
@ -371,6 +646,31 @@ void Title::operator()(PlotOptions &option) const
|
||||
option.title = title_;
|
||||
}
|
||||
|
||||
// Palette constructor /////////////////////////////////////////////////////////
|
||||
Palette::Palette(const std::vector<std::string> &palette)
|
||||
: palette_(palette)
|
||||
{}
|
||||
|
||||
// Palette modifier ////////////////////////////////////////////////////////////
|
||||
void Palette::operator()(PlotOptions &option) const
|
||||
{
|
||||
option.palette = palette_;
|
||||
}
|
||||
|
||||
// category10 palette //////////////////////////////////////////////////////////
|
||||
const std::vector<std::string> Palette::category10 =
|
||||
{
|
||||
"rgb '#1f77b4'",
|
||||
"rgb '#ff7f0e'",
|
||||
"rgb '#2ca02c'",
|
||||
"rgb '#d62728'",
|
||||
"rgb '#9467bd'",
|
||||
"rgb '#8c564b'",
|
||||
"rgb '#e377c2'",
|
||||
"rgb '#7f7f7f'",
|
||||
"rgb '#bcbd22'"
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Plot implementation *
|
||||
******************************************************************************/
|
||||
@ -383,7 +683,7 @@ Plot::Plot(void)
|
||||
// default options /////////////////////////////////////////////////////////////
|
||||
void Plot::initOptions(void)
|
||||
{
|
||||
options_.terminal = "qt";
|
||||
options_.terminal = "qt noenhanced font 'Arial,12'";
|
||||
options_.output = "";
|
||||
options_.caption = "";
|
||||
options_.title = "";
|
||||
@ -394,6 +694,9 @@ void Plot::initOptions(void)
|
||||
options_.label[0] = "";
|
||||
options_.label[1] = "";
|
||||
options_.lineColor = "";
|
||||
options_.lineWidth = -1;
|
||||
options_.dashType = "";
|
||||
options_.palette = Palette::category10;
|
||||
}
|
||||
|
||||
// plot reset //////////////////////////////////////////////////////////////////
|
||||
@ -423,6 +726,16 @@ Plot & Plot::operator<<(PlotObject &&command)
|
||||
commandStr += " lc " + options_.lineColor;
|
||||
options_.lineColor = "";
|
||||
}
|
||||
if (options_.lineWidth > 0)
|
||||
{
|
||||
commandStr += " lw " + strFrom(options_.lineWidth);
|
||||
options_.lineWidth = -1;
|
||||
}
|
||||
if (!options_.dashType.empty())
|
||||
{
|
||||
commandStr += " dt " + options_.dashType;
|
||||
options_.dashType = "";
|
||||
}
|
||||
if (options_.title.empty())
|
||||
{
|
||||
commandStr += " notitle";
|
||||
@ -450,57 +763,48 @@ Plot & Plot::operator<<(PlotModifier &&modifier)
|
||||
}
|
||||
|
||||
// find gnuplot ////////////////////////////////////////////////////////////////
|
||||
void Plot::getProgramPath(void)
|
||||
#define SEARCH_DIR(dir) \
|
||||
snprintf(buf, sizeof(buf), "%s/%s", dir, gnuplotBin_.c_str());\
|
||||
if (access(buf, X_OK) == 0)\
|
||||
{\
|
||||
return dir;\
|
||||
}
|
||||
|
||||
std::string Plot::getProgramPath(void)
|
||||
{
|
||||
int i, j, lg;
|
||||
char *path;
|
||||
static char buf[MAX_PATH_LENGTH];
|
||||
|
||||
// trivial case: try in CWD
|
||||
sprintf(buf,"./%s", gnuplotBin_.c_str()) ;
|
||||
if (access(buf, X_OK) == 0)
|
||||
{
|
||||
sprintf(buf,".");
|
||||
gnuplotPath_ = buf;
|
||||
}
|
||||
// try out in all paths given in the PATH variable
|
||||
else
|
||||
buf[0] = 0;
|
||||
path = getenv("PATH") ;
|
||||
if (path)
|
||||
{
|
||||
buf[0] = 0;
|
||||
path = getenv("PATH") ;
|
||||
if (path)
|
||||
for (i=0;path[i];)
|
||||
{
|
||||
for (i=0;path[i];)
|
||||
for (j=i;(path[j]) and (path[j]!=':');j++);
|
||||
lg = j - i;
|
||||
strncpy(buf,path + i,(size_t)(lg));
|
||||
if (lg == 0)
|
||||
{
|
||||
for (j=i;(path[j]) and (path[j]!=':');j++);
|
||||
lg = j - i;
|
||||
strncpy(buf,path + i,(size_t)(lg));
|
||||
if (lg == 0)
|
||||
{
|
||||
buf[lg++] = '.';
|
||||
}
|
||||
buf[lg++] = '/';
|
||||
strcpy(buf + lg, gnuplotBin_.c_str());
|
||||
if (access(buf, X_OK) == 0)
|
||||
{
|
||||
// found it!
|
||||
break ;
|
||||
}
|
||||
buf[0] = 0;
|
||||
i = j;
|
||||
if (path[i] == ':') i++ ;
|
||||
buf[lg++] = '.';
|
||||
}
|
||||
buf[lg++] = '/';
|
||||
strcpy(buf + lg, gnuplotBin_.c_str());
|
||||
if (access(buf, X_OK) == 0)
|
||||
{
|
||||
// found it!
|
||||
break ;
|
||||
}
|
||||
buf[0] = 0;
|
||||
i = j;
|
||||
if (path[i] == ':') i++ ;
|
||||
}
|
||||
else
|
||||
{
|
||||
LATAN_ERROR(System, "PATH variable not set");
|
||||
}
|
||||
// if the buffer is still empty, the command was not found
|
||||
if (buf[0] == 0)
|
||||
{
|
||||
LATAN_ERROR(System, "cannot find gnuplot in $PATH");
|
||||
}
|
||||
// otherwise truncate the command name to yield path only
|
||||
}
|
||||
// if the buffer is still empty, the command was not found
|
||||
if (buf[0] != 0)
|
||||
{
|
||||
lg = (int)(strlen(buf) - 1);
|
||||
while (buf[lg]!='/')
|
||||
{
|
||||
@ -509,7 +813,19 @@ void Plot::getProgramPath(void)
|
||||
}
|
||||
buf[lg] = 0;
|
||||
gnuplotPath_ = buf;
|
||||
|
||||
return gnuplotPath_;
|
||||
}
|
||||
|
||||
// try in CWD, /usr/bin & /usr/local/bin
|
||||
SEARCH_DIR(".");
|
||||
SEARCH_DIR("/usr/bin");
|
||||
SEARCH_DIR("/usr/local/bin");
|
||||
|
||||
// if this code is reached nothing was found
|
||||
LATAN_ERROR(System, "cannot find gnuplot");
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
// plot parsing and output /////////////////////////////////////////////////////
|
||||
@ -523,10 +839,6 @@ void Plot::display(void)
|
||||
string command;
|
||||
ostringstream scriptBuf;
|
||||
|
||||
if (!getenv("DISPLAY"))
|
||||
{
|
||||
LATAN_ERROR(System, "cannot find DISPLAY variable: is it set ?");
|
||||
}
|
||||
getProgramPath();
|
||||
command = gnuplotPath_ + "/" + gnuplotBin_;
|
||||
gnuplotPipe = popen(command.c_str(), "w");
|
||||
@ -553,7 +865,7 @@ void Plot::display(void)
|
||||
}
|
||||
}
|
||||
|
||||
void Plot::save(string dirName)
|
||||
void Plot::save(string dirName, bool savePdf)
|
||||
{
|
||||
vector<string> commandBack;
|
||||
string path, terminalBack, outputBack, gpCommand, scriptName;
|
||||
@ -561,11 +873,6 @@ void Plot::save(string dirName)
|
||||
ofstream script;
|
||||
|
||||
mode755 = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
|
||||
|
||||
// backup I/O parameters
|
||||
terminalBack = options_.terminal;
|
||||
outputBack = options_.output;
|
||||
commandBack = plotCommand_;
|
||||
|
||||
// generate directory
|
||||
if (mkdir(dirName))
|
||||
@ -573,12 +880,20 @@ void Plot::save(string dirName)
|
||||
LATAN_ERROR(Io, "impossible to create directory '" + dirName + "'");
|
||||
}
|
||||
|
||||
// backup I/O parameters
|
||||
terminalBack = options_.terminal;
|
||||
outputBack = options_.output;
|
||||
commandBack = plotCommand_;
|
||||
|
||||
// save PDF
|
||||
options_.terminal = "pdf";
|
||||
options_.output = dirName + "/plot.pdf";
|
||||
display();
|
||||
options_.terminal = terminalBack;
|
||||
options_.output = outputBack;
|
||||
if (savePdf)
|
||||
{
|
||||
options_.terminal = "pdf";
|
||||
options_.output = dirName + "/plot.pdf";
|
||||
display();
|
||||
options_.terminal = terminalBack;
|
||||
options_.output = outputBack;
|
||||
}
|
||||
|
||||
// save script and datafiles
|
||||
for (unsigned int i = 0; i < tmpFileName_.size(); ++i)
|
||||
@ -627,6 +942,7 @@ ostream & Latan::operator<<(ostream &out, const Plot &plot)
|
||||
if (!plot.options_.terminal.empty())
|
||||
{
|
||||
out << "set term " << plot.options_.terminal << endl;
|
||||
out << "set pointintervalbox 0" << endl;
|
||||
}
|
||||
if (!plot.options_.output.empty())
|
||||
{
|
||||
@ -646,25 +962,32 @@ ostream & Latan::operator<<(ostream &out, const Plot &plot)
|
||||
out << "yMin = " << plot.options_.scale[y].min << endl;
|
||||
out << "yMax = " << plot.options_.scale[y].max << endl;
|
||||
}
|
||||
if (!plot.options_.title.empty())
|
||||
{
|
||||
out << "set title '" << plot.options_.title << "'" << endl;
|
||||
}
|
||||
out << "unset xrange" << endl;
|
||||
if (plot.options_.scaleMode[x] & Plot::Scale::manual)
|
||||
{
|
||||
out << "set xrange [xMin:xMax]" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
out << "set xrange [:]" << endl;
|
||||
}
|
||||
out << "unset yrange" << endl;
|
||||
if (plot.options_.scaleMode[y] & Plot::Scale::manual)
|
||||
{
|
||||
out << "set yrange [yMin:yMax]" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
out << "set yrange [:]" << endl;
|
||||
}
|
||||
out << "unset log" << endl;
|
||||
if (plot.options_.scaleMode[x] & Plot::Scale::log)
|
||||
{
|
||||
out << "set log x" << endl;
|
||||
out << "set log x " << plot.options_.logScaleBasis[x] << endl;;
|
||||
}
|
||||
if (plot.options_.scaleMode[y] & Plot::Scale::log)
|
||||
{
|
||||
out << "set log y" << endl;
|
||||
out << "set log y " << plot.options_.logScaleBasis[y] << endl;
|
||||
}
|
||||
if (!plot.options_.label[x].empty())
|
||||
{
|
||||
@ -674,6 +997,11 @@ ostream & Latan::operator<<(ostream &out, const Plot &plot)
|
||||
{
|
||||
out << "set ylabel '" << plot.options_.label[y] << "'" << endl;
|
||||
}
|
||||
for (unsigned int i = 0; i < plot.options_.palette.size(); ++i)
|
||||
{
|
||||
out << "set linetype " << i + 1 << " lc "
|
||||
<< plot.options_.palette[i] << endl;
|
||||
}
|
||||
for (unsigned int i = 0; i < plot.headCommand_.size(); ++i)
|
||||
{
|
||||
out << plot.headCommand_[i] << endl;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Plot.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,11 +21,11 @@
|
||||
#define Latan_Plot_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/Histogram.hpp>
|
||||
#include <LatAnalyze/XYStatData.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
#include <LatAnalyze/Statistics/Histogram.hpp>
|
||||
#include <LatAnalyze/Statistics/XYStatData.hpp>
|
||||
|
||||
// gnuplot default parameters
|
||||
#ifndef GNUPLOT_BIN
|
||||
@ -87,16 +87,38 @@ public:
|
||||
|
||||
class PlotData: public PlotObject
|
||||
{
|
||||
public:
|
||||
typedef std::pair<DVec, DVec> DVecPair;
|
||||
public:
|
||||
// constructor
|
||||
PlotData(const DMatSample &x, const DMatSample &y);
|
||||
PlotData(const DVec &x, const DMatSample &y);
|
||||
PlotData(const DMatSample &x, const DVec &y);
|
||||
PlotData(const XYStatData &data, const Index i = 0, const Index j = 0);
|
||||
PlotData(const DVecPair &x, const DVecPair &y, const bool abs = false);
|
||||
PlotData(const DVec &x, const DVecPair &y, const bool abs = false);
|
||||
PlotData(const DVecPair &x, const DVec &y, const bool abs = false);
|
||||
PlotData(const DMatSample &x, const DMatSample &y, const bool abs = false);
|
||||
PlotData(const DVec &x, const DMatSample &y, const bool abs = false);
|
||||
PlotData(const DMatSample &x, const DVec &y, const bool abs = false);
|
||||
PlotData(const XYStatData &data, const Index i = 0, const Index j = 0,
|
||||
const bool abs = false);
|
||||
PlotData(const XYStatData &data, XYStatData::CoordFilter f, Index i = 0,
|
||||
const Index j = 0, const bool abs = false);
|
||||
PlotData(const XYStatData &data, XYStatData::PointFilter f, Index i = 0,
|
||||
const Index j = 0, const bool abs = false);
|
||||
// destructor
|
||||
virtual ~PlotData(void) = default;
|
||||
};
|
||||
|
||||
class PlotPoint: public PlotObject
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
PlotPoint(const double x, const double y);
|
||||
PlotPoint(const DSample &x, const double y);
|
||||
PlotPoint(const double x, const DSample &y);
|
||||
PlotPoint(const DSample &x, const DSample &y);
|
||||
// destructor
|
||||
virtual ~PlotPoint(void) = default;
|
||||
};
|
||||
|
||||
class PlotHLine: public PlotObject
|
||||
{
|
||||
public:
|
||||
@ -106,6 +128,24 @@ public:
|
||||
virtual ~PlotHLine(void) = default;
|
||||
};
|
||||
|
||||
class PlotLine: public PlotObject
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
PlotLine(const DVec &x, const DVec &y);
|
||||
// destructor
|
||||
virtual ~PlotLine(void) = default;
|
||||
};
|
||||
|
||||
class PlotPoints: public PlotObject
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
PlotPoints(const DVec &x, const DVec &y);
|
||||
// destructor
|
||||
virtual ~PlotPoints(void) = default;
|
||||
};
|
||||
|
||||
class PlotBand: public PlotObject
|
||||
{
|
||||
public:
|
||||
@ -121,7 +161,8 @@ class PlotFunction: public PlotObject
|
||||
public:
|
||||
// constructor
|
||||
PlotFunction(const DoubleFunction &function, const double xMin,
|
||||
const double xMax, const unsigned int nPoint = 1000);
|
||||
const double xMax, const unsigned int nPoint = 1000,
|
||||
const bool abs = false);
|
||||
// destructor
|
||||
virtual ~PlotFunction(void) = default;
|
||||
};
|
||||
@ -130,11 +171,15 @@ class PlotPredBand: public PlotObject
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
PlotPredBand(const DVec &x, const DVec &y, const DVec &yerr,
|
||||
const double opacity = 0.15);
|
||||
PlotPredBand(const DoubleFunctionSample &function, const double xMin,
|
||||
const double xMax, const unsigned int nPoint = 1000,
|
||||
const double opacity = 0.15);
|
||||
// destructor
|
||||
virtual ~PlotPredBand(void) = default;
|
||||
private:
|
||||
void makePredBand(const DMat &low, const DMat &high, const double opacity);
|
||||
};
|
||||
|
||||
class PlotHistogram: public PlotObject
|
||||
@ -146,6 +191,15 @@ public:
|
||||
virtual ~PlotHistogram(void) = default;
|
||||
};
|
||||
|
||||
class PlotImpulses: public PlotObject
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
PlotImpulses(const DVec &x, const DVec &y);
|
||||
// destructor
|
||||
virtual ~PlotImpulses(void) = default;
|
||||
};
|
||||
|
||||
class PlotMatrixNoRange: public PlotObject
|
||||
{
|
||||
public:
|
||||
@ -160,6 +214,11 @@ PlotRange(Axis::x, -.5, (m).cols() - .5) <<\
|
||||
PlotRange(Axis::y, (m).rows() - .5, -.5) <<\
|
||||
PlotMatrixNoRange(m)
|
||||
|
||||
#define PlotCorrMatrix(m)\
|
||||
PlotHeadCommand("set cbrange [-1:1]") <<\
|
||||
PlotHeadCommand("set palette defined (0 'blue', 1 'white', 2 'red')") <<\
|
||||
PlotMatrix(m)
|
||||
|
||||
/******************************************************************************
|
||||
* Plot modifiers *
|
||||
******************************************************************************/
|
||||
@ -172,14 +231,18 @@ struct Range
|
||||
|
||||
struct PlotOptions
|
||||
{
|
||||
std::string terminal;
|
||||
std::string output;
|
||||
std::string caption;
|
||||
std::string title;
|
||||
unsigned int scaleMode[2];
|
||||
Range scale[2];
|
||||
std::string label[2];
|
||||
std::string lineColor;
|
||||
std::string terminal;
|
||||
std::string output;
|
||||
std::string caption;
|
||||
std::string title;
|
||||
unsigned int scaleMode[2];
|
||||
double logScaleBasis[2];
|
||||
Range scale[2];
|
||||
std::string label[2];
|
||||
std::string lineColor;
|
||||
int lineWidth;
|
||||
std::string dashType;
|
||||
std::vector<std::string> palette;
|
||||
};
|
||||
|
||||
class PlotModifier
|
||||
@ -231,17 +294,44 @@ private:
|
||||
const std::string color_;
|
||||
};
|
||||
|
||||
class LineWidth: public PlotModifier
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
explicit LineWidth(const unsigned int width);
|
||||
// destructor
|
||||
virtual ~LineWidth(void) = default;
|
||||
// modifier
|
||||
virtual void operator()(PlotOptions &option) const;
|
||||
private:
|
||||
const unsigned width_;
|
||||
};
|
||||
|
||||
class Dash: public PlotModifier
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
explicit Dash(const std::string &dash);
|
||||
// destructor
|
||||
virtual ~Dash(void) = default;
|
||||
// modifier
|
||||
virtual void operator()(PlotOptions &option) const;
|
||||
private:
|
||||
const std::string dash_;
|
||||
};
|
||||
|
||||
class LogScale: public PlotModifier
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
explicit LogScale(const Axis axis);
|
||||
explicit LogScale(const Axis axis, const double basis = 10);
|
||||
// destructor
|
||||
virtual ~LogScale(void) = default;
|
||||
// modifier
|
||||
virtual void operator()(PlotOptions &option) const;
|
||||
private:
|
||||
const Axis axis_;
|
||||
const double basis_;
|
||||
};
|
||||
|
||||
class PlotRange: public PlotModifier
|
||||
@ -286,6 +376,21 @@ private:
|
||||
const std::string title_;
|
||||
};
|
||||
|
||||
class Palette: public PlotModifier
|
||||
{
|
||||
public:
|
||||
static const std::vector<std::string> category10;
|
||||
public:
|
||||
// constructor
|
||||
explicit Palette(const std::vector<std::string> &palette);
|
||||
// destructor
|
||||
virtual ~Palette(void) = default;
|
||||
// modifier
|
||||
virtual void operator()(PlotOptions &option) const;
|
||||
private:
|
||||
const std::vector<std::string> palette_;
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Plot class *
|
||||
******************************************************************************/
|
||||
@ -311,13 +416,13 @@ public:
|
||||
Plot & operator<<(PlotModifier &&modifier);
|
||||
// plot parsing and output
|
||||
void display(void);
|
||||
void save(std::string dirName);
|
||||
void save(std::string dirName, bool savePdf = true);
|
||||
friend std::ostream & operator<<(std::ostream &out, const Plot &plot);
|
||||
// plot reset
|
||||
void reset(void);
|
||||
private:
|
||||
// find gnuplot
|
||||
void getProgramPath(void);
|
||||
std::string getProgramPath(void);
|
||||
private:
|
||||
// default options
|
||||
void initOptions(void);
|
||||
private:
|
117
lib/LatAnalyze/Core/ThreadPool.cpp
Normal file
117
lib/LatAnalyze/Core/ThreadPool.cpp
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* ThreadPool.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2021 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Core/ThreadPool.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
/******************************************************************************
|
||||
* ThreadPool implementation *
|
||||
******************************************************************************/
|
||||
// constructors ////////////////////////////////////////////////////////////////
|
||||
ThreadPool::ThreadPool(void)
|
||||
: ThreadPool(std::thread::hardware_concurrency())
|
||||
{}
|
||||
|
||||
ThreadPool::ThreadPool(const unsigned int nThreads)
|
||||
: nThreads_(nThreads)
|
||||
{
|
||||
for (unsigned int t = 0; t < nThreads_; ++t)
|
||||
{
|
||||
threads_.push_back(thread(&ThreadPool::workerLoop, this));
|
||||
}
|
||||
}
|
||||
|
||||
// destructor //////////////////////////////////////////////////////////////////
|
||||
ThreadPool::~ThreadPool(void)
|
||||
{
|
||||
terminate();
|
||||
}
|
||||
|
||||
// get the number of threads ///////////////////////////////////////////////////
|
||||
unsigned int ThreadPool::getThreadNum(void) const
|
||||
{
|
||||
return nThreads_;
|
||||
}
|
||||
|
||||
// get the pool mutex for synchronisation //////////////////////////////////////
|
||||
std::mutex & ThreadPool::getMutex(void)
|
||||
{
|
||||
return mutex_;
|
||||
}
|
||||
|
||||
// worker loop /////////////////////////////////////////////////////////////////
|
||||
void ThreadPool::workerLoop(void)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Job job;
|
||||
{
|
||||
unique_lock<mutex> lock(mutex_);
|
||||
|
||||
condition_.wait(lock, [this](){
|
||||
return !queue_.empty() || terminatePool_;
|
||||
});
|
||||
if (terminatePool_ and queue_.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
job = queue_.front();
|
||||
queue_.pop();
|
||||
}
|
||||
job();
|
||||
}
|
||||
}
|
||||
|
||||
// add jobs ////////////////////////////////////////////////////////////////////
|
||||
void ThreadPool::addJob(Job newJob)
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> lock(mutex_);
|
||||
|
||||
queue_.push(newJob);
|
||||
}
|
||||
condition_.notify_one();
|
||||
}
|
||||
|
||||
// critical section ////////////////////////////////////////////////////////////
|
||||
void ThreadPool::critical(Job fn)
|
||||
{
|
||||
unique_lock<mutex> lock(mutex_);
|
||||
|
||||
fn();
|
||||
}
|
||||
|
||||
// wait for completion /////////////////////////////////////////////////////////
|
||||
void ThreadPool::terminate(void)
|
||||
{
|
||||
{
|
||||
unique_lock<mutex> lock(mutex_);
|
||||
|
||||
terminatePool_ = true;
|
||||
}
|
||||
condition_.notify_all();
|
||||
for (auto &thread: threads_)
|
||||
{
|
||||
thread.join();
|
||||
}
|
||||
threads_.clear();
|
||||
}
|
56
lib/LatAnalyze/Core/ThreadPool.hpp
Normal file
56
lib/LatAnalyze/Core/ThreadPool.hpp
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* ThreadPool.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2021 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef Latan_ThreadPool_hpp_
|
||||
#define Latan_ThreadPool_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
|
||||
class ThreadPool
|
||||
{
|
||||
public:
|
||||
typedef std::function<void(void)> Job;
|
||||
public:
|
||||
// constructors/destructor
|
||||
ThreadPool(void);
|
||||
ThreadPool(const unsigned int nThreads);
|
||||
virtual ~ThreadPool(void);
|
||||
// get the number of threads
|
||||
unsigned int getThreadNum(void) const;
|
||||
// get the pool mutex for synchronisation
|
||||
std::mutex & getMutex(void);
|
||||
// add jobs
|
||||
void addJob(Job newJob);
|
||||
// critical section
|
||||
void critical(Job fn);
|
||||
// wait for completion and terminate
|
||||
void terminate(void);
|
||||
private:
|
||||
// worker loop
|
||||
void workerLoop(void);
|
||||
private:
|
||||
unsigned int nThreads_;
|
||||
std::condition_variable condition_;
|
||||
std::vector<std::thread> threads_;
|
||||
bool terminatePool_{false};
|
||||
std::queue<Job> queue_;
|
||||
std::mutex mutex_;
|
||||
};
|
||||
|
||||
#endif
|
137
lib/LatAnalyze/Core/Utilities.cpp
Normal file
137
lib/LatAnalyze/Core/Utilities.cpp
Normal file
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* Utilities.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Core/Utilities.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
void Latan::testFunction(void)
|
||||
{}
|
||||
|
||||
ostream & Latan::operator<<(ostream &out, const ProgressBar &&bar)
|
||||
{
|
||||
const Index nTick = bar.nCol_*bar.current_/bar.total_;
|
||||
|
||||
out << "[";
|
||||
for (Index i = 0; i < nTick; ++i)
|
||||
{
|
||||
out << "=";
|
||||
}
|
||||
for (Index i = nTick; i < bar.nCol_; ++i)
|
||||
{
|
||||
out << " ";
|
||||
}
|
||||
out << "] " << bar.current_ << "/" << bar.total_;
|
||||
out.flush();
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
int Latan::mkdir(const std::string dirName)
|
||||
{
|
||||
if (access(dirName.c_str(), R_OK|W_OK|X_OK))
|
||||
{
|
||||
mode_t mode755;
|
||||
char tmp[MAX_PATH_LENGTH];
|
||||
char *p = NULL;
|
||||
size_t len;
|
||||
|
||||
mode755 = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
|
||||
|
||||
snprintf(tmp, sizeof(tmp), "%s", dirName.c_str());
|
||||
len = strlen(tmp);
|
||||
if(tmp[len - 1] == '/')
|
||||
{
|
||||
tmp[len - 1] = 0;
|
||||
}
|
||||
for(p = tmp + 1; *p; p++)
|
||||
{
|
||||
if(*p == '/')
|
||||
{
|
||||
*p = 0;
|
||||
::mkdir(tmp, mode755);
|
||||
*p = '/';
|
||||
}
|
||||
}
|
||||
|
||||
return ::mkdir(tmp, mode755);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
string Latan::basename(const string &s)
|
||||
{
|
||||
constexpr char sep = '/';
|
||||
size_t i = s.rfind(sep, s.length());
|
||||
|
||||
if (i != string::npos)
|
||||
{
|
||||
return s.substr(i+1, s.length() - i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
std::string Latan::dirname(const std::string &s)
|
||||
{
|
||||
constexpr char sep = '/';
|
||||
size_t i = s.rfind(sep, s.length());
|
||||
|
||||
if (i != std::string::npos)
|
||||
{
|
||||
return s.substr(0, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
VarName::VarName(const string defName)
|
||||
: defName_(defName)
|
||||
{}
|
||||
|
||||
string VarName::getName(const Index i) const
|
||||
{
|
||||
if (hasName(i))
|
||||
{
|
||||
return name_.at(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
return defName_ + "_" + strFrom(i);
|
||||
}
|
||||
}
|
||||
|
||||
void VarName::setName(const Index i, const string name)
|
||||
{
|
||||
name_[i] = name;
|
||||
}
|
||||
|
||||
bool VarName::hasName(const Index i) const
|
||||
{
|
||||
return (name_.find(i) != name_.end());
|
||||
}
|
250
lib/LatAnalyze/Core/Utilities.hpp
Normal file
250
lib/LatAnalyze/Core/Utilities.hpp
Normal file
@ -0,0 +1,250 @@
|
||||
/*
|
||||
* Utilities.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef LatAnalyze_Utilities_hpp_
|
||||
#define LatAnalyze_Utilities_hpp_
|
||||
|
||||
#ifndef LATAN_GLOBAL_HPP_
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#endif
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
// Random seed type ////////////////////////////////////////////////////////////
|
||||
typedef std::random_device::result_type SeedType;
|
||||
|
||||
// Type utilities //////////////////////////////////////////////////////////////
|
||||
// pointer type test
|
||||
template <typename Derived, typename Base>
|
||||
inline bool isDerivedFrom(const Base *pt)
|
||||
{
|
||||
return (dynamic_cast<const Derived *>(pt) != nullptr);
|
||||
}
|
||||
|
||||
// static logical or
|
||||
template <bool... b>
|
||||
struct static_or;
|
||||
|
||||
template <bool... tail>
|
||||
struct static_or<true, tail...> : static_or<tail...> {};
|
||||
|
||||
template <bool... tail>
|
||||
struct static_or<false, tail...> : std::false_type {};
|
||||
|
||||
template <>
|
||||
struct static_or<> : std::true_type {};
|
||||
|
||||
// Environment /////////////////////////////////////////////////////////////////
|
||||
void testFunction(void);
|
||||
|
||||
// String utilities ////////////////////////////////////////////////////////////
|
||||
inline std::string extension(const std::string fileName)
|
||||
{
|
||||
return fileName.substr(fileName.find_last_of(".") + 1);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline T strTo(const std::string &str)
|
||||
{
|
||||
T buf;
|
||||
std::istringstream stream(str);
|
||||
|
||||
stream >> buf;
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
// optimized specializations
|
||||
template <>
|
||||
inline float strTo<float>(const std::string &str)
|
||||
{
|
||||
return strtof(str.c_str(), (char **)NULL);
|
||||
}
|
||||
template <>
|
||||
inline double strTo<double>(const std::string &str)
|
||||
{
|
||||
return strtod(str.c_str(), (char **)NULL);
|
||||
}
|
||||
template <>
|
||||
inline int strTo<int>(const std::string &str)
|
||||
{
|
||||
return (int)(strtol(str.c_str(), (char **)NULL, 10));
|
||||
}
|
||||
template <>
|
||||
inline long strTo<long>(const std::string &str)
|
||||
{
|
||||
return strtol(str.c_str(), (char **)NULL, 10);
|
||||
}
|
||||
template <>
|
||||
inline std::string strTo<std::string>(const std::string &str)
|
||||
{
|
||||
return str;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline std::string strFrom(const T x)
|
||||
{
|
||||
std::ostringstream stream;
|
||||
|
||||
stream << x;
|
||||
|
||||
return stream.str();
|
||||
}
|
||||
|
||||
// specialization for vectors
|
||||
template<>
|
||||
inline DVec strTo<DVec>(const std::string &str)
|
||||
{
|
||||
DVec res;
|
||||
std::vector<double> vbuf;
|
||||
double buf;
|
||||
std::istringstream stream(str);
|
||||
|
||||
while (!stream.eof())
|
||||
{
|
||||
stream >> buf;
|
||||
vbuf.push_back(buf);
|
||||
}
|
||||
res = Map<DVec>(vbuf.data(), static_cast<Index>(vbuf.size()));
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template<>
|
||||
inline IVec strTo<IVec>(const std::string &str)
|
||||
{
|
||||
IVec res;
|
||||
std::vector<int> vbuf;
|
||||
int buf;
|
||||
std::istringstream stream(str);
|
||||
|
||||
while (!stream.eof())
|
||||
{
|
||||
stream >> buf;
|
||||
vbuf.push_back(buf);
|
||||
}
|
||||
res = Map<IVec>(vbuf.data(), static_cast<Index>(vbuf.size()));
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template<>
|
||||
inline UVec strTo<UVec>(const std::string &str)
|
||||
{
|
||||
UVec res;
|
||||
std::vector<unsigned int> vbuf;
|
||||
unsigned int buf;
|
||||
std::istringstream stream(str);
|
||||
|
||||
while (!stream.eof())
|
||||
{
|
||||
stream >> buf;
|
||||
vbuf.push_back(buf);
|
||||
}
|
||||
res = Map<UVec>(vbuf.data(), static_cast<Index>(vbuf.size()));
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void tokenReplace(std::string &str, const std::string token,
|
||||
const T &x, const std::string mark = "@")
|
||||
{
|
||||
std::string fullToken = mark + token + mark;
|
||||
|
||||
auto pos = str.find(fullToken);
|
||||
if (pos != std::string::npos)
|
||||
{
|
||||
str.replace(pos, fullToken.size(), strFrom(x));
|
||||
}
|
||||
}
|
||||
|
||||
// Manifest file reader ////////////////////////////////////////////////////////
|
||||
inline std::vector<std::string> readManifest(const std::string manFileName)
|
||||
{
|
||||
std::vector<std::string> list;
|
||||
std::ifstream manFile;
|
||||
char buf[MAX_PATH_LENGTH];
|
||||
|
||||
manFile.open(manFileName);
|
||||
while (!manFile.eof())
|
||||
{
|
||||
manFile.getline(buf, MAX_PATH_LENGTH);
|
||||
if (!std::string(buf).empty())
|
||||
{
|
||||
list.push_back(buf);
|
||||
}
|
||||
}
|
||||
manFile.close();
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
// Recursive directory creation ////////////////////////////////////////////////
|
||||
int mkdir(const std::string dirName);
|
||||
|
||||
// C++ version of basename/dirname /////////////////////////////////////////////
|
||||
std::string basename(const std::string& s);
|
||||
std::string dirname(const std::string& s);
|
||||
|
||||
// Progress bar class //////////////////////////////////////////////////////////
|
||||
class ProgressBar
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
template <typename A, typename B>
|
||||
ProgressBar(const A current, const B total, const Index nCol = 60);
|
||||
// IO
|
||||
friend std::ostream & operator<<(std::ostream &out,
|
||||
const ProgressBar &&bar);
|
||||
private:
|
||||
Index current_, total_, nCol_;
|
||||
};
|
||||
|
||||
template <typename A, typename B>
|
||||
ProgressBar::ProgressBar(const A current, const B total, const Index nCol)
|
||||
: current_(static_cast<Index>(current))
|
||||
, total_(static_cast<Index>(total))
|
||||
, nCol_(nCol)
|
||||
{}
|
||||
|
||||
std::ostream & operator<<(std::ostream &out, const ProgressBar &&bar);
|
||||
|
||||
// named variable interface ////////////////////////////////////////////////////
|
||||
// FIXME: check redundant names and variable number limit
|
||||
class VarName
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
VarName(const std::string defName);
|
||||
// destructor
|
||||
virtual ~VarName(void) = default;
|
||||
// access
|
||||
std::string getName(const Index i) const;
|
||||
void setName(const Index i, const std::string name);
|
||||
// test
|
||||
bool hasName(const Index i) const;
|
||||
private:
|
||||
std::string defName_;
|
||||
std::unordered_map<Index, std::string> name_;
|
||||
};
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // LatAnalyze_Utilities_hpp_
|
58
lib/LatAnalyze/Core/stdincludes.hpp
Normal file
58
lib/LatAnalyze/Core/stdincludes.hpp
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* stdincludes.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef Latan_stdincludes_hpp_
|
||||
#define Latan_stdincludes_hpp_
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <chrono>
|
||||
#include <complex>
|
||||
#include <condition_variable>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <queue>
|
||||
#include <random>
|
||||
#include <regex>
|
||||
#include <set>
|
||||
#include <stack>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <thread>
|
||||
#include <type_traits>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <cfloat>
|
||||
#include <climits>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#endif // Latan_stdincludes_hpp_
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CompiledFunction.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,8 +17,8 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledFunction.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CompiledFunction.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,8 +21,8 @@
|
||||
#define Latan_CompiledFunction_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CompiledModel.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,8 +17,8 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/CompiledModel.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Functional/CompiledModel.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* CompiledModel.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,8 +21,8 @@
|
||||
#define Latan_CompiledModel_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Model.hpp>
|
||||
#include <LatAnalyze/MathInterpreter.hpp>
|
||||
#include <LatAnalyze/Functional/Model.hpp>
|
||||
#include <LatAnalyze/Core/MathInterpreter.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Function.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
@ -111,6 +111,20 @@ double DoubleFunction::operator()(void) const
|
||||
return (*this)(nullptr);
|
||||
}
|
||||
|
||||
std::map<double, double> DoubleFunction::operator()(const std::map<double, double> &m) const
|
||||
{
|
||||
checkSize(1);
|
||||
|
||||
std::map<double, double> res;
|
||||
|
||||
for (auto &val: m)
|
||||
{
|
||||
res[val.first] = (*this)(val.second);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// bind ////////////////////////////////////////////////////////////////////////
|
||||
DoubleFunction DoubleFunction::bind(const Index argIndex,
|
||||
const double val) const
|
||||
@ -165,6 +179,26 @@ DoubleFunction DoubleFunction::bind(const Index argIndex,
|
||||
return bindFunc;
|
||||
}
|
||||
|
||||
// sample //////////////////////////////////////////////////////////////////////
|
||||
DVec DoubleFunction::sample(const DMat &x) const
|
||||
{
|
||||
if (x.cols() != getNArg())
|
||||
{
|
||||
LATAN_ERROR(Size, "sampling point matrix and number of arguments "
|
||||
"mismatch (matrix has " + strFrom(x.cols())
|
||||
+ ", number of arguments is " + strFrom(getNArg()) + ")");
|
||||
}
|
||||
|
||||
DVec res(x.rows());
|
||||
|
||||
for (Index i = 0; i < res.size(); ++i)
|
||||
{
|
||||
res(i) = (*this)(x.row(i));
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// arithmetic operators ////////////////////////////////////////////////////////
|
||||
DoubleFunction DoubleFunction::operator-(void) const
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Function.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,8 +21,8 @@
|
||||
#define Latan_Function_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
@ -52,9 +52,12 @@ public:
|
||||
double operator()(void) const;
|
||||
template <typename... Ts>
|
||||
double operator()(const double arg0, const Ts... args) const;
|
||||
std::map<double, double> operator()(const std::map<double, double> &m) const;
|
||||
// bind
|
||||
DoubleFunction bind(const Index argIndex, const double val) const;
|
||||
DoubleFunction bind(const Index argIndex, const DVec &x) const;
|
||||
// sample
|
||||
DVec sample(const DMat &x) const;
|
||||
// arithmetic operators
|
||||
DoubleFunction operator-(void) const;
|
||||
DoubleFunction & operator+=(const DoubleFunction &f);
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Model.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Model.hpp>
|
||||
#include <LatAnalyze/Functional/Model.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Model.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,8 +21,8 @@
|
||||
#define Latan_Model_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* TabFunction.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/TabFunction.hpp>
|
||||
#include <LatAnalyze/Functional/TabFunction.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* TabFunction.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,9 +21,9 @@
|
||||
#define Latan_TabFunction_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/XYStatData.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
#include <LatAnalyze/Statistics/XYStatData.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Global.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -25,11 +25,13 @@ using namespace Latan;
|
||||
|
||||
PlaceHolder Latan::_;
|
||||
|
||||
const string Env::fullName = PACKAGE_STRING;
|
||||
const string Env::name = PACKAGE_NAME;
|
||||
const string Env::version = PACKAGE_VERSION;
|
||||
const string Env::msgPrefix = "[" + strFrom(PACKAGE_NAME) + " v"
|
||||
+ strFrom(PACKAGE_VERSION) + "] ";
|
||||
const string Env::fullName = strFrom(PROJECT_NAME) + " " + strFrom(LATAN_SHORT_SHA) + " (v" + strFrom(PROJECT_VERSION) + ")";
|
||||
const string Env::name = PROJECT_NAME;
|
||||
const string Env::version = PROJECT_VERSION;
|
||||
const string Env::gitShortSha = LATAN_SHORT_SHA;
|
||||
const string Env::gitSha = LATAN_SHA;
|
||||
const string Env::gitBranch = LATAN_BRANCH;
|
||||
const string Env::msgPrefix = "[" + Env::fullName + "] ";
|
||||
|
||||
void Env::function(void)
|
||||
{}
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Global.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -20,13 +20,27 @@
|
||||
#ifndef Latan_Global_hpp_
|
||||
#define Latan_Global_hpp_
|
||||
|
||||
#include <LatCore/LatCore.hpp>
|
||||
#include <LatAnalyze/Core/stdincludes.hpp>
|
||||
|
||||
#define BEGIN_LATAN_NAMESPACE \
|
||||
namespace Latan {\
|
||||
using namespace LatCore;
|
||||
namespace Latan {
|
||||
#define END_LATAN_NAMESPACE }
|
||||
|
||||
// macro utilities
|
||||
#define unique_arg(...) __VA_ARGS__
|
||||
#define DEBUG_VAR(x) std::cout << #x << "= " << x << std::endl
|
||||
#define DEBUG_MAT(m) std::cout << #m << "=\n" << m << std::endl
|
||||
|
||||
// attribute to switch off unused warnings with gcc
|
||||
#ifdef __GNUC__
|
||||
#define __dumb __attribute__((unused))
|
||||
#else
|
||||
#define __dumb
|
||||
#endif
|
||||
|
||||
// max length for paths
|
||||
#define MAX_PATH_LENGTH 512u
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
// Placeholder type ////////////////////////////////////////////////////////////
|
||||
@ -40,6 +54,9 @@ namespace Env
|
||||
extern const std::string fullName;
|
||||
extern const std::string name;
|
||||
extern const std::string version;
|
||||
extern const std::string gitShortSha;
|
||||
extern const std::string gitSha;
|
||||
extern const std::string gitBranch;
|
||||
extern const std::string msgPrefix;
|
||||
// empty function for library test
|
||||
void function(void);
|
||||
@ -47,6 +64,8 @@ namespace Env
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#include <LatAnalyze/Exceptions.hpp>
|
||||
#include <LatAnalyze/Core/Eigen.hpp>
|
||||
#include <LatAnalyze/Core/Exceptions.hpp>
|
||||
#include <LatAnalyze/Core/Utilities.hpp>
|
||||
|
||||
#endif // Latan_Global_hpp_
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AsciiFile.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/AsciiFile.hpp>
|
||||
#include <LatAnalyze/Io/AsciiFile.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AsciiFile.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,10 +21,10 @@
|
||||
#define Latan_AsciiFile_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/File.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/ParserState.hpp>
|
||||
#include <LatAnalyze/Io/File.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
#include <LatAnalyze/Core/ParserState.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AsciiLexer.lpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -25,7 +25,7 @@
|
||||
%option yylineno
|
||||
|
||||
%{
|
||||
#include <LatAnalyze/AsciiFile.hpp>
|
||||
#include <LatAnalyze/Io/AsciiFile.hpp>
|
||||
#include "AsciiParser.hpp"
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* AsciiParser.ypp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -19,9 +19,9 @@
|
||||
|
||||
%{
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/AsciiFile.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/Io/AsciiFile.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
81
lib/LatAnalyze/Io/BinReader.cpp
Normal file
81
lib/LatAnalyze/Io/BinReader.cpp
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* BinReader.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2015 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Io/BinReader.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
#if (defined __GNUC__)||(defined __clang__)
|
||||
#pragma GCC diagnostic ignored "-Wunreachable-code"
|
||||
#endif
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
BinIO::BinIO(string msg, string loc)
|
||||
: runtime_error("Binary reader error: " + msg + " (" + loc + ")")
|
||||
{}
|
||||
|
||||
/******************************************************************************
|
||||
* BinReader implementation *
|
||||
******************************************************************************/
|
||||
// constructor /////////////////////////////////////////////////////////////////
|
||||
BinReader::BinReader(const string fileName, const uint32_t endianness,
|
||||
const bool isColMaj)
|
||||
{
|
||||
open(fileName, endianness, isColMaj);
|
||||
}
|
||||
|
||||
// I/O /////////////////////////////////////////////////////////////////////////
|
||||
void BinReader::open(const string fileName, const uint32_t endianness,
|
||||
const bool isColMaj)
|
||||
{
|
||||
fileName_ = fileName;
|
||||
endianness_ = endianness;
|
||||
isColMaj_ = isColMaj;
|
||||
file_.reset(new ifstream(fileName_, ios::in|ios::binary|ios::ate));
|
||||
if (!file_->is_open())
|
||||
{
|
||||
LATAN_ERROR(Io, "impossible to open file '" + fileName_ + "'");
|
||||
}
|
||||
size_ = static_cast<size_t>(file_->tellg());
|
||||
file_->seekg(0, ios::beg);
|
||||
}
|
||||
|
||||
void BinReader::close(void)
|
||||
{
|
||||
file_.reset(nullptr);
|
||||
}
|
||||
|
||||
template <>
|
||||
std::string BinReader::read(void)
|
||||
{
|
||||
std::string s;
|
||||
char c = 'a';
|
||||
|
||||
while (c != '\n')
|
||||
{
|
||||
c = read<char>();
|
||||
if (c != '\n')
|
||||
{
|
||||
s.push_back(c);
|
||||
}
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
196
lib/LatAnalyze/Io/BinReader.hpp
Normal file
196
lib/LatAnalyze/Io/BinReader.hpp
Normal file
@ -0,0 +1,196 @@
|
||||
/*
|
||||
* BinReader.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2015 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef LatAnalyze_BinReader_hpp_
|
||||
#define LatAnalyze_BinReader_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
// I/O exception
|
||||
class BinIO: public std::runtime_error
|
||||
{
|
||||
public:
|
||||
BinIO(std::string msg, std::string loc);
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Byte manipulation utilities *
|
||||
******************************************************************************/
|
||||
class Endianness
|
||||
{
|
||||
public:
|
||||
enum: uint32_t
|
||||
{
|
||||
little = 0x00000001,
|
||||
big = 0x01000000,
|
||||
unknown = 0xffffffff
|
||||
};
|
||||
};
|
||||
|
||||
class ByteManip
|
||||
{
|
||||
public:
|
||||
static constexpr uint32_t getHostEndianness(void)
|
||||
{
|
||||
return ((0xffffffff & 1) == Endianness::little) ? Endianness::little
|
||||
: (((0xffffffff & 1) == Endianness::big) ? Endianness::big
|
||||
: Endianness::unknown);
|
||||
}
|
||||
template <typename T>
|
||||
static T swapBytes(const T);
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* template implementation *
|
||||
******************************************************************************/
|
||||
template <typename T>
|
||||
T ByteManip::swapBytes(const T u)
|
||||
{
|
||||
static_assert (CHAR_BIT == 8, "CHAR_BIT != 8");
|
||||
|
||||
union
|
||||
{
|
||||
T u;
|
||||
unsigned char u8[sizeof(T)];
|
||||
} source, dest;
|
||||
|
||||
source.u = u;
|
||||
for (size_t k = 0; k < sizeof(T); ++k)
|
||||
{
|
||||
dest.u8[k] = source.u8[sizeof(T) - k - 1];
|
||||
}
|
||||
|
||||
return dest.u;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Utility to read binary files *
|
||||
******************************************************************************/
|
||||
class BinReader
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
BinReader(void) = default;
|
||||
BinReader(const std::string fileName,
|
||||
const uint32_t endianness = ByteManip::getHostEndianness(),
|
||||
const bool isColMaj = false);
|
||||
// destructor
|
||||
virtual ~BinReader(void) = default;
|
||||
// I/O
|
||||
void open(const std::string fileName,
|
||||
const uint32_t endianness = ByteManip::getHostEndianness(),
|
||||
const bool isColMaj = false);
|
||||
void close(void);
|
||||
template <typename T>
|
||||
void read(T *pt, Index size);
|
||||
template <typename T>
|
||||
T read(void);
|
||||
template <typename T>
|
||||
MatBase<T> read(const Index nRow, const Index nCol);
|
||||
private:
|
||||
std::unique_ptr<std::ifstream> file_{nullptr};
|
||||
std::string fileName_;
|
||||
size_t size_;
|
||||
uint32_t endianness_;
|
||||
bool isColMaj_;
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* template implementation *
|
||||
******************************************************************************/
|
||||
template <typename T>
|
||||
void BinReader::read(T *pt, Index n)
|
||||
{
|
||||
if (file_ != nullptr)
|
||||
{
|
||||
file_->read(reinterpret_cast<char *>(pt),
|
||||
static_cast<long>(sizeof(T))*n);
|
||||
if (endianness_ != ByteManip::getHostEndianness())
|
||||
{
|
||||
for (Index i = 0; i < n; ++i)
|
||||
{
|
||||
pt[i] = ByteManip::swapBytes(pt[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LATAN_ERROR(Io, "file is not opened");
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T BinReader::read(void)
|
||||
{
|
||||
T x;
|
||||
|
||||
if (file_ != nullptr)
|
||||
{
|
||||
read(&x, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
LATAN_ERROR(Io, "file is not opened");
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
template <>
|
||||
std::string BinReader::read(void);
|
||||
|
||||
template <typename T>
|
||||
MatBase<T> BinReader::read(const Index nRow, const Index nCol)
|
||||
{
|
||||
MatBase<T> m;
|
||||
|
||||
// Eigen matrices use column-major ordering
|
||||
if (isColMaj_)
|
||||
{
|
||||
m.resize(nRow, nCol);
|
||||
}
|
||||
else
|
||||
{
|
||||
m.resize(nCol, nRow);
|
||||
}
|
||||
if (file_ != nullptr)
|
||||
{
|
||||
read(m.data(), nRow*nCol);
|
||||
}
|
||||
else
|
||||
{
|
||||
LATAN_ERROR(Io, "file is not opened");
|
||||
}
|
||||
if (isColMaj_)
|
||||
{
|
||||
return m;
|
||||
}
|
||||
else
|
||||
{
|
||||
return m.transpose();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // LatAnalyze_BinReader_hpp_
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* File.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,7 +17,7 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/File.hpp>
|
||||
#include <LatAnalyze/Io/File.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* File.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,9 +21,9 @@
|
||||
#define Latan_File_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/IoObject.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/Io/IoObject.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
@ -105,12 +105,12 @@ const IoT& File::getData(const std::string &name) const
|
||||
{
|
||||
return dynamic_cast<const IoT &>(*(data_.at(name)));
|
||||
}
|
||||
catch(std::out_of_range)
|
||||
catch (std::out_of_range &)
|
||||
{
|
||||
LATAN_ERROR(Definition, "no data with name '" + name + "' in file "
|
||||
+ name_);
|
||||
}
|
||||
catch(std::bad_cast)
|
||||
catch (std::bad_cast &)
|
||||
{
|
||||
LATAN_ERROR(Definition, "data with name '" + name + "' in file "
|
||||
+ name_ + " does not have type '" + typeid(IoT).name()
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Hdf5File.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli, Matt Spraggs
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli, Matt Spraggs
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,8 +17,8 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Hdf5File.hpp>
|
||||
#include <LatAnalyze/IoObject.hpp>
|
||||
#include <LatAnalyze/Io/Hdf5File.hpp>
|
||||
#include <LatAnalyze/Io/IoObject.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Hdf5File.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli, Matt Spraggs
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli, Matt Spraggs
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,9 +21,9 @@
|
||||
#define Latan_Hdf5File_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/File.hpp>
|
||||
#include <LatAnalyze/Mat.hpp>
|
||||
#include <LatAnalyze/MatSample.hpp>
|
||||
#include <LatAnalyze/Io/File.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
#include <LatAnalyze/Statistics/MatSample.hpp>
|
||||
#include <H5Cpp.h>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Io.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,12 +17,10 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Io.hpp>
|
||||
#include <LatAnalyze/Io/Io.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include <LatAnalyze/AsciiFile.hpp>
|
||||
#ifdef HAVE_HDF5
|
||||
#include <LatAnalyze/Hdf5File.hpp>
|
||||
#endif
|
||||
#include <LatAnalyze/Io/AsciiFile.hpp>
|
||||
#include <LatAnalyze/Io/Hdf5File.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
@ -42,12 +40,10 @@ unique_ptr<File> Io::open(const std::string &fileName, const unsigned int mode)
|
||||
{
|
||||
return unique_ptr<File>(new AsciiFile(fileName, mode));
|
||||
}
|
||||
#ifdef HAVE_HDF5
|
||||
else if (ext == "h5")
|
||||
{
|
||||
return unique_ptr<File>(new Hdf5File(fileName, mode));
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
LATAN_ERROR(Io, "unknown file extension '" + ext + "'");
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Io.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,7 +21,7 @@
|
||||
#define Latan_Io_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/File.hpp>
|
||||
#include <LatAnalyze/Io/File.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* IoObject.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
2791
lib/LatAnalyze/Io/Xml/tinyxml2.cpp
Normal file
2791
lib/LatAnalyze/Io/Xml/tinyxml2.cpp
Normal file
File diff suppressed because it is too large
Load Diff
2272
lib/LatAnalyze/Io/Xml/tinyxml2.hpp
Normal file
2272
lib/LatAnalyze/Io/Xml/tinyxml2.hpp
Normal file
File diff suppressed because it is too large
Load Diff
84
lib/LatAnalyze/Io/XmlReader.cpp
Normal file
84
lib/LatAnalyze/Io/XmlReader.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* XmlReader.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Io/XmlReader.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
XmlParsing::XmlParsing(string msg, string loc)
|
||||
: runtime_error("XML reader error: " + msg + " (" + loc + ")")
|
||||
{}
|
||||
|
||||
/******************************************************************************
|
||||
* XmlReader implementation *
|
||||
******************************************************************************/
|
||||
// constructor /////////////////////////////////////////////////////////////////
|
||||
XmlReader::XmlReader(const string &fileName)
|
||||
{
|
||||
open(fileName);
|
||||
}
|
||||
|
||||
// IO //////////////////////////////////////////////////////////////////////////
|
||||
void XmlReader::open(const string &fileName)
|
||||
{
|
||||
name_ = fileName;
|
||||
doc_.LoadFile(name_.c_str());
|
||||
if (doc_.Error())
|
||||
{
|
||||
string errMsg;
|
||||
|
||||
if (doc_.ErrorStr())
|
||||
{
|
||||
errMsg = doc_.ErrorStr();
|
||||
}
|
||||
LATAN_ERROR(Io, "cannot open file " + fileName + " [tinyxml2 code "
|
||||
+ strFrom(doc_.ErrorID()) + ": " + errMsg + "]");
|
||||
}
|
||||
root_ = doc_.RootElement();
|
||||
}
|
||||
|
||||
// XML structure access ////////////////////////////////////////////////////////
|
||||
const XmlNode * XmlReader::getNextNode(const XmlNode *node,
|
||||
const string &nodeName)
|
||||
{
|
||||
const char *pt = (nodeName.empty()) ? nullptr : nodeName.c_str();
|
||||
|
||||
if (node)
|
||||
{
|
||||
return node->NextSiblingElement(pt);
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
const XmlNode * XmlReader::getNextSameNode(const XmlNode *node)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
return getNextNode(node, node->Name());
|
||||
}
|
||||
else
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
}
|
235
lib/LatAnalyze/Io/XmlReader.hpp
Normal file
235
lib/LatAnalyze/Io/XmlReader.hpp
Normal file
@ -0,0 +1,235 @@
|
||||
/*
|
||||
* XmlReader.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef LatAnalyze_XmlReader_hpp_
|
||||
#define LatAnalyze_XmlReader_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||
#include <LatAnalyze/Io/Xml/tinyxml2.hpp>
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
// parsing exception
|
||||
class XmlParsing: public std::runtime_error
|
||||
{
|
||||
public:
|
||||
XmlParsing(std::string msg, std::string loc);
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* XML parameter file reader *
|
||||
******************************************************************************/
|
||||
typedef tinyxml2::XMLElement XmlNode;
|
||||
|
||||
class XmlReader
|
||||
{
|
||||
public:
|
||||
// constructor
|
||||
XmlReader(void) = default;
|
||||
explicit XmlReader(const std::string &fileName);
|
||||
// destructor
|
||||
virtual ~XmlReader(void) = default;
|
||||
// IO
|
||||
void open(const std::string &fileName);
|
||||
// XML structure access
|
||||
template <typename... Strs>
|
||||
static const XmlNode * getFirstNode(const XmlNode *startNode,
|
||||
const std::string &nodeName,
|
||||
Strs... nodeNames);
|
||||
template <typename... Strs>
|
||||
const XmlNode * getFirstNode(const std::string &nodeName,
|
||||
Strs... nodeNames) const;
|
||||
static const XmlNode * getNextNode(const XmlNode *node,
|
||||
const std::string &nodeName = "");
|
||||
static const XmlNode * getNextSameNode(const XmlNode *node);
|
||||
template <typename T>
|
||||
static T getValue(const XmlNode *node);
|
||||
template <typename T, typename... Strs>
|
||||
static T getFirstValue(const XmlNode *startNode,
|
||||
const std::string &nodeName, Strs... nodeNames);
|
||||
template <typename T, typename... Strs>
|
||||
T getFirstValue(const std::string &nodeName, Strs... nodeNames) const;
|
||||
template <typename T, typename... Strs>
|
||||
static std::vector<T> getAllValues(const XmlNode *startNode,
|
||||
const std::string &nodeName,
|
||||
Strs... nodeNames);
|
||||
template <typename T, typename... Strs>
|
||||
std::vector<T> getAllValues(const std::string &nodeName,
|
||||
Strs... nodeNames) const;
|
||||
// XML structure test
|
||||
template <typename... Strs>
|
||||
static bool hasNode(const XmlNode *startNode, const std::string &nodeName,
|
||||
Strs... nodeNames);
|
||||
template <typename... Strs>
|
||||
bool hasNode(const std::string &nodeName, Strs... nodeNames) const;
|
||||
private:
|
||||
std::string name_;
|
||||
tinyxml2::XMLDocument doc_;
|
||||
XmlNode *root_{nullptr};
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* XmlReader template implementation *
|
||||
******************************************************************************/
|
||||
// XML structure access ////////////////////////////////////////////////////////
|
||||
template <typename... Strs>
|
||||
const XmlNode * XmlReader::getFirstNode(const XmlNode *startNode,
|
||||
const std::string &nodeName,
|
||||
Strs... nodeNames)
|
||||
{
|
||||
static_assert(static_or<std::is_assignable<std::string, Strs>::value...>::value,
|
||||
"getFirstNode arguments are not compatible with std::string");
|
||||
|
||||
const unsigned int nName = sizeof...(nodeNames) + 1;
|
||||
const std::string name[] = {nodeName, nodeNames...};
|
||||
const XmlNode *node = startNode;
|
||||
|
||||
if (!node)
|
||||
{
|
||||
LATAN_ERROR(Io, "root node is null, no XML file opened");
|
||||
}
|
||||
for (unsigned int i = 0; i < nName; ++i)
|
||||
{
|
||||
node = node->FirstChildElement(name[i].c_str());
|
||||
if (!node)
|
||||
{
|
||||
LATAN_ERROR(Io, "XML node " + name[i] + " not found");
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
template <typename... Strs>
|
||||
const XmlNode * XmlReader::getFirstNode(const std::string &nodeName,
|
||||
Strs... nodeNames) const
|
||||
{
|
||||
if (!root_)
|
||||
{
|
||||
LATAN_ERROR(Io, "root node is null, no XML file opened");
|
||||
}
|
||||
|
||||
return getFirstNode(root_, nodeName, nodeNames...);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T XmlReader::getValue(const XmlNode *node)
|
||||
{
|
||||
if (node)
|
||||
{
|
||||
if (node->GetText())
|
||||
{
|
||||
return Latan::strTo<T>(node->GetText());
|
||||
}
|
||||
else
|
||||
{
|
||||
return T();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return T();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, typename... Strs>
|
||||
T XmlReader::getFirstValue(const XmlNode *startNode,
|
||||
const std::string &nodeName, Strs... nodeNames)
|
||||
{
|
||||
const XmlNode *node = getFirstNode(startNode, nodeName, nodeNames...);
|
||||
|
||||
return getValue<T>(node);
|
||||
}
|
||||
|
||||
template <typename T, typename... Strs>
|
||||
T XmlReader::getFirstValue(const std::string &nodeName, Strs... nodeNames) const
|
||||
{
|
||||
return getFirstValue<T>(root_, nodeName, nodeNames...);
|
||||
}
|
||||
|
||||
template <typename T, typename... Strs>
|
||||
std::vector<T> XmlReader::getAllValues(const XmlNode *startNode,
|
||||
const std::string &nodeName,
|
||||
Strs... nodeNames)
|
||||
{
|
||||
const XmlNode *node = getFirstNode(startNode, nodeName, nodeNames...);
|
||||
std::vector<T> value;
|
||||
|
||||
while (node)
|
||||
{
|
||||
value.push_back(getValue<T>(node));
|
||||
node = getNextSameNode(node);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
template <typename T, typename... Strs>
|
||||
std::vector<T> XmlReader::getAllValues(const std::string &nodeName,
|
||||
Strs... nodeNames) const
|
||||
{
|
||||
return getAllValues<T>(root_, nodeName, nodeNames...);
|
||||
}
|
||||
|
||||
// XML structure test //////////////////////////////////////////////////////////
|
||||
template <typename... Strs>
|
||||
bool XmlReader::hasNode(const XmlNode *startNode, const std::string &nodeName,
|
||||
Strs... nodeNames)
|
||||
{
|
||||
static_assert(static_or<std::is_assignable<std::string, Strs>::value...>::value,
|
||||
"hasNode arguments are not compatible with std::string");
|
||||
|
||||
const unsigned int nName = sizeof...(nodeNames) + 1;
|
||||
const std::string name[] = {nodeName, nodeNames...};
|
||||
const XmlNode *node = startNode;
|
||||
|
||||
if (!node)
|
||||
{
|
||||
LATAN_ERROR(Io, "root node is null, no XML file opened");
|
||||
}
|
||||
for (unsigned int i = 0; i < nName; ++i)
|
||||
{
|
||||
node = node->FirstChildElement(name[i].c_str());
|
||||
if (!node)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename... Strs>
|
||||
bool XmlReader::hasNode(const std::string &nodeName, Strs... nodeNames) const
|
||||
{
|
||||
if (!root_)
|
||||
{
|
||||
LATAN_ERROR(Io, "root node is null, no XML file opened");
|
||||
}
|
||||
|
||||
return hasNode(root_, nodeName, nodeNames...);
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // LatAnalyze_XmlReader_hpp_
|
151
lib/LatAnalyze/Makefile.am
Normal file
151
lib/LatAnalyze/Makefile.am
Normal file
@ -0,0 +1,151 @@
|
||||
COM_CXXFLAGS = -Wall
|
||||
if CXX_GNU
|
||||
COM_CXXFLAGS += -W -pedantic -Wno-deprecated-declarations
|
||||
else
|
||||
if CXX_INTEL
|
||||
COM_CXXFLAGS += -wd1682
|
||||
endif
|
||||
endif
|
||||
|
||||
include eigen_files.mk
|
||||
|
||||
AM_LFLAGS = -olex.yy.c
|
||||
AM_YFLAGS = -y -d -Wno-yacc -Wno-deprecated
|
||||
|
||||
lib_LTLIBRARIES = libLatAnalyze.la
|
||||
noinst_LTLIBRARIES = libLexers.la
|
||||
|
||||
libLexers_la_SOURCES = Io/AsciiLexer.lpp Core/MathLexer.lpp
|
||||
if CXX_GNU
|
||||
libLexers_la_CXXFLAGS = $(COM_CXXFLAGS) -Wno-unused-parameter -Wno-unused-function -Wno-deprecated-register
|
||||
else
|
||||
libLexers_la_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
endif
|
||||
|
||||
libLatAnalyze_la_SOURCES = \
|
||||
includes.hpp \
|
||||
Global.cpp \
|
||||
Core/Exceptions.cpp \
|
||||
Core/Mat.cpp \
|
||||
Core/Math.cpp \
|
||||
Core/MathInterpreter.cpp \
|
||||
Core/MathParser.ypp \
|
||||
Core/OptParser.cpp \
|
||||
Core/Plot.cpp \
|
||||
Core/ThreadPool.cpp \
|
||||
Core/Utilities.cpp \
|
||||
Functional/CompiledFunction.cpp \
|
||||
Functional/CompiledModel.cpp \
|
||||
Functional/Function.cpp \
|
||||
Functional/Model.cpp \
|
||||
Functional/TabFunction.cpp \
|
||||
Io/AsciiFile.cpp \
|
||||
Io/AsciiParser.ypp \
|
||||
Io/BinReader.cpp \
|
||||
Io/File.cpp \
|
||||
Io/Hdf5File.cpp \
|
||||
Io/Io.cpp \
|
||||
Io/XmlReader.cpp \
|
||||
Io/Xml/tinyxml2.cpp \
|
||||
Numerical/Derivative.cpp \
|
||||
Numerical/DWT.cpp \
|
||||
Numerical/DWTFilters.cpp \
|
||||
Numerical/GslFFT.cpp \
|
||||
Numerical/GslHybridRootFinder.cpp\
|
||||
Numerical/GslMinimizer.cpp \
|
||||
Numerical/GslQagsIntegrator.cpp \
|
||||
Numerical/Minimizer.cpp \
|
||||
Numerical/RootFinder.cpp \
|
||||
Numerical/Solver.cpp \
|
||||
Physics/CorrelatorFitter.cpp \
|
||||
Physics/DataFilter.cpp \
|
||||
Physics/EffectiveMass.cpp \
|
||||
Statistics/FitInterface.cpp \
|
||||
Statistics/Histogram.cpp \
|
||||
Statistics/Random.cpp \
|
||||
Statistics/StatArray.cpp \
|
||||
Statistics/XYSampleData.cpp \
|
||||
Statistics/XYStatData.cpp \
|
||||
../config.h
|
||||
libLatAnalyze_ladir = $(pkgincludedir)
|
||||
HPPFILES = \
|
||||
Global.hpp \
|
||||
Core/Eigen.hpp \
|
||||
Core/EigenPlugin.hpp \
|
||||
Core/Exceptions.hpp \
|
||||
Core/Mat.hpp \
|
||||
Core/Math.hpp \
|
||||
Core/MathInterpreter.hpp \
|
||||
Core/OptParser.hpp \
|
||||
Core/ParserState.hpp \
|
||||
Core/Plot.hpp \
|
||||
Core/ThreadPool.hpp \
|
||||
Core/stdincludes.hpp \
|
||||
Core/Utilities.hpp \
|
||||
Functional/CompiledFunction.hpp \
|
||||
Functional/CompiledModel.hpp \
|
||||
Functional/Function.hpp \
|
||||
Functional/Model.hpp \
|
||||
Functional/TabFunction.hpp \
|
||||
Io/AsciiFile.hpp \
|
||||
Io/BinReader.hpp \
|
||||
Io/File.hpp \
|
||||
Io/Hdf5File.hpp \
|
||||
Io/Io.hpp \
|
||||
Io/IoObject.hpp \
|
||||
Io/XmlReader.hpp \
|
||||
Numerical/Derivative.hpp \
|
||||
Numerical/DWT.hpp \
|
||||
Numerical/DWTFilters.hpp \
|
||||
Numerical/FFT.hpp \
|
||||
Numerical/GslFFT.hpp \
|
||||
Numerical/GslHybridRootFinder.hpp\
|
||||
Numerical/GslMinimizer.hpp \
|
||||
Numerical/GslQagsIntegrator.hpp \
|
||||
Numerical/Integrator.hpp \
|
||||
Numerical/Minimizer.hpp \
|
||||
Numerical/RootFinder.hpp \
|
||||
Numerical/Solver.hpp \
|
||||
Physics/CorrelatorFitter.hpp \
|
||||
Physics/DataFilter.hpp \
|
||||
Physics/EffectiveMass.hpp \
|
||||
Statistics/Dataset.hpp \
|
||||
Statistics/FitInterface.hpp \
|
||||
Statistics/Histogram.hpp \
|
||||
Statistics/MatSample.hpp \
|
||||
Statistics/Random.hpp \
|
||||
Statistics/StatArray.hpp \
|
||||
Statistics/XYSampleData.hpp \
|
||||
Statistics/XYStatData.hpp
|
||||
if HAVE_MINUIT
|
||||
libLatAnalyze_la_SOURCES += Numerical/MinuitMinimizer.cpp
|
||||
HPPFILES += Numerical/MinuitMinimizer.hpp
|
||||
endif
|
||||
if HAVE_NLOPT
|
||||
libLatAnalyze_la_SOURCES += Numerical/NloptMinimizer.cpp
|
||||
HPPFILES += Numerical/NloptMinimizer.hpp
|
||||
endif
|
||||
libLatAnalyze_la_CXXFLAGS = $(COM_CXXFLAGS)
|
||||
libLatAnalyze_la_LIBADD = libLexers.la
|
||||
|
||||
if HAVE_AM_MINOR_LE_11
|
||||
Io/AsciiParser.hpp: Io/AsciiParser.ypp
|
||||
$(AM_V_YACC) $(YACC) -o Io/AsciiParser.cpp --defines=Io/AsciiParser.hpp $<
|
||||
|
||||
Core/MathParser.hpp: Core/MathParser.ypp
|
||||
$(AM_V_YACC) $(YACC) -o Core/MathParser.cpp --defines=Core/MathParser.hpp $<
|
||||
endif
|
||||
|
||||
BUILT_SOURCES = Io/AsciiParser.hpp Core/MathParser.hpp
|
||||
|
||||
CLEANFILES = \
|
||||
Core/MathLexer.cpp \
|
||||
Core/MathParser.cpp\
|
||||
Core/MathParser.hpp\
|
||||
Io/AsciiLexer.cpp \
|
||||
Io/AsciiParser.cpp \
|
||||
Io/AsciiParser.hpp
|
||||
|
||||
nobase_dist_pkginclude_HEADERS = $(HPPFILES) $(eigen_files) Io/Xml/tinyxml2.hpp
|
||||
|
||||
ACLOCAL_AMFLAGS = -I .buildutils/m4
|
71
lib/LatAnalyze/Numerical/CompositeMinimizer.cpp
Normal file
71
lib/LatAnalyze/Numerical/CompositeMinimizer.cpp
Normal file
@ -0,0 +1,71 @@
|
||||
/*
|
||||
* CompositeMinimizer.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2024 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Numerical/CompositeMinimizer.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include "CompositeMinimizer.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
/******************************************************************************
|
||||
* CompositeMinimizer implementation *
|
||||
******************************************************************************/
|
||||
// constructor ////////////////////////////////////////////////////////////////
|
||||
CompositeMinimizer::CompositeMinimizer(const std::vector<Minimizer *> &minimizer)
|
||||
: minVec_(minimizer)
|
||||
{
|
||||
if (minVec_.size() == 0)
|
||||
{
|
||||
LATAN_ERROR(Size, "minimizer vector has size 0");
|
||||
}
|
||||
}
|
||||
|
||||
// access /////////////////////////////////////////////////////////////////////
|
||||
bool CompositeMinimizer::supportLimits(void) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// minimization ///////////////////////////////////////////////////////////////
|
||||
const DVec &CompositeMinimizer::operator()(const DoubleFunction &f)
|
||||
{
|
||||
DVec &x = getState();
|
||||
DVec tmp;
|
||||
unsigned int i = 1, nMin = minVec_.size();
|
||||
|
||||
// resize minimizer state to match function number of arguments
|
||||
if (f.getNArg() != x.size())
|
||||
{
|
||||
resize(f.getNArg());
|
||||
}
|
||||
|
||||
for (auto &m: minVec_)
|
||||
{
|
||||
if (getVerbosity() >= Verbosity::Normal)
|
||||
{
|
||||
cout << "********** Composite minimizer step " << i << "/" << nMin << endl;
|
||||
}
|
||||
m->setInit(x);
|
||||
x = (*m)(f);
|
||||
i++;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
68
lib/LatAnalyze/Numerical/CompositeMinimizer.hpp
Normal file
68
lib/LatAnalyze/Numerical/CompositeMinimizer.hpp
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* CompositeMinimizer.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2024 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 3 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef Latan_CompositeMinimizer_hpp_
|
||||
#define Latan_CompositeMinimizer_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
#include <LatAnalyze/Numerical/Minimizer.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
/******************************************************************************
|
||||
* Class for chaining minimizers *
|
||||
******************************************************************************/
|
||||
class CompositeMinimizer: public Minimizer
|
||||
{
|
||||
public:
|
||||
// constructors
|
||||
explicit CompositeMinimizer(const std::vector<Minimizer *> &minimizer);
|
||||
template <typename... Ts>
|
||||
CompositeMinimizer(Minimizer &min, Ts & ... minimisers);
|
||||
// destructor
|
||||
virtual ~CompositeMinimizer(void) = default;
|
||||
// access
|
||||
virtual bool supportLimits(void) const;
|
||||
// minimization
|
||||
virtual const DVec & operator()(const DoubleFunction &f);
|
||||
private:
|
||||
std::vector<Minimizer *> minVec_;
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* CompositeMinimizer template implementation *
|
||||
******************************************************************************/
|
||||
template <typename... Ts>
|
||||
CompositeMinimizer::CompositeMinimizer(Minimizer &min, Ts & ... minimisers)
|
||||
{
|
||||
static_assert(static_or<std::is_assignable<Minimizer &, Ts>::value...>::value,
|
||||
"model arguments are not compatible with Minimizer");
|
||||
|
||||
|
||||
minVec_ = {&min, &minimisers...};
|
||||
if (minVec_.size() == 0)
|
||||
{
|
||||
LATAN_ERROR(Size, "minimizer vector has size 0");
|
||||
}
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // Latan_CompositeMinimizer_hpp_
|
205
lib/LatAnalyze/Numerical/DWT.cpp
Normal file
205
lib/LatAnalyze/Numerical/DWT.cpp
Normal file
@ -0,0 +1,205 @@
|
||||
/*
|
||||
* DWT.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Numerical/DWT.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
/******************************************************************************
|
||||
* DWT implementation *
|
||||
******************************************************************************/
|
||||
// constructor /////////////////////////////////////////////////////////////////
|
||||
DWT::DWT(const DWTFilter &filter)
|
||||
: filter_(filter)
|
||||
{}
|
||||
|
||||
// convolution primitive ///////////////////////////////////////////////////////
|
||||
template <typename MatType>
|
||||
void filterConvolution(MatType &out, const MatType &data,
|
||||
const std::vector<double> &filter, const Index offset)
|
||||
{
|
||||
Index n = data.rows(), nf = n*filter.size();
|
||||
|
||||
out.resizeLike(data);
|
||||
out.fill(0.);
|
||||
for (unsigned int i = 0; i < filter.size(); ++i)
|
||||
{
|
||||
FOR_MAT(out, j, k)
|
||||
{
|
||||
out(j, k) += filter[i]*data((j + i + nf - offset) % n, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DWT::filterConvolution(DVec &out, const DVec &data,
|
||||
const std::vector<double> &filter, const Index offset)
|
||||
{
|
||||
::filterConvolution(out, data, filter, offset);
|
||||
}
|
||||
|
||||
void DWT::filterConvolution(DMat &out, const DMat &data,
|
||||
const std::vector<double> &filter, const Index offset)
|
||||
{
|
||||
::filterConvolution(out, data, filter, offset);
|
||||
}
|
||||
|
||||
// downsampling/upsampling primitives //////////////////////////////////////////
|
||||
template <typename MatType>
|
||||
void downsample(MatType &out, const MatType &in)
|
||||
{
|
||||
if (out.rows() < in.rows()/2)
|
||||
{
|
||||
LATAN_ERROR(Size, "output rows smaller than half the input vector rows");
|
||||
}
|
||||
if (out.cols() != in.cols())
|
||||
{
|
||||
LATAN_ERROR(Size, "output and input number of columns mismatch");
|
||||
}
|
||||
for (Index j = 0; j < in.cols(); j++)
|
||||
for (Index i = 0; i < in.rows(); i += 2)
|
||||
{
|
||||
out(i/2, j) = in(i, j);
|
||||
}
|
||||
}
|
||||
|
||||
void DWT::downsample(DVec &out, const DVec &in)
|
||||
{
|
||||
::downsample(out, in);
|
||||
}
|
||||
|
||||
void DWT::downsample(DMat &out, const DMat &in)
|
||||
{
|
||||
::downsample(out, in);
|
||||
}
|
||||
|
||||
template <typename MatType>
|
||||
void upsample(MatType &out, const MatType &in)
|
||||
{
|
||||
if (out.size() < 2*in.size())
|
||||
{
|
||||
LATAN_ERROR(Size, "output rows smaller than twice the input rows");
|
||||
}
|
||||
if (out.cols() != in.cols())
|
||||
{
|
||||
LATAN_ERROR(Size, "output and input number of columns mismatch");
|
||||
}
|
||||
out.block(0, 0, 2*in.size(), out.cols()).fill(0.);
|
||||
for (Index j = 0; j < in.cols(); j++)
|
||||
for (Index i = 0; i < in.size(); i ++)
|
||||
{
|
||||
out(2*i, j) = in(i, j);
|
||||
}
|
||||
}
|
||||
|
||||
void DWT::upsample(DVec &out, const DVec &in)
|
||||
{
|
||||
::upsample(out, in);
|
||||
}
|
||||
|
||||
void DWT::upsample(DMat &out, const DMat &in)
|
||||
{
|
||||
::upsample(out, in);
|
||||
}
|
||||
|
||||
// DWT /////////////////////////////////////////////////////////////////////////
|
||||
std::vector<DWT::DWTLevel>
|
||||
DWT::forward(const DVec &data, const unsigned int level) const
|
||||
{
|
||||
std::vector<DWTLevel> dwt(level);
|
||||
DVec *finePt = const_cast<DVec *>(&data);
|
||||
DVec tmp;
|
||||
Index n = data.size(), o = filter_.fwdL.size()/2, minSize;
|
||||
|
||||
minSize = 1;
|
||||
for (unsigned int l = 0; l < level; ++l) minSize *= 2;
|
||||
if (n < minSize)
|
||||
{
|
||||
LATAN_ERROR(Size, "data vector too small for a " + strFrom(level)
|
||||
+ "-level DWT (data size is " + strFrom(n) + ")");
|
||||
}
|
||||
for (unsigned int l = 0; l < level; ++l)
|
||||
{
|
||||
n /= 2;
|
||||
dwt[l].first.resize(n);
|
||||
dwt[l].second.resize(n);
|
||||
filterConvolution(tmp, *finePt, filter_.fwdL, o);
|
||||
downsample(dwt[l].first, tmp);
|
||||
filterConvolution(tmp, *finePt, filter_.fwdH, o);
|
||||
downsample(dwt[l].second, tmp);
|
||||
finePt = &dwt[l].first;
|
||||
}
|
||||
|
||||
return dwt;
|
||||
}
|
||||
|
||||
DVec DWT::backward(const std::vector<DWTLevel>& dwt) const
|
||||
{
|
||||
unsigned int level = dwt.size();
|
||||
Index n = dwt.back().second.size(), o = filter_.bwdL.size()/2 - 1;
|
||||
DVec res, tmp, conv;
|
||||
|
||||
res = dwt.back().first;
|
||||
for (int l = level - 2; l >= 0; --l)
|
||||
{
|
||||
n *= 2;
|
||||
if (dwt[l].second.size() != n)
|
||||
{
|
||||
LATAN_ERROR(Size, "DWT result size mismatch");
|
||||
}
|
||||
}
|
||||
n = dwt.back().second.size();
|
||||
for (int l = level - 1; l >= 0; --l)
|
||||
{
|
||||
n *= 2;
|
||||
tmp.resize(n);
|
||||
upsample(tmp, res);
|
||||
filterConvolution(conv, tmp, filter_.bwdL, o);
|
||||
res = conv;
|
||||
upsample(tmp, dwt[l].second);
|
||||
filterConvolution(conv, tmp, filter_.bwdH, o);
|
||||
res += conv;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// concatenate levels //////////////////////////////////////////////////////////
|
||||
DVec DWT::concat(const std::vector<DWTLevel> &dwt, const int maxLevel, const bool dropLow)
|
||||
{
|
||||
unsigned int level = ((maxLevel >= 0) ? (maxLevel + 1) : dwt.size());
|
||||
Index nlast = dwt[level - 1].first.size();
|
||||
Index n = 2*dwt.front().first.size() - ((dropLow) ? nlast : 0);
|
||||
Index pt = n, nl;
|
||||
DVec res(n);
|
||||
|
||||
for (unsigned int l = 0; l < level; ++l)
|
||||
{
|
||||
nl = dwt[l].second.size();
|
||||
pt -= nl;
|
||||
res.segment(pt, nl) = dwt[l].second;
|
||||
}
|
||||
if (!dropLow)
|
||||
{
|
||||
res.segment(0, nl) = dwt[level-1].first;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
62
lib/LatAnalyze/Numerical/DWT.hpp
Normal file
62
lib/LatAnalyze/Numerical/DWT.hpp
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* DWT.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef Latan_DWT_hpp_
|
||||
#define Latan_DWT_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Numerical/DWTFilters.hpp>
|
||||
#include <LatAnalyze/Core/Mat.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
/******************************************************************************
|
||||
* Discrete wavelet transform class *
|
||||
******************************************************************************/
|
||||
class DWT
|
||||
{
|
||||
public:
|
||||
typedef std::pair<DVec, DVec> DWTLevel;
|
||||
public:
|
||||
// constructor
|
||||
DWT(const DWTFilter &filter);
|
||||
// destructor
|
||||
virtual ~DWT(void) = default;
|
||||
// convolution primitive
|
||||
static void filterConvolution(DVec &out, const DVec &data,
|
||||
const std::vector<double> &filter, const Index offset);
|
||||
static void filterConvolution(DMat &out, const DMat &data,
|
||||
const std::vector<double> &filter, const Index offset);
|
||||
// downsampling/upsampling primitives
|
||||
static void downsample(DVec &out, const DVec &in);
|
||||
static void downsample(DMat &out, const DMat &in);
|
||||
static void upsample(DVec &out, const DVec &in);
|
||||
static void upsample(DMat &out, const DMat &in);
|
||||
// DWT
|
||||
std::vector<DWTLevel> forward(const DVec &data, const unsigned int level) const;
|
||||
DVec backward(const std::vector<DWTLevel>& dwt) const;
|
||||
// concatenate levels
|
||||
static DVec concat(const std::vector<DWTLevel>& dwt, const int maxLevel = -1, const bool dropLow = false);
|
||||
private:
|
||||
DWTFilter filter_;
|
||||
};
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // Latan_DWT_hpp_
|
528
lib/LatAnalyze/Numerical/DWTFilters.cpp
Normal file
528
lib/LatAnalyze/Numerical/DWTFilters.cpp
Normal file
@ -0,0 +1,528 @@
|
||||
/*
|
||||
* DWTFilters.cpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Numerical/DWTFilters.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
|
||||
// cf. http://wavelets.pybytes.com
|
||||
// *here we implement the reverse filters more convenient for convolutions*
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
||||
|
||||
#define FILTDICT(x) {#x, &DWTFilters::x}
|
||||
|
||||
std::map<std::string, const DWTFilter *> DWTFilters::fromName = {
|
||||
FILTDICT(haar),
|
||||
FILTDICT(db2),
|
||||
FILTDICT(db3),
|
||||
FILTDICT(db4),
|
||||
FILTDICT(db5),
|
||||
FILTDICT(db6),
|
||||
FILTDICT(bior13),
|
||||
FILTDICT(bior15),
|
||||
FILTDICT(bior22),
|
||||
FILTDICT(bior24),
|
||||
FILTDICT(bior31),
|
||||
FILTDICT(bior33),
|
||||
FILTDICT(bior35)
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::haar = {
|
||||
// fwdL
|
||||
{0.7071067811865476,
|
||||
0.7071067811865476},
|
||||
// fwdH
|
||||
{0.7071067811865476,
|
||||
-0.7071067811865476},
|
||||
// bwdL
|
||||
{0.7071067811865476,
|
||||
0.7071067811865476},
|
||||
// bwdH
|
||||
{-0.7071067811865476,
|
||||
0.7071067811865476}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::db2 = {
|
||||
// fwdL
|
||||
{0.48296291314469025,
|
||||
0.836516303737469,
|
||||
0.22414386804185735,
|
||||
-0.12940952255092145},
|
||||
// fwdH
|
||||
{-0.12940952255092145,
|
||||
-0.22414386804185735,
|
||||
0.836516303737469,
|
||||
-0.48296291314469025},
|
||||
// bwdL
|
||||
{-0.12940952255092145,
|
||||
0.22414386804185735,
|
||||
0.836516303737469,
|
||||
0.48296291314469025},
|
||||
// bwdH
|
||||
{-0.48296291314469025,
|
||||
0.836516303737469,
|
||||
-0.22414386804185735,
|
||||
-0.12940952255092145}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::db3 = {
|
||||
// fwdL
|
||||
{0.3326705529509569,
|
||||
0.8068915093133388,
|
||||
0.4598775021193313,
|
||||
-0.13501102001039084,
|
||||
-0.08544127388224149,
|
||||
0.035226291882100656},
|
||||
// fwdH
|
||||
{0.035226291882100656,
|
||||
0.08544127388224149,
|
||||
-0.13501102001039084,
|
||||
-0.4598775021193313,
|
||||
0.8068915093133388,
|
||||
-0.3326705529509569},
|
||||
// bwdL
|
||||
{0.035226291882100656,
|
||||
-0.08544127388224149,
|
||||
-0.13501102001039084,
|
||||
0.4598775021193313,
|
||||
0.8068915093133388,
|
||||
0.3326705529509569},
|
||||
// bwdH
|
||||
{-0.3326705529509569,
|
||||
0.8068915093133388,
|
||||
-0.4598775021193313,
|
||||
-0.13501102001039084,
|
||||
0.08544127388224149,
|
||||
0.035226291882100656}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::db4 = {
|
||||
// fwdL
|
||||
{0.23037781330885523,
|
||||
0.7148465705525415,
|
||||
0.6308807679295904,
|
||||
-0.02798376941698385,
|
||||
-0.18703481171888114,
|
||||
0.030841381835986965,
|
||||
0.032883011666982945,
|
||||
-0.010597401784997278},
|
||||
// fwdH
|
||||
{-0.010597401784997278,
|
||||
-0.032883011666982945,
|
||||
0.030841381835986965,
|
||||
0.18703481171888114,
|
||||
-0.02798376941698385,
|
||||
-0.6308807679295904,
|
||||
0.7148465705525415,
|
||||
-0.23037781330885523},
|
||||
// bwdL
|
||||
{-0.010597401784997278,
|
||||
0.032883011666982945,
|
||||
0.030841381835986965,
|
||||
-0.18703481171888114,
|
||||
-0.02798376941698385,
|
||||
0.6308807679295904,
|
||||
0.7148465705525415,
|
||||
0.23037781330885523},
|
||||
// bwdH
|
||||
{-0.23037781330885523,
|
||||
0.7148465705525415,
|
||||
-0.6308807679295904,
|
||||
-0.02798376941698385,
|
||||
0.18703481171888114,
|
||||
0.030841381835986965,
|
||||
-0.032883011666982945,
|
||||
-0.010597401784997278}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::db5 = {
|
||||
// fwdL
|
||||
{0.160102397974125,
|
||||
0.6038292697974729,
|
||||
0.7243085284385744,
|
||||
0.13842814590110342,
|
||||
-0.24229488706619015,
|
||||
-0.03224486958502952,
|
||||
0.07757149384006515,
|
||||
-0.006241490213011705,
|
||||
-0.012580751999015526,
|
||||
0.003335725285001549},
|
||||
// fwdH
|
||||
{0.003335725285001549,
|
||||
0.012580751999015526,
|
||||
-0.006241490213011705,
|
||||
-0.07757149384006515,
|
||||
-0.03224486958502952,
|
||||
0.24229488706619015,
|
||||
0.13842814590110342,
|
||||
-0.7243085284385744,
|
||||
0.6038292697974729,
|
||||
-0.160102397974125},
|
||||
// bwdL
|
||||
{0.003335725285001549,
|
||||
-0.012580751999015526,
|
||||
-0.006241490213011705,
|
||||
0.07757149384006515,
|
||||
-0.03224486958502952,
|
||||
-0.24229488706619015,
|
||||
0.13842814590110342,
|
||||
0.7243085284385744,
|
||||
0.6038292697974729,
|
||||
0.160102397974125},
|
||||
// bwdH
|
||||
{-0.160102397974125,
|
||||
0.6038292697974729,
|
||||
-0.7243085284385744,
|
||||
0.13842814590110342,
|
||||
0.24229488706619015,
|
||||
-0.03224486958502952,
|
||||
-0.07757149384006515,
|
||||
-0.006241490213011705,
|
||||
0.012580751999015526,
|
||||
0.003335725285001549}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::db6 = {
|
||||
// fwdL
|
||||
{0.11154074335008017,
|
||||
0.4946238903983854,
|
||||
0.7511339080215775,
|
||||
0.3152503517092432,
|
||||
-0.22626469396516913,
|
||||
-0.12976686756709563,
|
||||
0.09750160558707936,
|
||||
0.02752286553001629,
|
||||
-0.031582039318031156,
|
||||
0.0005538422009938016,
|
||||
0.004777257511010651,
|
||||
-0.00107730108499558},
|
||||
// fwdH
|
||||
{-0.00107730108499558,
|
||||
-0.004777257511010651,
|
||||
0.0005538422009938016,
|
||||
0.031582039318031156,
|
||||
0.02752286553001629,
|
||||
-0.09750160558707936,
|
||||
-0.12976686756709563,
|
||||
0.22626469396516913,
|
||||
0.3152503517092432,
|
||||
-0.7511339080215775,
|
||||
0.4946238903983854,
|
||||
-0.11154074335008017},
|
||||
// bwdL
|
||||
{-0.00107730108499558,
|
||||
0.004777257511010651,
|
||||
0.0005538422009938016,
|
||||
-0.031582039318031156,
|
||||
0.02752286553001629,
|
||||
0.09750160558707936,
|
||||
-0.12976686756709563,
|
||||
-0.22626469396516913,
|
||||
0.3152503517092432,
|
||||
0.7511339080215775,
|
||||
0.4946238903983854,
|
||||
0.11154074335008017},
|
||||
// bwdH
|
||||
{-0.11154074335008017,
|
||||
0.4946238903983854,
|
||||
-0.7511339080215775,
|
||||
0.3152503517092432,
|
||||
0.22626469396516913,
|
||||
-0.12976686756709563,
|
||||
-0.09750160558707936,
|
||||
0.02752286553001629,
|
||||
0.031582039318031156,
|
||||
0.0005538422009938016,
|
||||
-0.004777257511010651,
|
||||
-0.00107730108499558}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior13 = {
|
||||
// fwdL
|
||||
{-0.08838834764831845,
|
||||
0.08838834764831845,
|
||||
0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
0.08838834764831845,
|
||||
-0.08838834764831845},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.7071067811865476,
|
||||
-0.7071067811865476,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdH
|
||||
{0.08838834764831845,
|
||||
0.08838834764831845,
|
||||
-0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
-0.08838834764831845,
|
||||
-0.08838834764831845}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior15 = {
|
||||
// fwdL
|
||||
{0.01657281518405971,
|
||||
-0.01657281518405971,
|
||||
-0.12153397801643787,
|
||||
0.12153397801643787,
|
||||
0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
0.12153397801643787,
|
||||
-0.12153397801643787,
|
||||
-0.01657281518405971,
|
||||
0.01657281518405971},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.7071067811865476,
|
||||
-0.7071067811865476,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdH
|
||||
{-0.01657281518405971,
|
||||
-0.01657281518405971,
|
||||
0.12153397801643787,
|
||||
0.12153397801643787,
|
||||
-0.7071067811865476,
|
||||
0.7071067811865476,
|
||||
-0.12153397801643787,
|
||||
-0.12153397801643787,
|
||||
0.01657281518405971,
|
||||
0.01657281518405971}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior22 = {
|
||||
// fwdL
|
||||
{-0.1767766952966369,
|
||||
0.3535533905932738,
|
||||
1.0606601717798214,
|
||||
0.3535533905932738,
|
||||
-0.1767766952966369,
|
||||
0.0},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.3535533905932738,
|
||||
-0.7071067811865476,
|
||||
0.3535533905932738,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.3535533905932738,
|
||||
0.7071067811865476,
|
||||
0.3535533905932738,
|
||||
0.0},
|
||||
// bwdH
|
||||
{0.1767766952966369,
|
||||
0.3535533905932738,
|
||||
-1.0606601717798214,
|
||||
0.3535533905932738,
|
||||
0.1767766952966369,
|
||||
0.0}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior24 = {
|
||||
// fwdL
|
||||
{0.03314563036811942,
|
||||
-0.06629126073623884,
|
||||
-0.1767766952966369,
|
||||
0.4198446513295126,
|
||||
0.9943689110435825,
|
||||
0.4198446513295126,
|
||||
-0.1767766952966369,
|
||||
-0.06629126073623884,
|
||||
0.03314563036811942,
|
||||
0.0},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.3535533905932738,
|
||||
-0.7071067811865476,
|
||||
0.3535533905932738,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.3535533905932738,
|
||||
0.7071067811865476,
|
||||
0.3535533905932738,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdH
|
||||
{-0.03314563036811942,
|
||||
-0.06629126073623884,
|
||||
0.1767766952966369,
|
||||
0.4198446513295126,
|
||||
-0.9943689110435825,
|
||||
0.4198446513295126,
|
||||
0.1767766952966369,
|
||||
-0.06629126073623884,
|
||||
-0.03314563036811942,
|
||||
0.0}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior31 = {
|
||||
// fwdL
|
||||
{-0.3535533905932738,
|
||||
1.0606601717798214,
|
||||
1.0606601717798214,
|
||||
-0.3535533905932738},
|
||||
// fwdH
|
||||
{0.1767766952966369,
|
||||
-0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
-0.1767766952966369},
|
||||
// bwdL
|
||||
{0.1767766952966369,
|
||||
0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
0.1767766952966369},
|
||||
// bwdH
|
||||
{0.3535533905932738,
|
||||
1.0606601717798214,
|
||||
-1.0606601717798214,
|
||||
-0.3535533905932738}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior33 = {
|
||||
// fwdL
|
||||
{0.06629126073623884,
|
||||
-0.19887378220871652,
|
||||
-0.15467960838455727,
|
||||
0.9943689110435825,
|
||||
0.9943689110435825,
|
||||
-0.15467960838455727,
|
||||
-0.19887378220871652,
|
||||
0.06629126073623884},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.1767766952966369,
|
||||
-0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
-0.1767766952966369,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.1767766952966369,
|
||||
0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
0.1767766952966369,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdH
|
||||
{-0.06629126073623884,
|
||||
-0.19887378220871652,
|
||||
0.15467960838455727,
|
||||
0.9943689110435825,
|
||||
-0.9943689110435825,
|
||||
-0.15467960838455727,
|
||||
0.19887378220871652,
|
||||
0.06629126073623884}
|
||||
};
|
||||
|
||||
DWTFilter DWTFilters::bior35 = {
|
||||
// fwdL
|
||||
{-0.013810679320049757,
|
||||
0.04143203796014927,
|
||||
0.052480581416189075,
|
||||
-0.26792717880896527,
|
||||
-0.07181553246425874,
|
||||
0.966747552403483,
|
||||
0.966747552403483,
|
||||
-0.07181553246425874,
|
||||
-0.26792717880896527,
|
||||
0.052480581416189075,
|
||||
0.04143203796014927,
|
||||
-0.013810679320049757},
|
||||
// fwdH
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.1767766952966369,
|
||||
-0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
-0.1767766952966369,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdL
|
||||
{0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.1767766952966369,
|
||||
0.5303300858899107,
|
||||
0.5303300858899107,
|
||||
0.1767766952966369,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0},
|
||||
// bwdH
|
||||
{0.013810679320049757,
|
||||
0.04143203796014927,
|
||||
-0.052480581416189075,
|
||||
-0.26792717880896527,
|
||||
0.07181553246425874,
|
||||
0.966747552403483,
|
||||
-0.966747552403483,
|
||||
-0.07181553246425874,
|
||||
0.26792717880896527,
|
||||
0.052480581416189075,
|
||||
-0.04143203796014927,
|
||||
-0.013810679320049757}
|
||||
};
|
53
lib/LatAnalyze/Numerical/DWTFilters.hpp
Normal file
53
lib/LatAnalyze/Numerical/DWTFilters.hpp
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* DWTFilters.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 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, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* LatAnalyze 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with LatAnalyze. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef Latan_DWTFilters_hpp_
|
||||
#define Latan_DWTFilters_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
||||
struct DWTFilter
|
||||
{
|
||||
const std::vector<double> fwdL, fwdH, bwdL, bwdH;
|
||||
};
|
||||
|
||||
namespace DWTFilters
|
||||
{
|
||||
extern DWTFilter haar;
|
||||
extern DWTFilter db2;
|
||||
extern DWTFilter db3;
|
||||
extern DWTFilter db4;
|
||||
extern DWTFilter db5;
|
||||
extern DWTFilter db6;
|
||||
extern DWTFilter bior13;
|
||||
extern DWTFilter bior15;
|
||||
extern DWTFilter bior22;
|
||||
extern DWTFilter bior24;
|
||||
extern DWTFilter bior31;
|
||||
extern DWTFilter bior33;
|
||||
extern DWTFilter bior35;
|
||||
|
||||
extern std::map<std::string, const DWTFilter *> fromName;
|
||||
}
|
||||
|
||||
END_LATAN_NAMESPACE
|
||||
|
||||
#endif // Latan_DWTFilters_hpp_
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Derivative.cpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -17,9 +17,9 @@
|
||||
* along with LatAnalyze 3. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <LatAnalyze/Derivative.hpp>
|
||||
#include <LatAnalyze/Numerical/Derivative.hpp>
|
||||
#include <LatAnalyze/includes.hpp>
|
||||
#include <LatAnalyze/Math.hpp>
|
||||
#include <LatAnalyze/Core/Math.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace Latan;
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Derivative.hpp, part of LatAnalyze 3
|
||||
*
|
||||
* Copyright (C) 2013 - 2016 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze 3 is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@ -21,7 +21,7 @@
|
||||
#define Latan_Derivative_hpp_
|
||||
|
||||
#include <LatAnalyze/Global.hpp>
|
||||
#include <LatAnalyze/Function.hpp>
|
||||
#include <LatAnalyze/Functional/Function.hpp>
|
||||
|
||||
BEGIN_LATAN_NAMESPACE
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* FFT.hpp, part of LatAnalyze
|
||||
*
|
||||
* Copyright (C) 2013 - 2017 Antonin Portelli
|
||||
* Copyright (C) 2013 - 2020 Antonin Portelli
|
||||
*
|
||||
* LatAnalyze is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user