Skip to content

Commit

Permalink
Add eups build support
Browse files Browse the repository at this point in the history
  • Loading branch information
taranu committed Oct 20, 2023
1 parent 365b826 commit 931ecdd
Show file tree
Hide file tree
Showing 22 changed files with 171 additions and 41 deletions.
1 change: 1 addition & 0 deletions build-cc-debug.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# Compile and test C++ debug library
meson compile -C build-debug && meson test -C build-debug

1 change: 1 addition & 0 deletions build-cc-release.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# Compile, test and install C++ library
meson compile -C build-release && meson test -C build-release && meson install -C build-release

1 change: 1 addition & 0 deletions build-debug.sh
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
# Compile and tell debug libraries
./build-cc-debug.sh && ./build-py-debug.sh
3 changes: 2 additions & 1 deletion build-py-debug.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
meson compile -C python/build-debug && meson test -C python/build-debug
# Compile python debug libraries
meson compile -C python/build-debug

3 changes: 3 additions & 0 deletions build-py-release.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# Compile, test and install python release libraries
# Unfortunately, the library must be installed before any python tests are run
# (otherwise the import will fail)
meson compile -C python/build-release && meson install -C python/build-release && meson test -C python/build-release

1 change: 1 addition & 0 deletions clean-build-cc-debug.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
meson compile -C build-debug --clean
2 changes: 2 additions & 0 deletions clean-build-cc.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Call meson to clean installed C++ library files
meson compile -C build-release --clean
2 changes: 2 additions & 0 deletions clean-build-py.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Call meson to clean installed Python library files
meson compile -C python/build-release --clean
2 changes: 2 additions & 0 deletions clean-cc.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Delete the C++ build directory
rm -rf build-release
2 changes: 2 additions & 0 deletions clean-py.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Delete the Python library build directories
rm -rf python/build-release
2 changes: 0 additions & 2 deletions clean.bash

This file was deleted.

2 changes: 2 additions & 0 deletions clean.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Delete all build directories
./clean-cc.sh && ./clean-py.sh
7 changes: 6 additions & 1 deletion include/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,12 @@ class Model : public ParametricModel {
for (size_t idx = 0; idx < _size; ++idx) {
result[idx] = this->_evaluate_observation(idx, print, is_loglike_grad);
}
result[_size] = this->_evaluate_priors(print, normalize_loglike);
if(
(this->_mode == EvaluatorMode::loglike) || is_loglike_grad
|| (this->_mode == EvaluatorMode::loglike_image) || (this->_mode == EvaluatorMode::jacobian)
) {
result[_size] = this->_evaluate_priors(print, normalize_loglike);
}

return result;
}
Expand Down
39 changes: 29 additions & 10 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,45 @@ project(
default_options : ['cpp_std=c++17',],
)

gauss2d_dep = dependency('gauss2d')
has_eups = run_command('eups', 'list', 'gauss2dfit', check: false).returncode() == 0

gsl_dep = dependency('GSL')
parameters_dep = dependency('parameters')

if has_eups
gauss2d_eupsdir = run_command('eups', 'list', '-d', 'gauss2d', check: true).stdout().strip()
cpp = meson.get_compiler('cpp')
gauss2d_dep = declare_dependency(
dependencies: [cpp.find_library('gauss2d', dirs: [gauss2d_eupsdir + '/build-release/lib64']),],
include_directories: gauss2d_eupsdir + '/build-release/include',
)

parameters_eupsdir = run_command('eups', 'list', '-d', 'parameters', check: true).stdout().strip()
parameters_dep = declare_dependency(
include_directories: parameters_eupsdir + '/build-release/include',
)
else
gauss2d_dep = dependency('gauss2d')
parameters_dep = dependency('parameters')
endif

inc = include_directories('include')

depends = declare_dependency(
include_directories: inc,
dependencies: [gauss2d_dep, gsl_dep, parameters_dep],
include_directories: inc,
dependencies: [gauss2d_dep, gsl_dep, parameters_dep],
)

subdir('include')
subdir('src')
subdir('tests')

pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : gauss2dfitlib,
version : '0.1',
name : 'libgauss2dfit',
filebase : 'gauss2dfit',
description : 'Create, manipulate and evaluate 2D Gaussian mixtures and images thereof.')
if not has_eups
pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : gauss2dfitlib,
version : '0.1',
name : 'libgauss2dfit',
filebase : 'gauss2dfit',
description : 'Create, manipulate and evaluate 2D Gaussian mixtures and images thereof.')
endif

subdir('doc')
28 changes: 21 additions & 7 deletions python/gauss2d/fit/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ sources = [
'pybind11.cc',
]

kwargs = {}
use_eups = run_command('eups', 'list', '-d', 'gauss2dfit', check: false).returncode() == 0
if use_eups
# meson.current_build_dir() would be ideal but it seems to delete the file?
kwargs = {'install_dir': meson.build_root() + '/lib/gauss2d/fit'}
else
# Folder relative to site-packages to install to
kwargs = {'subdir': 'gauss2d/fit'}
endif

module = python.extension_module(
'_gauss2d_fit', # Name of the module
sources, # List of sources
Expand All @@ -43,7 +53,7 @@ module = python.extension_module(
gauss2dfit_dep,
pybind11_dep,
],
subdir: 'gauss2d/fit', # Folder relative to site-packages to install to
kwargs: kwargs
)

# Pure Python sources
Expand All @@ -52,9 +62,13 @@ python_sources = [
'utils.py',
]

# Install pure Python
python.install_sources(
python_sources,
pure: false, # Will be installed next to binaries
subdir: 'gauss2d/fit' # Folder relative to site-packages to install to
)
if use_eups
install_data(python_sources, kwargs: kwargs)
else
# Install pure Python
python.install_sources(
python_sources,
pure: false, # Will be installed next to binaries
subdir: 'gauss2d/fit' # Folder relative to site-packages to install to
)
endif
36 changes: 32 additions & 4 deletions python/meson.build
Original file line number Diff line number Diff line change
@@ -1,12 +1,40 @@
project(
'gauss2d',
'gauss2dfit',
'cpp',
default_options : ['cpp_std=c++17',],
version : '0.1.0',
)
gauss2d_dep = dependency('gauss2d')
gauss2d_python_dep = dependency('gauss2d_python')
gauss2dfit_dep = dependency('gauss2dfit')

gauss2dfit_eups = run_command('eups', 'list', '-d', 'gauss2dfit', check: false)

has_eups = gauss2dfit_eups.returncode() == 0

if has_eups
gauss2d_eupsdir = run_command('eups', 'list', '-d', 'gauss2d', check: true).stdout().strip()
cpp = meson.get_compiler('cpp')
gauss2d_dep = declare_dependency(
dependencies: [cpp.find_library('gauss2d', dirs: [gauss2d_eupsdir + '/build-release/lib64']),],
include_directories: gauss2d_eupsdir + '/build-release/include',
)
gauss2d_python_dep = declare_dependency(
include_directories: gauss2d_eupsdir + '/python/lib/build-release/include',
)
gauss2dfit_eupsdir = gauss2dfit_eups.stdout().strip()
parameters_eupsdir = run_command('eups', 'list', '-d', 'parameters', check: true).stdout().strip()
# TODO: Can this dependency be extracted from '../meson.build' somehow
gauss2dfit_dep = declare_dependency(
dependencies: [cpp.find_library('gauss2dfit', dirs: [gauss2dfit_eupsdir + '/build-release/lib64']),],
include_directories: [
gauss2dfit_eupsdir + '/build-release/include',
parameters_eupsdir + '/build-release/include',
]
)
else
gauss2d_dep = dependency('gauss2d')
gauss2d_python_dep = dependency('gauss2d_python')
gauss2dfit_dep = dependency('gauss2dfit')
endif

