# HG changeset patch # User jwe # Date 1155936424 0 # Node ID c038c2947ee112038bc71ee3846a64bd9412bbb0 # Parent a02a305e06ee8f5a308bdb9bb72700f934b3fafe [project @ 2006-08-18 21:27:03 by jwe] diff -r a02a305e06ee -r c038c2947ee1 liboctave/ChangeLog --- a/liboctave/ChangeLog Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/ChangeLog Fri Aug 18 21:27:04 2006 +0000 @@ -1,5 +1,13 @@ 2006-08-18 John W. Eaton + * dMatrix.cc (Matrix::any_element_not_one_or_zero): New function. + * dMatrix.h: Provide decl. + * dNDArray.cc (NDArray::any_element_not_one_or_zero): New function. + * dNDArray.h: Provide decl. + * intNDArray.cc (intNDArray::any_element_not_one_or_zero): + New function. + * intNDArray.h: Provide decl. + * Array.cc (Array::permute): Only rearrange values if array is not empty. diff -r a02a305e06ee -r c038c2947ee1 liboctave/dMatrix.cc --- a/liboctave/dMatrix.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/dMatrix.cc Fri Aug 18 21:27:04 2006 +0000 @@ -2432,6 +2432,21 @@ } bool +Matrix::any_element_not_one_or_zero (void) const +{ + octave_idx_type nel = nelem (); + + for (octave_idx_type i = 0; i < nel; i++) + { + double val = elem (i); + if (val != 0 && val != 1) + return true; + } + + return false; +} + +bool Matrix::all_elements_are_int_or_inf_or_nan (void) const { octave_idx_type nel = nelem (); diff -r a02a305e06ee -r c038c2947ee1 liboctave/dMatrix.h --- a/liboctave/dMatrix.h Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/dMatrix.h Fri Aug 18 21:27:04 2006 +0000 @@ -242,6 +242,7 @@ bool any_element_is_negative (bool = false) const; bool any_element_is_inf_or_nan (void) const; + bool any_element_not_one_or_zero (void) const; bool all_elements_are_int_or_inf_or_nan (void) const; bool all_integers (double& max_val, double& min_val) const; bool too_large_for_float (void) const; diff -r a02a305e06ee -r c038c2947ee1 liboctave/dNDArray.cc --- a/liboctave/dNDArray.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/dNDArray.cc Fri Aug 18 21:27:04 2006 +0000 @@ -531,6 +531,21 @@ } bool +NDArray::any_element_not_one_or_zero (void) const +{ + octave_idx_type nel = nelem (); + + for (octave_idx_type i = 0; i < nel; i++) + { + double val = elem (i); + if (val != 0 && val != 1) + return true; + } + + return false; +} + +bool NDArray::all_elements_are_int_or_inf_or_nan (void) const { octave_idx_type nel = nelem (); diff -r a02a305e06ee -r c038c2947ee1 liboctave/dNDArray.h --- a/liboctave/dNDArray.h Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/dNDArray.h Fri Aug 18 21:27:04 2006 +0000 @@ -64,6 +64,7 @@ bool any_element_is_negative (bool = false) const; bool any_element_is_inf_or_nan (void) const; + bool any_element_not_one_or_zero (void) const; bool all_elements_are_int_or_inf_or_nan (void) const; bool all_integers (double& max_val, double& min_val) const; bool too_large_for_float (void) const; diff -r a02a305e06ee -r c038c2947ee1 liboctave/intNDArray.cc --- a/liboctave/intNDArray.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/intNDArray.cc Fri Aug 18 21:27:04 2006 +0000 @@ -44,6 +44,23 @@ return b; } +template +bool +intNDArray::any_element_not_one_or_zero (void) const +{ + octave_idx_type nel = this->nelem (); + + for (octave_idx_type i = 0; i < nel; i++) + { + T val = this->elem (i); + + if (val != 0.0 && val != 1.0) + return true; + } + + return false; +} + // FIXME -- this is not quite the right thing. template diff -r a02a305e06ee -r c038c2947ee1 liboctave/intNDArray.h --- a/liboctave/intNDArray.h Fri Aug 18 18:57:06 2006 +0000 +++ b/liboctave/intNDArray.h Fri Aug 18 21:27:04 2006 +0000 @@ -62,6 +62,8 @@ boolNDArray operator ! (void) const; + bool any_element_not_one_or_zero (void) const; + // FIXME -- this is not quite the right thing. boolNDArray all (int dim = -1) const; diff -r a02a305e06ee -r c038c2947ee1 src/ChangeLog --- a/src/ChangeLog Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ChangeLog Fri Aug 18 21:27:04 2006 +0000 @@ -1,3 +1,25 @@ +2006-08-18 John W. Eaton + + * gripes.cc (gripe_logical_conversion): New function. + * gripes.h: Provide decl. + * ov.h (octave_value::bool_value, octave_value::bool_matrix_value, + octave_value::bool_array_value): New arg, warn. + * ov-base.cc, ov-base.h (octave_base_value::bool_value, + octave_base_value::bool_matrix_value, + octave_base_value::bool_array_value): Likewise. + * ov-intx.h (OCTAVE_VALUE_INT_MATRIX_T::bool_array_value, + OCTAVE_VALUE_INT_SCALAR_T::bool_array_value): Likewise. + * ov-range.h (octave_range::bool_array_value): Likewise. + * ov-re-mat.cc, ov-re-mat.h (octave_matrix::bool_array_value): + Likewise. + * ov-re-sparse.cc, ov-re-sparse.h + (octave_sparse_matrix::bool_array_value): Likewise. + * ov-scalar.h (octave_scalar::bool_value, + octave_scalar::bool_array_value): Likewise. + * OPERATORS/op-bm-b.cc (oct_assignop_conv_and_assign): + Ask for warning from bool_array_value. + * OPERATORS/op-bm-bm.cc (oct_assignop_conv_and_assign): Likewise. + 2006-08-18 Benjamin Lindner * ls-mat5.cc (read_mat5_tag): Declare type as int32_t, not int. diff -r a02a305e06ee -r c038c2947ee1 src/OPERATORS/op-bm-b.cc --- a/src/OPERATORS/op-bm-b.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/OPERATORS/op-bm-b.cc Fri Aug 18 21:27:04 2006 +0000 @@ -67,7 +67,7 @@ // FIXME -- perhaps add a warning for this conversion if the values // are not all 0 or 1? - boolNDArray v2 = a2.bool_array_value (); + boolNDArray v2 = a2.bool_array_value (true); if (! error_state) v1.assign (idx, v2); diff -r a02a305e06ee -r c038c2947ee1 src/OPERATORS/op-bm-bm.cc --- a/src/OPERATORS/op-bm-bm.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/OPERATORS/op-bm-bm.cc Fri Aug 18 21:27:04 2006 +0000 @@ -92,7 +92,7 @@ // FIXME -- perhaps add a warning for this conversion if the values // are not all 0 or 1? - boolNDArray v2 = a2.bool_array_value (); + boolNDArray v2 = a2.bool_array_value (true); if (! error_state) v1.assign (idx, v2); diff -r a02a305e06ee -r c038c2947ee1 src/gripes.cc --- a/src/gripes.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/gripes.cc Fri Aug 18 21:27:04 2006 +0000 @@ -184,6 +184,13 @@ warning_with_id ("Octave:divide-by-zero", "division by zero"); } +extern void +gripe_logical_conversion (void) +{ + warning_with_id ("Octave:logical-conversion", + "value not equal to 1 or 0 converted to logical 1"); +} + /* ;;; Local Variables: *** ;;; mode: C++ *** diff -r a02a305e06ee -r c038c2947ee1 src/gripes.h --- a/src/gripes.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/gripes.h Fri Aug 18 21:27:04 2006 +0000 @@ -103,6 +103,9 @@ extern void gripe_divide_by_zero (void); +extern void +gripe_logical_conversion (void); + #endif /* diff -r a02a305e06ee -r c038c2947ee1 src/ov-base.cc --- a/src/ov-base.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-base.cc Fri Aug 18 21:27:04 2006 +0000 @@ -480,7 +480,7 @@ } bool -octave_base_value::bool_value (void) const +octave_base_value::bool_value (bool) const { bool retval = false; gripe_wrong_type_arg ("octave_base_value::bool_value()", type_name ()); @@ -488,7 +488,7 @@ } boolMatrix -octave_base_value::bool_matrix_value (void) const +octave_base_value::bool_matrix_value (bool) const { boolMatrix retval; gripe_wrong_type_arg ("octave_base_value::bool_matrix_value()", @@ -497,7 +497,7 @@ } boolNDArray -octave_base_value::bool_array_value (void) const +octave_base_value::bool_array_value (bool) const { boolNDArray retval; gripe_wrong_type_arg ("octave_base_value::bool_array_value()", diff -r a02a305e06ee -r c038c2947ee1 src/ov-base.h --- a/src/ov-base.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-base.h Fri Aug 18 21:27:04 2006 +0000 @@ -319,11 +319,11 @@ virtual ComplexNDArray complex_array_value (bool = false) const; - virtual bool bool_value (void) const; + virtual bool bool_value (bool = false) const; - virtual boolMatrix bool_matrix_value (void) const; + virtual boolMatrix bool_matrix_value (bool = false) const; - virtual boolNDArray bool_array_value (void) const; + virtual boolNDArray bool_array_value (bool = false) const; virtual charMatrix char_matrix_value (bool force = false) const; diff -r a02a305e06ee -r c038c2947ee1 src/ov-intx.h --- a/src/ov-intx.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-intx.h Fri Aug 18 21:27:04 2006 +0000 @@ -126,12 +126,15 @@ } boolNDArray - bool_array_value (void) const + bool_array_value (bool warn = false) const { boolNDArray retval (dims ()); octave_idx_type nel = numel (); - + + if (warn && matrix.any_element_not_one_or_zero ()) + gripe_logical_conversion (); + for (octave_idx_type i = 0; i < nel; i++) retval(i) = static_cast(matrix(i)); @@ -331,10 +334,15 @@ } boolNDArray - bool_array_value (void) const + bool_array_value (bool warn = false) const { boolNDArray retval (dim_vector (1, 1)); + + if (warn && scalar != 0.0 && scalar != 1.0) + gripe_logical_conversion (); + retval(0) = static_cast(scalar); + return retval; } diff -r a02a305e06ee -r c038c2947ee1 src/ov-range.h --- a/src/ov-range.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-range.h Fri Aug 18 21:27:04 2006 +0000 @@ -160,8 +160,15 @@ Complex complex_value (bool = false) const; - boolNDArray bool_array_value (void) const - { return boolNDArray (range.matrix_value ()); } + boolNDArray bool_array_value (bool warn = false) const + { + Matrix m = range.matrix_value (); + + if (warn && m.any_element_not_one_or_zero ()) + gripe_logical_conversion (); + + return boolNDArray (m); + } ComplexMatrix complex_matrix_value (bool = false) const { return ComplexMatrix (range.matrix_value ()); } diff -r a02a305e06ee -r c038c2947ee1 src/ov-re-mat.cc --- a/src/ov-re-mat.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-re-mat.cc Fri Aug 18 21:27:04 2006 +0000 @@ -146,8 +146,11 @@ } boolNDArray -octave_matrix::bool_array_value (void) const +octave_matrix::bool_array_value (bool warn) const { + if (warn && matrix.any_element_not_one_or_zero ()) + gripe_logical_conversion (); + return boolNDArray (matrix); } diff -r a02a305e06ee -r c038c2947ee1 src/ov-re-mat.h --- a/src/ov-re-mat.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-re-mat.h Fri Aug 18 21:27:04 2006 +0000 @@ -135,7 +135,7 @@ ComplexNDArray complex_array_value (bool = false) const; - boolNDArray bool_array_value (void) const; + boolNDArray bool_array_value (bool warn = false) const; charNDArray char_array_value (bool = false) const; diff -r a02a305e06ee -r c038c2947ee1 src/ov-re-sparse.cc --- a/src/ov-re-sparse.cc Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-re-sparse.cc Fri Aug 18 21:27:04 2006 +0000 @@ -137,9 +137,14 @@ } boolNDArray -octave_sparse_matrix::bool_array_value (void) const +octave_sparse_matrix::bool_array_value (bool warn) const { - return boolNDArray (matrix.matrix_value ()); + NDArray m = matrix.matrix_value (); + + if (warn && m.any_element_not_one_or_zero ()) + gripe_logical_conversion (); + + return boolNDArray (m); } ComplexMatrix diff -r a02a305e06ee -r c038c2947ee1 src/ov-re-sparse.h --- a/src/ov-re-sparse.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-re-sparse.h Fri Aug 18 21:27:04 2006 +0000 @@ -101,7 +101,7 @@ Complex complex_value (bool = false) const; - boolNDArray bool_array_value (void) const; + boolNDArray bool_array_value (bool warn = false) const; ComplexMatrix complex_matrix_value (bool = false) const; diff -r a02a305e06ee -r c038c2947ee1 src/ov-scalar.h --- a/src/ov-scalar.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov-scalar.h Fri Aug 18 21:27:04 2006 +0000 @@ -36,6 +36,7 @@ #include "oct-alloc.h" #include "str-vec.h" +#include "gripes.h" #include "ov-base.h" #include "ov-re-mat.h" #include "ov-base-scalar.h" @@ -159,10 +160,21 @@ return retval; } - bool bool_value (void) const { return scalar; } + bool bool_value (bool warn = false) const + { + if (warn && scalar != 0 && scalar != 1) + gripe_logical_conversion (); + + return scalar; + } - boolNDArray bool_array_value (void) const - { return boolNDArray (dim_vector (1, 1), scalar); } + boolNDArray bool_array_value (bool warn = false) const + { + if (warn && scalar != 0 && scalar != 1) + gripe_logical_conversion (); + + return boolNDArray (dim_vector (1, 1), scalar); + } std::streamoff streamoff_value (void) const; diff -r a02a305e06ee -r c038c2947ee1 src/ov.h --- a/src/ov.h Fri Aug 18 18:57:06 2006 +0000 +++ b/src/ov.h Fri Aug 18 21:27:04 2006 +0000 @@ -591,14 +591,14 @@ ComplexNDArray complex_array_value (bool frc_str_conv = false) const { return rep->complex_array_value (frc_str_conv); } - bool bool_value (void) const - { return rep->bool_value (); } + bool bool_value (bool warn = false) const + { return rep->bool_value (warn); } - boolMatrix bool_matrix_value (void) const - { return rep->bool_matrix_value (); } + boolMatrix bool_matrix_value (bool warn = false) const + { return rep->bool_matrix_value (warn); } - boolNDArray bool_array_value (void) const - { return rep->bool_array_value (); } + boolNDArray bool_array_value (bool warn = false) const + { return rep->bool_array_value (warn); } charMatrix char_matrix_value (bool frc_str_conv = false) const { return rep->char_matrix_value (frc_str_conv); }