annotate libinterp/corefcn/lookup.cc @ 20939:b17fda023ca6

maint: Use new C++ archetype in more files. Place input validation first in files. Move declaration of retval down in function to be closer to point of usage. Eliminate else clause after if () error. Use "return ovl()" where it makes sense. * find.cc, gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, givens.cc, graphics.cc, help.cc, hess.cc, hex2num.cc, input.cc, kron.cc, load-path.cc, load-save.cc, lookup.cc, mappers.cc, matrix_type.cc, mgorth.cc, nproc.cc, ordschur.cc, pager.cc, pinv.cc, pr-output.cc, profiler.cc, psi.cc, quad.cc, rcond.cc, regexp.cc, schur.cc, sighandlers.cc, sparse.cc, str2double.cc, strfind.cc, strfns.cc, sub2ind.cc, svd.cc, sylvester.cc, symtab.cc, syscalls.cc, sysdep.cc, time.cc, toplev.cc, tril.cc, tsearch.cc, typecast.cc, urlwrite.cc, utils.cc, variables.cc, __delaunayn__.cc, __eigs__.cc, __glpk__.cc, __magick_read__.cc, __osmesa_print__.cc, __voronoi__.cc, amd.cc, audiodevinfo.cc, audioread.cc, chol.cc, colamd.cc, dmperm.cc, fftw.cc, qr.cc, symbfact.cc, symrcm.cc, ov-bool-mat.cc, ov-cell.cc, ov-class.cc, ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov-flt-re-mat.cc, ov-java.cc, ov-null-mat.cc, ov-oncleanup.cc, ov-re-mat.cc, ov-struct.cc, ov-typeinfo.cc, ov-usr-fcn.cc, ov.cc, octave.cc: Use new C++ archetype in more files.
author Rik <rik@octave.org>
date Fri, 18 Dec 2015 15:37:22 -0800
parents 1142cf6abc0d
children 48b2ad5ee801
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
1 /*
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
2
19697
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 18100
diff changeset
3 Copyright (C) 2008-2015 VZLU Prague a.s., Czech Republic
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
4
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
5 This file is part of Octave.
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
6
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
9 the Free Software Foundation; either version 3 of the License, or (at
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
10 your option) any later version.
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
11
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
15 General Public License for more details.
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
16
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
20
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
21 */
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
22
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
23 // Author: Jaroslav Hajek <highegg@gmail.com>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
24
10039
1e306aa51d6c Include config.h before another header file.
Thomas Treichl
parents: 9923
diff changeset
25 #ifdef HAVE_CONFIG_H
1e306aa51d6c Include config.h before another header file.
Thomas Treichl
parents: 9923
diff changeset
26 #include <config.h>
1e306aa51d6c Include config.h before another header file.
Thomas Treichl
parents: 9923
diff changeset
27 #endif
1e306aa51d6c Include config.h before another header file.
Thomas Treichl
parents: 9923
diff changeset
28
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
29 #include <cctype>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
30 #include <functional>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
31 #include <algorithm>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
32
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
33 #include "dNDArray.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
34 #include "CNDArray.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
35
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
36 #include "Cell.h"
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14846
diff changeset
37 #include "defun.h"
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
38 #include "error.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
39 #include "gripes.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
40 #include "oct-obj.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
41 #include "ov.h"
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
42
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
43 static
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
44 bool
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
45 contains_char (const std::string& str, char c)
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
46 {
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
47 return (str.find (c) != std::string::npos
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 10076
diff changeset
48 || str.find (std::toupper (c)) != std::string::npos);
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
49 }
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
50
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
51 // case-insensitive character comparison functors
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
52 struct icmp_char_lt : public std::binary_function<char, char, bool>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
53 {
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
54 bool operator () (char x, char y) const
19861
19755f4fc851 maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 19697
diff changeset
55 { return std::toupper (x) < std::toupper (y); }
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
56 };
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
57
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
58 struct icmp_char_gt : public std::binary_function<char, char, bool>
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
59 {
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
60 bool operator () (char x, char y) const
19861
19755f4fc851 maint: Cleanup C++ code to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 19697
diff changeset
61 { return std::toupper (x) > std::toupper (y); }
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
62 };
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
63
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
64 // FIXME: maybe these should go elsewhere?
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
65 // FIXME: are they even needed now?
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
66 // case-insensitive ascending comparator
10076
4b270d1540f7 avoid various GCC warnings
John W. Eaton <jwe@octave.org>
parents: 10039
diff changeset
67 #if 0
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
68 static bool
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
69 stri_comp_lt (const std::string& a, const std::string& b)
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
70 {
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
71 return std::lexicographical_compare (a.begin (), a.end (),
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
72 b.begin (), b.end (),
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14501
diff changeset
73 icmp_char_lt ());
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
74 }
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
75
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
76 // case-insensitive descending comparator
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
77 static bool
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
78 stri_comp_gt (const std::string& a, const std::string& b)
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
79 {
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
80 return std::lexicographical_compare (a.begin (), a.end (),
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
81 b.begin (), b.end (),
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14501
diff changeset
82 icmp_char_gt ());
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
83 }
10076
4b270d1540f7 avoid various GCC warnings
John W. Eaton <jwe@octave.org>
parents: 10039
diff changeset
84 #endif
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
85
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
86 template <class T>
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
87 inline sortmode
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
88 get_sort_mode (const Array<T>& array,
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
89 typename octave_sort<T>::compare_fcn_type desc_comp
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
90 = octave_sort<T>::descending_compare)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
91 {
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
92 octave_idx_type n = array.numel ();
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
93 if (n > 1 && desc_comp (array (0), array (n-1)))
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
94 return DESCENDING;
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
95 else
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
96 return ASCENDING;
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
97 }
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
98
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
99 // FIXME: perhaps there should be octave_value::lookup?
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
100 // The question is, how should it behave w.r.t. the second argument's type.
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
101 // We'd need a dispatch on two arguments. Hmmm...
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
102
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
103 #define INT_ARRAY_LOOKUP(TYPE) \
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
104 (table.is_ ## TYPE ## _type () && y.is_ ## TYPE ## _type ()) \
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
105 retval = do_numeric_lookup (table.TYPE ## _array_value (), \
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
106 y.TYPE ## _array_value (), \
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
107 left_inf, right_inf, \
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
108 match_idx, match_bool);
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
109 template <class ArrayT>
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
110 static octave_value
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
111 do_numeric_lookup (const ArrayT& array, const ArrayT& values,
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
112 bool left_inf, bool right_inf,
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
113 bool match_idx, bool match_bool)
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
114 {
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
115 octave_value retval;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
116
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
117 Array<octave_idx_type> idx = array.lookup (values);
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
118 octave_idx_type n = array.numel ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
119 octave_idx_type nval = values.numel ();
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
120
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
121 // Post-process.
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
122 if (match_bool)
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
123 {
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
124 boolNDArray match (idx.dims ());
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
125 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
126 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
127 octave_idx_type j = idx.xelem (i);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
128 match.xelem (i) = j != 0 && values(i) == array(j-1);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
129 }
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
130
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
131 retval = match;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
132 }
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
133 else if (match_idx || left_inf || right_inf)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
134 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
135 if (match_idx)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
136 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
137 NDArray ridx (idx.dims ());
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
138
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
139 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
140 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
141 octave_idx_type j = idx.xelem (i);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
142 ridx.xelem (i) = (j != 0 && values(i) == array(j-1)) ? j : 0;
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
143 }
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
144
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
145 retval = ridx;
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
146 }
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
147 else if (left_inf && right_inf)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
148 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
149 // Results in valid indices. Optimize using lazy index.
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
150 octave_idx_type zero = 0;
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
151 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
152 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
153 octave_idx_type j = idx.xelem (i) - 1;
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
154 idx.xelem (i) = std::max (zero, std::min (j, n-2));
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
155 }
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
156
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
157 retval = idx_vector (idx);
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
158 }
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
159 else if (left_inf)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
160 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
161 // Results in valid indices. Optimize using lazy index.
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
162 octave_idx_type zero = 0;
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
163 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
164 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
165 octave_idx_type j = idx.xelem (i) - 1;
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
166 idx.xelem (i) = std::max (zero, j);
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
167 }
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
168
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
169 retval = idx_vector (idx);
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
170 }
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
171 else if (right_inf)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
172 {
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
173 NDArray ridx (idx.dims ());
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
174
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
175 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
176 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
177 octave_idx_type j = idx.xelem (i);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
178 ridx.xelem (i) = std::min (j, n-1);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
179 }
10327
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
180
76cf6dd20f1a take advantage of lazy index optimization in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 10258
diff changeset
181 retval = ridx;
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
182 }
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
183 }
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
184 else
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
185 retval = idx;
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
186
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
187 return retval;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
188 }
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
189
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14846
diff changeset
190 DEFUN (lookup, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
191 "-*- texinfo -*-\n\
20853
1142cf6abc0d 2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents: 20802
diff changeset
192 @deftypefn {} {@var{idx} =} lookup (@var{table}, @var{y})\n\
1142cf6abc0d 2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents: 20802
diff changeset
193 @deftypefnx {} {@var{idx} =} lookup (@var{table}, @var{y}, @var{opt})\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
194 Lookup values in a sorted table.\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
195 \n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
196 This function is usually used as a prelude to interpolation.\n\
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
197 \n\
9366
25b52645de34 improve lookup's inline docs
Jaroslav Hajek <highegg@gmail.com>
parents: 9351
diff changeset
198 If table is increasing and @code{idx = lookup (table, y)}, then\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
199 @code{table(idx(i)) <= y(i) < table(idx(i+1))} for all @code{y(i)} within\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
200 the table. If @code{y(i) < table(1)} then @code{idx(i)} is 0. If\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
201 @code{y(i) >= table(end)} or @code{isnan (y(i))} then @code{idx(i)} is\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19861
diff changeset
202 @code{n}.\n\
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
203 \n\
9366
25b52645de34 improve lookup's inline docs
Jaroslav Hajek <highegg@gmail.com>
parents: 9351
diff changeset
204 If the table is decreasing, then the tests are reversed.\n\
25b52645de34 improve lookup's inline docs
Jaroslav Hajek <highegg@gmail.com>
parents: 9351
diff changeset
205 For non-strictly monotonic tables, empty intervals are always skipped.\n\
25b52645de34 improve lookup's inline docs
Jaroslav Hajek <highegg@gmail.com>
parents: 9351
diff changeset
206 The result is undefined if @var{table} is not monotonic, or if\n\
9730
dd4aa19c3053 update docstring of lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9366
diff changeset
207 @var{table} contains a NaN.\n\
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
208 \n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
209 The complexity of the lookup is O(M*log(N)) where N is the size of\n\
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
210 @var{table} and M is the size of @var{y}. In the special case when @var{y}\n\
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
211 is also sorted, the complexity is O(min(M*log(N),M+N)).\n\
8617
4b26e9fbbb37 fix lookup's docstring
Jaroslav Hajek <highegg@gmail.com>
parents: 7924
diff changeset
212 \n\
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
213 @var{table} and @var{y} can also be cell arrays of strings\n\
9064
7c02ec148a3c Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents: 8920
diff changeset
214 (or @var{y} can be a single string). In this case, string lookup\n\
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
215 is performed using lexicographical comparison.\n\
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
216 \n\
12639
4d777e05d47c doc: Review and update documentation for "Matrix Manipulation" chapter.
Rik <octave@nomad.inbox5.com>
parents: 11586
diff changeset
217 If @var{opts} is specified, it must be a string with letters indicating\n\
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
218 additional options.\n\
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
219 \n\
10687
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
220 @table @code\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
221 @item m\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
222 @code{table(idx(i)) == val(i)} if @code{val(i)}\n\
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
223 occurs in table; otherwise, @code{idx(i)} is zero.\n\
10840
89f4d7e294cc Grammarcheck .cc files
Rik <octave@nomad.inbox5.com>
parents: 10711
diff changeset
224 \n\
10687
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
225 @item b\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
226 @code{idx(i)} is a logical 1 or 0, indicating whether\n\
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
227 @code{val(i)} is contained in table or not.\n\
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
228 \n\
10687
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
229 @item l\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
230 For numeric lookups\n\
9064
7c02ec148a3c Check grammar on all .cc files
Rik <rdrider0-list@yahoo.com>
parents: 8920
diff changeset
231 the leftmost subinterval shall be extended to infinity (i.e., all indices\n\
10687
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
232 at least 1)\n\
10840
89f4d7e294cc Grammarcheck .cc files
Rik <octave@nomad.inbox5.com>
parents: 10711
diff changeset
233 \n\
10687
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
234 @item r\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
235 For numeric lookups\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
236 the rightmost subinterval shall be extended to infinity (i.e., all indices\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
237 at most n-1).\n\
a8ce6bdecce5 Improve documentation strings.
Rik <octave@nomad.inbox5.com>
parents: 10407
diff changeset
238 @end table\n\
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
239 @end deftypefn")
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
240 {
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
241 int nargin = args.length ();
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
242
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
243 if (nargin < 2 || nargin > 3)
20802
8bb38ba1bad6 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
244 print_usage ();
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
245
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
246 octave_value table = args(0);
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
247 octave_value y = args(1);
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
248 if (table.ndims () > 2 || (table.columns () > 1 && table.rows () > 1))
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
249 warning ("lookup: table is not a vector");
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
250
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
251 octave_value retval;
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
252
9344
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
253 bool num_case = ((table.is_numeric_type () && y.is_numeric_type ())
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
254 || (table.is_char_matrix () && y.is_char_matrix ()));
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
255 bool str_case = table.is_cellstr () && (y.is_string () || y.is_cellstr ());
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
256 bool left_inf = false;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
257 bool right_inf = false;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
258 bool match_idx = false;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
259 bool match_bool = false;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
260
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
261 if (nargin == 3)
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
262 {
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
263 std::string opt = args(2).xstring_value ("lookup: OPT must be a string");
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
264 left_inf = contains_char (opt, 'l');
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
265 right_inf = contains_char (opt, 'r');
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
266 match_idx = contains_char (opt, 'm');
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
267 match_bool = contains_char (opt, 'b');
11560
05b5bcdb09c8 validate opts in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 11553
diff changeset
268 if (opt.find_first_not_of ("lrmb") != std::string::npos)
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
269 error ("lookup: unrecognized option: %c",
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
270 opt[opt.find_first_not_of ("lrmb")]);
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
271 }
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
272
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
273 if ((match_idx || match_bool) && (left_inf || right_inf))
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
274 error ("lookup: m, b cannot be specified with l or r");
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
275 else if (match_idx && match_bool)
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
276 error ("lookup: only one of m or b can be specified");
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
277 else if (str_case && (left_inf || right_inf))
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
278 error ("lookup: l, r are not recognized for string lookups");
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
279
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
280 if (num_case)
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
281 {
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
282 // In the case of a complex array, absolute values will be used for
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
283 // compatibility (though it's not too meaningful).
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
284 if (table.is_complex_type ())
9813
8fa32b527d9a improve & partially revert previous change
Jaroslav Hajek <highegg@gmail.com>
parents: 9812
diff changeset
285 table = table.abs ();
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
286
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
287 if (y.is_complex_type ())
9813
8fa32b527d9a improve & partially revert previous change
Jaroslav Hajek <highegg@gmail.com>
parents: 9812
diff changeset
288 y = y.abs ();
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
289
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
290 Array<octave_idx_type> idx;
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
291
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
292 // PS: I learned this from data.cc
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
293 if INT_ARRAY_LOOKUP (int8)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
294 else if INT_ARRAY_LOOKUP (int16)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
295 else if INT_ARRAY_LOOKUP (int32)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
296 else if INT_ARRAY_LOOKUP (int64)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
297 else if INT_ARRAY_LOOKUP (uint8)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
298 else if INT_ARRAY_LOOKUP (uint16)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
299 else if INT_ARRAY_LOOKUP (uint32)
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
300 else if INT_ARRAY_LOOKUP (uint64)
9344
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
301 else if (table.is_char_matrix () && y.is_char_matrix ())
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
302 retval = do_numeric_lookup (table.char_array_value (),
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
303 y.char_array_value (),
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
304 left_inf, right_inf,
0c4e6a3d6e3e support char arrays in lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 9341
diff changeset
305 match_idx, match_bool);
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
306 else if (table.is_single_type () || y.is_single_type ())
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
307 retval = do_numeric_lookup (table.float_array_value (),
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
308 y.float_array_value (),
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
309 left_inf, right_inf,
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
310 match_idx, match_bool);
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7671
diff changeset
311 else
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
312 retval = do_numeric_lookup (table.array_value (),
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
313 y.array_value (),
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
314 left_inf, right_inf,
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
315 match_idx, match_bool);
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
316 }
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
317 else if (str_case)
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
318 {
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
319 Array<std::string> str_table = table.cellstr_value ();
11570
57632dea2446 attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents: 11560
diff changeset
320 Array<std::string> str_y (dim_vector (1, 1));
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
321
8814
de16ebeef93d improve lookup, provide Array<T>::lookup
Jaroslav Hajek <highegg@gmail.com>
parents: 8646
diff changeset
322 if (y.is_cellstr ())
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
323 str_y = y.cellstr_value ();
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
324 else
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
325 str_y(0) = y.string_value ();
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
326
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
327 Array<octave_idx_type> idx = str_table.lookup (str_y);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
328 octave_idx_type nval = str_y.numel ();
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
329
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
330 // Post-process.
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
331 if (match_bool)
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
332 {
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
333 boolNDArray match (idx.dims ());
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
334 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
335 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
336 octave_idx_type j = idx.xelem (i);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
337 match.xelem (i) = j != 0 && str_y(i) == str_table(j-1);
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
338 }
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
339
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
340 retval = match;
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
341 }
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
342 else if (match_idx)
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
343 {
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
344 NDArray ridx (idx.dims ());
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
345 if (match_idx)
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
346 {
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
347 for (octave_idx_type i = 0; i < nval; i++)
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
348 {
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
349 octave_idx_type j = idx.xelem (i);
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
350 ridx.xelem (i) = (j != 0 && str_y(i) == str_table(j-1)) ? j
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
351 : 0;
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
352 }
9341
9fd5c56ce57a extend lookup capabilities
Jaroslav Hajek <highegg@gmail.com>
parents: 9064
diff changeset
353 }
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
354
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
355 retval = ridx;
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
356 }
9921
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
357 else
7c8392a034e6 fix & improve lookup API
Jaroslav Hajek <highegg@gmail.com>
parents: 9813
diff changeset
358 retval = idx;
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
359 }
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
360 else
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
361 print_usage ();
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
362
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
363 return retval;
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
364 }
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
365
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
366 /*
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
367 %!assert (lookup (1:3, 0.5), 0) # value before table
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
368 %!assert (lookup (1:3, 3.5), 3) # value after table error
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
369 %!assert (lookup (1:3, 1.5), 1) # value within table error
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
370 %!assert (lookup (1:3, [3,2,1]), [3,2,1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
371 %!assert (lookup ([1:4]', [1.2, 3.5]'), [1, 3]')
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
372 %!assert (lookup ([1:4], [1.2, 3.5]'), [1, 3]')
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
373 %!assert (lookup ([1:4]', [1.2, 3.5]), [1, 3])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
374 %!assert (lookup ([1:4], [1.2, 3.5]), [1, 3])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
375 %!assert (lookup (1:3, [3, 2, 1]), [3, 2, 1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
376 %!assert (lookup ([3:-1:1], [3.5, 3, 1.2, 2.5, 2.5]), [0, 1, 2, 1, 1])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
377 %!assert (isempty (lookup ([1:3], [])))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
378 %!assert (isempty (lookup ([1:3]', [])))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
379 %!assert (lookup (1:3, [1, 2; 3, 0.5]), [1, 2; 3, 0])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
380 %!assert (lookup (1:4, [1, 1.2; 3, 2.5], "m"), [1, 0; 3, 0])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
381 %!assert (lookup (4:-1:1, [1, 1.2; 3, 2.5], "m"), [4, 0; 2, 0])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
382 %!assert (lookup (1:4, [1, 1.2; 3, 2.5], "b"), logical ([1, 0; 3, 0]))
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
383 %!assert (lookup (4:-1:1, [1, 1.2; 3, 2.5], "b"), logical ([4, 0; 2, 0]))
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
384 %!
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
385 %!assert (lookup ({"apple","lemon","orange"}, {"banana","kiwi"; "ananas","mango"}), [1,1;0,2])
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
386 %!assert (lookup ({"apple","lemon","orange"}, "potato"), 3)
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
387 %!assert (lookup ({"orange","lemon","apple"}, "potato"), 0)
7671
4fbaba9abec1 implement compiled binary lookup
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
388 */