PageRenderTime 57ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/include/boost/numeric/bindings/lapack/driver/ggevx.hpp

http://github.com/quantmind/jflib
C++ Header | 559 lines | 503 code | 29 blank | 27 comment | 67 complexity | c2daf76b5d43741aa27f610889c06238 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. //
  2. // Copyright (c) 2003--2009
  3. // Toon Knapen, Karl Meerbergen, Kresimir Fresl,
  4. // Thomas Klimpel and Rutger ter Borg
  5. //
  6. // Distributed under the Boost Software License, Version 1.0.
  7. // (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // THIS FILE IS AUTOMATICALLY GENERATED
  11. // PLEASE DO NOT EDIT!
  12. //
  13. #ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEVX_HPP
  14. #define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEVX_HPP
  15. #include <boost/assert.hpp>
  16. #include <boost/mpl/bool.hpp>
  17. #include <boost/numeric/bindings/lapack/detail/lapack.h>
  18. #include <boost/numeric/bindings/lapack/workspace.hpp>
  19. #include <boost/numeric/bindings/traits/detail/array.hpp>
  20. #include <boost/numeric/bindings/traits/detail/utils.hpp>
  21. #include <boost/numeric/bindings/traits/is_complex.hpp>
  22. #include <boost/numeric/bindings/traits/is_real.hpp>
  23. #include <boost/numeric/bindings/traits/traits.hpp>
  24. #include <boost/numeric/bindings/traits/type_traits.hpp>
  25. #include <boost/static_assert.hpp>
  26. #include <boost/type_traits/is_same.hpp>
  27. #include <boost/utility/enable_if.hpp>
  28. namespace boost {
  29. namespace numeric {
  30. namespace bindings {
  31. namespace lapack {
  32. //$DESCRIPTION
  33. // overloaded functions to call lapack
  34. namespace detail {
  35. inline void ggevx( char const balanc, char const jobvl, char const jobvr,
  36. char const sense, integer_t const n, float* a,
  37. integer_t const lda, float* b, integer_t const ldb, float* alphar,
  38. float* alphai, float* beta, float* vl, integer_t const ldvl,
  39. float* vr, integer_t const ldvr, integer_t& ilo, integer_t& ihi,
  40. float* lscale, float* rscale, float& abnrm, float& bbnrm,
  41. float* rconde, float* rcondv, float* work, integer_t const lwork,
  42. integer_t* iwork, logical_t* bwork, integer_t& info ) {
  43. LAPACK_SGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb,
  44. alphar, alphai, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi,
  45. lscale, rscale, &abnrm, &bbnrm, rconde, rcondv, work, &lwork,
  46. iwork, bwork, &info );
  47. }
  48. inline void ggevx( char const balanc, char const jobvl, char const jobvr,
  49. char const sense, integer_t const n, double* a,
  50. integer_t const lda, double* b, integer_t const ldb,
  51. double* alphar, double* alphai, double* beta, double* vl,
  52. integer_t const ldvl, double* vr, integer_t const ldvr,
  53. integer_t& ilo, integer_t& ihi, double* lscale, double* rscale,
  54. double& abnrm, double& bbnrm, double* rconde, double* rcondv,
  55. double* work, integer_t const lwork, integer_t* iwork,
  56. logical_t* bwork, integer_t& info ) {
  57. LAPACK_DGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb,
  58. alphar, alphai, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi,
  59. lscale, rscale, &abnrm, &bbnrm, rconde, rcondv, work, &lwork,
  60. iwork, bwork, &info );
  61. }
  62. inline void ggevx( char const balanc, char const jobvl, char const jobvr,
  63. char const sense, integer_t const n, traits::complex_f* a,
  64. integer_t const lda, traits::complex_f* b, integer_t const ldb,
  65. traits::complex_f* alpha, traits::complex_f* beta,
  66. traits::complex_f* vl, integer_t const ldvl,
  67. traits::complex_f* vr, integer_t const ldvr, integer_t& ilo,
  68. integer_t& ihi, float* lscale, float* rscale, float& abnrm,
  69. float& bbnrm, float* rconde, float* rcondv,
  70. traits::complex_f* work, integer_t const lwork, float* rwork,
  71. integer_t* iwork, logical_t* bwork, integer_t& info ) {
  72. LAPACK_CGGEVX( &balanc, &jobvl, &jobvr, &sense, &n,
  73. traits::complex_ptr(a), &lda, traits::complex_ptr(b), &ldb,
  74. traits::complex_ptr(alpha), traits::complex_ptr(beta),
  75. traits::complex_ptr(vl), &ldvl, traits::complex_ptr(vr),
  76. &ldvr, &ilo, &ihi, lscale, rscale, &abnrm, &bbnrm, rconde,
  77. rcondv, traits::complex_ptr(work), &lwork, rwork, iwork,
  78. bwork, &info );
  79. }
  80. inline void ggevx( char const balanc, char const jobvl, char const jobvr,
  81. char const sense, integer_t const n, traits::complex_d* a,
  82. integer_t const lda, traits::complex_d* b, integer_t const ldb,
  83. traits::complex_d* alpha, traits::complex_d* beta,
  84. traits::complex_d* vl, integer_t const ldvl,
  85. traits::complex_d* vr, integer_t const ldvr, integer_t& ilo,
  86. integer_t& ihi, double* lscale, double* rscale, double& abnrm,
  87. double& bbnrm, double* rconde, double* rcondv,
  88. traits::complex_d* work, integer_t const lwork, double* rwork,
  89. integer_t* iwork, logical_t* bwork, integer_t& info ) {
  90. LAPACK_ZGGEVX( &balanc, &jobvl, &jobvr, &sense, &n,
  91. traits::complex_ptr(a), &lda, traits::complex_ptr(b), &ldb,
  92. traits::complex_ptr(alpha), traits::complex_ptr(beta),
  93. traits::complex_ptr(vl), &ldvl, traits::complex_ptr(vr),
  94. &ldvr, &ilo, &ihi, lscale, rscale, &abnrm, &bbnrm, rconde,
  95. rcondv, traits::complex_ptr(work), &lwork, rwork, iwork,
  96. bwork, &info );
  97. }
  98. }
  99. // value-type based template
  100. template< typename ValueType, typename Enable = void >
  101. struct ggevx_impl{};
  102. // real specialization
  103. template< typename ValueType >
  104. struct ggevx_impl< ValueType, typename boost::enable_if< traits::is_real<ValueType> >::type > {
  105. typedef ValueType value_type;
  106. typedef typename traits::type_traits<ValueType>::real_type real_type;
  107. // user-defined workspace specialization
  108. template< typename MatrixA, typename MatrixB, typename VectorALPHAR,
  109. typename VectorALPHAI, typename VectorBETA, typename MatrixVL,
  110. typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE,
  111. typename VectorRCONDE, typename VectorRCONDV, typename WORK,
  112. typename IWORK, typename BWORK >
  113. static void invoke( char const balanc, char const jobvl, char const jobvr,
  114. char const sense, MatrixA& a, MatrixB& b, VectorALPHAR& alphar,
  115. VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl,
  116. MatrixVR& vr, integer_t& ilo, integer_t& ihi,
  117. VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm,
  118. real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv,
  119. integer_t& info, detail::workspace3< WORK, IWORK, BWORK > work ) {
  120. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  121. MatrixA >::value_type, typename traits::matrix_traits<
  122. MatrixB >::value_type >::value) );
  123. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  124. MatrixA >::value_type, typename traits::vector_traits<
  125. VectorALPHAR >::value_type >::value) );
  126. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  127. MatrixA >::value_type, typename traits::vector_traits<
  128. VectorALPHAI >::value_type >::value) );
  129. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  130. MatrixA >::value_type, typename traits::vector_traits<
  131. VectorBETA >::value_type >::value) );
  132. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  133. MatrixA >::value_type, typename traits::matrix_traits<
  134. MatrixVL >::value_type >::value) );
  135. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  136. MatrixA >::value_type, typename traits::matrix_traits<
  137. MatrixVR >::value_type >::value) );
  138. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  139. MatrixA >::value_type, typename traits::vector_traits<
  140. VectorLSCALE >::value_type >::value) );
  141. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  142. MatrixA >::value_type, typename traits::vector_traits<
  143. VectorRSCALE >::value_type >::value) );
  144. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  145. MatrixA >::value_type, typename traits::vector_traits<
  146. VectorRCONDE >::value_type >::value) );
  147. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  148. MatrixA >::value_type, typename traits::vector_traits<
  149. VectorRCONDV >::value_type >::value) );
  150. BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
  151. balanc == 'B' );
  152. BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' );
  153. BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' );
  154. BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' ||
  155. sense == 'B' );
  156. BOOST_ASSERT( traits::matrix_num_columns(a) >= 0 );
  157. BOOST_ASSERT( traits::leading_dimension(a) >= std::max(1,
  158. traits::matrix_num_columns(a)) );
  159. BOOST_ASSERT( traits::leading_dimension(b) >= std::max(1,
  160. traits::matrix_num_columns(a)) );
  161. BOOST_ASSERT( traits::vector_size(alphar) >=
  162. traits::matrix_num_columns(a) );
  163. BOOST_ASSERT( traits::vector_size(alphai) >=
  164. traits::matrix_num_columns(a) );
  165. BOOST_ASSERT( traits::vector_size(work.select(real_type())) >=
  166. min_size_work( balanc, jobvl, jobvr, sense,
  167. traits::matrix_num_columns(a) ));
  168. BOOST_ASSERT( traits::vector_size(work.select(integer_t())) >=
  169. min_size_iwork( sense, traits::matrix_num_columns(a) ));
  170. BOOST_ASSERT( traits::vector_size(work.select(bool())) >=
  171. min_size_bwork( sense, traits::matrix_num_columns(a) ));
  172. detail::ggevx( balanc, jobvl, jobvr, sense,
  173. traits::matrix_num_columns(a), traits::matrix_storage(a),
  174. traits::leading_dimension(a), traits::matrix_storage(b),
  175. traits::leading_dimension(b), traits::vector_storage(alphar),
  176. traits::vector_storage(alphai), traits::vector_storage(beta),
  177. traits::matrix_storage(vl), traits::leading_dimension(vl),
  178. traits::matrix_storage(vr), traits::leading_dimension(vr),
  179. ilo, ihi, traits::vector_storage(lscale),
  180. traits::vector_storage(rscale), abnrm, bbnrm,
  181. traits::vector_storage(rconde),
  182. traits::vector_storage(rcondv),
  183. traits::vector_storage(work.select(real_type())),
  184. traits::vector_size(work.select(real_type())),
  185. traits::vector_storage(work.select(integer_t())),
  186. traits::vector_storage(work.select(bool())), info );
  187. }
  188. // minimal workspace specialization
  189. template< typename MatrixA, typename MatrixB, typename VectorALPHAR,
  190. typename VectorALPHAI, typename VectorBETA, typename MatrixVL,
  191. typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE,
  192. typename VectorRCONDE, typename VectorRCONDV >
  193. static void invoke( char const balanc, char const jobvl, char const jobvr,
  194. char const sense, MatrixA& a, MatrixB& b, VectorALPHAR& alphar,
  195. VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl,
  196. MatrixVR& vr, integer_t& ilo, integer_t& ihi,
  197. VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm,
  198. real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv,
  199. integer_t& info, minimal_workspace work ) {
  200. traits::detail::array< real_type > tmp_work( min_size_work( balanc,
  201. jobvl, jobvr, sense, traits::matrix_num_columns(a) ) );
  202. traits::detail::array< integer_t > tmp_iwork( min_size_iwork( sense,
  203. traits::matrix_num_columns(a) ) );
  204. traits::detail::array< bool > tmp_bwork( min_size_bwork( sense,
  205. traits::matrix_num_columns(a) ) );
  206. invoke( balanc, jobvl, jobvr, sense, a, b, alphar, alphai, beta, vl,
  207. vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv,
  208. info, workspace( tmp_work, tmp_iwork, tmp_bwork ) );
  209. }
  210. // optimal workspace specialization
  211. template< typename MatrixA, typename MatrixB, typename VectorALPHAR,
  212. typename VectorALPHAI, typename VectorBETA, typename MatrixVL,
  213. typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE,
  214. typename VectorRCONDE, typename VectorRCONDV >
  215. static void invoke( char const balanc, char const jobvl, char const jobvr,
  216. char const sense, MatrixA& a, MatrixB& b, VectorALPHAR& alphar,
  217. VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl,
  218. MatrixVR& vr, integer_t& ilo, integer_t& ihi,
  219. VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm,
  220. real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv,
  221. integer_t& info, optimal_workspace work ) {
  222. real_type opt_size_work;
  223. traits::detail::array< integer_t > tmp_iwork( min_size_iwork( sense,
  224. traits::matrix_num_columns(a) ) );
  225. traits::detail::array< bool > tmp_bwork( min_size_bwork( sense,
  226. traits::matrix_num_columns(a) ) );
  227. detail::ggevx( balanc, jobvl, jobvr, sense,
  228. traits::matrix_num_columns(a), traits::matrix_storage(a),
  229. traits::leading_dimension(a), traits::matrix_storage(b),
  230. traits::leading_dimension(b), traits::vector_storage(alphar),
  231. traits::vector_storage(alphai), traits::vector_storage(beta),
  232. traits::matrix_storage(vl), traits::leading_dimension(vl),
  233. traits::matrix_storage(vr), traits::leading_dimension(vr),
  234. ilo, ihi, traits::vector_storage(lscale),
  235. traits::vector_storage(rscale), abnrm, bbnrm,
  236. traits::vector_storage(rconde),
  237. traits::vector_storage(rcondv), &opt_size_work, -1,
  238. traits::vector_storage(tmp_iwork),
  239. traits::vector_storage(tmp_bwork), info );
  240. traits::detail::array< real_type > tmp_work(
  241. traits::detail::to_int( opt_size_work ) );
  242. invoke( balanc, jobvl, jobvr, sense, a, b, alphar, alphai, beta, vl,
  243. vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv,
  244. info, workspace( tmp_work, tmp_iwork, tmp_bwork ) );
  245. }
  246. static integer_t min_size_work( char const balanc, char const jobvl,
  247. char const jobvr, char const sense, integer_t const n ) {
  248. if ( balanc == 'S' || balanc == 'B' || jobvl == 'V' || jobvr == 'V' )
  249. return std::max( 1, 6*n );
  250. if ( sense == 'E' )
  251. return std::max( 1, 10*n );
  252. if ( sense == 'V' || sense == 'B' )
  253. return 2*n*n + 8*n + 16;
  254. return std::max( 1, 2*n );
  255. }
  256. static integer_t min_size_iwork( char const sense, integer_t const n ) {
  257. if ( sense == 'E' )
  258. return 0;
  259. else
  260. return n+6;
  261. }
  262. static integer_t min_size_bwork( char const sense, integer_t const n ) {
  263. if ( sense == 'N' )
  264. return 0;
  265. else
  266. return n;
  267. }
  268. };
  269. // complex specialization
  270. template< typename ValueType >
  271. struct ggevx_impl< ValueType, typename boost::enable_if< traits::is_complex<ValueType> >::type > {
  272. typedef ValueType value_type;
  273. typedef typename traits::type_traits<ValueType>::real_type real_type;
  274. // user-defined workspace specialization
  275. template< typename MatrixA, typename MatrixB, typename VectorALPHA,
  276. typename VectorBETA, typename MatrixVL, typename MatrixVR,
  277. typename VectorLSCALE, typename VectorRSCALE,
  278. typename VectorRCONDE, typename VectorRCONDV, typename WORK,
  279. typename RWORK, typename IWORK, typename BWORK >
  280. static void invoke( char const balanc, char const jobvl, char const jobvr,
  281. char const sense, MatrixA& a, MatrixB& b, VectorALPHA& alpha,
  282. VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, integer_t& ilo,
  283. integer_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale,
  284. real_type& abnrm, real_type& bbnrm, VectorRCONDE& rconde,
  285. VectorRCONDV& rcondv, integer_t& info, detail::workspace4< WORK,
  286. RWORK, IWORK, BWORK > work ) {
  287. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::vector_traits<
  288. VectorLSCALE >::value_type, typename traits::vector_traits<
  289. VectorRSCALE >::value_type >::value) );
  290. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::vector_traits<
  291. VectorLSCALE >::value_type, typename traits::vector_traits<
  292. VectorRCONDE >::value_type >::value) );
  293. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::vector_traits<
  294. VectorLSCALE >::value_type, typename traits::vector_traits<
  295. VectorRCONDV >::value_type >::value) );
  296. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  297. MatrixA >::value_type, typename traits::matrix_traits<
  298. MatrixB >::value_type >::value) );
  299. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  300. MatrixA >::value_type, typename traits::vector_traits<
  301. VectorALPHA >::value_type >::value) );
  302. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  303. MatrixA >::value_type, typename traits::vector_traits<
  304. VectorBETA >::value_type >::value) );
  305. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  306. MatrixA >::value_type, typename traits::matrix_traits<
  307. MatrixVL >::value_type >::value) );
  308. BOOST_STATIC_ASSERT( (boost::is_same< typename traits::matrix_traits<
  309. MatrixA >::value_type, typename traits::matrix_traits<
  310. MatrixVR >::value_type >::value) );
  311. BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' ||
  312. balanc == 'B' );
  313. BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' );
  314. BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' );
  315. BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' ||
  316. sense == 'B' );
  317. BOOST_ASSERT( traits::matrix_num_columns(a) >= 0 );
  318. BOOST_ASSERT( traits::leading_dimension(a) >= std::max(1,
  319. traits::matrix_num_columns(a)) );
  320. BOOST_ASSERT( traits::leading_dimension(b) >= std::max(1,
  321. traits::matrix_num_columns(a)) );
  322. BOOST_ASSERT( traits::vector_size(alpha) >=
  323. traits::matrix_num_columns(a) );
  324. BOOST_ASSERT( traits::vector_size(beta) >=
  325. traits::matrix_num_columns(a) );
  326. BOOST_ASSERT( traits::vector_size(work.select(value_type())) >=
  327. min_size_work( sense, traits::matrix_num_columns(a) ));
  328. BOOST_ASSERT( traits::vector_size(work.select(real_type())) >=
  329. min_size_rwork( balanc, traits::matrix_num_columns(a) ));
  330. BOOST_ASSERT( traits::vector_size(work.select(integer_t())) >=
  331. min_size_iwork( sense, traits::matrix_num_columns(a) ));
  332. BOOST_ASSERT( traits::vector_size(work.select(bool())) >=
  333. min_size_bwork( sense, traits::matrix_num_columns(a) ));
  334. detail::ggevx( balanc, jobvl, jobvr, sense,
  335. traits::matrix_num_columns(a), traits::matrix_storage(a),
  336. traits::leading_dimension(a), traits::matrix_storage(b),
  337. traits::leading_dimension(b), traits::vector_storage(alpha),
  338. traits::vector_storage(beta), traits::matrix_storage(vl),
  339. traits::leading_dimension(vl), traits::matrix_storage(vr),
  340. traits::leading_dimension(vr), ilo, ihi,
  341. traits::vector_storage(lscale),
  342. traits::vector_storage(rscale), abnrm, bbnrm,
  343. traits::vector_storage(rconde),
  344. traits::vector_storage(rcondv),
  345. traits::vector_storage(work.select(value_type())),
  346. traits::vector_size(work.select(value_type())),
  347. traits::vector_storage(work.select(real_type())),
  348. traits::vector_storage(work.select(integer_t())),
  349. traits::vector_storage(work.select(bool())), info );
  350. }
  351. // minimal workspace specialization
  352. template< typename MatrixA, typename MatrixB, typename VectorALPHA,
  353. typename VectorBETA, typename MatrixVL, typename MatrixVR,
  354. typename VectorLSCALE, typename VectorRSCALE,
  355. typename VectorRCONDE, typename VectorRCONDV >
  356. static void invoke( char const balanc, char const jobvl, char const jobvr,
  357. char const sense, MatrixA& a, MatrixB& b, VectorALPHA& alpha,
  358. VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, integer_t& ilo,
  359. integer_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale,
  360. real_type& abnrm, real_type& bbnrm, VectorRCONDE& rconde,
  361. VectorRCONDV& rcondv, integer_t& info, minimal_workspace work ) {
  362. traits::detail::array< value_type > tmp_work( min_size_work( sense,
  363. traits::matrix_num_columns(a) ) );
  364. traits::detail::array< real_type > tmp_rwork( min_size_rwork( balanc,
  365. traits::matrix_num_columns(a) ) );
  366. traits::detail::array< integer_t > tmp_iwork( min_size_iwork( sense,
  367. traits::matrix_num_columns(a) ) );
  368. traits::detail::array< bool > tmp_bwork( min_size_bwork( sense,
  369. traits::matrix_num_columns(a) ) );
  370. invoke( balanc, jobvl, jobvr, sense, a, b, alpha, beta, vl, vr, ilo,
  371. ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, info,
  372. workspace( tmp_work, tmp_rwork, tmp_iwork, tmp_bwork ) );
  373. }
  374. // optimal workspace specialization
  375. template< typename MatrixA, typename MatrixB, typename VectorALPHA,
  376. typename VectorBETA, typename MatrixVL, typename MatrixVR,
  377. typename VectorLSCALE, typename VectorRSCALE,
  378. typename VectorRCONDE, typename VectorRCONDV >
  379. static void invoke( char const balanc, char const jobvl, char const jobvr,
  380. char const sense, MatrixA& a, MatrixB& b, VectorALPHA& alpha,
  381. VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, integer_t& ilo,
  382. integer_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale,
  383. real_type& abnrm, real_type& bbnrm, VectorRCONDE& rconde,
  384. VectorRCONDV& rcondv, integer_t& info, optimal_workspace work ) {
  385. value_type opt_size_work;
  386. traits::detail::array< real_type > tmp_rwork( min_size_rwork( balanc,
  387. traits::matrix_num_columns(a) ) );
  388. traits::detail::array< integer_t > tmp_iwork( min_size_iwork( sense,
  389. traits::matrix_num_columns(a) ) );
  390. traits::detail::array< bool > tmp_bwork( min_size_bwork( sense,
  391. traits::matrix_num_columns(a) ) );
  392. detail::ggevx( balanc, jobvl, jobvr, sense,
  393. traits::matrix_num_columns(a), traits::matrix_storage(a),
  394. traits::leading_dimension(a), traits::matrix_storage(b),
  395. traits::leading_dimension(b), traits::vector_storage(alpha),
  396. traits::vector_storage(beta), traits::matrix_storage(vl),
  397. traits::leading_dimension(vl), traits::matrix_storage(vr),
  398. traits::leading_dimension(vr), ilo, ihi,
  399. traits::vector_storage(lscale),
  400. traits::vector_storage(rscale), abnrm, bbnrm,
  401. traits::vector_storage(rconde),
  402. traits::vector_storage(rcondv), &opt_size_work, -1,
  403. traits::vector_storage(tmp_rwork),
  404. traits::vector_storage(tmp_iwork),
  405. traits::vector_storage(tmp_bwork), info );
  406. traits::detail::array< value_type > tmp_work(
  407. traits::detail::to_int( opt_size_work ) );
  408. invoke( balanc, jobvl, jobvr, sense, a, b, alpha, beta, vl, vr, ilo,
  409. ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, info,
  410. workspace( tmp_work, tmp_rwork, tmp_iwork, tmp_bwork ) );
  411. }
  412. static integer_t min_size_work( char const sense, integer_t const n ) {
  413. if ( sense == 'N' )
  414. return std::max( 1, 2*n );
  415. else {
  416. if ( sense == 'E' )
  417. return std::max( 1, 4*n );
  418. else
  419. return std::max( 1, 2*n*n+2*n );
  420. }
  421. }
  422. static integer_t min_size_rwork( char const balanc, integer_t const n ) {
  423. if ( balanc == 'S' || balanc == 'B' )
  424. return std::max( 1, 6*n );
  425. else
  426. return std::max( 1, 2*n );
  427. }
  428. static integer_t min_size_iwork( char const sense, integer_t const n ) {
  429. if ( sense == 'E' )
  430. return 0;
  431. else
  432. return n+2;
  433. }
  434. static integer_t min_size_bwork( char const sense, integer_t const n ) {
  435. if ( sense == 'N' )
  436. return 0;
  437. else
  438. return n;
  439. }
  440. };
  441. // template function to call ggevx
  442. template< typename MatrixA, typename MatrixB, typename VectorALPHAR,
  443. typename VectorALPHAI, typename VectorBETA, typename MatrixVL,
  444. typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE,
  445. typename VectorRCONDE, typename VectorRCONDV, typename Workspace >
  446. inline integer_t ggevx( char const balanc, char const jobvl,
  447. char const jobvr, char const sense, MatrixA& a, MatrixB& b,
  448. VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta,
  449. MatrixVL& vl, MatrixVR& vr, integer_t& ilo, integer_t& ihi,
  450. VectorLSCALE& lscale, VectorRSCALE& rscale,
  451. typename traits::type_traits< typename traits::matrix_traits<
  452. MatrixA >::value_type >::real_type& abnrm,
  453. typename traits::type_traits< typename traits::matrix_traits<
  454. MatrixA >::value_type >::real_type& bbnrm, VectorRCONDE& rconde,
  455. VectorRCONDV& rcondv, Workspace work ) {
  456. typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
  457. integer_t info(0);
  458. ggevx_impl< value_type >::invoke( balanc, jobvl, jobvr, sense, a, b,
  459. alphar, alphai, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm,
  460. bbnrm, rconde, rcondv, info, work );
  461. return info;
  462. }
  463. // template function to call ggevx, default workspace type
  464. template< typename MatrixA, typename MatrixB, typename VectorALPHAR,
  465. typename VectorALPHAI, typename VectorBETA, typename MatrixVL,
  466. typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE,
  467. typename VectorRCONDE, typename VectorRCONDV >
  468. inline integer_t ggevx( char const balanc, char const jobvl,
  469. char const jobvr, char const sense, MatrixA& a, MatrixB& b,
  470. VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta,
  471. MatrixVL& vl, MatrixVR& vr, integer_t& ilo, integer_t& ihi,
  472. VectorLSCALE& lscale, VectorRSCALE& rscale,
  473. typename traits::type_traits< typename traits::matrix_traits<
  474. MatrixA >::value_type >::real_type& abnrm,
  475. typename traits::type_traits< typename traits::matrix_traits<
  476. MatrixA >::value_type >::real_type& bbnrm, VectorRCONDE& rconde,
  477. VectorRCONDV& rcondv ) {
  478. typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
  479. integer_t info(0);
  480. ggevx_impl< value_type >::invoke( balanc, jobvl, jobvr, sense, a, b,
  481. alphar, alphai, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm,
  482. bbnrm, rconde, rcondv, info, optimal_workspace() );
  483. return info;
  484. }
  485. // template function to call ggevx
  486. template< typename MatrixA, typename MatrixB, typename VectorALPHA,
  487. typename VectorBETA, typename MatrixVL, typename MatrixVR,
  488. typename VectorLSCALE, typename VectorRSCALE, typename VectorRCONDE,
  489. typename VectorRCONDV, typename Workspace >
  490. inline integer_t ggevx( char const balanc, char const jobvl,
  491. char const jobvr, char const sense, MatrixA& a, MatrixB& b,
  492. VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr,
  493. integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
  494. VectorRSCALE& rscale, typename traits::type_traits<
  495. typename traits::matrix_traits<
  496. MatrixA >::value_type >::real_type& abnrm,
  497. typename traits::type_traits< typename traits::matrix_traits<
  498. MatrixA >::value_type >::real_type& bbnrm, VectorRCONDE& rconde,
  499. VectorRCONDV& rcondv, Workspace work ) {
  500. typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
  501. integer_t info(0);
  502. ggevx_impl< value_type >::invoke( balanc, jobvl, jobvr, sense, a, b,
  503. alpha, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm,
  504. rconde, rcondv, info, work );
  505. return info;
  506. }
  507. // template function to call ggevx, default workspace type
  508. template< typename MatrixA, typename MatrixB, typename VectorALPHA,
  509. typename VectorBETA, typename MatrixVL, typename MatrixVR,
  510. typename VectorLSCALE, typename VectorRSCALE, typename VectorRCONDE,
  511. typename VectorRCONDV >
  512. inline integer_t ggevx( char const balanc, char const jobvl,
  513. char const jobvr, char const sense, MatrixA& a, MatrixB& b,
  514. VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr,
  515. integer_t& ilo, integer_t& ihi, VectorLSCALE& lscale,
  516. VectorRSCALE& rscale, typename traits::type_traits<
  517. typename traits::matrix_traits<
  518. MatrixA >::value_type >::real_type& abnrm,
  519. typename traits::type_traits< typename traits::matrix_traits<
  520. MatrixA >::value_type >::real_type& bbnrm, VectorRCONDE& rconde,
  521. VectorRCONDV& rcondv ) {
  522. typedef typename traits::matrix_traits< MatrixA >::value_type value_type;
  523. integer_t info(0);
  524. ggevx_impl< value_type >::invoke( balanc, jobvl, jobvr, sense, a, b,
  525. alpha, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm,
  526. rconde, rcondv, info, optimal_workspace() );
  527. return info;
  528. }
  529. }}}} // namespace boost::numeric::bindings::lapack
  530. #endif