Mercurial > octave
annotate libinterp/corefcn/perms.cc @ 31942:7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
The perms() function was previously an Octave m-file. This edit replaces it
with the faster perms.cc C++ function for performance (bug 63962), using
std::next_permutation from the C++ STL. Incidentally, this new function also
correctly returns unique permutations for cells, thereby fixing bug 63965.
* scripts/specfun/perms.m: Delete old m-file.
* scripts/specfun/module.mk: Remove m-file from build system.
* libinterp/corefcn/perms.cc: Add new C++ function.
* libinterp/corefcn/module.mk: Add perms.cc to build system.
author | Hendrik Koerner <koerhen@web.de> |
---|---|
date | Tue, 28 Mar 2023 11:52:15 -0400 |
parents | |
children | 1dba35103327 |
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> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
53 GetPerms (const Array<T> &ar_in, bool uniq_v, bool do_sort = true) |
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 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
59 int myvidx[m]; |
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 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
117 return res; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
118 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
119 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
120 // 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
|
121 // 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
|
122 // 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
|
123 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
124 template <typename T> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
125 static inline Array<T> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
126 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
|
127 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
128 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
129 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
|
130 double nr = Factorial (m); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
131 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
132 // Setup index vector filled from 0..m-1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
133 int myvidx[m]; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
134 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
|
135 myvidx[i] = i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
136 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
137 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
|
138 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
139 if (uniq_v) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
140 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
141 // 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
|
142 int N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
143 // 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
|
144 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
|
145 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
146 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
|
147 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
148 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
|
149 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
150 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
|
151 N_el++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
152 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
153 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
154 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
155 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
156 N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
157 } |
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 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
161 } |
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 // 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
|
164 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
|
165 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
166 // Set up result array |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
167 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
|
168 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
|
169 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
|
170 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
171 // Do the actual job |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
172 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
|
173 do |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
174 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
175 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
|
176 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
|
177 i++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
178 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
179 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
|
180 return res; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
181 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
182 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
183 DEFUN (perms, args, , |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
184 doc: /* -*- texinfo -*- |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
185 @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
|
186 @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
|
187 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
|
188 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
189 Results are returned in inverse lexicographic order. The result has size |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
190 @code{factorial (@var{n}) * @var{n}}, where @var{n} is the length of |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
191 @var{v}. Any repeated elements are included in the output. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
192 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
193 If the optional argument @qcode{"unique"} is given then only unique |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
194 permutations are returned, using less memory and generally taking less time |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
195 than calling @code{unique (perms (@var{v}), "rows")}. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
196 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
197 Example 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
198 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
199 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
200 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
201 perms ([1, 2, 3]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
202 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
203 3 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
204 3 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
205 2 3 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
206 2 1 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
207 1 3 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
208 1 2 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
209 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
210 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
211 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
212 Example 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
213 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
214 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
215 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
216 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
|
217 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
218 2 2 1 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
219 2 1 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
220 2 1 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
221 1 2 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
222 1 2 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
223 1 1 2 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
224 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
225 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
226 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
227 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
|
228 @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
|
229 @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
|
230 @var{v}. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
231 @seealso{permute, randperm, nchoosek} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
232 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
233 @end deftypefn */) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
234 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
235 int nargin = args.length (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
236 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
237 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
|
238 print_usage (); |
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 octave_value retval; |
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 // Parameter check "unique" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
243 bool uniq_v = false; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
244 if (nargin == 2) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
245 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
246 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
|
247 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
|
248 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
|
249 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
250 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
|
251 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
252 uniq_v = true; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
253 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
254 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
255 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
|
256 || 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
|
257 || args (0).isstruct ())) |
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 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
|
260 "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
|
261 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
262 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
263 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
|
264 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
265 // 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
|
266 if (clname == "double") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
267 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
|
268 else if (clname == "single") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
269 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
|
270 else if (clname == "logical") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
271 retval = GetPerms<bool> (args (0).bool_array_value (), uniq_v, false); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
272 // Do not sort logicals by value as the other numerical data types. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
273 // This reflects past design decisions using the order positioning |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
274 // for logicals. See the discussion in |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
275 // https://savannah.gnu.org/bugs/?50426 and |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
276 // https://savannah.gnu.org/bugs/?63962 for context. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
277 else if (clname == "char") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
278 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
|
279 else if (clname == "int8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
280 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
|
281 else if (clname == "int16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
282 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
|
283 else if (clname == "int32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
284 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
|
285 else if (clname == "int64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
286 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
|
287 else if (clname == "uint8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
288 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
|
289 else if (clname == "uint16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
290 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
|
291 else if (clname == "uint32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
292 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
|
293 else if (clname == "uint64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
294 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
|
295 else if (clname == "cell") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
296 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
|
297 else if (clname == "struct") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
298 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
299 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
|
300 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
|
301 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
|
302 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
303 octave_scalar_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
304 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
305 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
306 else |
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 octave_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
309 if (fn.numel () == 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
310 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
311 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
|
312 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
313 else |
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 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
|
316 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
317 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
|
318 (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
|
319 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
320 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
321 retval = out; |
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 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
324 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
|
325 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
326 warning ("perms: unable to permute for class %s", clname.c_str ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
327 // retval stays empty |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
328 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
329 return ovl (retval); |
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 |
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 %!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
|
335 %!assert (perms (pi), pi) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
336 %!assert (perms ([pi, e]), [pi, e; e, pi]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
337 %!assert (perms ([1,2,3]), [3,2,1;3,1,2;2,3,1;2,1,3;1,3,2;1,2,3]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
338 %!assert (perms (1:5), perms ([2 5 4 1 3]')) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
339 %!assert (perms ("abc"), char ("cba", "cab", "bca", "bac", "acb", "abc")) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
340 %!assert (perms ("fobar"), sortrows (unique (perms ("fobar"), "rows"), -(1:5))) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
341 %!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
|
342 %!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
|
343 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
344 %!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
|
345 %!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
|
346 %!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
|
347 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
348 ## 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
|
349 ## 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
|
350 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
351 %!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
|
352 %!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
|
353 %!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
|
354 %!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
|
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", "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
|
357 %!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
|
358 %! |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
359 %!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
|
360 %!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
|
361 %! 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
|
362 %!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
|
363 %! 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
|
364 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
365 ## 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
|
366 ## not their values. |
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 %!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
|
369 %!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
|
370 %!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
|
371 %! 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
|
372 %!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
|
373 %! 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
|
374 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
375 %!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
|
376 %!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
|
377 %!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
|
378 %!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
|
379 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
380 %!test <*52432> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
381 %! s = struct (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
382 %! s(1) = []; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
383 %! 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
|
384 %! 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
|
385 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
386 ## 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
|
387 %!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
|
388 %!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
|
389 %! {"bar", "foo", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
390 %! "foo", "bar", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
391 %! "foo", "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
392 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
393 ## Test input validation |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
394 %!error <Invalid call> perms () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
395 %!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
|
396 %!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
|
397 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
398 */ |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
399 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
400 OCTAVE_END_NAMESPACE (octave) |