ccgsl 2.7.2
C++wrappersforGnuScientificLibrary
permute.hpp
Go to the documentation of this file.
1/*
2 * $Id: permute.hpp 296 2013-01-02 12:17:04Z jdl3 $
3 * Copyright (C) 2010, 2020 John D Lamb
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or (at
8 * your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20#ifndef CCGSL_PERMUTE_HPP
21#define CCGSL_PERMUTE_HPP
22
23#include<cmath>
24#include<gsl/gsl_permute.h>
25#include"exception.hpp"
26#include"permutation.hpp"
27
28namespace gsl {
32 namespace permute {
33#ifndef DOXYGEN_SKIP
42 inline int complex_forward( permutation const& p, double* data, size_t const stride, size_t const n ){
43 if( p.get()->size != n ){
44 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
46 }
47 return gsl_permute_complex( p.get()->data, data, stride, n ); }
56 inline int complex_float_forward( permutation const& p, float* data, size_t const stride, size_t const n ){
57 if( p.get()->size != n ){
58 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
60 }
61 return gsl_permute_complex_float( p.get()->data, data, stride, n ); }
70 inline int complex_long_double_forward( permutation const& p, long double* data, size_t const stride,
71 size_t const n ){
72 if( p.get()->size != n ){
73 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
75 }
76 return gsl_permute_complex_long_double( p.get()->data, data, stride, n ); }
85 inline int forward( permutation const& p, double* data, size_t const stride, size_t const n ){
86 if( p.get()->size != n ){
87 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
89 }
90 return gsl_permute( p.get()->data, data, stride, n ); }
99 inline int float_forward( permutation const& p, float* data, size_t const stride, size_t const n ){
100 if( p.get()->size != n ){
101 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
103 }
104 return gsl_permute_float( p.get()->data, data, stride, n ); }
113 inline int int_forward( permutation const& p, int* data, size_t const stride, size_t const n ){
114 if( p.get()->size != n ){
115 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
117 }
118 return gsl_permute_int( p.get()->data, data, stride, n ); }
119
128 inline int long_double_forward( permutation const& p, long double* data, size_t const stride,
129 size_t const n ){
130 if( p.get()->size != n ){
131 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
133 }
134 return gsl_permute_long_double( p.get()->data, data, stride, n ); }
143 inline int long_forward( permutation const& p, long* data, size_t const stride, size_t const n ){
144 if( p.get()->size != n ){
145 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
147 }
148 return gsl_permute_long( p.get()->data, data, stride, n ); }
157 inline int short_forward( permutation const& p, short* data, size_t const stride, size_t const n ){
158 if( p.get()->size != n ){
159 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
161 }
162 return gsl_permute_short( p.get()->data, data, stride, n ); }
171 inline int uchar_forward( permutation const& p, unsigned char* data, size_t const stride, size_t const n ){
172 if( p.get()->size != n ){
173 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
175 }
176 return gsl_permute_uchar( p.get()->data, data, stride, n ); }
185 inline int uint_forward( permutation const& p, unsigned int* data, size_t const stride, size_t const n ){
186 if( p.get()->size != n ){
187 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
189 }
190 return gsl_permute_uint( p.get()->data, data, stride, n ); }
199 inline int ulong_forward( permutation const& p, unsigned long* data, size_t const stride, size_t const n ){
200 if( p.get()->size != n ){
201 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
203 }
204 return gsl_permute_ulong( p.get()->data, data, stride, n ); }
213 inline int ushort_forward( permutation const& p, unsigned short* data, size_t const stride, size_t const n ){
214 if( p.get()->size != n ){
215 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
217 }
218 return gsl_permute_ushort( p.get()->data, data, stride, n ); }
219
220 // versions without strides
221
229 inline int complex_forward( permutation const& p, double* data, size_t const n ){
230 if( p.get()->size != n ){
231 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
233 }
234 return gsl_permute_complex( p.get()->data, data, 1, n ); }
242 inline int complex_float_forward( permutation const& p, float* data, size_t const n ){
243 if( p.get()->size != n ){
244 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
246 }
247 return gsl_permute_complex_float( p.get()->data, data, 1, n ); }
255 inline int complex_long_double_forward( permutation const& p, long double* data,
256 size_t const n ){
257 if( p.get()->size != n ){
258 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
260 }
261 return gsl_permute_complex_long_double( p.get()->data, data, 1, n ); }
269 inline int forward( permutation const& p, double* data, size_t const n ){
270 if( p.get()->size != n ){
271 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
273 }
274 return gsl_permute( p.get()->data, data, 1, n ); }
282 inline int float_forward( permutation const& p, float* data, size_t const n ){
283 if( p.get()->size != n ){
284 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
286 }
287 return gsl_permute_float( p.get()->data, data, 1, n ); }
295 inline int int_forward( permutation const& p, int* data, size_t const n ){
296 if( p.get()->size != n ){
297 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
299 }
300 return gsl_permute_int( p.get()->data, data, 1, n ); }
301
309 inline int long_double_forward( permutation const& p, long double* data,
310 size_t const n ){
311 if( p.get()->size != n ){
312 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
314 }
315 return gsl_permute_long_double( p.get()->data, data, 1, n ); }
323 inline int long_forward( permutation const& p, long* data, size_t const n ){
324 if( p.get()->size != n ){
325 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
327 }
328 return gsl_permute_long( p.get()->data, data, 1, n ); }
336 inline int short_forward( permutation const& p, short* data, size_t const n ){
337 if( p.get()->size != n ){
338 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
340 }
341 return gsl_permute_short( p.get()->data, data, 1, n ); }
349 inline int uchar_forward( permutation const& p, unsigned char* data, size_t const n ){
350 if( p.get()->size != n ){
351 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
353 }
354 return gsl_permute_uchar( p.get()->data, data, 1, n ); }
362 inline int uint_forward( permutation const& p, unsigned int* data, size_t const n ){
363 if( p.get()->size != n ){
364 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
366 }
367 return gsl_permute_uint( p.get()->data, data, 1, n ); }
375 inline int ulong_forward( permutation const& p, unsigned long* data, size_t const n ){
376 if( p.get()->size != n ){
377 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
379 }
380 return gsl_permute_ulong( p.get()->data, data, 1, n ); }
388 inline int ushort_forward( permutation const& p, unsigned short* data, size_t const n ){
389 if( p.get()->size != n ){
390 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
392 }
393 return gsl_permute_ushort( p.get()->data, data, 1, n ); }
394#endif // DOXYGEN_SKIP
395
396 // Template versions
405 template<typename DATA>
406 inline int complex_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
407 if( p.get()->size != data.size() ){
408 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
410 }
411 return gsl_permute_complex( p.get()->data, data.data(), stride, data.size() / stride ); }
420 template<typename DATA>
421 inline int complex_float_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
422 if( p.get()->size != data.size() ){
423 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
425 }
426 return gsl_permute_complex_float( p.get()->data, data.data(), stride, data.size() / stride ); }
435 template<typename DATA>
436 inline int complex_long_double_forward( permutation const& p, DATA& data, size_t const stride = 1){
437 if( p.get()->size != data.size() ){
438 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
440 }
441 return gsl_permute_complex_long_double( p.get()->data, data.data(), stride, data.size() / stride ); }
450 template<typename DATA>
451 inline int forward( permutation const& p, DATA& data, size_t const stride = 1 ){
452 if( p.get()->size != data.size() ){
453 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
455 }
456 return gsl_permute( p.get()->data, data.data(), stride, data.size() / stride ); }
465 template<typename DATA>
466 inline int float_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
467 if( p.get()->size != data.size() ){
468 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
470 }
471 return gsl_permute_float( p.get()->data, data.data(), stride, data.size() / stride ); }
480 template<typename DATA>
481 inline int int_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
482 if( p.get()->size != data.size() ){
483 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
485 }
486 return gsl_permute_int( p.get()->data, data.data(), stride, data.size() / stride ); }
487
496 template<typename DATA>
497 inline int long_double_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
498 if( p.get()->size != data.size() ){
499 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
501 }
502 return gsl_permute_long_double( p.get()->data, data.data(), stride, data.size() / stride ); }
511 template<typename DATA>
512 inline int long_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
513 if( p.get()->size != data.size() ){
514 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
516 }
517 return gsl_permute_long( p.get()->data, data.data(), stride, data.size() / stride ); }
526 template<typename DATA>
527 inline int short_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
528 if( p.get()->size != data.size() ){
529 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
531 }
532 return gsl_permute_short( p.get()->data, data.data(), stride, data.size() / stride ); }
541 template<typename DATA>
542 inline int uchar_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
543 if( p.get()->size != data.size() ){
544 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
546 }
547 return gsl_permute_uchar( p.get()->data, data.data(), stride, data.size() / stride ); }
556 template<typename DATA>
557 inline int uint_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
558 if( p.get()->size != data.size() ){
559 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
561 }
562 return gsl_permute_uint( p.get()->data, data.data(), stride, data.size() / stride ); }
571 template<typename DATA>
572 inline int ulong_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
573 if( p.get()->size != data.size() ){
574 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
576 }
577 return gsl_permute_ulong( p.get()->data, data.data(), stride, data.size() / stride ); }
586 template<typename DATA>
587 inline int ushort_forward( permutation const& p, DATA& data, size_t const stride = 1 ){
588 if( p.get()->size != data.size() ){
589 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
591 }
592 return gsl_permute_ushort( p.get()->data, data.data(), stride, data.size() / stride ); }
593
594 // Inverse functions
595#ifndef DOXYGEN_SKIP
604 inline int complex_inverse( permutation const& p, double* data, size_t const stride, size_t const n ){
605 if( p.get()->size != n ){
606 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
608 }
609 return gsl_permute_complex_inverse( p.get()->data, data, stride, n ); }
618 inline int complex_float_inverse( permutation const& p, float* data, size_t const stride, size_t const n ){
619 if( p.get()->size != n ){
620 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
622 }
623 return gsl_permute_complex_float_inverse( p.get()->data, data, stride, n ); }
632 inline int complex_long_double_inverse( permutation const& p, long double* data, size_t const stride,
633 size_t const n ){
634 if( p.get()->size != n ){
635 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
637 }
638 return gsl_permute_complex_long_double_inverse( p.get()->data, data, stride, n ); }
647 inline int inverse( permutation const& p, double* data, size_t const stride, size_t const n ){
648 if( p.get()->size != n ){
649 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
651 }
652 return gsl_permute_inverse( p.get()->data, data, stride, n ); }
661 inline int float_inverse( permutation const& p, float* data, size_t const stride, size_t const n ){
662 if( p.get()->size != n ){
663 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
665 }
666 return gsl_permute_float_inverse( p.get()->data, data, stride, n ); }
675 inline int int_inverse( permutation const& p, int* data, size_t const stride, size_t const n ){
676 if( p.get()->size != n ){
677 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
679 }
680 return gsl_permute_int_inverse( p.get()->data, data, stride, n ); }
681
690 inline int long_double_inverse( permutation const& p, long double* data, size_t const stride,
691 size_t const n ){
692 if( p.get()->size != n ){
693 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
695 }
696 return gsl_permute_long_double_inverse( p.get()->data, data, stride, n ); }
705 inline int long_inverse( permutation const& p, long* data, size_t const stride, size_t const n ){
706 if( p.get()->size != n ){
707 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
709 }
710 return gsl_permute_long_inverse( p.get()->data, data, stride, n ); }
719 inline int short_inverse( permutation const& p, short* data, size_t const stride, size_t const n ){
720 if( p.get()->size != n ){
721 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
723 }
724 return gsl_permute_short_inverse( p.get()->data, data, stride, n ); }
733 inline int uchar_inverse( permutation const& p, unsigned char* data, size_t const stride, size_t const n ){
734 if( p.get()->size != n ){
735 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
737 }
738 return gsl_permute_uchar_inverse( p.get()->data, data, stride, n ); }
747 inline int uint_inverse( permutation const& p, unsigned int* data, size_t const stride, size_t const n ){
748 if( p.get()->size != n ){
749 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
751 }
752 return gsl_permute_uint_inverse( p.get()->data, data, stride, n ); }
761 inline int ulong_inverse( permutation const& p, unsigned long* data, size_t const stride, size_t const n ){
762 if( p.get()->size != n ){
763 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
765 }
766 return gsl_permute_ulong_inverse( p.get()->data, data, stride, n ); }
775 inline int ushort_inverse( permutation const& p, unsigned short* data, size_t const stride, size_t const n ){
776 if( p.get()->size != n ){
777 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
779 }
780 return gsl_permute_ushort_inverse( p.get()->data, data, stride, n ); }
781
782 // versions without strides
783
791 inline int complex_inverse( permutation const& p, double* data, size_t const n ){
792 if( p.get()->size != n ){
793 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
795 }
796 return gsl_permute_complex_inverse( p.get()->data, data, 1, n ); }
804 inline int complex_float_inverse( permutation const& p, float* data, size_t const n ){
805 if( p.get()->size != n ){
806 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
808 }
809 return gsl_permute_complex_float_inverse( p.get()->data, data, 1, n ); }
817 inline int complex_long_double_inverse( permutation const& p, long double* data,
818 size_t const n ){
819 if( p.get()->size != n ){
820 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
822 }
823 return gsl_permute_complex_long_double_inverse( p.get()->data, data, 1, n ); }
831 inline int inverse( permutation const& p, double* data, size_t const n ){
832 if( p.get()->size != n ){
833 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
835 }
836 return gsl_permute_inverse( p.get()->data, data, 1, n ); }
844 inline int float_inverse( permutation const& p, float* data, size_t const n ){
845 if( p.get()->size != n ){
846 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
848 }
849 return gsl_permute_float_inverse( p.get()->data, data, 1, n ); }
857 inline int int_inverse( permutation const& p, int* data, size_t const n ){
858 if( p.get()->size != n ){
859 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
861 }
862 return gsl_permute_int_inverse( p.get()->data, data, 1, n ); }
863
871 inline int long_double_inverse( permutation const& p, long double* data,
872 size_t const n ){
873 if( p.get()->size != n ){
874 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
876 }
877 return gsl_permute_long_double_inverse( p.get()->data, data, 1, n ); }
885 inline int long_inverse( permutation const& p, long* data, size_t const n ){
886 if( p.get()->size != n ){
887 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
889 }
890 return gsl_permute_long_inverse( p.get()->data, data, 1, n ); }
898 inline int short_inverse( permutation const& p, short* data, size_t const n ){
899 if( p.get()->size != n ){
900 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
902 }
903 return gsl_permute_short_inverse( p.get()->data, data, 1, n ); }
911 inline int uchar_inverse( permutation const& p, unsigned char* data, size_t const n ){
912 if( p.get()->size != n ){
913 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
915 }
916 return gsl_permute_uchar_inverse( p.get()->data, data, 1, n ); }
924 inline int uint_inverse( permutation const& p, unsigned int* data, size_t const n ){
925 if( p.get()->size != n ){
926 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
928 }
929 return gsl_permute_uint_inverse( p.get()->data, data, 1, n ); }
937 inline int ulong_inverse( permutation const& p, unsigned long* data, size_t const n ){
938 if( p.get()->size != n ){
939 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
941 }
942 return gsl_permute_ulong_inverse( p.get()->data, data, 1, n ); }
950 inline int ushort_inverse( permutation const& p, unsigned short* data, size_t const n ){
951 if( p.get()->size != n ){
952 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
954 }
955 return gsl_permute_ushort_inverse( p.get()->data, data, 1, n ); }
956#endif // DOXYGEN_SKIP
957
958 // Template versions
967 template<typename DATA>
968 inline int complex_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
969 if( p.get()->size != data.size() ){
970 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
972 }
973 return gsl_permute_complex_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
982 template<typename DATA>
983 inline int complex_float_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
984 if( p.get()->size != data.size() ){
985 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
987 }
988 return gsl_permute_complex_float_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
997 template<typename DATA>
998 inline int complex_long_double_inverse( permutation const& p, DATA& data, size_t const stride = 1){
999 if( p.get()->size != data.size() ){
1000 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1002 }
1003 return gsl_permute_complex_long_double_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1012 template<typename DATA>
1013 inline int inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1014 if( p.get()->size != data.size() ){
1015 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1017 }
1018 return gsl_permute_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1027 template<typename DATA>
1028 inline int float_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1029 if( p.get()->size != data.size() ){
1030 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1032 }
1033 return gsl_permute_float_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1042 template<typename DATA>
1043 inline int int_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1044 if( p.get()->size != data.size() ){
1045 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1047 }
1048 return gsl_permute_int_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1049
1058 template<typename DATA>
1059 inline int long_double_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1060 if( p.get()->size != data.size() ){
1061 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1063 }
1064 return gsl_permute_long_double_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1073 template<typename DATA>
1074 inline int long_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1075 if( p.get()->size != data.size() ){
1076 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1078 }
1079 return gsl_permute_long_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1088 template<typename DATA>
1089 inline int short_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1090 if( p.get()->size != data.size() ){
1091 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1093 }
1094 return gsl_permute_short_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1103 template<typename DATA>
1104 inline int uchar_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1105 if( p.get()->size != data.size() ){
1106 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1108 }
1109 return gsl_permute_uchar_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1118 template<typename DATA>
1119 inline int uint_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1120 if( p.get()->size != data.size() ){
1121 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1123 }
1124 return gsl_permute_uint_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1133 template<typename DATA>
1134 inline int ulong_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1135 if( p.get()->size != data.size() ){
1136 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1138 }
1139 return gsl_permute_ulong_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1148 template<typename DATA>
1149 inline int ushort_inverse( permutation const& p, DATA& data, size_t const stride = 1 ){
1150 if( p.get()->size != data.size() ){
1151 gsl_error( "array and permutation sizes do not match", __FILE__, __LINE__, exception::GSL_ESANITY );
1153 }
1154 return gsl_permute_ushort_inverse( p.get()->data, data.data(), stride, data.size() / stride ); }
1155
1156 }
1157
1158}
1159
1160#endif
@ GSL_ESANITY
sanity check failed - shouldn't happen
Definition: exception.hpp:478
This class handles GSL permutation objects.
Definition: permutation.hpp:33
gsl_permutation * get()
Get the gsl_permutation.
int float_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_float_inverse().
Definition: permute.hpp:1028
int int_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_int().
Definition: permute.hpp:481
int long_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_long().
Definition: permute.hpp:512
int float_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_float().
Definition: permute.hpp:466
int ushort_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_ushort_inverse().
Definition: permute.hpp:1149
int short_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_short_inverse().
Definition: permute.hpp:1089
int forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute().
Definition: permute.hpp:451
int complex_long_double_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex_long_double().
Definition: permute.hpp:436
int uint_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_uint().
Definition: permute.hpp:557
int long_double_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_long_double_inverse().
Definition: permute.hpp:1059
int ushort_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_ushort().
Definition: permute.hpp:587
int complex_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex_inverse().
Definition: permute.hpp:968
int complex_float_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex_float().
Definition: permute.hpp:421
int complex_long_double_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex_long_double_inverse().
Definition: permute.hpp:998
int uint_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_uint_inverse().
Definition: permute.hpp:1119
int complex_float_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex_float_inverse().
Definition: permute.hpp:983
int inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_inverse().
Definition: permute.hpp:1013
int ulong_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_ulong_inverse().
Definition: permute.hpp:1134
int long_double_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_long_double().
Definition: permute.hpp:497
int uchar_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_uchar_inverse().
Definition: permute.hpp:1104
int short_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_short().
Definition: permute.hpp:527
int int_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_int_inverse().
Definition: permute.hpp:1043
int ulong_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_ulong().
Definition: permute.hpp:572
int complex_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_complex().
Definition: permute.hpp:406
int long_inverse(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_long_inverse().
Definition: permute.hpp:1074
int uchar_forward(permutation const &p, DATA &data, size_t const stride=1)
C++ version of gsl_permute_uchar().
Definition: permute.hpp:542
size_t n(workspace const &w)
C++ version of gsl_rstat_n().
Definition: rstat.hpp:299
The gsl package creates an interface to the GNU Scientific Library for C++.
Definition: blas.hpp:34