#!/usr/bin/python -tt #======================================================================= # General Documentation """Single public function module. See function docstring for description. """ #----------------------------------------------------------------------- # Additional Documentation # # RCS Revision Code: # \$Id: is_monotonic_incr.py,v 1.1 2004/04/28 00:28:15 jlin Exp \$ # # Modification History: # - 27 Apr 2004: Original by Johnny Lin, Computation Institute, # University of Chicago. Passed reasonable tests. # # Notes: # - Written for Python 2.2.2. # - Module docstrings can be tested using the doctest module. To # test, execute "python is_monotonic_incr.py". # - See import statements throughout for packages/modules required. # # Copyright (c) 2004 by Johnny Lin. For licensing, distribution # conditions, contact information, and additional documentation see # the URL http://www.johnny-lin.com/py_pkgs/gemath/doc/. #======================================================================= #----------------------- Overall Module Imports ------------------------ #- Set module version to package version: import gemath_version __version__ = gemath_version.version __author__ = gemath_version.author __date__ = gemath_version.date __credits__ = gemath_version.credits del gemath_version #--------------------------- General Function -------------------------- def is_monotonic_incr(x): """Check if x is monotonically increasing. Returns 1 if x is monotonically increasing and 0 if not. If x is floating point, safe comparisons are used in the algorithm to determine whether x is monotonically increasing; if x is integer, exact comparison is used. Positional Input Arguments: * x: Rank 1 list, tuple, or Numeric array of any numerical type. Must be greater than 1-element long. Keyword Input Arguments: None. Examples: >>> import Numeric as N >>> from is_monotonic_incr import is_monotonic_incr >>> x = [20., -32., -1., 2., 5., 29.] >>> is_monotonic_incr(x) 0 >>> x = (-32., -1., 2., 5., 29.) >>> is_monotonic_incr(x) 1 >>> x = N.array([4, 6, 7, 9]) >>> is_monotonic_incr(x) 1 Note: Because of the limits of floating point, even safe-compar- isons will not always return the correct answer. Thus, in the first example below, the correct answer is returned, but in the second example, the incorrect answer is returned: >>> x = N.array([1.0000001, 1.0000002, 1.0000003]) >>> is_monotonic_incr(x) 1 >>> x = N.array([1.00000001, 1.00000002, 1.00000003]) >>> is_monotonic_incr(x) 0 """ import MA import Numeric as N from where_close import where_close abs = N.absolute #- Make sure input locally is Numeric type: xN = N.array(x) #- Check rank and array size: if N.rank(xN) != 1: raise ValueError, "is_monotonic_incr: Input not rank 1" if N.size(xN) < 2: raise ValueError, "is_monotonic_incr: Input one element" #- If is monotonically increasing, all elements of tmp should be # positive, and no element of tmp should equal 0: tmp = xN[1:] - xN[0:-1] if MA.maximum( where_close(tmp, 0) ) == 1: return 0 if MA.minimum( where_close(tmp, abs(tmp)) ) == 0: return 0 return 1 #-------------------------- Main: Test Module ------------------------- #- Define additional examples for doctest to use: __test__ = { 'Additional Examples': """ >>> import Numeric as N >>> from is_monotonic_incr import is_monotonic_incr >>> x = [-32., -1., 2., 5., 29.] >>> is_monotonic_incr(x) 1 >>> x = N.array([[1,2,4],[53,3,2]]) >>> is_monotonic_incr(x) Traceback (most recent call last): ... ValueError: is_monotonic_incr: Input not rank 1 >>> x = N.array([2.]) >>> is_monotonic_incr(x) Traceback (most recent call last): ... ValueError: is_monotonic_incr: Input one element >>> x = N.array([1.00001, 1.00002, 1.00003]) >>> is_monotonic_incr(x) 1 >>> x = N.array([1.00001, 1.00000, 1.00003]) >>> is_monotonic_incr(x) 0 >>> x = N.arange(14) >>> is_monotonic_incr(x) 1 >>> x = N.array([3, -4, 1, 6]) >>> is_monotonic_incr(x) 0 >>> x = (3, -4, 1, 6) >>> is_monotonic_incr(x) 0 >>> x = (-3, 1, 6) >>> is_monotonic_incr(x) 1 >>> x = (-3, 1, 6, 8.) >>> is_monotonic_incr(x) 1 >>> x = [-3, -3, 6, 8] >>> is_monotonic_incr(x) 0 >>> x = [-3., -3., 6., 8.] >>> is_monotonic_incr(x) 0 """ } #- Execute doctest if module is run from command line: if __name__ == "__main__": """Test the module. Tests the examples in all the module documentation strings, plus __test__. Note: To help ensure that module testing of this file works, the parent directory to the current directory is added to sys.path. """ import doctest, sys, os sys.path.append(os.pardir) doctest.testmod(sys.modules[__name__]) # ===== end file =====