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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)