Mercurial > octave
annotate libinterp/corefcn/perms.cc @ 32458:e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
There were two uses of variable length arrays in perms.cc. These did
not cause problems in normal use but did show up as potentially
undefined behavior with `-fsanitize=undefined` because the array
length was not constrained to be positive. This changeset replaces
them with explicit dynamic memory allocation using new/delete[].
author | Arun Giridhar <arungiridhar@gmail.com> |
---|---|
date | Fri, 03 Nov 2023 14:20:00 -0400 |
parents | 72dcb1cef2c9 |
children | dec46ae43231 |
rev | line source |
---|---|
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
2 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
3 // Copyright (C) 2023 The Octave Project Developers |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
4 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
7 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
8 // This file is part of Octave. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
9 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
13 // (at your option) any later version. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
14 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
18 // GNU General Public License for more details. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
19 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
23 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
25 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
26 #if defined(HAVE_CONFIG_H) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
27 # include "config.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
28 #endif |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
29 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
30 #include <algorithm> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
31 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
32 #include "defun.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
33 #include "error.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
34 #include "errwarn.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
35 #include "ovl.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
36 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
37 OCTAVE_BEGIN_NAMESPACE (octave) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
38 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
39 static inline double |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
40 Factorial (octave_idx_type n) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
41 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
42 double ret = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
43 for (octave_idx_type i = 2; i <= n; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
44 ret *= i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
45 return ret; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
46 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
47 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
48 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
49 // Use C++ template to cater for the different octave array classes. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
50 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
51 template <typename T> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
52 static inline Array<T> |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
53 GetPerms (const Array<T> &ar_in, bool uniq_v, bool do_sort = false) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
54 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
55 octave_idx_type m = ar_in.numel (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
56 double nr = Factorial (m); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
57 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
58 // Setup index vector filled from 0..m-1 |
32458
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
59 int* myvidx = new int[m]; |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
60 for (int i = 0; i < m; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
61 myvidx[i] = i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
62 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
63 // Interim array to sort ar_in for octave sort order and to implement |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
64 // "unique". |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
65 Array<T> ar (ar_in); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
66 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
67 if (uniq_v) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
68 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
69 ar = ar.sort (ar.dims () (1) > ar.dims () (0) ? 1 : 0, ASCENDING); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
70 const T *Ar = ar.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
71 int ctr = 0; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
72 int N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
73 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
74 // Number of same elements where we need to remove permutations |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
75 // Number of unique permutations is n! / (n_el1! * n_el2! * ...) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
76 for (octave_idx_type i = 0; i < m - 1; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
77 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
78 myvidx[i] = ctr; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
79 if (Ar[i + 1] != Ar[i]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
80 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
81 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
82 ctr = i + 1; // index of next different element |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
83 N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
84 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
85 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
86 N_el++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
87 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
88 myvidx[m - 1] = ctr; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
89 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
90 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
91 else if (do_sort) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
92 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
93 ar = ar.sort (ar.dims () (1) > ar.dims () (0) ? 1 : 0, ASCENDING); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
94 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
95 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
96 // Sort vector indices for inverse lexicographic order later. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
97 std::sort (myvidx, myvidx + m, std::greater<int> ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
98 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
99 const T *Ar = ar.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
100 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
101 // Set up result array |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
102 octave_idx_type n = static_cast<octave_idx_type> (nr); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
103 Array<T> res (dim_vector (n, m)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
104 T *Res = res.fortran_vec (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
105 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
106 // Do the actual job |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
107 octave_idx_type i = 0; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
108 std::sort (myvidx, myvidx + m, std::greater<int> ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
109 do |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
110 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
111 for (octave_idx_type j = 0; j < m; j++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
112 Res[i + j * n] = Ar[myvidx[j]]; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
113 i++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
114 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
115 while (std::next_permutation (myvidx, myvidx + m, std::greater<int> ())); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
116 |
32458
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
117 delete[] myvidx; |
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
118 |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
119 return res; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
120 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
121 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
122 // Template for non-numerical types (e.g. Cell) without sorting. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
123 // The C++ compiler complains as the provided type octave_value does not |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
124 // support the test of equality via '==' in the above template. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
125 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
126 template <typename T> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
127 static inline Array<T> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
128 GetPermsNoSort (const Array<T> &ar_in, bool uniq_v = false) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
129 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
130 octave_idx_type m = ar_in.numel (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
131 double nr = Factorial (m); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
132 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
133 // Setup index vector filled from 0..m-1 |
32458
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
134 int* myvidx = new int[m]; |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
135 for (int i = 0; i < m; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
136 myvidx[i] = i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
137 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
138 const T *Ar = ar_in.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
139 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
140 if (uniq_v) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
141 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
142 // Mutual Comparison using is_equal to detect duplicated values |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
143 int N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
144 // Number of unique permutations is n! / (n_el1! * n_el2! * ...) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
145 for (octave_idx_type i = 0; i < m - 1; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
146 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
147 for (octave_idx_type j = i + 1; j < m; j++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
148 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
149 if (myvidx[j] > myvidx[i] && Ar[i].is_equal (Ar[j])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
150 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
151 myvidx[j] = myvidx[i]; // not yet processed... |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
152 N_el++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
153 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
154 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
155 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
156 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
157 N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
158 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
159 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
160 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
161 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
162 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
163 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
164 // Sort vector indices for inverse lexicographic order later. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
165 std::sort (myvidx, myvidx + m, std::greater<int> ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
166 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
167 // Set up result array |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
168 octave_idx_type n = static_cast<octave_idx_type> (nr); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
169 Array<T> res (dim_vector (n, m)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
170 T *Res = res.fortran_vec (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
171 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
172 // Do the actual job |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
173 octave_idx_type i = 0; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
174 do |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
175 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
176 for (octave_idx_type j = 0; j < m; j++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
177 Res[i + j * n] = Ar[myvidx[j]]; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
178 i++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
179 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
180 while (std::next_permutation (myvidx, myvidx + m, std::greater<int> ())); |
32458
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
181 |
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
182 delete[] myvidx; |
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
183 |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
184 return res; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
185 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
186 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
187 DEFUN (perms, args, , |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
188 doc: /* -*- texinfo -*- |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
189 @deftypefn {} {@var{P} =} perms (@var{v}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
190 @deftypefnx {} {@var{P} =} perms (@var{v}, "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
191 Generate all permutations of vector @var{v} with one row per permutation. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
192 |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
193 Results are returned in reverse lexicographic order if @var{v} is in ascending |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
194 order. If @var{v} is in a different permutation, then the result is permuted |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
195 that way too. Consequently, an input in descending order yields a result in |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
196 normal lexicographic order. The result has size |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
197 @code{factorial (@var{n}) * @var{n}}, where @var{n} is the length of @var{v}. |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
198 Any repeated elements are included in the output. |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
199 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
200 If the optional argument @qcode{"unique"} is given then only unique |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
201 permutations are returned, using less memory and taking less time than calling |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
202 @code{unique (perms (@var{v}), "rows")}. |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
203 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
204 Example 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
205 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
206 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
207 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
208 perms ([1, 2, 3]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
209 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
210 3 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
211 3 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
212 2 3 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
213 2 1 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
214 1 3 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
215 1 2 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
216 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
217 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
218 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
219 Example 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
220 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
221 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
222 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
223 perms ([1, 1, 2, 2], "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
224 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
225 2 2 1 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
226 2 1 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
227 2 1 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
228 1 2 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
229 1 2 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
230 1 1 2 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
231 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
232 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
233 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
234 Programming Note: If the @qcode{"unique"} option is not used, the length of |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
235 @var{v} should be no more than 10-12 to limit memory consumption. Even with |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
236 @qcode{"unique"}, there should be no more than 10-12 unique elements in |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
237 @var{v}. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
238 @seealso{permute, randperm, nchoosek} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
239 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
240 @end deftypefn */) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
241 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
242 int nargin = args.length (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
243 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
244 if (nargin < 1 || nargin > 2) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
245 print_usage (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
246 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
247 octave_value retval; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
248 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
249 // Parameter check "unique" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
250 bool uniq_v = false; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
251 if (nargin == 2) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
252 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
253 const charMatrix opt = args (1).char_matrix_value (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
254 const char *str = opt.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
255 if (std::string (str, opt.cols ()) != "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
256 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
257 error ("perms: option must be the string \"unique\"."); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
258 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
259 uniq_v = true; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
260 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
261 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
262 if (! (args (0).is_matrix_type () || args (0).is_range () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
263 || args (0).iscell () || args (0).is_scalar_type () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
264 || args (0).isstruct ())) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
265 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
266 error ("perms: INPUT must be a matrix, a range, a cell array, " |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
267 "a struct or a scalar."); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
268 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
269 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
270 std::string clname = args (0).class_name (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
271 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
272 // Execute main permutation code for the different classes |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
273 if (clname == "double") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
274 retval = GetPerms<double> (args (0).array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
275 else if (clname == "single") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
276 retval = GetPerms<float> (args (0).float_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
277 else if (clname == "logical") |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
278 retval = GetPerms<bool> (args (0).bool_array_value (), uniq_v); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
279 else if (clname == "char") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
280 retval = GetPerms<char> (args (0).char_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
281 else if (clname == "int8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
282 retval = GetPerms<octave_int8> (args (0).int8_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
283 else if (clname == "int16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
284 retval = GetPerms<octave_int16> (args (0).int16_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
285 else if (clname == "int32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
286 retval = GetPerms<octave_int32> (args (0).int32_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
287 else if (clname == "int64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
288 retval = GetPerms<octave_int64> (args (0).int64_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
289 else if (clname == "uint8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
290 retval = GetPerms<octave_uint8> (args (0).uint8_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
291 else if (clname == "uint16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
292 retval = GetPerms<octave_uint16> (args (0).uint16_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
293 else if (clname == "uint32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
294 retval = GetPerms<octave_uint32> (args (0).uint32_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
295 else if (clname == "uint64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
296 retval = GetPerms<octave_uint64> (args (0).uint64_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
297 else if (clname == "cell") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
298 retval = GetPermsNoSort<octave_value> (args (0).cell_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
299 else if (clname == "struct") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
300 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
301 const octave_map map_in (args (0).map_value ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
302 string_vector fn = map_in.fieldnames (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
303 if (fn.numel () == 0 && map_in.numel () != 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
304 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
305 octave_scalar_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
306 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
307 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
308 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
309 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
310 octave_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
311 if (fn.numel () == 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
312 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
313 out = octave_map (dim_vector (1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
314 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
315 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
316 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
317 for (octave_idx_type i = 0; i < fn.numel (); i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
318 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
319 out.assign (fn (i), GetPermsNoSort<octave_value> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
320 (map_in.contents (fn (i)), uniq_v)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
321 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
322 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
323 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
324 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
325 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
326 else // none of the above class criteria were met |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
327 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
328 warning ("perms: unable to permute for class %s", clname.c_str ()); |
32151
72dcb1cef2c9
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
31949
diff
changeset
|
329 // retval stays empty |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
330 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
331 return ovl (retval); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
332 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
333 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
334 /* |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
335 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
336 %!assert (rows (perms (1:6)), factorial (6)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
337 %!assert (perms (pi), pi) |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
338 %!assert (perms ([e, pi]), [pi, e; e, pi]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
339 %!assert (perms ([pi, e]), [e, pi; pi, e]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
340 %!assert (perms ([1 2 3]), [3 2 1; 3 1 2; 2 3 1; 2 1 3; 1 3 2; 1 2 3]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
341 %!assert (sortrows (perms (1:5)), sortrows (perms ([2 5 4 1 3]'))) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
342 %!assert (perms ("abc"), char ("cba", "cab", "bca", "bac", "acb", "abc")) |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
343 %!assert (sortrows (perms ("fobar")), unique (perms ("fobar"), "rows")) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
344 %!assert (unique (perms (1:5)(:))', 1:5) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
345 %!assert (perms (int8 (1:4)), int8 (perms (1:4))) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
346 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
347 %!assert (sortrows (perms ("abb", "unique")), ["abb"; "bab"; "bba"]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
348 %!assert (size (perms ([1 1 1 1 2 2 2 3 3], "unique")), [1260 9]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
349 %!assert (size (perms (int8([1 1 1 1 1 2 2 2 2 3 3 3]), "unique")), [27720 12]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
350 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
351 ## Should work for any array type, such as cells and structs, |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
352 ## and not only for numeric data. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
353 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
354 %!assert <*52431> (perms ({1}), {1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
355 %!assert <*52431> (perms ({0.1, "foo"}), {"foo", 0.1; 0.1, "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
356 %!assert <*52431> (perms ({"foo", 0.1}), {0.1, "foo"; "foo", 0.1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
357 %!assert <*52431> (perms ({"foo"; 0.1}), {0.1, "foo"; "foo", 0.1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
358 %!assert <*52431> (perms ({0.1; "foo"}), {"foo", 0.1; 0.1, "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
359 %!assert <*52431> (perms ({"foo", "bar"}), {"bar", "foo"; "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
360 %!assert <*52431> (perms ({"bar", "foo"}), {"foo", "bar"; "bar", "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
361 %! |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
362 %!assert <*52431> (perms (struct ()), struct ()) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
363 %!assert <*52431> (perms (struct ("foo", {1, 2})), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
364 %! struct ("foo", {2, 1; 1, 2})) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
365 %!assert <*52431> (perms (struct ("foo", {1, 2}, "bar", {3, 4})), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
366 %! struct ("foo", {2, 1; 1, 2}, "bar", {4, 3; 3, 4})) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
367 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
368 ## Also sort logical input with order dependent on the input order and |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
369 ## not their values. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
370 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
371 %!assert <*52431> (perms (logical ([1 0])), logical ([0 1;, 1 0])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
372 %!assert <*52431> (perms (logical ([0 1])), logical ([1 0; 0 1])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
373 %!assert <*52431> (perms (logical ([0 1 0])), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
374 %! logical ([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 0 1; 0 1 0])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
375 %!assert <*52431> (perms (logical ([0 1 1])), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
376 %! logical ([1 1 0; 1 0 1; 1 1 0; 1 0 1; 0 1 1; 0 1 1])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
377 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
378 %!assert <*52432> (perms ([]), reshape ([], 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
379 %!assert <*52432> (perms (single ([])), reshape (single ([]), 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
380 %!assert <*52432> (perms (int8 ([])), reshape (int8 ([]), 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
381 %!assert <*52432> (perms ({}), cell (1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
382 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
383 %!test <*52432> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
384 %! s = struct (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
385 %! s(1) = []; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
386 %! assert (perms (reshape (s, 0, 0)), reshape (s, 1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
387 %! assert (perms (reshape (s, 0, 1)), reshape (s, 1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
388 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
389 ## test if "unique" works also for cell arrays |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
390 %!assert <*63965> (perms ({"foo"; "foo"}, "unique"), {"foo", "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
391 %!assert <*63965> (perms ({"foo", "foo", "bar"}, "unique"), ... |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
392 %! {"bar", "foo", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
393 %! "foo", "bar", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
394 %! "foo", "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
395 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
396 ## Test input validation |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
397 %!error <Invalid call> perms () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
398 %!error <option must be the string "unique"> perms (1:5, "foobar") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
399 %!error <option must be the string "unique"> perms (1:5, {"foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
400 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
401 */ |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
402 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
403 OCTAVE_END_NAMESPACE (octave) |