mirror of
				https://github.com/aportelli/LatAnalyze.git
				synced 2025-11-04 08:04:32 +00:00 
			
		
		
		
	Compare commits
	
		
			255 Commits
		
	
	
		
			3.1.1
			...
			6fbb0f70ef
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 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 | |||
| 8a229ec0b0 | |||
| 0735cd54ce | |||
| d5b743b985 | |||
| e0e4bd327b | |||
| 07bbdca089 | |||
| 28a036ca9c | |||
| 260c70cbeb | |||
| 5e96db7b24 | |||
| 6b624186cd | |||
| 839159831f | |||
| 98cf39efda | |||
| 3d514ef026 | |||
| a498a836ce | |||
| 6906b0c00d | |||
| e43a7c6d0b | |||
| 92822348f6 | |||
| 810c860256 | |||
| 5641f3b481 | |||
| 76dffb7775 | |||
| 769dfd2e05 | |||
| 4576d73379 | |||
| d80b160521 | |||
| c6bc8c9af2 | |||
| 005ffeea5f | |||
| af78c201e6 | |||
| 91cdfa9f8b | |||
| 582528f243 | |||
| ba8056d9b0 | |||
| a89ed85e43 | |||
| 01672cef99 | |||
| 77a585ac4b | |||
| 84993d85b4 | |||
| cbdb2fba6f | |||
| 553181787f | |||
| 761d68bc82 | |||
| 6a37baaf28 | |||
| b6a96619d2 | |||
| 9631a2565f | |||
| 3bff42b554 | |||
| 3603d67d97 | |||
| 16ea3e753a | |||
| 05ac1cc3ad | |||
| 2976f6f347 | |||
| 1bede86547 | |||
| 83afc7901b | |||
| 85d76052ce | |||
| b925a365e2 | |||
| 
						 | 
					82d020c82f | ||
| 
						 | 
					1f3a8c27a1 | ||
| 7e3ab34a31 | |||
| f3959e14cc | |||
| 6616c5a206 | |||
| 558fe80bf9 | |||
| 6f70c44d12 | |||
| fe0f32e42c | |||
| 67c4119859 | |||
| 1a6b877f4e | |||
| e7fd245c10 | |||
| fe73be2725 | |||
| 7c12ea6e64 | |||
| b25cfdc308 | 
							
								
								
									
										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
 | 
				
			||||||
							
								
								
									
										32
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,32 +1,20 @@
 | 
				
			|||||||
# builds
 | 
					# builds
 | 
				
			||||||
