AnalysisSystemForRadionucli.../include/armadillo_bits/fn_solve.hpp
2024-06-04 15:25:02 +08:00

265 lines
6.9 KiB
C++

// Copyright (C) 2009-2015 National ICT Australia (NICTA)
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// -------------------------------------------------------------------
//
// Written by Conrad Sanderson - http://conradsanderson.id.au
//! \addtogroup fn_solve
//! @{
//
// solve_gen
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_gen> >::result
solve
(
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const solve_opts::opts& opts = solve_opts::none
)
{
arma_extra_debug_sigprint();
return Glue<T1, T2, glue_solve_gen>(A.get_ref(), B.get_ref(), opts.flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_gen> >::result
solve
(
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const bool // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
return Glue<T1, T2, glue_solve_gen>(A.get_ref(), B.get_ref(), solve_opts::flag_none);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_gen> >::result
solve
(
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const char* // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
return Glue<T1, T2, glue_solve_gen>(A.get_ref(), B.get_ref(), solve_opts::flag_none);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const solve_opts::opts& opts = solve_opts::none
)
{
arma_extra_debug_sigprint();
return glue_solve_gen::apply(out, A.get_ref(), B.get_ref(), opts.flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const bool // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
return glue_solve_gen::apply(out, A.get_ref(), B.get_ref(), solve_opts::flag_none);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Base<typename T1::elem_type,T1>& A,
const Base<typename T1::elem_type,T2>& B,
const char* // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
return glue_solve_gen::apply(out, A.get_ref(), B.get_ref(), solve_opts::flag_none);
}
//
// solve_tri
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_tri> >::result
solve
(
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const solve_opts::opts& opts = solve_opts::none
)
{
arma_extra_debug_sigprint();
uword flags = opts.flags;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return Glue<T1, T2, glue_solve_tri>(A.m, B.get_ref(), flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_tri> >::result
solve
(
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const bool // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
uword flags = solve_opts::flag_none;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return Glue<T1, T2, glue_solve_tri>(A.m, B.get_ref(), flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_tri> >::result
solve
(
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const char* // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
uword flags = solve_opts::flag_none;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return Glue<T1, T2, glue_solve_tri>(A.m, B.get_ref(), flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const solve_opts::opts& opts = solve_opts::none
)
{
arma_extra_debug_sigprint();
uword flags = opts.flags;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return glue_solve_tri::apply(out, A.m, B.get_ref(), flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const bool // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
uword flags = solve_opts::flag_none;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return glue_solve_tri::apply(out, A.m, B.get_ref(), flags);
}
template<typename T1, typename T2>
inline
typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, bool >::result
solve
(
Mat<typename T1::elem_type>& out,
const Op<T1, op_trimat>& A,
const Base<typename T1::elem_type,T2>& B,
const char* // argument kept only for compatibility with old user code
)
{
arma_extra_debug_sigprint();
uword flags = solve_opts::flag_none;
if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; }
if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; }
return glue_solve_tri::apply(out, A.m, B.get_ref(), flags);
}
//! @}