Skip to content

Commit

Permalink
Merge branch 'GUDHI:master' into simplex_tree_filtration_value_genera…
Browse files Browse the repository at this point in the history
…lization
  • Loading branch information
hschreiber authored Aug 27, 2024
2 parents ddb7d20 + 9aa70a7 commit 35778b2
Show file tree
Hide file tree
Showing 2 changed files with 172 additions and 137 deletions.
135 changes: 73 additions & 62 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
@@ -1,85 +1,96 @@
jobs:

- job: 'OSx'
- job: "OSx"
displayName: "Build and test OSx"
timeoutInMinutes: 0
cancelTimeoutInMinutes: 60
pool:
vmImage: macOS-latest
variables:
pythonVersion: '3.9'
pythonVersion: "3.9"
cmakeBuildType: Release

steps:
# Use a specific Python version
- task: UsePythonVersion@0
displayName: Use Python $(pythonVersion)
inputs:
versionSpec: $(pythonVersion)
addToPath: true
architecture: 'x64'
# Use a specific Python version
- task: UsePythonVersion@0
displayName: Use Python $(pythonVersion)
inputs:
versionSpec: $(pythonVersion)
addToPath: true
architecture: "x64"

- bash: |
git submodule update --init
python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt
python -m pip uninstall -y pykeops
brew update || true
brew install ninja graphviz doxygen boost eigen gmp mpfr tbb cgal || true
displayName: 'Install build dependencies'
- bash: |
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE:STRING=$(cmakeBuildType) -GNinja -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON ..
ninja
ninja doxygen
ctest --output-on-failure
displayName: 'Build, test and documentation generation'
- bash: |
git submodule update --init
python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt
python -m pip uninstall -y pykeops
brew update || true
brew install ninja graphviz doxygen boost eigen gmp mpfr tbb cgal || true
displayName: "Install build dependencies"
- bash: |
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE:STRING=$(cmakeBuildType) -GNinja -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON ..
ninja
ninja doxygen
ctest --output-on-failure
displayName: "Build, test and documentation generation"
- job: 'Windows'
- job: "Windows"
displayName: "Build and test Windows"
timeoutInMinutes: 0
cancelTimeoutInMinutes: 60
pool:
vmImage: windows-latest
variables:
pythonVersion: '3.9'
pythonVersion: "3.9"
cmakeVcpkgFlags: -DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_TOOLCHAIN_FILE=c:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmakeFlags: -DWITH_GUDHI_EXAMPLE=ON -DWITH_GUDHI_TEST=ON -DWITH_GUDHI_UTILITIES=ON -DWITH_GUDHI_PYTHON=OFF

steps:
# Use a specific Python version
- task: UsePythonVersion@0
displayName: Use Python $(pythonVersion)
inputs:
versionSpec: $(pythonVersion)
addToPath: true
architecture: 'x64'
# Use a specific Python version
- task: UsePythonVersion@0
displayName: Use Python $(pythonVersion)
inputs:
versionSpec: $(pythonVersion)
addToPath: true
architecture: "x64"

- script: |
git submodule update --init
python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt
# Only vcpkg release libs for CI
echo.set(VCPKG_BUILD_TYPE release)>> C:\vcpkg\triplets\x64-windows.cmake
vcpkg install boost-filesystem:x64-windows boost-test:x64-windows boost-program-options:x64-windows tbb:x64-windows eigen3:x64-windows cgal:x64-windows
choco install -y ninja --force --force-dependencies
displayName: 'Install build dependencies'
- script: |
$ErrorActionPreference = 'Stop'
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON $(cmakeVcpkgFlags) $(cmakeFlags) ..
ninja
ctest --output-on-failure -C Release -E diff_files
cmake -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON .
cd src\python
copy "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\"
copy "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\"
copy "C:\vcpkg\installed\x64-windows\bin\tbb*.dll" ".\gudhi\"
python setup.py build_ext --inplace
SET PYTHONPATH=%CD%;%PYTHONPATH%
echo %PYTHONPATH%
ctest --output-on-failure -C Release
displayName: 'Build and test'
- script: |
git submodule update --init
python -m pip install --user -r ext/gudhi-deploy/build-requirements.txt
IF %ERRORLEVEL% NEQ 0 EXIT 1
python -m pip install --user -r ext/gudhi-deploy/test-requirements.txt
IF %ERRORLEVEL% NEQ 0 EXIT 1
# Only vcpkg release libs for CI
echo.set(VCPKG_BUILD_TYPE release)>> C:\vcpkg\triplets\x64-windows.cmake
vcpkg install boost-filesystem:x64-windows boost-test:x64-windows boost-program-options:x64-windows tbb:x64-windows eigen3:x64-windows cgal:x64-windows
IF %ERRORLEVEL% NEQ 0 EXIT 1
choco install -y ninja --force --force-dependencies
IF %ERRORLEVEL% NEQ 0 EXIT 1
displayName: "Install build dependencies"
- script: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -G "Ninja" -DFORCE_EIGEN_DEFAULT_DENSE_INDEX_TYPE_TO_INT=ON $(cmakeVcpkgFlags) $(cmakeFlags) ..
IF %ERRORLEVEL% NEQ 0 EXIT 1
ninja
IF %ERRORLEVEL% NEQ 0 EXIT 1
ctest --output-on-failure -C Release -E diff_files
IF %ERRORLEVEL% NEQ 0 EXIT 1
cmake -DWITH_GUDHI_PYTHON=ON -DWITH_GUDHI_REMOTE_TEST=ON .
IF %ERRORLEVEL% NEQ 0 EXIT 1
cd src\python
copy "C:\vcpkg\installed\x64-windows\bin\mpfr*.dll" ".\gudhi\"
IF %ERRORLEVEL% NEQ 0 EXIT 1
copy "C:\vcpkg\installed\x64-windows\bin\gmp*.dll" ".\gudhi\"
IF %ERRORLEVEL% NEQ 0 EXIT 1
copy "C:\vcpkg\installed\x64-windows\bin\tbb*.dll" ".\gudhi\"
IF %ERRORLEVEL% NEQ 0 EXIT 1
python setup.py build_ext --inplace
IF %ERRORLEVEL% NEQ 0 EXIT 1
SET PYTHONPATH=%CD%;%PYTHONPATH%
echo %PYTHONPATH%
ctest --output-on-failure -C Release
IF %ERRORLEVEL% NEQ 0 EXIT 1
displayName: "Build and test"
174 changes: 99 additions & 75 deletions src/Persistence_matrix/include/gudhi/persistence_interval.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,140 +88,164 @@ struct Persistence_interval {
}
return stream;
}