build/*
 | 
					build
 | 
				
			||||||
build_debug/*
 | 
					 | 
				
			||||||
sandbox/*
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Apple stuffs
 | 
					# Apple stuff
 | 
				
			||||||
*.xcodeproj
 | 
					*.xcodeproj
 | 
				
			||||||
.DS_Store
 | 
					.DS_Store
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# VIM
 | 
					# VIM
 | 
				
			||||||
*.swp
 | 
					*.swp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# autotools
 | 
					# Eigen headers and archives
 | 
				
			||||||
autom4te.cache/*
 | 
					/lib/LatAnalyze/Eigen
 | 
				
			||||||
*.in
 | 
					eigen-*.tar.bz2
 | 
				
			||||||
*.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
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# CI builds
 | 
					# CI builds
 | 
				
			||||||
ci-scripts/local/*
 | 
					/ci-scripts/local
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# VS Code Studio stuff
 | 
				
			||||||
 | 
					.vscode
 | 
				
			||||||
 | 
					*.code-workspace
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										84
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,84 +0,0 @@
 | 
				
			|||||||
language: cpp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
notifications:
 | 
					 | 
				
			||||||
  email: false
 | 
					 | 
				
			||||||
  slack: ukqcd:mQLXCtz8D2cg89xT8j1a4wku
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
cache:
 | 
					 | 
				
			||||||
  directories:
 | 
					 | 
				
			||||||
    - ci-scripts/local
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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
 | 
					 | 
				
			||||||
            - llvm-toolchain-precise-3.6
 | 
					 | 
				
			||||||
          packages:
 | 
					 | 
				
			||||||
            - clang-3.6
 | 
					 | 
				
			||||||
            - libgsl0-dev
 | 
					 | 
				
			||||||
            - flex
 | 
					 | 
				
			||||||
            - bison
 | 
					 | 
				
			||||||
      env: VERSION=-3.6
 | 
					 | 
				
			||||||
    - compiler: clang
 | 
					 | 
				
			||||||
      addons:
 | 
					 | 
				
			||||||
        apt:
 | 
					 | 
				
			||||||
          sources:
 | 
					 | 
				
			||||||
            - ubuntu-toolchain-r-test
 | 
					 | 
				
			||||||
            - llvm-toolchain-precise-3.7
 | 
					 | 
				
			||||||
          packages:
 | 
					 | 
				
			||||||
            - clang-3.7
 | 
					 | 
				
			||||||
            - libgsl0-dev
 | 
					 | 
				
			||||||
            - flex
 | 
					 | 
				
			||||||
            - bison
 | 
					 | 
				
			||||||
      env: VERSION=-3.7
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
before_install:
 | 
					 | 
				
			||||||
  - 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 LATDIR=`pwd`
 | 
					 | 
				
			||||||
  - export CC=$CC$VERSION
 | 
					 | 
				
			||||||
  - export CXX=$CXX$VERSION
 | 
					 | 
				
			||||||
  - cd ci-scripts
 | 
					 | 
				
			||||||
  - ./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 examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ACLOCAL_AMFLAGS = -I .buildutils/m4
 | 
					 | 
				
			||||||
							
								
								
									
										165
									
								
								Readme.md
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								Readme.md
									
									
									
									
									
								
							@@ -1,37 +1,21 @@
 | 
				
			|||||||
# LatAnalyze 
 | 
					# LatAnalyze 
 | 
				
			||||||
Contributors: Antonin Portelli, Matt Spraggs
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
License: GNU General Public License v3
 | 
					[](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)
 | 
				
			||||||
 | 
					 | 
				
			||||||
<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>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Description
 | 
					## 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
 | 
					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.
 | 
					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:
 | 
					The main features are the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Array and matrix types with fast arithmetic operations based on [Eigen](http://eigen.tuxfamily.org).
 | 
					* 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).
 | 
					* High-level types for bootstrap sample manipulation (including various statistical estimators and histogramming).
 | 
				
			||||||
* Mathematical expression parser for runtime defined functions.
 | 
					* Mathematical expression parser for runtime defined functions.
 | 
				
			||||||
* Data I/O in ASCII and HDF5 (optional).
 | 
					* Data I/O in ASCII, XML, and HDF5.
 | 
				
			||||||
* 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).
 | 
					* 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).
 | 
					* 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 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.
 | 
					* 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,22 +24,145 @@ The main features are the following:
 | 
				
			|||||||
## Installation
 | 
					## Installation
 | 
				
			||||||
The head of the `master` branch always points to the latest stable release. The `develop` branch is the main unstable branch of LatAnalyze.
 | 
					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).
 | 
					LatAnalyze is written in C++14. It has been successfully built on various Unix platform using reasonably recent versions of Clang or GCC.
 | 
				
			||||||
The strict dependencies are the [GSL](http://www.gnu.org/software/gsl/) and [LatCore](https://github.com/aportelli/LatCore).
 | 
					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, 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.
 | 
					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 [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).
 | 
					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: 
 | 
					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
 | 
					## History
 | 
				
			||||||
#### v3.1.1
 | 
					#### 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.
 | 
				
			||||||
 | 
					* Infinity as a math constant.
 | 
				
			||||||
 | 
					* Option to dump bootstrap sequence while resampling.
 | 
				
			||||||
 | 
					* FFT through the GSL.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes:
 | 
				
			||||||
 | 
					* GSL integrator accepts infinite bounds.
 | 
				
			||||||
 | 
					* `latan-sample-combine` accepts mixes of `DSample` and `DMatSample`.
 | 
				
			||||||
 | 
					* More general `latan-sample-element` command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### v3.2.2
 | 
				
			||||||
 | 
					Additions:
 | 
				
			||||||
 | 
					* The math interpreter supports `inf` for infinity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes:
 | 
				
			||||||
 | 
					* Vector version of `setUnidimData`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Fixes:
 | 
				
			||||||
 | 
					* Variance matrix computation fix.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### v3.2.1
 | 
				
			||||||
 | 
					Fixes:
 | 
				
			||||||
 | 
					* Wrong argument number check in `latan-resample`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### v3.2 (needs LatCore 1.1)
 | 
				
			||||||
 | 
					Additions:
 | 
				
			||||||
 | 
					* 2-pt function fitter `latan-2pt-fit`
 | 
				
			||||||
 | 
					* Tool to extract one element of a matrix sample `latan-sample-element`
 | 
				
			||||||
 | 
					* Band plotting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Changes:
 | 
				
			||||||
 | 
					* Sample utilities renamed `latan-sample-*`
 | 
				
			||||||
 | 
					* Resample utility renamed `latan-resample`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### v3.1.2
 | 
				
			||||||
 | 
					Fixes:
 | 
				
			||||||
 | 
					* HDF5 archive URL update in build scripts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### v3.1.1 (needs LatCore 1.0)
 | 
				
			||||||
Fixes:
 | 
					Fixes:
 | 
				
			||||||
* Minuit precision fixed
 | 
					* Minuit precision fixed
 | 
				
			||||||
* Minor fit interface fixes
 | 
					* Minor fit interface fixes
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (( $# != 1 )); then
 | 
					if (($# != 2)); then
 | 
				
			||||||
  echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
 | 
					  echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
PREFIX=$1
 | 
					prefix=$1
 | 
				
			||||||
 | 
					ntasks=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -ex
 | 
					set -ex
 | 
				
			||||||
mkdir -p local/build
 | 
					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
 | 
					  if [ ! -e local/.built.${d} ]; then
 | 
				
			||||||
    ./install-${d}.sh ${PREFIX}
 | 
					    ./install-${d}.sh "${prefix}" "${ntasks}"
 | 
				
			||||||
  fi
 | 
					  fi
 | 
				
			||||||
done
 | 
					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
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NAME='hdf5-1.8.16'
 | 
					name='hdf5-1.14.3'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (( $# != 1 )); then
 | 
					if (($# != 2)); then
 | 
				
			||||||
  echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
 | 
					  echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
PREFIX=$1
 | 
					prefix=$1
 | 
				
			||||||
 | 
					ntasks=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -ex
 | 
					set -ex
 | 
				
			||||||
INITDIR=`pwd`
 | 
					init_dir=$(pwd -P)
 | 
				
			||||||
cd local/build
 | 
					mkdir -p "${prefix}"
 | 
				
			||||||
wget http://www.hdfgroup.org/ftp/HDF5/current/src/${NAME}.tar.gz
 | 
					cd "${prefix}"
 | 
				
			||||||
tar -xzvf ${NAME}.tar.gz
 | 
					prefix=$(pwd -P)
 | 
				
			||||||
mkdir ${NAME}/build
 | 
					cd "${init_dir}/local/build"
 | 
				
			||||||
cd ${NAME}/build
 | 
					wget "https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14/${name}/src/${name}.tar.gz"
 | 
				
			||||||
../configure --prefix=${PREFIX} --enable-cxx
 | 
					tar -xzvf ${name}.tar.gz
 | 
				
			||||||
make -j4 
 | 
					mkdir ${name}/build
 | 
				
			||||||
 | 
					cd ${name}/build
 | 
				
			||||||
 | 
					../configure --prefix="${prefix}" --enable-cxx
 | 
				
			||||||
 | 
					make -j "${ntasks}"
 | 
				
			||||||
make install
 | 
					make install
 | 
				
			||||||
cd ${INITDIR}/local
 | 
					cd "${init_dir}/local"
 | 
				
			||||||
touch .built.hdf5
 | 
					touch .built.hdf5
 | 
				
			||||||
cd ${INITDIR}
 | 
					cd "${init_dir}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,19 +1,22 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (( $# != 2 )); then
 | 
					if (($# != 2)); then
 | 
				
			||||||
  echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
 | 
					  echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
PREFIX=$1
 | 
					prefix=$1
 | 
				
			||||||
OS=$2
 | 
					ntasks=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -ex
 | 
					set -ex
 | 
				
			||||||
./install-deps.sh ${PREFIX}
 | 
					init_dir=$(pwd -P)
 | 
				
			||||||
cd ..
 | 
					mkdir -p "${prefix}"
 | 
				
			||||||
./bootstrap.sh
 | 
					cd "${prefix}"
 | 
				
			||||||
mkdir -p build
 | 
					prefix=$(pwd -P)
 | 
				
			||||||
cd build
 | 
					cd "${init_dir}"
 | 
				
			||||||
if [[ "$OS" == "osx" ]]; then EXTRA_FLAGS='--with-gsl=/usr/local'; fi
 | 
					./install-deps.sh "${prefix}" "${ntasks}"
 | 
				
			||||||
../configure --prefix=$PREFIX --with-minuit=$PREFIX --with-nlopt=$PREFIX --with-latcore=$PREFIX --with-hdf5=$PREFIX $EXTRA_FLAGS CXXFLAGS='-O3 -march=native -mtune=native'
 | 
					mkdir -p "${init_dir}/local/build/latan"
 | 
				
			||||||
make -j4
 | 
					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
 | 
					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
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NAME='Minuit2-5.34.14'
 | 
					if (($# != 2)); then
 | 
				
			||||||
 | 
					  echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
 | 
				
			||||||
if (( $# != 1 )); then
 | 
					 | 
				
			||||||
  echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
 | 
					 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
PREFIX=$1
 | 
					prefix=$1
 | 
				
			||||||
 | 
					ntasks=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -ex
 | 
					set -ex
 | 
				
			||||||
INITDIR=`pwd`
 | 
					init_dir=$(pwd -P)
 | 
				
			||||||
cd local/build
 | 
					mkdir -p "${prefix}"
 | 
				
			||||||
wget http://www.cern.ch/mathlibs/sw/5_34_14/Minuit2/${NAME}.tar.gz
 | 
					cd "${prefix}"
 | 
				
			||||||
tar -xzvf ${NAME}.tar.gz
 | 
					prefix=$(pwd -P)
 | 
				
			||||||
mkdir -p ${NAME}/build
 | 
					cd "${init_dir}/local/build"
 | 
				
			||||||
cd ${NAME}/build
 | 
					rm -rf root
 | 
				
			||||||
../configure --prefix=${PREFIX} --disable-openmp
 | 
					git clone https://github.com/root-project/root.git
 | 
				
			||||||
make -j4 
 | 
					cd root/math/minuit2/
 | 
				
			||||||
 | 
					mkdir build
 | 
				
			||||||
 | 
					cd build
 | 
				
			||||||
 | 
					cmake .. -Dminuit2_standalone=ON -DCMAKE_INSTALL_PREFIX="${prefix}"
 | 
				
			||||||
 | 
					make -j "${ntasks}"
 | 
				
			||||||
make install
 | 
					make install
 | 
				
			||||||
cd ${INITDIR}/local
 | 
					cd "${init_dir}/local"
 | 
				
			||||||
touch .built.minuit
 | 
					touch .built.minuit
 | 
				
			||||||
cd ${INITDIR}
 | 
					cd "${init_dir}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,23 +1,30 @@
 | 
				
			|||||||
#!/usr/bin/env bash
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NAME='nlopt-2.4.2'
 | 
					name='2.6.1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (( $# != 1 )); then
 | 
					if (($# != 2)); then
 | 
				
			||||||
  echo "usage: `basename $0` <prefix> {osx|linux}" 1>&2
 | 
					  echo "usage: $(basename "$0") <prefix> <ntasks>" 1>&2
 | 
				
			||||||
  exit 1
 | 
					  exit 1
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
PREFIX=$1
 | 
					prefix=$1
 | 
				
			||||||
 | 
					ntasks=$2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set -ex
 | 
					set -ex
 | 
				
			||||||
INITDIR=`pwd`
 | 
					init_dir=$(pwd -P)
 | 
				
			||||||
cd local/build
 | 
					mkdir -p "${prefix}"
 | 
				
			||||||
wget http://ab-initio.mit.edu/nlopt/${NAME}.tar.gz
 | 
					cd "${prefix}"
 | 
				
			||||||
tar -xzvf ${NAME}.tar.gz
 | 
					prefix=$(pwd -P)
 | 
				
			||||||
mkdir -p ${NAME}/build
 | 
					cd "${init_dir}/local/build"
 | 
				
			||||||
cd ${NAME}/build
 | 
					wget "https://github.com/stevengj/nlopt/archive/v${name}.tar.gz"
 | 
				
			||||||
../configure --prefix=${PREFIX} --with-cxx --without-guile --without-python --without-octave --without-matlab --with-pic
 | 
					tar -xzvf v${name}.tar.gz
 | 
				
			||||||
make -j4 
 | 
					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
 | 
					make install
 | 
				
			||||||
cd ${INITDIR}/local
 | 
					cd "${init_dir}/local"
 | 
				
			||||||
touch .built.nlopt
 | 
					touch .built.nlopt
 | 
				
			||||||
cd ${INITDIR}
 | 
					cd "${init_dir}"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										150
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										150
									
								
								configure.ac
									
									
									
									
									
								
							@@ -1,150 +0,0 @@
 | 
				
			|||||||
# Process this file with autoconf to produce a configure script.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Initialization
 | 
					 | 
				
			||||||
AC_PREREQ([2.63])
 | 
					 | 
				
			||||||
AC_INIT([LatAnalyze],[3.1.1],[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 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 std;
 | 
				
			||||||
using namespace Latan;
 | 
					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/Numerical/Derivative.hpp>
 | 
				
			||||||
#include <LatAnalyze/CompiledFunction.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <cmath>
 | 
					#include <cmath>
 | 
				
			||||||
#include <LatAnalyze/CompiledModel.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledModel.hpp>
 | 
				
			||||||
#include <LatAnalyze/Io.hpp>
 | 
					#include <LatAnalyze/Io/Io.hpp>
 | 
				
			||||||
#include <LatAnalyze/GslMinimizer.hpp>
 | 
					#include <LatAnalyze/Numerical/GslMinimizer.hpp>
 | 
				
			||||||
#include <LatAnalyze/Plot.hpp>
 | 
					#include <LatAnalyze/Core/Plot.hpp>
 | 
				
			||||||
#include <LatAnalyze/XYStatData.hpp>
 | 
					#include <LatAnalyze/Statistics/XYStatData.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
#include <LatAnalyze/CompiledModel.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledModel.hpp>
 | 
				
			||||||
#include <LatAnalyze/GslMinimizer.hpp>
 | 
					#include <LatAnalyze/Numerical/GslMinimizer.hpp>
 | 
				
			||||||
#include <LatAnalyze/Plot.hpp>
 | 
					#include <LatAnalyze/Core/Plot.hpp>
 | 
				
			||||||
#include <LatAnalyze/XYSampleData.hpp>
 | 
					#include <LatAnalyze/Statistics/XYSampleData.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <LatAnalyze/CompiledFunction.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/GslQagsIntegrator.hpp>
 | 
					#include <LatAnalyze/Numerical/GslQagsIntegrator.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
#include <LatAnalyze/TabFunction.hpp>
 | 
					#include <LatAnalyze/Functional/TabFunction.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void)
 | 
					int main(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
#include <LatAnalyze/Io.hpp>
 | 
					#include <LatAnalyze/Io/Io.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
#include <LatAnalyze/MathInterpreter.hpp>
 | 
					#include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <LatAnalyze/CompiledFunction.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/GslMinimizer.hpp>
 | 
					#include <LatAnalyze/Numerical/GslMinimizer.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					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/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
#include <LatAnalyze/Plot.hpp>
 | 
					#include <LatAnalyze/Core/Plot.hpp>
 | 
				
			||||||
#include <LatAnalyze/TabFunction.hpp>
 | 
					#include <LatAnalyze/Functional/TabFunction.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,15 @@
 | 
				
			|||||||
#include <LatAnalyze/Io.hpp>
 | 
					#include <LatAnalyze/Io/Io.hpp>
 | 
				
			||||||
#include <LatAnalyze/CompiledFunction.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/Plot.hpp>
 | 
					#include <LatAnalyze/Core/Plot.hpp>
 | 
				
			||||||
 | 
					#include <LatAnalyze/Statistics/Random.hpp>
 | 
				
			||||||
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constexpr Index  n             = 8;
 | 
				
			||||||
constexpr Index  nDraw         = 20000;
 | 
					constexpr Index  nDraw         = 20000;
 | 
				
			||||||
 | 
					constexpr Index  nSample       = 2000;
 | 
				
			||||||
const     string stateFileName = "exRand.seed";
 | 
					const     string stateFileName = "exRand.seed";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void)
 | 
					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 << PlotFunction(compile("return exp(-x_0^2/2)/sqrt(2*pi);", 1), -5., 5.);
 | 
				
			||||||
    p.display();
 | 
					    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;
 | 
					    return EXIT_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/GslHybridRootFinder.hpp>
 | 
					#include <LatAnalyze/Numerical/GslHybridRootFinder.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
@@ -7,8 +7,8 @@ using namespace Latan;
 | 
				
			|||||||
int main(void)
 | 
					int main(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    constexpr double a = 1., b = 10.;
 | 
					    constexpr double a = 1., b = 10.;
 | 
				
			||||||
    DoubleFunction f1([a](const double *x){return a*(1.-x[0]);}, 2);
 | 
					    DoubleFunction f1([](const double *x){return a*(1.-x[0]);}, 2);
 | 
				
			||||||
    DoubleFunction f2([b](const double *x){return b*(x[1]-x[0]*x[0]);}, 2);
 | 
					    DoubleFunction f2([](const double *x){return b*(x[1]-x[0]*x[0]);}, 2);
 | 
				
			||||||
    vector<DoubleFunction *> system = {&f1, &f2};
 | 
					    vector<DoubleFunction *> system = {&f1, &f2};
 | 
				
			||||||
    GslHybridRootFinder solve;
 | 
					    GslHybridRootFinder solve;
 | 
				
			||||||
    DVec init(2), x;
 | 
					    DVec init(2), x;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ERR_SUFF
 | 
					#ifndef ERR_SUFF
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Exceptions.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Mat.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Mat.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,11 +21,7 @@
 | 
				
			|||||||
#define Latan_Mat_hpp_
 | 
					#define Latan_Mat_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/IoObject.hpp>
 | 
					#include <LatAnalyze/Io/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)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Math.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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 <LatAnalyze/includes.hpp>
 | 
				
			||||||
#include <gsl/gsl_cdf.h>
 | 
					#include <gsl/gsl_cdf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,7 +30,8 @@ using namespace Latan;
 | 
				
			|||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
DMat MATH_NAMESPACE::varToCorr(const DMat &var)
 | 
					DMat MATH_NAMESPACE::varToCorr(const DMat &var)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DMat res = var, invDiag = res.diagonal();
 | 
					    DMat res = var;
 | 
				
			||||||
 | 
					    DVec invDiag = res.diagonal();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    invDiag = invDiag.cwiseInverse().cwiseSqrt();
 | 
					    invDiag = invDiag.cwiseInverse().cwiseSqrt();
 | 
				
			||||||
    res     = (invDiag*invDiag.transpose()).cwiseProduct(res);
 | 
					    res     = (invDiag*invDiag.transpose()).cwiseProduct(res);
 | 
				
			||||||
@@ -37,6 +39,54 @@ DMat MATH_NAMESPACE::varToCorr(const DMat &var)
 | 
				
			|||||||
    return res;
 | 
					    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                           *
 | 
					 *                             Standard C functions                           *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@@ -107,8 +157,14 @@ DEF_STD_FUNC_1ARG(fabs)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// p-value
 | 
					// p-value
 | 
				
			||||||
auto chi2PValueVecFunc = [](const double arg[2])
 | 
					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]);
 | 
					    return gsl_cdf_chisq_Q(arg[0], arg[1]);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DoubleFunction MATH_NAMESPACE::chi2PValue(chi2PValueVecFunc, 2);
 | 
					DoubleFunction MATH_NAMESPACE::chi2PValue(chi2PValueVecFunc, 2);
 | 
				
			||||||
 | 
					DoubleFunction MATH_NAMESPACE::chi2Ccdf(chi2CcdfVecFunc, 2);
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Math.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,8 +21,8 @@
 | 
				
			|||||||
#define	Latan_Math_hpp_
 | 
					#define	Latan_Math_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/MathInterpreter.hpp>
 | 
					#include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,10 +70,18 @@ namespace MATH_NAMESPACE
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    // convert variance matrix to correlation matrix
 | 
					    // convert variance matrix to correlation matrix
 | 
				
			||||||
    DMat varToCorr(const DMat &var);
 | 
					    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
 | 
					    // Constants
 | 
				
			||||||
    const double pi = 3.1415926535897932384626433832795028841970;
 | 
					    constexpr double pi  = 3.1415926535897932384626433832795028841970;
 | 
				
			||||||
    const double e  = 2.7182818284590452353602874713526624977572;
 | 
					    constexpr double e   = 2.7182818284590452353602874713526624977572;
 | 
				
			||||||
 | 
					    constexpr double inf = std::numeric_limits<double>::infinity();
 | 
				
			||||||
 | 
					    constexpr double nan = std::numeric_limits<double>::quiet_NaN();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -151,6 +159,7 @@ DECL_STD_FUNC(fabs)
 | 
				
			|||||||
namespace MATH_NAMESPACE
 | 
					namespace MATH_NAMESPACE
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    extern DoubleFunction chi2PValue;
 | 
					    extern DoubleFunction chi2PValue;
 | 
				
			||||||
 | 
					    extern DoubleFunction chi2Ccdf;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
END_LATAN_NAMESPACE
 | 
					END_LATAN_NAMESPACE
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * MathInterpreter.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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/includes.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
@@ -36,7 +36,7 @@ unsigned int RunContext::addFunction(const string &name, DoubleFunction *init)
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        return getFunctionAddress(name);
 | 
					        return getFunctionAddress(name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch (Exceptions::Definition)
 | 
					    catch (Exceptions::Definition &)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        unsigned int address = fTable_.size();
 | 
					        unsigned int address = fTable_.size();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -55,7 +55,7 @@ unsigned int RunContext::addVariable(const string &name, double init)
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
        return getVariableAddress(name);
 | 
					        return getVariableAddress(name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch (Exceptions::Definition)
 | 
					    catch (Exceptions::Definition &)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        unsigned int address = vTable_.size();
 | 
					        unsigned int address = vTable_.size();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
@@ -92,7 +92,7 @@ unsigned int RunContext::getFunctionAddress(const string &name) const
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return fTable_.at(name);
 | 
					        return fTable_.at(name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch (out_of_range)
 | 
					    catch (out_of_range &)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        LATAN_ERROR(Definition, "undefined function '" + name + "'");
 | 
					        LATAN_ERROR(Definition, "undefined function '" + name + "'");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -139,7 +139,7 @@ unsigned int RunContext::getVariableAddress(const string &name) const
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return vTable_.at(name);
 | 
					        return vTable_.at(name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch (out_of_range)
 | 
					    catch (out_of_range &)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        LATAN_ERROR(Definition, "undefined variable '" + name + "'");
 | 
					        LATAN_ERROR(Definition, "undefined variable '" + name + "'");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -449,7 +449,7 @@ try\
 | 
				
			|||||||
{\
 | 
					{\
 | 
				
			||||||
    address = (table).at(name);\
 | 
					    address = (table).at(name);\
 | 
				
			||||||
}\
 | 
					}\
 | 
				
			||||||
catch (out_of_range)\
 | 
					catch (out_of_range &)\
 | 
				
			||||||
{\
 | 
					{\
 | 
				
			||||||
    address         = (table).size();\
 | 
					    address         = (table).size();\
 | 
				
			||||||
    (table)[(name)] = address;\
 | 
					    (table)[(name)] = address;\
 | 
				
			||||||
@@ -689,7 +689,8 @@ void MathInterpreter::compile(RunContext &context)
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        if (root_)
 | 
					        if (root_)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            context.addVariable("pi", Math::pi);
 | 
					            context.addVariable("pi",  Math::pi);
 | 
				
			||||||
 | 
					            context.addVariable("inf", Math::inf);
 | 
				
			||||||
            ADD_STDMATH_FUNCS(context);
 | 
					            ADD_STDMATH_FUNCS(context);
 | 
				
			||||||
            root_->compile(program_, context);
 | 
					            root_->compile(program_, context);
 | 
				
			||||||
            for (unsigned int i = 0; i < program_.size(); ++i)
 | 
					            for (unsigned int i = 0; i < program_.size(); ++i)
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * MathInterpreter.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -20,9 +20,9 @@
 | 
				
			|||||||
#ifndef Latan_MathInterpreter_hpp_
 | 
					#ifndef Latan_MathInterpreter_hpp_
 | 
				
			||||||
#define	Latan_MathInterpreter_hpp_
 | 
					#define	Latan_MathInterpreter_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/ParserState.hpp>
 | 
					#include <LatAnalyze/Core/ParserState.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAXIDLENGTH 256
 | 
					#define MAXIDLENGTH 256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * MathLexer.lpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
%option yylineno
 | 
					%option yylineno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%{
 | 
					%{
 | 
				
			||||||
    #include <LatAnalyze/MathInterpreter.hpp>
 | 
					    #include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
    #include "MathParser.hpp"
 | 
					    #include "MathParser.hpp"
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    using namespace std;
 | 
					    using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * MathParser.ypp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -19,7 +19,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
%{
 | 
					%{
 | 
				
			||||||
    #include <LatAnalyze/Global.hpp>
 | 
					    #include <LatAnalyze/Global.hpp>
 | 
				
			||||||
	#include <LatAnalyze/MathInterpreter.hpp>
 | 
						#include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    using namespace std;
 | 
					    using namespace std;
 | 
				
			||||||
    using namespace Latan;
 | 
					    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
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Plot.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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/includes.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
@@ -72,7 +72,7 @@ string PlotObject::dumpToTmpFile(const DMat &m)
 | 
				
			|||||||
    for (Index j = 0; j < m.cols(); ++j)
 | 
					    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);
 | 
					    fd = mkstemps(tmpFileName, 4);
 | 
				
			||||||
    if (fd == -1)
 | 
					    if (fd == -1)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -112,26 +112,33 @@ PlotHeadCommand::PlotHeadCommand(const string &command)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PlotData constructor ////////////////////////////////////////////////////////
 | 
					// PlotData constructor ////////////////////////////////////////////////////////
 | 
				
			||||||
PlotData::PlotData(const DMatSample &x, const DMatSample &y)
 | 
					PlotData::PlotData(const DMatSample &x, const DMatSample &y, const bool abs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (x[central].rows() != y[central].rows())
 | 
					    if (x[central].rows() != y[central].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");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DMat d(x[central].rows(), 4);
 | 
					    DMat d(x[central].rows(), 4);
 | 
				
			||||||
    string usingCmd, tmpFileName;
 | 
					    string usingCmd, tmpFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d.col(0)    = x[central];
 | 
					    d.col(0)    = x[central].col(0);
 | 
				
			||||||
    d.col(2)    = y[central];
 | 
					    d.col(2)    = y[central].col(0);
 | 
				
			||||||
    d.col(1)    = x.variance().cwiseSqrt();
 | 
					    d.col(1)    = x.variance().cwiseSqrt().col(0);
 | 
				
			||||||
    d.col(3)    = y.variance().cwiseSqrt();
 | 
					    d.col(3)    = y.variance().cwiseSqrt().col(0);
 | 
				
			||||||
    tmpFileName = dumpToTmpFile(d);
 | 
					    tmpFileName = dumpToTmpFile(d);
 | 
				
			||||||
    pushTmpFile(tmpFileName);
 | 
					    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 DMatSample &y, const bool abs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (x.rows() != y[central].rows())
 | 
					    if (x.rows() != y[central].rows())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -142,39 +149,187 @@ PlotData::PlotData(const DVec &x, const DMatSample &y)
 | 
				
			|||||||
    string usingCmd, tmpFileName;
 | 
					    string usingCmd, tmpFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d.col(0)    = x;
 | 
					    d.col(0)    = x;
 | 
				
			||||||
    d.col(1)    = y[central];
 | 
					    d.col(1)    = y[central].col(0);
 | 
				
			||||||
    d.col(2)    = y.variance().cwiseSqrt();
 | 
					    d.col(2)    = y.variance().cwiseSqrt().col(0);
 | 
				
			||||||
    tmpFileName = dumpToTmpFile(d);
 | 
					    tmpFileName = dumpToTmpFile(d);
 | 
				
			||||||
    pushTmpFile(tmpFileName);
 | 
					    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 DMatSample &x, const DVec &y, const bool abs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (x[central].rows() != y.rows())
 | 
					    if (x[central].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");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DMat d(x[central].rows(), 3), xerr, yerr;
 | 
					    DMat d(x[central].rows(), 3), xerr, yerr;
 | 
				
			||||||
    string usingCmd, tmpFileName;
 | 
					    string usingCmd, tmpFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d.col(0)    = x[central];
 | 
					    d.col(0)    = x[central].col(0);
 | 
				
			||||||
    d.col(2)    = y;
 | 
					    d.col(2)    = y;
 | 
				
			||||||
    d.col(1)    = x.variance().cwiseSqrt();
 | 
					    d.col(1)    = x.variance().cwiseSqrt().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 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);
 | 
					    tmpFileName = dumpToTmpFile(d);
 | 
				
			||||||
    pushTmpFile(tmpFileName);
 | 
					    pushTmpFile(tmpFileName);
 | 
				
			||||||
    setCommand("'" + tmpFileName + "' u 1:3:2 w xerr");
 | 
					    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;
 | 
					    string usingCmd, tmpFileName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    usingCmd    = (data.isXExact(i)) ? "u 1:3:4 w yerr" : "u 1:3:2:4 w xyerr";
 | 
					    d(0, 0)     = x;
 | 
				
			||||||
    tmpFileName = dumpToTmpFile(data.getTable(i, j));
 | 
					    d(0, 1)     = y[central];
 | 
				
			||||||
 | 
					    d(0, 2)     = sqrt(y.variance());
 | 
				
			||||||
 | 
					    tmpFileName = dumpToTmpFile(d);
 | 
				
			||||||
    pushTmpFile(tmpFileName);
 | 
					    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 ///////////////////////////////////////////////////////
 | 
					// PlotHLine constructor ///////////////////////////////////////////////////////
 | 
				
			||||||
@@ -183,9 +338,24 @@ PlotHLine::PlotHLine(const double y)
 | 
				
			|||||||
    setCommand(strFrom(y));
 | 
					    setCommand(strFrom(y));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PlotHBand constructor ///////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					PlotBand::PlotBand(const double xMin, const double xMax, const double yMin,
 | 
				
			||||||
 | 
					                   const double yMax, const double opacity)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    setCommand("'< printf \"%e %e\\n%e %e\\n%e %e\\n%e %e\\n%e %e\\n\" "
 | 
				
			||||||
 | 
					               + strFrom(xMin) + " " + strFrom(yMin) + " "
 | 
				
			||||||
 | 
					               + strFrom(xMax) + " " + strFrom(yMin) + " "
 | 
				
			||||||
 | 
					               + strFrom(xMax) + " " + strFrom(yMax) + " "
 | 
				
			||||||
 | 
					               + strFrom(xMin) + " " + strFrom(yMax) + " "
 | 
				
			||||||
 | 
					               + strFrom(xMin) + " " + strFrom(yMin)
 | 
				
			||||||
 | 
					               + "' u 1:2 w filledcurves closed fs solid " + strFrom(opacity)
 | 
				
			||||||
 | 
					               + " noborder");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PlotFunction constructor ////////////////////////////////////////////////////
 | 
					// PlotFunction constructor ////////////////////////////////////////////////////
 | 
				
			||||||
PlotFunction::PlotFunction(const DoubleFunction &function, const double xMin,
 | 
					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);
 | 
					    DMat   d(nPoint, 2);
 | 
				
			||||||
    string tmpFileName;
 | 
					    string tmpFileName;
 | 
				
			||||||
@@ -198,10 +368,59 @@ PlotFunction::PlotFunction(const DoubleFunction &function, const double xMin,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    tmpFileName = dumpToTmpFile(d);
 | 
					    tmpFileName = dumpToTmpFile(d);
 | 
				
			||||||
    pushTmpFile(tmpFileName);
 | 
					    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 ////////////////////////////////////////////////////
 | 
					// 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,
 | 
					PlotPredBand::PlotPredBand(const DoubleFunctionSample &function,
 | 
				
			||||||
                           const double xMin, const double xMax,
 | 
					                           const double xMin, const double xMax,
 | 
				
			||||||
                           const unsigned int nPoint, const double opacity)
 | 
					                           const unsigned int nPoint, const double opacity)
 | 
				
			||||||
@@ -222,15 +441,10 @@ PlotPredBand::PlotPredBand(const DoubleFunctionSample &function,
 | 
				
			|||||||
        dHigh(i, 0) = x;
 | 
					        dHigh(i, 0) = x;
 | 
				
			||||||
        dHigh(i, 1) = pred[central] + err;
 | 
					        dHigh(i, 1) = pred[central] + err;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    lowFileName  = dumpToTmpFile(dLow);
 | 
					    makePredBand(dLow, dHigh, opacity);
 | 
				
			||||||
    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");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PlotHistogram constructor ///////////////////////////////////////////////////
 | 
					// PlotHistogram constructor ///////////////////////////////////////////////////
 | 
				
			||||||
PlotHistogram::PlotHistogram(const Histogram &h)
 | 
					PlotHistogram::PlotHistogram(const Histogram &h)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -247,11 +461,33 @@ PlotHistogram::PlotHistogram(const Histogram &h)
 | 
				
			|||||||
    setCommand("'" + tmpFileName + "' u 1:2 w steps");
 | 
					    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 constructor ///////////////////////////////////////////////
 | 
				
			||||||
PlotMatrixNoRange::PlotMatrixNoRange(const DMat &m)
 | 
					PlotMatrixNoRange::PlotMatrixNoRange(const DMat &m)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    string tmpFileName = dumpToTmpFile(m);
 | 
					    string tmpFileName = dumpToTmpFile(m);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    pushTmpFile(tmpFileName);
 | 
				
			||||||
    setCommand("'" + tmpFileName + "' matrix w image");
 | 
					    setCommand("'" + tmpFileName + "' matrix w image");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -292,15 +528,39 @@ void Color::operator()(PlotOptions &option) const
 | 
				
			|||||||
    option.lineColor = color_;
 | 
					    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 constructor ////////////////////////////////////////////////////////
 | 
				
			||||||
LogScale::LogScale(const Axis axis)
 | 
					LogScale::LogScale(const Axis axis, const double basis)
 | 
				
			||||||
: axis_(axis)
 | 
					: axis_(axis)
 | 
				
			||||||
 | 
					, basis_(basis)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Logscale modifier ///////////////////////////////////////////////////////////
 | 
					// Logscale modifier ///////////////////////////////////////////////////////////
 | 
				
			||||||
void LogScale::operator()(PlotOptions &option) const
 | 
					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 //////////////////////////////////////////////////////
 | 
					// PlotRange constructors //////////////////////////////////////////////////////
 | 
				
			||||||
@@ -357,6 +617,31 @@ void Title::operator()(PlotOptions &option) const
 | 
				
			|||||||
    option.title = title_;
 | 
					    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                               *
 | 
					 *                          Plot implementation                               *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@@ -369,7 +654,7 @@ Plot::Plot(void)
 | 
				
			|||||||
// default options /////////////////////////////////////////////////////////////
 | 
					// default options /////////////////////////////////////////////////////////////
 | 
				
			||||||
void Plot::initOptions(void)
 | 
					void Plot::initOptions(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    options_.terminal     = "qt";
 | 
					    options_.terminal     = "qt noenhanced font 'Arial,12'";
 | 
				
			||||||
    options_.output       = "";
 | 
					    options_.output       = "";
 | 
				
			||||||
    options_.caption      = "";
 | 
					    options_.caption      = "";
 | 
				
			||||||
    options_.title        = "";
 | 
					    options_.title        = "";
 | 
				
			||||||
@@ -380,6 +665,9 @@ void Plot::initOptions(void)
 | 
				
			|||||||
    options_.label[0]     = "";
 | 
					    options_.label[0]     = "";
 | 
				
			||||||
    options_.label[1]     = "";
 | 
					    options_.label[1]     = "";
 | 
				
			||||||
    options_.lineColor    = "";
 | 
					    options_.lineColor    = "";
 | 
				
			||||||
 | 
					    options_.lineWidth    = -1;
 | 
				
			||||||
 | 
					    options_.dashType     = "";
 | 
				
			||||||
 | 
					    options_.palette      = Palette::category10;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// plot reset //////////////////////////////////////////////////////////////////
 | 
					// plot reset //////////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -409,6 +697,16 @@ Plot & Plot::operator<<(PlotObject &&command)
 | 
				
			|||||||
            commandStr         += " lc " + options_.lineColor;
 | 
					            commandStr         += " lc " + options_.lineColor;
 | 
				
			||||||
            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())
 | 
					        if (options_.title.empty())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            commandStr += " notitle";
 | 
					            commandStr += " notitle";
 | 
				
			||||||
@@ -436,57 +734,48 @@ Plot & Plot::operator<<(PlotModifier &&modifier)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// find gnuplot ////////////////////////////////////////////////////////////////
 | 
					// 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;
 | 
					    int         i, j, lg;
 | 
				
			||||||
    char        *path;
 | 
					    char        *path;
 | 
				
			||||||
    static char buf[MAX_PATH_LENGTH];
 | 
					    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
 | 
					    // try out in all paths given in the PATH variable
 | 
				
			||||||
    else
 | 
					    buf[0] = 0;
 | 
				
			||||||
 | 
					    path = getenv("PATH") ;
 | 
				
			||||||
 | 
					    if (path)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        buf[0] = 0;
 | 
					        for (i=0;path[i];)
 | 
				
			||||||
        path = getenv("PATH") ;
 | 
					 | 
				
			||||||
        if (path)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            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++);
 | 
					                buf[lg++] = '.';
 | 
				
			||||||
                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++] = '/';
 | 
				
			||||||
 | 
					            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
 | 
					    }
 | 
				
			||||||
        {
 | 
					    // if the buffer is still empty, the command was not found
 | 
				
			||||||
            LATAN_ERROR(System, "PATH variable not set");
 | 
					    if (buf[0] != 0)
 | 
				
			||||||
        }
 | 
					    {
 | 
				
			||||||
        // 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
 | 
					 | 
				
			||||||
        lg = (int)(strlen(buf) - 1);
 | 
					        lg = (int)(strlen(buf) - 1);
 | 
				
			||||||
        while (buf[lg]!='/')
 | 
					        while (buf[lg]!='/')
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -495,7 +784,19 @@ void Plot::getProgramPath(void)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        buf[lg] = 0;
 | 
					        buf[lg] = 0;
 | 
				
			||||||
        gnuplotPath_ = buf;
 | 
					        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 /////////////////////////////////////////////////////
 | 
					// plot parsing and output /////////////////////////////////////////////////////
 | 
				
			||||||
@@ -509,10 +810,6 @@ void Plot::display(void)
 | 
				
			|||||||
        string        command;
 | 
					        string        command;
 | 
				
			||||||
        ostringstream scriptBuf;
 | 
					        ostringstream scriptBuf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!getenv("DISPLAY"))
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            LATAN_ERROR(System, "cannot find DISPLAY variable: is it set ?");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        getProgramPath();
 | 
					        getProgramPath();
 | 
				
			||||||
        command     = gnuplotPath_ + "/" + gnuplotBin_;
 | 
					        command     = gnuplotPath_ + "/" + gnuplotBin_;
 | 
				
			||||||
        gnuplotPipe = popen(command.c_str(), "w");
 | 
					        gnuplotPipe = popen(command.c_str(), "w");
 | 
				
			||||||
@@ -539,7 +836,7 @@ void Plot::display(void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Plot::save(string dirName)
 | 
					void Plot::save(string dirName, bool savePdf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    vector<string> commandBack;
 | 
					    vector<string> commandBack;
 | 
				
			||||||
    string         path, terminalBack, outputBack, gpCommand, scriptName;
 | 
					    string         path, terminalBack, outputBack, gpCommand, scriptName;
 | 
				
			||||||
@@ -548,23 +845,26 @@ void Plot::save(string dirName)
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    mode755 = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
 | 
					    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
 | 
					    // generate directory
 | 
				
			||||||
    if (mkdir(dirName))
 | 
					    if (mkdir(dirName))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        LATAN_ERROR(Io, "impossible to create directory '" + dirName + "'");
 | 
					        LATAN_ERROR(Io, "impossible to create directory '" + dirName + "'");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // backup I/O parameters
 | 
				
			||||||
 | 
					    terminalBack = options_.terminal;
 | 
				
			||||||
 | 
					    outputBack   = options_.output;
 | 
				
			||||||
 | 
					    commandBack  = plotCommand_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // save PDF
 | 
					    // save PDF
 | 
				
			||||||
    options_.terminal = "pdf";
 | 
					    if (savePdf)
 | 
				
			||||||
    options_.output   = dirName + "/plot.pdf";
 | 
					    {
 | 
				
			||||||
    display();
 | 
					        options_.terminal = "pdf";
 | 
				
			||||||
    options_.terminal = terminalBack;
 | 
					        options_.output   = dirName + "/plot.pdf";
 | 
				
			||||||
    options_.output   = outputBack;
 | 
					        display();
 | 
				
			||||||
 | 
					        options_.terminal = terminalBack;
 | 
				
			||||||
 | 
					        options_.output   = outputBack;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // save script and datafiles
 | 
					    // save script and datafiles
 | 
				
			||||||
    for (unsigned int i = 0; i < tmpFileName_.size(); ++i)
 | 
					    for (unsigned int i = 0; i < tmpFileName_.size(); ++i)
 | 
				
			||||||
@@ -632,25 +932,32 @@ ostream & Latan::operator<<(ostream &out, const Plot &plot)
 | 
				
			|||||||
        out << "yMin = " << plot.options_.scale[y].min << endl;
 | 
					        out << "yMin = " << plot.options_.scale[y].min << endl;
 | 
				
			||||||
        out << "yMax = " << plot.options_.scale[y].max << endl;
 | 
					        out << "yMax = " << plot.options_.scale[y].max << endl;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (!plot.options_.title.empty())
 | 
					    out << "unset xrange" << endl;
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        out << "set title '" << plot.options_.title << "'" << endl;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    if (plot.options_.scaleMode[x] & Plot::Scale::manual)
 | 
					    if (plot.options_.scaleMode[x] & Plot::Scale::manual)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        out << "set xrange [xMin:xMax]" << endl;
 | 
					        out << "set xrange [xMin:xMax]" << endl;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        out << "set xrange [:]" << endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    out << "unset yrange" << endl;
 | 
				
			||||||
    if (plot.options_.scaleMode[y] & Plot::Scale::manual)
 | 
					    if (plot.options_.scaleMode[y] & Plot::Scale::manual)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        out << "set yrange [yMin:yMax]" << endl;
 | 
					        out << "set yrange [yMin:yMax]" << endl;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        out << "set yrange [:]" << endl;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    out << "unset log" << endl;
 | 
				
			||||||
    if (plot.options_.scaleMode[x] & Plot::Scale::log)
 | 
					    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)
 | 
					    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())
 | 
					    if (!plot.options_.label[x].empty())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -660,6 +967,11 @@ ostream & Latan::operator<<(ostream &out, const Plot &plot)
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        out << "set ylabel '" << plot.options_.label[y] << "'" << endl;
 | 
					        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)
 | 
					    for (unsigned int i = 0; i < plot.headCommand_.size(); ++i)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        out << plot.headCommand_[i] << endl;
 | 
					        out << plot.headCommand_[i] << endl;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Plot.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,11 +21,11 @@
 | 
				
			|||||||
#define Latan_Plot_hpp_
 | 
					#define Latan_Plot_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/MatSample.hpp>
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
#include <LatAnalyze/Histogram.hpp>
 | 
					#include <LatAnalyze/Statistics/Histogram.hpp>
 | 
				
			||||||
#include <LatAnalyze/XYStatData.hpp>
 | 
					#include <LatAnalyze/Statistics/XYStatData.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// gnuplot default parameters
 | 
					// gnuplot default parameters
 | 
				
			||||||
#ifndef GNUPLOT_BIN
 | 
					#ifndef GNUPLOT_BIN
 | 
				
			||||||
@@ -89,14 +89,31 @@ class PlotData: public PlotObject
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    // constructor
 | 
					    // constructor
 | 
				
			||||||
    PlotData(const DMatSample &x, const DMatSample &y);
 | 
					    PlotData(const DMatSample &x, const DMatSample &y, const bool abs = false);
 | 
				
			||||||
    PlotData(const DVec       &x, const DMatSample &y);
 | 
					    PlotData(const DVec       &x, const DMatSample &y, const bool abs = false);
 | 
				
			||||||
    PlotData(const DMatSample &x, const DVec       &y);
 | 
					    PlotData(const DMatSample &x, const DVec       &y, const bool abs = false);
 | 
				
			||||||
    PlotData(const XYStatData &data, const Index i = 0, const Index j = 0);
 | 
					    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
 | 
					    // destructor
 | 
				
			||||||
    virtual ~PlotData(void) = default;
 | 
					    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
 | 
					class PlotHLine: public PlotObject
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
@@ -106,12 +123,41 @@ public:
 | 
				
			|||||||
    virtual ~PlotHLine(void) = default;
 | 
					    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:
 | 
				
			||||||
 | 
					    // constructor
 | 
				
			||||||
 | 
					    PlotBand(const double xMin, const double xMax, const double yMin,
 | 
				
			||||||
 | 
					             const double yMax, const double opacity = 0.15);
 | 
				
			||||||
 | 
					    // destructor
 | 
				
			||||||
 | 
					    virtual ~PlotBand(void) = default;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PlotFunction: public PlotObject
 | 
					class PlotFunction: public PlotObject
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    // constructor
 | 
					    // constructor
 | 
				
			||||||
    PlotFunction(const DoubleFunction &function, const double xMin,
 | 
					    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
 | 
					    // destructor
 | 
				
			||||||
    virtual ~PlotFunction(void) = default;
 | 
					    virtual ~PlotFunction(void) = default;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -120,11 +166,15 @@ class PlotPredBand: public PlotObject
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    // constructor
 | 
					    // constructor
 | 
				
			||||||
 | 
					    PlotPredBand(const DVec &x, const DVec &y, const DVec &yerr,
 | 
				
			||||||
 | 
					                 const double opacity = 0.15);
 | 
				
			||||||
    PlotPredBand(const DoubleFunctionSample &function, const double xMin,
 | 
					    PlotPredBand(const DoubleFunctionSample &function, const double xMin,
 | 
				
			||||||
                 const double xMax, const unsigned int nPoint = 1000,
 | 
					                 const double xMax, const unsigned int nPoint = 1000,
 | 
				
			||||||
                 const double opacity = 0.15);
 | 
					                 const double opacity = 0.15);
 | 
				
			||||||
    // destructor
 | 
					    // destructor
 | 
				
			||||||
    virtual ~PlotPredBand(void) = default;
 | 
					    virtual ~PlotPredBand(void) = default;
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    void makePredBand(const DMat &low, const DMat &high, const double opacity);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PlotHistogram: public PlotObject
 | 
					class PlotHistogram: public PlotObject
 | 
				
			||||||
@@ -136,6 +186,15 @@ public:
 | 
				
			|||||||
    virtual ~PlotHistogram(void) = default;
 | 
					    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
 | 
					class PlotMatrixNoRange: public PlotObject
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
@@ -150,6 +209,11 @@ PlotRange(Axis::x, -.5, (m).cols() - .5) <<\
 | 
				
			|||||||
PlotRange(Axis::y, (m).rows() - .5, -.5) <<\
 | 
					PlotRange(Axis::y, (m).rows() - .5, -.5) <<\
 | 
				
			||||||
PlotMatrixNoRange(m)
 | 
					PlotMatrixNoRange(m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PlotCorrMatrix(m)\
 | 
				
			||||||
 | 
					PlotHeadCommand("set cbrange [-1:1]") <<\
 | 
				
			||||||
 | 
					PlotHeadCommand("set palette defined (0 'blue', 1 'white', 2 'red')") <<\
 | 
				
			||||||
 | 
					PlotMatrix(m)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/******************************************************************************
 | 
					/******************************************************************************
 | 
				
			||||||
 *                             Plot modifiers                                 *
 | 
					 *                             Plot modifiers                                 *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@@ -162,14 +226,18 @@ struct Range
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct PlotOptions
 | 
					struct PlotOptions
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    std::string  terminal;
 | 
					    std::string              terminal;
 | 
				
			||||||
    std::string  output;
 | 
					    std::string              output;
 | 
				
			||||||
    std::string  caption;
 | 
					    std::string              caption;
 | 
				
			||||||
    std::string  title;
 | 
					    std::string              title;
 | 
				
			||||||
    unsigned int scaleMode[2];
 | 
					    unsigned int             scaleMode[2];
 | 
				
			||||||
    Range        scale[2];
 | 
					    double                   logScaleBasis[2];
 | 
				
			||||||
    std::string  label[2];
 | 
					    Range                    scale[2];
 | 
				
			||||||
    std::string  lineColor;
 | 
					    std::string              label[2];
 | 
				
			||||||
 | 
					    std::string              lineColor;
 | 
				
			||||||
 | 
					    int                      lineWidth;
 | 
				
			||||||
 | 
					    std::string              dashType;
 | 
				
			||||||
 | 
					    std::vector<std::string> palette;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PlotModifier
 | 
					class PlotModifier
 | 
				
			||||||
@@ -221,17 +289,44 @@ private:
 | 
				
			|||||||
    const std::string color_;
 | 
					    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
 | 
					class LogScale: public PlotModifier
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    // constructor
 | 
					    // constructor
 | 
				
			||||||
    explicit LogScale(const Axis axis);
 | 
					    explicit LogScale(const Axis axis, const double basis = 10);
 | 
				
			||||||
    // destructor
 | 
					    // destructor
 | 
				
			||||||
    virtual ~LogScale(void) = default;
 | 
					    virtual ~LogScale(void) = default;
 | 
				
			||||||
    // modifier
 | 
					    // modifier
 | 
				
			||||||
    virtual void operator()(PlotOptions &option) const;
 | 
					    virtual void operator()(PlotOptions &option) const;
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    const Axis axis_;
 | 
					    const Axis axis_;
 | 
				
			||||||
 | 
					    const double basis_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PlotRange: public PlotModifier
 | 
					class PlotRange: public PlotModifier
 | 
				
			||||||
@@ -276,6 +371,21 @@ private:
 | 
				
			|||||||
    const std::string title_;
 | 
					    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                                   *
 | 
					 *                               Plot class                                   *
 | 
				
			||||||
 ******************************************************************************/
 | 
					 ******************************************************************************/
 | 
				
			||||||
