1 // SPDX-License-Identifier: Apache-2.0
2 //
3 // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
4 // Copyright 2008-2016 National ICT Australia (NICTA)
5 //
6 // Licensed under the Apache License, Version 2.0 (the "License");
7 // you may not use this file except in compliance with the License.
8 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 // ------------------------------------------------------------------------
17 
18 
19 //! \addtogroup fn_solve
20 //! @{
21 
22 
23 
24 //
25 // solve_gen
26 
27 
28 template<typename T1, typename T2>
29 arma_warn_unused
30 inline
31 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)32 solve
33   (
34   const Base<typename T1::elem_type,T1>& A,
35   const Base<typename T1::elem_type,T2>& B,
36   const solve_opts::opts&                opts = solve_opts::none
37   )
38   {
39   arma_extra_debug_sigprint();
40 
41   return Glue<T1, T2, glue_solve_gen>(A.get_ref(), B.get_ref(), opts.flags);
42   }
43 
44 
45 
46 template<typename T1, typename T2>
47 inline
48 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)49 solve
50   (
51          Mat<typename T1::elem_type>&    out,
52   const Base<typename T1::elem_type,T1>& A,
53   const Base<typename T1::elem_type,T2>& B,
54   const solve_opts::opts&                opts = solve_opts::none
55   )
56   {
57   arma_extra_debug_sigprint();
58 
59   const bool status = glue_solve_gen::apply(out, A.get_ref(), B.get_ref(), opts.flags);
60 
61   if(status == false)
62     {
63     out.soft_reset();
64     arma_debug_warn_level(3, "solve(): solution not found");
65     }
66 
67   return status;
68   }
69 
70 
71 
72 //
73 // solve_tri
74 
75 
76 template<typename T1, typename T2>
77 arma_warn_unused
78 inline
79 typename enable_if2< is_supported_blas_type<typename T1::elem_type>::value, const Glue<T1, T2, glue_solve_tri_default> >::result
solve(const Op<T1,op_trimat> & A,const Base<typename T1::elem_type,T2> & B)80 solve
81   (
82   const Op<T1, op_trimat>&               A,
83   const Base<typename T1::elem_type,T2>& B
84   )
85   {
86   arma_extra_debug_sigprint();
87 
88   uword flags = uword(0);
89 
90   if(A.aux_uword_a == 0)  { flags |= solve_opts::flag_triu; }
91   if(A.aux_uword_a == 1)  { flags |= solve_opts::flag_tril; }
92 
93   return Glue<T1, T2, glue_solve_tri_default>(A.m, B.get_ref(), flags);
94   }
95 
96 
97 
98 template<typename T1, typename T2>
99 arma_warn_unused
100 inline
101 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)102 solve
103   (
104   const Op<T1, op_trimat>&               A,
105   const Base<typename T1::elem_type,T2>& B,
106   const solve_opts::opts&                opts
107   )
108   {
109   arma_extra_debug_sigprint();
110 
111   uword flags = opts.flags;
112 
113   if(A.aux_uword_a == 0)  { flags |= solve_opts::flag_triu; }
114   if(A.aux_uword_a == 1)  { flags |= solve_opts::flag_tril; }
115 
116   return Glue<T1, T2, glue_solve_tri>(A.m, B.get_ref(), flags);
117   }
118 
119 
120 
121 template<typename T1, typename T2>
122 inline
123 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)124 solve
125   (
126          Mat<typename T1::elem_type>&    out,
127   const   Op<T1, op_trimat>&             A,
128   const Base<typename T1::elem_type,T2>& B
129   )
130   {
131   arma_extra_debug_sigprint();
132 
133   uword flags = uword(0);
134 
135   if(A.aux_uword_a == 0)  { flags |= solve_opts::flag_triu; }
136   if(A.aux_uword_a == 1)  { flags |= solve_opts::flag_tril; }
137 
138   const bool status = glue_solve_tri_default::apply(out, A.m, B.get_ref(), flags);
139 
140   if(status == false)
141     {
142     out.soft_reset();
143     arma_debug_warn_level(3, "solve(): solution not found");
144     }
145 
146   return status;
147   }
148 
149 
150 
151 template<typename T1, typename T2>
152 inline
153 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)154 solve
155   (
156          Mat<typename T1::elem_type>&    out,
157   const   Op<T1, op_trimat>&             A,
158   const Base<typename T1::elem_type,T2>& B,
159   const solve_opts::opts&                opts
160   )
161   {
162   arma_extra_debug_sigprint();
163 
164   uword flags = opts.flags;
165 
166   if(A.aux_uword_a == 0)  { flags |= solve_opts::flag_triu; }
167   if(A.aux_uword_a == 1)  { flags |= solve_opts::flag_tril; }
168 
169   const bool status = glue_solve_tri::apply(out, A.m, B.get_ref(), flags);
170 
171   if(status == false)
172     {
173     out.soft_reset();
174     arma_debug_warn_level(3, "solve(): solution not found");
175     }
176 
177   return status;
178   }
179 
180 
181 
182 //! @}
183