From eda5bc26f44ee9a6f83dcf8c91f17296d7fc509d Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 12 Feb 2024 14:52:43 +0100 Subject: Move into version control --- src/armadillo/include/armadillo_bits/fn_find.hpp | 469 +++++++++++++++++++++++ 1 file changed, 469 insertions(+) create mode 100644 src/armadillo/include/armadillo_bits/fn_find.hpp (limited to 'src/armadillo/include/armadillo_bits/fn_find.hpp') diff --git a/src/armadillo/include/armadillo_bits/fn_find.hpp b/src/armadillo/include/armadillo_bits/fn_find.hpp new file mode 100644 index 0000000..5efb254 --- /dev/null +++ b/src/armadillo/include/armadillo_bits/fn_find.hpp @@ -0,0 +1,469 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup fn_find +//! @{ + + + +template +arma_warn_unused +inline +typename +enable_if2 + < + is_arma_type::value, + const mtOp + >::result +find(const T1& X) + { + arma_extra_debug_sigprint(); + + return mtOp(X); + } + + + +template +arma_warn_unused +inline +const mtOp +find(const Base& X, const uword k, const char* direction = "first") + { + arma_extra_debug_sigprint(); + + const char sig = (direction != nullptr) ? direction[0] : char(0); + + arma_debug_check + ( + ( (sig != 'f') && (sig != 'F') && (sig != 'l') && (sig != 'L') ), + "find(): direction must be \"first\" or \"last\"" + ); + + const uword type = ( (sig == 'f') || (sig == 'F') ) ? 0 : 1; + + return mtOp(X.get_ref(), k, type); + } + + + +// + + + +template +arma_warn_unused +inline +uvec +find(const BaseCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find(R); + } + + + +template +arma_warn_unused +inline +uvec +find(const BaseCube& X, const uword k, const char* direction = "first") + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find(R, k, direction); + } + + + +template +arma_warn_unused +inline +uvec +find(const mtOpCube& X, const uword k = 0, const char* direction = "first") + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.m); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find( mtOp, op_rel_type>(R, X.aux), k, direction ); + } + + + +template +arma_warn_unused +inline +uvec +find(const mtGlueCube& X, const uword k = 0, const char* direction = "first") + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT1; + typedef typename T2::elem_type eT2; + + const unwrap_cube tmp1(X.A); + const unwrap_cube tmp2(X.B); + + arma_debug_assert_same_size( tmp1.M, tmp2.M, "relational operator" ); + + const Mat R1( const_cast< eT1* >(tmp1.M.memptr()), tmp1.M.n_elem, 1, false ); + const Mat R2( const_cast< eT2* >(tmp2.M.memptr()), tmp2.M.n_elem, 1, false ); + + return find( mtGlue, Mat, glue_rel_type>(R1, R2), k, direction ); + } + + + +// + + + +template +arma_warn_unused +inline +Col +find(const SpBase& X, const uword k = 0) + { + arma_extra_debug_sigprint(); + + const SpProxy P(X.get_ref()); + + const uword n_rows = P.get_n_rows(); + const uword n_nz = P.get_n_nonzero(); + + Mat tmp(n_nz, 1, arma_nozeros_indicator()); + + uword* tmp_mem = tmp.memptr(); + + typename SpProxy::const_iterator_type it = P.begin(); + + for(uword i=0; i out; + + const uword count = (k == 0) ? uword(n_nz) : uword( (std::min)(n_nz, k) ); + + out.steal_mem_col(tmp, count); + + return out; + } + + + +template +arma_warn_unused +inline +Col +find(const SpBase& X, const uword k, const char* direction) + { + arma_extra_debug_sigprint(); + + arma_ignore(X); + arma_ignore(k); + arma_ignore(direction); + + arma_check(true, "find(SpBase,k,direction): not implemented yet"); // TODO + + Col out; + + return out; + } + + + +// + + + +template +arma_warn_unused +inline +typename +enable_if2 + < + is_arma_type::value, + const mtOp + >::result +find_finite(const T1& X) + { + arma_extra_debug_sigprint(); + + return mtOp(X); + } + + + +template +arma_warn_unused +inline +typename +enable_if2 + < + is_arma_type::value, + const mtOp + >::result +find_nonfinite(const T1& X) + { + arma_extra_debug_sigprint(); + + return mtOp(X); + } + + + +template +arma_warn_unused +inline +typename +enable_if2 + < + is_arma_type::value, + const mtOp + >::result +find_nan(const T1& X) + { + arma_extra_debug_sigprint(); + + return mtOp(X); + } + + + +// + + + +template +arma_warn_unused +inline +uvec +find_finite(const BaseCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find_finite(R); + } + + + +template +arma_warn_unused +inline +uvec +find_nonfinite(const BaseCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find_nonfinite(R); + } + + + +template +arma_warn_unused +inline +uvec +find_nan(const BaseCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find_nan(R); + } + + + +// + + + +template +arma_warn_unused +inline +Col +find_finite(const SpBase& X) + { + arma_extra_debug_sigprint(); + + const SpProxy P(X.get_ref()); + + const uword n_rows = P.get_n_rows(); + const uword n_nz = P.get_n_nonzero(); + + Mat tmp(n_nz, 1, arma_nozeros_indicator()); + + uword* tmp_mem = tmp.memptr(); + + typename SpProxy::const_iterator_type it = P.begin(); + + uword count = 0; + + for(uword i=0; i out; + + if(count > 0) { out.steal_mem_col(tmp, count); } + + return out; + } + + + +template +arma_warn_unused +inline +Col +find_nonfinite(const SpBase& X) + { + arma_extra_debug_sigprint(); + + const SpProxy P(X.get_ref()); + + const uword n_rows = P.get_n_rows(); + const uword n_nz = P.get_n_nonzero(); + + Mat tmp(n_nz, 1, arma_nozeros_indicator()); + + uword* tmp_mem = tmp.memptr(); + + typename SpProxy::const_iterator_type it = P.begin(); + + uword count = 0; + + for(uword i=0; i out; + + if(count > 0) { out.steal_mem_col(tmp, count); } + + return out; + } + + + +template +arma_warn_unused +inline +Col +find_nan(const SpBase& X) + { + arma_extra_debug_sigprint(); + + const SpProxy P(X.get_ref()); + + const uword n_rows = P.get_n_rows(); + const uword n_nz = P.get_n_nonzero(); + + Mat tmp(n_nz, 1, arma_nozeros_indicator()); + + uword* tmp_mem = tmp.memptr(); + + typename SpProxy::const_iterator_type it = P.begin(); + + uword count = 0; + + for(uword i=0; i out; + + if(count > 0) { out.steal_mem_col(tmp, count); } + + return out; + } + + + +//! @} -- cgit v1.2.1