@@ -301,13 +411,13 @@ public:
 | 
				
			|||||||
    Plot & operator<<(PlotModifier &&modifier);
 | 
					    Plot & operator<<(PlotModifier &&modifier);
 | 
				
			||||||
    // plot parsing and output
 | 
					    // plot parsing and output
 | 
				
			||||||
    void display(void);
 | 
					    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);
 | 
					    friend std::ostream & operator<<(std::ostream &out, const Plot &plot);
 | 
				
			||||||
    // plot reset
 | 
					    // plot reset
 | 
				
			||||||
    void reset(void);
 | 
					    void reset(void);
 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    // find gnuplot
 | 
					    // find gnuplot
 | 
				
			||||||
    void getProgramPath(void);
 | 
					    std::string getProgramPath(void);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
    // default options
 | 
					    // default options
 | 
				
			||||||
    void initOptions(void);
 | 
					    void initOptions(void);
 | 
				
			||||||
private:
 | 
					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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * along with LatAnalyze 3.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/CompiledFunction.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledFunction.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
#include <LatAnalyze/includes.hpp>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * CompiledFunction.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,8 +21,8 @@
 | 
				
			|||||||
#define	Latan_CompiledFunction_hpp_
 | 
					#define	Latan_CompiledFunction_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/MathInterpreter.hpp>
 | 
					#include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * CompiledModel.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * along with LatAnalyze 3.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/CompiledModel.hpp>
 | 
					#include <LatAnalyze/Functional/CompiledModel.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
