From 746b37416fb9dd94654ad093622edd71cf0e83aa Mon Sep 17 00:00:00 2001 From: FrancoisCarouge Date: Sun, 8 Oct 2023 21:13:32 -0700 Subject: [PATCH] [filter] support move construction --- include/fcarouge/kalman.hpp | 9 +-- test/CMakeLists.txt | 2 + test/kalman_assign_move_5x4x3.cpp | 89 ++++++++++++++++++++++++++ test/kalman_constructor_move_5x4x3.cpp | 85 ++++++++++++++++++++++++ 4 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 test/kalman_assign_move_5x4x3.cpp create mode 100644 test/kalman_constructor_move_5x4x3.cpp diff --git a/include/fcarouge/kalman.hpp b/include/fcarouge/kalman.hpp index 63a1e5e26..03b28905f 100644 --- a/include/fcarouge/kalman.hpp +++ b/include/fcarouge/kalman.hpp @@ -266,9 +266,7 @@ class kalman final { //! elements of the filter with. //! //! @complexity Constant. - //! - //! @todo Implement and test. - inline constexpr kalman(kalman &&other) noexcept = delete; + inline constexpr kalman(kalman &&other) noexcept = default; //! @brief Copy assignment operator. //! @@ -300,9 +298,8 @@ class kalman final { //! i.e. `*this`. //! //! @complexity Constant. - //! - //! @todo Implement and test. - inline constexpr auto operator=(kalman &&other) noexcept -> kalman & = delete; + inline constexpr auto operator=(kalman &&other) noexcept + -> kalman & = default; //! @brief Destructs the Kalman filter. //! diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 496b9bd92..ea8d901aa 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -103,6 +103,7 @@ endforeach() foreach(BACKEND IN ITEMS "eigen") foreach( TEST + "kalman_assign_move_5x4x3.cpp" "kalman_constructor_default_1x1x3.cpp" "kalman_constructor_default_1x4x1.cpp" "kalman_constructor_default_1x4x3.cpp" @@ -111,6 +112,7 @@ foreach(BACKEND IN ITEMS "eigen") "kalman_constructor_default_5x4x0.cpp" "kalman_constructor_default_5x4x1.cpp" "kalman_constructor_default_5x4x3.cpp" + "kalman_constructor_move_5x4x3.cpp" "kalman_f_5x4x3.cpp" "kalman_h_5x4x3.cpp") get_filename_component(NAME ${TEST} NAME_WE) diff --git a/test/kalman_assign_move_5x4x3.cpp b/test/kalman_assign_move_5x4x3.cpp new file mode 100644 index 000000000..c099e52c8 --- /dev/null +++ b/test/kalman_assign_move_5x4x3.cpp @@ -0,0 +1,89 @@ +/* __ _ __ __ _ _ +| |/ / /\ | | | \/ | /\ | \ | | +| ' / / \ | | | \ / | / \ | \| | +| < / /\ \ | | | |\/| | / /\ \ | . ` | +| . \ / ____ \| |____| | | |/ ____ \| |\ | +|_|\_\/_/ \_\______|_| |_/_/ \_\_| \_| + +Kalman Filter +Version 0.3.0 +https://github.com/FrancoisCarouge/Kalman + +SPDX-License-Identifier: Unlicense + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to */ + +#include "fcarouge/kalman.hpp" +#include "fcarouge/linalg.hpp" + +#include +#include + +namespace fcarouge::test { +namespace { +template using vector = column_vector; +template using matrix = matrix; + +//! @test Verifies the multi-dimension filter is move-assignable. +[[maybe_unused]] auto test{[] { + using kalman = kalman, vector<4>, vector<3>>; + const auto z3x1{zero_v>}; + const auto i4x4{identity_v>}; + const auto i4x5{identity_v>}; + const auto i5x3{identity_v>}; + const auto i5x4{identity_v>}; + const auto i5x5{identity_v>}; + const auto z4x1{zero_v>}; + const auto z4x4{zero_v>}; + const auto z5x1{zero_v>}; + const auto z5x5{zero_v>}; + kalman filter; + + { + kalman filter_0; + + filter_0.f(z5x5); + + filter = std::move(filter_0); + } + + assert(filter.f() == z5x5); + assert(filter.g() == i5x3); + assert(filter.h() == i4x5); + assert(filter.k() == i5x4); + assert(filter.p() == i5x5); + assert(filter.q() == z5x5 && "No process noise by default."); + assert(filter.r() == z4x4 && "No observation noise by default."); + assert(filter.s() == i4x4); + assert(filter.u() == z3x1 && "No initial control."); + assert(filter.x() == z5x1 && "Origin state."); + assert(filter.y() == z4x1); + assert(filter.z() == z4x1); + + return 0; +}()}; +} // namespace +} // namespace fcarouge::test diff --git a/test/kalman_constructor_move_5x4x3.cpp b/test/kalman_constructor_move_5x4x3.cpp new file mode 100644 index 000000000..048fe8523 --- /dev/null +++ b/test/kalman_constructor_move_5x4x3.cpp @@ -0,0 +1,85 @@ +/* __ _ __ __ _ _ +| |/ / /\ | | | \/ | /\ | \ | | +| ' / / \ | | | \ / | / \ | \| | +| < / /\ \ | | | |\/| | / /\ \ | . ` | +| . \ / ____ \| |____| | | |/ ____ \| |\ | +|_|\_\/_/ \_\______|_| |_/_/ \_\_| \_| + +Kalman Filter +Version 0.3.0 +https://github.com/FrancoisCarouge/Kalman + +SPDX-License-Identifier: Unlicense + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to */ + +#include "fcarouge/kalman.hpp" +#include "fcarouge/linalg.hpp" + +#include +#include + +namespace fcarouge::test { +namespace { +template using vector = column_vector; +template using matrix = matrix; + +//! @test Verifies the multi-dimension filter is move-constructible. +[[maybe_unused]] auto test{[] { + using kalman = kalman, vector<4>, vector<3>>; + const auto z3x1{zero_v>}; + const auto i4x4{identity_v>}; + const auto i4x5{identity_v>}; + const auto i5x3{identity_v>}; + const auto i5x4{identity_v>}; + const auto i5x5{identity_v>}; + const auto z4x1{zero_v>}; + const auto z4x4{zero_v>}; + const auto z5x1{zero_v>}; + const auto z5x5{zero_v>}; + kalman filter_0; + + filter_0.f(z5x5); + + kalman filter{std::move(filter_0)}; + + assert(filter.f() == z5x5); + assert(filter.g() == i5x3); + assert(filter.h() == i4x5); + assert(filter.k() == i5x4); + assert(filter.p() == i5x5); + assert(filter.q() == z5x5 && "No process noise by default."); + assert(filter.r() == z4x4 && "No observation noise by default."); + assert(filter.s() == i4x4); + assert(filter.u() == z3x1 && "No initial control."); + assert(filter.x() == z5x1 && "Origin state."); + assert(filter.y() == z4x1); + assert(filter.z() == z4x1); + + return 0; +}()}; +} // namespace +} // namespace fcarouge::test