# HG changeset patch # User Jaroslav Hajek # Date 1266391757 -3600 # Node ID 76cf6dd20f1acbe140ad2045ca7ecfe26dc98ff8 # Parent ade59ae10e80f1999ce51f3e3261c9daeb33bab1 take advantage of lazy index optimization in lookup diff -r ade59ae10e80 -r 76cf6dd20f1a src/ChangeLog --- a/src/ChangeLog Wed Feb 17 08:19:06 2010 +0100 +++ b/src/ChangeLog Wed Feb 17 08:29:17 2010 +0100 @@ -1,3 +1,8 @@ +2010-02-17 Jaroslav Hajek + + * DLD-FUNCTIONS/lookup.cc (do_numeric_lookup): Return an idx_vector + when left_inf is in effect, to enable lazy index optimization. + 2010-02-16 Jaroslav Hajek * ov-lazy-idx.h: New source. diff -r ade59ae10e80 -r 76cf6dd20f1a src/DLD-FUNCTIONS/lookup.cc --- a/src/DLD-FUNCTIONS/lookup.cc Wed Feb 17 08:19:06 2010 +0100 +++ b/src/DLD-FUNCTIONS/lookup.cc Wed Feb 17 08:29:17 2010 +0100 @@ -131,43 +131,54 @@ } else if (match_idx || left_inf || right_inf) { - NDArray ridx (idx.dims ()); if (match_idx) { + NDArray ridx (idx.dims ()); + for (octave_idx_type i = 0; i < nval; i++) { octave_idx_type j = idx.xelem (i); ridx.xelem (i) = (j != 0 && values(i) == array(j-1)) ? j : 0; } + + retval = ridx; } else if (left_inf && right_inf) { + // Results in valid indices. Optimize using lazy index. + octave_idx_type zero = 0; for (octave_idx_type i = 0; i < nval; i++) { - octave_idx_type one = 1; - octave_idx_type j = idx.xelem (i); - ridx.xelem (i) = std::min (std::max (one, j), n-1); + octave_idx_type j = idx.xelem (i) - 1; + idx.xelem (i) = std::max (zero, std::min (j, n-2)); } + + retval = idx_vector (idx); } else if (left_inf) { - octave_idx_type one = 1; + // Results in valid indices. Optimize using lazy index. + octave_idx_type zero = 0; for (octave_idx_type i = 0; i < nval; i++) { - octave_idx_type j = idx.xelem (i); - ridx.xelem (i) = std::max (one, j); + octave_idx_type j = idx.xelem (i) - 1; + idx.xelem (i) = std::max (zero, j); } + + retval = idx_vector (idx); } else if (right_inf) { + NDArray ridx (idx.dims ()); + for (octave_idx_type i = 0; i < nval; i++) { octave_idx_type j = idx.xelem (i); ridx.xelem (i) = std::min (j, n-1); } + + retval = ridx; } - - retval = ridx; } else retval = idx;