#include <LatAnalyze/includes.hpp>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * CompiledModel.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,8 +21,8 @@
 | 
				
			|||||||
#define Latan_CompiledModel_hpp_
 | 
					#define Latan_CompiledModel_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Model.hpp>
 | 
					#include <LatAnalyze/Functional/Model.hpp>
 | 
				
			||||||
#include <LatAnalyze/MathInterpreter.hpp>
 | 
					#include <LatAnalyze/Core/MathInterpreter.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Function.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -111,6 +111,20 @@ double DoubleFunction::operator()(void) const
 | 
				
			|||||||
    return (*this)(nullptr);
 | 
					    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 ////////////////////////////////////////////////////////////////////////
 | 
					// bind ////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
DoubleFunction DoubleFunction::bind(const Index argIndex,
 | 
					DoubleFunction DoubleFunction::bind(const Index argIndex,
 | 
				
			||||||
                                    const double val) const
 | 
					                                    const double val) const
 | 
				
			||||||
@@ -165,6 +179,26 @@ DoubleFunction DoubleFunction::bind(const Index argIndex,
 | 
				
			|||||||
    return bindFunc;
 | 
					    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 ////////////////////////////////////////////////////////
 | 
					// arithmetic operators ////////////////////////////////////////////////////////
 | 
				
			||||||
DoubleFunction DoubleFunction::operator-(void) const
 | 
					DoubleFunction DoubleFunction::operator-(void) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Function.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,8 +21,8 @@
 | 
				
			|||||||
#define	Latan_Function_hpp_
 | 
					#define	Latan_Function_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/MatSample.hpp>
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,9 +52,12 @@ public:
 | 
				
			|||||||
    double operator()(void) const;
 | 
					    double operator()(void) const;
 | 
				
			||||||
    template <typename... Ts>
 | 
					    template <typename... Ts>
 | 
				
			||||||
    double operator()(const double arg0, const Ts... args) const;
 | 
					    double operator()(const double arg0, const Ts... args) const;
 | 
				
			||||||
 | 
					    std::map<double, double> operator()(const std::map<double, double> &m) const;
 | 
				
			||||||
    // bind
 | 
					    // bind
 | 
				
			||||||
    DoubleFunction bind(const Index argIndex, const double val) const;
 | 
					    DoubleFunction bind(const Index argIndex, const double val) const;
 | 
				
			||||||
    DoubleFunction bind(const Index argIndex, const DVec &x) const;
 | 
					    DoubleFunction bind(const Index argIndex, const DVec &x) const;
 | 
				
			||||||
 | 
					    // sample
 | 
				
			||||||
 | 
					    DVec sample(const DMat &x) const;
 | 
				
			||||||
    // arithmetic operators
 | 
					    // arithmetic operators
 | 
				
			||||||
    DoubleFunction   operator-(void) const;
 | 
					    DoubleFunction   operator-(void) const;
 | 
				
			||||||
    DoubleFunction & operator+=(const DoubleFunction &f);
 | 
					    DoubleFunction & operator+=(const DoubleFunction &f);
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Model.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Model.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,8 +21,8 @@
 | 
				
			|||||||
#define Latan_Model_hpp_
 | 
					#define Latan_Model_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * TabFunction.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -29,18 +29,11 @@ using namespace Latan;
 | 
				
			|||||||
// constructors ////////////////////////////////////////////////////////////////
 | 
					// constructors ////////////////////////////////////////////////////////////////
 | 
				
			||||||
TabFunction::TabFunction(const DVec &x, const DVec &y,
 | 
					TabFunction::TabFunction(const DVec &x, const DVec &y,
 | 
				
			||||||
                         const InterpType interpType)
 | 
					                         const InterpType interpType)
 | 
				
			||||||
: interpType_(interpType)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    setData(x, y);
 | 
					    setData(x, y);
 | 
				
			||||||
 | 
					    setInterpolationType(interpType);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//TabFunction::TabFunction(const XYStatData &data, const Index i, const Index j,
 | 
					 | 
				
			||||||
//                         const InterpType interpType)
 | 
					 | 
				
			||||||
//: interpType_(interpType)
 | 
					 | 
				
			||||||
//{
 | 
					 | 
				
			||||||
//    setData(data, i, j);
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// access //////////////////////////////////////////////////////////////////////
 | 
					// access //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
void TabFunction::setData(const DVec &x, const DVec &y)
 | 
					void TabFunction::setData(const DVec &x, const DVec &y)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -54,10 +47,10 @@ void TabFunction::setData(const DVec &x, const DVec &y)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//void TabFunction::setData(const XYStatData &data, const Index i, const Index j)
 | 
					void TabFunction::setInterpolationType(const InterpType interpType)
 | 
				
			||||||
//{
 | 
					{
 | 
				
			||||||
//    setData(data.x(i), data.y(j));
 | 
					    interpType_ = interpType;
 | 
				
			||||||
//}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// function call ///////////////////////////////////////////////////////////////
 | 
					// function call ///////////////////////////////////////////////////////////////
 | 
				
			||||||
double TabFunction::operator()(const double *arg) const
 | 
					double TabFunction::operator()(const double *arg) const
 | 
				
			||||||
@@ -154,12 +147,6 @@ DoubleFunction Latan::interpolate(const DVec &x, const DVec &y,
 | 
				
			|||||||
    return TabFunction(x, y, interpType).makeFunction();
 | 
					    return TabFunction(x, y, interpType).makeFunction();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//DoubleFunction Latan::interpolate(const XYStatData &data, const Index i,
 | 
					 | 
				
			||||||
//                                  const Index j, const InterpType interpType)
 | 
					 | 
				
			||||||
//{
 | 
					 | 
				
			||||||
//    return TabFunction(data, i, j, interpType).makeFunction();
 | 
					 | 
				
			||||||
//}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
map<double, double>::const_iterator TabFunction::nearest(const double x) const
 | 
					map<double, double>::const_iterator TabFunction::nearest(const double x) const
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    map<double, double>::const_iterator ret;
 | 
					    map<double, double>::const_iterator ret;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * TabFunction.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,9 +21,9 @@
 | 
				
			|||||||
#define Latan_TabFunction_hpp_
 | 
					#define Latan_TabFunction_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
#include <LatAnalyze/XYStatData.hpp>
 | 
					#include <LatAnalyze/Statistics/XYStatData.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,13 +45,11 @@ public:
 | 
				
			|||||||
    TabFunction(void) = default;
 | 
					    TabFunction(void) = default;
 | 
				
			||||||
    TabFunction(const DVec &x, const DVec &y,
 | 
					    TabFunction(const DVec &x, const DVec &y,
 | 
				
			||||||
                const InterpType interpType = InterpType::LINEAR);
 | 
					                const InterpType interpType = InterpType::LINEAR);
 | 
				
			||||||
    //TabFunction(const XYStatData &data, const Index i = 0, const Index j = 0,
 | 
					 | 
				
			||||||
    //            const InterpType interpType = InterpType::LINEAR);
 | 
					 | 
				
			||||||
    // destructor
 | 
					    // destructor
 | 
				
			||||||
    virtual ~TabFunction(void) = default;
 | 
					    virtual ~TabFunction(void) = default;
 | 
				
			||||||
    // access
 | 
					    // access
 | 
				
			||||||
    void setData(const DVec &x, const DVec &y);
 | 
					    void setData(const DVec &x, const DVec &y);
 | 
				
			||||||
    // void setData(const XYStatData &data, const Index i = 0, const Index j = 0);
 | 
					    void setInterpolationType(const InterpType interpType);
 | 
				
			||||||
    // function call
 | 
					    // function call
 | 
				
			||||||
    double operator()(const double *arg) const;
 | 
					    double operator()(const double *arg) const;
 | 
				
			||||||
    // factory
 | 
					    // factory
 | 
				
			||||||
@@ -65,9 +63,6 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
DoubleFunction interpolate(const DVec &x, const DVec &y,
 | 
					DoubleFunction interpolate(const DVec &x, const DVec &y,
 | 
				
			||||||
                           const InterpType interpType = InterpType::LINEAR);
 | 
					                           const InterpType interpType = InterpType::LINEAR);
 | 
				
			||||||
//DoubleFunction interpolate(const XYStatData &data, const Index i = 0,
 | 
					 | 
				
			||||||
//                           const Index j = 0,
 | 
					 | 
				
			||||||
//                           const InterpType interpType = InterpType::LINEAR);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
END_LATAN_NAMESPACE
 | 
					END_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Global.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -25,11 +25,13 @@ using namespace Latan;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
PlaceHolder Latan::_;
 | 
					PlaceHolder Latan::_;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const string Env::fullName  = PACKAGE_STRING;
 | 
					const string Env::fullName  = strFrom(PROJECT_NAME) + " " + strFrom(LATAN_SHORT_SHA) + " (v" + strFrom(PROJECT_VERSION) + ")";
 | 
				
			||||||
const string Env::name      = PACKAGE_NAME;
 | 
					const string Env::name      = PROJECT_NAME;
 | 
				
			||||||
const string Env::version   = PACKAGE_VERSION;
 | 
					const string Env::version   = PROJECT_VERSION;
 | 
				
			||||||
const string Env::msgPrefix = "[" + strFrom(PACKAGE_NAME) + " v"
 | 
					const string Env::gitShortSha = LATAN_SHORT_SHA;
 | 
				
			||||||
                              + strFrom(PACKAGE_VERSION) + "] ";
 | 
					const string Env::gitSha = LATAN_SHA;
 | 
				
			||||||
 | 
					const string Env::gitBranch = LATAN_BRANCH;
 | 
				
			||||||
 | 
					const string Env::msgPrefix = "[" + Env::fullName + "] ";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Env::function(void)
 | 
					void Env::function(void)
 | 
				
			||||||
{}
 | 
					{}
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Global.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -20,13 +20,27 @@
 | 
				
			|||||||
#ifndef Latan_Global_hpp_
 | 
					#ifndef Latan_Global_hpp_
 | 
				
			||||||
#define	Latan_Global_hpp_
 | 
					#define	Latan_Global_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatCore/LatCore.hpp>
 | 
					#include <LatAnalyze/Core/stdincludes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BEGIN_LATAN_NAMESPACE \
 | 
					#define BEGIN_LATAN_NAMESPACE \
 | 
				
			||||||
namespace Latan {\
 | 
					namespace Latan {
 | 
				
			||||||
using namespace LatCore;
 | 
					 | 
				
			||||||
#define END_LATAN_NAMESPACE }
 | 
					#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
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Placeholder type ////////////////////////////////////////////////////////////
 | 
					// Placeholder type ////////////////////////////////////////////////////////////
 | 
				
			||||||
@@ -40,6 +54,9 @@ namespace Env
 | 
				
			|||||||
    extern const std::string fullName;
 | 
					    extern const std::string fullName;
 | 
				
			||||||
    extern const std::string name;
 | 
					    extern const std::string name;
 | 
				
			||||||
    extern const std::string version;
 | 
					    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;
 | 
					    extern const std::string msgPrefix;
 | 
				
			||||||
    // empty function for library test
 | 
					    // empty function for library test
 | 
				
			||||||
    void function(void);
 | 
					    void function(void);
 | 
				
			||||||
@@ -47,6 +64,8 @@ namespace Env
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
END_LATAN_NAMESPACE
 | 
					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_
 | 
					#endif // Latan_Global_hpp_
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * AsciiFile.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * AsciiFile.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,10 +21,10 @@
 | 
				
			|||||||
#define Latan_AsciiFile_hpp_
 | 
					#define Latan_AsciiFile_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/File.hpp>
 | 
					#include <LatAnalyze/Io/File.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/MatSample.hpp>
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
#include <LatAnalyze/ParserState.hpp>
 | 
					#include <LatAnalyze/Core/ParserState.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * AsciiLexer.lpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -25,7 +25,7 @@
 | 
				
			|||||||
%option yylineno
 | 
					%option yylineno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%{
 | 
					%{
 | 
				
			||||||
	#include <LatAnalyze/AsciiFile.hpp>
 | 
						#include <LatAnalyze/Io/AsciiFile.hpp>
 | 
				
			||||||
	#include "AsciiParser.hpp"
 | 
						#include "AsciiParser.hpp"
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    using namespace std;
 | 
					    using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * AsciiParser.ypp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -19,9 +19,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
%{
 | 
					%{
 | 
				
			||||||
    #include <LatAnalyze/Global.hpp>
 | 
					    #include <LatAnalyze/Global.hpp>
 | 
				
			||||||
	#include <LatAnalyze/AsciiFile.hpp>
 | 
						#include <LatAnalyze/Io/AsciiFile.hpp>
 | 
				
			||||||
    #include <LatAnalyze/Mat.hpp>
 | 
					    #include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
    #include <LatAnalyze/MatSample.hpp>
 | 
					    #include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    using namespace std;
 | 
					    using namespace std;
 | 
				
			||||||
    using namespace Latan;
 | 
					    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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * File.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,9 +21,9 @@
 | 
				
			|||||||
#define	Latan_File_hpp_
 | 
					#define	Latan_File_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/IoObject.hpp>
 | 
					#include <LatAnalyze/Io/IoObject.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/MatSample.hpp>
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,12 +105,12 @@ const IoT& File::getData(const std::string &name) const
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return dynamic_cast<const IoT &>(*(data_.at(name)));
 | 
					        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 "
 | 
					        LATAN_ERROR(Definition, "no data with name '" + name + "' in file "
 | 
				
			||||||
                    + name_);
 | 
					                    + name_);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    catch(std::bad_cast)
 | 
					    catch (std::bad_cast &)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        LATAN_ERROR(Definition, "data with name '" + name + "' in file "
 | 
					        LATAN_ERROR(Definition, "data with name '" + name + "' in file "
 | 
				
			||||||
                    + name_ + " does not have type '" + typeid(IoT).name()
 | 
					                    + name_ + " does not have type '" + typeid(IoT).name()
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Hdf5File.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * along with LatAnalyze 3.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Hdf5File.hpp>
 | 
					#include <LatAnalyze/Io/Hdf5File.hpp>
 | 
				
			||||||
#include <LatAnalyze/IoObject.hpp>
 | 
					#include <LatAnalyze/Io/IoObject.hpp>
 | 
				
			||||||
#include <LatAnalyze/includes.hpp>
 | 
					#include <LatAnalyze/includes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Hdf5File.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,9 +21,9 @@
 | 
				
			|||||||
#define Latan_Hdf5File_hpp_
 | 
					#define Latan_Hdf5File_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/File.hpp>
 | 
					#include <LatAnalyze/Io/File.hpp>
 | 
				
			||||||
#include <LatAnalyze/Mat.hpp>
 | 
					#include <LatAnalyze/Core/Mat.hpp>
 | 
				
			||||||
#include <LatAnalyze/MatSample.hpp>
 | 
					#include <LatAnalyze/Statistics/MatSample.hpp>
 | 
				
			||||||
#include <H5Cpp.h>
 | 
					#include <H5Cpp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Io.cpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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/includes.hpp>
 | 
				
			||||||
#include <LatAnalyze/AsciiFile.hpp>
 | 
					#include <LatAnalyze/Io/AsciiFile.hpp>
 | 
				
			||||||
#ifdef HAVE_HDF5
 | 
					#include <LatAnalyze/Io/Hdf5File.hpp>
 | 
				
			||||||
#include <LatAnalyze/Hdf5File.hpp>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					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));
 | 
					        return unique_ptr<File>(new AsciiFile(fileName, mode));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#ifdef HAVE_HDF5
 | 
					 | 
				
			||||||
    else if (ext == "h5")
 | 
					    else if (ext == "h5")
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return unique_ptr<File>(new Hdf5File(fileName, mode));
 | 
					        return unique_ptr<File>(new Hdf5File(fileName, mode));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        LATAN_ERROR(Io, "unknown file extension '" + ext + "'");
 | 
					        LATAN_ERROR(Io, "unknown file extension '" + ext + "'");
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Io.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
#define Latan_Io_hpp_
 | 
					#define Latan_Io_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/File.hpp>
 | 
					#include <LatAnalyze/Io/File.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * IoObject.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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
 | 
					 * 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/>.
 | 
					 * 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/includes.hpp>
 | 
				
			||||||
#include <LatAnalyze/Math.hpp>
 | 
					#include <LatAnalyze/Core/Math.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace Latan;
 | 
					using namespace Latan;
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Derivative.hpp, part of LatAnalyze 3
 | 
					 * 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
 | 
					 * 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
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
@@ -21,7 +21,7 @@
 | 
				
			|||||||
#define Latan_Derivative_hpp_
 | 
					#define Latan_Derivative_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <LatAnalyze/Global.hpp>
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
#include <LatAnalyze/Function.hpp>
 | 
					#include <LatAnalyze/Functional/Function.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BEGIN_LATAN_NAMESPACE
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										53
									
								
								lib/LatAnalyze/Numerical/FFT.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								lib/LatAnalyze/Numerical/FFT.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * FFT.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_FFT_hpp_
 | 
				
			||||||
 | 
					#define Latan_FFT_hpp_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <LatAnalyze/Global.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BEGIN_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/******************************************************************************
 | 
				
			||||||
 | 
					 *                             FFT abstract class                             *
 | 
				
			||||||
 | 
					 ******************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FFT
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    enum
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      Forward  = 0,
 | 
				
			||||||
 | 
					      Backward = 1
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  // constructor
 | 
				
			||||||
 | 
					  FFT(void) = default;
 | 
				
			||||||
 | 
					  FFT(const Index size);
 | 
				
			||||||
 | 
					  // destructor
 | 
				
			||||||
 | 
					  virtual ~FFT(void) = default;
 | 
				
			||||||
 | 
					  // size
 | 
				
			||||||
 | 
					  virtual void resize(const Index size) = 0;
 | 
				
			||||||
 | 
					  // FFT
 | 
				
			||||||
 | 
					  virtual void operator()(CMat &x, const unsigned int dir = FFT::Forward) = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					END_LATAN_NAMESPACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // Latan_FFT_hpp_
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user