Mercurial > octave
annotate libinterp/corefcn/perms.cc @ 32589:05b4479c29d8 stable
maint: C++ style check for libinterp/ before 9.1 release.
* libinterp/corefcn/__ichol__.cc, libinterp/corefcn/__ilu__.cc,
libinterp/corefcn/bsxfun.cc, libinterp/corefcn/call-stack.cc,
libinterp/corefcn/defaults.cc, libinterp/corefcn/environment.cc,
libinterp/corefcn/error.cc, libinterp/corefcn/event-manager.cc,
libinterp/corefcn/ft-text-renderer.cc, libinterp/corefcn/gl-render.cc,
libinterp/corefcn/graphics-utils.cc, libinterp/corefcn/graphics.cc,
libinterp/corefcn/graphics.in.h, libinterp/corefcn/help.cc,
libinterp/corefcn/hook-fcn.cc, libinterp/corefcn/input.cc,
libinterp/corefcn/interpreter-private.cc, libinterp/corefcn/interpreter.cc,
libinterp/corefcn/load-path.cc, libinterp/corefcn/load-save.cc,
libinterp/corefcn/ls-hdf5.cc, libinterp/corefcn/lu.cc,
libinterp/corefcn/mex.cc, libinterp/corefcn/oct-hist.cc,
libinterp/corefcn/oct-map.cc, libinterp/corefcn/oct-stream.cc,
libinterp/corefcn/pager.cc, libinterp/corefcn/perms.cc,
libinterp/corefcn/pr-output.cc, libinterp/corefcn/qr.cc,
libinterp/corefcn/settings.cc, libinterp/corefcn/sparse-xdiv.cc,
libinterp/corefcn/stack-frame.cc, libinterp/corefcn/syminfo.cc,
libinterp/corefcn/symrcm.cc, libinterp/corefcn/symscope.cc,
libinterp/corefcn/symtab.cc, libinterp/corefcn/sysdep.cc,
libinterp/corefcn/tsearch.cc, libinterp/corefcn/url-handle-manager.cc,
libinterp/corefcn/utils.cc, libinterp/corefcn/xnorm.cc,
libinterp/dldfcn/__init_fltk__.cc, libinterp/octave-value/ov-base.cc,
libinterp/octave-value/ov-bool-mat.cc, libinterp/octave-value/ov-cell.cc,
libinterp/octave-value/ov-ch-mat.cc, libinterp/octave-value/ov-class.cc,
libinterp/octave-value/ov-classdef.cc, libinterp/octave-value/ov-fcn-handle.cc,
libinterp/octave-value/ov-fcn-handle.h, libinterp/octave-value/ov-fcn.h,
libinterp/octave-value/ov-inline.h, libinterp/octave-value/ov-lazy-idx.cc,
libinterp/octave-value/ov-range.cc, libinterp/octave-value/ov-range.h,
libinterp/octave-value/ov-typeinfo.cc, libinterp/octave-value/ov-usr-fcn.cc,
libinterp/octave-value/ov.cc, libinterp/octave.cc,
libinterp/parse-tree/anon-fcn-validator.cc, libinterp/parse-tree/bp-table.cc,
libinterp/parse-tree/oct-lvalue.cc, libinterp/parse-tree/pt-classdef.cc,
libinterp/parse-tree/pt-colon.cc, libinterp/parse-tree/pt-eval.cc,
libinterp/parse-tree/pt-eval.h, libinterp/parse-tree/pt-tm-const.cc,
libinterp/parse-tree/pt-walk.cc:
C++ style check for libinterp/ before 9.1 release.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 12 Dec 2023 18:24:05 -0800 |
parents | dec46ae43231 |
children | 2e484f9f1f18 |
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> |
32589
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
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 |
32465
dec46ae43231
perms.cc: Replace new and delete[] with OCTAVE_LOCAL_BUFFER
Markus Mützel <markus.muetzel@gmx.de>
parents:
32458
diff
changeset
|
59 OCTAVE_LOCAL_BUFFER (int, myvidx, 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 |
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> |
32589
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
diff
changeset
|
126 GetPermsNoSort (const Array<T>& ar_in, bool uniq_v = false) |
31942
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 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
|
129 double nr = Factorial (m); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
130 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
131 // Setup index vector filled from 0..m-1 |
32465
dec46ae43231
perms.cc: Replace new and delete[] with OCTAVE_LOCAL_BUFFER
Markus Mützel <markus.muetzel@gmx.de>
parents:
32458
diff
changeset
|
132 OCTAVE_LOCAL_BUFFER (int, myvidx, m); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
133 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
|
134 myvidx[i] = i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
135 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
136 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
|
137 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
138 if (uniq_v) |
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 // 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
|
141 int N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
142 // 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
|
143 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
|
144 { |
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 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
|
146 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
147 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
|
148 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
149 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
|
150 N_el++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
151 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
152 else |
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 nr /= Factorial (N_el); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
155 N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
156 } |
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 nr /= Factorial (N_el); |
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 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
162 // 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
|
163 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
|
164 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
165 // Set up result array |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
170 // Do the actual job |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
171 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
|
172 do |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
173 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
174 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
|
175 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
|
176 i++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
177 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
178 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
|
179 |
31942
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 |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
189 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
|
190 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
|
191 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
|
192 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
|
193 @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
|
194 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
|
195 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
196 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
|
197 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
|
198 @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
|
199 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
200 Example 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
201 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
202 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
203 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
204 perms ([1, 2, 3]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
205 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
206 3 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
207 3 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
208 2 3 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
209 2 1 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
210 1 3 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
211 1 2 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
212 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
213 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
214 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
215 Example 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
216 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
217 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
218 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
219 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
|
220 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
221 2 2 1 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
222 2 1 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
223 2 1 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
224 1 2 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
225 1 2 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
226 1 1 2 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
227 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
228 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
229 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
230 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
|
231 @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
|
232 @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
|
233 @var{v}. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
234 @seealso{permute, randperm, nchoosek} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
235 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
236 @end deftypefn */) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
237 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
238 int nargin = args.length (); |
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 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
|
241 print_usage (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
242 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
243 octave_value retval; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
244 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
245 // Parameter check "unique" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
246 bool uniq_v = false; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
247 if (nargin == 2) |
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 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
|
250 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
|
251 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
|
252 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
253 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
|
254 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
255 uniq_v = true; |
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 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
258 if (! (args (0).is_matrix_type () || args (0).is_range () |
32589
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
diff
changeset
|
259 || args (0).iscell () || args (0).is_scalar_type () |
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
diff
changeset
|
260 || args (0).isstruct ())) |
31942
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 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
|
263 "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
|
264 } |
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 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
|
267 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
268 // 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
|
269 if (clname == "double") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
270 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
|
271 else if (clname == "single") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
272 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
|
273 else if (clname == "logical") |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
274 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
|
275 else if (clname == "char") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
276 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
|
277 else if (clname == "int8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
278 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
|
279 else if (clname == "int16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
280 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
|
281 else if (clname == "int32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
282 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
|
283 else if (clname == "int64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
284 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
|
285 else if (clname == "uint8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
286 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
|
287 else if (clname == "uint16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
288 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
|
289 else if (clname == "uint32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
290 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
|
291 else if (clname == "uint64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
292 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
|
293 else if (clname == "cell") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
294 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
|
295 else if (clname == "struct") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
296 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
297 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
|
298 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
|
299 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
|
300 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
301 octave_scalar_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
302 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
303 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
304 else |
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 octave_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
307 if (fn.numel () == 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
308 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
309 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
|
310 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
311 else |
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 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
|
314 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
315 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
|
316 (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
|
317 } |
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 retval = out; |
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 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
322 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
|
323 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
324 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
|
325 // retval stays empty |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
326 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
327 return ovl (retval); |
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 |
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 %!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
|
333 %!assert (perms (pi), pi) |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
334 %!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
|
335 %!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
|
336 %!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
|
337 %!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
|
338 %!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
|
339 %!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
|
340 %!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
|
341 %!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
|
342 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
343 %!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
|
344 %!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
|
345 %!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
|
346 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
347 ## 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
|
348 ## 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
|
349 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
350 %!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
|
351 %!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
|
352 %!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
|
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 ({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
|
355 %!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
|
356 %!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
|
357 %! |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
358 %!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
|
359 %!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
|
360 %! 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
|
361 %!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
|
362 %! 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
|
363 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
364 ## 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
|
365 ## not their values. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
366 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
367 %!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
|
368 %!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
|
369 %!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
|
370 %! 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
|
371 %!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
|
372 %! 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
|
373 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
374 %!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
|
375 %!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
|
376 %!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
|
377 %!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
|
378 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
379 %!test <*52432> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
380 %! s = struct (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
381 %! s(1) = []; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
382 %! 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
|
383 %! 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
|
384 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
385 ## 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
|
386 %!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
|
387 %!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
|
388 %! {"bar", "foo", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
389 %! "foo", "bar", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
390 %! "foo", "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
391 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
392 ## Test input validation |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
393 %!error <Invalid call> perms () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
394 %!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
|
395 %!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
|
396 |
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 OCTAVE_END_NAMESPACE (octave) |