/**
* @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I>
constexpr auto& get() & noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return birth;
if constexpr (I == 1) return death;
if constexpr (I == 2) return dim;
}

/**
* @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I>
constexpr const auto& get() const& noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return birth;
if constexpr (I == 1) return death;
if constexpr (I == 2) return dim;
}

/**
* @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I>
constexpr auto&& get() && noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return std::move(birth);
if constexpr (I == 1) return std::move(death);
if constexpr (I == 2) return std::move(dim);
}

/**
* @brief Specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I>
constexpr const auto&& get() const&& noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return std::move(birth);
if constexpr (I == 1) return std::move(death);
if constexpr (I == 2) return std::move(dim);
}
};

} // namespace persistence_matrix
} // namespace Gudhi

namespace std {

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
* @brief Partial specialization of `std::tuple_size` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I, typename Dimension, typename Event_value>
constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return i.birth;
if constexpr (I == 1) return i.death;
if constexpr (I == 2) return i.dim;
}
template <typename Dimension, typename Event_value>
struct tuple_size<Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value> >
: integral_constant<size_t, 3> {};

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
* @brief Partial specialization of `std::tuple_element` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam I Index of the type to store: 0 for the birth value type, 1 for the death value type and 2 for the
* dimension value type.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I, typename Dimension, typename Event_value>
constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
template <size_t I, typename Dimension, typename Event_value>
struct tuple_element<I, Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value> > {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return i.birth;
if constexpr (I == 1) return i.death;
if constexpr (I == 2) return i.dim;
}
using type = typename conditional <I < 2, Event_value, Dimension>::type;
};

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I, typename Dimension, typename Event_value>
constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>&& i) noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return std::move(i.birth);
if constexpr (I == 1) return std::move(i.death);
if constexpr (I == 2) return std::move(i.dim);
template <size_t I, typename Dimension, typename Event_value>
constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
return i.template get<I>();
}

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <std::size_t I, typename Dimension, typename Event_value>
constexpr const auto&& get(const Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>&& i) noexcept {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

if constexpr (I == 0) return std::move(i.birth);
if constexpr (I == 1) return std::move(i.death);
if constexpr (I == 2) return std::move(i.dim);
template <size_t I, typename Dimension, typename Event_value>
constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
return i.template get<I>();
}

} // namespace persistence_matrix
} // namespace Gudhi

namespace std {

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `std::tuple_size` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <typename Dimension, typename Event_value>
struct tuple_size<Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value> >
: integral_constant<size_t, 3> {};
template <size_t I, typename Dimension, typename Event_value>
constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>&& i) noexcept {
return std::move(i).template get<I>();
}

/**
* @ingroup persistence_matrix
*
* @brief Partial specialization of `std::tuple_element` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the type to store: 0 for the birth value type, 1 for the death value type and 2 for the
* dimension value type.
* @brief Partial specialization of `get` for @ref Gudhi::persistence_matrix::Persistence_interval.
*
* @tparam I Index of the value to return: 0 for the birth value, 1 for the death value and 2 for the dimension.
* @tparam Dimension First template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @tparam Event_value Second template parameter of @ref Gudhi::persistence_matrix::Persistence_interval.
* @param i Interval from which the value should be returned.
* @return Either the birth value if @p I == 0, the death value if @p I == 1 or the dimension if @p I == 2.
*/
template <size_t I, typename Dimension, typename Event_value>
struct tuple_element<I, Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value> > {
static_assert(I < 3, "Value mismatch at argument 1 in template parameter list. Maximal possible value is 2.");

using type = typename conditional <I < 2, Event_value, Dimension>::type;
};

template <size_t I, typename Dimension, typename Event_value>
constexpr auto& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
return Gudhi::persistence_matrix::get<I>(i);
}

template <size_t I, typename Dimension, typename Event_value>
constexpr const auto& get(const Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>& i) noexcept {
return Gudhi::persistence_matrix::get<I>(i);
}

template <size_t I, typename Dimension, typename Event_value>
constexpr auto&& get(Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>&& i) noexcept {
return Gudhi::persistence_matrix::get<I>(move(i));
}

template <size_t I, typename Dimension, typename Event_value>
constexpr const auto&& get(const Gudhi::persistence_matrix::Persistence_interval<Dimension, Event_value>&& i) noexcept {
return Gudhi::persistence_matrix::get<I>(move(i));
return std::move(i).template get<I>();
}

} // namespace std
Expand Down

0 comments on commit 35778b2

Please sign in to comment.