pybind11_dep = dependency('pybind11')
pymod = import('python')
python = pymod.find_installation(
Expand Down
9 changes: 2 additions & 7 deletions setup-conda-release.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
# Configure package to install to a local conda folder
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$CONDA_PREFIX/.local/lib64/pkgconfig
prefix="--prefix=$CONDA_PREFIX/.local"
meson setup $prefix --buildtype release build-release
./build-cc-release.sh
cd python
meson setup $prefix --buildtype release build-release
cd ..
./build-py-release.sh
./setup-release.sh "--prefix=$CONDA_PREFIX/.local"

6 changes: 3 additions & 3 deletions setup-debug.sh
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$CONDA_PREFIX/.local/lib64/pkgconfig
meson setup --prefix=$PWD/debug --buildtype debug build-debug
# Configure package and build debug libraries
meson --prefix=$PWD/debug --buildtype debug build-debug
./build-cc-debug.sh
cd python
meson setup --prefix=$PWD/debug --buildtype debug build-debug
meson --prefix=$PWD/debug --buildtype debug build-debug
cd ..
./build-py-debug.sh

7 changes: 7 additions & 0 deletions setup-release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Configure package and build release libraries
meson setup "$@" --buildtype release build-release
./build-cc-release.sh
cd python
meson setup "$@" --buildtype release build-release
cd ..
./build-py-release.sh
18 changes: 12 additions & 6 deletions tests/test_model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,22 @@ void verify_model(Model& model, const std::vector<std::shared_ptr<const g2f::Cha
params_free = g2f::nonconsecutive_unique(params_free);
CHECK(grads.size() == params_free.size());

model.setup_evaluators(Model::EvaluatorMode::image);
auto loglike_img = model.evaluate();
size_t n_loglike = loglike_img.size();
for (size_t idx_like = 0; idx_like < n_loglike; ++idx_like) {
CHECK(loglike_img[idx_like] == 0);
}

model.setup_evaluators(Model::EvaluatorMode::loglike);
auto loglike = model.evaluate();
size_t n_loglike = loglike.size();

for (size_t i = 0; i < 2; ++i) {
for (unsigned short do_jacobian = false; do_jacobian <= true; do_jacobian++) {
model.setup_evaluators(do_jacobian ? Model::EvaluatorMode::jacobian : Model::EvaluatorMode::image,
{}, {}, {}, {}, print);
model.setup_evaluators(
do_jacobian ? Model::EvaluatorMode::jacobian : Model::EvaluatorMode::loglike_image,
{}, {}, {}, {}, print
);

auto result = model.evaluate();
for (size_t idx_like; idx_like < n_loglike; ++idx_like) {
Expand All @@ -118,10 +126,8 @@ void verify_model(Model& model, const std::vector<std::shared_ptr<const g2f::Cha
CHECK(errormsg == "");
} else {
CHECK(outputs.size() == n_channels);
CHECK(result[0] == 0);
for (size_t idx_channel = 1; idx_channel < n_channels; ++idx_channel) {
CHECK(result[idx_channel] == 0);
bool values_equal = outputs[0]->get_value(0, 0) == outputs[1]->get_value(0, 0);
bool values_equal = outputs[0]->get_value(0, 0) == outputs[idx_channel]->get_value(0, 0);
CHECK(values_equal != check_outputs_differ);
}
}
Expand Down
33 changes: 33 additions & 0 deletions ups/eupspkg.cfg.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# EupsPkg config file. Sourced by 'eupspkg'

build_cc()
{
./build-cc-release.sh
}

build_py()
{
./build-py-release.sh
}

build()
{
(build_cc && build_py)
}

config_cc()
{
([ -d "$GAUSS2DFIT_DIR" ] && ./clean-cc.sh && meson setup --prefix="$GAUSS2DFIT_DIR/build-release" \
--buildtype release build-release)
}

config_py()
{
([ -d "$GAUSS2DFIT_DIR" ] && ./clean-py.sh && build_cc \
&& cd python && meson setup --prefix="$GAUSS2DFIT_DIR/python/build-release" --buildtype release build-release)
}

config()
{
config_cc && build_cc && config_py
}
7 changes: 7 additions & 0 deletions ups/gauss2dfit.table
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
setupRequired(gauss2d)
setupRequired(parameters)

envPrepend(LD_LIBRARY_PATH, ${PRODUCT_DIR}/build-release/lib64)
envPrepend(DYLD_LIBRARY_PATH, ${PRODUCT_DIR}/build-release/lib64)

envPrepend(PYTHONPATH, ${PRODUCT_DIR}/python/build-release/lib)

0 comments on commit 931ecdd

Please sign in to comment.