From numpy-svn at scipy.org Tue Sep 4 12:28:11 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Tue, 4 Sep 2007 11:28:11 -0500 (CDT) Subject: [Numpy-svn] r4026 - trunk/numpy/core Message-ID: <20070904162811.6608139C0E9@new.scipy.org> Author: oliphant Date: 2007-09-04 11:28:04 -0500 (Tue, 04 Sep 2007) New Revision: 4026 Modified: trunk/numpy/core/numerictypes.py Log: Add longcomplex and singlecomplex to the type namespace. Modified: trunk/numpy/core/numerictypes.py =================================================================== --- trunk/numpy/core/numerictypes.py 2007-08-31 11:28:36 UTC (rev 4025) +++ trunk/numpy/core/numerictypes.py 2007-09-04 16:28:04 UTC (rev 4026) @@ -61,9 +61,9 @@ | | float_ (double) | | longfloat | \-> complexfloating (complexxx) - | csingle + | csingle (singlecomplex) | complex_ (cfloat, cdouble) - | clongfloat + | clongfloat (longcomplex) +-> flexible | character | str_ (string_) @@ -250,6 +250,7 @@ ('int0', 'intp'), ('uint0', 'uintp'), ('single', 'float'), + ('singlecomplex', 'cfloat'), ('csingle', 'cfloat'), ('float_', 'double'), ('intc', 'int'), @@ -259,6 +260,7 @@ ('cfloat', 'cdouble'), ('longfloat', 'longdouble'), ('clongfloat', 'clongdouble'), + ('longcomplex', 'clongdouble'), ('bool_', 'bool'), ('unicode_', 'unicode'), ('str_', 'string'), From numpy-svn at scipy.org Sun Sep 9 00:44:16 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 8 Sep 2007 23:44:16 -0500 (CDT) Subject: [Numpy-svn] r4027 - in trunk/numpy: core random/mtrand Message-ID: <20070909044416.F3F0439C0FE@new.scipy.org> Author: oliphant Date: 2007-09-08 23:44:11 -0500 (Sat, 08 Sep 2007) New Revision: 4027 Modified: trunk/numpy/core/numerictypes.py trunk/numpy/random/mtrand/distributions.c Log: Fix Von Mises random number generation algorithm to match that of Python and R. Modified: trunk/numpy/core/numerictypes.py =================================================================== --- trunk/numpy/core/numerictypes.py 2007-09-04 16:28:04 UTC (rev 4026) +++ trunk/numpy/core/numerictypes.py 2007-09-09 04:44:11 UTC (rev 4027) @@ -250,8 +250,8 @@ ('int0', 'intp'), ('uint0', 'uintp'), ('single', 'float'), + ('csingle', 'cfloat'), ('singlecomplex', 'cfloat'), - ('csingle', 'cfloat'), ('float_', 'double'), ('intc', 'int'), ('uintc', 'uint'), Modified: trunk/numpy/random/mtrand/distributions.c =================================================================== --- trunk/numpy/random/mtrand/distributions.c 2007-09-04 16:28:04 UTC (rev 4026) +++ trunk/numpy/random/mtrand/distributions.c 2007-09-09 04:44:11 UTC (rev 4027) @@ -549,6 +549,12 @@ return X; } +/* Uses the rejection algorithm compared against the wrapped Cauchy + distribution suggested by Best and Fisher and documented in + Chapter 9 of Luc's Non-Uniform Random Variate Generation. + http://cg.scs.carleton.ca/~luc/rnbookindex.html + (but corrected to match the algorithm in R and Python) +*/ double rk_vonmises(rk_state *state, double mu, double kappa) { double r, rho, s; @@ -567,32 +573,27 @@ while (1) { - U = 2*rk_double(state) - 1; - V = 2*rk_double(state) - 1; + U = rk_double(state); Z = cos(M_PI*U); W = (1 + s*Z)/(s + Z); Y = kappa * (s - W); + V = rk_double(state); if ((Y*(2-Y) - V >= 0) || (log(Y/V)+1 - Y >= 0)) { break; } } - if (U < 0) + U = rk_double(state); + + result = acos(W); + if (U < 0.5) { - result = acos(W); + result = -result; } - else - { - result = -acos(W); - } - result += mu + M_PI; + result += mu; mod = fmod(result, 2*M_PI); - if (mod && (mod < 0)) - { - mod += 2*M_PI; - } - return mod - M_PI; + return mod; } } From numpy-svn at scipy.org Mon Sep 10 16:23:28 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Mon, 10 Sep 2007 15:23:28 -0500 (CDT) Subject: [Numpy-svn] r4028 - trunk/numpy/distutils/fcompiler Message-ID: <20070910202328.1B37239C33A@new.scipy.org> Author: cookedm Date: 2007-09-10 15:23:25 -0500 (Mon, 10 Sep 2007) New Revision: 4028 Modified: trunk/numpy/distutils/fcompiler/gnu.py Log: Add support for universal GCC Fortran compilers on OS X (#571) Modified: trunk/numpy/distutils/fcompiler/gnu.py =================================================================== --- trunk/numpy/distutils/fcompiler/gnu.py 2007-09-09 04:44:11 UTC (rev 4027) +++ trunk/numpy/distutils/fcompiler/gnu.py 2007-09-10 20:23:25 UTC (rev 4028) @@ -317,6 +317,51 @@ g2c = 'gfortran' + # Note that this is here instead of GnuFCompiler as gcc < 4 uses a + # different output format (which isn't as useful) than gcc >= 4, + # and we don't have to worry about g77 being universal (as it can't be). + def target_architecture(self, extra_opts=()): + """Return the architecture that the compiler will build for. + This is most useful for detecting universal compilers in OS X.""" + extra_opts = list(extra_opts) + status, output = exec_command(self.compiler_f90 + ['-v'] + extra_opts, + use_tee=False) + if status == 0: + m = re.match(r'(?m)^Target: (.*)$', output) + if m: + return m.group(1) + return None + + def is_universal_compiler(self): + """Return True if this compiler can compile universal binaries + (for OS X). + + Currently only checks for i686 and powerpc architectures (no 64-bit + support yet). + """ + if sys.platform != 'darwin': + return False + i686_arch = self.target_architecture(extra_opts=['-arch', 'i686']) + if not i686_arch or not i686_arch.startswith('i686-'): + return False + ppc_arch = self.target_architecture(extra_opts=['-arch', 'ppc']) + if not ppc_arch or not ppc_arch.startswith('powerpc-'): + return False + return True + + def _add_arches_for_universal_build(self, flags): + if self.is_universal_compiler(): + flags[:0] = ['-arch', 'i686', '-arch', 'ppc'] + return flags + + def get_flags(self): + flags = GnuFCompiler.get_flags(self) + return self._add_arches_for_universal_build(flags) + + def get_flags_linker_so(self): + flags = GnuFCompiler.get_flags_linker_so(self) + return self._add_arches_for_universal_build(flags) + def get_libraries(self): opt = GnuFCompiler.get_libraries(self) if sys.platform == 'darwin': From numpy-svn at scipy.org Thu Sep 13 01:34:29 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 13 Sep 2007 00:34:29 -0500 (CDT) Subject: [Numpy-svn] r4029 - trunk/numpy/core Message-ID: <20070913053429.34EDD39C13A@new.scipy.org> Author: charris Date: 2007-09-13 00:34:26 -0500 (Thu, 13 Sep 2007) New Revision: 4029 Modified: trunk/numpy/core/fromnumeric.py Log: Do more documentation formating. Rename some variables for consistency. Modified: trunk/numpy/core/fromnumeric.py =================================================================== --- trunk/numpy/core/fromnumeric.py 2007-09-10 20:23:25 UTC (rev 4028) +++ trunk/numpy/core/fromnumeric.py 2007-09-13 05:34:26 UTC (rev 4029) @@ -43,36 +43,42 @@ def take(a, indices, axis=None, out=None, mode='raise'): - """Return an array with values pulled from the given array at the given - indices. + """Return an array formed from the elements of a at the given indices. This function does the same thing as "fancy" indexing; however, it can be easier to use if you need to specify a given axis. - :Parameters: - - `a` : array - The source array - - `indices` : int array - The indices of the values to extract. - - `axis` : None or int, optional (default=None) - The axis over which to select values. None signifies that the - operation should be performed over the flattened array. - - `out` : array, optional - If provided, the result will be inserted into this array. It should - be of the appropriate shape and dtype. - - `mode` : one of 'raise', 'wrap', or 'clip', optional - (default='raise') - Specifies how out-of-bounds indices will behave. - - 'raise' : raise an error - - 'wrap' : wrap around - - 'clip' : clip to the range + *Parameters*: - :Returns: - - `subarray` : array + a : array + The source array - :See also: - - numpy.ndarray.take() : equivalent method + indices : int array + The indices of the values to extract. + axis : {None, int}, optional + The axis over which to select values. None signifies that the + operation should be performed over the flattened array. + + out : {None, array}, optional + If provided, the result will be inserted into this array. It should + be of the appropriate shape and dtype. + + mode : {'raise', 'wrap', 'clip'}, optional + Specifies how out-of-bounds indices will behave. + 'raise' -- raise an error + 'wrap' -- wrap around + 'clip' -- clip to the range + + *Returns*: + + subarray : array + The returned array has the same type as a. + + *See Also*: + + `ndarray.take` : equivalent method + """ try: take = a.take @@ -83,26 +89,31 @@ # not deprecated --- copy if necessary, view otherwise def reshape(a, newshape, order='C'): - """Return an array that uses the data of the given array, but with a new - shape. + """Returns an array containing the data of a, but with a new shape. - :Parameters: - - `a` : array - - `newshape` : shape tuple or int - The new shape should be compatible with the original shape. If an - integer, then the result will be a 1D array of that length. - - `order` : 'C' or 'FORTRAN', optional (default='C') - Whether the array data should be viewed as in C (row-major) order or - FORTRAN (column-major) order. + *Parameters*: - :Returns: - - `reshaped_array` : array - This will be a new view object if possible; otherwise, it will - return a copy. + a : array + Array to be reshaped. - :SeeAlso: - - numpy.ndarray.reshape() : Equivalent method. + newshape : shape tuple or int + The new shape should be compatible with the original shape. If an + integer, then the result will be a 1D array of that length. + order : {'C', 'FORTRAN'}, optional + Determines whether the array data should be viewed as in C + (row-major) order or FORTRAN (column-major) order. + + *Returns*: + + reshaped_array : array + This will be a new view object if possible; otherwise, it will + return a copy. + + *See Also*: + + `numpy.ndarray.reshape` : Equivalent method. + """ try: reshape = a.reshape @@ -114,45 +125,50 @@ def choose(a, choices, out=None, mode='raise'): """Use an index array to construct a new array from a set of choices. - Given an array of integers in {0, 1, ..., n-1} and a set of n choice - arrays, this function will create a new array that merges each of the - choice arrays. Where a value in `a` is i, then the new array will have - the value that choices[i] contains in the same place. + Given an array of integers in {0, 1, ..., n-1} and a set of n choice arrays, + this function will create a new array that merges each of the choice arrays. + Where a value in `a` is i, then the new array will have the value that + choices[i] contains in the same place. - :Parameters: - - `a` : int array - This array must contain integers in [0, n-1], where n is the number - of choices. - - `choices` : sequence of arrays - Each of the choice arrays should have the same shape as the index - array. - - `out` : array, optional - If provided, the result will be inserted into this array. It should - be of the appropriate shape and dtype - - `mode` : one of 'raise', 'wrap', or 'clip', optional (default='raise') - Specifies how out-of-bounds indices will behave. - - 'raise' : raise an error - - 'wrap' : wrap around - - 'clip' : clip to the range + *Parameters*: - :Returns: - - `merged_array` : array + a : int array + This array must contain integers in [0, n-1], where n is the number + of choices. - :SeeAlso: - - numpy.ndarray.choose() : equivalent method + choices : sequence of arrays + Each of the choice arrays should have the same shape as the index + array. - Examples - --------- + out : array, optional + If provided, the result will be inserted into this array. It should + be of the appropriate shape and dtype - >>> choices = [[0, 1, 2, 3], [10, 11, 12, 13], - ... [20, 21, 22, 23], [30, 31, 32, 33]] - >>> choose([2, 3, 1, 0], choices) - array([20, 31, 12, 3]) - >>> choose([2, 4, 1, 0], choices, mode='clip') - array([20, 31, 12, 3]) - >>> choose([2, 4, 1, 0], choices, mode='wrap') - array([20, 1, 12, 3]) + mode : {'raise', 'wrap', 'clip'}, optional + Specifies how out-of-bounds indices will behave. + 'raise' : raise an error + 'wrap' : wrap around + 'clip' : clip to the range + *Returns*: + + merged_array : array + + *See Also*: + + `numpy.ndarray.choose` : equivalent method + + *Examples* + + >>> choices = [[0, 1, 2, 3], [10, 11, 12, 13], + ... [20, 21, 22, 23], [30, 31, 32, 33]] + >>> choose([2, 3, 1, 0], choices) + array([20, 31, 12, 3]) + >>> choose([2, 4, 1, 0], choices, mode='clip') + array([20, 31, 12, 3]) + >>> choose([2, 4, 1, 0], choices, mode='wrap') + array([20, 1, 12, 3]) + """ try: choose = a.choose @@ -164,31 +180,35 @@ def repeat(a, repeats, axis=None): """Repeat elements of an array. - :Parameters: - - `a` : array - - `repeats` : int or int array - The number of repetitions for each element. If a plain integer, then - it is applied to all elements. If an array, it needs to be of the - same length as the chosen axis. - - `axis` : None or int, optional (default=None) - The axis along which to repeat values. If None, then this function - will operated on the flattened array `a` and return a similarly flat - result. + *Parameters*: - :Returns: - - `repeated_array` : array + a : array - :SeeAlso: - - numpy.ndarray.repeat() : equivalent method + repeats : int or int array + The number of repetitions for each element. If a plain integer, then + it is applied to all elements. If an array, it needs to be of the + same length as the chosen axis. - Examples - -------- + axis : {None, int}, optional + The axis along which to repeat values. If None, then this function + will operated on the flattened array `a` and return a similarly flat + result. - >>> repeat([0, 1, 2], 2) - array([0, 0, 1, 1, 2, 2]) - >>> repeat([0, 1, 2], [2, 3, 4]) - array([0, 0, 1, 1, 1, 2, 2, 2, 2]) + *Returns*: + repeated_array : array + + *See Also*: + + `numpy.ndarray.repeat` : equivalent method + + *Examples* + + >>> repeat([0, 1, 2], 2) + array([0, 0, 1, 1, 2, 2]) + >>> repeat([0, 1, 2], [2, 3, 4]) + array([0, 0, 1, 1, 1, 2, 2, 2, 2]) + """ try: repeat = a.repeat @@ -198,9 +218,10 @@ def put (a, ind, v, mode='raise'): - """Set a[n] = v[n] for all n in ind. If v is shorter than mask it - will be repeated as necessary. In particular v can be a scalar or - length 1 array. The routine put is the equivalent of the + """Set a[n] = v[n] for all n in ind. + + If v is shorter than mask it will be repeated as necessary. In particular v + can be a scalar or length 1 array. The routine put is the equivalent of the following (although the loop is in C for speed): ind = array(indices, copy=False) @@ -216,6 +237,8 @@ def swapaxes(a, axis1, axis2): """Return array a with axis1 and axis2 interchanged. + Blah, Blah. + """ try: swapaxes = a.swapaxes @@ -225,10 +248,11 @@ def transpose(a, axes=None): - """Return a view of the array with dimensions permuted according - to axes. If axes is None (default) returns array with dimensions - reversed. + """Return a view of the array with dimensions permuted. + Permutes axis according to list axes. If axes is None (default) returns + array with dimensions reversed. + """ try: transpose = a.transpose @@ -240,57 +264,61 @@ def sort(a, axis=-1, kind='quicksort', order=None): """Return copy of 'a' sorted along the given axis. - :Description: - Perform an inplace sort along the given axis using the algorithm specified by the kind keyword. - :Parameters: + *Parameters*: + a : array Array to be sorted. - axis : integer + + axis : {None, int} optional Axis along which to sort. None indicates that the flattened - array should be used. Default is -1. - kind : string - Sorting algorithm to use. Possible values are 'quicksort', - 'mergesort', or 'heapsort'. Default is 'quicksort'. - order : list type or None - When a is an array with fields defined, this argument - specifies which fields to compare first, second, etc. Not - all fields need be specified. + array should be used. - :Returns: + kind : {'quicksort', 'mergesort', 'heapsort'}, optional + Sorting algorithm to use. + + order : {None, list type}, optional + When a is an array with fields defined, this argument specifies + which fields to compare first, second, etc. Not all fields need be + specified. + + *Returns*: + sorted_array : array of same type as a - :SeeAlso: - - argsort : Indirect sort. - - lexsort : Indirect stable sort on multiple keys. - - searchsorted : Find keys in sorted array. + *See Also*: - Notes - ----- + `argsort` : Indirect sort. - The various sorts are characterized by average speed, worst case - performance, need for work space, and whether they are stable. A - stable sort keeps items with the same key in the same relative - order. The three available algorithms have the following - properties: + `lexsort` : Indirect stable sort on multiple keys. - +-----------+-------+-------------+------------+-------+ - | kind | speed | worst case | work space | stable| - +===========+=======+=============+============+=======+ - | quicksort | 1 | O(n^2) | 0 | no | - +-----------+-------+-------------+------------+-------+ - | mergesort | 2 | O(n*log(n)) | ~n/2 | yes | - +-----------+-------+-------------+------------+-------+ - | heapsort | 3 | O(n*log(n)) | 0 | no | - +-----------+-------+-------------+------------+-------+ + `searchsorted` : Find keys in sorted array. - All the sort algorithms make temporary copies of the data when - the sort is not along the last axis. Consequently, sorts along - the last axis are faster and use less space than sorts along - other axis. + *Notes* + The various sorts are characterized by average speed, worst case + performance, need for work space, and whether they are stable. A + stable sort keeps items with the same key in the same relative + order. The three available algorithms have the following + properties: + + +-----------+-------+-------------+------------+-------+ + | kind | speed | worst case | work space | stable| + +===========+=======+=============+============+=======+ + | quicksort | 1 | O(n^2) | 0 | no | + +-----------+-------+-------------+------------+-------+ + | mergesort | 2 | O(n*log(n)) | ~n/2 | yes | + +-----------+-------+-------------+------------+-------+ + | heapsort | 3 | O(n*log(n)) | 0 | no | + +-----------+-------+-------------+------------+-------+ + + All the sort algorithms make temporary copies of the data when + the sort is not along the last axis. Consequently, sorts along + the last axis are faster and use less space than sorts along + other axis. + """ if axis is None: a = asanyarray(a).flatten() @@ -304,56 +332,61 @@ def argsort(a, axis=-1, kind='quicksort', order=None): """Returns array of indices that index 'a' in sorted order. - Perform an indirect sort along the given axis using the algorithm - specified by the kind keyword. It returns an array of indices of the - same shape as a that index data along the given axis in sorted order. + Perform an indirect sort along the given axis using the algorithm specified + by the kind keyword. It returns an array of indices of the same shape as a + that index data along the given axis in sorted order. - :Parameters: + *Parameters*: + a : array - Values that the returned indices should sort. - axis : integer - Axis to be indirectly sorted. None indicates that the - flattened array should be used. Default is -1. - kind : string - Sorting algorithm to use. Possible values are 'quicksort', - 'mergesort', or 'heapsort'. Default is 'quicksort'. - order : list type or None - When a is an array with fields defined, this argument - specifies which fields to compare first, second, etc. Not - all fields need be specified. + Array to be sorted. - :Returns: + axis : {None, int} optional + Axis along which to sort. None indicates that the flattened + array should be used. + + kind : {'quicksort', 'mergesort', 'heapsort'}, optional + Sorting algorithm to use. + + order : {None, list type}, optional + When a is an array with fields defined, this argument specifies + which fields to compare first, second, etc. Not all fields need be + specified. + + *Returns*: + indices : integer array Array of indices that sort 'a' along the specified axis. - :SeeAlso: - - lexsort : Indirect stable sort with multiple keys. - - sort : Inplace sort. + *See Also*: - Notes - ----- + `lexsort` : Indirect stable sort with multiple keys. - The various sorts are characterized by average speed, worst case - performance, need for work space, and whether they are stable. A - stable sort keeps items with the same key in the same relative - order. The three available algorithms have the following - properties: + `sort` : Inplace sort. - +-----------+-------+-------------+------------+-------+ - | kind | speed | worst case | work space | stable| - +===========+=======+=============+============+=======+ - | quicksort | 1 | O(n^2) | 0 | no | - +-----------+-------+-------------+------------+-------+ - | mergesort | 2 | O(n*log(n)) | ~n/2 | yes | - +-----------+-------+-------------+------------+-------+ - | heapsort | 3 | O(n*log(n)) | 0 | no | - +-----------+-------+-------------+------------+-------+ + *Notes* - All the sort algorithms make temporary copies of the data when - the sort is not along the last axis. Consequently, sorts along - the last axis are faster and use less space than sorts along - other axis. + The various sorts are characterized by average speed, worst case + performance, need for work space, and whether they are stable. A + stable sort keeps items with the same key in the same relative + order. The three available algorithms have the following + properties: + +-----------+-------+-------------+------------+-------+ + | kind | speed | worst case | work space | stable| + +===========+=======+=============+============+=======+ + | quicksort | 1 | O(n^2) | 0 | no | + +-----------+-------+-------------+------------+-------+ + | mergesort | 2 | O(n*log(n)) | ~n/2 | yes | + +-----------+-------+-------------+------------+-------+ + | heapsort | 3 | O(n*log(n)) | 0 | no | + +-----------+-------+-------------+------------+-------+ + + All the sort algorithms make temporary copies of the data when + the sort is not along the last axis. Consequently, sorts along + the last axis are faster and use less space than sorts along + other axis. + """ try: argsort = a.argsort @@ -363,9 +396,31 @@ def argmax(a, axis=None): - """Return the indices to the maximum value of the 1-D arrays along - the given axis. + """Returns array of indices of the maximum values of along the given axis. + *Parameters*: + + a : array + Array to look in. + + axis : {None, integer} + If None, the index is into the flattened array, otherwise along + the specified axis + + *Returns*: + + Array of indices + + *Examples* + + >>> a = arange(6).reshape(2,3) + >>> argmax(a) + 5 + >>> argmax(a,0) + array([1, 1, 1]) + >>> argmax(a,1) + array([2, 2]) + """ try: argmax = a.argmax @@ -375,9 +430,31 @@ def argmin(a, axis=None): - """Return the indices to the minimum value of the 1-D arrays along - the given axis. + """Return array of indices to the minimum values along the given axis. + *Parameters*: + + a : array + Array to look in. + + axis : {None, integer} + If None, the index is into the flattened array, otherwise along + the specified axis + + *Returns*: + + Array of indices + + *Examples* + + >>> a = arange(6).reshape(2,3) + >>> argmin(a) + 0 + >>> argmin(a,0) + array([0, 0, 0]) + >>> argmin(a,1) + array([0, 0]) + """ try: argmin = a.argmin @@ -387,49 +464,51 @@ def searchsorted(a, v, side='left'): - """Return indices where keys in v should be inserted to maintain - order. + """Return indices where keys in v should be inserted to maintain order. - Find the indices into a sorted array such that if the - corresponding keys in v were inserted before the indices the - order of a would be preserved. If side='left', then the first - such index is returned. If side='right', then the last such index - is returned. If there is no such index because the key is out of - bounds, then the length of a is returned, i.e., the key would - need to be appended. The returned index array has the same shape - as v. + Find the indices into a sorted array such that if the corresponding keys in + v were inserted before the indices the order of a would be preserved. If + side='left', then the first such index is returned. If side='right', then + the last such index is returned. If there is no such index because the key + is out of bounds, then the length of a is returned, i.e., the key would need + to be appended. The returned index array has the same shape as v. - :Parameters: + *Parameters*: + a : 1-d array - Array sorted in ascending order. + Array must be sorted in ascending order. + v : array or list type Array of keys to be searched for in a. - side : string - Possible values are : 'left', 'right'. Default is 'left'. - Return the first or last index where the key could be - inserted. - :Returns: + side : {'left', 'right'}, optional + If 'left', the index of the first location where the key could be + inserted is found, if 'right', the index of the last such element is + returned. If the is no such element, then either 0 or N is returned, + where N is the size of the array. + + *Returns*: + indices : integer array Array of insertion points with the same shape as v. - :SeeAlso: - - sort : Inplace sort. - - histogram : Produce histogram from 1-d data. + *See Also*: - Notes - ----- + `sort` : Inplace sort. - The array a must be 1-d and is assumed to be sorted in ascending - order. Searchsorted uses binary search to find the required - insertion points. + `histogram` : Produce histogram from 1-d data. - Examples - -------- + *Notes* - >>> searchsorted([1,2,3,4,5],[6,4,0]) - array([5, 3, 0]) + The array a must be 1-d and is assumed to be sorted in ascending + order. Searchsorted uses binary search to find the required + insertion points. + *Examples* + + >>> searchsorted([1,2,3,4,5],[6,4,0]) + array([5, 3, 0]) + """ try: searchsorted = a.searchsorted @@ -447,6 +526,21 @@ Note that a.resize(new_shape) will fill the array with 0's beyond current definition of a. + *Parameters*: + + a : array_like + Array to be reshaped. + + new_shape : tuple + Shape of the new array. + + *Returns*: + + new_array : array + The new array is formed from the data in the old array, repeated if + necessary to fill out the required number of elements, with the new + shape. + """ if isinstance(new_shape, (int, nt.integer)): @@ -475,21 +569,19 @@ def squeeze(a): """Remove single-dimensional entries from the shape of a. - Examples - -------- + *Examples* - >>> x = array([[[1,1,1],[2,2,2],[3,3,3]]]) - >>> x - array([[[1, 1, 1], - [2, 2, 2], - [3, 3, 3]]]) - >>> x.shape - (1, 3, 3) - >>> squeeze(x).shape - (3, 3) + >>> x = array([[[1,1,1],[2,2,2],[3,3,3]]]) + >>> x + array([[[1, 1, 1], + [2, 2, 2], + [3, 3, 3]]]) + >>> x.shape + (1, 3, 3) + >>> squeeze(x).shape + (3, 3) """ - try: squeeze = a.squeeze except AttributeError: @@ -500,58 +592,66 @@ def diagonal(a, offset=0, axis1=0, axis2=1): """Return specified diagonals. - If a is 2-d, returns the diagonal of self with the given offset, - i.e., the collection of elements of the form a[i,i+offset]. If a - has more than two dimensions, then the axes specified by axis1 and - axis2 are used to determine the 2-d subarray whose diagonal is - returned. The shape of the resulting array can be determined by - removing axis1 and axis2 and appending an index to the right equal - to the size of the resulting diagonals. + If a is 2-d, returns the diagonal of self with the given offset, i.e., the + collection of elements of the form a[i,i+offset]. If a has more than two + dimensions, then the axes specified by axis1 and axis2 are used to determine + the 2-d subarray whose diagonal is returned. The shape of the resulting + array can be determined by removing axis1 and axis2 and appending an index + to the right equal to the size of the resulting diagonals. - :Parameters: - offset : integer - Offset of the diagonal from the main diagonal. Can be both - positive and negative. Defaults to main diagonal. - axis1 : integer - Axis to be used as the first axis of the 2-d subarrays from - which the diagonals should be taken. Defaults to first axis. - axis2 : integer - Axis to be used as the second axis of the 2-d subarrays from - which the diagonals should be taken. Defaults to second axis. + *Parameters*: - :Returns: + a : array_like + Array from whis the diagonals are taken. + + offset : {0, integer}, optional + Offset of the diagonal from the main diagonal. Can be both positive + and negative. Defaults to main diagonal. + + axis1 : {0, integer}, optional + Axis to be used as the first axis of the 2-d subarrays from which + the diagonals should be taken. Defaults to first axis. + + axis2 : {1, integer}, optional + Axis to be used as the second axis of the 2-d subarrays from which + the diagonals should be taken. Defaults to second axis. + + *Returns*: + array_of_diagonals : array of same type as a If a is 2-d, a 1-d array containing the diagonal is returned. If a has larger dimensions, then an array of diagonals is returned. - :SeeAlso: - - diag : Matlab workalike for 1-d and 2-d arrays. - - diagflat : Create diagonal arrays. - - trace : Sum along diagonals. + *See Also*: - Examples - -------- + `diag` : Matlab workalike for 1-d and 2-d arrays. - >>> a = arange(4).reshape(2,2) - >>> a - array([[0, 1], - [2, 3]]) - >>> a.diagonal() - array([0, 3]) - >>> a.diagonal(1) - array([1]) + `diagflat` : Create diagonal arrays. - >>> a = arange(8).reshape(2,2,2) - >>> a - array([[[0, 1], - [2, 3]], - [[4, 5], - [6, 7]]]) - >>> a.diagonal(0,-2,-1) - array([[0, 3], - [4, 7]]) + `trace` : Sum along diagonals. + *Examples* + + >>> a = arange(4).reshape(2,2) + >>> a + array([[0, 1], + [2, 3]]) + >>> a.diagonal() + array([0, 3]) + >>> a.diagonal(1) + array([1]) + + >>> a = arange(8).reshape(2,2,2) + >>> a + array([[[0, 1], + [2, 3]], + [[4, 5], + [6, 7]]]) + >>> a.diagonal(0,-2,-1) + array([[0, 3], + [4, 7]]) + """ return asarray(a).diagonal(offset, axis1, axis2) @@ -559,30 +659,118 @@ def trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None): """Return the sum along diagonals of the array. + If a is 2-d, returns the sum along the diagonal of self with the given offset, i.e., the + collection of elements of the form a[i,i+offset]. If a has more than two + dimensions, then the axes specified by axis1 and axis2 are used to determine + the 2-d subarray whose trace is returned. The shape of the resulting + array can be determined by removing axis1 and axis2 and appending an index + to the right equal to the size of the resulting diagonals. Arrays of integer + type are summed + + *Parameters*: + + a : array_like + Array from whis the diagonals are taken. + + offset : {0, integer}, optional + Offset of the diagonal from the main diagonal. Can be both positive + and negative. Defaults to main diagonal. + + axis1 : {0, integer}, optional + Axis to be used as the first axis of the 2-d subarrays from which + the diagonals should be taken. Defaults to first axis. + + axis2 : {1, integer}, optional + Axis to be used as the second axis of the 2-d subarrays from which + the diagonals should be taken. Defaults to second axis. + + dtype : {None, dtype}, optional + Determines the type of the returned array and of the accumulator + where the elements are summed. If dtype has the value None and a is + of integer type of precision less than the default integer + precision, then the default integer precision is used. Otherwise, + the precision is the same as that of a. + + out : {None, array}, optional + Array into which the sum can be placed. It's type is preserved and + it must be of the right shape to hold the output. + + *Returns*: + + sum_along_diagonals : array + If a is 2-d, a 0-d array containing the diagonal is + returned. If a has larger dimensions, then an array of + diagonals is returned. + + *Examples* + + >>> trace(eye(3)) + 3.0 + >>> a = arange(8).reshape((2,2,2)) + >>> trace(a) + array([6, 8]) + """ return asarray(a).trace(offset, axis1, axis2, dtype, out) -def ravel(m,order='C'): - """Return a 1d array with all the elements of m. The new array is - a view of m if possible, otherwise it is a copy. +def ravel(a, order='C'): + """Return a 1d array containing the elements of a. - Examples - -------- + Returns the elements of a as a 1d array. The elements in the new array + are taken in the order specified by the order keyword. The new array is + a view of a if possible, otherwise it is a copy. - >>> x = array([[1,2,3],[4,5,6]]) - >>> x - array([[1, 2, 3], - [4, 5, 6]]) - >>> ravel(x) - array([1, 2, 3, 4, 5, 6]) + *Parameters*: + a : array_like + + order : {'C','F'}, optional + If order is 'C' the elements are taken in row major order. If order + is 'F' they are taken in column major order. + + *Returns*: + + 1d array of the elements of a. + + *See Also*: + + `ndarray.flat` : 1d iterator over the array. + + `ndarray.flatten` : 1d array copy of the elements of a in C order. + + *Examples* + + >>> x = array([[1,2,3],[4,5,6]]) + >>> x + array([[1, 2, 3], + [4, 5, 6]]) + >>> ravel(x) + array([1, 2, 3, 4, 5, 6]) + """ - a = asarray(m) - return a.ravel(order) + return asarray(a).ravel(order) + def nonzero(a): """Return the indices of the elements of a which are not zero. + *Parameters*: + + a : array_like + + *Returns*: + + Tuple of arrays of indices. + + *Examples* + + >>> eye(3)[nonzero(eye(3))] + array([ 1., 1., 1.]) + >>> nonzero(eye(3)) + (array([0, 1, 2]), array([0, 1, 2])) + >>> eye(3)[nonzero(eye(3))] + array([ 1., 1., 1.]) + """ try: nonzero = a.nonzero @@ -592,17 +780,27 @@ res = nonzero() return res + def shape(a): - """Return the shape of a. This function can also be called on - nested sequences, e.g. + """Return the shape of a. - Examples - -------- + *Parameters*: - >>> x = array([1,2,3]) - >>> shape((x,x,x)) - (3, 3) + a : array type + *Returns*: + + tuple of integers : + The elements of the tuple are the length of the corresponding array + dimension. + + *Examples* + + >>> shape(eye(3)) + (3, 3) + >>> shape([[1,2]]) + (1, 2) + """ try: result = a.shape @@ -610,140 +808,184 @@ result = asarray(a).shape return result -def compress(condition, m, axis=None, out=None): - """Return m where condition is true. - Equivalent to m[condition]. +def compress(condition, a, axis=None, out=None): + """Return a where condition is true. + Equivalent to a[condition]. + """ try: - compress = m.compress + compress = a.compress except AttributeError: - return _wrapit(m, 'compress', condition, axis, out) + return _wrapit(a, 'compress', condition, axis, out) return compress(condition, axis, out) -def clip(m, m_min, m_max): - """Limit the values of m to [m_min, m_max]. Equivalent to - m[m < m_min] = m_min - m[m > m_max] = m_max +def clip(a, a_min, a_max): + """Limit the values of a to [a_min, a_max]. Equivalent to + a[a < a_min] = a_min + a[a > a_max] = a_max + """ try: - clip = m.clip + clip = a.clip except AttributeError: - return _wrapit(m, 'clip', m_min, m_max) - return clip(m_min, m_max) + return _wrapit(a, 'clip', a_min, a_max) + return clip(a_min, a_max) -def sum(x, axis=None, dtype=None, out=None): - """Sum the array over the given axis. The optional dtype argument - is the data type for intermediate calculations. - The default is to upcast (promote) smaller integer types to the - platform-dependent Int. For example, on 32-bit platforms: +def sum(a, axis=None, dtype=None, out=None): + """Sum the array over the given axis. - x.dtype default sum() dtype - --------------------------------------------------- - bool, int8, int16, int32 int32 + *Parameters*: - Examples - -------- + a : array_type - >>> N.sum([0.5, 1.5]) - 2.0 - >>> N.sum([0.5, 1.5], dtype=N.int32) - 1 - >>> N.sum([[0, 1], [0, 5]]) - 6 - >>> N.sum([[0, 1], [0, 5]], axis=1) - array([1, 5]) + axis : {None, integer} + Axis over which the sums are taken. If None is used, then the sum is + over all the array elements. + dtype : {None, dtype}, optional + Determines the type of the returned array and of the accumulator + where the elements are summed. If dtype has the value None and a is + of integer type of precision less than the default platform integer + precision, then the default integer precision is used. Otherwise, + the precision is the same as that of a. + + out : {None, array}, optional + Array into which the sum can be placed. It's type is preserved and + it must be of the right shape to hold the output. + + *Returns*: + + Sum along specified axis : {array, scalar}, type as explained above. + If the sum is along an axis, then an array is returned whose shape + is the same as a with the specified axis removed. For 1d arrays or + dtype=None, the result is a 0d array. + + *Examples* + + >>> N.sum([0.5, 1.5]) + 2.0 + >>> N.sum([0.5, 1.5], dtype=N.int32) + 1 + >>> N.sum([[0, 1], [0, 5]]) + 6 + >>> N.sum([[0, 1], [0, 5]], axis=1) + array([1, 5]) + """ - if isinstance(x, _gentype): - res = _sum_(x) + if isinstance(a, _gentype): + res = _sum_(a) if out is not None: out[...] = res return out return res try: - sum = x.sum + sum = a.sum except AttributeError: - return _wrapit(x, 'sum', axis, dtype, out) + return _wrapit(a, 'sum', axis, dtype, out) return sum(axis, dtype, out) -def product (x, axis=None, dtype=None, out=None): + +def product (a, axis=None, dtype=None, out=None): """Product of the array elements over the given axis. + Blah, Blah. + """ try: - prod = x.prod + prod = a.prod except AttributeError: - return _wrapit(x, 'prod', axis, dtype, out) + return _wrapit(a, 'prod', axis, dtype, out) return prod(axis, dtype, out) -def sometrue (x, axis=None, out=None): + +def sometrue (a, axis=None, out=None): """Perform a logical_or over the given axis. + Blah, Blah. + """ try: - any = x.any + any = a.any except AttributeError: - return _wrapit(x, 'any', axis, out) + return _wrapit(a, 'any', axis, out) return any(axis, out) -def alltrue (x, axis=None, out=None): + +def alltrue (a, axis=None, out=None): """Perform a logical_and over the given axis. + Blah, Blah. + """ try: - all = x.all + all = a.all except AttributeError: - return _wrapit(x, 'all', axis, out) + return _wrapit(a, 'all', axis, out) return all(axis, out) -def any(x,axis=None, out=None): + +def any(a,axis=None, out=None): """Return true if any elements of x are true. + Blah, Blah. + """ try: - any = x.any + any = a.any except AttributeError: - return _wrapit(x, 'any', axis, out) + return _wrapit(a, 'any', axis, out) return any(axis, out) -def all(x,axis=None, out=None): + +def all(a,axis=None, out=None): """Return true if all elements of x are true: + Blah, Blah. + """ try: - all = x.all + all = a.all except AttributeError: - return _wrapit(x, 'all', axis, out) + return _wrapit(a, 'all', axis, out) return all(axis, out) -def cumsum (x, axis=None, dtype=None, out=None): + +def cumsum (a, axis=None, dtype=None, out=None): """Sum the array over the given axis. + Blah, Blah. + """ try: - cumsum = x.cumsum + cumsum = a.cumsum except AttributeError: - return _wrapit(x, 'cumsum', axis, dtype, out) + return _wrapit(a, 'cumsum', axis, dtype, out) return cumsum(axis, dtype, out) -def cumproduct (x, axis=None, dtype=None, out=None): + +def cumproduct (a, axis=None, dtype=None, out=None): """Return the cumulative product over the given axis. + Blah, Blah. + """ try: - cumprod = x.cumprod + cumprod = a.cumprod except AttributeError: - return _wrapit(x, 'cumprod', axis, dtype, out) + return _wrapit(a, 'cumprod', axis, dtype, out) return cumprod(axis, dtype, out) + def ptp(a, axis=None, out=None): """Return maximum - minimum along the the given dimension. + Blah, Blah. + """ try: ptp = a.ptp @@ -751,9 +993,12 @@ return _wrapit(a, 'ptp', axis, out) return ptp(axis, out) + def amax(a, axis=None, out=None): """Return the maximum of 'a' along dimension axis. + Blah, Blah. + """ try: amax = a.max @@ -761,8 +1006,12 @@ return _wrapit(a, 'max', axis, out) return amax(axis, out) + def amin(a, axis=None, out=None): """Return the minimum of a along dimension axis. + + Blah, Blah. + """ try: amin = a.min @@ -770,19 +1019,25 @@ return _wrapit(a, 'min', axis, out) return amin(axis, out) + def alen(a): """Return the length of a Python object interpreted as an array of at least 1 dimension. + Blah, Blah. + """ try: return len(a) except TypeError: return len(array(a,ndmin=1)) + def prod(a, axis=None, dtype=None, out=None): """Return the product of the elements along the given axis. + Blah, Blah. + """ try: prod = a.prod @@ -790,9 +1045,12 @@ return _wrapit(a, 'prod', axis, dtype, out) return prod(axis, dtype, out) + def cumprod(a, axis=None, dtype=None, out=None): """Return the cumulative product of the elements along the given axis. + Blah, Blah. + """ try: cumprod = a.cumprod @@ -800,28 +1058,37 @@ return _wrapit(a, 'cumprod', axis, dtype, out) return cumprod(axis, dtype, out) + def ndim(a): """Return the number of dimensions of a. + Blah, Blah. + """ try: return a.ndim except AttributeError: return asarray(a).ndim + def rank(a): """Return the rank of sequence a (the number of dimensions, not the matrix rank). The rank of a scalar is zero. + Blah, Blah. + """ try: return a.ndim except AttributeError: return asarray(a).ndim + def size(a, axis=None): """Return the number of elements in sequence a, or along a given axis. + Blah, Blah. + """ if axis is None: @@ -835,41 +1102,42 @@ except AttributeError: return asarray(a).shape[axis] + def round_(a, decimals=0, out=None): """Round a to the given number of decimals. - The real and imaginary parts of complex numbers are rounded - separately. Nothing is done if the input is an integer array with - decimals >= 0. + The real and imaginary parts of complex numbers are rounded separately. + Nothing is done if the input is an integer array with decimals >= 0. - :Parameters: - decimals : integer - Number of decimal places to round to (default 0). When - 'decimals' is negative it specifies the number of - positions to the left of the decimal point. - out : array - Existing array to use for output (by default, make a - copy of a). + *Parameters*: - :Returns: + decimals : {0, int}, optional + Number of decimal places to round to. When decimals is negative it + specifies the number of positions to the left of the decimal point. + out : {None, array}, optional + Existing array to use for output (by default, make a copy of a). + + *Returns*: + out : array - May be used to specify a different array to hold the - result rather than the default 'a'. If the type of the - array specified by 'out' differs from that of 'a', the - result is cast to the new type, otherwise the original - type is kept. Floats round to floats by default. + May be used to specify a different array to hold the result rather + than the default a. If the type of the array specified by 'out' + differs from that of a, the result is cast to the new type, + otherwise the original type is kept. Floats round to floats by + default. - Notes - ----- + *See Also*: - Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 - round to 0.0, etc. Results may also be surprising due to the inexact - representation of decimal fractions in IEEE floating point and the - errors introduced in scaling the numbers when 'decimals' is something - other than 0. + `around` : alias of this function - The function around is an alias for round_. + *Notes* + Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round + to 0.0, etc. Results may also be surprising due to the inexact + representation of decimal fractions in IEEE floating point and the + errors introduced in scaling the numbers when decimals is something + other than 0. + """ try: round = a.round @@ -877,7 +1145,6 @@ return _wrapit(a, 'round', decimals, out) return round(decimals, out) -around = round_ def mean(a, axis=None, dtype=None, out=None): """Compute the mean along the specified axis. @@ -886,34 +1153,37 @@ over the flattened array by default, otherwise over the specified axis. - :Parameters: + *Parameters*: + axis : integer - Axis along which the means are computed. The default is - to compute the standard deviation of the flattened array. + Axis along which the means are computed. The default is to compute + the standard deviation of the flattened array. dtype : type - Type to use in computing the means. For arrays of integer - type the default is float32, for arrays of float types it is - the same as the array type. + Type to use in computing the means. For arrays of integer type the + default is float32, for arrays of float types it is the same as the + array type. out : ndarray - Alternative output array in which to place the result. It - must have the same shape as the expected output but the type - will be cast if necessary. + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. - :Returns: + *Returns*: + mean : array (see dtype parameter above) - A new array holding the result is returned unless out is - specified, in which case a reference to out is returned. + A new array holding the result is returned unless out is specified, + in which case a reference to out is returned. - :SeeAlso: - - var : Variance - - std : Standard deviation + *See Also*: - Notes - ----- + `var` : Variance - The mean is the sum of the elements along the axis divided by the - number of elements. + `std` : Standard deviation + *Notes* + + The mean is the sum of the elements along the axis divided by the number + of elements. + """ try: mean = a.mean @@ -925,43 +1195,43 @@ def std(a, axis=None, dtype=None, out=None): """Compute the standard deviation along the specified axis. - Returns the standard deviation of the array elements, a measure - of the spread of a distribution. The standard deviation is - computed for the flattened array by default, otherwise over the - specified axis. + Returns the standard deviation of the array elements, a measure of the + spread of a distribution. The standard deviation is computed for the + flattened array by default, otherwise over the specified axis. - :Parameters: + *Parameters*: + axis : integer - Axis along which the standard deviation is computed. The - default is to compute the standard deviation of the flattened - array. + Axis along which the standard deviation is computed. The default is + to compute the standard deviation of the flattened array. dtype : type - Type to use in computing the standard deviation. For arrays - of integer type the default is float32, for arrays of float - types it is the same as the array type. + Type to use in computing the standard deviation. For arrays of + integer type the default is float32, for arrays of float types it is + the same as the array type. out : ndarray - Alternative output array in which to place the result. It - must have the same shape as the expected output but the type - will be cast if necessary. + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. - :Returns: + *Returns*: + standard_deviation : The return type varies, see above. - A new array holding the result is returned unless out is - specified, in which case a reference to out is returned. + A new array holding the result is returned unless out is specified, + in which case a reference to out is returned. - :SeeAlso: - - var : Variance - - mean : Average + *See Also*: - Notes - ----- + `var` : Variance - The standard deviation is the square root of the average of the - squared deviations from the mean, i.e. var = sqrt(mean((x - - x.mean())**2)). The computed standard deviation is biased, i.e., - the mean is computed by dividing by the number of elements, N, - rather than by N-1. + `mean` : Average + *Notes*: + + The standard deviation is the square root of the average of the squared + deviations from the mean, i.e. var = sqrt(mean((x - x.mean())**2)). The + computed standard deviation is biased, i.e., the mean is computed by + dividing by the number of elements, N, rather than by N-1. + """ try: std = a.std @@ -973,43 +1243,51 @@ def var(a, axis=None, dtype=None, out=None): """Compute the variance along the specified axis. - Returns the variance of the array elements, a measure of the - spread of a distribution. The variance is computed for the - flattened array by default, otherwise over the specified axis. + Returns the variance of the array elements, a measure of the spread of a + distribution. The variance is computed for the flattened array by default, + otherwise over the specified axis. - :Parameters: + *Parameters*: + axis : integer - Axis along which the variance is computed. The default is to - compute the variance of the flattened array. + Axis along which the variance is computed. The default is to compute + the variance of the flattened array. dtype : type - Type to use in computing the variance. For arrays of integer - type the default is float32, for arrays of float types it is - the same as the array type. + Type to use in computing the variance. For arrays of integer type + the default is float32, for arrays of float types it is the same as + the array type. out : ndarray - Alternative output array in which to place the result. It - must have the same shape as the expected output but the type - will be cast if necessary. + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. - :Returns: + *Returns*: + variance : array (see dtype parameter above) - A new array holding the result is returned unless out is - specified, in which case a reference to out is returned. + A new array holding the result is returned unless out is specified, + in which case a reference to out is returned. - :SeeAlso: - - std : Standard deviation - - mean : Average + *See Also*: - Notes - ----- + `std` : Standard deviation - The variance is the average of the squared deviations from the - mean, i.e. var = mean((x - x.mean())**2). The computed variance - is biased, i.e., the mean is computed by dividing by the number - of elements, N, rather than by N-1. + `mean` : Average + *Notes*: + + The variance is the average of the squared deviations from the mean, + i.e. var = mean((x - x.mean())**2). The computed variance is biased, + i.e., the mean is computed by dividing by the number of elements, N, + rather than by N-1. + """ try: var = a.var except AttributeError: return _wrapit(a, 'var', axis, dtype, out) return var(axis, dtype, out) + +# functions that are now aliases + +around = round_ + From numpy-svn at scipy.org Thu Sep 13 13:05:53 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 13 Sep 2007 12:05:53 -0500 (CDT) Subject: [Numpy-svn] r4030 - trunk/numpy/doc/swig Message-ID: <20070913170553.66CF839C182@new.scipy.org> Author: wfspotz at sandia.gov Date: 2007-09-13 12:05:48 -0500 (Thu, 13 Sep 2007) New Revision: 4030 Modified: trunk/numpy/doc/swig/numpy_swig.html trunk/numpy/doc/swig/numpy_swig.pdf trunk/numpy/doc/swig/numpy_swig.txt Log: Added proper exception handling to dot example Modified: trunk/numpy/doc/swig/numpy_swig.html =================================================================== --- trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 05:34:26 UTC (rev 4029) +++ trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 17:05:48 UTC (rev 4030) @@ -925,6 +925,10 @@ %apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1), (int len2, double* vec2)} %rename (dot) my_dot; +%exception my_dot { + $action + if (PyErr_Occurred()) SWIG_fail; +} %inline %{ double my_dot(int len1, double* vec1, int len2, double* vec2) { if (len1 != len2) { @@ -944,6 +948,16 @@ %include directives. Or, if the function in question is a class method, you will want to use %extend rather than %inline in addition to %ignore.

+

A note on error handling: Note that my_dot returns a +double but that it can also raise a python error. The +resulting wrapper function will return a python float +representation of 0.0 when the vector lengths do not match. Since +this is not NULL, the python interpreter will not know to check +for an error. For this reason, we add the %exception directive +above for my_dot to get the behavior we want (note that +$action is a macro that gets expanded to a valid call to +my_dot). In general, you will probably want to write a SWIG +macro to perform this task.

Other Situations

@@ -1049,7 +1063,7 @@
Modified: trunk/numpy/doc/swig/numpy_swig.pdf =================================================================== --- trunk/numpy/doc/swig/numpy_swig.pdf 2007-09-13 05:34:26 UTC (rev 4029) +++ trunk/numpy/doc/swig/numpy_swig.pdf 2007-09-13 17:05:48 UTC (rev 4030) @@ -1161,26 +1161,21 @@ /ProcSet [ /PDF /Text ] >> endobj 272 0 obj << -/Length 2961 +/Length 2577 /Filter /FlateDecode >> stream -x??Z{o??_??j ?????7??????-?$(???????[)???w??%??;??\??r??? ):???:??????6?(%??l}??.`??#h?PDH???1???#F)6[??|uz????YbS???e?0??L+J??zv??q?z??1???? -~[???>???K???\? -?s?@??SL,?F?@xD???b~ ??1??_???????????/"?z$????a>n?L?Wg8?SG???c7?4ne???x?m>???a?? -y?????Bvj?M???_?????g??qP?"?I?;??Jx?=????K?s??0?6_?)??_?-??][????;?t?Zx??+????Ga??????)I??N??0}?????????r?g???*?wS?^????&?E>a???eQ?????????Z?vV?S?M??/?6FZ??XE??q?~??\9??~??????e??HBd|??R ?QC89??["E??e ???AJ?`?L+??/G???????o?:???4??????kd|?>????????|E??Bb?D[?1F????O???Gki?%?*???R?LE??%??) C*/[c?#?O {?E ??E##*???"$?h??iF\DJ?#???n?3dwq????[F???X????H?????ia??]?Z(??t ??~??h??P?Z?????:???????? ???<rb??Cvf|_????JG??xK????0?uZ?{????d?9???(?w???????????D???3? -?u?2bNv{????g?T?<+P??}LG????=+?y?b?{??\?y?>?>"?\? -r???Q?9????G?3?m?N??y!??9?????N?k??"?qU?"?~??????????U??X[h???2wF?????????-^?m????????[(p???D???? ????4?A9?0E??cm?=??3>n?????*??Q1?`;?4??Th ??P??2?"gQ?^?C?QX??N??` Lj|?? #K??o???????q????fla?j|??$\??QP??N?~p4??dD7?????l?_b?ob/???-7A?LI??q???M???Q\?6 -??????>?5k???b^??e#V?#@=??57Lv?W?#?????c?9[b?7G???+??]??wx??^???L?O\? ?%&7H????:pq?'??wo?;?P ??[?????rLw???????|??????%@????l|n??n?~z????z?9?w??????a?J?X[?r??????B&D????????-&??g????'l?3"??y??g -????h'?M??&8}=J2U?WdyG???????S???qc???>t,??????dY?? ??????18?????>??T?sMT?L?|???*"JT????[FMKH|'???s??p?B???pXc?5??; ^????P?RM`???u?u???.>\?5]?1?)?U?????? A??tvB0V???????o6?????qb??q ???C???|??O,=Y??U?C[? ??4??%?BHp7IU)E4?mH?Ag?l -CH?26j??s??????K???p??e?6??a??c?/!B???Cr???r'4??N(c? ?v?H???q???l???~/??3? ??x??:????a?????(\M?[?p?4 }???9??},H?f??&?l3n}??W?m*4???N?s?/[?'????????h??????)Mf}:{?l????8/?Sn??? ????D?J?0?Ev??Z~6? ^??6N?-l ??3???????K?@?W4???O?^6?V? _d?d(??Y????yT?E:Q?z??Z???T| ?Es?1??U\? 'T??D?r?Z?Y?7;??~}[!??+???=?8?? O??????? -?e??HS? ?8??J????J MD???+? ?????o?a?????|??UT7?T{\*J?sO? ?ih??????U?.^(ZZ?-N?Fm????????b??=l???s"?/??????X?U w?Vk?????:??TH?L ?#????0?  ?I*F?fY???@}??G?YQ??o??\?????E??&?X?~fRn???}~?$???G4?v?Mh??C??M?_m}V??M%????~?L??m?h:-????h }??+???*K??m?P??:?_h??S?s: E????:?v?W??(?:???e?OWC?Q?N???Zg?3g?a?o?U?????????w???`}JIS?????~??)?????WC?e??l??Xb????5O)????ip???;?v/A??W??,??\M?ng?R?X3?????D??????$xG???4??hzh4?j\???w5???? ??? ?endstream +x??Zmo?6??_?g\???????i?-pm.5?ph?B?????????????!?%Q+?AP?????p^r????b??zQV????|sT,.a??'? S?????]iQ???X?L?8;z??ZXf?0???? )??4????????????'|y?<{x????~?B?d?,?*?kj?|?){B,???Dx D????j????(???? +d????????W?{?&??[|?4-????J?es???\!????"k??????t?X????A?-?-;Y??,?"9???N?zO{v{p?&??s?????m?E?E??c?m?X?_?[?US[BN????Na?T????e|??u??x??>E?p?????-?h??z~???d??lY???a?S?K?y?l?_? F;f???A??KT?????*`g}i?k?? $A??rZ4!v_R`??W??|y??????????? ?I?D? +?Z^?z?b??~??E??}?\*?????(J????????5X????I[??=??qk?bs$??tx?>???_??"?U????1TV?2????o??.??Cm?e???E?LUe]? ????9LCP/?q????????nC?Qn~???l???B?~;???@ v??Cq?SwyGY ?P????/?????B?-?V)???9H??K? U??Sfc????@5?????_f ??k |??l?????? l\?Z??(?%??(K?EY ????r?(??GY*v???G?OIuN?????u?'5???otQ?bU????????}?T??w?`q +1?u??# +[????\_? ???p??5?9?~??????+,????yBv???l???v>???<????w;??0????D?h?C?;0z?hV +"d&??W?1?@?K??D@?3????t`??y?LlX??????\X?(?????s ?@/??`D???B?q? ?D?l?!???2 ??"?p=@?L?B????J???!?????zs?*[???c??s]$????:>b?@?+ $d?@?a7 T3Z&6`?????y?^*??K?t^OZ#???@&?N0????????`o??N$?M? ??'?q0j6?7?85 +?????N?Y ?G8 ?q???z?]ob??????????3?5 z?|?bn????f???<{?+????n??!)????"4Y?<#?? +???nM?&???L???????????x}L??e??cS?????x????;O?D?d?2{??W? ?wW??iv$??F8}?i26???xG???????x?????fV*?.??*]0???E ???^???????5????jF?,?? ????u?? 9"?I4Z????[Kkar?d?J?/??.\?8???U?>???????b??P?B?????t?7?B???*??1S!X??\?I?s|5???E??tm????{??7?f???RHV?r!kki??t _??#O??>?EK8??J??6?p?T3Jh7?M_???*?d?|??F?????????u? ???(* E^?~kw?Q`?]???? _Sr p?rH&?`?? e1? "??1?u?O~?????9=w?\C??r?ug??2?yI?.H?+??*????2b??dL??????s???2/h?? ??X???17??=?Z^?? ?????=?Z???> >> endobj 276 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [214.901 618.1652 247.3091 629.0044] +/Rect [214.901 616.7703 247.3091 627.6095] /Subtype/Link/A<> >> endobj 278 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [217.5744 557.5791 252.8916 569.4396] +/Rect [217.5744 555.4411 252.8916 567.3016] /Subtype/Link/A<> >> endobj 280 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [108.8202 467.1391 141.2283 477.9784] +/Rect [108.8202 463.8776 141.2283 474.7169] /Subtype/Link/A<> >> endobj 281 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [405.2133 385.2838 434.3737 397.1443] +/Rect [405.2133 381.0078 434.3737 392.8683] /Subtype/Link/A<> >> endobj 282 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [322.8707 373.3286 355.2788 385.1891] +/Rect [322.8707 369.0527 355.2788 380.9131] /Subtype/Link/A<> >> endobj 273 0 obj << /D [271 0 R /XYZ 74.4095 789.6651 null] >> endobj 139 0 obj << -/D [271 0 R /XYZ 74.4095 613.1825 null] +/D [271 0 R /XYZ 74.4095 611.1535 null] >> endobj 58 0 obj << -/D [271 0 R /XYZ 74.4095 613.1825 null] +/D [271 0 R /XYZ 74.4095 611.1535 null] >> endobj 277 0 obj << -/D [271 0 R /XYZ 74.4095 570.2382 null] +/D [271 0 R /XYZ 74.4095 568.1002 null] >> endobj 140 0 obj << -/D [271 0 R /XYZ 74.4095 546.8992 null] +/D [271 0 R /XYZ 74.4095 544.7612 null] >> endobj 62 0 obj << -/D [271 0 R /XYZ 74.4095 546.8992 null] +/D [271 0 R /XYZ 74.4095 544.7612 null] >> endobj 279 0 obj << -/D [271 0 R /XYZ 74.4095 513.1808 null] +/D [271 0 R /XYZ 74.4095 510.9338 null] >> endobj -141 0 obj << -/D [271 0 R /XYZ 74.4095 137.8893 null] ->> endobj -66 0 obj << -/D [271 0 R /XYZ 74.4095 137.8893 null] ->> endobj 270 0 obj << /Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F14 193 0 R /F51 119 0 R >> /ProcSet [ /PDF /Text ] >> endobj 285 0 obj << -/Length 3767 +/Length 4358 /Filter /FlateDecode >> stream -x??ko????? -#@?u1???~?????6 A??n?go????n?C???rHQ%?. ??c???1??????????5??/??g?? |??'? S?Xx(|????3F\T?$?^=??%?r???????????^\]?c??%??nw???z???tn???x?]???/??t k?08C}Qq???~??-@?H?FK?i??? ? ^??#~l?????u?M???G??DG??Df????Ka?'S??NQ??h??`$??&>??p1??d??^??Z??6?}}Y ??WvG?????2?vD??K?6?sx?!%??????2?$~???????i??d?H]kZ?eD????oU?0? ???{??*? IfI`??jn??rn??0j??*AM???????}?UVl??a?w???e?k? ~?>??o??????????=iiX?L|???????]I:5?????}H?0????v?{??f? :? -I???wG????r?+???d??*???CD?;?HJ????[O?W??W?. D8>???%?y#??E???i:vY?7?"?]?a??\???L??{*?h?????&?_?&B6?6?????:GZ?U0?J???iC?8 -??w?%('??u3Z?H;?2??Y??t?>?52*?e?Z??%?*0?? ??6%db???f?}?A?~?@?dc?h#?%?e???)j;???m??G ?$I?@?zA??\o^ ?q??Y????{{?C??\w??r?????^?d?Q???8?7????q?~3?:Y?????1?'}?ij? Zh??~??Z?H$y??ey??8???K1N??-?M#8 t??m?~?????/X[t????P?bR1????????e>?P=??X???.z???;????????y? ?<?/??k???Y? ?????????Y>??G??L?????Yn?rL?C-? l5?XD???e?????????!V???????z???L?u|??&? ?ER?w?G?\JH?Q?pz?BO??????xq%3????7//? -v@? -?1'??Tm?`??`Vj5?Q?|`hlm??li??o?9#??ho?|?@Q???????g?????? n????m/?< ?`?a(?/?????'-??m? ?????o?2~??}?hwE?'???GD?#R? !??)?? C1x??!yi???TO?M?P??,/?8?????Co? LEy??>????@(?7o???2,?|?&??)c?O??w^???Y-Y??[?g??=?`??l mf??x??,G?5?G??F?????[??a?o?Hp[???' -Y??I?`|????\???*?Y?????,? ?V2????F??:?t?'???82?$??????c ,? cH??`?xw???o 5D3???d?>E??]??*??#}?9??@?{D#?sy??y|VHp?Z??{d?S???h|n?C\?m)???????kr>_Q??o??-??G????????nL?n???`?????^??f ?#F?m?l??V?;/4???I;nxq?????6?U? !z???9a%???b[??i???h?B???6PIU???d?~1 ?5y9d?????_?#bQ?#v??mi??O??????v?????g:???8?"?????? F???V?| 6???P].????`?A?? _??9???O`?6~mo?'x?6~??;???H0??i????q=qH~^?I???9? H?y?9? g?????0????m ???F\Q????????e?Mrs???R?9f??P?????Fi?t???O?u???G"|??n?d????????2??Q^d??%B? w?KH??g?A?&???%?e@??D?$?e???"}_zC ???Y#?[?N?Z?>? ????'J1>B??"??]???@&??m??9B??t??^S\hIO1??v?V?L?X??n\?_f?t?~?~??UQ? ?n?-?:?eu1?k??0???F??6D?*?j??@?S?d>GK??P m"??~?????<"n??????V5r? j?!? ?}N?????Wwy?1???A"@?U,?v?T??/0?V????????W?????Y?wQ??12???C?0D?,f?rNY?%?b+o ?!~??'$N??W d]?` n=???bD?Z-mw]?>??}~?%[3#??x????.QL~ z??w???3??q>???xs{ -dN-?4A??`???>?$??8`?ju???90* ?????E?*0U???+??&!T?1)?? -r?y??!?A?dU???W?v??vd?E???????>Z?x??+k0???yp?s<????I?C;??@K????????w?%G???w??c??fk????$?f+?/?@?D??) ??}?v>?H?-f?3W????LU+z?7??????`Z.?L?R?Q??????G? -n??5$2C??c?????7,??u?&c1fx?;?a?5 -#????z6??j? l?V?DoV???-??h?zQ?T{Ym(??t????C?p???k?c?M? ??? ????wGn?Q???8?????N[?cR_0'???`L??!V???kU???????? B? ` z?'?? ??Gi???4Oh8? h?O?? ?/ ?b?~*??v????t???|a"?~???2h?WV????& 92??]??tH?&???????5L?&?6kcu at 0?SPQ??W??G?BH?X!W?E??."???XB???1?????&w???L?????c??H???<&^??coR?*?{a?;?????8???+??R?k?#U???R??????U ?????????L??????4u?N??B???WQ??z?B?%??Z?{???? `?f????(???Gh^Rje?r???H`????4??ii?(_??:?6G???[:? o???d?:?{?-:??6??-J?=?]??4v????#? -???L#-29G????o?;???K??~Z??ch\?% j??3n?"}?bKg"?L{??????u?4?M?????????W??3o??ys????????????l????J?6??|?~#??x?????"????????&??H???n? ?w??? _????p???s?Z}????[?%?{|?t??o???_iSMCp?8w??@??{?????2??Q?6?!????Z2F3?u???s????td?]%??YM3?7[?%???*r???"???_??????nv?Gx?K???#?p??o?jp?s????M?8?q??{? ?[??S???O@?D?'A?????e?43?R??????w|?F??">!???r ??x_?of?[????(!??=? ???c\&???s??2?F?????@h??3??R??g?? g??|? ??n??+P??=u?BR???KS??Y!|5?8?8???k`???NaYo???n [K5z???????6????lb?[ ??[zO2D????p{O#NR_?????bXk9 Lx??-???z???R??(b?#6??????cbt??]d??>???gx??{????N??i\4??I??E???'="??E/=s???O?vT&?F??0??<(??????xm?H?yG?r ?????f??????}???N???"?Rh +?0-E?_?i???1??i""??|C????'b??9c\??yJ???Bn?:??B)??M?>:?????r???`}?A_h?q?%??83??U?|a?4????w?o???t!?????E6???Sr??Hoq??????)??????}}DU????H?R??L???g?j?)??}B??zf2zk?? ?VX?Xr??2?Pt?? ?n?$4?\\??????????` ?2O??E?*?m?Y?U?@7[ ? `7?b}u2??n0????W??Z~??TW???+?? @>?X dd???8???R?q[ x?72b?5??w?u??????????=?>@Ra?;????q.\??1??G???? F??v?cl?aA|T]R? ?`???t?????z?vq ?t???6?H? B??s?????S?????LG0?Z????4?S????#?Vq?4?????@`?K0?c +?,?^t??]D ]d????g3>? ??\\1??~[7??y??.?????glX????%?TW??? ?f?J??????????X?j?G?v?????F?iI t??Z??{Y??????]tVo???O?\???1?h?????Ii ??69?_c?`??????8yv9(? +?X?>0Uq?>'??H? 2?>#Q3$?x ??c?mNN;af??_???#1[?"?????s?y??G??`B????f p???r9A? ??m?g?c???>?.WMn ?3?? ?v?e?aBC?5~??j>n?e?? 0????"?#?v?????C??ml7?y +T?c|W{l?o?:>R? ?)#??\L?h?n?$K??*a?????K???s9?5?lK???1??nmu?8.???i??8f?]??>???4?7?8??|??6eLc???8K=8?????B?;2?:? +6??:?#Rlvd?DF=`?+?4?o?+{3Q-? b?,6?^? ??<5??Y?f4??x;?Nj?j?o???l??4?{??D?????ve?? 4??/3??'}?$???2D?X?f??-?:\??-?B?c?(S?,G|??.??Y?m?[??y?v?i??|?""???s?b$0?W]???S???#N?G???O??l???v?DH????BB??+??? +3XtbK9',(\?"?[+?+T?5f?#=K?G?S?e.'W???'fH???_??????5?eN?P?[q?Ji-??0)??^??Hd???????]6Z???u2zv +!??[?????^W?'R?3?G?+?? ??????M5N????b(????HR?K5Y!5x?\?w?v?%??_?)???????5????????#????U??~G-?? ?\?&??e????"???r?%?j???8???n?_?=??DIX ??]?d??p?I????? e???>f 3??d?TE?#?nA\??fI@?nB?-MwB?4D?^??????_J?m???55??+???Z??????_??????&???kO??????PA??n?+??&???m?n??w????K7r\PN?x8O?M ?????Q?T8?D??k8_-???3He??t?????l????i?,8??S?ZV$?o??%?u{????4.?K?F?/????X?7?_?!}??????2 jy?p2?:?nC-???RQ???j??q???TWF?u??"%|?b "??cD??C??~?????A???F0??a?y>'D!W?2(30?? ???E7??,\>???43t??]?YM!????w???#N?J?|?&m+??^0Xv*wUm??A,bj??z?$????N????m?`???G X?5 d?U?l0??5?????k?9](?p???????3?Vm?:?v???!?t~?U?Nu _*?&????v?S?UqEJ???+???r??u'???C?AC?Xp|I1e(p@?~???SzX??p1F?3?????*q??G?????a?G??!????H??a???F+~Q???|?0WO?3?w??*|b})-'??fxz?%?0??2?YN|??? ?????,?V?9???!???kI?D?????n?dw?????e?? EDW?6?i?c???2r>sS>q????;u?qL????y=?wLh??'?mE4?!N7?????/~1?0???5??endstream endobj 284 0 obj << /Type /Page @@ -1290,252 +1279,281 @@ /Resources 283 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 237 0 R -/Annots [ 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 296 0 R 298 0 R ] +/Annots [ 287 0 R 288 0 R 289 0 R 290 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 300 0 R 302 0 R ] >> endobj +287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [489.4544 710.7411 521.8625 721.8593] +/Subtype/Link/A<> +>> endobj 288 0 obj << /Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [300.2304 699.0649 332.6385 709.9041] +/Subtype/Link/A<> +>> endobj +289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [286.2454 687.1097 318.6535 697.949] +/Subtype/Link/A<> +>> endobj +290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [143.6789 651.2442 172.8394 662.0835] +/Subtype/Link/A<> +>> endobj +292 0 obj << +/Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.307 708.5793 484.2022 719.4186] +/Rect [356.307 573.1126 484.2022 583.9518] /Subtype /Link /A << /S /GoTo /D (other-common-types-bool) >> >> endobj -289 0 obj << +293 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 696.6242 266.3938 707.4634] +/Rect [120.2376 561.1574 266.3938 571.9966] /Subtype /Link /A << /S /GoTo /D (other-common-types-complex) >> >> endobj -290 0 obj << +294 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [153.5984 536.9429 182.7589 548.0612] +/Rect [153.5984 401.4762 182.7589 412.5944] /Subtype/Link/A<> >> endobj -291 0 obj << +295 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [241.6158 536.9429 276.9331 548.0612] +/Rect [241.6158 401.4762 276.9331 412.5944] /Subtype/Link/A<> >> endobj -292 0 obj << +296 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [459.8353 536.9429 496.9558 548.0612] +/Rect [459.8353 401.4762 496.9558 412.5944] /Subtype/Link/A<> >> endobj -293 0 obj << +297 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [120.2376 525.2668 165.5172 536.106] +/Rect [120.2376 389.8 165.5172 400.6392] /Subtype/Link/A<> >> endobj -294 0 obj << +298 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [186.1994 525.2668 229.7456 536.106] +/Rect [186.1994 389.8 229.7456 400.6392] /Subtype/Link/A<> >> endobj -296 0 obj << +300 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [108.1855 459.0903 137.3459 469.9295] +/Rect [108.1855 323.6235 137.3459 334.4627] /Subtype/Link/A<> >> endobj -298 0 obj << +302 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [423.987 292.4954 459.3042 303.6136] +/Rect [423.987 157.0286 459.3042 168.1469] /Subtype/Link/A<> >> endobj 286 0 obj << /D [284 0 R /XYZ 74.4095 789.6651 null] >> endobj -287 0 obj << -/D [284 0 R /XYZ 74.4095 755.3439 null] +141 0 obj << +/D [284 0 R /XYZ 74.4095 652.2405 null] >> endobj +66 0 obj << +/D [284 0 R /XYZ 74.4095 652.2405 null] +>> endobj +291 0 obj << +/D [284 0 R /XYZ 74.4095 619.8772 null] +>> endobj 142 0 obj << -/D [284 0 R /XYZ 74.4095 518.2929 null] +/D [284 0 R /XYZ 74.4095 382.8262 null] >> endobj 70 0 obj << -/D [284 0 R /XYZ 74.4095 518.2929 null] +/D [284 0 R /XYZ 74.4095 382.8262 null] >> endobj -295 0 obj << -/D [284 0 R /XYZ 74.4095 485.9296 null] +299 0 obj << +/D [284 0 R /XYZ 74.4095 350.4628 null] >> endobj 143 0 obj << -/D [284 0 R /XYZ 74.4095 348.505 null] +/D [284 0 R /XYZ 74.4095 213.0382 null] >> endobj 74 0 obj << -/D [284 0 R /XYZ 74.4095 348.505 null] +/D [284 0 R /XYZ 74.4095 213.0382 null] >> endobj -297 0 obj << -/D [284 0 R /XYZ 74.4095 304.8755 null] +301 0 obj << +/D [284 0 R /XYZ 74.4095 169.4087 null] >> endobj 283 0 obj << -/Font << /F51 119 0 R /F8 95 0 R /F56 126 0 R /F14 193 0 R /F44 92 0 R >> +/Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F14 193 0 R >> /ProcSet [ /PDF /Text ] >> endobj -301 0 obj << -/Length 1808 +305 0 obj << +/Length 2527 /Filter /FlateDecode >> stream -x??X???6}?W?????*2oi??-?6h\??- -??:?xW???&???????ZA?,/?s?????rU???*?0E??????????bu???Od?????????????R?`?J???"?^>2? Ah??Q:)JJD}?}???4+???[m?WRJ?J??????????g?????*? eaU.pB????>?U@?u???pj-??a??S?C????'??D,??????????D W?_?zB-?;+? ~H~[?N??\m?3`[??^Y?-?V.??%???{?n???g?????8V??*?[???Tz? ??``???^??DY???M?FU??u??s %??+? ???]_??N?E?"?g?????KQ???.X??B???a"X?H???Qv??? -???B?2??\?@s:?Bh[#??? ?]??@ ??Ehs????ZF?)?~??}???F ?T6??????i???#?3??R)'/?]?~?/???T,Z?W2?r???+L9Rc???m?P?pC?%[?h?DA1??@&EVmK??I??g???Wp?p?;R??\??? -???j>W?GoEg??d?O??c ?x\B? 2?????.?[??h??=???9-?????>Xr?F?W??BZ??dZD???E1??????hd??H? ?H?vU?.: -??5?lg?8?p?Gx?+?cm??M? %???1[Y^?b????????K?5??&3hx?L C????dh?????_0?T.Z?{zh????qs???6??4r??zMjI? E???>5?V??^?PH???H?%%&rQ?S?6Z?tO?;???~?+?%?????E?Y????n??/???????(Q+-?#?8??pf8_6?j???????+?<3F????????????F)??6^fV??????j??{????,???Yk?g?x??3k?E?????? WW??susw?9g??Lvs????Zn??}???D?? ?J?l??q] +VJ????x?7???F ??m? 6?a6]x9?????x(?k???? ??NHw?n?V??v??Oa?.}??????7?b??0?????|}??? ?F?,;x$???8????)?L??r?P+#?s?v@>e?\T???????v*?T?????^ y?Z?K?r???u?-??H?#?C???5?X./?t?? `F0???X?????h?s??%_ N??M?K z'WN?.:l?w????7????Z ??K??=s{%}??Qg??/???}?k?kq_H4d?n}?)?n +M????0^?Vr?b??l??l??????=F???uz?{?7 im??????y??qq?K~]?=????p'cQ?1)??h +?? J??(?V?\?-)9??(ytP?tV?%?;? za?;?B,=w?4!?80??,?,?K?!*G?&y:?=??="A??i???pD?3e?LF]???d????Z?y?C?]????[?y ?#tJbH ?l=???)m"?ct???1?????r?zJ???? ?}8dk?B??????1?K??-R?????C???D??a??`?i*?Bak??I???3??Q??W?_}CBJ?0h +J?~?6?d?P?d???dI??.?pg????u$?P?9?????}???(?D???-??+?~~x[?a???q+GOT+?F3????nw??e?_?3?Pj???5?.z??&?':??????????4???????9?!7_?E???e@?u??????? ?R?K??+h???x^??x??eD????S ?Tz*??Y, -?` I{????????8?M?wI?Ec? ?jj?:?u,????J??_????)h?-d?+??*f?d???P?`???WR?O?:S9?g??1??\ Z??? ?g?????Mmi?W??Q???Z????B? ?5D?G??&%??????"[??r@???????l3??aJX??K?????V??"??+???=?}?$?fV??/??!??? +J?3?B?H??(u3*??p_?}?}4????????????u??>Uu??? ????k?q$o?bt"oJ???UL?K?,s?br?3? +64FZ=fo#`???N\|?D?"B?v%C?V?+???'?el?j?=???4?????6?? '?:??t ?? 5???e??!??<*??y?/?8?Bhu?g?G.?\????s?N ?K??#?*J?~c??????j??????????G +?? Y?*?c-?y??I??ATLE?Jd??TW?w?Wus??????0?`??r??t?? ?)???e89=}? H??md,??w*?????&? #?u?8?~????A????Z> endobj -303 0 obj << +307 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [132.3327 758.2828 161.4931 770.1433] +/Rect [132.3327 622.7909 161.4931 634.6514] /Subtype/Link/A<> >> endobj -304 0 obj << +308 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [414.726 746.3276 450.0432 758.1881] +/Rect [414.726 610.8357 450.0432 622.6962] /Subtype/Link/A<> >> endobj -306 0 obj << +310 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [219.6728 643.7726 248.8332 655.6331] +/Rect [219.6728 508.2807 248.8332 520.1412] /Subtype/Link/A<> >> endobj -307 0 obj << +311 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [268.4819 643.7726 303.7992 655.6331] +/Rect [268.4819 508.2807 303.7992 520.1412] /Subtype/Link/A<> >> endobj -308 0 obj << +312 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [390.3215 643.7726 419.4819 655.6331] +/Rect [390.3215 508.2807 419.4819 520.1412] /Subtype/Link/A<> >> endobj -309 0 obj << +313 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 631.8175 108.7305 643.6779] +/Rect [73.4132 496.3255 108.7305 508.186] /Subtype/Link/A<> >> endobj -310 0 obj << +314 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 620.4203 100.1426 631.2595] +/Rect [73.4132 484.9283 100.1426 495.7676] /Subtype/Link/A<> >> endobj -314 0 obj << +318 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [324.6699 563.8265 360.0704 573.781] +/Rect [324.6699 428.3346 360.0704 438.2891] /Subtype/Link/A<> >> endobj -315 0 obj << +319 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [382.9052 563.8265 454.0182 573.781] +/Rect [382.9052 428.3346 454.0182 438.2891] /Subtype/Link/A<> >> endobj -302 0 obj << -/D [300 0 R /XYZ 74.4095 789.6651 null] +306 0 obj << +/D [304 0 R /XYZ 74.4095 789.6651 null] >> endobj 144 0 obj << -/D [300 0 R /XYZ 74.4095 700.0612 null] +/D [304 0 R /XYZ 74.4095 564.5693 null] >> endobj 78 0 obj << -/D [300 0 R /XYZ 74.4095 700.0612 null] +/D [304 0 R /XYZ 74.4095 564.5693 null] >> endobj -305 0 obj << -/D [300 0 R /XYZ 74.4095 656.4317 null] +309 0 obj << +/D [304 0 R /XYZ 74.4095 520.9398 null] >> endobj -299 0 obj << -/Font << /F14 193 0 R /F8 95 0 R /F56 126 0 R /F51 119 0 R /F67 313 0 R >> +303 0 obj << +/Font << /F14 193 0 R /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F67 317 0 R >> /ProcSet [ /PDF /Text ] >> endobj -312 0 obj << -/Length1 1247 -/Length2 6158 +316 0 obj << +/Length1 1230 +/Length2 5888 /Length3 532 -/Length 6949 +/Length 6662 /Filter /FlateDecode >> stream -x???eXT?????F?c?f:??KZj???A@`?FB??D?????????????||?O????2???>???????l???r?-T??? ?K????`>~<66??wU???J???`???P????c*???0GO ???"Q?? ??qj?x:B]Pv6?@? ????sv???????"??><0??ym?0W}??m????Jgr???????4??????G???:??#??????{o~?r(?c/0???{7?f#EDM????"??? 2??w/????C????e",?q$N ??>??????????)E"?]??? -???????H?????5??@p 0???N-,?,?&??V?????R???.Ok? ?5???b??? ??c??l ?^J???o???z?;??y+???'???6??6??T??9yf????KL%/????>???&????4?!?a??r???????W'??05?\??hp, ??(??A?(??J??li???y????}??F???2????@???K?/v$Y -ng<#?Q?}e?#?W??x[??db???V??pfu.?cQv7?"t}g?~??4??}&?g? ?????t??4t????????#???\????vE??????x>;m????8o???A?7???J??????V8 ??N?a^ck???J??5???1%?X??f?U?%T??hI?? m?j?I??2?Ji-um??`???(??????P=`?UJ ??O??P?`?qB???a?+Q??i?w?~??)?`=E?;{7? ????F#(h??? E?????,q??Y?er?(?Q([????!?,??}??9?x?IB5?4?\+?f?uvA|?nV?LQ???? -&?!\????8?Wx??%9?&?????m??+?????r?Hg????m??q?4?.????'?iG&Y?????*P????-?????I???;:?N?I?[$)^?X@@?[??|:?EPhR'??XL????'dN?t?RnL?V?H?.V?X?bh?-?YvpJ8Ui?-???P?s6???g?}JxF???)?/???th?????#D?I?#??^?p -? z?RL`??H?zW??^T???/???l[???????`???/:??'5 *?}?i??p]?*??uf???X s?yr??>?#?!????9s?Z?????#?G? of??7 ??II^?????????*?0L?????r??c ??s??????2?3ej?2%\7w??yh;?|???C?????m??q;????r??t?????x??f?1^?dh??!?x?????e?;???b&?n" {??D -2????4m?????Y 3?{??UOd???$)xM4?r???Fe^?>?wF6.????kL?G&?4??s#??'+????U??z4) ?.?s|?t????n??~q?I??.f??;k??X?r???F?eq+J?h}?w??iKe>?->UVM??????????????/l?s????o??!?G????D??]?C?\?????$????j??5????????o????ck^?Y???]?|o??.?????l?'$?}????0?5.n???????c?f?O????2??`?R_????b???dU???e????RTV??5??~????>??".???u?? ?????q2k??U?> ??gsE?T? :????????Z?????~?Md??[d-??????rZ??N?K_?t?p/RRZ -?hD?????D?{?}?????????C???brTD?k?N????'W?w?zC??L^?f?_h?`Jqg??c?wr?m?6=?2?'h^?P?-?'???R?b?F????-h8?$????(???;??G?d0??b?????D??x(}??C,R2OE?????F?iZ???~"a??Dv??????? Kv??V ????M???{3? ?w??t??U?{EZ?|???!?????l???4?j?U?'U?W at 9/?8T??????;?|????s?JQC??}n???!|???u??,}?`?j??/????K?|*tV:)?|H8??? c?w?n? ?7>?_G?k??KY???${K{^????u?)??P~?jW,8?,%??V?j???s?\?????vqU???^%?@?[?%???A???k?6y??6ZW?7?5?n??????P???e/?Z?^??q?(7?@'Vd?5??K??^?X?c+?:??N???bNt"W=???z\H7??>d?]m?M??CF??0?H?}?Y9?]???Y??0 aU?!? ?84??Vz-`6?gS????|?X???D?&??? ?+S?? 1A? -???J?G?SUna*??YciZ+e?3??&|?$r!I??v[]V???t?J??}QjB??y?RV??????F? ??.%H`?Q:>?3y*t?[.?F????PKQ ????????????l\!?Y???Q#?78&? ??I??m?5"?M?uH???a???e{?l?fucy?_?BV???MV{pI?u? -#??(M?w?y??W??>???????b??a?R?8j????????'?U%7??!?c?#? ???oMfT????]?E -??~8EC?0??w???L,??H;?v4?qeX?sc:%???N??;{?w?H?Z?N???[zY??????xv?c??????K????#<l [??djX?l?c??fN -??????PB?Dd@???)???p\Gq?O2? ???.??6?????~L?q????=?'?J?\x?T??`K?W??v??F??D!??Wy0L????+3????????O?{;?????:9???A  \??!k?NQ ??????J m?B???????e???X??V??N???L??9n?sei?Z????i?\RSR?R DctE?3?@?n?,zX???N2x????D?cw???->LV>x?N?'????t?i\???y?????as}&G'bl????a?]??7??????????L'%???????n?b?4?7?????"??e?lDj?.?;Fq? -{??U+S!.?mw?Y??n??6y?yx?;?R????R?S?$???-y???jmZT??C??Jj???L_?b???o,?P}b ?8??=Oj????????#???6O?? ? ??B??8endstream +x???e\?}???Ni???:?[?;b????TB???nA)Ii) I?q????????????????s?????????b`,??s???? A? ??k$ ?? 88T?`G ????@?? @)? @2??2??? +??????*?N??~(S7?$????z!?+?? ? ?r??a????^^z????Q3?oYGo????0o?0??????????eM? ??gV??? ??u??? +A??!?`???;?????+????jlY?V?kxW???m??2p?@?M>?????A?58$?? +Q????G+5?3?E]q ?wD?????P????p0??? ??z@?$ p?? ~-SLrG??????? +IB>?%?\~???0?; ????Y\???????Br??P????4?????UQm?a^??%???????M?????( d???!???jm?7?.???oBi:?&?9??&?0??. ?#??u????????@???o??? J??????_??Q ??Q? ?????P??RF?????*+??CD??BA?????p?)t???P??????ov???&`p0??`n?,???[v_ ???]??)U??{??0j?1?W?{_??:??? +? ? ??+z???{?#????O?o66rBZ?-?rt?>??Q;?m?S'?????Ce?/????p??l?.???X???????P??2????e1"{?[?P,n)?,# ki,??G^3??!?=???0????*????Y?h???hSa??Ei??7?5????1????3z???"?&?????????C??}??v ?k ???5{Q>{?????iHXU#b???zr??z?????)?G?o??k=M??t???????H?GR??M ?eIr?hD-?>m;???J?d??5p??T??f???1-u_r&?Q?9??}????mH??J??`?o?r?B??l?8?|P?w???????$??C??r?D?F??'?."+????&?"?+??C??J]???8}k???f????>?G?IR|???z??E??O??# c? + +0?T??&?H_?^?????Ol?X???@"pZ=???y?;?6?F????e?y9???Hz?.???+????e??#?1,??W?????????2Fi#'[??b#G??e?;??yI???????I?[ +?Fgh?%qg!!?J???9??$O[;+?t???c"b???=+-??P?F?"?g?|%??CRJ???GI??l??}??0?-???M?+??i??Y?}6a? +I2? ?XxuQO????;??T(????AG?????YINT???wj??#Zc??APi"?pu??&????1?????'????A??lx??? W at M?|??-Z{???N?\?%@??)Kt??)"?y?'vc????_?????`}???o ?F????L??U?????/??]??_??3?2 ?T?v??K`????.l?]z8{s???qQb??!?O?????????l3?X??,l???p??ly?? ` ,??PM??E??? ??=?@ ?\5s?@?+e+ ????????T?$brBG???3?????R?+?Y?x=k-??|8???W?so?Qx?1?????5?;????H'C??d?,?N#?????g???j??? ?}X+?c?T?7?&|?PnG????k}???D??1]?T,?& KF2a?>?? B3?4???{?Q& ????6s?@?{_??? |???????? ??p???d?????_?????304j?t?m???i?????wV}f_??? ?f????F?T?e.c?;6????# +.&????JO:h???4S?r?????p(?W,?'?]?I?????K??%??????UZ)?4L$h??????v~??%8.t ?f]??zU/SS??VnE?9???x??????!?? ??D??w`Rf????????+$E????=?zG?g&~?????l1?\? ??01????Yr???(9??? aI?0?+??????>L#???Q??}????S5?Tc?d5?=?9???}q??c???v+3Ky?;\?)Ec?z???B??<]?Gs??-???fShw4? +????????]???????r?:?E???(?T?FrA??yt?nI???:r??C3???????W/?~V?\;?f????.nr??ilhz/h}???\Ut?????a??????B?f???EPZ??k?????K??(???a"]?????E??7??C?X??Q??-+??rD/e?Nze?Je???y?[?7???????aQx?H?w? +w#??<]?Z???,???????|?-y40?vq?w???7??v?K?x??3??PVb:??|?? R????Lu?wj?Q4[]??R-?-?Wt??S?_?W??}h?????R?X???,dL?Ot?? ?w$0? ?????R?????J4m??9????????zqlC{pp7?]V????f???&??:4VD?~6G?h?@?????????U;?;*?}?'??6?3\???b?^UEo`??_??ZZSO0jk????????M^??\{?Q??Vf?+'???cy?^?L????X??O?*!????F???h>????b?? +w?zY0??H]???=?!n??"Vz????4$?gxf^?!?\o??)??F?w?{?e???){4W?H?bJ?|??????p/#L?x? ??~????&???M'G???Y????????qv??(????*???}???B8v!?j??Q????r^D??????G9??[???}=?? ?)?j?u???Y?Q??!???P;``F??????e????!??9??y?Bd>B????T^? ?4? P??b Q???????H????MS??b??T2l??_e??/eU?\?C?TBq?????C?????/=L?????c @???U=????]#??n?J?????o?c?:??&6a??z?i??2i????w??????y??)%?_`?`.Vi/W??? 'c??%}????1?L^y ?Bh|?xh?ew?????????jU(?#P?#+?vQ???f??0??-?}?????@?w??)dW?u ?[??HX!??????C??Z???3F?\c?"??S??S??o???+?p?????????;???[5? +Wl?=pB?RZ???{B???*T ??3?6????8?t?C?G?o&{R??J????????????x???[???Dz8O??8?"?? ??7??Xn??;???J?|X?8???Tt?????G?I?l???t??+????X*?9y?i????3?c???????Z?E? M[+?v?????\????Z??o????;???j"???F_?f????[x?m??~R???Qz2?L?????~X7???????;?|??;i#????n)? +?*B????y?b??????????:????Y?o4=T?X??B??o??f;?X?f"???MII?,5?n?????\??7t?)?v??/z?J???*?????ZL?:????P????????8C?\??[???a??)v?\?\?????yc ???)}?S?I^?!;z??????????4?????D??????????? ?? ?h???L??:T??o?M?Y?? =G?e??W?T???????!??v????????<?endstream endobj -313 0 obj << +317 0 obj << /Type /Font /Subtype /Type1 -/Encoding 316 0 R +/Encoding 320 0 R /FirstChar 45 /LastChar 121 -/Widths 317 0 R -/BaseFont /GHUYBA+CMR9 -/FontDescriptor 311 0 R +/Widths 321 0 R +/BaseFont /JCLQLF+CMR9 +/FontDescriptor 315 0 R >> endobj -311 0 obj << +315 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /GHUYBA+CMR9 +/FontName /JCLQLF+CMR9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-39 -250 1036 750] /Flags 4 -/CharSet (/hyphen/period/zero/one/two/three/five/six/seven/eight/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) -/FontFile 312 0 R +/CharSet (/hyphen/period/zero/one/two/three/four/seven/nine/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) +/FontFile 316 0 R >> endobj -317 0 obj -[343 285 0 514 514 514 514 0 514 514 514 514 0 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] +321 0 obj +[343 285 0 514 514 514 514 514 0 0 514 0 514 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] endobj -316 0 obj << +320 0 obj << /Type /Encoding -/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 53/five/six/seven/eight 57/.notdef 58/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] +/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three/four 53/.notdef 55/seven 56/.notdef 57/nine/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] >> endobj 192 0 obj << /Length1 750 @@ -1547,27 +1565,27 @@ stream x?SU ?uL?OJu??+?5?3?Rp? ?44P0?3?RUu.JM,???sI,I?R0??4Tp,MW04U00?22?25?RUp?/?,?L?(Q?p?)2Wp?M-?LN?S?M,?H??????????ZR???????Q??Z?ZT????eh????\????????r?g^Z??9D8??&U?ZT t????? @'????T*???q????J???B7??4'?/1d<8?0?s3s*?*?s JKR?|?SR??????B????Y??.?Y???????????kh?g`l -??,v??HM ?,I?PHK?)N?????;|`???{:{??jC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` +??,v??HM ?,I?PHK?)N?????;|`??G?8z?hC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` ?L? 2?RR+R+?.????/jQM?BZ~(Z??I? ??% q.L?89?WT?Y*?Z? 644S077?EQ?\ZT??WN+?????2?A??Z???u?Z~?uK??mm+?\_X????????7?D?????Rl:/P1?d????????(??l=U?h?d?_O??E?k?v-X1??t???`????i????_y. ?1?????????:?un~Q???3/??S??}??]?? ???$e~s?]F1????/??Q???m????|<?????/??q'}I???+6???E??g???xT.??G??gt???v??G??U|?????~??]?R????_k?9???:?{?p??G?? ??d}dN<6??-uB?o?H??=c?M?vH??z?q?a???RK?~,K???}????????m??????yo??~?????v? ?_????s>???.#????????{?/?????k????\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,??r?endstream +??-??????W???d?????_?~?+ ????i?s?s?`??C???u?I^>??\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,????r~endstream endobj 193 0 obj << /Type /Font /Subtype /Type1 -/Encoding 318 0 R +/Encoding 322 0 R /FirstChar 15 /LastChar 15 -/Widths 319 0 R -/BaseFont /WICKWM+CMSY10 +/Widths 323 0 R +/BaseFont /XDAIRT+CMSY10 /FontDescriptor 191 0 R >> endobj 191 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 -/FontName /WICKWM+CMSY10 +/FontName /XDAIRT+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 @@ -1576,10 +1594,10 @@ /CharSet (/bullet) /FontFile 192 0 R >> endobj -319 0 obj +323 0 obj [500 ] endobj -318 0 obj << +322 0 obj << /Type /Encoding /Differences [ 0 /.notdef 15/bullet 16/.notdef] >> endobj @@ -1591,38 +1609,36 @@ /Filter /FlateDecode >> stream -x???y?G???g??? E*?J? ?:_gB?`?V#?9??????Y??,r?")?!m?B?R4`3Cz????_(?3?)o???s8??8s?1?????% ??j?6?????????[???I???{????????+?B?i??#???}O>??,_w??>B?H?IN$B??&?VS?1???s?,?q?A??U?]???/].?\)j?1????fG???G?!??.?T? 5????I???f?>??~c.??\?z^Q?.g~???4e4[m???E???%???Y? -?,._?k?#}???[H?Wi;????????????=???n\?e??f?R%?'????V?K?? -AB?w ? B??m???9V?-? ?W?????t????u????y??f?!@%(??-???AKj?b??]t?????y???BR]?U??o$A)??????8????D$^0?!?K?-????6???=?Wn?EY?F\}? ??^?[?i>?ey?S7???_ 5???Ls3??????"^L?>???S?7 ????5[?????f??p?????????? ?h??????a_???~U?h?R??????-?u{r`????{R???1r?P??D?????h?+M??=?^331?[5?????E????^??6!Y?????r??4??xG??=?>??eL???C -??k.aU?l??)P??2:o-?D????m??mA??u?b?BQ!?pT??{??fr??t|9????U??????C?U~????j???h?4&U|?u?W???C;?9%y>?%zB|W?????M?j???Gm\??B??"]O$?a??I:?"?N?:=???d%?y???????G t|?P?????????+b??Z?NN^??????3M?j?kdl?U7?!U/?k4 ???|n??a?\????Y??-??tm9????a?? -?L*?-??~?z?$?+??b????3:?K(???t?y{h?M`6[A???(???w????h?M???4?i??_Y?zf3?h???v????b???+?V ????[??%???cP3????y???JcS'???W???jN31uJ??&??H??vT+)p?Q?'??y!4?R{h?g?????v??b]?tT??$u?v?S??????w?ctn1^?/??5?E?V???Q?1?="P??j%???5???$V,??_]??V???N????>V,r..???%??E?? -??F???L?? 04M?VFTx????b???7?x??_8U/??????@Fj20????2?~?D ??_?;?$??gQy?"u-X??|al???"(????+??????m?????'[????P?7?????k????\???dt?????K???? ?s_Y6tK9q?!????? ?&w??c?,???:?p?W at j? ??)w?{??U???M??m?<}?????????|P:]=5??CC3??[?0???Nj?"???cV??`??????S???au???J???)39?I?^?z?b?h)?2o????o+?`H?????'4????z}?bT??$???8???=js"w?n4?F?G???????????74?!?y??Bt??~' CD'c?????jZ"???iG??u??J?L\????????L?\??????? ?I??????+[W???C???;?52?\ ???/Em[xR????,?k2&\?/J*w,??g??2??L ???&????nQ?6r??V[?????????f[????????4!?#!?/;H?$???Q7?/????X??A???w?g -j?N:Y??^r?\[l???x?)???\M??yM?t?S?????E?? ????"{Y&?&???????z???F?q?0V???qDUT????????3\]?&?>????????O???:?J5????9?, ???mv? ??/?(???v?2F?U? J??R/v?_?XpP???v?&?U+2?]IH%?????, ?%??z??c??e,??????? ?7%??UZ???Fp??RC????;ik????dY?????Rc??^?"9F??WN?k???9b?]? -??W?????i???}?%)Ia?>"???z????X????=???/??????u?????;??Z/{92rd???}???K _S??w??Q??K??{??l?g??J?o?????_:>h/??t??^???O?;k????????1???>jl=?#???$"??!????. a?&DZM1?xC????? ???O ???T?Hh??/???H????)?\A2?!??#?J????f$,????s..????)???@ ?D8???"???.O?? +? ??@?:x???3q?;?????ECk?????j??Ic ?H1?u????????E"|??H????=??m3-"??#??!?1??!? +?G"?@?c8?H?????x??????1?B? ?@p?/???/x?;??(N??'????? ???????t????K??I???"?NP?Gb%@UI5?)??d2H??'?3???p5,\~?Z??&?R?Y????i??U?L????H5??$????+?p???O?d^O?c?G8~u?j&m?k:G?????8Fm?o??S?6m??????u??y?????a???n?;"2)j?n\?&r??$????????????#???a8??????T?9$?)?Zl?`?n??Bu?eQY???_?k ?zO??F3?B??9??x'`????E??u2??z>__???/?I<;)?fv??????r?9?I?A??0z`??e{1?s?@J?f ?????+v?=4\,????Pj?? ??p?|eU???IS?9?xDTH??WS\?Yd?)???qk?&<]?Ox??]??I?? )]??}5?l???j'???} ????jWn??ZF?sD?8aK?y?]7?????????,/?F???T~t+?Z?4??0Zu#P?N???e?Y?H_?/,"2?k?'G?[??A??V?????6???g1?G5???l.?/?DT??N8.P??/=[?? M,??^1J???o???ZS)?{?9z(?m?zVj?L4???3?[o???-????uZ?????r?? ??,??%?l?[y??\e?N???E?v? +&?F?!?? +?1??,P2????+?w?6c'?6M????z^???]?cOG?_? +???P??????/??? ?_?Q6?=?bXt?l?? ??|??U??~6UAo?y6?????bb)J?>M?D????m?]?A?u?"?|a?p;T??k??zb??dl)????E???&??M?Uz????b???`??&Ut?u?7??k?;cO?s???u???????M?l]?:U???qU?????;l??Ig9C$???gG??-e2??cWA?JQ??M|?@??????Z??*?????????-;? _]???6????[?Ru"??????)I??????e???I?E(??J???m??????????R??????&??=???'?? +{%:D?????2P?????l?-???"E?+?rs?O?????D???]??#?k???? +6??)?????G?D.????8?h~??"[???p??V?1??}?????????69????t?5? G?jEz??????H ??_????h???+?8?e??W??D] ??(?]3s????>??$E>????~[????????}????M??n??Z??++"?y??r????R1????f?W? \SN??????1?????o??1?)7?J>?????r#????^I[?p?Y?????Ao.GU?????V)yo??}gw?????? )?f?SF??^I?_>7???p|??(0i???D?^X-??@??Eh3t?T???A7P-k!}??E??sM????T0$??????]?u?=??1*?2??|y??????5O"w?n4?F??????????ec74?"????B????? ??k?Pjg?>-?~??=M??Co?Z&?z??o|L?l?/p6py???)r}G???(??JV*~~?@?[??M?L??|?????Q????*??!?e? ?? +?? +??Yk??{??C???I*7?????? ???U??ue??c??o5%??uc#-?????H?HH?+?vR,I??]???+lr?2V;????q*Jn????5????LA???I??Q??N?k -?3?/:?{_?n??????w???=v?P?'????[d??????e???V?X?????S'? ?uQ.?KSJ+?????;??0???u,???JZ?????7?? Po?N??^?> endobj 152 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /WCAJHN+CMTI10 +/FontName /OMYEDF+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 @@ -1631,103 +1647,110 @@ /CharSet (/a/d/e/g/i/n/r/s/t/u) /FontFile 153 0 R >> endobj -321 0 obj +325 0 obj [511 0 0 511 460 0 460 0 307 0 0 0 0 562 0 0 0 422 409 332 537 ] endobj -320 0 obj << +324 0 obj << /Type /Encoding /Differences [ 0 /.notdef 97/a 98/.notdef 100/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 110/n 111/.notdef 114/r/s/t/u 118/.notdef] >> endobj 125 0 obj << -/Length1 2021 -/Length2 12922 +/Length1 2040 +/Length2 13177 /Length3 532 -/Length 14048 +/Length 14314 /Filter /FlateDecode >> stream -x???UX???p?w'H?????????[pww ,??[pw???!k??????s??s? ????U????)H??D??L-$??XYxb -??,?FffQx - -1??????????/???? ? ?rX?y?YA?1'go?????Z???$.????????`?fm???????dfc?????????+@????aa???0?1s?ZX?8?3??$?h????????? yX]AR?i?@??N???s Kx&E'P5 ???Z?{rIw{{E????N?_?&6?????????f(8?[?w????)X???;??Q7{3G+{ ??l\%m?,??m???n at w??-???h??e??+?$?&O??M????????????g?'?_???A????1???????? ?W1 G3'sG++'?4??q|Y6??^ /?0????hO??N@?:??` ??8???;??????????O?????`?O?????L?@3 G??1n??(?j?????3?2M????r?Y?;?_??aV???????? ????L?D at R??????9?%d??We?????????????'?`rr??7s?d??,?;???/i8?? ??????4?????/i?????q? AV!????????B???_??? ??I??:V????_~????????%.*?????``]\l,?????if?@?????$?E??lizkXXxY???-;??}??h ? ?(?????jMTl??????n_>!?B????R???| }L????5??OeZ?{?Kb??????q?O?G??l?#g??? ?????Kp?????T???????"ejq??M?~=????O?\????a??l$???.???[????P[????mt?N]??/%??)?F`?fbBXE?W[gm"?????????b ?`M??L?9u?Yu1??k????s{j ??`?o?p???x'???0s??|6????3?Q???Xm?N?X?%;?'??_cnU??*x????7????`?t0?B?w?X?T?:O??&s ? a?7?????f?H{?jL??|???%$???4???@??1xL?u??????????-;?v????)?\?????sD??RH?8V???KX5????^j?T??z!_q?]?s?b?AjH?????????%????~Z?d(L?6??????By???t[Z???(j?7???7^m?)Ot???s)?I????????j?9?3 ???????<~^??,I?yp8?W???].??Q????F?edL???l?}/?? ?l ?????bF??WLoNI?D?H?  ???9???r ?&Q?"????????v?/ ??i??#?+D????=C?v?u4cU???&??3????Wt?z(???I?6??T?????z_??b4???g?/r?Q????N?NK?_n???\?y???A??????=?????FZ0??a?*? ?nE:???E:?gm8=qw?}?????l?????pl???`?????\?? m_?wU??????????t?????????*?? -L\ ????b?????r$??(-|vR?=>i????N?r?~?e?AZ?u?????t?=* >??7AS|??}??p?q?m??X???19?!??`?*?kbJ????&p????K?-&?8???C???A?w?????Hv\??S:?e?\??,6?l???i+??X??? Kn??s???~?? ?~??E*????2??t??c?R?+???kB?o=????Qk??SQ%?Y]9??v>?(?Js ?o.*G?%??????)??w?WHo???????b?]?^??7?}??;{?|1#e7?k9???????@Me??w?{??t?O?? ?T?q?(???k?N e??(K}?)a?G?$!`??R?Aq???!?@)%????`??????e~b?{???9????y??????????j%k?(*X?????N0?fU???u??Q???3??? ??oz2????? _SP?*? ???] 2??K?QS?E??N???9?C?`]????M??r???s?:~??bG?`??):0? ????o8???E?????5?????|?k???L>?.b???ovH??H?1?;g?S??Wn??l~????Z???J?F?y??>D??? ??N=?|E4????u???????d???5|???B???!?bi?y??w?7?1e?>??.js{?~l?C>j+j??2}?R??] }Z %?O??KWi??i?M&??"=??y?22 pl>?N??GG??V?7[`n??????`?76`???A? ?%xD????s_???W???}?x/????(1????;????g?&?R???????O)???8?????<????U 2 ????=?FIC?????n?A???Q??F?? ?_pF??O? L??W?*2??=??3?4N&?qH7?5????tQh?K?????|?m??-?#s???0B?8JE?aYi?dj?? ??jJ??5?O|??????S?%????8(p?Hw??| ?(8PN?j??6UP????????k-????[????c^???3rjCF?????}??H$?y?1?K ?;4???h???e??e?B??ph-??????????_????Zv????????Y?i?<T??F?Jp-3?:????+~%N???o??7j? ?H3t??QU???h??9S)x?<1??a:?????{?%?TI;?v?????H?Q?"?????qti???xq3??K??0?m??????????6??'=T??I?!)B? ?X?.?R7??+"??M???@???+B? ?lg???C_???`N?-???[?J?=??p??j??u?l?d???(??d?????.?W`?0?;_D???l???%?????n???o?,?s`?{?wy?????}????/?W??S?T ->9zLg*???^;* h?(*6 H?K?Xs?@?-??d?????u??y?????7{?an?wM*?_`d??? c_5????t?'?4a?"??|?hj?@[????E?????4?????? ?7?oe?Z?z?g?)? ????????x?????8Usc???%!????????dE9?=???? ?M8?4?????5??u)????uYuS?:( ?H;~N?.N\?ru?2?J?#M?:~>-?m?Q??pf?? (;H/c?C?????{?I|?%???0&????Tg?>k?0???[?5 $????? ?????Q??6hWD?s?;???4??`~^9 ??????*??%:??.OG?c??;?(+Vyj???[I??EP"?<?)???,?[??S?? ?????N?}Cw? M???W???\? ?*?????0??0'?????*FF,>#M?bW Z??Y?????R?kQ?vl??O???? ??|?.M??*?f?R]}NS?????L?gt??{? ??U)lp???v????0??%?5?ezdMif?qr ??!c?^z7????d8?? `??W?- ?W"?:k?'?`kb=2ut??Z? -??!????v?????{GO????T?{????_?"*C?*(y?Y ??(?}?z????F6???V?N?F??>Zw????c_??4T+f#??]? u??gpb? ?? ???}???h i??>??U?WqYB?:??u|?"?]c??????]R?Ha?*;??~?3?*??F?????d ?FL`??u?Oh???>?I?e6?W-???????P??fm??-?2h"??[Z)Y?9??@???r1?R ??????V?????g???[?&??a-W??{U???:R?? -?}???6?I/?6?C?R?sz2\J??) ?08?(????cx??????YJ???1d+?=]X??t???,-???w) ???c??t? ???D??eS?@??j_A?b?Q???7??P2?#??E]?????S????C???bB?kw?????q??52??JW???/??Y???)M???????'V??3??[?? -?j??;?=:?M????Ob j?5'????`?O -??h?{?w$?}?O??~ ?f??D:?T!kr?P?oSD]?F??u#??!??????t?6??????X??'????K?K????sD??????????E?qL??????9X??v%?<-???=:?y5?am?(~???8????????XM??%??wa?F??* ????F,QX?^?X?G4>%.}8#?? #??"??@?S????>zao ???+U?C?D?R{???n?`JY?7$??8???4???c?~;?B}??K??}{?\L??????????w?K??kt??!p??t?????N?o?M???/??????f!K??@ARp???*??3????; grGT?v??j{?#??!RG??#?]f??K??@w?,???@??)???m??r?>i?C???3X?+?????^???0????HS?/py???c2??4?L??????????L??????Q1 ??s8Y??Fb????K???????????D?J???.7?j? Fa?a??7???????g?<??q?>,L5I?1HWg ?[???V??b ???'?.?p??9wK?#??x????1~B`?K?W"? ?%?!@%?;??????HueFTX#??Q(???*I?d!????0?V???k T??^????_zI:u???=??;*F>N????A?@?}` ?B?&? ?L:<??e?h???s~z???:??8?cGZ4??3?W??q?S??P????_??!Z3?? ??????wh??u?s1?????j??GVB%b?2?B?????1R??~6?"?????#?E?6Eb??4?????w??w? ??C0??? -w???Y?? -N8? +??6??>????D???????I?&h??:?b$biXv&???????#??? W?Rv??RY??M?(???3 4f??r???? -8;K~??xa???LH??k"?)??) ?eAa?I???O?j??~.?vz}??sl?E?-??U,8???x-?ND??8`???|=_?p+?_N(3?vD9? ??Q??h?enr ??h?B_????Hy??A?p??Y??L)????N;Q???d???v$>N?O?Cv????]??q6*#?NnW85???#?M??Fq??j??R?,?????O?G?*?tI???+????F?[^???7??7?w??H -??R??\]??08??9?6K???o??2???"3}d?9y? -z???RWI#In*? -?M???6)q?U??9????MC ?-?M?N??????#? -?T????}? ?UJqT?*??I?c??h????=i?\?;???[??!Q[???9???????(?~x?m???U?u+?}???3MR???^????????U??????a_;C??}@??$?!zM????????/ ?z???W:?[?[~n$???s???x ? ?j[(?aV?????Ao?????9?????????R????Z??;??0A?}[?q`?^????????Y?CG??p{?t?????4??kO????Y`???j?????^?1??:'?7:?c??:z?*????sd??8??=?WB??;M???.?O0v???M?g?3??'??h?r;?????L???eyZR??7??????G ??????M|?c????W????np1MA??u??R?}$?8?~???? ??z?????"J??t????>?0??,C?.-pG?$?:??< -?l?????;&???????&~?{?^`?Cr9u\?????5?{??0s+{D(??2?3???N$?J?"?? {???l?&}?r???S??*TA?6?????\????Hb??m??1B??9???3?X?by????,45?S?l3?* ?&?.ba??@f??:???|0?`???_5C?'???l?????Q/?2+?}D??;???^?u3#t?X?F?w?VuO????e?$????O"h{?B?u}?D7?Q??D????0?U???>F?+?????7????,)uS??????{???fb???? ????+X??I5??l/A?s? ????[Sw????z???5?^?9???????:;2?XUi=?? lgLug?[embZF ?g??M??{?tv?>2?`& h???J??Uz??? ?V?^????>???y.X!#[H??0???L?y?F?????x???(???:J! ?0\??t??b??=aK???}?K/?????n^m???:"?????"?^?a????4?!l??B?*??FF??? -???????'Z??????WQ??????(n?Q?S??z??67($???+%????c]?_;?d?????'?????W?{z??,w??T?????F????x??+??z????bP?e??1?5??????????Lv~?[?????????????d$?)??Kg??V@??????`???L??(:t'm?m.?N9HY??#C?Ia??M??P?!?=Y7????P?#??tC_/6?? E.?q????}?&???L?H1r?>X?i??G7??{\&?W????V?/?c????s? ?_yx.nl????,?U7?FlI?????Z@=???$?_????G????9L ^??DB| y G`w??'?s?c??~?3?????.??+WhO????8???|?? ?????-?M??5U ??? <9X'^??????PK??J?mm~?D 8?{?j??Q?y?]5!??Mi?2^??4??3???nya???+???????+??B_{?YT&?-? kR?B_D ?{e???X??????T???RK2q??????ZEyIMT?w0??]?^&??e?1??????e|??h?B??G?f??"-K??????"?^?o$??g?R?P-?P{????c?N????A??P???!pM8??jg?)?p? ?O????????N? ?@2???,??sh?>8j?*ia{xGI?Q?k???????q??]B E+<????C?T?????>U??+#? ?T????4?g?5j0?y$? *D^???o???(???2+?? Mrfk|?)?u?>??v?}Y|C?9?i3? ?c?* o?%??I???? ?r`?I??l>a????P??{? ?y3??G??LTX?|??1??_E???????:?$fn?_10?@}4}???`Op ?.???????? ??????j?[D?-???[)p???N?Q???jkzP??2?????A?P??I???j8?? e?Y???-??????bv??j?$y$?^?x1a?_??????HD? ?}]Zb`?.??O UH????? 0},?????????Y? ?h?4??E ???i??u3?k-?d?????A *???????OL`foatsr0??? -?endstream +x???UX???p $?Cpk??????6??????%w??\?k??????s??sh.???9j????&'VR?6?7J????330?D?????? LL"p???N@#K{;1# ???? ??`?03????~?????N??.*Q?&q?m?N?&Fvy# ?-h #????%??? lcP?? g? +???4e?cf?Z??????vp??8I???8?+l????Cn@'g???_????????'?h??`????????p??Q0??g?U??7?????????.@'???)???O???? bx3,?L??H??????T_?????ee0??m?l???W? ???j?45??d0?????ys??a????????'???d?s??0????F?j?O?? 4?? hg4?3??????uv?f-? ?????? H??????O?i??`?????/!K??2??m??-?D@?^@'??n??????uq?3??t?p?5dhf???????Y??5?? ???$? t???CF????jg????{????!??????(H??j??? A?.?G?????C????W??r???8A???C????U??j"??@???(???S?C?|??&.P>??????@T???j?[??????@?5?(?????#c'#k???Un?????r???????M????t2?9????!PF?3h?????? ?9k!???/m??/?X???m[?? ?????.`][?v!H??/i8?? ??????s??B???_*??_?r? AV??d????? ??y???\qnk?"Y?x0?r??@?JL?z??O???/+??SK"?F=.??????8??/?&j??n??~?g??j{]?'???.?1?$???? ???t????3??jyk?_??B?X??o???/???:?i????^??S??M(??X?3??A-f?q??~??M???b} +?H:>2?????"?oh?XozN`?Q??>?/?;??_S??????b??QM????X? +?Z!?l?P???|?t??M?+>?E?$6???-??e?k???WT???????e????4O??H??????#??????OV???a??????T??;D???v??5???6? k???;???N??;?v?n?????4C???RM/"????X+???X#d????S????J" ?????#J???V?4h???V?/g8?w??R5?~?;Vg?L'?A??yl?????d?]&Cd?T Zc?(?s??kM?"??L]? ???????? ???T??D?_\:$Xi??;?^W'?? ?,q???L?~????$+?? us?UI?>?????!?m??:zV?]3???|????OnR?P???rr4???'??%?M???????d?B???????????uE,#???;?Sx?^?{??[?:o???>??T6??3?Re??D???'?(V?-&z?Z?y&?05/tW??G???r'??????&"??r?r?N??=X? ??:??>m????o?r????????*cS??&(+??E?!? +??yZ?K?J?M????q??K?6??~H?@????~?U???x}Z??DjV0??QE~s?A?Xw?????? ??{? t????T?B?%??} +U??????????C/?RG? qG?q#?{0?wu?=?\? F???Hk?:????0[??IFK(??[L??t????&?:M5? ??? +&??n}T?H.,???I?/G5 ??1?#z????*Y3?"??Hd?O?YP?k,? ????f??Z;?? |?q?F??|???????'?H??tJ9^?S???T'|n?????}/?/4-"?Q??U?t???**c???!?+?? ru??????Ney???%$R??$???Y&0?t?????? ??l??~'R?R?e44??qdU????0o?B???er????d>??#????D???q?????6??X???"[VJ?#Zxk????U??????????O?V??*????I?Y????????vLs?i~???hp????i.???6????Dbl???4??V????5?S?????????y? ?|?t??uHb9??0???M!?V??Y_? ??? Eb??/?r??c???pe?D??Q?4?E\??_3? ????Q?N +?j,a??H?????????????n1?p?'????1?'????h??K?^? ?I???&?5|?]9??P????r????(t??*????/?q??N??D?9F?X0@???8?D???P{?sD??/??'m;??+/[}??????rrd?Xx?x???k,????????Rs?H???;???VUk`>??x??C?$?{b?ld??E??H?K{9?qFV?y??? _???????ue *~?_??T?n????? +N?'?n+??#a?Ef?? ??u5??? (?b?????g??h!?(?*#??1m?q??g[??/?Xx\*???ZwK?#?)X;E??}?????Fo???D??o.d?[??~:??R?q?"?z-?????}?? ?C2Cr?"?????;o??E?g?VEY?*???+?? ?????J2?? ??a?k??????q??g?(??ww???V?c}?MA ???I??o;???V???'?Y9?85)????i @~z??4????p?;?s8?W????4?S??E~???w(??I?Yw?}??B$A?%z??2?_??H?? ;c??t>??H?uY ?F??9?2f;? ?1?? '??(?(K|??F???e? ,???T?e]K??]?o??~?6G??(?_5?C<5?eB]??!????R=??xF3N[?i?aJ?y?!??d?L ??1???f???????`}?Q?+??F??qa?<5???2?? ?3?8`?)v???r???4?#9??}?`V??&I!c~?n??!??bB?A????~)???????????7L??R`??M??0???W????s? 0?PS?(m;??K`A????E???>5?s?C???,b?)]F?o????X?s?Q?4?#?v??!???G?}????m?2i?X???J]?>tKz[u?? +?????^????Uq?I0? H ?#??P?M??w???????o?a??????s?w???j1?& ??]?c????'?Ze?+2F??l?W?g9???b????6??B?b??? c??#?VG:f?p?????a^?&A?????????????[?1?Re?gCu???/??r???Zs??QNJE?J?-Q??Bzw(y'U?FTd????a?]??!?G??????@?Z?&??? ?Q?O??v\p?+??|???ep?{z?E??_PM6??>??????v?>c????r?8%;q??$??w??L???*?? ??b??3\????V???sn??&?1??(???KA$?GF?\KL????< ?U??J?aM?Z?@+#?#?8???D????C???4I/???5???@d$o?q? ??[???_+?????,Zl?H7;?t???G{?9?2??=?s?}'>?3|??)>O?xD?j?????~??2?W?T???p5?]U?bVH???????z]g??E?65 +k???0$?q????????Je??K??E0???????n~ +]BmW???BE?p??x?^cc??TEt???6 ?)31Qp?-B??Z???B +\?cTE?????????????G??^BE??'???????'?????Re?d??A8??7?y?E??U?#5!?.? ??????/}f??\I l????.??]?o4A????o?~b??? 2?[1.???? Q????????a??I? +HR\??S?x/d1 :6????????6Rn?b???)Pc?UN}?????P?+l?)??????`?HQVT?Ye ?c?,??h6~?????l^?uAR???{????C???= W??*?P?-?? Bp?mN~???U?{t???!k??zes???&L???????M??f?,d?+??o?Z???T? ?9???x?????Z???#?O2-3Ch????8 ???ic?C????yl?l?A???M?l?|?*?o ??F?K??`?? +?J ?????z?K??=???????5?;a???i0???tf? ??'???9?????? +g?;??????+?z?{O??,???"??]??k?~?o?|? C'>?X???????j?B!?6???????Gu??????b?5??????LX?>G?V?q??,?? +???????p???y??|?`?nl?8??<>M}?????X??T?\?|??2C?:?J???????????ym?WO????Q?WJE???????j?1a;??o?Z???t??6u?3?+??=?.7;????&?;????Lg??????hk??V?7c??#?c?????K$8?N???6???W?z?? ????r?K%??rl???\??1???jB??NN?/n?bSt???? 0?RR+|?^g4???4?+?? ?~9???????MM j?????????9v??yH{???:????^??~%??wN????????????4??'??y???c??????l??F? o?Rrt? ??5?F??{??.? 5/?n]a???9?r?P????4k?I??????0?H???t??????~?7????K}LS???H??H??F?] ??A~?)?*?mU?r??P@ +???b?]????)e!zl?p?I/??%`G??t??C??????v4}?????M%.???Z ??b?/6)??????aL??X????????S??6?b?A? e_d?&SV%??`???NA6? ?-??EY?????/b? ???,?J? ?????A??Q?Ik8??T.?{pLU? ?g3?J?b??|i??M?Q???;??%1??ZR_???=1pM??#??O?j?????`Gk?Z?I:h??c?1c???]???R?Ve???Y?R)??+=???.??????;?>c??g&?v?G?OI????bf??aI/??????? ?4[?? ??x??? O?}X????@?aw?k&? 4;?L????wx?V?s{????Y'?G?????]?k?: +?([?d? ~?@gF?t??6_>n?4?x?'?????GJ?WLQgug ?[?V???kx*???? xjn$8?????????}???? d 2bI/?????Y*?s!??-?$K ????p?as?c?g?c????w)??g?H? +??3 ?'d?S i??p???"???????`gg=?,???:?cQ?????vL|????M?\?t-??aZ!??e? 2??^??!??WJ????? 9?6Xz%?!??sH???????t?OHb???$`?w??W!????qP?&m?_n?Y>?K?U??J????w??s{`)??Q?A_)?HLU?`_d1r??O????#???-??=?~?+@?@?b????!sl(u1?>"V;V?j?(?k??p???? a(???i??U??&?,Z?6.?-??JP?h{???}'????B???;tx?????fo3? ??r???i_?U???n_R +???^?;~??bN,?Q_w?????? ? ????"7*oN??1???+?OX?K????Rc??3???~??q????uN-??w????#I?? ???wo$???mI?Q?%Cwy]?????j??k#???F???^?9????;L8?zHA??k?C??{huGApjMl;?? ?]??????e?.?M????????????????Ys?Y7,?AF??5X` ???:?t??lR???$?Wt[$?B,?B??t?(???QcxX?.????@???'_? ??M8X??=^???:ja?}???-.??IM?%?????R?_4?E?,??C??i???v??D-??????Ir?O ??TF)>zD.~???????\)t?B!@?G\G??3??9???.Id??? +`???????d?Q )? ???????ouX??;????=??f?? +9????????? + ???U??f?B'???S?)???{???0??(?r>i?!?N>,???H^?2???????y?<)??\??5?{?+? ????????m? ??w?3H?)? ??%w??????^??uW?? ???*?o?? ??????dV?.[,??b???J??44?`o? +?8?e??????y?O9* c6?vaKV?$o?z?t?1x??v?3?x? 0?C?????,????:b? +?????Cu?:1?H?????1an??A?*>$g)M9?n?'f???6 at O8n H0>SAF?\v^|(a??3?? ?????F????c????*|??R?? ??lO? ge??fv?j?+0??qY??fZ?????7?? m???ii??WM4??,?%=?-?~?E??f?G?wM7???|???y???^A?\????y?Ozc?;??j?????? ???????'il%????w???-J??s??f?w?.'fa?%???B)?w??q?/??9z?M????b?$*?g????'?*={P???>S?Da?0?P???????|?N?I??????^?,Gf??+Ub?N ???X`??*?{?~9???N+???????4#?>?.?hY?Jh[~+?5!Y@????["?o3R??#?*???eyF?W? x??o5?2???,????ZO???Ke?O????????d?R?e?*??????,?h??KC? "??:??*?]e??h/?:?j?????? +???k???iL20?d_Y?C9??f????????NG?T?K?XC??(???J???&?M?9????+A? +Z?????mY???????=?t?}tV1 ??b}???1???p??x???M ????o??????$??W+?c???8??Yo(s(??*+E?] +??????/?I=?M? ??0+?????w????????????;???b??jM?A??y bD???l_??y?)E?+"?ZE????MssI{n??[???????????~3????F??l????v????Zn?lu?x$??V4???^?tK?_?:9'i\!???K+7?8????8?5'Y?d9?o? q????lS?9E? ?I???pj?)??{??????????m6P/??I????;?~?}S0?o?G?fRy???-'?? X??o?-7??aP??>??'.%??*??I??? ?%?I?~?z&A?a?^*?S?????[?E?D6E????c???~k+??CVv7?aP?E??i??K?????|#(]??0?6,oTL????;??V???_?%?%?5x??3 +??? +bC?u??!t??/?rN??v????'f?N?'?`??????? 4]???}?& +-o??#V!??????pf?1j?a??.I????Q????P]? .W"?*23??????9????.~0??? ?Dd?m??IN?/????ml???C???,L9>)?Y???"?J5UE? ##??[V3(??2 N#?XY???-`]?B%[$0zm?]5h *A????????{???U%??a5???t???????%???W??????F@$6?dy?5?il???~?1bV?DM,t?`??,??-???????Xg?@=?X?~??Y??V??^??MiC?d`?M???J/?\es? +j+?z??i??Z4?UJ ???6??@[?? H???{{????H???? f?K????{??,?h?]??J?????dE!?Hn?8??j?O?Bf)H?)=???:H??????^,??????[F??N&??fQIa ?c +Vz????????9s??[?????C?? ??\??3`?7%?f?am??R8?U_???"???x`{GKXO?51??*?K???b?Y???1Bo? ?!72????j5t~?$?N?*???? ?k?L +????& H?s????t 6-k??tGGf???.3/(?~???d??ay?(????????l????|g5j$y ???>7p????????Oo???j2??JrW??f?????m"?m-?? ???n??tR??????%?"I???|'h??if(????6?C?p???}?*???c????????`?5??l?>?%????'kY +"????7,?`???J??I[}v???V???H/^Z??sZd??H???????c4??gM?P??!J???9I[I????????j?????????M?Or?V???M??w??!I?5P?z???4?n?!9???gNZ?c?a,??????`9|?[??:?=???d???? ?? ?&k???=t????RR?E6 UI?Z?16 ?bN2G1?^?X?]??&? ?Z??i; :???8p???8O?%??M??Y??????_?? ????\?m??????2??endstream endobj 126 0 obj << /Type /Font /Subtype /Type1 -/Encoding 322 0 R +/Encoding 326 0 R /FirstChar 33 /LastChar 125 -/Widths 323 0 R -/BaseFont /ZDODSL+CMTT10 +/Widths 327 0 R +/BaseFont /MKWFYC+CMTT10 /FontDescriptor 124 0 R >> endobj 124 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 -/FontName /ZDODSL+CMTT10 +/FontName /MKWFYC+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 -/CharSet (/exclam/quotedbl/numbersign/percent/ampersand/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) +/CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) /FontFile 125 0 R >> endobj -323 0 obj -[525 525 525 0 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 0 525 525 525 525 525 525 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] +327 0 obj +[525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 0 525 525 525 525 525 525 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj -322 0 obj << +326 0 obj << /Type /Encoding -/Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign 36/.notdef 37/percent/ampersand 39/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal/greater 63/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 126/.notdef] +/Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand 39/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal/greater 63/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 126/.notdef] >> endobj 118 0 obj << /Length1 1316 @@ -1737,52 +1760,46 @@ /Filter /FlateDecode >> stream -x???e\????A???????A???s?.?????A$?AE?????g??|?u???~k??&:?W?N?P9'G7nNna????7??? ??I??89?????n!!n????? ??/? ?a2????a6V?ni????P? ?P?YC??=?????? ???h?5?? u??_?? ?????????P????*????mr????'B???~7???I?&???$J?&!P???~???x@??WQ?M??? ??? ?5?\S?7?5_?&?????????N ?7?????qs? -?@n??-??@???7????v ?????:?Fn????u?????}a ???????????cx?????~???@x ??????????//????.?+?????!?0????~????6???zA!??N???? ?e????Q???U?v??a?N?A?/Pra[?????$??@?????r?n???!w???1???a????L?w?????L????0v????6?0X??_??s?u7_?EFkm??????+?5???\??vDX3/?&~?KY$(b??% y~(4?6??}????????]??)???K??4o?U???????A??????T???W????fs???f?=;}?f????y?z,???Z ?T.?R?&?s[?6Bmb s?P?|A???????????J???"}D???Gq??w2????wqkX?X_?*?M'L???W???qM?????{_i??O??8?????ijo0uZ*??_??(?EF?Ht? C? ???c?l2?*?2??R? -c2@????????R1^???z??F????wo??VJ???N?HV?>???v???{?|4?T??V????a??%??5???g??J?P??? ;?=F?~x???8?g????5YP -{???k9?O????*?????@???????gy41c?kBF?8??vX?4(/`???_?ltRYuc/?? -3???nL0 ? ,`??=??W?[?m?????%?+??)???KW?r??s?2 ?i~C7-?Pgo?/??s?KZ???a?]?i??O}\??8??V?]?????? ????l??8????5????0???o?:?$??wB??USa?{?d?????I2p]_K|?,??? ;P??s??5'?7??j??guy?Z?@v??\$?i?2^???#?????????B???? f?b1V???Ek???Pi?D%Q??7?.z???B? ?w;]?X_? ?9?|?????> ??3S?F???D6?.D n?F??????-2H??x&E?36D?v>WK?4?!???Hc d???k -??p???????A?t'???Y?I!l????t,WO??.??Gm"!5??DiPE??n??E?Y?????U?????N7??I`f?????tCF????V}??JI??????C?:??%C=;3:?K???&??C?????B???????v???Q?'?m???Hg?l???G???@??Wm?a?????8_!_????q?vX?^????*x?0?y??%W?U)enX?7?y?A?6??wd[?d;??a.]?G? -y??]c?'?4a?W???v[hJB?)??8!e^?a?0 -???H<&?"?8?tK?Y2????`??%?d????%?F???/se???T{>?a}#h???? B?(S?I??]?F4????h?f??0v=9k?E ?q{???\O???1uG??B?{j??am?a? ????_m?ou2K?f?++????f?b]-????[?M?A9???-?????c,??V;-?=#?}?????>??;?(< -#2W?;?#:?u????Ba ?9_X&ij?r????0? +?|m?h????{?g???w g^??????e?8|?-?L|s????,?y??????`?XlxU?????\?????;????? -? ????v? ?;k?0??"S?F6?L??????4??Fu?a??#?Zm6XG?<;???gzn??t'???0`??]\]??)d????|y=?XD????YwM9*?r?z??r'?lq?e??I?????#??????%T?l??'??B??????#Z?o0??_??._?????N???^??????tVV??????C???klD?*p2??;??Av?hY???Z??????+.N???`f5?mP?d'??c?????m??????"?7!???sP??M7????????B?8?(??, ~ 6?qci=n?"!??F%H?r?+???z??S$`R"Z?U?|?F?Z?sx?!????????Q z??9Z??????v6?O6??'8?31z???0?(S??Y[???7?????? -P??_????U?Om???f5kd????xj?w{????-?o????? wj???????U%En??{x_??yM?P?????V??D??O-???????q@9|7?Rr????R?"??p??????E(????KMA?:?H?JBl?d???2?b???vY??P8Sz5/?n"??????@???????J????hW???_??b1C??7??6???????1x#??5~??v??#?,]m?wa.???L???????>@|=? ???n G?g??????'?8{???m????Bq+?UV?qa????JtY??F?jn????5~b{?W?j?7??H?'k??K?K?&P???'??????=??????J?5v?u???gGw( ??l ?9?g??_?????F??` ?r?v???U?u????Zj??ClV`7??u???F?/???Z?Z ??????`['wm?d?????3|u`??#.N..nx#???_&?a&?q??u???0 ????p??ql?,???7<1????>_?W+g?_???????@?????$????????qvp??$?'???S?? (???@?H? ??M<??o??~\E?7???&????$???MpM?????M|??o?????;??????Mp?????7???@??????6 ????????p[????????N ???????????p_???c? ????~??~n??0@??????????N??0???o???=(? +???p????Ko/ ?+?U???(m?????s? +t? ?C???+?B??ME&?????[t?????a?kb??????F?o3??I???? ?e?.^K????????`Y?AQo????| Y?M?9:?.#?????????:au??t???e?|?^?)I??C?v?M??????7??????,??_*?????$~?$? 2)?^?x??? ????h?6????$6k???sw????.3?c?E????|? +Q/ql????? ?&?05?????]?|/?xj????)?Wt?~7?s ????|??%????%?r?t?D??}U}?[??Z?-;??5?V???????J ???S??C{1?m?]eu???V?1???;???%???/???/?0&TN??/N+??????hkt???~???zm?,???,??Ce?c??????mU?;??cE??!iln?k??w*G?L%??E ??&j?X2??C?|?T??^])?jU??ag???2O?????p???& Jao[?s?&????uWQe?????(?\??????&fL{M?(G? ??-???k????O*?n?![\a&?b??? f!y??zG~???WqGwq??{??J?o????KW?rr%2 ?i~C7+?Pgo ,?s?KZ?t??a?]?i?O}]??9??V???????????l??8????5????0??{l???$??wB???Ra?{?d?.b??I2p?^K~?,??+?8R??s??5'?7??j?P`u}?T 7Q.??]/????g?g?YeU?Wa??K|???H?k????5??S??H"?????hfg??????~b&???q????_ ??}k?[[c????????J???V?G?}???{?K?9??3y??????/q??????J{h%??S?K???Q????7"?' ?=???@?W.I3ou??? ?a.???????JH???Ac^V??D??O?H?A?v1 +???5?#?]-?b`?k???R1l?2?}????????>/???d?|??^???"??wAAT???V??plb??_h??q!? ?@?r?C??S1??p?&_???h?--[???ewy~???"s>?lA?I??K+^?p#zl???gy? ?z??rQng~?_?_?"?????W=WD??p?? @?=?>& 1?/?>%?B??`I???6??H)?Y???@?H????????u?&h???(k???o?????gy?=?rJ}???P??"jl[6?l??[? ???iU"?G?7??!???5?G??>?I?$ ?>KeP???Uaf?@ m~vl\??BV&+?qG?3?? ???'!nO |?>"}1???????"/xfR??e??=c?E]??Ld???fD????4 +???}y?kd?D?K'?(6n???&??]?3??54?J?+??o>?U:?p'?xE?????G??c? ?^?rz???L??@)?c???????x6?|9?2?D}?_???]s???%??'??Sl?!+??Vp&?g???d?????1?i9????}!?#??o?#??Z,kV]???3???!????*U???????????????|Tc????.(?Y1?sNi??? 8??+V??6)b,????????.+O??bZ?Y?????D#?0?4???Y?9m?S????+????*k?M?+?'????B??l??b????????ti ??S>1?kn$@??*???Q?"h6!????.}52Idv???^?}?P ?-K?L?W?SrO?d)?w?O?-???f4a?????m=??&~?????N{?r@?I??Z?P? ?N?jan????Y? AE??^?X???^???u{????I|??2???Lv?o???[: ?9?!?N +aC??u?? ???e?e*????????p?L?f?}Qq????? h?X??k??X?{?_?>T???:9E???>{m???-???B??Dq?B??? ??~??n?????\?FP???2?[?a ??????? +)???>?????$qoNe??GJK2iBjl??Ki}K??(?/??x?? ??Jt{?? ?????~X?`&??k?^??u ?,mC?}?H??????Ju??\|r?=??????:??flVY??$??[Z??5????X???m?????????~??r???7?:Z??Sya6??`?(1?#?Y?VFB???3??? ??(w?E?????wu?W??>x?Y?U?4?f?W????T?-??#?M#??P??jf???o?????c;ok?: ??5\f??9??b ?mu?{7g??;^?'lq=??F>~??????(???? ^????6??XJu?of"??o ?V?3O??Z=Yn??f ?!??o?g??F?jS?|?????}?.??k?5??????"? s?X??_?S?? &{???gdh?{G?UO?C????-q?????A+??d? ~?????S?M?? 1(? + +?Q?#?PF?1QW??A?[???R?f?U??/?&?OU?/?n??M??`??'g??&1n?R???5y:????* ?}?6???i? C??~???i?V7?l^??2 ?]o/?? ???????W???r??k??Qq???Jv??????*???????+???}????Ww?K???$?#??i??1?vJ7e$?{A?%??DP????Q?? _gF0????n%"?>\?~??y?g_?O at s ???kLs/???L!? ?qu?:?A;?????Wv??Qe1?L0????mmk?G8d?????o?????+[???V?D?e???Iv??QWU(\Ne????>O??l???? ~?WU??I"???|5?????D ???????????BJ???22??o??U????2??Qix?????J????|BrAC(???Mjn?el??;xW? 3?/?&????^??v?F???:?\?oIz+$?,vl%????F?X???O'??7$:?$????(?l7`?ER?U???k*??a???????0?????? zljl???\?O??#.O??%?*??]?Fj^?(+~??]????W6?}???I???4u?u??|?;??a?g????i2?aW??O?/m?|?3? V?NdL?U?b??;>VC>?>??&>??+???6?;+?N^$?????$??{???t2?n???M??????U????U??????!'r???[M???K ???M??8?O?4@?1??~?";&?_?????f??v??63 ?F?q]w?b?H?v?? V?5???L'?????????? Xa0A?C??p +???5?P^?)Q9???f?]S? +??????I*[?mE????$?@?O?k??????6????I!k??f???????U???xU ?vIN??{??qX/???P?]&+?lOcU???c???56?o8?@?N? ;R?????Q?U?l?N??? \ ?? 0???1?E??????????]??????"?7!???s?W?#???f3?)?QK??Vq?#P?9?ln???z??4?EB??J>}?u?????OO??I?hM??????? ?(??C??k?'????@?LA>?h!z???g:?x????????????_??\? L??f?TGJJ?A=N?O???7???Y?????:???fuGd????xj?w{????-?o??%?? wj ?? ??????Do??{x_??yM?P?????V??D??O-?????? +: ???s-9q?Lq?W??g?\???JJ????RN??? q?|??J??????Y!LT~? e??!???.N??3+%?u???Lf3@?#~y@????9??V?-_,v??^%Q7p]???8????{????~o0?[???7_ ?P?I????{}C;??-jj???l? c\`?c?6?~?c???h???????L; 2?}???% ?UpN?????@??????????Z??-?;?????w-????M??????.}?@??rP????1M?PA?D???6o>??RV?mk??????/? ?/??0????`?!X:g ?K??Z?&??i???v??X-???_?)o??(??%=???????,???A?n?!?/B?}??2/??????yIw?'??????}?????D??vu]??e,3??|#[~?????a?????7??Y????m8???2??}Bn*d?x???{[????0???`????h?{???????~?????7H??f???/?&??~Qe?1????U??lA%j?M???6???E_?P?b???E?=YS?]J?a?yR??8??w?U??4?????(XC9}R???zZ[?????hcy????JMW%?8L ?q??? ?7'????????)??~??0???g?Lr????? +????1?????*?M?!???P????? ?k?^ ?d)T?ww2??8?F? +??>a?*?\??P?????kF??C??????????C????zu??????~?????kx?Y?Ta????i??o??ba?? ?U?? ??[AO?;p????jw??? ??%???{??B?R?`I] +???u$?g?2???? ?{?m8????#?u7?II9?F???S2?Y:A??K?#? +?g?-?e{?Mz?$??g1*??????Yd@????.?????b?{??????&???[?1p?*??}??????b:3????k?9??eQ?$?TG?}3?????`???' P0??? ???_Km?endstream endobj 119 0 obj << /Type /Font /Subtype /Type1 -/Encoding 324 0 R +/Encoding 328 0 R /FirstChar 45 /LastChar 121 -/Widths 325 0 R -/BaseFont /AXWCAF+CMBX12 +/Widths 329 0 R +/BaseFont /SFSPQQ+CMBX12 /FontDescriptor 117 0 R >> endobj 117 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 -/FontName /AXWCAF+CMBX12 +/FontName /SFSPQQ+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 @@ -1791,10 +1808,10 @@ /CharSet (/hyphen/period/colon/A/B/C/E/F/H/I/M/N/O/P/R/S/T/U/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 118 0 R >> endobj -325 0 obj +329 0 obj [375 312 0 0 0 0 0 0 0 0 0 0 0 312 0 0 0 0 0 0 850 800 812 0 738 707 0 880 419 0 0 0 1067 880 845 769 0 839 625 782 865 0 0 0 0 0 0 0 0 0 0 0 547 625 500 625 513 0 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 594 594 ] endobj -324 0 obj << +328 0 obj << /Type /Encoding /Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 58/colon 59/.notdef 65/A/B/C 68/.notdef 69/E/F 71/.notdef 72/H/I 74/.notdef 77/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] >> endobj @@ -1808,7 +1825,8 @@ stream x???eT\????[?{???]????qw??????? ??$Xpr???|;9??????f0??5W????UtS?*?1????%?A.??L?|1UV+ ?(%??????$n??????$?&?7?_>N>N6$J????????? ?F???$n??????P0v????05????Z]?j{???'????x?7?????C?r?i?????I!z??z??sqkK??j???Q?????8??s?m??}???? @@ -1851,23 +1869,23 @@ m e2Q????W?p?????-Pa?W??|=_?eK;y?NK):?=????????????F??????N?SA?Q%%? 1??????K]?kd???I?Yd???DH?Z~GB{?n#u:????P??YU????(wf??D?M??n?72G&????\?r &??F*6?+.????t?9<>???????BM????-???_???{i?#??2l??g7?iD?????:;-?K[?????V5?????? ???????4??TR?-?t??? ? ???`B;????Wn\?T?)O9 =!????????wOc??????t? ???K7??????=??E???'?f???l????????jQ4?!N?S??Mx??y_ %?Q??%?>???g????????u3?0A?w???????/\)C?h??@*Y????????U???k?ap?p??]???l} ?\\P?D??????K?~&?C?4=??????Ox:}k? ?????^???R'p???????V[??3~?????pop |??]??5&Ti?2?A???z??C??Y?w?|?T}>h*??`Q??2T??A??hFi&???\V??|Nu?o&a??H? ?S`/?{ }?oh??E???_???vZ??#}e?HSp?|\i??E?K?~ -??SxtA?9???h???2;rR??????? ?:G9/??+?k??~^????'=?|\5?????? ?Qd?????????{?UZ?'???&l?KU;m?\o?????p???`????@%+&???????OL`j 4vr??3v?A?_G ??endstream +??SxtA?9???h???2;rR??????? ?:G9/??+?k??~^????'=?|\5?????? ?Qd?????????{?UZ?'???&l?KU;m?\o?????p???`????@%+&???????OL`j 4vr??3v?A?_????endstream endobj 95 0 obj << /Type /Font /Subtype /Type1 -/Encoding 326 0 R +/Encoding 330 0 R /FirstChar 11 /LastChar 122 -/Widths 327 0 R -/BaseFont /QRWLPS+CMR10 +/Widths 331 0 R +/BaseFont /SOKYMW+CMR10 /FontDescriptor 93 0 R >> endobj 93 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 -/FontName /QRWLPS+CMR10 +/FontName /SOKYMW+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 @@ -1876,83 +1894,70 @@ /CharSet (/ff/fi/fl/ffi/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 94 0 R >> endobj -327 0 obj +331 0 obj [583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 0 0 625 917 750 778 681 0 736 556 722 750 0 1028 0 750 0 0 0 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] endobj -326 0 obj << +330 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 91 0 obj << -/Length1 1224 -/Length2 6620 +/Length1 1242 +/Length2 6715 /Length3 532 -/Length 7381 +/Length 7487 /Filter /FlateDecode >> stream -x???eX[?????N ?hp ? R??k ?-???h?(?8?????b??V?f?}?????????|Y???1??]c???^K(k ??(??@>n>qH]???????+??? ?C?{??<????!???W\HP?W??9{??m?6?I"YG?? -?P#? ??V`(@feAxqd?P??O?t ??;????`mo?XBl??py?pRv??D? -[?9?{?wEJ???d %?aNP/?5??G?? ?t????????P ??????????^???9:?! p?:?w??TC?_rr0?m??C??d?l??_!{WE{O???=??`??B??C???S???x@???? ?????Z`{'?????e??????adw???S^d{??????w/?c3'+????-?_H???^???A???`?d ?@jS?-~??1?/:l??????f?v:a?8???C??c%d??}A??B?O??O?%????Bq?k?5?l?A????7?rm??=sx?ox?2???F?70h?ae??iWpd ? -???eV????4z???xw???`-,6e&b??c6L???1\? ???"2????LQ??????9?[????&t???\< &???khz???u??%X?b?)?B??.?_Fqs?)?,???K????????]?W?8`??????7?$g/??nC?.???L%!?G\,}????n?)?G|??;????%??E?jB?1?q??_????h?????;U???????r??@?? ?Xs??N????J??.? -t???? -?ZX?Y[??Vm?c???m?;t6;??b?LvZJ;? -?*??EOb??TQ#|?sB?o?B(???d??%???TR?????l_{???`?p???fC?h?n?O??????`.?,?W?\?\?6?;??a????:7?,?????_B?t)G?(zbB????,???%??????????b?????yH???^???R????gV?F????U??????? ??7??F?????og??!?K??f?0?w?R?S????gF?? ?V?m(?P^7 9?g??V???|ZBD?7-OM?????????]OsY????Hd??x?/|?????4??c????~???/??FR?]vc?5??????"???=C??'X???@z? ??tl-?_?X??,??f???OFl?6???F?N3???|Q?*?F??i? .??9*U???85g#' ?v`z??>?(?wSY??j?a??.?W}"???*r=??H# 7>?/????*?|?????=u^?| .?i)72-???Z?h>7?e(?? ?~????h?t;W3*G???m?P?a^O??s??t??q?xJxuR?k?n????K'???????[}"??$AJ?%?3-???{???????"V??? ????;??=???Vv??xt??{???kT,?????{???Hj??????Ai?!??]??????!??}c?????}??=???'????k?\8?df????????6b????b?q(?????>?=???ybQF?UM???????og????\ah??b&Ha=??????0?a 3?e?^7???Iu!2???r[?"omutG???xh?O??R~I]??r??R??[b+?Oc??/??$-???*?K??"?,????12&T=!???7o??+???E?I????D\????'9A!{????s5??O.v?Q??a?D?`??P+<J???Tn?6???!c5^??{F??f?9?lp3 *?e?e%? ?J*LH>?? ?>???\"g_!4#(??3?#????8??e0?*W:????????_??4?xY?k?g ????w!f? ????t?%?e9?%????uuF?????3?\/:????&G?]3 f????t?~ ??"d)o??X?m?$Ez ???|????0?_,?=?????????6?6's????=???????XD8_??6Y&??/%p??5?|?????s??s??B?>+7QO4?$????c?????749??LR ???M?;F?????p????n?'?)c?#uM???Kd?w {? ???T? ???.|?VmOQ??I'?vw ?U???]?? -?' -?a?^ ?[W3u????H????nj~U|z????? ?$?E?D?????`??gX???@??N9?a?3?????xD???v?4?s??V?76??????:?]oY???E2?jcWs;??N?J???W??u?k?????G?"?V?\????U\?3???????????????+"??.?*?:G??&'+??u{?Mjj!??\??,??}?F?Kc6t -_?97q;?t?V??cd?????1?)8X??8-??Q?D?O?p7?{s?*?^???????????>7F???uU???o?u|??'?j??? ?L?CE??}?!??a??Xr?E?{??X?????????MRiG???? -O?N??E2 ??s?? $F???7i??~??.? -?l?c????????X4?< .+?? ????8?i??pAw|??;?!?????(6?,??A?b?3+????/??+,?|?13?6?K&-q??ES?$?8f!g?\??????? EW????"`???C:???????O?h7Rs]???C??????n?.?!4???;??'?"?????@?Tk?r?G.4h?m?6k?W??????2???HLo?BK???#?21???????e>hC??pL) N??!e -cQ)&S?(0?????d?2?&RE??96 -?Z????8??v_?[??0?8?(?M?wpL?Aj|???;G6??????Z?`??Y????Fleg]s2?hmr6????^ ???x/?j_$?(,7/?J??(u??????W??????0?C???d?/?????&??2c9;?_??SxZ? &?S??JM????F?^?}??r{???t?~??-~?Z????xS???}n?????-????lL;?R|??(;h??f???+S????(???Q?..CW?j??????'T?'j??@ -?????"G4???-]????xS?M??i?~9?g??_???w ?d??F?&??????????t>?eM?q?JE?_?F$.?????p??M?? ?b?Q? ??????.R???????=j?6??g??`????iF?~f????')L'?m????8jz????T??O??aD\g6G??????a?3? -q2????~@??n????,R(B?l?(?:{b???D?'?/2#??um????iELb??k;E -?&cm???;$???D??)l??????|?}?Kw??r??D]???u? 9?k?,?q'/??P?:???9????k??]? -?O??Uk:?????-????bsF??v??????k z ????G??e#2cX?H??l??A? ^!?? -????ro?L??f????i???????Nt?pm??8??a???[??? ?"R&?V??o?'?t???$?l>*5?<??>h+_cb;??????8?'??u?Zm?h ??p?W]?%Y'???;T???_a! ??n_?F'?l?>?E????????:???YR??s???7?qP??(?= :?????E????t??O?5c?\)?^???Y????????([??R?e?i?????????{lo??^??>??xI???49I}?#Q ??+}L~??s??;????a???????*??[?B]??WJ??{??0??>?7 ???2KO??:??%!.???????[?_?,?~,??u???e.i???&?W??\/T?;?Kl#?g????7??p~?????0C/z???C?10 ??I?&?e"k]??N??????????]???HF?~???W-A?, -?;"xs?-???}???????e???P????? ??v???? a~ ?g?]%6???:???*???????&o??????????=m>???J??x1?(?????oh??zf???G??[????F?\????V?#????_??{?v?????{??????r??} ??{???_??cSt#?=x?C???? Ji?S83:????m?????????g????G???id??&??+i?^s.I?4c???i8?`S2a!!? ??? ???O??}?????l??D?<6??2?}?7;n?@?<"??\?&????$???e?=??:?>v?S??J?{?L?d?K???d at q????4?zV|l????Z???????z?f.?o?t?x#?q???h?? -v??c?p3?CJ ??????~E&!7e?rh????????l?Uz??b?%Z?Q~?D??#??&V??&eC?????PT"??@?}?`?y????$?Aa?? ??[|?J??E)_?F??U??`?7?j??s?%?z)??????o??? ????8???Wl=?db??Qm)y?u??Z/?~ B?F????w?????S??O[?f ????#?|?f?5?tn??&#??3??7?????Kj?+??z???\??#???5?_9 ????????{????E?8?6????L?4O??XIH???0:EI???.?zx&??F*????x????[?D+( G??????8???endstream +x???eX[???q Z??b??!??w? $@ A??VAJ?Phq???)^??R?X?B?????9??|???u????s?1?g????1?aUG???A i????HRpp? ?` ?? +FA?? ))a?:?s??K??J ?8?*4???r?p??$Tr?"a`w?.? u??p????*??@????A??H(D!0??s??????J??x{?{????H????b$!w8?:??????Z?]\????Y??N??u? ??W???Eu(???S???)#??c-sPrw?C?B?`^?0?(??rp:??^???Pw?+`??????????????E0?e???O????b?????????I?\??????????PXLF"?hfz0$ a????1pG?0?1-ytD ??P?????????????????? +: ??????I??cF??q1????$T??0???! ???3?????d??CR?]?C !?3?7??BCLY?????b?`??8P??7?H??? ?o??p?1'*??b4??0???!???7?X!C???o??B??+??c??b?|?Aa??7?h??? ?????n???[ee?_?????bB???D???o??H?l???*`???a?? +??:??2./????????`+;5$??t|n% ?M??j{?,U[\?d?%???b??f??m 4V? ?L~9?k???V????L]???E?Es???71l???O??- z^???p??|%????i?S??!.a?? 7????a5?|??>F4z??2=oq4?B????Z ~)??Q?9_K_????,g???Z??VW??m:???????j]uq??A?S8,yV???r???':?????!?D???[????????? ?h>M?p????2?}?a?????a??u???x??% ??f???B???7??R??htzRq????@?????????maC?S?}?5???u"?????t??7?h??? ????K???0??s????;X?"?O???Y}F ???R????*e????? 3(???Q????r???X??????BG? ?/??t??d???V"V??cb3?l ??YA?(?9??e?????YbDHmv???1?~{??r?????A9??? }?!o?}???vg??{j?UV??Q??z?)iAJsN???%??3?E?????.???e???S??W???k???x?A?W??2???w??_N? ?Z??9~f??]????|???Z7???.8"?}T??S??=u????4*T5)?????f??U?????C_??? ?>Z?_?7?;??o??z?M?????? ???Z|?+r01?]???:?,?3??????5?????P?????G?^4*>h?'S[???;??dpU???-g!5????X?dC2r,????}3??? -F??? X +???f.??a?????ur?>J?????`????'>?R????n? +???{??!Jo?????[?# ????g???o"???\L????^??????m?mFJ6???J??s???JEe????/????(MYX%bh?????`?@!+pYO;KH?G??N?7D?x???P??'?2 /????h??G*)??%?%;N?lY?i?sf?B?+F?d??:?!?_V??|??{h????G??/??????o?z17?????????l???????? ??l'??????????wR?o?O,?^`?d????Ckb??7?T??Y???)IZb?9??Ng???W?8@i?E2()??*~????????~-?+????W??F?>kq'?5?o????4"e?????$8?g?@???4-n8>(?]??M???6k?P]l?8????? ??GG\??6????tWl?9??1?????????I4?K?p??VB?`X?i??a??#oK3??%y??pG ?>:???9ah???b?*?w???e??QcaC?M?'???f4?^h\??L1??d????P??4DHW-0x?'f?jk???D}?tJ???[d??????DSw???|? ?)?0?r?cb??O?e?r?Tw??Q]x?)?4??? b ???Mv]#Xg?`???"?????????????^{?????|??????nfQ?7,???F?qK?A??U? ,???0???&?l[????|?c???? ?5?????E??_???.?YIzp?%NA\??o?B?pFe?R?3c?&+??|?"W7?E?o???U?|GvLw?/???$UgH?n???x???????O\??s UI%???rD=? ???E'???O;?}Wz^e?]?c ?????"6Y9?,RA????Wx??????"??;9???R+?G?>Y?2?SL|??_??"???N+?]?F~6????r???(R??????????????[h??Q????w?=???u???a]????yw????z7L%??B??N?,]?m????e- n?Tb?t??D??g=U!??NCq??h?4????0f?????o??)^r?R??G???[\???|1^C ? ????#?qS[??.???+j?TB???r?#2?{"G??!?&?G?J#??????Y?C???&?m?? ???&???{?F?? ??k?G?Y??????r??S??ZNr?u????X?#?N?l???x???:?? 4?9ys?DN?V??6,???>:??? sg?? ???????T?*"TV?}z????%?? +>?x?C/?X?? ???{Hw?e9???vw?r???????>????????r?/??w????z???Jv??i???p?A??2c???h??{? 8?M1}M??:"??????c??n?Y?Q8[?U???8?n?v? L?? ?|u?????????l??&?p5??\T\z.u?\'?????6??? ?W????+F?|? ???d?S?S?l??'g~_P??y?0?w??f??q??????:?O ??(??;}8?T/=cc?nf????y????(??/?y?? ? ??*6?+?+)8?F??.]???N?N"??o???%???\]??3?'7???$P6?(?PN?N?????W@??_??qb?????iL?M??3{mZl-?-Z?J?G?8???P??O???}?P2B+??^=?;4 ?i:?R!??b??k 1= V ??P??_6%?L?B?????@^C?S?nW???&,K?k?~???Ny?ql?n4?????#?T????u? ?Y?`]"??=?N?,??l?]%K?1~\s?'?Jlr???-??!UF??????@??n??3?*??????_?????:p??lR?~FU?E??J?'???C?S??P?D?)???a@?c?*?df%?x????M???????"???)4,???f?R?5??J???c{d??*??{%??q??E????V?x??? ??h???z^w?J(^?5?<|???r?? ??????G?G??B?G??ID???????k??Exq?????+??r?Y?2???f??EL&R5B?G?EFK??X??Y?????A?E???=?i????X|?O??s????j????;]??<T??W=KMiu??L1?7??????:??f?O?V?%?f?x]S x???"?]?[?vz!???L?Q?vE?(?f???mrR?.?f?P?wvj???a) ??:??jQ?J?L??fh?$ \??????? ,?|f0?A???+,?*}??G?(? >I??%?L??KV^w?~L??P?2z??R/?U?z??X???QC$???:?C?u+z%????h??R???/??@5A?jy??U ??Xs7_?r?7??,R???R??a(? [H???t??oA?????S?x???b??b??AK?R+??f???? r?(??Dr???? 8V? d??AfzFi?}? ???U????y???Q??a??p?*^Q[ +]???T?I{u?E???K???G??,?????nr?{???Fo?????KOa/,?F7?$E??*?J?? +??#a|R? ?xI???9????#'v%?N?xVh.? g2?n?3?/2su?????????????erX-v6S?? +E[???}??X???(Zv?? ?l??!????u?m?[8????s??T?? ??c?(??d?,??e?Te??_??:??HT??nf?(-%????J?}H?6D!?-????y#'????--uTw^?????>r76U[Q??)?`???B ???Q-?;?t?>WG ????????:h?L??,???p?6?5:M?T7?}?{i>?$<9?> endobj 90 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 -/FontName /CSQYKC+CMBX10 +/FontName /OOZMHZ+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 -/CharSet (/parenleft/parenright/comma/A/C/D/I/a/b/c/d/e/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/y/z/endash) +/CharSet (/parenleft/parenright/comma/colon/A/C/D/I/a/b/c/d/e/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/y/z/endash) /FontFile 91 0 R >> endobj -329 0 obj -[447 447 0 0 319 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 0 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 0 607 511 575 ] +333 0 obj +[447 447 0 0 319 0 0 0 0 0 0 0 0 0 0 0 0 0 319 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 0 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 0 607 511 575 ] endobj -328 0 obj << +332 0 obj << /Type /Encoding -/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w 120/.notdef 121/y/z/endash 124/.notdef] +/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 58/colon 59/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w 120/.notdef 121/y/z/endash 124/.notdef] >> endobj 88 0 obj << /Length1 1064 @@ -1962,49 +1967,35 @@ /Filter /FlateDecode >> stream -x???g<\{???`D??#Q??Q"z??[b??3???A? D???^?D??K?????e'?{o?w_???????|??;?????????+k???+??^A>A @^CWP ??????P ?T?b????? ?j  ??%?!B" v@???F??a??? `??a+?- ??iHi??? -[?:??r??]p?0?$??h?B:x?p?& -?.8??????+?:8hB???KC??Y?rtr??????F?????7 ?5????YU ??E?:???B%??Z???6P??8i?o??????)/?qO????????"?}O?T?b?????? ? ? -q??O?z?"??F q !z???POn3p$ -x ?5??{? ??!Q\ ???`?B?~??m?? w&(???_!Q?C9?????????~??$ ???&\?????i?&\??o???!?j?C?8???$??p~?(????????9p?qR??Q????Q N???? nT??g??7 -??<??99????0?+$*???b"?>????F???_?n??fn??p8 46??I=L?x??U???%???????,k?\G8??!?C??{???8/??r?x???)???Zo?n?????C??n??I????&ix.9?8 \????????????d??l\??+?!?d??`???Cr?m1c?$???RaV]?Dgl?H??;u\ ?To????*??T?+?q&iz??????K???C?)Y,B%??= ?Y\ef??S?H ?wT?8??8??z??????29??~by?7?Y???>XkS -&\?9{???d??????]*Kw?????????)???? ?B????+W?g?X? i???O??k2 -???F??GFq???B????????>? ?K???y????????=?"5Uo,[~??!ET?-??q?v4?^$?8l?R?C?+??|4?sS?6?3Z?7??C`A???q]@7D?E@?? ?????@'??P?&?i"???Xsu?? ???[p???UR???{o??e??? {? ??K -?Y?V(+r????o?y??h????2?-?fH???w??R3?TJu???6?8??B?!v???????y%?????d?%?????/v?r?4v??d???p?z-6??/???2~b??8????SW?6 gs?N??t?o?T?>Wr?#4??????C??~ky??x?E??"?mwb???.???ml>???cww>??.y??S?????^????????du?L~k?:??9 ?? &?G\???)?jTo??.??A???k??????x??D?-:k???B?M?QE~????rJ???_ F?M?(???H}????2?7k8c?G~ n? ?5?????????I?????????i?-???i9?????????$5?N?j??u?q+??'?????????:U?w}qu/2?0??]?????d?W?SW???&y??r? ?l???JW???]??[??????????+?_2??0??u?);Y??^t?$z?8?}???9?Wp????5??E???h?"i9?q?n?o?)Y???&????H -|? ?!b?-_?? ?X?AG??f u??y??L? )?e?M?\?6)J?????F?d??~`??(u??*IbN??6P????z??[#????????msCh0#?k??????wUN??*z ?????P?g]??3#???u ???^???J?"7?U:8??C?!l?s??????.?{???s*??y/??kN-?=?8?y??!N?[ -??k??z??????e20???p???  /]Zr?f??B??????z??06?6X+??N?O5SK?4??`??m??qo8?U?3?=;?????#?????*?[j??o@: F?Ht?????/?e?????R???5E?,?6?E????????D?5?wVV=?&?7?j???Rqk?f??l(J?f#i-S???\?Kr??gs????5???????K????eks?????1?2?f?'j?d?????w?????Zs???3dw???%???s???? -???????Y??U??~x[? -?51??UNs;y?lK ???J?=I?|K??s??M??`a??;??q?)?j??? I???,,j? Suz?d?J?E??T -???9?&?? - O??\?n???2?FTl?<$3?N?HF?q,???$7?q?h!Ho???q~!fGA]W?8?D??x?? ??W1sz?)??G??#h????_?Pv?x?z?????7?~K?n -E???a.@????H?2p?O??ZGW??s?'wg???????l????s ?W???S&?E?}??G??????[??gy?_%????????b?uPnvO????AO??$??cHQXq?????a???e:????x???????(8??o??A?v?}???????)????'? k??W??-?$?oG|VQ?=??Z??.-2- ?f%*?lw???V?? ??n?m=3r[?)????7fDo ??zsH?_wm??? Vy????er?sij????oC~?}M?c??? \?SY~a??/?wU?z??X ?^??c???h?`u?B ?X?a:7?q,x?*S??9I%??????i0???????d?????o????7????pJ8?1?>?W??ZH??????x?~?2_?%?????Q??/?v???,???g??}???@28M?????J?iFe?$o?G\p??w?yim??z?wa%???????????:aK?G^????n?????6? ?M=k?}??/?3_??c??????D?V??l?"?lb??$?s(?_?PMq??z?E!??Z????????h^.?r??o#?aF~????_?NNM?%_???V_?i?.????X;?R*:?9I?????4?o??eNf?zo?yI?0ml????t??t??(7?r??*???r?7?-? ??~o??|?y.?c?s??m???t?,?C8?@b{?;??t????Myz[?w??J*?????55???Z??MCK????????????_^?c(0}???Y&?DMf$??p? 9??Y??B'?\V?Y??Z??z????bP?t???????R???????????dlg??[&??L9????Z]D??W?Py??]?????~???9??f????'?)???#?B?(CE9?=d???GG????OH??m?B??????????z?????????5?hb==M? ??????G?l#?kv=$ -?*???"????=??hdDI??@?,?#??-D????`Ov?????o -?3?*????*??yh^?cu{?9????,[H???%= ??s????}[?>o?h?+b{@"?V%&aJGE?iNSPd??XJ?b?m?|?@??h2?F?/p90??[^?:1k??[?b?'p?o??T9?G?HF???^q?+??q?$?RD&B\??I???ucBtrK??I????6?(?~??????Yx?????VJ?Y??2?%?f3dj!?????UF2BMX???vff?O,t,??^?/H.0??Pn????????>????>{+?|??w?'????6$???9??X?7 -?S%??,???j^;~W????2a,??????F???_?n??fn??p8 46??I=L?x??U???%???????,k?\G8??!?C??g???8/??r?x???)???Zo?n?????C??n??I????&ix.9?8 \????????????d??l\???R??B2???????????b?JI!?????????P??)w?????@??!?U?;?ZW??L????$??3@??7??S?X?J?/2{????? +<??B?\?Q?@v????}_?#??b??dR????? f????\Z?R0??j???????!W;?:I???~??]??P???7??=2?S??jU???????X?^Rn????$VuEVG?)??zc???? )?"o???{h????"??a??*??^I????!???*???????9Hez r??????!?.J?f at O??M?:????????????c???r&??U?????M???U?#?? .#????_???XR??*?BY??F?|3}?#DF?????5C?7?????????2P?[??????? M?????>S??|#$?VK?-?L[sW????????a(f????>l?????.?@????????>?ZO]??0???J8????#?SQ????\????0J??f???m??!O?u ?P???Uhv???a?F??????uP?????,u????yLU?F?t??????0/.`~??#?z ??VV ?{?'?H?`$?e >?|L?w?P|$?? _l???a?&+f?dGH?U?%?????????????????aj?c?]????F????b?W???Y'5#???rK??+??4??[;??S?fJ???G`? K??AM?A??????w`?~??LK?_?*m?v??'\?b'?_??q33@???r??S?g?7??k?sw|?x]???? ?V?S??????`?}????;EX??M??e?4H??y???_??8/?????Eg-??R?/?i2?h????)?? +~???`??????2???????.?y??3?y???v??^Sy?N????????????a)?)?v?"a???????k?????qHR????6)]???}?=?j?>]??S?{?W?"S????E?<: M?{UJ??????????2|??]?????1????g?d??Y?7W*n?? ?? E ?l$?e*???ksK?q??l.?^\?r??Z???????K????eks?????1?2?f?'j?d?????w?????Zs???3dw???%???s???? +?????v*?iD?[???%??_\?r?c????1YAW??k?s??R???8]C_g$s?r?_V??b?1?/????????.sTXX??9?qs6??%M??[??-??|???RkAC ?:?e?????D-I3?Aq??3JX?n?l9?4???AO??$??cHQXq?????a???e:????x???????(W???d9!? ???M??=?S?Q??O???# +?^?[XI???????{????q]ZdZ4? ???Xx?????[??'T~l?A?????m??(?Z??????j?Q?!}~??)W?.X?Q?"??/???KS? ??=????k??d?_X????? O~???2?c??J?????7^????G???J??r ???c???2???T"0M?8????????OV??????~???f???<^N ?4F????{X??t?>?G2D {?[????!%????Y?@??kj#???.??1?9??? V-Qq??$?4?*K?$????{?ui<;????????P?k??g?" ??9?R???????????????XUH?G?)b@@9T?^)?"???????? ?;?4 ?M??Q?.?1???g1??O??6??^??????d%(??w??????U?61???0?mO??J?}KK???y?,C?"?????p?2?xl`? +H* ??t????^/?tocp$|??????3v) %??1?????C?-?d???????l??????9??^y5]?q4??a????FG? [????8???Duc????g?i_?l?Y??g??R????AajJTk5[??#??&?N,`@?8???% ??w???]R?E??/}??????,?>?{?8Rf?W?\i?E???[??<=l???v??w??????.??????$???O?6?nQ?d6?????? ??68?LJ'?J-??q#.G??????-g}3?????????????'?*??R??16>????i?Hg??>??$???s?O'???????z? ??????]?P???I????4??m??? ?n???o???????1??? ??eI?dF? ???S? ??9P,t??m??Ei?u??gi??!5{Az_???=?U?9???????????5~?d?)??_?????E$?x? ?????n?????????k??}????h??8?*??2T?3??CF??|t?)???????+{???aL ?AK??G? ?=k[:?Z??&?????[IL H~??6??f?C?p???~}(?;????FF??? T?B?nL?Nn?=??Z1?^E??1??]_5?`/??98??J?? ??Y&?d?l?L-?]?Z???HF? ??????????E?????&v?m??=???V?????goe??_???$??????$r??"g???F?u?????????R@?k???2`-??s? ??b;PG? ?f??????dd>??1s????a?????????????w????I??N'nq(W?^???+??i\?,????oxM[YLG?i?X0~G>??DHq???e~!R??EQ??=?6m??$c?D???}??},9?t??\Oa???V?W???_-??v??&???Lgt??t#f"????????O??P4?E????5?endstream endobj 89 0 obj << /Type /Font /Subtype /Type1 -/Encoding 330 0 R +/Encoding 334 0 R /FirstChar 46 /LastChar 121 -/Widths 331 0 R -/BaseFont /NCAMLK+CMR17 +/Widths 335 0 R +/BaseFont /UHAIJT+CMR17 /FontDescriptor 87 0 R >> endobj 87 0 obj << /Ascent 694 /CapHeight 683 /Descent -195 -/FontName /NCAMLK+CMR17 +/FontName /UHAIJT+CMR17 /ItalicAngle 0 /StemV 53 /XHeight 430 @@ -2013,31 +2004,31 @@ /CharSet (/period/colon/F/G/I/N/P/S/W/a/c/e/f/i/l/m/n/o/p/r/t/u/y) /FontFile 88 0 R >> endobj -331 0 obj +335 0 obj [250 0 0 0 0 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 0 0 0 0 602 726 0 328 0 0 0 0 693 0 628 0 0 511 0 0 0 955 0 0 0 0 0 0 0 0 0 459 0 406 0 406 276 0 0 250 0 0 250 772 511 459 511 0 354 0 354 511 0 0 0 485 ] endobj -330 0 obj << +334 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 58/colon 59/.notdef 70/F/G 72/.notdef 73/I 74/.notdef 78/N 79/.notdef 80/P 81/.notdef 83/S 84/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r 115/.notdef 116/t/u 118/.notdef 121/y 122/.notdef] >> endobj 127 0 obj << /Type /Pages /Count 6 -/Parent 332 0 R +/Parent 336 0 R /Kids [82 0 R 146 0 R 166 0 R 178 0 R 195 0 R 205 0 R] >> endobj 237 0 obj << /Type /Pages /Count 6 -/Parent 332 0 R -/Kids [221 0 R 239 0 R 258 0 R 271 0 R 284 0 R 300 0 R] +/Parent 336 0 R +/Kids [221 0 R 239 0 R 258 0 R 271 0 R 284 0 R 304 0 R] >> endobj -332 0 obj << +336 0 obj << /Type /Pages /Count 12 /Kids [127 0 R 237 0 R] >> endobj -333 0 obj << +337 0 obj << /Type /Outlines /First 7 0 R /Last 79 0 R @@ -2046,13 +2037,13 @@ 79 0 obj << /Title 80 0 R /A 77 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 75 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 59 0 R /Next 79 0 R >> endobj @@ -2078,7 +2069,7 @@ 59 0 obj << /Title 60 0 R /A 57 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 47 0 R /Next 75 0 R /First 63 0 R @@ -2100,7 +2091,7 @@ 47 0 obj << /Title 48 0 R /A 45 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 19 0 R /Next 59 0 R /First 51 0 R @@ -2150,7 +2141,7 @@ 19 0 obj << /Title 20 0 R /A 17 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 15 0 R /Next 47 0 R /First 23 0 R @@ -2160,48 +2151,48 @@ 15 0 obj << /Title 16 0 R /A 13 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R -/Parent 333 0 R +/Parent 337 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 333 0 R +/Parent 337 0 R /Next 11 0 R >> endobj -334 0 obj << -/Names [(Doc-Start) 86 0 R (a-common-example) 140 0 R (a-common-example.1) 62 0 R (a-final-note) 142 0 R (a-final-note.1) 70 0 R (acknowledgements) 144 0 R (acknowledgements.0) 78 0 R (argout-arrays) 132 0 R (argout-arrays.1) 30 0 R (available-typemaps) 129 0 R (available-typemaps.0) 18 0 R (beyond-the-provided-typemaps) 139 0 R (beyond-the-provided-typemaps.0) 58 0 R (contents) 96 0 R (contents.0) 6 0 R (helper-functions) 136 0 R (helper-functions.0) 46 0 R (in-place-arrays) 131 0 R (in-place-arrays.1) 26 0 R (input-arrays) 130 0 R (input-arrays.1) 22 0 R (introduction) 116 0 R (introduction.0) 10 0 R (macros) 137 0 R (macros.1) 50 0 R (other-common-types-bool) 134 0 R (other-common-types-bool.1) 38 0 R (other-common-types-complex) 135 0 R (other-common-types-complex.1) 42 0 R (other-situations) 141 0 R (other-situations.1) 66 0 R (output-arrays) 133 0 R (output-arrays.1) 34 0 R (page.1) 85 0 R (page.10) 273 0 R (page.11) 286 0 R (page.12) 302 0 R (page.2) 148 0 R (page.3) 168 0 R (page.4) 180 0 R (page.5) 197 0 R (page.6) 207 0 R (page.7) 223 0 R (page.8) 241 0 R (page.9) 260 0 R (routines) 138 0 R (routines.1) 54 0 R (section*.1) 97 0 R (section*.10) 224 0 R (section*.11) 235 0 R (section*.12) 236 0 R (section*.13) 242 0 R (section*.14) 277 0 R (section*.15) 279 0 R (section*.16) 287 0 R (section*.17) 295 0 R (section*.18) 297 0 R (section*.19) 305 0 R (section*.2) 120 0 R (section*.3) 182 0 R (section*.4) 189 0 R (section*.5) 198 0 R (section*.6) 201 0 R (section*.7) 208 0 R (section*.8) 215 0 R (section*.9) 216 0 R (summary) 143 0 R (summary.0) 74 0 R (using-numpy-i) 128 0 R (using-numpy-i.0) 14 0 R] +338 0 obj << +/Names [(Doc-Start) 86 0 R (a-common-example) 140 0 R (a-common-example.1) 62 0 R (a-final-note) 142 0 R (a-final-note.1) 70 0 R (acknowledgements) 144 0 R (acknowledgements.0) 78 0 R (argout-arrays) 132 0 R (argout-arrays.1) 30 0 R (available-typemaps) 129 0 R (available-typemaps.0) 18 0 R (beyond-the-provided-typemaps) 139 0 R (beyond-the-provided-typemaps.0) 58 0 R (contents) 96 0 R (contents.0) 6 0 R (helper-functions) 136 0 R (helper-functions.0) 46 0 R (in-place-arrays) 131 0 R (in-place-arrays.1) 26 0 R (input-arrays) 130 0 R (input-arrays.1) 22 0 R (introduction) 116 0 R (introduction.0) 10 0 R (macros) 137 0 R (macros.1) 50 0 R (other-common-types-bool) 134 0 R (other-common-types-bool.1) 38 0 R (other-common-types-complex) 135 0 R (other-common-types-complex.1) 42 0 R (other-situations) 141 0 R (other-situations.1) 66 0 R (output-arrays) 133 0 R (output-arrays.1) 34 0 R (page.1) 85 0 R (page.10) 273 0 R (page.11) 286 0 R (page.12) 306 0 R (page.2) 148 0 R (page.3) 168 0 R (page.4) 180 0 R (page.5) 197 0 R (page.6) 207 0 R (page.7) 223 0 R (page.8) 241 0 R (page.9) 260 0 R (routines) 138 0 R (routines.1) 54 0 R (section*.1) 97 0 R (section*.10) 224 0 R (section*.11) 235 0 R (section*.12) 236 0 R (section*.13) 242 0 R (section*.14) 277 0 R (section*.15) 279 0 R (section*.16) 291 0 R (section*.17) 299 0 R (section*.18) 301 0 R (section*.19) 309 0 R (section*.2) 120 0 R (section*.3) 182 0 R (section*.4) 189 0 R (section*.5) 198 0 R (section*.6) 201 0 R (section*.7) 208 0 R (section*.8) 215 0 R (section*.9) 216 0 R (summary) 143 0 R (summary.0) 74 0 R (using-numpy-i) 128 0 R (using-numpy-i.0) 14 0 R] /Limits [(Doc-Start) (using-numpy-i.0)] >> endobj -335 0 obj << -/Kids [334 0 R] +339 0 obj << +/Kids [338 0 R] >> endobj -336 0 obj << -/Dests 335 0 R +340 0 obj << +/Dests 339 0 R >> endobj -337 0 obj << +341 0 obj << /Type /Catalog -/Pages 332 0 R -/Outlines 333 0 R -/Names 336 0 R +/Pages 336 0 R +/Outlines 337 0 R +/Names 340 0 R /PageMode /UseOutlines /OpenAction 81 0 R >> endobj -338 0 obj << +342 0 obj << /Author(Bill Spotz)/Title(numpy.i: a SWIG Interface File for NumPy)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20070815143618-07'00') -/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) +/CreationDate (D:20070913110441-06'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.6) >> endobj xref -0 339 +0 343 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f @@ -2209,79 +2200,79 @@ 0000000000 00000 f 0000000009 00000 n 0000007628 00000 n -0000139285 00000 n +0000141047 00000 n 0000000055 00000 n 0000000081 00000 n 0000007811 00000 n -0000139199 00000 n +0000140961 00000 n 0000000131 00000 n 0000000162 00000 n 0000024623 00000 n -0000139111 00000 n +0000140873 00000 n 0000000214 00000 n 0000000246 00000 n 0000024810 00000 n -0000138986 00000 n +0000140748 00000 n 0000000303 00000 n 0000000340 00000 n 0000028595 00000 n -0000138912 00000 n +0000140674 00000 n 0000000391 00000 n 0000000422 00000 n 0000028782 00000 n -0000138825 00000 n +0000140587 00000 n 0000000476 00000 n 0000000510 00000 n 0000028970 00000 n -0000138738 00000 n +0000140500 00000 n 0000000562 00000 n 0000000594 00000 n 0000034594 00000 n -0000138651 00000 n +0000140413 00000 n 0000000646 00000 n 0000000678 00000 n 0000034782 00000 n -0000138564 00000 n +0000140326 00000 n 0000000740 00000 n 0000000783 00000 n 0000034970 00000 n -0000138490 00000 n +0000140252 00000 n 0000000848 00000 n 0000000894 00000 n 0000041039 00000 n -0000138365 00000 n +0000140127 00000 n 0000000949 00000 n 0000000984 00000 n 0000041227 00000 n -0000138291 00000 n +0000140053 00000 n 0000001029 00000 n 0000001054 00000 n 0000041415 00000 n -0000138217 00000 n +0000139979 00000 n 0000001101 00000 n 0000001128 00000 n -0000056871 00000 n -0000138092 00000 n +0000056488 00000 n +0000139854 00000 n 0000001195 00000 n 0000001242 00000 n -0000057059 00000 n -0000138018 00000 n +0000056676 00000 n +0000139780 00000 n 0000001297 00000 n 0000001332 00000 n -0000057247 00000 n -0000137931 00000 n +0000063998 00000 n +0000139693 00000 n 0000001387 00000 n 0000001422 00000 n -0000063261 00000 n -0000137857 00000 n +0000064186 00000 n +0000139619 00000 n 0000001473 00000 n 0000001504 00000 n -0000063448 00000 n -0000137769 00000 n +0000064374 00000 n +0000139531 00000 n 0000001550 00000 n 0000001576 00000 n -0000067487 00000 n -0000137694 00000 n +0000069134 00000 n +0000139456 00000 n 0000001631 00000 n 0000001666 00000 n 0000003730 00000 n @@ -2289,15 +2280,15 @@ 0000001716 00000 n 0000007445 00000 n 0000007506 00000 n -0000136494 00000 n -0000131188 00000 n -0000136335 00000 n -0000130377 00000 n -0000122716 00000 n -0000130217 00000 n -0000121464 00000 n -0000106714 00000 n -0000121305 00000 n +0000138256 00000 n +0000132950 00000 n +0000138097 00000 n +0000132111 00000 n +0000124344 00000 n +0000131951 00000 n +0000123092 00000 n +0000108342 00000 n +0000122933 00000 n 0000007567 00000 n 0000007688 00000 n 0000004027 00000 n @@ -2319,17 +2310,17 @@ 0000006619 00000 n 0000006772 00000 n 0000007749 00000 n -0000105847 00000 n -0000097897 00000 n -0000105685 00000 n +0000107475 00000 n +0000099525 00000 n +0000107313 00000 n 0000007872 00000 n 0000006934 00000 n 0000007104 00000 n 0000007274 00000 n -0000096408 00000 n -0000082076 00000 n -0000096246 00000 n -0000137317 00000 n +0000098034 00000 n +0000083436 00000 n +0000097872 00000 n +0000139079 00000 n 0000024561 00000 n 0000024747 00000 n 0000028533 00000 n @@ -2341,12 +2332,12 @@ 0000040976 00000 n 0000041164 00000 n 0000041352 00000 n -0000056808 00000 n -0000056996 00000 n -0000057184 00000 n -0000063198 00000 n -0000063386 00000 n -0000067424 00000 n +0000056425 00000 n +0000056613 00000 n +0000063935 00000 n +0000064123 00000 n +0000064311 00000 n +0000069071 00000 n 0000014684 00000 n 0000012145 00000 n 0000008053 00000 n @@ -2354,9 +2345,9 @@ 0000012383 00000 n 0000012554 00000 n 0000012724 00000 n -0000081592 00000 n -0000077565 00000 n -0000081430 00000 n +0000082952 00000 n +0000078925 00000 n +0000082790 00000 n 0000012897 00000 n 0000013071 00000 n 0000013244 00000 n @@ -2393,9 +2384,9 @@ 0000024154 00000 n 0000024872 00000 n 0000024325 00000 n -0000077245 00000 n -0000075855 00000 n -0000077084 00000 n +0000078605 00000 n +0000077215 00000 n +0000078444 00000 n 0000029032 00000 n 0000027614 00000 n 0000025044 00000 n @@ -2439,7 +2430,7 @@ 0000040676 00000 n 0000041101 00000 n 0000041289 00000 n -0000137433 00000 n +0000139195 00000 n 0000047373 00000 n 0000044577 00000 n 0000041585 00000 n @@ -2472,82 +2463,86 @@ 0000051615 00000 n 0000051789 00000 n 0000051961 00000 n -0000057309 00000 n -0000055347 00000 n +0000056801 00000 n +0000054963 00000 n 0000052306 00000 n -0000056745 00000 n -0000055537 00000 n -0000055709 00000 n -0000055882 00000 n -0000056933 00000 n -0000056054 00000 n -0000057121 00000 n -0000056228 00000 n -0000056401 00000 n -0000056572 00000 n -0000063572 00000 n -0000061277 00000 n -0000057430 00000 n -0000063072 00000 n -0000063135 00000 n -0000061483 00000 n -0000061652 00000 n -0000061825 00000 n -0000061996 00000 n -0000062170 00000 n -0000062355 00000 n -0000062539 00000 n -0000063323 00000 n -0000062728 00000 n -0000063509 00000 n -0000062899 00000 n -0000067612 00000 n -0000065581 00000 n -0000063693 00000 n -0000067361 00000 n -0000065787 00000 n -0000065958 00000 n -0000067549 00000 n -0000066131 00000 n -0000066302 00000 n -0000066476 00000 n -0000066647 00000 n -0000066820 00000 n -0000074964 00000 n -0000067734 00000 n -0000074804 00000 n -0000066987 00000 n -0000067170 00000 n -0000075506 00000 n -0000075264 00000 n -0000077478 00000 n -0000077454 00000 n -0000081896 00000 n -0000081814 00000 n -0000097298 00000 n -0000096936 00000 n -0000106393 00000 n -0000106138 00000 n -0000122276 00000 n -0000121891 00000 n -0000130915 00000 n -0000130663 00000 n -0000136959 00000 n -0000136741 00000 n -0000137550 00000 n -0000137620 00000 n -0000139357 00000 n -0000141053 00000 n -0000141092 00000 n -0000141130 00000 n -0000141259 00000 n +0000056362 00000 n +0000055153 00000 n +0000055325 00000 n +0000055499 00000 n +0000056550 00000 n +0000055671 00000 n +0000056738 00000 n +0000055845 00000 n +0000056018 00000 n +0000056189 00000 n +0000064499 00000 n +0000061360 00000 n +0000056922 00000 n +0000063872 00000 n +0000061598 00000 n +0000061771 00000 n +0000061944 00000 n +0000062116 00000 n +0000064060 00000 n +0000062287 00000 n +0000062456 00000 n +0000062629 00000 n +0000062800 00000 n +0000062974 00000 n +0000063159 00000 n +0000063341 00000 n +0000064248 00000 n +0000063528 00000 n +0000064436 00000 n +0000063699 00000 n +0000069259 00000 n +0000067227 00000 n +0000064620 00000 n +0000069008 00000 n +0000067433 00000 n +0000067604 00000 n +0000069196 00000 n +0000067777 00000 n +0000067948 00000 n +0000068122 00000 n +0000068293 00000 n +0000068465 00000 n +0000076336 00000 n +0000069393 00000 n +0000076176 00000 n +0000068632 00000 n +0000068816 00000 n +0000076871 00000 n +0000076631 00000 n +0000078838 00000 n +0000078814 00000 n +0000083256 00000 n +0000083174 00000 n +0000098933 00000 n +0000098569 00000 n +0000108021 00000 n +0000107766 00000 n +0000123904 00000 n +0000123519 00000 n +0000132657 00000 n +0000132403 00000 n +0000138721 00000 n +0000138503 00000 n +0000139312 00000 n +0000139382 00000 n +0000141119 00000 n +0000142815 00000 n +0000142854 00000 n +0000142892 00000 n +0000143021 00000 n trailer << -/Size 339 -/Root 337 0 R -/Info 338 0 R -/ID [<15E0110B4E50C928B1C631FA38F3EF61> <15E0110B4E50C928B1C631FA38F3EF61>] +/Size 343 +/Root 341 0 R +/Info 342 0 R +/ID [<330CD5C91826DC2BA83DA335BFDFFEB1> <330CD5C91826DC2BA83DA335BFDFFEB1>] >> startxref -141572 +143334 %%EOF Modified: trunk/numpy/doc/swig/numpy_swig.txt =================================================================== --- trunk/numpy/doc/swig/numpy_swig.txt 2007-09-13 05:34:26 UTC (rev 4029) +++ trunk/numpy/doc/swig/numpy_swig.txt 2007-09-13 17:05:48 UTC (rev 4030) @@ -1,6 +1,6 @@ -======================================== -numpy.i: a SWIG Interface File for NumPy -======================================== +========================================== + numpy.i: a SWIG Interface File for NumPy +========================================== :Author: Bill Spotz :Institution: Sandia National Laboratories @@ -652,6 +652,10 @@ %apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1), (int len2, double* vec2)} %rename (dot) my_dot; + %exception my_dot { + $action + if (PyErr_Occurred()) SWIG_fail; + } %inline %{ double my_dot(int len1, double* vec1, int len2, double* vec2) { if (len1 != len2) { @@ -672,6 +676,17 @@ method, you will want to use ``%extend`` rather than ``%inline`` in addition to ``%ignore``. +**A note on error handling:** Note that ``my_dot`` returns a +``double`` but that it can also raise a `python`_ error. The +resulting wrapper function will return a `python`_ float +representation of 0.0 when the vector lengths do not match. Since +this is not ``NULL``, the `python`_ interpreter will not know to check +for an error. For this reason, we add the ``%exception`` directive +above for ``my_dot`` to get the behavior we want (note that +``$action`` is a macro that gets expanded to a valid call to +``my_dot``). In general, you will probably want to write a `SWIG`_ +macro to perform this task. + Other Situations ---------------- From numpy-svn at scipy.org Thu Sep 13 13:08:05 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 13 Sep 2007 12:08:05 -0500 (CDT) Subject: [Numpy-svn] r4031 - trunk/numpy/doc/swig Message-ID: <20070913170805.5767F39C182@new.scipy.org> Author: wfspotz at sandia.gov Date: 2007-09-13 12:08:01 -0500 (Thu, 13 Sep 2007) New Revision: 4031 Modified: trunk/numpy/doc/swig/numpy_swig.html trunk/numpy/doc/swig/numpy_swig.pdf trunk/numpy/doc/swig/numpy_swig.txt Log: Updated date on documentation Modified: trunk/numpy/doc/swig/numpy_swig.html =================================================================== --- trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 17:05:48 UTC (rev 4030) +++ trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 17:08:01 UTC (rev 4031) @@ -5,7 +5,7 @@ numpy.i: a SWIG Interface File for NumPy - + + + +
+

numpy.i: a SWIG Interface File for NumPy

+ +++ + + + + + + + +
Author:Bill Spotz
Institution:Sandia National Laboratories
Date:13 September, 2007
+ +
+

Introduction

+

The Simple Wrapper and Interface Generator (or SWIG) is a powerful tool for generating wrapper +code for interfacing to a wide variety of scripting languages. +SWIG can parse header files, and using only the code prototypes, +create an interface to the target language. But SWIG is not +omnipotent. For example, it cannot know from the prototype:

+
+double rms(double* seq, int n);
+
+

what exactly seq is. Is it a single value to be altered in-place? +Is it an array, and if so what is its length? Is it input-only? +Output-only? Input-output? SWIG cannot determine these details, +and does not attempt to do so.

+

Making an educated guess, humans can conclude that this is probably a +routine that takes an input-only array of length n of double +values called seq and returns the root mean square. The default +behavior of SWIG, however, will be to create a wrapper function +that compiles, but is nearly impossible to use from the scripting +language in the way the C routine was intended.

+

For python, the preferred way of handling +contiguous (or technically, strided) blocks of homogeneous data is +with the module NumPy, which provides full +object-oriented access to arrays of data. Therefore, the most logical +python interface for the rms function would be (including doc +string):

+
+def rms(seq):
+    """
+    rms: return the root mean square of a sequence
+    rms(numpy.ndarray) -> double
+    rms(list) -> double
+    rms(tuple) -> double
+    """
+
+

where seq would be a NumPy array of double values, and its +length n would be extracted from seq internally before being +passed to the C routine. Even better, since NumPy supports +construction of arrays from arbitrary python sequences, seq +itself could be a nearly arbitrary sequence (so long as each element +can be converted to a double) and the wrapper code would +internally convert it to a NumPy array before extracting its data +and length.

+

SWIG allows these types of conversions to be defined via a +mechanism called typemaps. This document provides information on how +to use numpy.i, a SWIG interface file that defines a series of +typemaps intended to make the type of array-related conversions +described above relatively simple to implement. For example, suppose +that the rms function prototype defined above was in a header file +named rms.h. To obtain the python interface discussed above, +your SWIG interface file would need the following:

+
+%{
+#define SWIG_FILE_WITH_INIT
+#include "rms.h"
+%}
+
+%include "numpy.i"
+
+%init %{
+import_array();
+%}
+
+%apply (double* IN_ARRAY1, int DIM1) {(double* seq, int n)};
+%include "rms.h"
+
+

Typemaps are keyed off a list of one or more function arguments, +either by type or by type and name. We will refer to such lists as +signatures. One of the many typemaps defined by numpy.i is used +above and has the signature (double* IN_ARRAY1, int DIM1). The +argument names are intended to suggest that the double* argument +is an input array of one dimension and that the int represents +that dimension. This is precisely the pattern in the rms +prototype.

+

Most likely, no actual prototypes to be wrapped will have the argument +names IN_ARRAY1 and DIM1. We use the %apply directive to +apply the typemap for one-dimensional input arrays of type double +to the actual prototype used by rms. Using numpy.i +effectively, therefore, requires knowing what typemaps are available +and what they do.

+

A SWIG interface file that includes the SWIG directives given +above will produce wrapper code that looks something like:

+
+ 1 PyObject *_wrap_rms(PyObject *args) {
+ 2   PyObject *resultobj = 0;
+ 3   double *arg1 = (double *) 0 ;
+ 4   int arg2 ;
+ 5   double result;
+ 6   PyArrayObject *array1 = NULL ;
+ 7   int is_new_object1 = 0 ;
+ 8   PyObject * obj0 = 0 ;
+ 9
+10   if (!PyArg_ParseTuple(args,(char *)"O:rms",&obj0)) SWIG_fail;
+11   {
+12     array1 = obj_to_array_contiguous_allow_conversion(
+13                  obj0, NPY_DOUBLE, &is_new_object1);
+14     npy_intp size[1] = {
+15       -1
+16     };
+17     if (!array1 || !require_dimensions(array1, 1) ||
+18         !require_size(array1, size, 1)) SWIG_fail;
+19     arg1 = (double*) array1->data;
+20     arg2 = (int) array1->dimensions[0];
+21   }
+22   result = (double)rms(arg1,arg2);
+23   resultobj = SWIG_From_double((double)(result));
+24   {
+25     if (is_new_object1 && array1) Py_DECREF(array1);
+26   }
+27   return resultobj;
+28 fail:
+29   {
+30     if (is_new_object1 && array1) Py_DECREF(array1);
+31   }
+32   return NULL;
+33 }
+
+

The typemaps from numpy.i are responsible for the following lines +of code: 12--20, 25 and 30. Line 10 parses the input to the rms +function. From the format string "O:rms", we can see that the +argument list is expected to be a single python object (specified +by the O before the colon) and whose pointer is stored in +obj0. A number of functions, supplied by numpy.i, are called +to make and check the (possible) conversion from a generic python +object to a NumPy array. These functions are explained in the +section Helper Functions, but hopefully their names are +self-explanatory. At line 12 we use obj0 to construct a NumPy +array. At line 17, we check the validity of the result: that it is +non-null and that it has a single dimension of arbitrary length. Once +these states are verified, we extract the data buffer and length in +lines 19 and 20 so that we can call the underlying C function at line +22. Line 25 performs memory management for the case where we have +created a new array that is no longer needed.

+

This code has a significant amount of error handling. Note the +SWIG_fail is a macro for goto fail, refering to the label at +line 28. If the user provides the wrong number of arguments, this +will be caught at line 10. If construction of the NumPy array +fails or produces an array with the wrong number of dimensions, these +errors are caught at line 17. And finally, if an error is detected, +memory is still managed correctly at line 30.

+

Note that if the C function signature was in a different order:

+
+double rms(int n, double* seq);
+
+

that SWIG would not match the typemap signature given above with +the argument list for rms. Fortunately, numpy.i has a set of +typemaps with the data pointer given last:

+
+%apply (int DIM1, double* IN_ARRAY1) {(int n, double* seq)};
+
+

This simply has the effect of switching the definitions of arg1 +and arg2 in lines 3 and 4 of the generated code above, and their +assignments in lines 19 and 20.

+
+
+

Using numpy.i

+

The numpy.i file is currently located in the numpy/docs/swig +sub-directory under the numpy installation directory. Typically, +you will want to copy it to the directory where you are developing +your wrappers. If it is ever adopted by SWIG developers, then it +will be installed in a standard place where SWIG can find it.

+

A simple module that only uses a single SWIG interface file should +include the following:

+
+%{
+#define SWIG_FILE_WITH_INIT
+%}
+%include "numpy.i"
+%init %{
+import_array();
+%}
+
+

Within a compiled python module, import_array() should only get +called once. This could be in a C/C++ file that you have written and +is linked to the module. If this is the case, then none of your +interface files should #define SWIG_FILE_WITH_INIT or call +import_array(). Or, this initialization call could be in a +wrapper file generated by SWIG from an interface file that has the +%init block as above. If this is the case, and you have more than +one SWIG interface file, then only one interface file should +#define SWIG_FILE_WITH_INIT and call import_array().

+
+
+

Available Typemaps

+

The typemap directives provided by numpy.i for arrays of different +data types, say double and int, and dimensions of different +types, say int or long, are identical to one another except +for the C and NumPy type specifications. The typemaps are +therefore implemented (typically behind the scenes) via a macro:

+
+%numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)
+
+

that can be invoked for appropriate (DATA_TYPE, DATA_TYPECODE, +DIM_TYPE) triplets. For example:

+
+%numpy_typemaps(double, NPY_DOUBLE, int)
+%numpy_typemaps(int,    NPY_INT   , int)
+
+

The numpy.i interface file uses the %numpy_typemaps macro to +implement typemaps for the following C data types and int +dimension types:

+
+
    +
  • signed char
  • +
  • unsigned char
  • +
  • short
  • +
  • unsigned short
  • +
  • int
  • +
  • unsigned int
  • +
  • long
  • +
  • unsigned long
  • +
  • long long
  • +
  • unsigned long long
  • +
  • float
  • +
  • double
  • +
+
+

In the following descriptions, we reference a generic DATA_TYPE, which +could be any of the C data types listed above.

+
+

Input Arrays

+

Input arrays are defined as arrays of data that are passed into a +routine but are not altered in-place or returned to the user. The +python input array is therefore allowed to be almost any python +sequence (such as a list) that can be converted to the requested type +of array. The input array signatures are

+
+
    +
  • ( DATA_TYPE IN_ARRAY1[ANY] )
  • +
  • ( DATA_TYPE* IN_ARRAY1,  int DIM1 )
  • +
  • ( int DIM1,  DATA_TYPE* IN_ARRAY1 )
  • +
  • ( DATA_TYPE IN_ARRAY2[ANY][ANY] )
  • +
  • ( DATA_TYPE* IN_ARRAY2,  int DIM1,  int DIM2 )
  • +
  • ( int DIM1,  int DIM2,  DATA_TYPE* IN_ARRAY2 )
  • +
  • ( DATA_TYPE IN_ARRAY3[ANY][ANY][ANY] )
  • +
  • ( DATA_TYPE* IN_ARRAY3,  int DIM1,  int DIM2,  int DIM3 )
  • +
  • ( int DIM1,  int DIM2,  int DIM3,  DATA_TYPE* IN_ARRAY3 )
  • +
+
+

The first signature listed, ( DATA_TYPE IN_ARRAY[ANY] ) is for +one-dimensional arrays with hard-coded dimensions. Likewise, +( DATA_TYPE IN_ARRAY2[ANY][ANY] ) is for two-dimensional arrays +with hard-coded dimensions, and similarly for three-dimensional.

+
+
+

In-Place Arrays

+

In-place arrays are defined as arrays that are modified in-place. The +input values may or may not be used, but the values at the time the +function returns are significant. The provided python argument +must therefore be a NumPy array of the required type. The in-place +signatures are

+
+
    +
  • ( DATA_TYPE INPLACE_ARRAY1[ANY] )
  • +
  • ( DATA_TYPE* INPLACE_ARRAY1,  int DIM1 )
  • +
  • ( int DIM1,  DATA_TYPE* INPLACE_ARRAY1 )
  • +
  • ( DATA_TYPE INPLACE_ARRAY2[ANY][ANY] )
  • +
  • ( DATA_TYPE* INPLACE_ARRAY2,  int DIM1,  int DIM2 )
  • +
  • ( int DIM1,  int DIM2,  DATA_TYPE* INPLACE_ARRAY2 )
  • +
  • ( DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY] )
  • +
  • ( DATA_TYPE* INPLACE_ARRAY3,  int DIM1,  int DIM2,  int DIM3 )
  • +
  • ( int DIM1,  int DIM2,  int DIM3,  DATA_TYPE* INPLACE_ARRAY3 )
  • +
+
+

These typemaps now check to make sure that the INPLACE_ARRAY +arguments use native byte ordering. If not, an exception is raised.

+
+
+

Argout Arrays

+

Argout arrays are arrays that appear in the input arguments in C, but +are in fact output arrays. This pattern occurs often when there is +more than one output variable and the single return argument is +therefore not sufficient. In python, the convential way to return +multiple arguments is to pack them into a sequence (tuple, list, etc.) +and return the sequence. This is what the argout typemaps do. If a +wrapped function that uses these argout typemaps has more than one +return argument, they are packed into a tuple or list, depending on +the version of python. The python user does not pass these +arrays in, they simply get returned. The argout signatures are

+
+
    +
  • ( DATA_TYPE ARGOUT_ARRAY1[ANY] )
  • +
  • ( DATA_TYPE* ARGOUT_ARRAY1,  int DIM1 )
  • +
  • ( int DIM1,  DATA_TYPE* ARGOUT_ARRAY1 )
  • +
  • ( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )
  • +
  • ( DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY] )
  • +
+
+

These are typically used in situations where in C/C++, you would +allocate a(n) array(s) on the heap, and call the function to fill the +array(s) values. In python, the arrays are allocated for you and +returned as new array objects.

+

Note that we support DATA_TYPE* argout typemaps in 1D, but not 2D +or 3D. This because of a quirk with the SWIG typemap syntax and +cannot be avoided. Note that for these types of 1D typemaps, the +python function will take a single argument representing DIM1.

+
+
+

Output Arrays

+

The numpy.i interface file does not support typemaps for output +arrays, for several reasons. First, C/C++ return arguments are +limited to a single value. This prevents obtaining dimension +information in a general way. Second, arrays with hard-coded lengths +are not permitted as return arguments. In other words:

+
+double[3] newVector(double x, double y, double z);
+
+

is not legal C/C++ syntax. Therefore, we cannot provide typemaps of +the form:

+
+%typemap(out) (TYPE[ANY]);
+
+

If you run into a situation where a function or method is returning a +pointer to an array, your best bet is to write your own version of the +function to be wrapped, either with %extend for the case of class +methods or %ignore and %rename for the case of functions.

+
+
+

Other Common Types: bool

+

Note that C++ type bool is not supported in the list in the +Available Typemaps section. NumPy bools are a single byte, while +the C++ bool is four bytes (at least on my system). Therefore:

+
+%numpy_typemaps(bool, NPY_BOOL, int)
+
+

will result in typemaps that will produce code that reference +improper data lengths. You can implement the following macro +expansion:

+
+%numpy_typemaps(bool, NPY_UINT, int)
+
+

to fix the data length problem, and Input Arrays will work fine, +but In-Place Arrays might fail type-checking.

+
+
+

Other Common Types: complex

+

Typemap conversions for complex floating-point types is also not +supported automatically. This is because python and NumPy are +written in C, which does not have native complex types. Both +python and NumPy implement their own (essentially equivalent) +struct definitions for complex variables:

+
+/* Python */
+typedef struct {double real; double imag;} Py_complex;
+
+/* NumPy */
+typedef struct {float  real, imag;} npy_cfloat;
+typedef struct {double real, imag;} npy_cdouble;
+
+

We could have implemented:

+
+%numpy_typemaps(Py_complex , NPY_CDOUBLE, int)
+%numpy_typemaps(npy_cfloat , NPY_CFLOAT , int)
+%numpy_typemaps(npy_cdouble, NPY_CDOUBLE, int)
+
+

which would have provided automatic type conversions for arrays of +type Py_complex, npy_cfloat and npy_cdouble. However, it +seemed unlikely that there would be any independent (non-python, +non-NumPy) application code that people would be using SWIG to +generate a python interface to, that also used these definitions +for complex types. More likely, these application codes will define +their own complex types, or in the case of C++, use std::complex. +Assuming these data structures are compatible with python and +NumPy complex types, %numpy_typemap expansions as above (with +the user's complex type substituted for the first argument) should +work.

+
+
+
+

Helper Functions

+

The numpy.i file containes several macros and routines that it +uses internally to build its typemaps. However, these functions may +be useful elsewhere in your interface file.

+
+

Macros

+
+
+
is_array(a)
+
Evaluates as true if a is non-NULL and can be cast to a +PyArrayObject*.
+
array_type(a)
+
Evaluates to the integer data type code of a, assuming a can +be cast to a PyArrayObject*.
+
array_numdims(a)
+
Evaluates to the integer number of dimensions of a, assuming +a can be cast to a PyArrayObject*.
+
array_dimensions(a)
+
Evaluates to an array of type npy_intp and length +array_numdims(a), giving the lengths of all of the dimensions +of a, assuming a can be cast to a PyArrayObject*.
+
array_size(a,i)
+
Evaluates to the i-th dimension size of a, assuming a +can be cast to a PyArrayObject*.
+
array_data(a)
+
Evaluates to a pointer of type void* that points to the data +buffer of a, assuming a can be cast to a PyArrayObject*.
+
array_is_contiguous(a)
+
Evaluates as true if a is a contiguous array. Equivalent to +(PyArray_ISCONTIGUOUS(a)).
+
array_is_native(a)
+
Evaluates as true if the data buffer of a uses native byte +order. Equivalent to (PyArray_ISNOTSWAPPED(a)).
+
+
+
+
+

Routines

+
+

pytype_string()

+
+

Return type: char*

+

Arguments:

+
    +
  • PyObject* py_obj, a general python object.
  • +
+

Return a string describing the type of py_obj.

+
+

typecode_string()

+
+

Return type: char*

+

Arguments:

+
    +
  • int typecode, a NumPy integer typecode.
  • +
+

Return a string describing the type corresponding to the NumPy +typecode.

+
+

type_match()

+
+

Return type: int

+

Arguments:

+
    +
  • int actual_type, the NumPy typecode of a NumPy array.
  • +
  • int desired_type, the desired NumPy typecode.
  • +
+

Make sure that actual_type is compatible with +desired_type. For example, this allows character and +byte types, or int and long types, to match. This is now +equivalent to PyArray_EquivTypenums().

+
+

obj_to_array_no_conversion()

+
+

Return type: PyArrayObject*

+

Arguments:

+
    +
  • PyObject* input, a general python object.
  • +
  • int typecode, the desired NumPy typecode.
  • +
+

Cast input to a PyArrayObject* if legal, and ensure that +it is of type typecode. If input cannot be cast, or the +typecode is wrong, set a python error and return NULL.

+
+

obj_to_array_allow_conversion()

+
+

Return type: PyArrayObject*

+

Arguments:

+
    +
  • PyObject* input, a general python object.
  • +
  • int typecode, the desired NumPy typecode of the resulting +array.
  • +
  • int* is_new_object, returns a value of 0 if no conversion +performed, else 1.
  • +
+

Convert input to a NumPy array with the given typecode. +On success, return a valid PyArrayObject* with the correct +type. On failure, the python error string will be set and the +routine returns NULL.

+
+

make_contiguous()

+
+

Return type: PyArrayObject*

+

Arguments:

+
    +
  • PyArrayObject* ary, a NumPy array.
  • +
  • int* is_new_object, returns a value of 0 if no conversion +performed, else 1.
  • +
  • int min_dims, minimum allowable dimensions.
  • +
  • int max_dims, maximum allowable dimensions.
  • +
+

Check to see if ary is contiguous. If so, return the input +pointer and flag it as not a new object. If it is not contiguous, +create a new PyArrayObject* using the original data, flag it +as a new object and return the pointer.

+
+

obj_to_array_contiguous_allow_conversion()

+
+

Return type: PyArrayObject*

+

Arguments:

+
    +
  • PyObject* input, a general python object.
  • +
  • int typecode, the desired NumPy typecode of the resulting +array.
  • +
  • int* is_new_object, returns a value of 0 if no conversion +performed, else 1.
  • +
+

Convert input to a contiguous PyArrayObject* of the +specified type. If the input object is not a contiguous +PyArrayObject*, a new one will be created and the new object +flag will be set.

+
+

require_contiguous()

+
+

Return type: int

+

Arguments:

+
    +
  • PyArrayObject* ary, a NumPy array.
  • +
+

Test whether ary is contiguous. If so, return 1. Otherwise, +set a python error and return 0.

+
+

require_native()

+
+

Return type: int

+

Arguments:

+
    +
  • PyArray_Object* ary, a NumPy array.
  • +
+

Require that ary is not byte-swapped. If the array is not +byte-swapped, return 1. Otherwise, set a python error and +return 0.

+
+

require_dimensions()

+
+

Return type: int

+

Arguments:

+
    +
  • PyArrayObject* ary, a NumPy array.
  • +
  • int exact_dimensions, the desired number of dimensions.
  • +
+

Require ary to have a specified number of dimensions. If the +array has the specified number of dimensions, return 1. +Otherwise, set a python error and return 0.

+
+

require_dimensions_n()

+
+

Return type: int

+

Arguments:

+
    +
  • PyArrayObject* ary, a NumPy array.
  • +
  • int* exact_dimensions, an array of integers representing +acceptable numbers of dimensions.
  • +
  • int n, the length of exact_dimensions.
  • +
+

Require ary to have one of a list of specified number of +dimensions. If the array has one of the specified number of +dimensions, return 1. Otherwise, set the python error string +and return 0.

+
+

require_size()

+
+

Return type: int

+

Arguments:

+
    +
  • PyArrayObject* ary, a NumPy array.
  • +
  • npy_int* size, an array representing the desired lengths of +each dimension.
  • +
  • int n, the length of size.
  • +
+

Require ary to have a specified shape. If the array has the +specified shape, return 1. Otherwise, set the python error +string and return 0.

+
+
+
+
+
+

Beyond the Provided Typemaps

+

There are many C or C++ array/NumPy array situations not covered by +a simple %include "numpy.i" and subsequent %apply directives.

+
+

A Common Example

+

Consider a reasonable prototype for a dot product function:

+
+double dot(int len, double* vec1, double* vec2);
+
+

The python interface that we want is:

+
+def dot(vec1, vec2):
+    """
+    dot(PyObject,PyObject) -> double
+    """
+
+

The problem here is that there is one dimension argument and two array +arguments, and our typemaps are set up for dimensions that apply to a +single array (in fact, SWIG does not provide a mechanism for +associating len with vec2 that takes two python input +arguments). The recommended solution is the following:

+
+%apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1),
+                                      (int len2, double* vec2)}
+%rename (dot) my_dot;
+%exception my_dot {
+    $action
+    if (PyErr_Occurred()) SWIG_fail;
+}
+%inline %{
+double my_dot(int len1, double* vec1, int len2, double* vec2) {
+    if (len1 != len2) {
+        PyErr_Format(PyExc_ValueError,
+                     "Arrays of lengths (%d,%d) given",
+                     len1, len2);
+        return 0.0;
+    }
+    return dot(len1, vec1, vec2);
+}
+%}
+
+

If the header file that contains the prototype for double dot() +also contains other prototypes that you want to wrap, so that you need +to %include this header file, then you will also need a %ignore +dot; directive, placed after the %rename and before the +%include directives. Or, if the function in question is a class +method, you will want to use %extend rather than %inline in +addition to %ignore.

+

A note on error handling: Note that my_dot returns a +double but that it can also raise a python error. The +resulting wrapper function will return a python float +representation of 0.0 when the vector lengths do not match. Since +this is not NULL, the python interpreter will not know to check +for an error. For this reason, we add the %exception directive +above for my_dot to get the behavior we want (note that +$action is a macro that gets expanded to a valid call to +my_dot). In general, you will probably want to write a SWIG +macro to perform this task.

+
+
+

Other Situations

+

There are other wrapping situations in which numpy.i may be +helpful when you encounter them.

+
+
    +
  • In some situations, it is possible that you could use the +%numpy_templates macro to implement typemaps for your own +types. See the Other Common Types: bool or Other Common +Types: complex sections for examples. Another situation is if +your dimensions are of a type other than int (say long for +example):

    +
    +%numpy_typemaps(double, NPY_DOUBLE, long)
    +
    +
  • +
  • You can use the code in numpy.i to write your own typemaps. +For example, if you had a four-dimensional array as a function +argument, you could cut-and-paste the appropriate +three-dimensional typemaps into your interface file. The +modifications for the fourth dimension would be trivial.

    +
  • +
  • Sometimes, the best approach is to use the %extend directive +to define new methods for your classes (or overload existing ones) +that take a PyObject* (that either is or can be converted to a +PyArrayObject*) instead of a pointer to a buffer. In this +case, the helper routines in numpy.i can be very useful.

    +
  • +
  • Writing typemaps can be a bit nonintuitive. If you have specific +questions about writing SWIG typemaps for NumPy, the +developers of numpy.i do monitor the +Numpy-discussion and +Swig-user mail lists.

    +
  • +
+
+
+
+

A Final Note

+

When you use the %apply directive, as is usually necessary to use +numpy.i, it will remain in effect until you tell SWIG that it +shouldn't be. If the arguments to the functions or methods that you +are wrapping have common names, such as length or vector, +these typemaps may get applied in situations you do not expect or +want. Therefore, it is always a good idea to add a %clear +directive after you are done with a specific typemap:

+
+%apply (double* IN_ARRAY1, int DIM1) {(double* vector, int length)}
+%include "my_header.h"
+%clear (double* vector, int length);
+
+

In general, you should target these typemap signatures specifically +where you want them, and then clear them after you are done.

+
+
+
+

Summary

+

Out of the box, numpy.i provides typemaps that support conversion +between NumPy arrays and C arrays:

+
+
    +
  • That can be one of 12 different scalar types: signed char, +unsigned char, short, unsigned short, int, +unsigned int, long, unsigned long, long long, +unsigned long long, float and double.
  • +
  • That support 23 different argument signatures for each data type, +including:
      +
    • One-dimensional, two-dimensional and three-dimensional arrays.
    • +
    • Input-only, in-place, and argout behavior.
    • +
    • Hard-coded dimensions, data-buffer-then-dimensions +specification, and dimensions-then-data-buffer specification.
    • +
    +
  • +
+
+

The numpy.i interface file also provides additional tools for +wrapper developers, including:

+
+
    +
  • A SWIG macro (%numpy_typemaps) with three arguments for +implementing the 23 argument signatures for the user's choice of +(1) C data type, (2) NumPy data type (assuming they match), and +(3) dimension type.
  • +
  • Seven C macros and eleven C functions that can be used to write +specialized typemaps, extensions, or inlined functions that handle +cases not covered by the provided typemaps.
  • +
+
+
+
+

Acknowledgements

+

Many people have worked to glue SWIG and NumPy together (as well +as SWIG and the predecessors of NumPy, Numeric and numarray). +The effort to standardize this work into numpy.i began at the 2005 +SciPy Conference with a conversation between +Fernando Perez and myself. Fernando collected helper functions and +typemaps from Michael Hunter, Anna Omelchenko and Michael Sanner. +Sebastian Hasse has also provided additional error checking and use +cases. The work of these contributors has made this end result +possible.

+
+
+ + + Added: trunk/numpy/doc/swig/doc/numpy_swig.pdf =================================================================== --- trunk/numpy/doc/swig/doc/numpy_swig.pdf 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/doc/numpy_swig.pdf 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,2583 @@ +%PDF-1.4 +5 0 obj +<< /S /GoTo /D (contents.0) >> +endobj +8 0 obj +(Contents) +endobj +9 0 obj +<< /S /GoTo /D (introduction.0) >> +endobj +12 0 obj +(Introduction) +endobj +13 0 obj +<< /S /GoTo /D (using-numpy-i.0) >> +endobj +16 0 obj +(Using numpy.i) +endobj +17 0 obj +<< /S /GoTo /D (available-typemaps.0) >> +endobj +20 0 obj +(Available Typemaps) +endobj +21 0 obj +<< /S /GoTo /D (input-arrays.1) >> +endobj +24 0 obj +(Input Arrays) +endobj +25 0 obj +<< /S /GoTo /D (in-place-arrays.1) >> +endobj +28 0 obj +(In-Place Arrays) +endobj +29 0 obj +<< /S /GoTo /D (argout-arrays.1) >> +endobj +32 0 obj +(Argout Arrays) +endobj +33 0 obj +<< /S /GoTo /D (output-arrays.1) >> +endobj +36 0 obj +(Output Arrays) +endobj +37 0 obj +<< /S /GoTo /D (other-common-types-bool.1) >> +endobj +40 0 obj +(Other Common Types: bool) +endobj +41 0 obj +<< /S /GoTo /D (other-common-types-complex.1) >> +endobj +44 0 obj +(Other Common Types: complex) +endobj +45 0 obj +<< /S /GoTo /D (helper-functions.0) >> +endobj +48 0 obj +(Helper Functions) +endobj +49 0 obj +<< /S /GoTo /D (macros.1) >> +endobj +52 0 obj +(Macros) +endobj +53 0 obj +<< /S /GoTo /D (routines.1) >> +endobj +56 0 obj +(Routines) +endobj +57 0 obj +<< /S /GoTo /D (beyond-the-provided-typemaps.0) >> +endobj +60 0 obj +(Beyond the Provided Typemaps) +endobj +61 0 obj +<< /S /GoTo /D (a-common-example.1) >> +endobj +64 0 obj +(A Common Example) +endobj +65 0 obj +<< /S /GoTo /D (other-situations.1) >> +endobj +68 0 obj +(Other Situations) +endobj +69 0 obj +<< /S /GoTo /D (a-final-note.1) >> +endobj +72 0 obj +(A Final Note) +endobj +73 0 obj +<< /S /GoTo /D (summary.0) >> +endobj +76 0 obj +(Summary) +endobj +77 0 obj +<< /S /GoTo /D (acknowledgements.0) >> +endobj +80 0 obj +(Acknowledgements) +endobj +81 0 obj +<< /S /GoTo /D [82 0 R /Fit ] >> +endobj +84 0 obj << +/Length 1941 +/Filter /FlateDecode +>> +stream +x??YYsE~???G??N??????@AH%??@x????,c?9??t????J?*??W?t????B?????^7?yf??f6???>;;?D??aJ?#O[i????5?Y?tM5?%???5???0??O???J??e?j?/P?i?P?Lw~????X???1L?wt???? ??k?=9nW??q+9???;o?????V< ???K^?<_~3?? +O???l?o?J-H???a?n?|I2\??(????@-???r*?Ni??d,?????U?????$?O?????t?H??u?1?3? ?? /wC?b\? ++ +& ?L$kwG:???&J?? ????s;"hN? j&????d??c|q?????J9?? ?MF?-???????wP???????U???I0xR3 +^XC?? +Qr?,?A??!??C?*C?4?????.?Z?=`td%???(?v???H?_????0???????a:r*??>??oj??e??!!?7?n2Q?C????LsZ?8]?M??1??Z{????E?0/??,4@?O?1{H[???BV?J^?K1?????}??iFc??X P???0$SoAcV???#??E?F?F?P???!f?? ?thnESsVM??d????{@?T!,H????t?)_?? ?Q??????=??{??T??/%>)PGk??5?!??*}H6???2U??0?F???<[??X?y??.??P25??.n??????4?D#?5???A??m??{?T???l1????? ,?{??h?W????*??VGKl????????Y???9???!u???y?? ???f=,, +?.?????"=??B??)????9???i????4^??@M????sjO?(T???EN????F??:iq?R??Z',??9???y?w? +){?}?6y7???K*?]?????,?.?B[??b<=li0?D???M-?H??L?} ??u??jOoQ?Bo????s????:'?????9??S?CvR???? 2????:9?*u?=y????55?a?? ({H4??-???22U??U??s?a?? ??c?;hjnC_? +;mg?A?tB??????????)???<?u}S?z?\??#?????????q??`??????L???e?U?jfF ???V`?_??!??f4&w??1`?????|Zz?5K???x:???????q?Uf??8? <??????w??-p!pD???P???%?V2-? ????e??????qo?=??M??`7e??W&??Y!g??5?b#???r???E*?D??????|DT? +q|n?3f??7!??u??x???m:??s?? ??Ns???w?$???`?n?Z???f??%?"?nq?e?? +?,,u???d?a??jr?}?i????0C4^?}N??????-??q#?iMZ?c?q0Q?a??78f?yNN?m4R?k1?-?X?d? b/l?C??W?^??(????Iga?W????Y0KfNw6Kr??.?+??uoO????l?D????P+?rq"??????4????H??????>????<}LEt?&??7???????n?`^???????m at x??x?? 2M[ +?????"??HQ????c1??_??}endstream +endobj +82 0 obj << +/Type /Page +/Contents 84 0 R +/Resources 83 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 127 0 R +/Annots [ 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 121 0 R 122 0 R 123 0 R ] +>> endobj +98 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 572.1561 154.7972 581.0627] +/Subtype /Link +/A << /S /GoTo /D (introduction) >> +>> endobj +99 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 550.2982 162.5882 560.9481] +/Subtype /Link +/A << /S /GoTo /D (using-numpy-i) >> +>> endobj +100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 530.3729 189.1283 541.2121] +/Subtype /Link +/A << /S /GoTo /D (available-typemaps) >> +>> endobj +101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 510.4476 178.7476 521.0976] +/Subtype /Link +/A << /S /GoTo /D (input-arrays) >> +>> endobj +102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 494.5074 190.5034 505.3466] +/Subtype /Link +/A << /S /GoTo /D (in-place-arrays) >> +>> endobj +103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 478.5672 185.4226 489.2171] +/Subtype /Link +/A << /S /GoTo /D (argout-arrays) >> +>> endobj +104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 462.6269 186.7573 473.2769] +/Subtype /Link +/A << /S /GoTo /D (output-arrays) >> +>> endobj +105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 446.6867 245.8948 457.5259] +/Subtype /Link +/A << /S /GoTo /D (other-common-types-bool) >> +>> endobj +106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 430.7465 262.7715 441.5857] +/Subtype /Link +/A << /S /GoTo /D (other-common-types-complex) >> +>> endobj +107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 410.8212 174.6126 421.6604] +/Subtype /Link +/A << /S /GoTo /D (helper-functions) >> +>> endobj +108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 392.8286 153.5624 401.5459] +/Subtype /Link +/A << /S /GoTo /D (macros) >> +>> endobj +109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 376.8884 160.5759 385.6056] +/Subtype /Link +/A << /S /GoTo /D (routines) >> +>> endobj +110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 355.0304 240.5847 365.8697] +/Subtype /Link +/A << /S /GoTo /D (beyond-the-provided-typemaps) >> +>> endobj +111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 335.1051 213.6367 345.9444] +/Subtype /Link +/A << /S /GoTo /D (a-common-example) >> +>> endobj +112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 321.0976 194.7271 330.0042] +/Subtype /Link +/A << /S /GoTo /D (other-situations) >> +>> endobj +113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 305.1574 179.6044 314.0639] +/Subtype /Link +/A << /S /GoTo /D (a-final-note) >> +>> endobj +114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 283.2994 142.0953 293.9494] +/Subtype /Link +/A << /S /GoTo /D (summary) >> +>> endobj +115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 263.3741 182.5135 274.2134] +/Subtype /Link +/A << /S /GoTo /D (acknowledgements) >> +>> endobj +121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [288.033 198.1192 317.1934 209.9797] +/Subtype/Link/A<> +>> endobj +122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [312.5275 186.722 341.6879 197.5612] +/Subtype/Link/A<> +>> endobj +123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [350.8735 174.7668 380.0339 185.6061] +/Subtype/Link/A<> +>> endobj +85 0 obj << +/D [82 0 R /XYZ 74.4095 789.6651 null] +>> endobj +86 0 obj << +/D [82 0 R /XYZ 74.4095 771.7323 null] +>> endobj +96 0 obj << +/D [82 0 R /XYZ 74.4095 613.3264 null] +>> endobj +6 0 obj << +/D [82 0 R /XYZ 74.4095 613.3264 null] +>> endobj +97 0 obj << +/D [82 0 R /XYZ 74.4095 585.1076 null] +>> endobj +116 0 obj << +/D [82 0 R /XYZ 74.4095 254.4078 null] +>> endobj +10 0 obj << +/D [82 0 R /XYZ 74.4095 254.4078 null] +>> endobj +120 0 obj << +/D [82 0 R /XYZ 74.4095 213.5613 null] +>> endobj +83 0 obj << +/Font << /F39 89 0 R /F44 92 0 R /F8 95 0 R /F51 119 0 R /F56 126 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +147 0 obj << +/Length 4012 +/Filter /FlateDecode +>> +stream +x??k???????E???R?7? ?4NS4I?^QMQ????????????;Cr(R??? P??1?????t??m?le???X?j??fw|?mn????X??R?Ri _???j?7M?????>za7?u?????? %??h????z????WWl??^5B???????Gxu???]???JgH?k?Q&??#@ p} ???k9,hl?????1?????}???=\?w1??????????-?4[$????j??????~? ?6o?????IN??????#.D?W? 0???s??9B?m??& #EOuXy>>?6???\l?Z???? ?, at HD?J??l????&?G4???{i???*?5?????"?}v??P0?Z?H?k-?*?*~z??0?dR???|@%?5Zd?_??????????vF?Le???R??Y^N?????)??w-???6f_i'????x??Q???$+"????p Tt???0ON"Dp??(??7QP?-i??o?S??2 r(\)?_"u?????@?^9???ZAv~J?4n???????????PG??1????????>? A?e?EI????[??z?C^&??p}???Ix? :7,h?dD?????Ydc?`^??6?? +??)pqr??<lTx?eS???|@e?j??M%S?U??3S??V&????? ^?????????j!??????????u?O??h??v??,X?`p??????7^3????????????? 1??????$Z?1R?2)??? Ol???dp:???8?>?)4 ????(??"??8?wpC???3A?6?s?-?ci??G;????m??s?0?"??????s??N(?|&??G?n?`"????y??(?\b;?*e?F;+?b???j???" o???q???????u?????? +?L??]??$????@N?{a??=??a??I?>Jd??-:??U???c??m?:?l??o??y?|Dp?????6?)?A?? I????????c????\@ + T?v???y=??/?tH*?????O???*?????i?????[???`?Q"?=?8??~??}F?C?Ol?4???p{???"???9p????????M?sWQJ??????gQ?S63X? ?m+??r??U?`e?? ??;????m?;?Q[(???'?&?`??hW?;??n?tT?=B]??s??A??W ??b?????C3`?T4?<`??K!??zJ???yBNE??BF?j??'???C???d?b'???BZ??????H|RjJ?Cq?Y ????S???C???E5?????xX>?/y?? ??'B??????}8???j[?0).;>_PniZ??z???Re53???]?J??????q??q???-??`??m?????????????2?)??~???.???Z?7s?? ?tL??? ?!MVKG??)QH?!)U&]??U?[??J???:? +??(?-H_??HS?`???#???AV?i?`?=jN???????D?5?W???N??k??? ???6?B?b1S????l%???t? e???8$;??^ NzvV??:?Q2??P??|Y?m????????L??= ?&??[?O at +?~?[??l?D?m!A]??q??N?s'? ?~tT?+???E4?Qi"?/???dq2???E(???7??c?b?}?Hy?> ???)q?S?r??*?+???4??1o ???????)'??????I?-q{R?|????A]??BI?l??e)?>^:.?@8?1??U??v???nYG?>????WVx??D?-I=;XAv???"???)?0LB?????+?7???C??B???f??A?B|d?d% ?QB|??/?????<???p +????1???? ???j?+?????L^fj?Z?N?????????? JJ /d?? +Nj|vR?aF???luBv???4??:??8_?HPH????????L-e?kY?f?????9\???E|?3\??ws ??;|?*??3?!??Z?p?_DK[??3U\?O?? ?N?O??|@?M?? +?a???e?!C~?+{??:S???b?o>x?}??????E??g~??u???C?~?7?????B2A?q????e????N?Z?=?(-?r?q??K??96K+?[SVS?)`????????Cl? vH?? L??}J???q?'D5???????????P?J?a]@"1??)???-?}??TL?? d????? +?R?)???????7!?n?y????o?r???E?.4?0?i?#???????sU???B?(?&?`_??^>??jw??#??Z?Bbr? +'}??Z|???*?rXu?UV???????? > endobj +149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [312.8897 746.8856 342.0501 757.7248] +/Subtype/Link/A<> +>> endobj +150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [124.3686 699.0649 153.529 709.9041] +/Subtype/Link/A<> +>> endobj +151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [105.5626 674.5966 137.9707 686.4571] +/Subtype/Link/A<> +>> endobj +155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [178.0471 663.1994 213.3644 674.0386] +/Subtype/Link/A<> +>> endobj +156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [145.9004 650.6863 178.3085 662.5467] +/Subtype/Link/A<> +>> endobj +157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [185.0642 539.3837 220.3815 550.5019] +/Subtype/Link/A<> +>> endobj +158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [375.3565 527.7075 410.6737 538.5467] +/Subtype/Link/A<> +>> endobj +159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [168.2912 515.1944 200.6993 527.0548] +/Subtype/Link/A<> +>> endobj +160 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [486.5452 503.2392 521.8625 515.0997] +/Subtype/Link/A<> +>> endobj +161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [88.3572 479.8868 117.5176 490.7261] +/Subtype/Link/A<> +>> endobj +162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [332.17 467.6527 361.3304 478.7709] +/Subtype/Link/A<> +>> endobj +163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [199.781 432.0662 232.1891 442.9054] +/Subtype/Link/A<> +>> endobj +164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [368.9173 432.0662 398.0777 442.9054] +/Subtype/Link/A<> +>> endobj +148 0 obj << +/D [146 0 R /XYZ 74.4095 789.6651 null] +>> endobj +145 0 obj << +/Font << /F8 95 0 R /F56 126 0 R /F58 154 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +167 0 obj << +/Length 3126 +/Filter /FlateDecode +>> +stream +x??ko????? +%rqb?o???R:??G?^)?<o7a|0?????W?i +?K?G?W?j?Vc? _i?????RJ?) +R??????2?&?p:?"?Z???? \???O H??;x???-??#??w????!?[L ?Gb?x???,?LZ?s????0????????bO?Q?a???????r???*?z?C??p?csf??????k?hL?? f??M??????\??6*??L?=l ???kx?W???kzrn\6;?????_e???V20???}l?n)??t??[?0(?:gAxDq?7??}p1T????2????d??E??^]?????:?O??Z,?d????c|???~|?????????vf? 5?a?3 +??Y?????`???zJ~?<{~???O9?|??????PrN?v?l{1??X??4??*9?$??Q???S??\??????6u.???h3??|)1??????D+?q????S??? ?K??Y)P?.???-?[??`?@??s +?s?Ho?? a??y`?o? +?"?xRm?d???????3r????W|???=h?vU??/F?????? +?$mx???,??B?J5 ??*A?o??h?'j)?u:??X???kZ?Y??:ue?D????f?yh? +?T??x???= +R?R???1?6??Q?NlB?"F????Lbz?54%[`?>C? D P#s??^t??&\??4??eK???>+)T?LX? ;l????<6???z?"an?= +a|??W;?.??%?m???m+ +???|??W??a/t??w?CC??2?????u?  ??*??b2??5 ???)xG!?z?^??K?G?Oz L??:X?7C+k*???????????P?1???????\???oI?'?1?l???]p]???????|??rM???m8U]WB?0?|Y=?5n?4?10Fx/???L?p/]??'??TZ9MN???,O?s?7?8?7?/ ????x???????? ?#H2D\??m?:t?4????H??????GM???F6?Ul\?T]t??G???Z?????I??????)6??G??????j,?]????4g"I_%??]??c????2???" 3??m%!?d ?!?TK+??MUK#)?>?Y?9??l?????m3+?4KZ??P???k?j?an?7?I?????D^>S#[???)D?|?? ?????A +p+_?6Iw?F~?=?????e?5?????_??+E??M?)?_? +y?:Y??|?,J?>>???-^e ??S!???d?N+???`x????O,?/??!#?U????-7l}&???%?0k????0??A????n??M????E?????????^?"@?}?????I?#.??G????j ?r??????-?[g????$u??%~?{i??? +?C??E(4LB6e?~Y?/3?{Q????dQ?????? ?X3Y3??E^??C????Y,?i????}v?s?P9A???)1??bfA??l{3Z|?o?? ??d?nf?UC???>@R\??U?b#-TH???> endobj +169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [98.5482 758.8407 127.7087 769.68] +/Subtype/Link/A<> +>> endobj +170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.754 758.8407 287.9144 769.68] +/Subtype/Link/A<> +>> endobj +171 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [204.2029 307.9714 236.611 319.8319] +/Subtype/Link/A<> +>> endobj +172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [185.0902 284.6191 217.4983 295.4583] +/Subtype/Link/A<> +>> endobj +173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [267.0288 284.6191 302.3461 295.4583] +/Subtype/Link/A<> +>> endobj +174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [73.4132 272.3849 149.368 283.5031] +/Subtype /Link +/A << /S /GoTo /D (helper-functions) >> +>> endobj +175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 260.7087 108.7305 271.548] +/Subtype/Link/A<> +>> endobj +176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [270.1513 188.9777 305.4686 199.817] +/Subtype/Link/A<> +>> endobj +168 0 obj << +/D [166 0 R /XYZ 74.4095 789.6651 null] +>> endobj +165 0 obj << +/Font << /F8 95 0 R /F56 126 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +179 0 obj << +/Length 3162 +/Filter /FlateDecode +>> +stream +x??k???????E???D?/?j>9v??H? ?"??X??????^n7u????3??"EJ{???0???? g8o????|aSm?????4_?????={? F??)?x??6Z??v?X4)??/<|j=?;?-.^-`Lj????t?Y\\?}y?]"?{?D?@?(D???z??G??`?)?8?{?????????w_ < +f?f???9?q?"????R?F?j?*^??lk????????k??p??d??M????J#??u??.*F??E ?%?jWO?(T???`???X?? ????X?@??Z???I?2#u????s?K??1?>??K??/)6??~+??G2??K ?LK?[?K@?oH???ax?? ?Cm??^3&Y????!^????? ?:?? +??=,,dX????U???*?-????\r Fz?C???n ??en??????`?_ds[??x6? 8%??}3??o?#@???? >|???n?KLAx;?? ??;?????N???9??sf??V?z??w?{q*u?M?A?=h?Sw?+Z?F?%+j??h;?VZ?/i;*?K?I=v#??#UDi????(m? ??N?????`?N?h?B??Z?T G2Sl???t~^z%????-??????P??u ?2'?^??Q?3- ???#?q((?T????^?>wY?(??r3???!????$5??vC ?g?lF?Dt7?e]??_???ik??????? +?',??(%=???? ?%??q??]??5]?Q?w?CI??vXZ???V??\zt5l?F????K1YJicx???? ??T +u??5??????U?}??gT =???????? ??D?BQ??g?y?????>I&?&?&??? ??@?'?^U[E8??'w????^c??N?s ??;???f???5|?\?? ('?.?CRfdB?1?7)|? +?(???"? ?5Y??8w?Y????y?r?^?S????6???tP????1???,:9?gNK1??HV??{?`h4o?&?????r????W?\??5???^?d??????hWTj`?0?J?z?????????????_LQL7#TH|k.?E? ? ??S?!?>???????7?:????kB;?4??}V???]V3?6??P??O??\??? ??W???]?? =_?U? )??qw??^??"??c?e4?c?x?m9 9???6?H ?-??_?2i??\\???G?a?:??8???j<'?OX?????????????<,T?U???N?e?/f?????C?17????:@?? ?????j?%??)???u"??+?=?]??\???!??IV???v"??????a?a";5 Ml?????D!????3?E&?U*%j,?Z?{??xF(?????zB?0?d?f????iX>????4 v????i?R_?9??)?TwLh?hf?M*???t *e?=?K?E?R"4?u??w?N,???a\?yY$@3?P'e1Gs???h])?p???eb8S]B&??L??Lfh&2??IB?? c'f?i???> endobj +181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [110.73 758.8407 139.8904 769.68] +/Subtype/Link/A<> +>> endobj +183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [175.0442 617.5703 204.2046 628.4095] +/Subtype/Link/A<> +>> endobj +184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [474.6661 617.5703 503.8266 628.4095] +/Subtype/Link/A<> +>> endobj +185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [265.7793 593.6599 294.9398 604.4991] +/Subtype/Link/A<> +>> endobj +186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [173.2926 482.8242 205.7007 493.9425] +/Subtype/Link/A<> +>> endobj +187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [270.0076 447.2377 299.1681 458.077] +/Subtype/Link/A<> +>> endobj +188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [314.0087 435.2825 343.1691 446.1218] +/Subtype/Link/A<> +>> endobj +190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 344.2349 108.7305 356.0954] +/Subtype/Link/A<> +>> endobj +180 0 obj << +/D [178 0 R /XYZ 74.4095 789.6651 null] +>> endobj +128 0 obj << +/D [178 0 R /XYZ 74.4095 697.101 null] +>> endobj +14 0 obj << +/D [178 0 R /XYZ 74.4095 697.101 null] +>> endobj +182 0 obj << +/D [178 0 R /XYZ 74.4095 653.5817 null] +>> endobj +129 0 obj << +/D [178 0 R /XYZ 74.4095 424.0447 null] +>> endobj +18 0 obj << +/D [178 0 R /XYZ 74.4095 424.0447 null] +>> endobj +189 0 obj << +/D [178 0 R /XYZ 74.4095 380.8043 null] +>> endobj +177 0 obj << +/Font << /F8 95 0 R /F56 126 0 R /F51 119 0 R /F14 193 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +196 0 obj << +/Length 2490 +/Filter /FlateDecode +>> +stream +x??Z]o?6}?_?G{1f?O???n???;(??,??B?x2A?q?Jf????_?%%?N?]Fd???,?n?On4i?]???x?"i9?[?dq?W??1?lU??W???$!?!m???!???A???&@~??(????^?N???\??!?&?m????E]&????N??@?!hF {??}|=vq?8|??W?.???i?4??.???gkP {? +??}??s x??;????.&??=??#$?,??] +e??-])??I>?~.??I??%??PB ?j U/*?&??%T? ?????r???s?]?la????J??s??.???7u?t?8?\@?o*u9F??????%Z?l???l?{??t????}??%?m?O??? ???M?e?JzGX]?-?;?]?;??z???hT?z7P445?JzGX]?-?;?]?;??p?`???Y?D???-m?jcTA?VU?H;?=??W;?}?l???&???Qi?D???bT)*V?J?E%?]?J????S??%2?9Q???L%*U?J???R?EQ?y???^83??3?????P?qY?B?"a??hQr????/???E??9(~F????OT?w?*?.???+????? ?Ky_"?U~?????Gxx?W?`???6?j_9}????s?Z??r?? ??U%?d>??1????>??\? ?f}t???:L???>????=??cj??{?}w??i???m???? +???;n??wP??P{3yn?u??=??s5o?? ??i?K??ul?VJA?$8L?!8?YpVa??1D??F????C?(B.?i????H????:2??yl???????m??O? x;??C~??????Z??m9nlm4?uq?????m?rf??xa????-???W:I?=?Q?r}8:?-???]?YWn???? p??y#???-6;????????[????-?q??s+?&?????vn4p???a{???B?}9c????fw'"?i?d|4 ?w????6)????>???|?p?M?r  ?W??b+x??? f??????r /?P7?????UEk?????p??U??X?LqO?JFP)U@????.????????????F??G???V@?E ?]A?? +?????3????U?Q?DX=%Z??w!)?+??W?(??0( +?B?R?"??-?T?????O?Q????#?P???X?U?T??#U?E??y"???BV{? ???T6?1??V?J?v???w>*?+e???&mx?5??l?*?3???,??x?? ?Ly??6?????????a?'/???>?N?yO?????/??;????O??u???/?x????R???????@S?DK???L??+BG~?? ???"??Q?y???u?s??c???m4??E?,?%??+?`^||??b??|l????g??w??VJ?M????$K>??p7-??E??O??$T at aAvN2???!Z)6??;???endstream +endobj +195 0 obj << +/Type /Page +/Contents 196 0 R +/Resources 194 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 127 0 R +/Annots [ 199 0 R 200 0 R 202 0 R 203 0 R ] +>> endobj +199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [192.2385 577.419 224.6466 588.2582] +/Subtype/Link/A<> +>> endobj +200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [447.6812 577.419 480.0893 588.2582] +/Subtype/Link/A<> +>> endobj +202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [444.362 322.3246 476.7701 333.1638] +/Subtype/Link/A<> +>> endobj +203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [161.7108 310.3694 197.0281 321.2086] +/Subtype/Link/A<> +>> endobj +197 0 obj << +/D [195 0 R /XYZ 74.4095 789.6651 null] +>> endobj +130 0 obj << +/D [195 0 R /XYZ 74.4095 636.402 null] +>> endobj +22 0 obj << +/D [195 0 R /XYZ 74.4095 636.402 null] +>> endobj +198 0 obj << +/D [195 0 R /XYZ 74.4095 601.9391 null] +>> endobj +131 0 obj << +/D [195 0 R /XYZ 74.4095 381.3075 null] +>> endobj +26 0 obj << +/D [195 0 R /XYZ 74.4095 381.3075 null] +>> endobj +201 0 obj << +/D [195 0 R /XYZ 74.4095 346.8447 null] +>> endobj +132 0 obj << +/D [195 0 R /XYZ 74.4095 138.1683 null] +>> endobj +30 0 obj << +/D [195 0 R /XYZ 74.4095 138.1683 null] +>> endobj +194 0 obj << +/Font << /F14 193 0 R /F56 126 0 R /F8 95 0 R /F51 119 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +206 0 obj << +/Length 3459 +/Filter /FlateDecode +>> +stream +x??[_s???????P??!?L?;????Wi'?d2??,???\Q??~??. ?x7???????b??????U?k?tf???????f??Y]C?w??hmkml 3?k#??Y+W???????^??;c??????uk?vuq?S????????gk??y??)Y}???????|??[uug?E.?j-\?????? +????A???|?3?2?h}?6y?Y`"??X????wgki?-4??(????????*E??????L:j6?M??T??=??L?mAm?7(??iX?=?????????? *&??Ly???*????}??nl37J?????P?k???9??????3??]???$??? =?E*????=J?c>rTR??4?????d5 ??a77^sl&0]V???;d??????Dgj??[???u??_?Xu?4??e??iZ????????|`????y??u?;U?S8?H?,??Jq??v???T????~??F??%?z?'4~^T?{?:7?X?C?G?????hY8?5?? ?z?M?u?A???i?c?????????ft3??ge ??~??X?-??E???sc?1]????$D,?????&34?lmD???1?)???Y?j?*q8D??>E? ?>w???"???hfu? +????s???b?????ir???6a????2?? ?????? l!?o@tlO??=???q?R??us??4?? -]?i}Hh?_j?????????R????|??NX????l? +??&?Fz?????.? ??K???0KX ?Q????M???:U[!?#?2???S/5a{??T?M??B??WF?e)??P +??S\xu????V????@~D??????]??????TG?he?T??R?uz????-?8?\4??C--?a(?m`;???P ???q??ZK!????????R??????Y?$a?U?[ V?? ???? Lh????0D_?J??????F?GLQ?[w` ??K???P????d \"*?Q;?@???@?%y??j???i??+.????U??a|r??????????O?U???????????^??7????/????6?b?A?V?????M??};????q??:p???G?%?3?q?/?????????N??u5?I????UwB?#?O??t??+??D?e??????}???1????]+???S??G???_?v????y??~b????tFr???v?1??M?s!?.?{-?4??{????)?OY?:??m??????????h?B?$W|SS?ls?Q2N9Q?aL???`?ZL?? ???i?H????[4?E???"4?T?$?*j?>???.???v?_??5r???a??? 17????K)??@?k ???9???:m0E????~???z.O???)&?8a?Z??\???T?Y????D??????-??N?0KE p?f??S?S?i?p ???#YL;vZ?????=/?X?0??k?????h?r??dn?????? B??????2?v?Q????X??+?J?-?*^pf?d??*?uX%_?2?6?U/| ?uij +?p?{???r?7????!?u???;????|??n?B?????O????m4?%??R{,???i?iNw???H?/?w?M??M?ZYHQ??Lt?k 0GY?w=7????C?Z??c??n? ?????m?-?`?EBy?? ??b? ^1.?t(??qU7???)?????@?Bv????????jvcG?i??????xB?ed???,???4???w?|5?x+ke?6w???W?=*i?????G?&????B3&????L?%?3L???o??z(???z?????4+??D????I +?E?x??Kc????p???I??N?k?%?v?9????!??}l?????s?6??}??7???x???{t??(?:???Kg?%R???O'?!a?s?Y+q?+??Z?????>9h?^?B?0???C?n???????D?A??n?NYLC???T(?w~??i?~???q??D??p???3?8??!?X????^???%?S?% +*R??e??d?y,P?????????q?<|? +??r?????du?/?~?j??#?+eq??"??36????????7?>n????Z??f.Ys?)?? H?7 +!#h?>?!????JGQ.?`?6??$??-?!H??6?A?Q??s??[? ?\3???^"??j?8?~ O ???3 +z?j???????a ?:?:?j??? !??P?;?w???R?0????Q3??y? ???%?\??D?? ?4?4??&A?[0????OIU;??g? +??A{??????Z?.?9??r?,zP???OOiz?U??M??OMmt3?31??J?A????3; g!???B2?<% ?????????8??????Kz5?n??y?4?$p?[AZ?7?7?|?'??Le??$?Pr??? ?F?h`??-@????~?6??6Q??{???X8????_P[????Z??im!q???e1?4??:s????0E??%??W?X???_???x[r?LS???s>?x]??/?\F?A!??M?M?"?pg??????8?Fa??N?6qQ??@?\N&b???x??+$CvI??P!???%Tx?I /`q?R?!Y? +?u.???6?p-???_2H???}??r??u??_:M??li:J;? ??b(??.?\w(????#??G?v?G??????' O}a?2Z??????;?]?"F???*@?????`l]c@?N??;h?q?a(?]o????Pb2??$DS+???? e?ew?o?f??? +sendstream +endobj +205 0 obj << +/Type /Page +/Contents 206 0 R +/Resources 204 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 127 0 R +/Annots [ 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 217 0 R 218 0 R 219 0 R ] +>> endobj +209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [194.6375 716.5495 227.0456 727.3887] +/Subtype/Link/A<> +>> endobj +210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [280.5773 680.6839 312.9854 691.5232] +/Subtype/Link/A<> +>> endobj +211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [338.3317 680.6839 370.7398 691.5232] +/Subtype/Link/A<> +>> endobj +212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [325.0489 552.6042 357.457 564.4647] +/Subtype/Link/A<> +>> endobj +213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [112.7078 517.2966 141.8683 528.1359] +/Subtype/Link/A<> +>> endobj +214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 505.3415 105.8213 516.1807] +/Subtype/Link/A<> +>> endobj +217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.1098 273.3621 423.3722 284.2013] +/Subtype /Link +/A << /S /GoTo /D (available-typemaps) >> +>> endobj +218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.4973 169.7506 313.0848 180.5899] +/Subtype /Link +/A << /S /GoTo /D (input-arrays) >> +>> endobj +219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.0247 169.7506 474.368 180.5899] +/Subtype /Link +/A << /S /GoTo /D (in-place-arrays) >> +>> endobj +207 0 obj << +/D [205 0 R /XYZ 74.4095 789.6651 null] +>> endobj +208 0 obj << +/D [205 0 R /XYZ 74.4095 753.0247 null] +>> endobj +133 0 obj << +/D [205 0 R /XYZ 74.4095 506.3377 null] +>> endobj +34 0 obj << +/D [205 0 R /XYZ 74.4095 506.3377 null] +>> endobj +215 0 obj << +/D [205 0 R /XYZ 74.4095 471.6552 null] +>> endobj +134 0 obj << +/D [205 0 R /XYZ 74.4095 320.3306 null] +>> endobj +38 0 obj << +/D [205 0 R /XYZ 74.4095 320.3306 null] +>> endobj +216 0 obj << +/D [205 0 R /XYZ 74.4095 285.9271 null] +>> endobj +135 0 obj << +/D [205 0 R /XYZ 74.4095 158.7917 null] +>> endobj +42 0 obj << +/D [205 0 R /XYZ 74.4095 158.7917 null] +>> endobj +204 0 obj << +/Font << /F51 119 0 R /F8 95 0 R /F14 193 0 R /F56 126 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +222 0 obj << +/Length 3687 +/Filter /FlateDecode +>> +stream +x??[?s????B_:????~r\;?I??V'?I2Z?e??????????xp8???$?9???X,??? GvL?;6?H?????h??????_@?gG,?H??T???D?\qJ???x^2?????s?e?8?????a,??????7?? ???YnN??????j?? +??'???C?5]??t????b???c??@u????????I?-.sD+;???d????? ?|^?7?7L??27?:&GR?U9Q?g??ZW??4??j????>????YP?Z?a?Gp??vu?w?9I?7V?????????F?ul?+?7??"??Kx????2???=????~?"?#i?4?~?]?? ?Q1^?qd?x????:J????&F?i?????_E?5h??/???m??l????0??[????+????~eJ?} ???aH?7??Q~???N?????r*?????r???????W?Z????hP??!?:?Y?????I6?k??OX?";t???{?${??_??? m("8#`?Y?+CQ???N%?LM?? ?4E/??w??l W???????<+?{?Nkb;=C$??*0?D?8;?$????GM??v??????'kh???d*}}n?BX?9*?a????K???%y | ??5bhE????HD{????X }*.? ??j?}X?]j -l?R?.M?????=?R ?X?U?E?T{???X R%EQ??+??gqV??:?^???~M?????P?E?????%[?m???i;?????I?=??????[???0Sn??G)????0?0????e??6??????.?s.?H???ng??V?P???X???8??[g}d??O??????C |C0M?drT? 9T??'iN??n$????l}?5??zI???E ?V ?M????????u?G???vaq??>????.3Z?r?#??RI?!???zOU?g???),??X-?tA?S?5????/B?v???? +?_?L?gtI?rU?>?Dn???#?*?????J?????????:k=^??!jXW??3)?-?^???w?8qF???`:i???????)???e??????e???!?hi7????????;*E???G???b??w ,S?E?9R?x? +~?q??s??ms??R????jq?S?Hm?o??eL;W? ??C??DJ?6(L?k????A??)????#???0Is??????o?????Ab?g????g+??.??????M?????(G?/:??.R=??\1b???'?V??W+M?? ???Yu w?????????? +?{=a????4?N?h??L?d{. ?U?????V.U?^? +?W?jF?2?-??p?????????:N}B +?rT|g???X?E ????????h?AC +8x}??H"?RD?U?L????%QM?cSQDS#+~x?=?2?s?????)????@??????} ??Za*?f??\??:jL??? +?_?D??U?`?BC\TK?'?Y?????????D???R?????O??o|?Y}O?I$??Q????s}o4??????????mH? ?b??x???L|??!U??3??-ym?i|?6??&^???2???cvH??2?s'?yA?????gN8??? ?????_{*endstream +endobj +221 0 obj << +/Type /Page +/Contents 222 0 R +/Resources 220 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 237 0 R +/Annots [ 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R ] +>> endobj +225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [110.0908 728.5046 142.4989 739.3439] +/Subtype/Link/A<> +>> endobj +226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [162.8935 728.5046 198.2108 739.3439] +/Subtype/Link/A<> +>> endobj +227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [489.4544 728.5046 521.8625 739.3439] +/Subtype/Link/A<> +>> endobj +228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [92.7704 715.9915 128.0877 727.852] +/Subtype/Link/A<> +>> endobj +229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [486.6948 540.649 519.1029 552.5095] +/Subtype/Link/A<> +>> endobj +230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [92.7704 528.6939 128.0877 540.5543] +/Subtype/Link/A<> +>> endobj +231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.2248 528.6939 366.3852 540.5543] +/Subtype/Link/A<> +>> endobj +232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [432.0992 528.6939 464.5073 540.5543] +/Subtype/Link/A<> +>> endobj +233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [148.2193 492.8283 180.6274 504.6888] +/Subtype/Link/A<> +>> endobj +234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [202.5826 492.8283 237.8998 504.6888] +/Subtype/Link/A<> +>> endobj +223 0 obj << +/D [221 0 R /XYZ 74.4095 789.6651 null] +>> endobj +224 0 obj << +/D [221 0 R /XYZ 74.4095 753.0247 null] +>> endobj +136 0 obj << +/D [221 0 R /XYZ 74.4095 481.8694 null] +>> endobj +46 0 obj << +/D [221 0 R /XYZ 74.4095 481.8694 null] +>> endobj +235 0 obj << +/D [221 0 R /XYZ 74.4095 438.7979 null] +>> endobj +137 0 obj << +/D [221 0 R /XYZ 74.4095 415.7379 null] +>> endobj +50 0 obj << +/D [221 0 R /XYZ 74.4095 415.7379 null] +>> endobj +236 0 obj << +/D [221 0 R /XYZ 74.4095 383.3746 null] +>> endobj +138 0 obj << +/D [221 0 R /XYZ 74.4095 163.9773 null] +>> endobj +54 0 obj << +/D [221 0 R /XYZ 74.4095 163.9773 null] +>> endobj +220 0 obj << +/Font << /F51 119 0 R /F8 95 0 R /F56 126 0 R /F44 92 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +240 0 obj << +/Length 2912 +/Filter /FlateDecode +>> +stream +x??[[sb?~???Q????/~s\v*??N??v?X???%X ???}z???3h?U?+???????s 3 ??Lq??3? ?R???? +??????H??\".???? A1?R??"g?????~o AF:??? K??Q???????>??7?????????Il1g?i?z??A? +v???1?V????|wJ*-*c#?YT???^?:'??9#???????u ?0??Q?????????-@?? +#f4?????1t?x???"~|???????l??????B~???7???~???????)CB0???D?IqD?.Sh9?T?@)A???D??}?p???h7?\P?~NuT6????,h?"????6?8@?lV@?^?????\?"??E?????[?;+?q??b-??g??F??0?1}MD?EN?4A?=???W??B???GZS5??Z???3???????a ???????Z9????f??????&?F???J?????????????V???z?TQ????J????@?]??D??9????n l?f???0L?????#?4?????-(?{u?,d!?fj??.???>?'A??}???]???????w?x?mK???K???n???IM?????(?&? ?p??T?d???q&??????n???p? *?? ? 8??Cqd??9vB1??????? ??iD59+?.?+??? ?ju??9????x* +4LD?h?% ???@? ('?H@?l????????&?Bl???Y?R?C??J?j4?4bX?2?H???K;??"}??"/4lGYIq???*NT??kZ???????~?c??F??JJ??0[?%1$???&??t%!?ZJ_?t???r~?k?cq? 1*;Z?aF6???l???rnX???a.?r????v!???????b?%??_?$???ch ]?????;h?o?_?H?vd{??i?'?i??(??&??S?Ccz^???????????s?,?9?|???.??X??y%A??,???????~?E?^??8??AQ2%?3???S?|??????8????Z????k?j?$??,??C??.????????sk????V?:??S? ,n??z ??W????|6????6??^??Cl??Z???@b??????;????4??m??Q;?i8?:?!?yo?????r??7j?8.? +??j?n?T??qRh?k???1?y?1N,-????????t?#%??Z??1P7K- +?????7?(D??Rv"?D????. ??n?6?48?????l???????&;k?v ?{?)?k?H?B?]????E?v???f;?;Q??=NT?F""k]???(A"`hF???????e@?M?4??l"??Q?I?!??D??D??z?l?W6g??????|kp?*YkF??n???T??Y?Y?>?????b??????Q|??????L=? ??x?RKx??K? ?y?|?fnX9}???)A?z9?9??WKw??t?}?$???c???~?*??)??V???)?Oo????a????h???1??b?"??? ???????x???@5??c????D???????[~Y???m5E?bU???????W?j- C? j?-?)c??????1*?a?b]Y??XW?h]?????l?.ve?S????M]?m??J?[???485????? ?F(??V ?n??d????Nm?r???D?{m??RCy:(?s???9? K?i??dn?vK?B?'????wg?j{?Y????g?*?4h? R?V?xE?F!l????edS????6)?`o?????b???\? -Z??n?V???mR??mZzl? +????V:????/r???j?#????U??]>R ?s??1???1A,?@u?soe???0?3?6?6?? a?9v???CqAf?Z??Y#????#\??V?l??eKx??{?3???J?/>?PS???E?eH?????}?(?3?G`??????!???U??OQl??3?$?VT?~???V3 ?S? ???Y???6D?i??K?K??At{?C,?????????????????-f???1??U???i?{3;?0c??9???a?<~~\????6_ ????? %?y???p?s?= +a??Lp??????????????? D v?ad??x???~?]/?????mV?eT?[?Vo?BS?V ??n???Slz??)??Q???????+^?m?Q?@????*??"D$%? +ND??5??,D???_?mOP??&ZD?EF??{?????E?kq???y??W?endstream +endobj +239 0 obj << +/Type /Page +/Contents 240 0 R +/Resources 238 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 237 0 R +/Annots [ 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R ] +>> endobj +243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [271.0812 690.5936 303.4893 701.7118] +/Subtype/Link/A<> +>> endobj +244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [215.8886 605.3217 251.2059 616.4399] +/Subtype/Link/A<> +>> endobj +245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [370.565 589.4719 405.8823 600.5901] +/Subtype/Link/A<> +>> endobj +246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [240.3865 520.0498 275.7037 531.168] +/Subtype/Link/A<> +>> endobj +247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [338.6766 520.0498 373.9939 531.168] +/Subtype/Link/A<> +>> endobj +248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [279.4096 506.1473 314.7268 517.2655] +/Subtype/Link/A<> +>> endobj +249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [265.8608 396.965 298.2689 408.0832] +/Subtype/Link/A<> +>> endobj +250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.5279 383.0625 293.8452 394.1807] +/Subtype/Link/A<> +>> endobj +251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [368.8832 355.2575 401.2913 366.3757] +/Subtype/Link/A<> +>> endobj +252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [265.8608 273.8803 298.2689 284.9985] +/Subtype/Link/A<> +>> endobj +253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.5279 259.9778 293.8452 271.096] +/Subtype/Link/A<> +>> endobj +254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [207.6747 230.2254 242.992 241.3437] +/Subtype/Link/A<> +>> endobj +255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [389.5264 218.2703 421.9345 229.3885] +/Subtype/Link/A<> +>> endobj +256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [247.2111 136.893 282.5284 147.8219] +/Subtype/Link/A<> +>> endobj +241 0 obj << +/D [239 0 R /XYZ 74.4095 789.6651 null] +>> endobj +242 0 obj << +/D [239 0 R /XYZ 74.4095 755.3439 null] +>> endobj +238 0 obj << +/Font << /F51 119 0 R /F44 92 0 R /F8 95 0 R /F56 126 0 R /F14 193 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +259 0 obj << +/Length 2796 +/Filter /FlateDecode +>> +stream +x??[Ks#???W?H?v`??9?8?????rQWR"??(Y???s0???*oUj??p????nt????d?8?????I)???? /?a?g$?p.R????? ??? |^??-|.???p??= +j???D???~V?????X>?g???<?;;F?k?E????\?????m??o???z?????]^nVT????w?n????@????????+?t?X?? ???#?k?????????@??~K???Bh?????????+?nYW_????K3K?$??]????sT97??A??z?<????"??x?$r??y?a i?Y?#Y?%???????)???Wr??????nY???|?4?X ;i? ?>??vc\Z~?6F??b??1??6???d7??Y?9`&????|????Hw? 0??9?~mg?}?J?????x?v[0'???'{?&#hl'?(?=?^?~4?d????i?"JXw^?????[?`???`M????.?YB"}??>/??k??^@?p??/?h?$g?O??x:?(p?L???F??Kg??sL???c?C?$?????9?,? ?} +Qm?}_?)???$?\???%?????5:??????;7???n??iXn??hw?\??????dKY???_?#p]x???8??j????r?aO;??RH3Up=?, ?h??\??i????g?????????d???+u?D!?sG??vt??XjVX??nk5?? ]*z:'?==T#??>?f?x?i??6$?????!??L????%X??:??+ &x?[?o?b ??#????{!??Q?5??5 `"?B???gr?p"?}???Q???y???aI?x0T?k??\?B?+???????y?$?d?????????Z?c???`?T?(?E??i?D?V?a??z?ED??7??)?????o??oM?c??r????-Z??~?Y?mC??9??(??{?A5}?f??'(????[???vo3?V????~U???P?-?l?:Qu???,m]&[?$?IW???~????r????=g?z??J?W?7?X?rL? ???????m?)?gr?A<????};Y3P?yJ]z)??R??BL????T???$V???Se?a???^??:4???7??O??? ???j?j????u`?p???t ?~? +?oW8Umfq2?!*y???#?P +M;',5??z???dO?|??'6(?/??F?vc%??V??_????6$?;?? oJ?P??p??c?l???@:VB???I?/?\;?????????n??????OQ?YB$T,?>???[??o???[??M???0?{??Z???S?5?^?u???d?R?????-7????j???????Jrc7w^j]?mhD?????C?H????l?????&H0J?fNT?????J???{?????V^??W?D?G ???Rn?+?*k2L???v??f??@??????e?`??N???~Z?Ix???t?????&E?$???f1?f??&F `Ao_*??7?FUl??~????q?9Fcz??sl??D?????o??*??b??1-????%?/??A???????Q?"U??5??jV +??\f???r\=!:?N{??`?C?0?_c?#??f:??(?v?? K?e?D?m0?j"?U??[d2?=fa??w??xx|???5?B!?4;??)?H????W?p}?????????ex_?r????? ??i;?c???M}5}???+p?]Y!?7?FQ?ai;?z|K?@?7!?H??&?!`?gl? ?r4 ??>e?F???j$)?????z???z??i?&b?do?????d???9?F?LdVcw +$?_s???dD??????4}I????tJiN?????[L?rS5????????Eo8????l???p2?Cz??????-=???o???J!???Vs?V?E?~?5??QV??GY.?xc? ??YP???6Y?? ;\?Ct?3? K?N??E???]??z7_?????f?O??*?l? 0?$? e???b????A?? ??k??wW???3?cn??3?V?Y???:? )K???y??~??????5??r????k?????#0?$??$M'?%?a$??/X???4?J??\???|?i?W ?I&????*:????B?S??????cu%?6???tO????6 +). +?9E1?uf?1?0??&?/ ?q?v???%;?uKv[n*?3???=????? g???D?M3???-=???7C"%?5zQ????,????)w??Rn=?r??S '?P??VY?ii?????l??M!?{z??:??!???cv????J> endobj +261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [265.8608 621.0773 298.2689 632.1956] +/Subtype/Link/A<> +>> endobj +262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [258.5279 607.1296 293.8452 618.2479] +/Subtype/Link/A<> +>> endobj +263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [247.2111 483.5929 282.5284 494.5218] +/Subtype/Link/A<> +>> endobj +264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [399.6904 467.6527 432.0985 478.7709] +/Subtype/Link/A<> +>> endobj +265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [252.4315 385.959 287.7488 396.888] +/Subtype/Link/A<> +>> endobj +266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [193.9002 358.3426 226.3083 369.1819] +/Subtype/Link/A<> +>> endobj +267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [247.2111 288.3252 282.5284 299.2541] +/Subtype/Link/A<> +>> endobj +268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [337.8484 246.761 370.2565 257.6003] +/Subtype/Link/A<> +>> endobj +269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [247.2111 176.7436 282.5284 187.6725] +/Subtype/Link/A<> +>> endobj +260 0 obj << +/D [258 0 R /XYZ 74.4095 789.6651 null] +>> endobj +257 0 obj << +/Font << /F14 193 0 R /F56 126 0 R /F8 95 0 R /F44 92 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +272 0 obj << +/Length 2577 +/Filter /FlateDecode +>> +stream +x??Zmo?6??_?g\???????i?-pm.5?ph?B?????????????!?%Q+?AP?????p^r????b??zQV????|sT,.a??'? S?????]iQ???X?L?8;z??ZXf?0???? )??4????????????'|y?<{x????~?B?d?,?*?kj?|?){B,???Dx D????j????(???? +d????????W?{?&??[|?4-????J?es???\!????"k??????t?X????A?-?-;Y??,?"9???N?zO{v{p?&??s?????m?E?E??c?m?X?_?[?US[BN????Na?T????e|??u??x??>E?p?????-?h??z~???d??lY???a?S?K?y?l?_? F;f???A??KT?????*`g}i?k?? $A??rZ4!v_R`??W??|y??????????? ?I?D? +?Z^?z?b??~??E??}?\*?????(J????????5X????I[??=??qk?bs$??tx?>???_??"?U????1TV?2????o??.??Cm?e???E?LUe]? ????9LCP/?q????????nC?Qn~???l???B?~;???@ v??Cq?SwyGY ?P????/?????B?-?V)???9H??K? U??Sfc????@5?????_f ??k |??l?????? l\?Z??(?%??(K?EY ????r?(??GY*v???G?OIuN?????u?'5???otQ?bU????????}?T??w?`q +1?u??# +[????\_? ???p??5?9?~??????+,????yBv???l???v>???<????w;??0????D?h?C?;0z?hV +"d&??W?1?@?K??D@?3????t`??y?LlX??????\X?(?????s ?@/??`D???B?q? ?D?l?!???2 ??"?p=@?L?B????J???!?????zs?*[???c??s]$????:>b?@?+ $d?@?a7 T3Z&6`?????y?^*??K?t^OZ#???@&?N0????????`o??N$?M? ??'?q0j6?7?85 +?????N?Y ?G8 ?q???z?]ob??????????3?5 z?|?bn????f???<{?+????n??!)????"4Y?<#?? +???nM?&???L???????????x}L??e??cS?????x????;O?D?d?2{??W? ?wW??iv$??F8}?i26???xG???????x?????fV*?.??*]0???E ???^???????5????jF?,?? ????u?? 9"?I4Z????[Kkar?d?J?/??.\?8???U?>???????b??P?B?????t?7?B???*??1S!X??\?I?s|5???E??tm????{??7?f???RHV?r!kki??t _??#O??>?EK8??J??6?p?T3Jh7?M_???*?d?|??F?????????u? ???(* E^?~kw?Q`?]???? _Sr p?rH&?`?? e1? "??1?u?O~?????9=w?\C??r?ug??2?yI?.H?+??*????2b??dL??????s???2/h?? ??X???17??=?Z^?? ?????=?Z???> endobj +274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [442.6299 746.8856 475.038 757.7248] +/Subtype/Link/A<> +>> endobj +275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [247.2111 669.6024 282.5284 680.5313] +/Subtype/Link/A<> +>> endobj +276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [214.901 616.7703 247.3091 627.6095] +/Subtype/Link/A<> +>> endobj +278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [217.5744 555.4411 252.8916 567.3016] +/Subtype/Link/A<> +>> endobj +280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [108.8202 463.8776 141.2283 474.7169] +/Subtype/Link/A<> +>> endobj +281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [405.2133 381.0078 434.3737 392.8683] +/Subtype/Link/A<> +>> endobj +282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [322.8707 369.0527 355.2788 380.9131] +/Subtype/Link/A<> +>> endobj +273 0 obj << +/D [271 0 R /XYZ 74.4095 789.6651 null] +>> endobj +139 0 obj << +/D [271 0 R /XYZ 74.4095 611.1535 null] +>> endobj +58 0 obj << +/D [271 0 R /XYZ 74.4095 611.1535 null] +>> endobj +277 0 obj << +/D [271 0 R /XYZ 74.4095 568.1002 null] +>> endobj +140 0 obj << +/D [271 0 R /XYZ 74.4095 544.7612 null] +>> endobj +62 0 obj << +/D [271 0 R /XYZ 74.4095 544.7612 null] +>> endobj +279 0 obj << +/D [271 0 R /XYZ 74.4095 510.9338 null] +>> endobj +270 0 obj << +/Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F14 193 0 R /F51 119 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +285 0 obj << +/Length 4358 +/Filter /FlateDecode +>> +stream +x??[m?$?q??_?0d????wR?$;???????cn?wo??????N? ??Ud??{z???0??R$??b?SUl~3??~cS??7?yf??7??g?????g?h?2Lic?f??V??9c?????wo>??W??3o??ys????????????l????J?6??|?~#??x?????"????????&??H???n? ?w??? _????p???s?Z}????[?%?{|?t??o???_iSMCp?8w??@??{?????2??Q?6?!????Z2F3?u???s????td?]%??YM3?7[?%???*r???"???_??????nv?Gx?K???#?p??o?jp?s????M?8?q??{? ?[??S???O@?D?'A?????e?43?R??????w|?F??">!???r ??x_?of?[????(!??=? ???c\&???s??2?F?????@h??3??R??g?? g??|? ??n??+P??=u?BR???KS??Y!|5?8?8???k`???NaYo???n [K5z???????6????lb?[ ??[zO2D????p{O#NR_?????bXk9 Lx??-???z???R??(b?#6??????cbt??]d??>???gx??{????N??i\4??I??E???'="??E/=s???O?vT&?F??0??<(??????xm?H?yG?r ?????f??????}???N???"?Rh +?0-E?_?i???1??i""??|C????'b??9c\??yJ???Bn?:??B)??M?>:?????r???`}?A_h?q?%??83??U?|a?4????w?o???t!?????E6???Sr??Hoq??????)??????}}DU????H?R??L???g?j?)??}B??zf2zk?? ?VX?Xr??2?Pt?? ?n?$4?\\??????????` ?2O??E?*?m?Y?U?@7[ ? `7?b}u2??n0????W??Z~??TW???+?? @>?X dd???8???R?q[ x?72b?5??w?u??????????=?>@Ra?;????q.\??1??G???? F??v?cl?aA|T]R? ?`???t?????z?vq ?t???6?H? B??s?????S?????LG0?Z????4?S????#?Vq?4?????@`?K0?c +?,?^t??]D ]d????g3>? ??\\1??~[7??y??.?????glX????%?TW??? ?f?J??????????X?j?G?v?????F?iI t??Z??{Y??????]tVo???O?\???1?h?????Ii ??69?_c?`??????8yv9(? +?X?>0Uq?>'??H? 2?>#Q3$?x ??c?mNN;af??_???#1[?"?????s?y??G??`B????f p???r9A? ??m?g?c???>?.WMn ?3?? ?v?e?aBC?5~??j>n?e?? 0????"?#?v?????C??ml7?y +T?c|W{l?o?:>R? ?)#??\L?h?n?$K??*a?????K???s9?5?lK???1??nmu?8.???i??8f?]??>???4?7?8??|??6eLc???8K=8?????B?;2?:? +6??:?#Rlvd?DF=`?+?4?o?+{3Q-? b?,6?^? ??<5??Y?f4??x;?Nj?j?o???l??4?{??D?????ve?? 4??/3??'}?$???2D?X?f??-?:\??-?B?c?(S?,G|??.??Y?m?[??y?v?i??|?""???s?b$0?W]???S???#N?G???O??l???v?DH????BB??+??? +3XtbK9',(\?"?[+?+T?5f?#=K?G?S?e.'W???'fH???_??????5?eN?P?[q?Ji-??0)??^??Hd???????]6Z???u2zv +!??[?????^W?'R?3?G?+?? ??????M5N????b(????HR?K5Y!5x?\?w?v?%??_?)???????5????????#????U??~G-?? ?\?&??e????"???r?%?j???8???n?_?=??DIX ??]?d??p?I????? e???>f 3??d?TE?#?nA\??fI@?nB?-MwB?4D?^??????_J?m???55??+???Z??????_??????&???kO??????PA??n?+??&???m?n??w????K7r\PN?x8O?M ?????Q?T8?D??k8_-???3He??t?????l????i?,8??S?ZV$?o??%?u{????4.?K?F?/????X?7?_?!}??????2 jy?p2?:?nC-???RQ???j??q???TWF?u??"%|?b "??cD??C??~?????A???F0??a?y>'D!W?2(30?? ???E7??,\>???43t??]?YM!????w???#N?J?|?&m+??^0Xv*wUm??A,bj??z?$????N????m?`???G X?5 d?U?l0??5?????k?9](?p???????3?Vm?:?v???!?t~?U?Nu _*?&????v?S?UqEJ???+???r??u'???C?AC?Xp|I1e(p@?~???SzX??p1F?3?????*q??G?????a?G??!????H??a???F+~Q???|?0WO?3?w??*|b})-'??fxz?%?0??2?YN|??? ?????,?V?9???!???kI?D?????n?dw?????e?? EDW?6?i?c???2r>sS>q????;u?qL????y=?wLh??'?mE4?!N7?????/~1?0???5??endstream +endobj +284 0 obj << +/Type /Page +/Contents 285 0 R +/Resources 283 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 237 0 R +/Annots [ 287 0 R 288 0 R 289 0 R 290 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 300 0 R 302 0 R ] +>> endobj +287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [489.4544 710.7411 521.8625 721.8593] +/Subtype/Link/A<> +>> endobj +288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [300.2304 699.0649 332.6385 709.9041] +/Subtype/Link/A<> +>> endobj +289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [286.2454 687.1097 318.6535 697.949] +/Subtype/Link/A<> +>> endobj +290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [143.6789 651.2442 172.8394 662.0835] +/Subtype/Link/A<> +>> endobj +292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.307 573.1126 484.2022 583.9518] +/Subtype /Link +/A << /S /GoTo /D (other-common-types-bool) >> +>> endobj +293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [120.2376 561.1574 266.3938 571.9966] +/Subtype /Link +/A << /S /GoTo /D (other-common-types-complex) >> +>> endobj +294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [153.5984 401.4762 182.7589 412.5944] +/Subtype/Link/A<> +>> endobj +295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [241.6158 401.4762 276.9331 412.5944] +/Subtype/Link/A<> +>> endobj +296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [459.8353 401.4762 496.9558 412.5944] +/Subtype/Link/A<> +>> endobj +297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [120.2376 389.8 165.5172 400.6392] +/Subtype/Link/A<> +>> endobj +298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [186.1994 389.8 229.7456 400.6392] +/Subtype/Link/A<> +>> endobj +300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [108.1855 323.6235 137.3459 334.4627] +/Subtype/Link/A<> +>> endobj +302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [423.987 157.0286 459.3042 168.1469] +/Subtype/Link/A<> +>> endobj +286 0 obj << +/D [284 0 R /XYZ 74.4095 789.6651 null] +>> endobj +141 0 obj << +/D [284 0 R /XYZ 74.4095 652.2405 null] +>> endobj +66 0 obj << +/D [284 0 R /XYZ 74.4095 652.2405 null] +>> endobj +291 0 obj << +/D [284 0 R /XYZ 74.4095 619.8772 null] +>> endobj +142 0 obj << +/D [284 0 R /XYZ 74.4095 382.8262 null] +>> endobj +70 0 obj << +/D [284 0 R /XYZ 74.4095 382.8262 null] +>> endobj +299 0 obj << +/D [284 0 R /XYZ 74.4095 350.4628 null] +>> endobj +143 0 obj << +/D [284 0 R /XYZ 74.4095 213.0382 null] +>> endobj +74 0 obj << +/D [284 0 R /XYZ 74.4095 213.0382 null] +>> endobj +301 0 obj << +/D [284 0 R /XYZ 74.4095 169.4087 null] +>> endobj +283 0 obj << +/Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F14 193 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +305 0 obj << +/Length 2526 +/Filter /FlateDecode +>> +stream +x??ZYo?~???K +??N??~?8???]? +??M?d?ip??z??SU}L??p?0??Q]_uUu]$?j??_Y?T???u??????E{u?????F)??6nf?6?u#,s^?9*??Z??P?;~?]?=????5?Y?-R????wo???F????+?9?d???n??r{???????? +7LhXU2?`3U??JX?R?1???k??>]7J??n{? ??p??????$t-7??@?Exw ??????t?k?6O?m?????),z?W_?????????6???5?{?ao(_?????h?e?$=|N?S?_m??D>/g?,?2pC???? +B??+???Sz+j ?c:?M?>Z??S???uF????>.??????DC????"???t=;k?k%+?(??????? ??Q???c??!?g:G|??f?_???L???_nw??K???u|?d,?>&??MA?vA??A??? ?%%'?%/?J???*??|GzA/lvGP????&????????E|i>DC???$O??g?G$q1"?btT??u???????5???qX 4/{??????u?4o!?NI ??????22??CD~?????"F?b?z?Z^O)pP?w??C???lMO(v??p?9?c???EJ??Y`????h9:?q?8ME_(l ?0i?p~F?;?X???W???R+ ????????-?/?%?l?.Y???K*???d?}I$Th?O0???>??mS"? +z????????Vbpo???? +???s?????]p?F????)???&w ???5=?????5>???m??g?D?dkR? ????/? } ??2 ?:S???RF???k)??l??C???r? ?P?R???2"?b?\???^*=??,??p? +I{:???????8?E?wI?Ec? ?jj?:?u,????J??^????)h?-d?+??*f?d??\P?`???WR?O?:S9?g??1??\ Z??? ?g?????Mmi?W??Q???Z????B? ?5D?G??&%??????"[??r@???????l3??aJX??K?????V??"??+???=?}?$?fV??/??!??? +J?3?B?H??(u3*??p^?}?u4???x?k]P?_??.\??9~.????7? < =1n?=? ?????}????!P???H????D????a??.?(BY?d%???g?lh??z >??F??3e??x??~E???J???W???OD???? {?4y?}?O?)?X?=?Qt??????s?P?]??L?"t?v?awL9m?????fg???????x?(E?]??t????:?+)??? ???D????????eV*1?b?L?2x?,L???0Q?.%?]x:'&t?DU??bI????"??? +<g??W?????2??K???$?!??v7???????R?c??z?_,?!????H/???n??! a?????>???9?v????????b?????i?????????????" t???R???(??.8?6?=(??!~?)b0\??cq??}??l%?Jo_???????5?QCF?)T?1ua(?w P???q??J?+????F?????7?u ?=,Q|?@?$?jM# E??????V??N2?r}?:??_????Z8=SD +74?????NI??SU?j?Z????2??p???uN????ON??c?2?wLh;??m? +?????mN???O??T??f?> endobj +307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [132.3327 622.7909 161.4931 634.6514] +/Subtype/Link/A<> +>> endobj +308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [414.726 610.8357 450.0432 622.6962] +/Subtype/Link/A<> +>> endobj +310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [219.6728 508.2807 248.8332 520.1412] +/Subtype/Link/A<> +>> endobj +311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [268.4819 508.2807 303.7992 520.1412] +/Subtype/Link/A<> +>> endobj +312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [390.3215 508.2807 419.4819 520.1412] +/Subtype/Link/A<> +>> endobj +313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 496.3255 108.7305 508.186] +/Subtype/Link/A<> +>> endobj +314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 484.9283 100.1426 495.7676] +/Subtype/Link/A<> +>> endobj +318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [324.6699 428.3346 360.0704 438.2891] +/Subtype/Link/A<> +>> endobj +319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [382.9052 428.3346 454.0182 438.2891] +/Subtype/Link/A<> +>> endobj +306 0 obj << +/D [304 0 R /XYZ 74.4095 789.6651 null] +>> endobj +144 0 obj << +/D [304 0 R /XYZ 74.4095 564.5693 null] +>> endobj +78 0 obj << +/D [304 0 R /XYZ 74.4095 564.5693 null] +>> endobj +309 0 obj << +/D [304 0 R /XYZ 74.4095 520.9398 null] +>> endobj +303 0 obj << +/Font << /F14 193 0 R /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F67 317 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +316 0 obj << +/Length1 1213 +/Length2 5760 +/Length3 532 +/Length 6525 +/Filter /FlateDecode +>> +stream +x???g\?k??? ??{I@????tP???????AAD??;D:z?M:??.?{D??9????????i?|?f?k?{?~??3T?G?A5n(AQ!QY???? @TH???K ?`750 +* ??(? ???????? )@????9:?P{= +?p?=???n??4??_???M???????_)=0? e?????????/?? ?X????b ?????G+u7?????0 ?%?? ,I?E07{????+,??@a`Gp@ I?\??@???? ??g?_!I??;vI?_!i?????#????@??+/!?e'$?? +l#O??o}$??n??E?] 8?W?$?D?a?j?????IZ l??????E???? +?V??a???DE???? ???! ??b??~C?0?7?*??BQ???o?UF??X???????????~C?y???? ??b?}???~CUT>??b2Av?"b?) ???RA#?P7?_/?????`?? +??BHg&?P????? ???B>\??X??c?d???p?}?IN???S?JH???2????n&??v?ug?;?t??!?N????O?Yu??L?&u???A?m???Mf?K.I???U1~'???7"?????!????5??1?z&[c?)?}@'????|??%??&?1???Wt???\?,?d??? >??YU?c'y??U1??0K????F@?\C???d?? ???????.K???5?"???d??S?/???g +(?Jq?3???:???4???? d??m>t?????????b??dh?i??$^??????|??u?D2{?? :?M???????]?#w?H?,8|?? !?S?]?US???[?f?U??T21??J2'Q???'????L????f??f?????7??T????[Wqr ??M\P????? +????+(0 B??_?Z?` ????[?II ? + +???9a?s??ts?K????A.??Owk=???h??Q??????-?5??\?{@n??IZ ??M??7??j??WL????~k?=??v???x??W?$Yy?????i?xX?S??"\A?E????'R? ?3???hF?n?qW???-?I[??:P????(F??????V???g???vv??r???p?#??4 ???C?.??Y?%???Z=?Z#?)?XMn??3?-????????1z?????_?????????T??0X ??7R=0?t????}?q ?]k?D??0qz??0?????{"??)?p?;~????>=d?\?|?Yt??h$????#xD? ????NL?)?A?M?l???dn???E?_,?????D? z??????pZW??A`????O)Q???????wr??;1?{??q>????}?????{w??S +$?N?;???@??R?o???z,???K,X ?w?Y??63???@!??U?? `)+Y???0? ??R'????E?f5e4) +JL??O/????????t4EM???>~2w;??????I?5A??^p??`q???Ad????4?w?????"x? ?M yKW??D??U?2?+ M&????E???%???>?+f?U??????.??$?CQ@?? +k??,?4??? ?>a.Gh?w????&n +??.Z????k??,????9???zK~?? +?[???g?<+?3???$??S:??.?b?%5Y???W????2??{???1??x a???{V ?.??g??,zn?tv???? ?b?b?y???`?]x7????1 ?I?b?e2 8?:?????????;?1Nj??R????LY?lNF??m???A?y?"C?*???~ ?^??y????????4????????)?48dc .?/?eBO??R?$Y????Az?"m????Dd-2f8c?>??)???\? ???R???????? @l???6?_?[;?^:|???+??IL??S???????,??g]??>???_?O???W? $Z3e??nK?t?3??\????2??j?I??? ]? +?P??????1???[?Q5? ?????1?5][????}???e???? ????f??.???>?????e???iH??3+??????7!/??h?%??"'??k5X??ki?SU_?$a??ka?L?-?????????vK?~???\iS??.???8??? ]??H?P^?p ???A??% ?? +???%&?d?t?#?WFo???????????/?k;?~??;/e???+?B?????s? \L??6??>???p?cs4mZ<[??.?3?TW??I?? ??'??9??$??_??????V????nV?[?d0????G?????J[?? h?]???f?O&????{+??V? ?M??+S????fyvmA?i??"??+?'6T??A 9?(v???m?r????q3:?i?? ?? ?lr??3??+?g?@?$??,?Dq??j??\?}?U?^??f>??I???+???d??j^?;??8??#K????? }?QS???e?{?b?H'??^??S???L?YZ\??>?i????=-???hs???+???S Lx??W??F?????d?Yv??\'? +?CoS?{i???2}P?p?B???{??0(T??&=b?zwLl?Y>dW'P?L?&"??aP ???Ka?},u??L?3\ ?????\??????4c;?0A??9w7??B?? ???;w??6?]d???>Y?wrf;?8?\#????W?}????]#?? +g??i?~???[?Ig/????????:N ??t9??IyRktZ?f}?_2AK?a?y??#?????q ????N?L???vA???? F??g???????3???&??? ?,????Tm{?O??????????!?c??B[k??x%?T??^Q?O ???r??8d?'???I???V?Q[f?3?SK????6??????????.???)Z??U??YW?? Q?asQ???J?3???xD +&@#?V?a????????Y???l???>>?1?3?n-?pId???|???????Q?>??? ???Zj?{????I??H??DI';??r?"#??0?"n?jX??S????~?+??,???B? ??f?6pszV???j???_?l?G???YL?cy????C?Y?m&??????Ilz?%3???C?}? ???"????e+?#?????{_?t2?3M>?[??????%&a?#??????;???Y#G???Z??Bd??F?V6??kMe????U??U|{??I???l]??1??}De????x?{C?????i???*:)F g??y?{??I?????]??_????0?V??kj??O??J??|?G?NObq5??w?N???????}??c?X?w?'?t4???~?????Q????99k??? [?Z?F?????? )??w?iW][??S8?J2{???????? ???????? `b??\z???&L??f?.??$?l???d???????G3i^ E?{y?th????E??0????q,???????????{??[@?8-6]??n???U???????.oV??????e???%_??????6}? ????9?YwF.sqa^0??{?Y??H???d????????[U?? ?=?g????p???u??U?b$?t????????T????>?? ?L??6???SO> endobj +315 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /TMVDMX+CMR9 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/FontBBox [-39 -250 1036 750] +/Flags 4 +/CharSet (/hyphen/period/zero/one/two/three/seven/nine/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) +/FontFile 316 0 R +>> endobj +321 0 obj +[343 285 0 514 514 514 514 0 0 0 514 0 514 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] +endobj +320 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 55/seven 56/.notdef 57/nine/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] +>> endobj +192 0 obj << +/Length1 750 +/Length2 576 +/Length3 532 +/Length 1110 +/Filter /FlateDecode +>> +stream +x?SU ?uL?OJu??+?5?3?Rp? ?44P0?3?RUu.JM,???sI,I?R0??4Tp,MW04U00?22?25?RUp?/?,?L?(Q?p?)2Wp?M-?LN?S?M,?H??????????ZR???????Q??Z?ZT????eh????\????????r?g^Z??9D8??&U?ZT t????? +@'????T*???q????J???B7??4'?/1d<8?0?s3s*?*?s JKR?|?SR??????B????Y??.?Y???????????kh?g`l +??,v??HM ?,I?PHK?)N?????;|`????GEhC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` +?L? 2?RR+R+?.????/jQM?BZ~(Z??I? ??% q.L?89?WT?Y*?Z? 644S077?EQ?\ZT??WN+?????2?A??Z???u?Z~?uK??mm+?\_X????????7?D?????Rl:/P1?d????????(??l=U?h?d?_O??E?k?v-X1??t???`????i????_y. ?1?????????:?un~Q???3/??S??}??]?? +???$e~s?]F1????/??Q???m????|<?????/??q'}I???+6???E??g???xT.??G??gt???v??G??U|?????~??]?R????_k?9???:?{?p??G?? ??d}dN<6??-uB?o?H??=c?M?vH??z?q?a???RK?~,K???}????????m??????yo??~?????v? +?_????s>???.#????????{?/?????k????\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,???r?endstream +endobj +193 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 322 0 R +/FirstChar 15 +/LastChar 15 +/Widths 323 0 R +/BaseFont /QEOZRX+CMSY10 +/FontDescriptor 191 0 R +>> endobj +191 0 obj << +/Ascent 750 +/CapHeight 683 +/Descent -194 +/FontName /QEOZRX+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/XHeight 431 +/FontBBox [-29 -960 1116 775] +/Flags 4 +/CharSet (/bullet) +/FontFile 192 0 R +>> endobj +323 0 obj +[500 ] +endobj +322 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 15/bullet 16/.notdef] +>> endobj +153 0 obj << +/Length1 884 +/Length2 3123 +/Length3 532 +/Length 3745 +/Filter /FlateDecode +>> +stream +x???WXS???)?E)K??iH??J??7U ? +??@])RA:(????*?("]?&A?l at B?p???o{=??>?????o??????S??????j??(?T????H??!?ii4?P$?y T??? +?6?@??5??R " ?I?~d??8?>?C? ?s?,?b(N?=? +??????????Vx??'H?q0 ?X +?:??O?D< P?+??r?{?${?M?~?<?M?HDW??!p#}7??????????\]?0n???????c??~?R????( 0$?@2?w??_? A????Y] +???=Gtt(R?P?+N??&??8c??1????8H????^??>?6f&???????????b????????D&??z??t!??{d??fZD, G : +(%C&c? ?CD'?D? ??t?p?D?/????Id????[???$$?q? ????I?? ?8???!?? *p?/H{??J?? ?mx??/??&?7?T: @P???U%?k?K??"?A"??y?w?o??MA_ ????????7?\????g9?)????*?,U63?~??\?a?-???9??&?????????sW??a?|?\???????3v????????9Iw????\?~?Rh0?T~(<????????.??#T???D??~?A"h95??I?@?&Q5?K[??? +????2???z??!so??mv?q_?h;y?E?j????WT6?s???g??o?????Q?+??????s???f???4?5/????w?X?A?.bc?vAh??????4?j?? a?j?55c??a???.???7or??,>(g????;hA-\???????t?6?W-"$?uQ???F2??'?B(???#]O?{@D?%s2?j.?$?r???pc?c?#|?^??e?????????u??CX??????b??'?g??uL??>&?&????NQ?4d?*W&?t?\?gZ??kx??C8?N???2?Cf?LX?1?C? +???} ?6?U???K????c????)Aiw???? er???????rf?G???QM???=?5?0.z} ?[? +???? +?uwEM??TN}?Y??wI?*????l+?O?C7%H?:???,???/?7?g?#?Pc?? ?_]?l?0??}?<j????b=_??/??u??(??F??J&B[w?\>?????JI=8]????9q 5Z??fZ????!?Uu?p(-???In~?*?*|]?????D":???&?)??.????k?????|?O|??S??Y+? )]??{9y?72????N ????????~???V???u?????m9??#%????E^*?`[????f*?ny.!_a?!&:0H?^???m?I?X_??<2*???mN?B?&????jm???;?jAuOc??iN???,\_??FV??N:-]???+??'?C?c?as???rU ?8??}??(??k?"+L?L??P?h?R???et?x????4?????J5??????????91??H#????_"}?:????l?G????j?~|?c|?;?????6UA?6??{?6???% +f??]???m???????B?:S1z???O??????_39YR:?l????gfF?w?!?*??x?o?h?t?P?*>y???+???????%y>?%?B|W?????I?l??}?6>?e!?w??'??o???$?? ???Z???W???:????V?r?i??9>?/k?F??s?P?1F????,l?[m???$g??6? 6????????3?OKB>????G??? MY/A???Q:??l?Wdd?0w??W&??m???]=e?QQ1??_??%??Uv???=,?:(?? U?H??????_To?M???4?iVr_Y?zf3?h???v?.???b???+?? ai??[??%???cPS???y????cS????W???j?21qJ??&??P??vT39h?Q?'??y!4?Rkh?g?????v??b?tt??$u?v?S??????w?cL0n1A?/??5?E?V?R?Q?1?=2H??j)7?8{$?I,Y:4?d????b??*i xqNl?<:\H?%:?Oz????iZ???"?c?????.?r???r??1?;??Nl? ?#u9????????'????bk +kqH??`???`G????????????u??nv?L-f7???????FRv|7???v?8?nf?h? l5??(?*??ylM?i?q?9?.ncV??S????[??f?}?^???EW??n?????6?????e?g?`??U??*v%?bi6?W??To?????c? + vWSD ?{??) |)?????X?^ *?}>d??6X?M??J?????!\%???}%#Q?v????'E?(?????T?e???H?Qf?????s?x???kW?????'???b??k?pIN????L=?????57?/?5c??h+>?K!;?*??%?1x???i???P??????6 "%??????????#???#?x6Wp??N}???U?$??j??4? ;???$?};? ??{?????}\>?s2?m?Vb??%??"??r???>?M???? +b??????)? endstream +endobj +154 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 324 0 R +/FirstChar 97 +/LastChar 117 +/Widths 325 0 R +/BaseFont /ZSQYKA+CMTI10 +/FontDescriptor 152 0 R +>> endobj +152 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /ZSQYKA+CMTI10 +/ItalicAngle -14.04 +/StemV 68 +/XHeight 431 +/FontBBox [-163 -250 1146 969] +/Flags 4 +/CharSet (/a/d/e/g/i/n/r/s/t/u) +/FontFile 153 0 R +>> endobj +325 0 obj +[511 0 0 511 460 0 460 0 307 0 0 0 0 562 0 0 0 422 409 332 537 ] +endobj +324 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 97/a 98/.notdef 100/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 110/n 111/.notdef 114/r/s/t/u 118/.notdef] +>> endobj +125 0 obj << +/Length1 2040 +/Length2 13177 +/Length3 532 +/Length 14314 +/Filter /FlateDecode +>> +stream +x???UX???p $?Cpk??????6??????%w??\?k??????s??sh.???9j????&'VR?6?7J????330?D?????? LL"p???N@#K{;1# ???? ??`?03????~?????N??.*Q?&q?m?N?&Fvy# ?-h #????%??? lcP?? g? +???4e?cf?Z??????vp??8I???8?+l????Cn@'g???_????????'?h??`????????p??Q0??g?U??7?????????.@'???)???O???? bx3,?L??H??????T_?????ee0??m?l???W? ???j?45??d0?????ys??a????????'???d?s??0????F?j?O?? 4?? hg4?3??????uv?f-? ?????? H??????O?i??`?????/!K??2??m??-?D@?^@'??n??????uq?3??t?p?5dhf???????Y??5?? ???$? t???CF????jg????{????!??????(H??j??? A?.?G?????C????W??r???8A???C????U??j"??@???(???S?C?|??&.P>??????@T???j?[??????@?5?(?????#c'#k???Un?????r???????M????t2?9????!PF?3h?????? ?9k!???/m??/?X???m[?? ?????.`][?v!H??/i8?? ??????s??B???_*??_?r? AV??d????? ??y???\qnk?"Y?x0?r??@?JL?z??O???/+??SK"?F=.??????8??/?&j??n??~?g??j{]?'???.?1?$???? ???t????3??jyk?_??B?X??o???/???:?i????^??S??M(??X?3??A-f?q??~??M???b} +?H:>2?????"?oh?XozN`?Q??>?/?;??_S??????b??QM????X? +?Z!?l?P???|?t??M?+>?E?$6???-??e?k???WT???????e????4O??H??????#??????OV???a??????T??;D???v??5???6? k???;???N??;?v?n?????4C???RM/"????X+???X#d????S????J" ?????#J???V?4h???V?/g8?w??R5?~?;Vg?L'?A??yl?????d?]&Cd?T Zc?(?s??kM?"??L]? ???????? ???T??D?_\:$Xi??;?^W'?? ?,q???L?~????$+?? us?UI?>?????!?m??:zV?]3???|????OnR?P???rr4???'??%?M???????d?B???????????uE,#???;?Sx?^?{??[?:o???>??T6??3?Re??D???'?(V?-&z?Z?y&?05/tW??G???r'??????&"??r?r?N??=X? ??:??>m????o?r????????*cS??&(+??E?!? +??yZ?K?J?M????q??K?6??~H?@????~?U???x}Z??DjV0??QE~s?A?Xw?????? ??{? t????T?B?%??} +U??????????C/?RG? qG?q#?{0?wu?=?\? F???Hk?:????0[??IFK(??[L??t????&?:M5? ??? +&??n}T?H.,???I?/G5 ??1?#z????*Y3?"??Hd?O?YP?k,? ????f??Z;?? |?q?F??|???????'?H??tJ9^?S???T'|n?????}/?/4-"?Q??U?t???**c???!?+?? ru??????Ney???%$R??$???Y&0?t?????? ??l??~'R?R?e44??qdU????0o?B???er????d>??#????D???q?????6??X???"[VJ?#Zxk????U??????????O?V??*????I?Y????????vLs?i~???hp????i.???6????Dbl???4??V????5?S?????????y? ?|?t??uHb9??0???M!?V??Y_? ??? Eb??/?r??c???pe?D??Q?4?E\??_3? ????Q?N +?j,a??H?????????????n1?p?'????1?'????h??K?^? ?I???&?5|?]9??P????r????(t??*????/?q??N??D?9F?X0@???8?D???P{?sD??/??'m;??+/[}??????rrd?Xx?x???k,????????Rs?H???;???VUk`>??x??C?$?{b?ld??E??H?K{9?qFV?y??? _???????ue *~?_??T?n????? +N?'?n+??#a?Ef?? ??u5??? (?b?????g??h!?(?*#??1m?q??g[??/?Xx\*???ZwK?#?)X;E??}?????Fo???D??o.d?[??~:??R?q?"?z-?????}?? ?C2Cr?"?????;o??E?g?VEY?*???+?? ?????J2?? ??a?k??????q??g?(??ww???V?c}?MA ???I??o;???V???'?Y9?85)????i @~z??4????p?;?s8?W????4?S??E~???w(??I?Yw?}??B$A?%z??2?_??H?? ;c??t>??H?uY ?F??9?2f;? ?1?? '??(?(K|??F???e? ,???T?e]K??]?o??~?6G??(?_5?C<5?eB]??!????R=??xF3N[?i?aJ?y?!??d?L ??1???f???????`}?Q?+??F??qa?<5???2?? ?3?8`?)v???r???4?#9??}?`V??&I!c~?n??!??bB?A????~)???????????7L??R`??M??0???W????s? 0?PS?(m;??K`A????E???>5?s?C???,b?)]F?o????X?s?Q?4?#?v??!???G?}????m?2i?X???J]?>tKz[u?? +?????^????Uq?I0? H ?#??P?M??w???????o?a??????s?w???j1?& ??]?c????'?Ze?+2F??l?W?g9???b????6??B?b??? c??#?VG:f?p?????a^?&A?????????????[?1?Re?gCu???/??r???Zs??QNJE?J?-Q??Bzw(y'U?FTd????a?]??!?G??????@?Z?&??? ?Q?O??v\p?+??|???ep?{z?E??_PM6??>??????v?>c????r?8%;q??$??w??L???*?? ??b??3\????V???sn??&?1??(???KA$?GF?\KL????< ?U??J?aM?Z?@+#?#?8???D????C???4I/???5???@d$o?q? ??[???_+?????,Zl?H7;?t???G{?9?2??=?s?}'>?3|??)>O?xD?j?????~??2?W?T???p5?]U?bVH???????z]g??E?65 +k???0$?q????????Je??K??E0???????n~ +]BmW???BE?p??x?^cc??TEt???6 ?)31Qp?-B??Z???B +\?cTE?????????????G??^BE??'???????'?????Re?d??A8??7?y?E??U?#5!?.? ??????/}f??\I l????.??]?o4A????o?~b??? 2?[1.???? Q????????a??I? +HR\??S?x/d1 :6????????6Rn?b???)Pc?UN}?????P?+l?)??????`?HQVT?Ye ?c?,??h6~?????l^?uAR???{????C???= W??*?P?-?? Bp?mN~???U?{t???!k??zes???&L???????M??f?,d?+??o?Z???T? ?9???x?????Z???#?O2-3Ch????8 ???ic?C????yl?l?A???M?l?|?*?o ??F?K??`?? +?J ?????z?K??=???????5?;a???i0???tf? ??'???9?????? +g?;??????+?z?{O??,???"??]??k?~?o?|? C'>?X???????j?B!?6???????Gu??????b?5??????LX?>G?V?q??,?? +???????p???y??|?`?nl?8??<>M}?????X??T?\?|??2C?:?J???????????ym?WO????Q?WJE???????j?1a;??o?Z???t??6u?3?+??=?.7;????&?;????Lg??????hk??V?7c??#?c?????K$8?N???6???W?z?? ????r?K%??rl???\??1???jB??NN?/n?bSt???? 0?RR+|?^g4???4?+?? ?~9???????MM j?????????9v??yH{???:????^??~%??wN????????????4??'??y???c??????l??F? o?Rrt? ??5?F??{??.? 5/?n]a???9?r?P????4k?I??????0?H???t??????~?7????K}LS???H??H??F?] ??A~?)?*?mU?r??P@ +???b?]????)e!zl?p?I/??%`G??t??C??????v4}?????M%.???Z ??b?/6)??????aL??X????????S??6?b?A? e_d?&SV%??`???NA6? ?-??EY?????/b? ???,?J? ?????A??Q?Ik8??T.?{pLU? ?g3?J?b??|i??M?Q???;??%1??ZR_???=1pM??#??O?j?????`Gk?Z?I:h??c?1c???]???R?Ve???Y?R)??+=???.??????;?>c??g&?v?G?OI????bf??aI/??????? ?4[?? ??x??? O?}X????@?aw?k&? 4;?L????wx?V?s{????Y'?G?????]?k?: +?([?d? ~?@gF?t??6_>n?4?x?'?????GJ?WLQgug ?[?V???kx*???? xjn$8?????????}???? d 2bI/?????Y*?s!??-?$K ????p?as?c?g?c????w)??g?H? +??3 ?'d?S i??p???"???????`gg=?,???:?cQ?????vL|????M?\?t-??aZ!??e? 2??^??!??WJ????? 9?6Xz%?!??sH???????t?OHb???$`?w??W!????qP?&m?_n?Y>?K?U??J????w??s{`)??Q?A_)?HLU?`_d1r??O????#???-??=?~?+@?@?b????!sl(u1?>"V;V?j?(?k??p???? a(???i??U??&?,Z?6.?-??JP?h{???}'????B???;tx?????fo3? ??r???i_?U???n_R +???^?;~??bN,?Q_w?????? ? ????"7*oN??1???+?OX?K????Rc??3???~??q????uN-??w????#I?? ???wo$???mI?Q?%Cwy]?????j??k#???F???^?9????;L8?zHA??k?C??{huGApjMl;?? ?]??????e?.?M????????????????Ys?Y7,?AF??5X` ???:?t??lR???$?Wt[$?B,?B??t?(???QcxX?.????@???'_? ??M8X??=^???:ja?}???-.??IM?%?????R?_4?E?,??C??i???v??D-??????Ir?O ??TF)>zD.~???????\)t?B!@?G\G??3??9???.Id??? +`???????d?Q )? ???????ouX??;????=??f?? +9????????? + ???U??f?B'???S?)???{???0??(?r>i?!?N>,???H^?2???????y?<)??\??5?{?+? ????????m? ??w?3H?)? ??%w??????^??uW?? ???*?o?? ??????dV?.[,??b???J??44?`o? +?8?e??????y?O9* c6?vaKV?$o?z?t?1x??v?3?x? 0?C?????,????:b? +?????Cu?:1?H?????1an??A?*>$g)M9?n?'f???6 at O8n H0>SAF?\v^|(a??3?? ?????F????c????*|??R?? ??lO? ge??fv?j?+0??qY??fZ?????7?? m???ii??WM4??,?%=?-?~?E??f?G?wM7???|???y???^A?\????y?Ozc?;??j?????? ???????'il%????w???-J??s??f?w?.'fa?%???B)?w??q?/??9z?M????b?$*?g????'?*={P???>S?Da?0?P???????|?N?I??????^?,Gf??+Ub?N ???X`??*?{?~9???N+???????4#?>?.?hY?Jh[~+?5!Y@????["?o3R??#?*???eyF?W? x??o5?2???,????ZO???Ke?O????????d?R?e?*??????,?h??KC? "??:??*?]e??h/?:?j?????? +???k???iL20?d_Y?C9??f????????NG?T?K?XC??(???J???&?M?9????+A? +Z?????mY???????=?t?}tV1 ??b}???1???p??x???M ????o??????$??W+?c???8??Yo(s(??*+E?] +??????/?I=?M? ??0+?????w????????????;???b??jM?A??y bD???l_??y?)E?+"?ZE????MssI{n??[???????????~3????F??l????v????Zn?lu?x$??V4???^?tK?_?:9'i\!???K+7?8????8?5'Y?d9?o? q????lS?9E? ?I???pj?)??{??????????m6P/??I????;?~?}S0?o?G?fRy???-'?? X??o?-7??aP??>??'.%??*??I??? ?%?I?~?z&A?a?^*?S?????[?E?D6E????c???~k+??CVv7?aP?E??i??K?????|#(]??0?6,oTL????;??V???_?%?%?5x??3 +??? +bC?u??!t??/?rN??v????'f?N?'?`??????? 4]???}?& +-o??#V!??????pf?1j?a??.I????Q????P]? .W"?*23??????9????.~0??? ?Dd?m??IN?/????ml???C???,L9>)?Y???"?J5UE? ##??[V3(??2 N#?XY???-`]?B%[$0zm?]5h *A????????{???U%??a5???t???????%???W??????F@$6?dy?5?il???~?1bV?DM,t?`??,??-???????Xg?@=?X?~??Y??V??^??MiC?d`?M???J/?\es? +j+?z??i??Z4?UJ ???6??@[?? H???{{????H???? f?K????{??,?h?]??J?????dE!?Hn?8??j?O?Bf)H?)=???:H??????^,??????[F??N&??fQIa ?c +Vz????????9s??[?????C?? ??\??3`?7%?f?am??R8?U_???"???x`{GKXO?51??*?K???b?Y???1Bo? ?!72????j5t~?$?N?*???? ?k?L +????& H?s????t 6-k??tGGf???.3/(?~???d??ay?(????????l????|g5j$y ???>7p????????Oo???j2??JrW??f?????m"?m-?? ???n??tR??????%?"I???|'h??if(????6?C?p???}?*???c????????`?5??l?>?%????'kY +"????7,?`???J??I[}v???V???H/^Z??sZd??H???????c4??gM?P??!J???9I[I????????j?????????M?Or?V???M??w??!I?5P?z???4?n?!9???gNZ?c?a,??????`9|?[??:?=???d???? ?? ?&k???=t????RR?E6 UI?Z?16 ?bN2G1?^?X?]??&? ?Z??i; :???8p???8O?%??M??Y??????_?? ????\?m??????j??endstream +endobj +126 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 326 0 R +/FirstChar 33 +/LastChar 125 +/Widths 327 0 R +/BaseFont /ZVFNGF+CMTT10 +/FontDescriptor 124 0 R +>> endobj +124 0 obj << +/Ascent 611 +/CapHeight 611 +/Descent -222 +/FontName /ZVFNGF+CMTT10 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/FontBBox [-4 -235 731 800] +/Flags 4 +/CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) +/FontFile 125 0 R +>> endobj +327 0 obj +[525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 0 525 525 525 525 525 525 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] +endobj +326 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand 39/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal/greater 63/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 126/.notdef] +>> endobj +118 0 obj << +/Length1 1316 +/Length2 6869 +/Length3 532 +/Length 7667 +/Filter /FlateDecode +>> +stream +x???e\????A???????A???s?.?????A$?AE?????g??|?u???~k??&:?W?N?P9'G7nNna????7??? ??I??89?????n!!n????? ??/? ?a2????a6V?ni????P? ?P?YC??=?????? ???h?5?? u??^7\?W ?????5B?a0????7 ?0??-m?G +??B0?'? "?m???d ???!JY5&?~?m? +?z?h_???M???":m?????????Vk3? ???O????E???/?????d`3p3?????d?2>??U +?N?????|K??X??e+??&???^?q|=?Cq????`??Th/&??uQ????????,A?]??r?d|U?e?5????d???/?E?i?b?,???m???????8\?????Y???x?????t??69?- {'_|??}6$???p?!?N?h?????h?S??X5KUk(DI5+??????Z??v?{?.??/oq!?g+k?????;?r2??YgU:?+??-?r?%? ?A??hb??????q????i,P^?b;???.??????^??fl%???`?X?\?{?+?????;??????KW:}R?????????d?? +??nZ????_???N??8j????82?????p?q?????????-???mY? ?q?? kp!? ?a??s?du?Io??`????x?0????E?_?d????? +?Y"??v?b_'??-kN??nb1R??!?????F???E?H?ve???G? ??g?Ua_?T?/??"?b???w???KO????x?_?????y?? r??????f??Ju,??????nm?}J??5o?]?*???Z?y???k???/%?????]?S????q???7??+??*???Z???~???y?,{???e??"???=?*?Y?????? 2*?`^???>???????V?wa????????w?Q??)??$????????#?8yj?i?1??\??)? +? ?????DJY???<2F +\E?-|o?4?%??F?X???| n?o???#? ?*P????% 7Pc???g?v??m??(??L?? >???87w +1??WW??B?T'q????,??_e?{W??%?1???????+*x??LF??? +?k?5`?;OB??@?Fm68D?b?Y}?)??YN????K?@O{???2$?2?6)????? )??]?>*O??.???V????????Og?????nA??????u?P??o???#=???h??r8eR??z??9?f?#??KXwO?Rh?!+???w"?g???d????=/89?hh?LP[???$???$ 1E??/?;?w+?_???%p????Cd?xhB??8??@P?U+??????GG???-??U?={?JC????x6?S ??z?K.??G.?@i????2=???_j??{?]?6???????~????h??1???@z +?Q??c |=w?5?? ????JZJ? ?p??''?N}?s??}??v?????<4s??2;??}?g?????+?l?]??,???%?=?[d?2b??L:??gl?:?|???i?CdA?????/4????}?Y?I+??$x at AJ?{???UrfM?????!?\C?><%[???QcZ???6?3G?@W?B?a??!{U????H:?????M'/%HR???p????WO?eb?r?>uu??C + jU?U???9??y]??K[???\??? \? +d???9? ??7?h??X????F ?mL ?[?a?????+?????hI?Qi??11??G???U???=e???z?0?UWe??(uD@???K?,D\????!f/?;?????I???>? +\s#.W??A??i???u???I????o?b??c0lX???????{??%K??x??n???4? ?F6???h??r0???Td?hT???:Y????{m??????$C??Dq?B??? ??~??n?????\?zP???2?[?aq???????2)???>?+????qoNe??GJ 2)Bjl??K)???`?? ?-???(?}K??(?r/??x?? ???w??? ?????~X 0???/_x? ???? ????>F$L?r C[?:?? .>9???m?? A??u??\36????t^i??--????r?e,?_?6^ir??X{[F/?B??? B??????g??m ???(m???,S+#?W??T1?a?[??;??]?h??????j%o`X?? +?,)????? v??? Y??*??/?Dyy??'s&? +?A????F??t??9?C????nN??&????????# I?ixsX???!????_ at Q9sMb??????D[]???a???? [\O}?????/7??ut?/J?zvft???'B1.?Md=???????????[??U??S+??O??4? +1??????????1???????E9?q?B??O?%??t???????U$?ba.?`K???R????do????4m~`?????v[?\??????Q???O"i?&?? +kG?????xS?qB ??|? +a??A!??xL?E?q??2??d??Y???K???S?K???{ _???k ??|???F?&?oiQ?*Q?!??????h ;??4??a?zr?X?@???e??l??c??[?????fY??0-??A(????????.?h1?gH??????Ow?+?qK}??zw?ap%E??4?x????$z????M???3 ?I?????????5????X??E"?iz?SV?5&7B???^2?U?!?+?$??Z?7i??j?1h%?}??????^?a?}? ??"P#??~??a?y?|u?? +?!???6?.? ?sU(2??R}w????$$?/?n?????)H??q????Yo??xL?????NP A??xY??+^:?????-=?R??-c?|G?????>?[y? ??????????????^?????y$ ??Gb#?|%L????iq?^????G"?hZ? +??n???#?Nv?[?"c.x?{?????????????I2?AW??O?/m:?????hq?jG2&??J???o ?!u?C?/?????u?????'??????+??t????N&?M????????[? +L,Q?? +>?r$'?*???X??P?A??? ???dF??????,?eb?5???|lF?n????i?7????G"(??l?:??y6v?;???? ?NN?'a? +? ???L?S??????zN????/.0???rT????? ?NR??l?(:(??0d??-G??????K?????O?'?????=?G?B? +`?? ?bU5\??%9 ~n???a9?|?97????=?TyC??9+3????U?d?w8i??H?????G?V ??+AW\?p1? 7??jF???N??2??????w?E|oB?????2#?n~?3)??QK???q?#P?Y?ln???z??4?EB??J??:Wn??????H??D?&???????? ?(??C??K?'????@?L?s? =_?3?l??lN?OpZgb???/?a?Q??_??*#%%n=??O?2~7???Y??????;???j??7???????2?H??[[??\??G??.??/???q)?J??Pg???|????H? ??#p?pY?Z?#!??;?A?T??r?n?????#??^E?7??r?O;*!(A?P?K9?????u?yH?+]???????05????O(?? Q??v1?n?YI??[??d2?????W=???h%?r?Ec?Q.??p????~????n????????Rs?6??z?b???H?E???????oQSK?>f?X??#  ??????????bSe?2?\L4 ?,?{???BT?C???9??`{6M???4> +?PN???????? r??!Z[??y?;?-S?U6S??]a?????/??-"??q +???$> $?????"??~??sE?? ??9D????qg?jk??,??????W\0Y????t???!??"e?w?J)??.?,?)???j?^q?u??i????@RT??Vde???z?N?m?R?????Yb v?^m?n/ >?Y?2??p??pmm?>&???????????'??????????y ????q????z????L> endobj +117 0 obj << +/Ascent 694 +/CapHeight 686 +/Descent -194 +/FontName /VNZSRA+CMBX12 +/ItalicAngle 0 +/StemV 109 +/XHeight 444 +/FontBBox [-53 -251 1139 750] +/Flags 4 +/CharSet (/hyphen/period/colon/A/B/C/E/F/H/I/M/N/O/P/R/S/T/U/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) +/FontFile 118 0 R +>> endobj +329 0 obj +[375 312 0 0 0 0 0 0 0 0 0 0 0 312 0 0 0 0 0 0 850 800 812 0 738 707 0 880 419 0 0 0 1067 880 845 769 0 839 625 782 865 0 0 0 0 0 0 0 0 0 0 0 547 625 500 625 513 0 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 594 594 ] +endobj +328 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 58/colon 59/.notdef 65/A/B/C 68/.notdef 69/E/F 71/.notdef 72/H/I 74/.notdef 77/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] +>> endobj +94 0 obj << +/Length1 1823 +/Length2 13445 +/Length3 532 +/Length 14470 +/Filter /FlateDecode +>> +stream +x???eT\????[?{???]????qw??????? ??$Xpr???|;9??????f0??5W????UtS?*?1????%?A.??L?|1UV+ ?(%??????$n??????$?&?7?_>N>N6$J????????? ?F???$n??????P0v????05????Z]?j{???'????x?7?????C?r?i?????I!z??z??sqkK??j???Q?????8??s?m??}???? +??Ch?_???p?x?G?Ix?????n?A???K??z$tVR??Z?{`?Z8`??8?]EP? ?? ???? a8?wR"\?????C?????`?h??????@v???g|?}E ?#???) ??7?C.??b;??5?%7FS?V????Ww0-}???6C???????????i"?E?HV{hO???/~J&?P??O?p????Tq???c??vDc=????u???U?^f??|?)16??aL7?U?+??D????y|??4'????B? }?m?????? +?EQ??????.???C?f?????D??w??N]??c ?N?|y?7 ????Z??M?|??? ?8q????l??qU1??%v??`?'e?[??q?-?O?v?P? ???vE??^???C?TY???p'^?a??l????????7???4%??????|H}y??tlY?MTn;??j???H???H???????=!/?Y ????B??s?9?{??? ??')?~???b???i?? ??????Y?Z???7???pn???>K??????A?6K?q?0E??????T?oC8e?y?? ??????p?]D??+? g????'iP?????=at??G??q |r??[????/???_????Y??J??rto7?C??Q?o??m??S?E?R?????=> +6??N\?????w?Q??Cm*??`8f??_?F?/?1?#???WU??LB?f????5oS?S???d????y;?-?????#?4?? V"??_?;???[???wiA?F???F6??????Oj-{?h?(? ?5v?d??bj???'CMX?6??[h3?P?????#L?et?T5y;}c)&????y?fIP???xu???i??K*+?'?zf??0{&?m.E\&?1????kz +? ??? ??D????5???C'??R?>5????U????k2?G^Y?9?{??b???6?5???w5?????o\?.???_?"???????G????9??=?B= ?T?P?????H?85&p?????S:?p?C._?? 'p???B?6Z?24?{?? +V?????O?? ??|?1?$}?Iy????x?Q??9???W)!?)?????<9???A???g ?H^?1??2|?+??F/?? T|??? ??=????? ????uv????%?]I?C"?94????6????IkdE5??5?U??h?`tv,]11??-?FH|???N?u?\? +?????:?O?f??N???(??'S??M?-??}????? ????????B???HD???{??r?w +???!?S??6????R.0?? ?D?? +??F??m??T?W?1*????c_???4????d$x]Le ` ?n?ey?? w?q????t?u)vT? )Q?r#??K?7?.????Zg~??? ??zv???????????7????rxo???{m???r?o$??S?*????e?Jv;?{?????>????[a1??????7,qG??|~*b?V?T??Es 8tC?_}Y?Q?-|??w????F?k?d?s ???#??????L9mV???@??L~???X[ ?+U0,f?`_?V?????1??n??e???1}?????D?;]U?Z?K?3r?^??L?cJ??o?????OP#?T??]??1?;?5*N??#?`?#6G??H ???Ym?J??'FFr?3??GD???? Y?c?j9? A?@?????@?D^z???l?t?? +,?I??????x??E??^?yN??7???$R(???4???6sC??X?(JV?V?sK7???s ?J=??o?h_ 7??o????6B??N.u????D???/z???????2?3??+????C?H?Wq?J ?Q?*??%??g$W?-.?.?????q?{o9f??+)???#?` ??&?6h?ue?-Z?_??w???h]???-?t}?6\?????o|u%n?Z?????>????1????????3?v?Ec?????B?????4?J4??-Y[??#?H??2?t??4+??;??D?l?9????W8??WK`?9?w1????n'???%????i???36c???2s^%BA}??O?X?j?6A?#?,#?N?5?@8??sR?-?}????????& ???6???md??7?d??????g ???5??.???Qi??? ?????hI??tR?}???? ???2??E+????V???L???X??_?=??Eu??}SUU0XW/\8y M?jB??????G?? ?? D[d?\??u[~?? ??3?2??+?0??Z+w?Z_Q????NoM????????H?D??H?u??????G}??-E???u????}"????????n?Nq?q?vm?CR ?HH?-F????????)G???|?F??????}????=^I ??5?$Jm???K???]J????????z?r+?a?*?gT????'??????d{?zm??[???o??????o?????P?5U8_?J?o???wz??a??Q|oV?."?Mre??jE?? ??]S[J??????X????? )k??????T?????' t?'?]?3??@?CWd?? D~????P?????:MG????I?g?Y0N%??E?K$k?????+%o??U ?#????? ???R'7????F?T}??z{s?k?x??????????)????*R???O9c -?-4<0????N?$?%??d9uJ?z???????R?Z3?F`?y]?6@??,????,JR????{O???? ?? ??y r???/????MB?"?????@?x?0?EU?n ?%v5gc?T?sE ?'? =W ?H,?Q?N5/?ts???????????e??.??8XX????*I7Y??$c?I}?????HAU?????nbq????=???????????~f??#(B?~d?P\??i,?|??N????36X??i??y ??Nx??h??? ?'?^M45?Y?>?? hV????x??jP??Mf????;|iT?6 +?[???#??C???2?????[??????d?I???y?Q8#???21<q?????@Y????s?&s T"?[A??? ????5????=?'?3???z4I0"???k8??i?BD???p??&?4?^?W?~??hlE??.?-?,j??$???\?E?Ja?w-s?P?0:)00?-?V???K"???]?I at H\<5?????I??F-?????-?4p??3???g???????SZ??v??a?Qn???wxEY?/??A? ???#_ T???DteJ??? +???c)?Gv]q4?]#Z?3`Z?1?f{'?????,?&?0)?????>f}?Ga???[?N?W?M?$???`%%?,H????6^kJN?+?????h?4? gxE?????>?X?????}??????+ k#K]v?MV???no?e?Qo`?? ???%?j??????????8???`)?q?a?Ke?H?N1???????f??ce?s?%?]?ZX??m??}??????? +?6QO?{t&????5??????F?8d2???ar^?????[??E?????>?f??b?#???,H)!???&?????N a?h???[z\i?????!??P?????#?b?????w???z?E?r%u0?n??\???q??6?"??u???$d ???l???z?#?-:?PX?H~?_ ??????%?&??5?Ht???.?yL?F????T??(??B???v??(?[??%?jj)????]?????~:??fK8?????|4?=???+?? ??=t?{?e?Lc"HdL???2????t."?"???w?Pv??????p?e +/??T???dr}?????!???=?K?XH????Y?????+5?b?%????s-??b^?i??{??O??} +?D?Qy?T?g???d? ????zv??t?????Q????)?@???? /:d????V7]B?S ;1?)~??*g??? ?!??z????z#??H?.R`?R??? ?^??? ?!??.?J?_rb5-?c?p~???s?G?? ?7???f????I?#?FWy ?Arz?9"?e????~????? ??*?6(/y????4Eb???*}8vL?"??N?  ?"?n??i?? +" ?;??V??D??C?? 1O???????Of?!?l?????d5N??HQnw?=?q?~|?v;???@??:~ t?!???F}D??g???$?"?E??uul??K?????|??(?=??????H?d???2%9??K?1???s'?j???1q?r?By??[?$v9?$??n?????:?W??o?! +#?>~DJD?????_?c+(o?nf?#@le?e&?o?G??K?k????????7??5G?W?R?+??loS&)>??cd?.??^-??_%6M?m?L8????*/?e?? }'?IG-?"?m???\tmL???|`??3??????t??M??FIC??E???"??n?g??q??????|^?!??O3?X???vG?? X%?!?8??-?^k?Mt??*???0?????A?>?=?????0?9[???????0???m#?_"?N??!??????????j????[ kU?T?O_?`??;p????????H?|???A???U???^{(?Q????EZe2??q+???KL:4[?????/??Y2?*wqI?BM?, ???_?d??Y???I???? ?R#}?wNW~????2?????a$o??1???Q????G?????*mCn?L ???m9??r??u??vK?????c?&????Mp?N?o|?R?R?&??}???sxf(???6f???( ??O$?J-a?0Mw2????`??b?j?I?X??e?wT????C??xg????Y???} ??A!?s??x?Sx?|$ie?PzI?1????a???8?[K?t?k$?dZ8?K??}Y_???b??????[n???????yx?????g?)?????qKW??:????y??#?{E;j???op????w?~??f?????1M]+Q #?????5?!???.???of?????!7PX???-???3*??a?n?????L??????Yl,????9??[C ?????A??4Ck??S2u??h??^Kx?3v???? %V????/-?8DF?,??????ci??E?WK??#??????????&~Cvq?9???????Qg#??Z[$?????!???"??I{7v???%???`? ?_S0U????$?%?$???x???\??Csi??????PL??X????+D cC;xk????????o*b?]J??iT??B?u??????"??q?a?g???~?????o??~????{????V?=*?|??O[?? m???2E6z???p`???db??D????[y?)?J?  Z>??^D??FHC0=h[?"?????p5??"???%i??y`?%??M?N#/???????3t???kZ??'??BD?]?s??V?zR?f???FEJ??1 +??~????F6???}idC??l????6H4?afY?y?T+-,??w???????GC???BT??e???d ??gv?3?m?b??????????????^^![Yw? ?4??gyK^n)??mni? ? _?pY?^?#?'??\?? ?'????S?O?[?Dx?e?8????@?3y?b????{???????P?:T???D?????o"?qT????y??.?u[????? ll??vV??/?8??9q?Q#?9?0L??(??#y?t??O/?? l???g?94FQ%??!?g?$ ?GBPh[????L(Yx?U? = SC??:?6?G?????????x?? Q)??K??s4 +)@{f#nt?3\?>?UD"??mp??E????je??Y(??f ?J?Y:S?C????? &??L?v?c?h???!=44?j!?:??????F?8,???Q???l?>2??BA>?8??w??S??^??R???M?L?????M_/m=????OMcIn???"6??Jd?/?N???V??)?'???+?F???? ???l?????F>???a?:|Dj?r?Y?y??0?1????lo?8MYN ?"??????Qc{mN`?C[??a?u?O??P?5i?2???H??e????aa??~T??!H?k?+~BdB????}??HuG?tZ3S???f1?? ?B??rj???c?*??????M?07~?????P????XC???y????"??.?%a? ??D????G?:???????8??H???c ?O2????5???x??k??Jz[??h???KD????????(????-t????7{{% ?W????? ???p?G???V?dL??h?HU?3M?"??|??????|??9/{2?z??+???m^r"[tN(o=_a?3?~)?0 at A?Psy"+r??p??sT?87BTy?2???zT at C ??+??T? ??)??M??K???oz?????^4?I?<_4?????e???j"J??~?tGvP????????j?????}q????n?e*??Q??? ?!T??]v??Enn???w?op?n~???%S[>j?)?N'?aGYL???? ds???d?,?%?sn7????+??Wu?? y?-?????F3??R~?QX??B5???gH???v/????u?-w?-?? >+??w=?+?2???6~g]????N?(???9F7?H+??EI?i?-)T?[~?????o? w?%??.-?????%??n?Z?q|??c ?T?[??eNC?1?Av,?Y?RB?-?r5v??t?a?$??? 'OU!???4??Eb???@??????P +??>?y?K? N}?8??^???)?????p?????&?'???MZl??????*l????cs:?V?yy?????p0??????Ou;$?=???#?+???p?=d??/?4?%oc~?#??J???k,^??Ax?????? ?2?3&1???*?c,]B?K\?/\"uh???O?@???`????6nMC????<=TE3?Q???????0????0W????}????;???Et??k*??O??#??????=N?'C???oPz????-?KI???t-?r?l}??8???QYH?"RR??_?PH??F???p ????a?Ok??'??R?=???SZJj\?V???.?P?+3B?|?/t ?1h???d?qY?u??sx?"?V$T?=m???g{ ??F??^???p?=[c[?w?????%????F[???!=?IB??z????=??D(?????II???3Xb?u?xE7??C?sI?? ??????eLj'??em??(???????? +?tv?\????%?? ?_;?.j? v???*-????????kT=??~!??:X?_K?;? *?0???M?`v?u@?.|?*?,?`??|???RO?Q?F???,?s#????E_?N????}gW???C?????r&??%:O?????2????4]??y???,O2?![???H???hn??x ?p?????.?x~???L???r??????????Z?S?D???VQ?V?u?T???x???????????+???$???q[?ox???/???x????E??~c??\???z+6{???????PM?R?Io?F?Ub??ZI???u??s?JL?">VX~?????k?????? ?Yx'7?-????????_|o??????d(R???a?[???`??=?????????7???????l???6? ???G????Fd?_??Q*p??^??o??P??Sjb??j?F?):?=????????????F??????N?SA?Q%%? 1??????K]?kd???I?Yd???DH?Z~GB{?n#u:????P??YU????(wf??D?M??n?72G&????\?r &??F*6?+.????t?9<>???????BM????-???_???{i?#??2l??g7?iD?????:;-?K[?????V5?????? ???????4??TR?-?t??? ? ???`B;????Wn\?T?)O9 =!????????wOc??????t? ???K7??????=??E???'?f???l????????jQ4?!N?S??Mx??y_ %?Q??%?>???g????????u3?0A?w???????/\)C?h??@*Y????????U???k?ap?p??]???l} +?\\P?D??????K?~&?C?4=??????Ox:}k? ?????^???R'p???????V[??3~?????pop |??]??5&Ti?2?A???z??C??Y?w?|?T}>h*??`Q??2T??A??hFi&???\V??|Nu?o&a??H? +?S`/?{ }?oh??E???_???vZ??#}e?HSp?|\i??E?K?~ +??SxtA?9???h???2;rR??????? ?:G9/??+?k??~^????'=?|\5?????? ?Qd?????????{?UZ?'???&l?KU;m?\o?????p???`????@%+&???????OL`j 4vr??3v?A?_???endstream +endobj +95 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 330 0 R +/FirstChar 11 +/LastChar 122 +/Widths 331 0 R +/BaseFont /VEHZDH+CMR10 +/FontDescriptor 93 0 R +>> endobj +93 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /VEHZDH+CMR10 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/FontBBox [-251 -250 1009 969] +/Flags 4 +/CharSet (/ff/fi/fl/ffi/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) +/FontFile 94 0 R +>> endobj +331 0 obj +[583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 0 0 625 917 750 778 681 0 736 556 722 750 0 1028 0 750 0 0 0 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] +endobj +330 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] +>> endobj +91 0 obj << +/Length1 1242 +/Length2 6715 +/Length3 532 +/Length 7487 +/Filter /FlateDecode +>> +stream +x???eX[???q Z??b??!??w? $@ A??VAJ?Phq???)^??R?X?B?????9??|???u????s?1?g????1?aUG???A i????HRpp? ?` ?? +FA?? ))a?:?s??K??J ?8?*4???r?p??$Tr?"a`w?.? u??p????*??@????A??H(D!0??s??????J??x{?{????H????b$!w8?:??????Z?]\????Y??N??u? ??W???Eu(???S???)#??c-sPrw?C?B?`^?0?(??rp:??^???Pw?+`?????????>?????E0?e???O????b?????????I?\??????????PXLF"?hfz0$ a????1pG?0?1-ytD ??P?????????????????? +: ??????I??cF??q1????$T??0???! ???3?????d??CR?]?C !?3?7??BCLY?????b?`??8P??7?H??? ?o??p?1'*??b4??0???!???7?X!C???o??B??+??c??b?|?Aa??7?h??? ?????n???[ee?_?????bB???D???o??H?l???*`???a?? +??:??2./????????`+;5$??t|n% ?M??j{?,U[\?d?%???b??f??m 4V? ?L~9?k???V????L]???E?Es???71l???O??- z^???p??|%????i?S??!.a?? 7????a5?|??>F4z??2=oq4?B????Z ~)??Q?9_K_????,g???Z??VW??m:???????j]uq??A?S8,yV???r???':?????!?D???[????????? ?h>M?p????2?}?a?????a??u???x??% ??f???B???7??R??htzRq????@?????????maC?S?}?5???u"?????t??7?h??? ????K???0??s????;X?"?O???Y}F ???R????*e????? 3(???Q????r???X??????BG? ?/??t??d???V"V??cb3?l ??YA?(?9??e?????YbDHmv???1?~{??r?????A9??? }?!o?}???vg??{j?UV??Q??z?)iAJsN???%??3?E?????.???e???S??W???k???x?A?W??2???w??_N? ?Z??9~f??]????|???Z7???.8"?}T??S??=u????4*T5)?????f??U?????C_??? ?>Z?_?7?;??o??z?M?????? ???Z|?+r01?]???:?,?3??????5?????P?????G?^4*>h?'S[???;??dpU???-g!5????X?dC2r,????}3??? -F??? X +???f.??a?????ur?>J?????`????'>?R????n? +???{??!Jo?????[?# ????g???o"???\L????^??????m?mFJ6???J??s???JEe????/????(MYX%bh?????`?@!+pYO;KH?G??N?7D?x???P??'?2 /????h??G*)??%?%;N?lY?i?sf?B?+F?d??:?!?_V??|??{h????G??/??????o?z17?????????l???????? ??l'??????????wR?o?O,?^`?d????Ckb??7?T??Y???)IZb?9??Ng???W?8@i?E2()??*~????????~-?+????W??F?>kq'?5?o????4"e?????$8?g?@???4-n8>(?]??M???6k?P]l?8????? ??GG\??6????tWl?9??1?????????I4?K?p??VB?`X?i??a??#oK3??%y??pG ?>:???9ah???b?*?w???e??QcaC?M?'???f4?^h\??L1??d????P??4DHW-0x?'f?jk???D}?tJ???[d??????DSw???|? ?)?0?r?cb??O?e?r?Tw??Q]x?)?4??? b ???Mv]#Xg?`???"?????????????^{?????|??????nfQ?7,???F?qK?A??U? ,???0???&?l[????|?c???? ?5?????E??_???.?YIzp?%NA\??o?B?pFe?R?3c?&+??|?"W7?E?o???U?|GvLw?/???$UgH?n???x???????O\??s UI%???rD=? ???E'???O;?}Wz^e?]?c ?????"6Y9?,RA????Wx??????"??;9???R+?G?>Y?2?SL|??_??"???N+?]?F~6????r???(R??????????????[h??Q????w?=???u???a]????yw????z7L%??B??N?,]?m????e- n?Tb?t??D??g=U!??NCq??h?4????0f?????o??)^r?R??G???[\???|1^C ? ????#?qS[??.???+j?TB???r?#2?{"G??!?&?G?J#??????Y?C???&?m?? ???&???{?F?? ??k?G?Y??????r??S??ZNr?u????X?#?N?l???x???:?? 4?9ys?DN?V??6,???>:??? sg?? ???????T?*"TV?}z????%?? +>?x?C/?X?? ???{Hw?e9???vw?r???????>????????r?/??w????z???Jv??i???p?A??2c???h??{? 8?M1}M??:"??????c??n?Y?Q8[?U???8?n?v? L?? ?|u?????????l??&?p5??\T\z.u?\'?????6??? ?W????+F?|? ???d?S?S?l??'g~_P??y?0?w??f??q??????:?O ??(??;}8?T/=cc?nf????y????(??/?y?? ? ??*6?+?+)8?F??.]???N?N"??o???%???\]??3?'7???$P6?(?PN?N?????W@??_??qb?????iL?M??3{mZl-?-Z?J?G?8???P??O???}?P2B+??^=?;4 ?i:?R!??b??k 1= V ??P??_6%?L?B?????@^C?S?nW???&,K?k?~???Ny?ql?n4?????#?T????u? ?Y?`]"??=?N?,??l?]%K?1~\s?'?Jlr???-??!UF??????@??n??3?*??????_?????:p??lR?~FU?E??J?'???C?S??P?D?)???a@?c?*?df%?x????M???????"???)4,???f?R?5??J???c{d??*??{%??q??E????V?x??? ??h???z^w?J(^?5?<|???r?? ??????G?G??B?G??ID???????k??Exq?????+??r?Y?2???f??EL&R5B?G?EFK??X??Y?????A?E???=?i????X|?O??s????j????;]??<T??W=KMiu??L1?7??????:??f?O?V?%?f?x]S x???"?]?[?vz!???L?Q?vE?(?f???mrR?.?f?P?wvj???a) ??:??jQ?J?L??fh?$ \??????? ,?|f0?A???+,?*}??G?(? >I??%?L??KV^w?~L??P?2z??R/?U?z??X???QC$???:?C?u+z%????h??R???/??@5A?jy??U ??Xs7_?r?7??,R???R??a(? [H???t??oA?????S?x???b??b??AK?R+??f???? r?(??Dr???? 8V? d??AfzFi?}? ???U????y???Q??a??p?*^Q[ +]???T?I{u?E???K???G??,?????nr?{???Fo?????KOa/,?F7?$E??*?J?? +??#a|R? ?xI???9????#'v%?N?xVh.? g2?n?3?/2su?????????????erX-v6S?? +E[???}??X???(Zv?? ?l??!????u?m?[8????s??T?? ??c?(??d?,??e?Te??_??:??HT??nf?(-%????J?}H?6D!?-????y#'????--uTw^?????>r76U[Q??)?`???B ???Q-?;?t?>WG ????????:h?L??,???p?6?5:M?T7?}?{i>?$<9?> endobj +90 0 obj << +/Ascent 694 +/CapHeight 686 +/Descent -194 +/FontName /DCHZFO+CMBX10 +/ItalicAngle 0 +/StemV 114 +/XHeight 444 +/FontBBox [-301 -250 1164 946] +/Flags 4 +/CharSet (/parenleft/parenright/comma/colon/A/C/D/I/a/b/c/d/e/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/y/z/endash) +/FontFile 91 0 R +>> endobj +333 0 obj +[447 447 0 0 319 0 0 0 0 0 0 0 0 0 0 0 0 0 319 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 0 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 0 607 511 575 ] +endobj +332 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 58/colon 59/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w 120/.notdef 121/y/z/endash 124/.notdef] +>> endobj +88 0 obj << +/Length1 1064 +/Length2 4328 +/Length3 532 +/Length 5027 +/Filter /FlateDecode +>> +stream +x???e\T{??I?A?8(?0? !?)?? ?#0?P????? %?C????H?t?????;z?^??/w_?g?ys?O???????F???_?n??fn??p8 46??I=L?x??U???%???????,k?\G8??!?C??g???8/??r?x???)???Zo?n?????C??n??I????&ix.9?8 \????????????d??l\???R??B2???????????b?JI!?????????P??)w?????@??!?U?;?ZW??L????$??3@??7??S?X?J?/2{????? +<??B?\?Q?@v????}_?#??b??dR????? f????\Z?R0??j???????!W;?:I???~??]??P???7??=2?S??jU???????X?^Rn????$VuEVG?)??zc???? )?"o???{h????"??a??*??^I????!???*???????9Hez r??????!?.J?f at O??M?:????????????c???r&??U?????M???U?#?? .#????_???XR??*?BY??F?|3}?#DF?????5C?7?????????2P?[??????? M?????>S??|#$?VK?-?L[sW????????a(f????>l?????.?@????????>?ZO]??0???J8????#?SQ????\????0J??f???m??!O?u ?P???Uhv???a?F??????uP?????,u????yLU?F?t??????0/.`~??#?z ??VV ?{?'?H?`$?e >?|L?w?P|$?? _l???a?&+f?dGH?U?%?????????????????aj?c?]????F????b?W???Y'5#???rK??+??4??[;??S?fJ???G`? K??AM?A??????w`?~??LK?_?*m?v??'\?b'?_??q33@???r??S?g?7??k?sw|?x]???? ?V?S??????`?}????;EX??M??e?4H??y???_??8/?????Eg-??R?/?i2?h????)?? +~???`??????2???????.?y??3?y???v??^Sy?N????????????a)?)?v?"a???????k?????qHR????6)]???}?=?j?>]??S?{?W?"S????E?<: M?{UJ??????????2|??]?????1????g?d??Y?7W*n?? ?? E ?l$?e*???ksK?q??l.?^\?r??Z???????K????eks?????1?2?f?'j?d?????w?????Zs???3dw???%???s???? +?????v*?iD?[???%??_\?r?c????1YAW??k?s??R???8]C_g$s?r?_V??b?1?/????????.sTXX??9?qs6??%M??[??-??|???RkAC ?:?e?????D-I3?Aq??3JX?n?l9?4???AO??$??cHQXq?????a???e:????x???????(W???d9!? ???M??=?S?Q??O???# +?^?[XI???????{????q]ZdZ4? ???Xx?????[??'T~l?A?????m??(?Z??????j?Q?!}~??)W?.X?Q?"??/???KS? ??=????k??d?_X????? O~???2?c??J?????7^????G???J??r ???c???2???T"0M?8????????OV??????~???f???<^N ?4F????{X??t?>?G2D {?[????!%????Y?@??kj#???.??1?9??? V-Qq??$?4?*K?$????{?ui<;????????P?k??g?" ??9?R???????????????XUH?G?)b@@9T?^)?"???????? ?;?4 ?M??Q?.?1???g1??O??6??^??????d%(??w??????U?61???0?mO??J?}KK???y?,C?"?????p?2?xl`? +H* ??t????^/?tocp$|??????3v) %??1?????C?-?d???????l??????9??^y5]?q4??a????FG? [????8???Duc????g?i_?l?Y??g??R????AajJTk5[??#??&?N,`@?8???% ??w???]R?E??/}??????,?>?{?8Rf?W?\i?E???[??<=l???v??w??????.??????$???O?6?nQ?d6?????? ??68?LJ'?J-??q#.G??????-g}3?????????????'?*??R??16>????i?Hg??>??$???s?O'???????z? ??????]?P???I????4??m??? ?n???o???????1??? ??eI?dF? ???S? ??9P,t??m??Ei?u??gi??!5{Az_???=?U?9???????????5~?d?)??_?????E$?x? ?????n?????????k??}????h??8?*??2T?3??CF??|t?)???????+{???aL ?AK??G? ?=k[:?Z??&?????[IL H~??6??f?C?p???~}(?;????FF??? T?B?nL?Nn?=??Z1?^E??1??]_5?`/??98??J?? ??Y&?d?l?L-?]?Z???HF? ??????????E?????&v?m??=???V?????goe??_???$??????$r??"g???F?u?????????R@?k???2`-??s? ??b;PG? ?f??????dd>??1s????a?????????????w????I??N'nq(W?^???+??i\?,????oxM[YLG?i?X0~G>??DHq???e~!R??EQ??=?6m??$c?D???}??},9?t??\Oa???V?W???_-??v??&???Lgt??t#f"????????O??P4?E???e?5?endstream +endobj +89 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 334 0 R +/FirstChar 46 +/LastChar 121 +/Widths 335 0 R +/BaseFont /RZEXOU+CMR17 +/FontDescriptor 87 0 R +>> endobj +87 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -195 +/FontName /RZEXOU+CMR17 +/ItalicAngle 0 +/StemV 53 +/XHeight 430 +/FontBBox [-33 -250 945 749] +/Flags 4 +/CharSet (/period/colon/F/G/I/N/P/S/W/a/c/e/f/i/l/m/n/o/p/r/t/u/y) +/FontFile 88 0 R +>> endobj +335 0 obj +[250 0 0 0 0 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 0 0 0 0 602 726 0 328 0 0 0 0 693 0 628 0 0 511 0 0 0 955 0 0 0 0 0 0 0 0 0 459 0 406 0 406 276 0 0 250 0 0 250 772 511 459 511 0 354 0 354 511 0 0 0 485 ] +endobj +334 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 46/period 47/.notdef 58/colon 59/.notdef 70/F/G 72/.notdef 73/I 74/.notdef 78/N 79/.notdef 80/P 81/.notdef 83/S 84/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r 115/.notdef 116/t/u 118/.notdef 121/y 122/.notdef] +>> endobj +127 0 obj << +/Type /Pages +/Count 6 +/Parent 336 0 R +/Kids [82 0 R 146 0 R 166 0 R 178 0 R 195 0 R 205 0 R] +>> endobj +237 0 obj << +/Type /Pages +/Count 6 +/Parent 336 0 R +/Kids [221 0 R 239 0 R 258 0 R 271 0 R 284 0 R 304 0 R] +>> endobj +336 0 obj << +/Type /Pages +/Count 12 +/Kids [127 0 R 237 0 R] +>> endobj +337 0 obj << +/Type /Outlines +/First 7 0 R +/Last 79 0 R +/Count 8 +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 337 0 R +/Prev 75 0 R +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 337 0 R +/Prev 59 0 R +/Next 79 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 59 0 R +/Prev 67 0 R +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 59 0 R +/Prev 63 0 R +/Next 71 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 59 0 R +/Next 67 0 R +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 337 0 R +/Prev 47 0 R +/Next 75 0 R +/First 63 0 R +/Last 71 0 R +/Count -3 +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 47 0 R +/Prev 51 0 R +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 47 0 R +/Next 55 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 337 0 R +/Prev 19 0 R +/Next 59 0 R +/First 51 0 R +/Last 55 0 R +/Count -2 +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 19 0 R +/Prev 39 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 19 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 19 0 R +/Prev 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 19 0 R +/Prev 27 0 R +/Next 35 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 19 0 R +/Prev 23 0 R +/Next 31 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 337 0 R +/Prev 15 0 R +/Next 47 0 R +/First 23 0 R +/Last 43 0 R +/Count -6 +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 337 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 337 0 R +/Prev 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 337 0 R +/Next 11 0 R +>> endobj +338 0 obj << +/Names [(Doc-Start) 86 0 R (a-common-example) 140 0 R (a-common-example.1) 62 0 R (a-final-note) 142 0 R (a-final-note.1) 70 0 R (acknowledgements) 144 0 R (acknowledgements.0) 78 0 R (argout-arrays) 132 0 R (argout-arrays.1) 30 0 R (available-typemaps) 129 0 R (available-typemaps.0) 18 0 R (beyond-the-provided-typemaps) 139 0 R (beyond-the-provided-typemaps.0) 58 0 R (contents) 96 0 R (contents.0) 6 0 R (helper-functions) 136 0 R (helper-functions.0) 46 0 R (in-place-arrays) 131 0 R (in-place-arrays.1) 26 0 R (input-arrays) 130 0 R (input-arrays.1) 22 0 R (introduction) 116 0 R (introduction.0) 10 0 R (macros) 137 0 R (macros.1) 50 0 R (other-common-types-bool) 134 0 R (other-common-types-bool.1) 38 0 R (other-common-types-complex) 135 0 R (other-common-types-complex.1) 42 0 R (other-situations) 141 0 R (other-situations.1) 66 0 R (output-arrays) 133 0 R (output-arrays.1) 34 0 R (page.1) 85 0 R (page.10) 273 0 R (page.11) 286 0 R (page.12) 306 0 R (page.2) 148 0 R (page.3) 168 0 R (page.4) 180 0 R (page.5) 197 0 R (page.6) 207 0 R (page.7) 223 0 R (page.8) 241 0 R (page.9) 260 0 R (routines) 138 0 R (routines.1) 54 0 R (section*.1) 97 0 R (section*.10) 224 0 R (section*.11) 235 0 R (section*.12) 236 0 R (section*.13) 242 0 R (section*.14) 277 0 R (section*.15) 279 0 R (section*.16) 291 0 R (section*.17) 299 0 R (section*.18) 301 0 R (section*.19) 309 0 R (section*.2) 120 0 R (section*.3) 182 0 R (section*.4) 189 0 R (section*.5) 198 0 R (section*.6) 201 0 R (section*.7) 208 0 R (section*.8) 215 0 R (section*.9) 216 0 R (summary) 143 0 R (summary.0) 74 0 R (using-numpy-i) 128 0 R (using-numpy-i.0) 14 0 R] +/Limits [(Doc-Start) (using-numpy-i.0)] +>> endobj +339 0 obj << +/Kids [338 0 R] +>> endobj +340 0 obj << +/Dests 339 0 R +>> endobj +341 0 obj << +/Type /Catalog +/Pages 336 0 R +/Outlines 337 0 R +/Names 340 0 R +/PageMode /UseOutlines +/OpenAction 81 0 R +>> endobj +342 0 obj << +/Author(Bill Spotz)/Title(numpy.i: a SWIG Interface File for NumPy)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() +/CreationDate (D:20070913152304-06'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.6) +>> endobj +xref +0 343 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000009 00000 n +0000007634 00000 n +0000140903 00000 n +0000000055 00000 n +0000000081 00000 n +0000007817 00000 n +0000140817 00000 n +0000000131 00000 n +0000000162 00000 n +0000024629 00000 n +0000140729 00000 n +0000000214 00000 n +0000000246 00000 n +0000024816 00000 n +0000140604 00000 n +0000000303 00000 n +0000000340 00000 n +0000028601 00000 n +0000140530 00000 n +0000000391 00000 n +0000000422 00000 n +0000028788 00000 n +0000140443 00000 n +0000000476 00000 n +0000000510 00000 n +0000028976 00000 n +0000140356 00000 n +0000000562 00000 n +0000000594 00000 n +0000034600 00000 n +0000140269 00000 n +0000000646 00000 n +0000000678 00000 n +0000034788 00000 n +0000140182 00000 n +0000000740 00000 n +0000000783 00000 n +0000034976 00000 n +0000140108 00000 n +0000000848 00000 n +0000000894 00000 n +0000041045 00000 n +0000139983 00000 n +0000000949 00000 n +0000000984 00000 n +0000041233 00000 n +0000139909 00000 n +0000001029 00000 n +0000001054 00000 n +0000041421 00000 n +0000139835 00000 n +0000001101 00000 n +0000001128 00000 n +0000056494 00000 n +0000139710 00000 n +0000001195 00000 n +0000001242 00000 n +0000056682 00000 n +0000139636 00000 n +0000001297 00000 n +0000001332 00000 n +0000064004 00000 n +0000139549 00000 n +0000001387 00000 n +0000001422 00000 n +0000064192 00000 n +0000139475 00000 n +0000001473 00000 n +0000001504 00000 n +0000064380 00000 n +0000139387 00000 n +0000001550 00000 n +0000001576 00000 n +0000069139 00000 n +0000139312 00000 n +0000001631 00000 n +0000001666 00000 n +0000003736 00000 n +0000007940 00000 n +0000001716 00000 n +0000007451 00000 n +0000007512 00000 n +0000138112 00000 n +0000132806 00000 n +0000137953 00000 n +0000131967 00000 n +0000124200 00000 n +0000131807 00000 n +0000122948 00000 n +0000108198 00000 n +0000122789 00000 n +0000007573 00000 n +0000007694 00000 n +0000004033 00000 n +0000004190 00000 n +0000004348 00000 n +0000004512 00000 n +0000004671 00000 n +0000004833 00000 n +0000004993 00000 n +0000005153 00000 n +0000005323 00000 n +0000005496 00000 n +0000005658 00000 n +0000005811 00000 n +0000005966 00000 n +0000006140 00000 n +0000006303 00000 n +0000006466 00000 n +0000006625 00000 n +0000006778 00000 n +0000007755 00000 n +0000107331 00000 n +0000099381 00000 n +0000107169 00000 n +0000007878 00000 n +0000006940 00000 n +0000007110 00000 n +0000007280 00000 n +0000097890 00000 n +0000083292 00000 n +0000097728 00000 n +0000138935 00000 n +0000024567 00000 n +0000024753 00000 n +0000028539 00000 n +0000028725 00000 n +0000028913 00000 n +0000034537 00000 n +0000034725 00000 n +0000034913 00000 n +0000040982 00000 n +0000041170 00000 n +0000041358 00000 n +0000056431 00000 n +0000056619 00000 n +0000063941 00000 n +0000064129 00000 n +0000064317 00000 n +0000069076 00000 n +0000014690 00000 n +0000012151 00000 n +0000008059 00000 n +0000014627 00000 n +0000012389 00000 n +0000012560 00000 n +0000012730 00000 n +0000082808 00000 n +0000078781 00000 n +0000082646 00000 n +0000012903 00000 n +0000013077 00000 n +0000013250 00000 n +0000013424 00000 n +0000013598 00000 n +0000013771 00000 n +0000013945 00000 n +0000014115 00000 n +0000014284 00000 n +0000014456 00000 n +0000019614 00000 n +0000017992 00000 n +0000014786 00000 n +0000019551 00000 n +0000018190 00000 n +0000018358 00000 n +0000018526 00000 n +0000018698 00000 n +0000018871 00000 n +0000019045 00000 n +0000019206 00000 n +0000019378 00000 n +0000024941 00000 n +0000022939 00000 n +0000019697 00000 n +0000024504 00000 n +0000023137 00000 n +0000024690 00000 n +0000023304 00000 n +0000023475 00000 n +0000023646 00000 n +0000023817 00000 n +0000023990 00000 n +0000024160 00000 n +0000024878 00000 n +0000024331 00000 n +0000078461 00000 n +0000077071 00000 n +0000078300 00000 n +0000029038 00000 n +0000027620 00000 n +0000025050 00000 n +0000028476 00000 n +0000028662 00000 n +0000027786 00000 n +0000027958 00000 n +0000028850 00000 n +0000028130 00000 n +0000028302 00000 n +0000035038 00000 n +0000032686 00000 n +0000029147 00000 n +0000034411 00000 n +0000034474 00000 n +0000032892 00000 n +0000033065 00000 n +0000033238 00000 n +0000033411 00000 n +0000033583 00000 n +0000033754 00000 n +0000034662 00000 n +0000034850 00000 n +0000033926 00000 n +0000034091 00000 n +0000034250 00000 n +0000041483 00000 n +0000038914 00000 n +0000035147 00000 n +0000040856 00000 n +0000040919 00000 n +0000039128 00000 n +0000039301 00000 n +0000039475 00000 n +0000039648 00000 n +0000039820 00000 n +0000039992 00000 n +0000040165 00000 n +0000040336 00000 n +0000040509 00000 n +0000040682 00000 n +0000041107 00000 n +0000041295 00000 n +0000139051 00000 n +0000047379 00000 n +0000044583 00000 n +0000041591 00000 n +0000047253 00000 n +0000047316 00000 n +0000044829 00000 n +0000045002 00000 n +0000045176 00000 n +0000045349 00000 n +0000045522 00000 n +0000045695 00000 n +0000045869 00000 n +0000046041 00000 n +0000046215 00000 n +0000046388 00000 n +0000046561 00000 n +0000046734 00000 n +0000046907 00000 n +0000047080 00000 n +0000052204 00000 n +0000050376 00000 n +0000047500 00000 n +0000052141 00000 n +0000050582 00000 n +0000050755 00000 n +0000050929 00000 n +0000051103 00000 n +0000051276 00000 n +0000051448 00000 n +0000051621 00000 n +0000051795 00000 n +0000051967 00000 n +0000056807 00000 n +0000054969 00000 n +0000052312 00000 n +0000056368 00000 n +0000055159 00000 n +0000055331 00000 n +0000055505 00000 n +0000056556 00000 n +0000055677 00000 n +0000056744 00000 n +0000055851 00000 n +0000056024 00000 n +0000056195 00000 n +0000064505 00000 n +0000061366 00000 n +0000056928 00000 n +0000063878 00000 n +0000061604 00000 n +0000061777 00000 n +0000061950 00000 n +0000062122 00000 n +0000064066 00000 n +0000062293 00000 n +0000062462 00000 n +0000062635 00000 n +0000062806 00000 n +0000062980 00000 n +0000063165 00000 n +0000063347 00000 n +0000064254 00000 n +0000063534 00000 n +0000064442 00000 n +0000063705 00000 n +0000069264 00000 n +0000067232 00000 n +0000064626 00000 n +0000069013 00000 n +0000067438 00000 n +0000067609 00000 n +0000069201 00000 n +0000067782 00000 n +0000067953 00000 n +0000068127 00000 n +0000068298 00000 n +0000068470 00000 n +0000076204 00000 n +0000069398 00000 n +0000076044 00000 n +0000068637 00000 n +0000068821 00000 n +0000076732 00000 n +0000076494 00000 n +0000078694 00000 n +0000078670 00000 n +0000083112 00000 n +0000083030 00000 n +0000098789 00000 n +0000098425 00000 n +0000107877 00000 n +0000107622 00000 n +0000123760 00000 n +0000123375 00000 n +0000132513 00000 n +0000132259 00000 n +0000138577 00000 n +0000138359 00000 n +0000139168 00000 n +0000139238 00000 n +0000140975 00000 n +0000142671 00000 n +0000142710 00000 n +0000142748 00000 n +0000142877 00000 n +trailer +<< +/Size 343 +/Root 341 0 R +/Info 342 0 R +/ID [<72E223D8C368EB4F95EC46C06235A1BE> <72E223D8C368EB4F95EC46C06235A1BE>] +>> +startxref +143190 +%%EOF Added: trunk/numpy/doc/swig/doc/numpy_swig.txt =================================================================== --- trunk/numpy/doc/swig/doc/numpy_swig.txt 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/doc/numpy_swig.txt 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,785 @@ +========================================== + numpy.i: a SWIG Interface File for NumPy +========================================== + +:Author: Bill Spotz +:Institution: Sandia National Laboratories +:Date: 13 September, 2007 + +.. contents:: + +Introduction +============ + +The Simple Wrapper and Interface Generator (or `SWIG +`_) is a powerful tool for generating wrapper +code for interfacing to a wide variety of scripting languages. +`SWIG`_ can parse header files, and using only the code prototypes, +create an interface to the target language. But `SWIG`_ is not +omnipotent. For example, it cannot know from the prototype:: + + double rms(double* seq, int n); + +what exactly ``seq`` is. Is it a single value to be altered in-place? +Is it an array, and if so what is its length? Is it input-only? +Output-only? Input-output? `SWIG`_ cannot determine these details, +and does not attempt to do so. + +Making an educated guess, humans can conclude that this is probably a +routine that takes an input-only array of length ``n`` of ``double`` +values called ``seq`` and returns the root mean square. The default +behavior of `SWIG`_, however, will be to create a wrapper function +that compiles, but is nearly impossible to use from the scripting +language in the way the C routine was intended. + +For `python `_, the preferred way of handling +contiguous (or technically, *strided*) blocks of homogeneous data is +with the module `NumPy `_, which provides full +object-oriented access to arrays of data. Therefore, the most logical +`python`_ interface for the ``rms`` function would be (including doc +string):: + + def rms(seq): + """ + rms: return the root mean square of a sequence + rms(numpy.ndarray) -> double + rms(list) -> double + rms(tuple) -> double + """ + +where ``seq`` would be a `NumPy`_ array of ``double`` values, and its +length ``n`` would be extracted from ``seq`` internally before being +passed to the C routine. Even better, since `NumPy`_ supports +construction of arrays from arbitrary `python`_ sequences, ``seq`` +itself could be a nearly arbitrary sequence (so long as each element +can be converted to a ``double``) and the wrapper code would +internally convert it to a `NumPy`_ array before extracting its data +and length. + +`SWIG`_ allows these types of conversions to be defined via a +mechanism called typemaps. This document provides information on how +to use ``numpy.i``, a `SWIG`_ interface file that defines a series of +typemaps intended to make the type of array-related conversions +described above relatively simple to implement. For example, suppose +that the ``rms`` function prototype defined above was in a header file +named ``rms.h``. To obtain the `python`_ interface discussed above, +your `SWIG`_ interface file would need the following:: + + %{ + #define SWIG_FILE_WITH_INIT + #include "rms.h" + %} + + %include "numpy.i" + + %init %{ + import_array(); + %} + + %apply (double* IN_ARRAY1, int DIM1) {(double* seq, int n)}; + %include "rms.h" + +Typemaps are keyed off a list of one or more function arguments, +either by type or by type and name. We will refer to such lists as +*signatures*. One of the many typemaps defined by ``numpy.i`` is used +above and has the signature ``(double* IN_ARRAY1, int DIM1)``. The +argument names are intended to suggest that the ``double*`` argument +is an input array of one dimension and that the ``int`` represents +that dimension. This is precisely the pattern in the ``rms`` +prototype. + +Most likely, no actual prototypes to be wrapped will have the argument +names ``IN_ARRAY1`` and ``DIM1``. We use the ``%apply`` directive to +apply the typemap for one-dimensional input arrays of type ``double`` +to the actual prototype used by ``rms``. Using ``numpy.i`` +effectively, therefore, requires knowing what typemaps are available +and what they do. + +A `SWIG`_ interface file that includes the `SWIG`_ directives given +above will produce wrapper code that looks something like:: + + 1 PyObject *_wrap_rms(PyObject *args) { + 2 PyObject *resultobj = 0; + 3 double *arg1 = (double *) 0 ; + 4 int arg2 ; + 5 double result; + 6 PyArrayObject *array1 = NULL ; + 7 int is_new_object1 = 0 ; + 8 PyObject * obj0 = 0 ; + 9 + 10 if (!PyArg_ParseTuple(args,(char *)"O:rms",&obj0)) SWIG_fail; + 11 { + 12 array1 = obj_to_array_contiguous_allow_conversion( + 13 obj0, NPY_DOUBLE, &is_new_object1); + 14 npy_intp size[1] = { + 15 -1 + 16 }; + 17 if (!array1 || !require_dimensions(array1, 1) || + 18 !require_size(array1, size, 1)) SWIG_fail; + 19 arg1 = (double*) array1->data; + 20 arg2 = (int) array1->dimensions[0]; + 21 } + 22 result = (double)rms(arg1,arg2); + 23 resultobj = SWIG_From_double((double)(result)); + 24 { + 25 if (is_new_object1 && array1) Py_DECREF(array1); + 26 } + 27 return resultobj; + 28 fail: + 29 { + 30 if (is_new_object1 && array1) Py_DECREF(array1); + 31 } + 32 return NULL; + 33 } + +The typemaps from ``numpy.i`` are responsible for the following lines +of code: 12--20, 25 and 30. Line 10 parses the input to the ``rms`` +function. From the format string ``"O:rms"``, we can see that the +argument list is expected to be a single `python`_ object (specified +by the ``O`` before the colon) and whose pointer is stored in +``obj0``. A number of functions, supplied by ``numpy.i``, are called +to make and check the (possible) conversion from a generic `python`_ +object to a `NumPy`_ array. These functions are explained in the +section `Helper Functions`_, but hopefully their names are +self-explanatory. At line 12 we use ``obj0`` to construct a `NumPy`_ +array. At line 17, we check the validity of the result: that it is +non-null and that it has a single dimension of arbitrary length. Once +these states are verified, we extract the data buffer and length in +lines 19 and 20 so that we can call the underlying C function at line +22. Line 25 performs memory management for the case where we have +created a new array that is no longer needed. + +This code has a significant amount of error handling. Note the +``SWIG_fail`` is a macro for ``goto fail``, refering to the label at +line 28. If the user provides the wrong number of arguments, this +will be caught at line 10. If construction of the `NumPy`_ array +fails or produces an array with the wrong number of dimensions, these +errors are caught at line 17. And finally, if an error is detected, +memory is still managed correctly at line 30. + +Note that if the C function signature was in a different order:: + + double rms(int n, double* seq); + +that `SWIG`_ would not match the typemap signature given above with +the argument list for ``rms``. Fortunately, ``numpy.i`` has a set of +typemaps with the data pointer given last:: + + %apply (int DIM1, double* IN_ARRAY1) {(int n, double* seq)}; + +This simply has the effect of switching the definitions of ``arg1`` +and ``arg2`` in lines 3 and 4 of the generated code above, and their +assignments in lines 19 and 20. + +Using numpy.i +============= + +The ``numpy.i`` file is currently located in the ``numpy/docs/swig`` +sub-directory under the ``numpy`` installation directory. Typically, +you will want to copy it to the directory where you are developing +your wrappers. If it is ever adopted by `SWIG`_ developers, then it +will be installed in a standard place where `SWIG`_ can find it. + +A simple module that only uses a single `SWIG`_ interface file should +include the following:: + + %{ + #define SWIG_FILE_WITH_INIT + %} + %include "numpy.i" + %init %{ + import_array(); + %} + +Within a compiled `python`_ module, ``import_array()`` should only get +called once. This could be in a C/C++ file that you have written and +is linked to the module. If this is the case, then none of your +interface files should ``#define SWIG_FILE_WITH_INIT`` or call +``import_array()``. Or, this initialization call could be in a +wrapper file generated by `SWIG`_ from an interface file that has the +``%init`` block as above. If this is the case, and you have more than +one `SWIG`_ interface file, then only one interface file should +``#define SWIG_FILE_WITH_INIT`` and call ``import_array()``. + +Available Typemaps +================== + +The typemap directives provided by ``numpy.i`` for arrays of different +data types, say ``double`` and ``int``, and dimensions of different +types, say ``int`` or ``long``, are identical to one another except +for the C and `NumPy`_ type specifications. The typemaps are +therefore implemented (typically behind the scenes) via a macro:: + + %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE) + +that can be invoked for appropriate ``(DATA_TYPE, DATA_TYPECODE, +DIM_TYPE)`` triplets. For example:: + + %numpy_typemaps(double, NPY_DOUBLE, int) + %numpy_typemaps(int, NPY_INT , int) + +The ``numpy.i`` interface file uses the ``%numpy_typemaps`` macro to +implement typemaps for the following C data types and ``int`` +dimension types: + + * ``signed char`` + * ``unsigned char`` + * ``short`` + * ``unsigned short`` + * ``int`` + * ``unsigned int`` + * ``long`` + * ``unsigned long`` + * ``long long`` + * ``unsigned long long`` + * ``float`` + * ``double`` + +In the following descriptions, we reference a generic ``DATA_TYPE``, which +could be any of the C data types listed above. + +Input Arrays +------------ + +Input arrays are defined as arrays of data that are passed into a +routine but are not altered in-place or returned to the user. The +`python`_ input array is therefore allowed to be almost any `python`_ +sequence (such as a list) that can be converted to the requested type +of array. The input array signatures are + + * ``( DATA_TYPE IN_ARRAY1[ANY] )`` + * ``( DATA_TYPE* IN_ARRAY1, int DIM1 )`` + * ``( int DIM1, DATA_TYPE* IN_ARRAY1 )`` + * ``( DATA_TYPE IN_ARRAY2[ANY][ANY] )`` + * ``( DATA_TYPE* IN_ARRAY2, int DIM1, int DIM2 )`` + * ``( int DIM1, int DIM2, DATA_TYPE* IN_ARRAY2 )`` + * ``( DATA_TYPE IN_ARRAY3[ANY][ANY][ANY] )`` + * ``( DATA_TYPE* IN_ARRAY3, int DIM1, int DIM2, int DIM3 )`` + * ``( int DIM1, int DIM2, int DIM3, DATA_TYPE* IN_ARRAY3 )`` + +The first signature listed, ``( DATA_TYPE IN_ARRAY[ANY] )`` is for +one-dimensional arrays with hard-coded dimensions. Likewise, +``( DATA_TYPE IN_ARRAY2[ANY][ANY] )`` is for two-dimensional arrays +with hard-coded dimensions, and similarly for three-dimensional. + +In-Place Arrays +--------------- + +In-place arrays are defined as arrays that are modified in-place. The +input values may or may not be used, but the values at the time the +function returns are significant. The provided `python`_ argument +must therefore be a `NumPy`_ array of the required type. The in-place +signatures are + + * ``( DATA_TYPE INPLACE_ARRAY1[ANY] )`` + * ``( DATA_TYPE* INPLACE_ARRAY1, int DIM1 )`` + * ``( int DIM1, DATA_TYPE* INPLACE_ARRAY1 )`` + * ``( DATA_TYPE INPLACE_ARRAY2[ANY][ANY] )`` + * ``( DATA_TYPE* INPLACE_ARRAY2, int DIM1, int DIM2 )`` + * ``( int DIM1, int DIM2, DATA_TYPE* INPLACE_ARRAY2 )`` + * ``( DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY] )`` + * ``( DATA_TYPE* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3 )`` + * ``( int DIM1, int DIM2, int DIM3, DATA_TYPE* INPLACE_ARRAY3 )`` + +These typemaps now check to make sure that the ``INPLACE_ARRAY`` +arguments use native byte ordering. If not, an exception is raised. + +Argout Arrays +------------- + +Argout arrays are arrays that appear in the input arguments in C, but +are in fact output arrays. This pattern occurs often when there is +more than one output variable and the single return argument is +therefore not sufficient. In `python`_, the convential way to return +multiple arguments is to pack them into a sequence (tuple, list, etc.) +and return the sequence. This is what the argout typemaps do. If a +wrapped function that uses these argout typemaps has more than one +return argument, they are packed into a tuple or list, depending on +the version of `python`_. The `python`_ user does not pass these +arrays in, they simply get returned. The argout signatures are + + * ``( DATA_TYPE ARGOUT_ARRAY1[ANY] )`` + * ``( DATA_TYPE* ARGOUT_ARRAY1, int DIM1 )`` + * ``( int DIM1, DATA_TYPE* ARGOUT_ARRAY1 )`` + * ``( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )`` + * ``( DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY] )`` + +These are typically used in situations where in C/C++, you would +allocate a(n) array(s) on the heap, and call the function to fill the +array(s) values. In `python`_, the arrays are allocated for you and +returned as new array objects. + +Note that we support ``DATA_TYPE*`` argout typemaps in 1D, but not 2D +or 3D. This because of a quirk with the `SWIG`_ typemap syntax and +cannot be avoided. Note that for these types of 1D typemaps, the +`python`_ function will take a single argument representing ``DIM1``. + +Output Arrays +------------- + +The ``numpy.i`` interface file does not support typemaps for output +arrays, for several reasons. First, C/C++ return arguments are +limited to a single value. This prevents obtaining dimension +information in a general way. Second, arrays with hard-coded lengths +are not permitted as return arguments. In other words:: + + double[3] newVector(double x, double y, double z); + +is not legal C/C++ syntax. Therefore, we cannot provide typemaps of +the form:: + + %typemap(out) (TYPE[ANY]); + +If you run into a situation where a function or method is returning a +pointer to an array, your best bet is to write your own version of the +function to be wrapped, either with ``%extend`` for the case of class +methods or ``%ignore`` and ``%rename`` for the case of functions. + +Other Common Types: bool +------------------------ + +Note that C++ type ``bool`` is not supported in the list in the +`Available Typemaps`_ section. NumPy bools are a single byte, while +the C++ ``bool`` is four bytes (at least on my system). Therefore:: + + %numpy_typemaps(bool, NPY_BOOL, int) + +will result in typemaps that will produce code that reference +improper data lengths. You can implement the following macro +expansion:: + + %numpy_typemaps(bool, NPY_UINT, int) + +to fix the data length problem, and `Input Arrays`_ will work fine, +but `In-Place Arrays`_ might fail type-checking. + +Other Common Types: complex +--------------------------- + +Typemap conversions for complex floating-point types is also not +supported automatically. This is because `python`_ and `NumPy`_ are +written in C, which does not have native complex types. Both +`python`_ and `NumPy`_ implement their own (essentially equivalent) +``struct`` definitions for complex variables:: + + /* Python */ + typedef struct {double real; double imag;} Py_complex; + + /* NumPy */ + typedef struct {float real, imag;} npy_cfloat; + typedef struct {double real, imag;} npy_cdouble; + +We could have implemented:: + + %numpy_typemaps(Py_complex , NPY_CDOUBLE, int) + %numpy_typemaps(npy_cfloat , NPY_CFLOAT , int) + %numpy_typemaps(npy_cdouble, NPY_CDOUBLE, int) + +which would have provided automatic type conversions for arrays of +type ``Py_complex``, ``npy_cfloat`` and ``npy_cdouble``. However, it +seemed unlikely that there would be any independent (non-`python`_, +non-`NumPy`_) application code that people would be using `SWIG`_ to +generate a `python`_ interface to, that also used these definitions +for complex types. More likely, these application codes will define +their own complex types, or in the case of C++, use ``std::complex``. +Assuming these data structures are compatible with `python`_ and +`NumPy`_ complex types, ``%numpy_typemap`` expansions as above (with +the user's complex type substituted for the first argument) should +work. + +Helper Functions +================ + +The ``numpy.i`` file containes several macros and routines that it +uses internally to build its typemaps. However, these functions may +be useful elsewhere in your interface file. + +Macros +------ + + **is_array(a)** + Evaluates as true if ``a`` is non-``NULL`` and can be cast to a + ``PyArrayObject*``. + + **array_type(a)** + Evaluates to the integer data type code of ``a``, assuming ``a`` can + be cast to a ``PyArrayObject*``. + + **array_numdims(a)** + Evaluates to the integer number of dimensions of ``a``, assuming + ``a`` can be cast to a ``PyArrayObject*``. + + **array_dimensions(a)** + Evaluates to an array of type ``npy_intp`` and length + ``array_numdims(a)``, giving the lengths of all of the dimensions + of ``a``, assuming ``a`` can be cast to a ``PyArrayObject*``. + + **array_size(a,i)** + Evaluates to the ``i``-th dimension size of ``a``, assuming ``a`` + can be cast to a ``PyArrayObject*``. + + **array_data(a)** + Evaluates to a pointer of type ``void*`` that points to the data + buffer of ``a``, assuming ``a`` can be cast to a ``PyArrayObject*``. + + **array_is_contiguous(a)** + Evaluates as true if ``a`` is a contiguous array. Equivalent to + ``(PyArray_ISCONTIGUOUS(a))``. + + **array_is_native(a)** + Evaluates as true if the data buffer of ``a`` uses native byte + order. Equivalent to ``(PyArray_ISNOTSWAPPED(a))``. + +Routines +-------- + + **pytype_string()** + + Return type: ``char*`` + + Arguments: + + * ``PyObject* py_obj``, a general `python`_ object. + + Return a string describing the type of ``py_obj``. + + + **typecode_string()** + + Return type: ``char*`` + + Arguments: + + * ``int typecode``, a `NumPy`_ integer typecode. + + Return a string describing the type corresponding to the `NumPy`_ + ``typecode``. + + **type_match()** + + Return type: ``int`` + + Arguments: + + * ``int actual_type``, the `NumPy`_ typecode of a `NumPy`_ array. + + * ``int desired_type``, the desired `NumPy`_ typecode. + + Make sure that ``actual_type`` is compatible with + ``desired_type``. For example, this allows character and + byte types, or int and long types, to match. This is now + equivalent to ``PyArray_EquivTypenums()``. + + + **obj_to_array_no_conversion()** + + Return type: ``PyArrayObject*`` + + Arguments: + + * ``PyObject* input``, a general `python`_ object. + + * ``int typecode``, the desired `NumPy`_ typecode. + + Cast ``input`` to a ``PyArrayObject*`` if legal, and ensure that + it is of type ``typecode``. If ``input`` cannot be cast, or the + ``typecode`` is wrong, set a `python`_ error and return ``NULL``. + + + **obj_to_array_allow_conversion()** + + Return type: ``PyArrayObject*`` + + Arguments: + + * ``PyObject* input``, a general `python`_ object. + + * ``int typecode``, the desired `NumPy`_ typecode of the resulting + array. + + * ``int* is_new_object``, returns a value of 0 if no conversion + performed, else 1. + + Convert ``input`` to a `NumPy`_ array with the given ``typecode``. + On success, return a valid ``PyArrayObject*`` with the correct + type. On failure, the `python`_ error string will be set and the + routine returns ``NULL``. + + + **make_contiguous()** + + Return type: ``PyArrayObject*`` + + Arguments: + + * ``PyArrayObject* ary``, a `NumPy`_ array. + + * ``int* is_new_object``, returns a value of 0 if no conversion + performed, else 1. + + * ``int min_dims``, minimum allowable dimensions. + + * ``int max_dims``, maximum allowable dimensions. + + Check to see if ``ary`` is contiguous. If so, return the input + pointer and flag it as not a new object. If it is not contiguous, + create a new ``PyArrayObject*`` using the original data, flag it + as a new object and return the pointer. + + + **obj_to_array_contiguous_allow_conversion()** + + Return type: ``PyArrayObject*`` + + Arguments: + + * ``PyObject* input``, a general `python`_ object. + + * ``int typecode``, the desired `NumPy`_ typecode of the resulting + array. + + * ``int* is_new_object``, returns a value of 0 if no conversion + performed, else 1. + + Convert ``input`` to a contiguous ``PyArrayObject*`` of the + specified type. If the input object is not a contiguous + ``PyArrayObject*``, a new one will be created and the new object + flag will be set. + + + **require_contiguous()** + + Return type: ``int`` + + Arguments: + + * ``PyArrayObject* ary``, a `NumPy`_ array. + + Test whether ``ary`` is contiguous. If so, return 1. Otherwise, + set a `python`_ error and return 0. + + + **require_native()** + + Return type: ``int`` + + Arguments: + + * ``PyArray_Object* ary``, a `NumPy`_ array. + + Require that ``ary`` is not byte-swapped. If the array is not + byte-swapped, return 1. Otherwise, set a `python`_ error and + return 0. + + **require_dimensions()** + + Return type: ``int`` + + Arguments: + + * ``PyArrayObject* ary``, a `NumPy`_ array. + + * ``int exact_dimensions``, the desired number of dimensions. + + Require ``ary`` to have a specified number of dimensions. If the + array has the specified number of dimensions, return 1. + Otherwise, set a `python`_ error and return 0. + + + **require_dimensions_n()** + + Return type: ``int`` + + Arguments: + + * ``PyArrayObject* ary``, a `NumPy`_ array. + + * ``int* exact_dimensions``, an array of integers representing + acceptable numbers of dimensions. + + * ``int n``, the length of ``exact_dimensions``. + + Require ``ary`` to have one of a list of specified number of + dimensions. If the array has one of the specified number of + dimensions, return 1. Otherwise, set the `python`_ error string + and return 0. + + + **require_size()** + + Return type: ``int`` + + Arguments: + + * ``PyArrayObject* ary``, a `NumPy`_ array. + + * ``npy_int* size``, an array representing the desired lengths of + each dimension. + + * ``int n``, the length of ``size``. + + Require ``ary`` to have a specified shape. If the array has the + specified shape, return 1. Otherwise, set the `python`_ error + string and return 0. + + +Beyond the Provided Typemaps +============================ + +There are many C or C++ array/`NumPy`_ array situations not covered by +a simple ``%include "numpy.i"`` and subsequent ``%apply`` directives. + +A Common Example +---------------- + +Consider a reasonable prototype for a dot product function:: + + double dot(int len, double* vec1, double* vec2); + +The `python`_ interface that we want is:: + + def dot(vec1, vec2): + """ + dot(PyObject,PyObject) -> double + """ + +The problem here is that there is one dimension argument and two array +arguments, and our typemaps are set up for dimensions that apply to a +single array (in fact, `SWIG`_ does not provide a mechanism for +associating ``len`` with ``vec2`` that takes two `python`_ input +arguments). The recommended solution is the following:: + + %apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1), + (int len2, double* vec2)} + %rename (dot) my_dot; + %exception my_dot { + $action + if (PyErr_Occurred()) SWIG_fail; + } + %inline %{ + double my_dot(int len1, double* vec1, int len2, double* vec2) { + if (len1 != len2) { + PyErr_Format(PyExc_ValueError, + "Arrays of lengths (%d,%d) given", + len1, len2); + return 0.0; + } + return dot(len1, vec1, vec2); + } + %} + +If the header file that contains the prototype for ``double dot()`` +also contains other prototypes that you want to wrap, so that you need +to ``%include`` this header file, then you will also need a ``%ignore +dot;`` directive, placed after the ``%rename`` and before the +``%include`` directives. Or, if the function in question is a class +method, you will want to use ``%extend`` rather than ``%inline`` in +addition to ``%ignore``. + +**A note on error handling:** Note that ``my_dot`` returns a +``double`` but that it can also raise a `python`_ error. The +resulting wrapper function will return a `python`_ float +representation of 0.0 when the vector lengths do not match. Since +this is not ``NULL``, the `python`_ interpreter will not know to check +for an error. For this reason, we add the ``%exception`` directive +above for ``my_dot`` to get the behavior we want (note that +``$action`` is a macro that gets expanded to a valid call to +``my_dot``). In general, you will probably want to write a `SWIG`_ +macro to perform this task. + +Other Situations +---------------- + +There are other wrapping situations in which ``numpy.i`` may be +helpful when you encounter them. + + * In some situations, it is possible that you could use the + ``%numpy_templates`` macro to implement typemaps for your own + types. See the `Other Common Types: bool`_ or `Other Common + Types: complex`_ sections for examples. Another situation is if + your dimensions are of a type other than ``int`` (say ``long`` for + example):: + + %numpy_typemaps(double, NPY_DOUBLE, long) + + * You can use the code in ``numpy.i`` to write your own typemaps. + For example, if you had a four-dimensional array as a function + argument, you could cut-and-paste the appropriate + three-dimensional typemaps into your interface file. The + modifications for the fourth dimension would be trivial. + + * Sometimes, the best approach is to use the ``%extend`` directive + to define new methods for your classes (or overload existing ones) + that take a ``PyObject*`` (that either is or can be converted to a + ``PyArrayObject*``) instead of a pointer to a buffer. In this + case, the helper routines in ``numpy.i`` can be very useful. + + * Writing typemaps can be a bit nonintuitive. If you have specific + questions about writing `SWIG`_ typemaps for `NumPy`_, the + developers of ``numpy.i`` do monitor the + `Numpy-discussion `_ and + `Swig-user `_ mail lists. + +A Final Note +------------ + +When you use the ``%apply`` directive, as is usually necessary to use +``numpy.i``, it will remain in effect until you tell `SWIG`_ that it +shouldn't be. If the arguments to the functions or methods that you +are wrapping have common names, such as ``length`` or ``vector``, +these typemaps may get applied in situations you do not expect or +want. Therefore, it is always a good idea to add a ``%clear`` +directive after you are done with a specific typemap:: + + %apply (double* IN_ARRAY1, int DIM1) {(double* vector, int length)} + %include "my_header.h" + %clear (double* vector, int length); + +In general, you should target these typemap signatures specifically +where you want them, and then clear them after you are done. + +Summary +======= + +Out of the box, ``numpy.i`` provides typemaps that support conversion +between `NumPy`_ arrays and C arrays: + + * That can be one of 12 different scalar types: ``signed char``, + ``unsigned char``, ``short``, ``unsigned short``, ``int``, + ``unsigned int``, ``long``, ``unsigned long``, ``long long``, + ``unsigned long long``, ``float`` and ``double``. + + * That support 23 different argument signatures for each data type, + including: + + + One-dimensional, two-dimensional and three-dimensional arrays. + + + Input-only, in-place, and argout behavior. + + + Hard-coded dimensions, data-buffer-then-dimensions + specification, and dimensions-then-data-buffer specification. + +The ``numpy.i`` interface file also provides additional tools for +wrapper developers, including: + + * A `SWIG`_ macro (``%numpy_typemaps``) with three arguments for + implementing the 23 argument signatures for the user's choice of + (1) C data type, (2) `NumPy`_ data type (assuming they match), and + (3) dimension type. + + * Seven C macros and eleven C functions that can be used to write + specialized typemaps, extensions, or inlined functions that handle + cases not covered by the provided typemaps. + +Acknowledgements +================ + +Many people have worked to glue `SWIG`_ and `NumPy`_ together (as well +as `SWIG`_ and the predecessors of `NumPy`_, Numeric and numarray). +The effort to standardize this work into ``numpy.i`` began at the 2005 +`SciPy `_ Conference with a conversation between +Fernando Perez and myself. Fernando collected helper functions and +typemaps from Michael Hunter, Anna Omelchenko and Michael Sanner. +Sebastian Hasse has also provided additional error checking and use +cases. The work of these contributors has made this end result +possible. Added: trunk/numpy/doc/swig/doc/testing.html =================================================================== --- trunk/numpy/doc/swig/doc/testing.html 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/doc/testing.html 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,482 @@ + + + + + +Testing the numpy.i Typemaps + + + + + +
+

Testing the numpy.i Typemaps

+ +++ + + + + + + + +
Author:Bill Spotz
Institution:Sandia National Laboratories
Date:6 April, 2007
+
+
+

Introduction

+

Writing tests for the numpy.i SWIG +interface file is a combinatorial headache. At present, 12 different +data types are supported, each with 23 different argument signatures, +for a total of 276 typemaps supported "out of the box". Each of these +typemaps, in turn, might require several unit tests in order to verify +expected behavior for both proper and improper inputs. Currently, +this results in 1,020 individual unit tests that are performed when +make test is run in the numpy/docs/swig subdirectory.

+

To facilitate this many similar unit tests, some high-level +programming techniques are employed, including C and SWIG macros, +as well as python inheritance. The +purpose of this document is to describe the testing infrastructure +employed to verify that the numpy.i typemaps are working as +expected.

+
+
+

Testing Organization

+

There are three indepedent testing frameworks supported, for one-, +two-, and three-dimensional arrays respectively. For one-dimensional +arrays, there are two C++ files, a header and a source, named:

+
+Vector.h
+Vector.cxx
+
+

that contain prototypes and code for a variety of functions that have +one-dimensional arrays as function arguments. The file:

+
+Vector.i
+
+

is a SWIG interface file that defines a python module Vector +that wraps the functions in Vector.h while utilizing the typemaps +in numpy.i to correctly handle the C arrays.

+

The Makefile calls swig to generate Vector.py and +Vector_wrap.cxx, and also executes the setup.py script that +compiles Vector_wrap.cxx and links together the extension module +_Vector.so or _Vector.dylib, depending on the platform. This +extension module and the proxy file Vector.py are both placed in a +subdirectory under the build directory.

+

The actual testing takes place with a python script named:

+
+testVector.py
+
+

that uses the standard python library module unittest, which +performs several tests of each function defined in Vector.h for +each data type supported.

+

Two-dimensional arrays are tested in exactly the same manner. The +above description applies, but with Matrix substituted for +Vector. For three-dimensional tests, substitute Tensor for +Vector. For the descriptions that follow, we will reference the +Vector tests, but the same information applies to Matrix and +Tensor tests.

+

The command make test will ensure that all of the test software is +built and then run all three test scripts.

+
+
+

Testing Header Files

+

Vector.h is a C++ header file that defines a C macro called +TEST_FUNC_PROTOS that takes two arguments: TYPE, which is a +data type name such as unsigned int; and SNAME, which is a +short name for the same data type with no spaces, e.g. uint. This +macro defines several function prototypes that have the prefix +SNAME and have at least one argument that is an array of type +TYPE. Those functions that have return arguments return a +TYPE value.

+

TEST_FUNC_PROTOS is then implemented for all of the data types +supported by numpy.i:

+
+
    +
  • signed char
  • +
  • unsigned char
  • +
  • short
  • +
  • unsigned short
  • +
  • int
  • +
  • unsigned int
  • +
  • long
  • +
  • unsigned long
  • +
  • long long
  • +
  • unsigned long long
  • +
  • float
  • +
  • double
  • +
+
+
+
+

Testing Source Files

+

Vector.cxx is a C++ source file that implements compilable code +for each of the function prototypes specified in Vector.h. It +defines a C macro TEST_FUNCS that has the same arguments and works +in the same way as TEST_FUNC_PROTOS does in Vector.h. +TEST_FUNCS is implemented for each of the 12 data types as above.

+
+
+

Testing SWIG Interface Files

+

Vector.i is a SWIG interface file that defines python module +Vector. It follows the conventions for using numpy.i as +described in the numpy.i documentation. It +defines a SWIG macro %apply_numpy_typemaps that has a single +argument TYPE. It uses the SWIG directive %apply as +described in the numpy.i documentation to apply the provided +typemaps to the argument signatures found in Vector.h. This macro +is then implemented for all of the data types supported by +numpy.i. It then does a %include "Vector.h" to wrap all of +the function prototypes in Vector.h using the typemaps in +numpy.i.

+
+
+

Testing Python Scripts

+

After make is used to build the testing extension modules, +testVector.py can be run to execute the tests. As with other +scripts that use unittest to facilitate unit testing, +testVector.py defines a class that inherits from +unittest.TestCase:

+
+class VectorTestCase(unittest.TestCase):
+
+

However, this class is not run directly. Rather, it serves as a base +class to several other python classes, each one specific to a +particular data type. The VectorTestCase class stores two strings +for typing information:

+
+
+
self.typeStr
+
A string that matches one of the SNAME prefixes used in +Vector.h and Vector.cxx. For example, "double".
+
self.typeCode
+
A short (typically single-character) string that represents a +data type in numpy and corresponds to self.typeStr. For +example, if self.typeStr is "double", then +self.typeCode should be "d".
+
+
+

Each test defined by the VectorTestCase class extracts the python +function it is trying to test by accessing the Vector module's +dictionary:

+
+length = Vector.__dict__[self.typeStr + "Length"]
+
+

In the case of double precision tests, this will return the python +function Vector.doubleLength.

+

We then define a new test case class for each supported data type with +a short definition such as:

+
+class doubleTestCase(VectorTestCase):
+    def __init__(self, methodName="runTest"):
+        VectorTestCase.__init__(self, methodName)
+        self.typeStr  = "double"
+        self.typeCode = "d"
+
+

Each of these 12 classes is collected into a unittest.TestSuite, +which is then executed. Errors and failures are summed together and +returned as the exit argument. Any non-zero result indicates that at +least one test did not pass.

+
+
+ + + Added: trunk/numpy/doc/swig/doc/testing.pdf =================================================================== --- trunk/numpy/doc/swig/doc/testing.pdf 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/doc/testing.pdf 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,1016 @@ +%PDF-1.4 +5 0 obj +<< /S /GoTo /D (contents.0) >> +endobj +8 0 obj +(Contents) +endobj +9 0 obj +<< /S /GoTo /D (introduction.0) >> +endobj +12 0 obj +(Introduction) +endobj +13 0 obj +<< /S /GoTo /D (testing-organization.0) >> +endobj +16 0 obj +(Testing Organization) +endobj +17 0 obj +<< /S /GoTo /D (testing-header-files.0) >> +endobj +20 0 obj +(Testing Header Files) +endobj +21 0 obj +<< /S /GoTo /D (testing-source-files.0) >> +endobj +24 0 obj +(Testing Source Files) +endobj +25 0 obj +<< /S /GoTo /D (testing-swig-interface-files.0) >> +endobj +28 0 obj +(Testing SWIG Interface Files) +endobj +29 0 obj +<< /S /GoTo /D (testing-python-scripts.0) >> +endobj +32 0 obj +(Testing Python Scripts) +endobj +33 0 obj +<< /S /GoTo /D [34 0 R /Fit ] >> +endobj +36 0 obj << +/Length 2238 +/Filter /FlateDecode +>> +stream +x??Y[??~???4?X??>???????-?yh?0?f?B,i+im?}???p4??.???(??^?m?]? e?????[`gp?2???Z?=??@?? ??;?#>????!AP???#6?2|A~t???'???F6lc&O8?$4B???P?m??? ???????R^????8?4cI?4?0??GL?d?????"U? k??8?I'l-?WDD?????G$?#???E??N?/o ?F?/?F4MX? L???C"??????E???#???1???d???s?8_N-J>&`Q??zfb???.?,,??yX~??w????!?C?n1hZJ??@?Y?????JH????=??m(??c?b?KwXr_?u ???9 ?Q???D4b +=??????det-?????8???>7k? &??z?TrB??iLN???+??pf?h??k????]c]?/\??!??CLU?b?u??)?? e??!.????3????zt(?T??5s?3C?????o?NCT^?O???k-M?4??%? Uk0?>??2?????8??M)?e?v?;???:???k??0]*??s?Y{?WJ???`?4q?(=?^'Ah???umc??q?a?c.}!??t{baq|~?&r????Y2???0??Tw?1???????d????-??`??[??? L?;??????\?#?8?e??w?r?????C2d\????W?Jm(?? +???U?"M??a????????a???h???3?b????????hzyg????RAU{?.??|????;8??x6??????+?~????j?p_?????D|????j=?{L_u?z=?????vwd???Td?x?6?]??Z%?&;???????x?}?$]r??????M?&!_9G?G ?? ?k7?e?h????/$HA???????}L ?^?6????1s???I RP????L(??n????=?A?E??$?'???w>?????????8???????? ?????h??? +????"????#_?????v?g#?S???I?l?IM??:?2 ??[CQ7???B?f?:??T??h?^????i??}{?? G?}:?=???s7?YP ???????t?KJ????yov?-E????ep????`?8???L%????{R?D?m??z?\?$??a???}?`3????7?aS??5?K?4h?)?2???$?C?K!??PNY?.\#????:?????j?#??7U{fX>"?]|-#??-???B/?e?$?Y??D?S?. +?kN<?A?Y?2?<?? u?,?.?????RN?? +?,Y-?w_$?XE??ez??aaj??????3]?v?-?9??1A?/??B?????RR???????(F{NO_??+Wf?? W?1??d?i??????8????%????p??SW?TYH?????"??c???a?p???{H??Z????>???U???{??k[L???????o+W?\c??-M=N?+?(?????K?6???r???P?????????U??-? +???MS?lK\??,S?G????'u??S*"?}#??Y?N.?8?????????"??l?I6^^Y~a??1p???o`??\v????C??????bOt.???+7~?????????????2?Wh?`C???.n??(S?????u4?cd]?M????D?#?Z?????e(??e????\???5??EQ?R? 8%E?x?????Lny???>?????OA?XZ?????%?? +rJ$ +????B#??=o????S??y?4{???A????[I?4?' ?????-?x?@3?s??{????8?_??? ?1??C??'!+??:?j??NM??_{???endstream +endobj +34 0 obj << +/Type /Page +/Contents 36 0 R +/Resources 35 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 69 0 R +/Annots [ 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 64 0 R 65 0 R 66 0 R ] +>> endobj +50 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 572.1561 154.7972 581.0627] +/Subtype /Link +/A << /S /GoTo /D (introduction) >> +>> endobj +51 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 550.2982 191.9077 560.9481] +/Subtype /Link +/A << /S /GoTo /D (testing-organization) >> +>> endobj +52 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 530.3729 189.8853 541.2121] +/Subtype /Link +/A << /S /GoTo /D (testing-header-files) >> +>> endobj +53 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 510.4476 187.9425 521.2868] +/Subtype /Link +/A << /S /GoTo /D (testing-source-files) >> +>> endobj +54 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 490.5223 227.5535 501.3616] +/Subtype /Link +/A << /S /GoTo /D (testing-swig-interface-files) >> +>> endobj +55 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [98.3198 470.597 200.6545 481.4363] +/Subtype /Link +/A << /S /GoTo /D (testing-python-scripts) >> +>> endobj +64 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [204.9922 405.6211 234.1526 416.7393] +/Subtype/Link/A<> +>> endobj +65 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [136.0988 334.1691 165.2593 345.0083] +/Subtype/Link/A<> +>> endobj +66 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [244.5817 334.1691 276.9898 345.0083] +/Subtype/Link/A<> +>> endobj +37 0 obj << +/D [34 0 R /XYZ 74.4095 789.6651 null] +>> endobj +38 0 obj << +/D [34 0 R /XYZ 74.4095 771.7323 null] +>> endobj +48 0 obj << +/D [34 0 R /XYZ 74.4095 613.3264 null] +>> endobj +6 0 obj << +/D [34 0 R /XYZ 74.4095 613.3264 null] +>> endobj +49 0 obj << +/D [34 0 R /XYZ 74.4095 585.1076 null] +>> endobj +56 0 obj << +/D [34 0 R /XYZ 74.4095 461.6307 null] +>> endobj +10 0 obj << +/D [34 0 R /XYZ 74.4095 461.6307 null] +>> endobj +60 0 obj << +/D [34 0 R /XYZ 74.4095 420.7842 null] +>> endobj +67 0 obj << +/D [34 0 R /XYZ 74.4095 322.9312 null] +>> endobj +14 0 obj << +/D [34 0 R /XYZ 74.4095 322.9312 null] +>> endobj +68 0 obj << +/D [34 0 R /XYZ 74.4095 279.5807 null] +>> endobj +35 0 obj << +/Font << /F39 41 0 R /F44 44 0 R /F8 47 0 R /F51 59 0 R /F56 63 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +76 0 obj << +/Length 3176 +/Filter /FlateDecode +>> +stream +x??[m?????_??:$???.?Om?)????-??(h??|?%$9???wf???\?:??!?"?;3??;ylE?[I$?????h??j?EWp??W,?H??T????????X??j?/???W_????t????? +? %??hF?????????>?lc???_?z??mZ?QC8Sv??q?K??@?s&G???7??/???A?????!$V?J? +?D??\"-Sc7??/p?;?????;???)???=^?g???\?7]???@v?????z???s3?w???l????;?{???9vR?Ya??8v#?7?J?;?}????n??wA?? B8?.?i???c????J??a#?w???pqR!a??????[????c?????l????x +0????:p??=Bw???&???>?????(g?rzZ ?#??? ??&L?s?t??? [?????&?'c? 7o??????#???9,?0^?+?Q?J?????!zj??H)???]a?~G?'????aO1B?]?????)@?x#?G??7??#?/As???l?9@????):F < ??????BDgK_;.????a??Pnm???)???[b#?.??~?=??r?j +?+%??V??2?Z#?(f "?`?\R????.9??Tj???y#c??k?n??1???'`????,?/@=?p???s?~?K??q?9 ???!@?bE50U0 A?????uDB?/"???!??uh??.k$???;?C?{????5?5?????!???]??4????]t?????w?? +?.???4? !?qj!?+QZ?m??m?W?????2??J?_???????O??(J?YF??"?i???_?mcL??{m????&????JL????I????Y?W?????????5?P????5????)?^?T??G?i?-????t?????vP}???z?? +???o0?yt2?9t"?2:sl3tj???|??????D?#?y?3?9?#???sl3?k?*?|_?"5Q?t%A?T2?9T"?2*sl3Tj???|??????jCm)-4??jgTsjG?e???fj?|'???^a ?!C%?/?, ?Q?!????c?!S??@&?[?}=?Z??T?H?T3H$?E$f?H????(???F^??Dk?P??Ts`E?e???f`?|'??????%q?????????y?3?9?#???sl3?k???|?????[????Lo$?\J??????P?9~8?7x>?hz?%B??\?#j??o2QC?t?}?? ??#jY?te???7?HU?D??-W?/Q?3????g??????|?.???y!???? B"L??@????U???2(F????Ny??? ??????0_??_?0?f???h????z???M??8??5????? W?G4??"NN?P?8????s?S??+?=Z?????"?W??w?[??I???:p|???~?^~!SC???????H????o?u +???i%??????I5??:`?endstream +endobj +75 0 obj << +/Type /Page +/Contents 76 0 R +/Resources 74 0 R +/MediaBox [0 0 595.2757 841.8898] +/Parent 69 0 R +/Annots [ 78 0 R 79 0 R 80 0 R ] +>> endobj +78 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [106.2195 758.8407 135.3799 769.68] +/Subtype/Link/A<> +>> endobj +79 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [253.2366 687.1097 285.6447 697.949] +/Subtype/Link/A<> +>> endobj +80 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [185.549 647.2592 217.9571 658.0984] +/Subtype/Link/A<> +>> endobj +77 0 obj << +/D [75 0 R /XYZ 74.4095 789.6651 null] +>> endobj +70 0 obj << +/D [75 0 R /XYZ 74.4095 564.5693 null] +>> endobj +18 0 obj << +/D [75 0 R /XYZ 74.4095 564.5693 null] +>> endobj +81 0 obj << +/D [75 0 R /XYZ 74.4095 520.9398 null] +>> endobj +71 0 obj << +/D [75 0 R /XYZ 74.4095 248.7539 null] +>> endobj +22 0 obj << +/D [75 0 R /XYZ 74.4095 248.7539 null] +>> endobj +85 0 obj << +/D [75 0 R /XYZ 74.4095 203.1918 null] +>> endobj +72 0 obj << +/D [75 0 R /XYZ 74.4095 156.2214 null] +>> endobj +26 0 obj << +/D [75 0 R /XYZ 74.4095 156.2214 null] +>> endobj +74 0 obj << +/Font << /F8 47 0 R /F56 63 0 R /F51 59 0 R /F14 84 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +88 0 obj << +/Length 3303 +/Filter /FlateDecode +>> +stream +x??ko???{~???5?e????!M?4E{8\???!Pve{Q{?X?/w???!?%Q??\?+QCr?/*?????VLUN???1c4???>??????'?`?2LiS?C??Z??Yc??:_??O??n?bR????~/?Ym\}v??quq?????????_??e?W?????7?o?????K?o??????? L???o??9s?ap??l-8???~?????.p?:??????6???5R?sw?????3?>yu?H??0a+???????W?+??!?T?_?L?=?o??????r?5hf????r??Wr&??4????0???@ Rv??=???'????J7Po?e??D T J_B?D:???K:wW?j??^e?F????f?,?4?>??,H??ZSF?? >u???[??i?X}?????????@???d7L\BF,H?%[5?U?:3?=-yJ?D??z0?? a??x??k"g?~#OLA_J??X{?d?????:??R?'}??67??H +~?GX>?G??Fz?ccf?I?\????z!?WN?G (?y1{I?????B???8??@ x?])? +? -g:?z4?t??S?0?`?*+???[N2??o?t?}???(,3 Da4Y8?????BO??kaM???W??? ug???]?8??ppd????d??"+????X??(?'??7'DzjN????,???N???EN3]91?? }????U???|*?1?\q??$??????????????q??\????J??B_3?+>bI?|5?8?i ?Cr? +?2???x????e??(U?Q?b??: ?????/w???"A-4??4????????}1:???e?3z??Hq??;?ga?- 'c$???????%?t??tL??2?fh'_???3?i?4 ???????y??nLa?d?a??G???p?!=??`"????U8???b?6|??E???a<}J +??'??????m5????J???r&????w?.;j;?I'?6???Z}?N1??EF??????W[?T\??4???i??> ~?LZ1????e???#)??r??????[??9????vq?JT?/?h +???<` ?1??6??#-???>??i????1?rUDML2i?]?,$?N?? ?&?p*????&??>?????6}???@> endobj +91 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [135.2839 737.0327 164.4443 747.8719] +/Subtype/Link/A<> +>> endobj +92 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [208.3454 724.7985 311.5372 735.9168] +/Subtype/Link/A<> +>> endobj +93 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [364.7967 724.7985 393.9571 735.9168] +/Subtype/Link/A<> +>> endobj +94 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [268.4471 712.8434 297.6075 723.9616] +/Subtype/Link/A<> +>> endobj +95 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [458.303 712.8434 521.8625 723.9616] +/Subtype/Link/A<> +>> endobj +96 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [73.4132 701.1672 119.3703 712.0064] +/Subtype/Link/A<> +>> endobj +101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [324.6699 247.1243 360.0704 257.0788] +/Subtype/Link/A<> +>> endobj +102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [382.9052 247.1243 454.0182 257.0788] +/Subtype/Link/A<> +>> endobj +89 0 obj << +/D [87 0 R /XYZ 74.4095 789.6651 null] +>> endobj +90 0 obj << +/D [87 0 R /XYZ 74.4095 749.1338 null] +>> endobj +73 0 obj << +/D [87 0 R /XYZ 74.4095 677.9741 null] +>> endobj +30 0 obj << +/D [87 0 R /XYZ 74.4095 677.9741 null] +>> endobj +97 0 obj << +/D [87 0 R /XYZ 74.4095 634.6237 null] +>> endobj +86 0 obj << +/Font << /F51 59 0 R /F56 63 0 R /F8 47 0 R /F44 44 0 R /F58 100 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +99 0 obj << +/Length1 1213 +/Length2 5760 +/Length3 532 +/Length 6527 +/Filter /FlateDecode +>> +stream +x???w? 0?y?P^0{ar11?=????n?"??ts@??????;?Cy?Lxq&?8??H7?/??@.????????o?????????)????B\????#]?1h +???????Yj +??5m?=????&??C??0???BpO ??^??: O?_q????M???? #c#-????WJwC???-?g?_,??q?A?}?????b?B???????J? ?????????BA|?q?G?1?????????!??G???(???)! q?uw????WH + ??[??WH ?C!???o?????%?p????V?k? ?????4@? ??? ?@?*?????"\^?o?????7??D ?@???Z?M?;(?E8M?_?;?o????7?u??? ???o??? q?????? ?p?n?!N????~??G????? q???B?????o?S?? ?? UQA?? ??B ???D?????????A?`n??^~?=?7;?qo ???OO ?r???5a?A???%???*???:U??5S??Y?ao3???mF??#??? +?7?/???? +Vl?l???^????#?k|??.>??]|??g?5????tr_??I?gJY??'lr?d??????Q?[??q??87"$B?=???s?g?4????_ur?4???2?+???%"?&l???&w#??Q??ba?6?4L?/???????{ ?P???m??e???iJ????$????^???D???|?s?n?VF?x?2?'l?t?"??QQ??]?5??9g??2?{?Cp??? ???k?E??5??<(6f??u???&???"g &eJ*4V2????f????jJ?d??!????{.&L???r?3???[?r??H?????o??????/???gN??C?_3.?W?MW?wY?????(????&+???I,?+????????6v?3Y????????)??????j/>?????qL????h??m? +nr-L????!????????Uj????e{?????u?? ?7?9?|???@?eT??G*b ?/?) ? #|Ks??Z?tu ?t?5??I?r ??? +j??????_?P?Y?vM?????5P?? ?^?Y??e?x?G-:????q?W? "?u??5??j???"????:???b- O??????Hg-?}??1?m???*??.?En?l{?-h?v????P?}#?}??? M????B9?6?????Hr?????W?? 5?????K)?? ??????E?U?ym5????=??R ?t|?? ??^?B}[???#????Dxb?B P?C?j????l@?U ??GeK?(????I?[?:?/= /24?)?KQPb??|r?U??5?<.??)j??~????????????$Ml ?P-???o?c?(2kVg??? ??S??u??'o?oJ?W???w;? ? +??,4??[H ?Dr?;????-?`?T?g?fr?$????E??*?]????L??g3H?D?a1?E??xT|??8???c???????b??W???-?1?3(???JE4?8?n????>c]?v2??s;??2?\J?-?x???,???=????Q6%h??)???{?i???????9?Lw?7? ?_ ?32?Ih?7}.?[ +Q?&?B ??T?tC??ug?J+M?3??XC?}????E?:??j:?Q/d??B????U?& h???P+%?x????s4???????gR??"?<%ws+~?K25?????>:_f?h??[ ??Y??3?????"???????TN??O?)????d????$??81ta????yL??-???C????s??Y +unq?m3??7> ~|j??k+??y???e????????!??e??Ss?W?&??'prw???6*?E??H'???u"??2???????Kr]? ???_?(??9a???I?fO????????Xq?Z???mj?1i??q?k?'?-5o?+???????:??\b?Hx?]=?O?n?ce)r?vH;?i????*???F?)???d???????v7?#?w?????D?NG8GH???wf_?s?????OL0/??[y??ro??aX>o???U?\?E?s?M'(,??s??m?*????? ????F?????0,p:???qtG?ik}??%'I?/DJ?>??)cx??~?????. ?dL?/\8?????wR??C?4??? @?Q??K?7^?-? }?#g]????5???>????????W?e?AZ?9?!.?N??d?rU8???9?>#?-?j??m??????h??????E?T?U??n????AW?RIS??m7???t2?]^I?c???r?F?-?S5????F?3&Sr??2??? ????t???D???>??? ??Y?????????????N? E???J???,&??#pl??????ul?Jt?M??V-O?@???m???8???L??????*m???~?w??6k)w`???????:???,???L??R???7?"?q(K'Q????x:?po????h?Y??78???t?_3?,_?GD\`?'?sh??bi??v??O$j?Y#??W<&??qv?????+??????????H???u?;?\?!??R???G????????????|??L? ????d_?t??M?1/???SA?O????Ju/u&?j?????/?1?l?OG??%???,??I?2??"vf???xKO???3??47?????>t?g????0???,L#?2g??g^??;???=??AC]KKt?S{i1!Q?o^V?,??@?\?S?ae??Y% ? ??~?_????|y?#??p?P???!?????an??hsW,??^???M?????5??Q??W\??7?E??g?:?m\z???????1MW8?)?bk?A???P ???l?m$6R?????a???m?? ?Q(!?I????,`??6>????]?????^?d?p[???C???=???4U#h6 Q~?y? +M????["H??'L{????~?S=m?l{?YK?R? +TX??&t??,?W??j???o?3????????????=?i??q??"v?I??R????^y?po??gSJ??????VJ?????^??w?w7?s?*?z?9y???C7YJ???????\o????????0???c???3]?h? ???L/??}]??h7?e?]? ?E?5s?0;?}t?^?pp?{ H???K*?M?^??>t?f??????j???????w??????W???$6????5K?O?e.?? Epzo9?t)??? 3??tw>??w???????P?????T?JW?d???????????i??W?A??????Ry??'s?R????n?1"???W???`{?[? ??.?rrv?[??F????@????????;???v???Pa?????o????8?Z?s?X??Hi?Z?HO??y???c?]+?CPe????R???S?G?F?k?0d~?d??1?QHBTW?7T6*?c???-???%????/??46W\?A? ??bZ at 3?$B????T}??%??%???u>???Q??K]?? f??x????"zM?\+?>??^???8???+f???GETV??u? ???I5??????? ????5 ?1QjJ?"W???_)9X??W??C???? X????h1???)??j?!???%?J_?R?Fi3????r?????{Qgl't?e B56=p?| M???????m????? ???"`? +A????0?endstream +endobj +100 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 103 0 R +/FirstChar 45 +/LastChar 121 +/Widths 104 0 R +/BaseFont /FFTUTL+CMR9 +/FontDescriptor 98 0 R +>> endobj +98 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /FFTUTL+CMR9 +/ItalicAngle 0 +/StemV 74 +/XHeight 431 +/FontBBox [-39 -250 1036 750] +/Flags 4 +/CharSet (/hyphen/period/zero/one/two/three/seven/nine/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) +/FontFile 99 0 R +>> endobj +104 0 obj +[343 285 0 514 514 514 514 0 0 0 514 0 514 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] +endobj +103 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 55/seven 56/.notdef 57/nine/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] +>> endobj +83 0 obj << +/Length1 750 +/Length2 576 +/Length3 532 +/Length 1110 +/Filter /FlateDecode +>> +stream +x?SU ?uL?OJu??+?5?3?Rp? ?44P0?3?RUu.JM,???sI,I?R0??4Tp,MW04U00?22?25?RUp?/?,?L?(Q?p?)2Wp?M-?LN?S?M,?H??????????ZR???????Q??Z?ZT????eh????\????????r?g^Z??9D8??&U?ZT t????? +@'????T*???q????J???B7??4'?/1d<8?0?s3s*?*?s JKR?|?SR??????B????Y??.?Y???????????kh?g`l +??,v??HM ?,I?PHK?)N?????;|`??????ykC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` +?L? 2?RR+R+?.????/jQM?BZ~(Z??I? ??% q.L?89?WT?Y*?Z? 644S077?EQ?\ZT??WN+?????2?A??Z???u?Z~?uK??mm+?\_X????????7?D?????Rl:/P1?d????????(??l=U?h?d?_O??E?k?v-X1??t???`????i????_y. ?1?????????:?un~Q???3/??S??}??]?? +???$e~s?]F1????/??Q???m????|<?????/??q'}I???+6???E??g???xT.??G??gt???v??G??U|?????~??]?R????_k?9???:?{?p??G?? ??d}dN<6??-uB?o?H??=c?M?vH??z?q?a???RK?~,K???}????????m??????yo??~?????v? +?_????s>???.#????????{?/?????k????\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,??\r?endstream +endobj +84 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 105 0 R +/FirstChar 15 +/LastChar 15 +/Widths 106 0 R +/BaseFont /MLVPVK+CMSY10 +/FontDescriptor 82 0 R +>> endobj +82 0 obj << +/Ascent 750 +/CapHeight 683 +/Descent -194 +/FontName /MLVPVK+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/XHeight 431 +/FontBBox [-29 -960 1116 775] +/Flags 4 +/CharSet (/bullet) +/FontFile 83 0 R +>> endobj +106 0 obj +[500 ] +endobj +105 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 15/bullet 16/.notdef] +>> endobj +62 0 obj << +/Length1 1548 +/Length2 8704 +/Length3 532 +/Length 9615 +/Filter /FlateDecode +>> +stream +x???eX?????"???R,???Cq/?5@?@???)????Hq+N???E{???g?g???~??M?!?w?9?;??>??P?d???e?PVA????;????]??F +4?????P? ?C@? ?p?8??9a4?????????????B@??eS?5????? 6?? ;;??_'?@g ?h??????Cf at +??_??,???.???? +?8?L???????;?y,??hl*`X6 ??? [?\???N?????w??????h?&?O?????7?2??C?? ???@??????????,? l?gs0?[???{???~,?????+????? ?H???????i?????@? ???????????????????0? ,/???u?a ???0. ,??o???u?ay=?????KJ????pX8?x|\??????f??=#???Q?}??l ?].@?;?mal.h??\?-?7Q??/i?9F???[;z?|,?]????J????T???r :?B??s????VT?upw&?????ud*?bvB?pF?a??o??N,?g??Y?LP?w? +?f?pf?W=p????????/_??Ry???>?i?FX??????Tk?/???? ?N???>???G4cg??f|\??Ru5???="?v?U????tL~7???E'U?01?????-6?)gs8?uOZq*?~d???BC? ????)R???JY??? ??I9??U?????w???;??????f5??+??/?_????3z ??!{]4???????????jt%c???Z?p????[????a +io~u?-eR"~?l?u?_???=??????W??????L??tX???59???? ?\p{?=d!? ???0? ?D??>t$3ns%Z????E?????E? ?[???q?$? 'gbK?u??????U?[?q +??????(????l?O??? s@?;????):N??H?_??E?????K?]~??9?md??D?4?4????k??!?K??X4?U?#{xY?r?+@?[??f#Sl??????.@?/?=???k???E +?T?N/?????2?a2t;k???A??Xd:#???M?e$]!?s?????*????9 ?"-?q?E]??$???VRs??{^????v0??F??-':G??Q;??-A|??>???h???S1^re?P?????Z[???+???)?0H?$~?{??????(TU???sX?%@{?t??8]H j?-??_F#??KF?????V?LAv??1?h?%?(?I* ??WS??P?$bp??}??y3???B??????????x ?????3??C?L??yk'?B???Uco???_?Y???????w??f??57???E?|%*????G????|?}?????"?????yK7??/?K?\????=?]??}?nd]???x??x6 ?>?y?j?b?T?wMje??????????????]|*?Pc5i?|?&E?XI4K?,,????????b ??Z?^N???"??????????p????pI??!3??:R5?o??Y??z??B??%V03^r?????m??kt?-h(e???w??*??;?????Z??)?T????v?H;$?M??????i????Ty??(i???????P?S?C?W????+m?,?????,??????j?????>vy??d ?m??{?]%s???? +????[??'?????z7B?Cd_S?m?VF???3?N$y??????"?q????z??L???]??lV????W?r?? ?+?? ^?n)?'?????? ?????z?=$_?????i&???XJ??8????????????j?lI?qr?eEA?V?;??? ?MK??W?(?????u?3k#te&??S}?b=?]?^???????MH???}???5?V????f ?L??<:??7???r?7?=?V??V??O?? +!R?,p?jr=??r?????d?'2#? >F*U??u?????v?"??U?????3????N?tD?kH???L?w?k7?n?U +d?Kwm?G?V]????P???{?'?R???????`??N??????W????;??e?Xa?Rs?P@`U??????f=7??R??A??YX?????'`p]?? ??o?(?51?C?e?d??Q??&??u? +??v$?f?y|Y?6+M???rF? ?_?.?*?A??\J??z?x??\??%DZ@????n???Q??=)[B?V?g?}???????????^O???????rg?d???m???G/LT????G"< "???X??6?D?f??}[q}=??t?F??\?c=d?$Z_??e????`e@kx"???VY????DN@?-???????m???EZG???#[?m#*:??YuS????c??l?d???? JS???01?[{W???????[?3??'?????uTE??>?H?7?z?*?I??a????~?1?v???$?&?s??R?CL5#!?z)EJ:]?v??q^??-Hh??;Zr2??\e?_??n?(RP??.?X???Pb????????6?0??`E?w???S?r?| n??Zr0A???p??&??OK7?'?'???R?j????c?{0?~x?0??%k??1j.)??;? ???4???F,% d>?`,??X?]?r???u23V?9?????V? ?*??O???f5???o~a?R!V?m*Mo??8"%??h?wY ~?d?????0&?&?X?:*???'?;?9@?/s??k?*?-F?Cg?????|!`?e????\?UA??????? ZiR)eW??????? ???rB#u+?,?????f?{?3{ +8??67??nm)?6 ??x?U?c?q6 T$???o?(*?d!?? ???v +!?B$U???B/??'M?+?n?M??^???+???????0???2??F??X?&?????j?????6p?????DC m_S ???|?5B|o`?? ?i# X????H???o'?>v?????:?|???????+'???m?6w???nGy??A?J]N?e2?[?0????f:?J??S??l???!???, Ij>i,QD?D? ?y?=?PxoF???g?????t";????k +??.K??*??>???^?K?\? F??y? +???yRL?=?p??`w??W???=dop?????? 2?????????8pjH?? (??b?bQ???a~81??6?J?S?$??H?=???.X@?K?s??5^??Fr?????u"?+?D?~L?cY)+xsU???????i|?l?(Hz{w"??v??'rf??yXW??N??? f{?-SX?e?vd??????}?i.?Ik\?uiS???[?b?????r?"????]#QH?d??Y?e??c=????gQ????? ???L??}??????_T[E?]?-?~?????v?$???L:\33o9??q?a???ZU????-g at mm????|{?? ??_?{??? ?????yF???f????? ?a?u#?? c?>?+????7?F????G???@?????s????l??e]Xr?_v>???MZ????????f9?Q2??i?4'?r?v?& +?:????Shq{??-???????i?0??fi8?c?H???B??i???J?V}?K bU??R ?_?A?{!&??0???????t)|EdS?M???6? ?V'???XNT=?wUd7??????#???+Q???0??/Zz???qi??A{S?L*u?p???U?}?5:1??# ?GomXd?y?wx??\?#Z?2?Yx??(#??????t??W%U}/?Uq{??H?Z??????v*?@??????P?\99??k6????????*?O????6??x?~h????Tf???p?????s????\????o???c?8>S?????"?KR?y???0??}???9?^3cgi?0nB???V7? /J?\?xN?{?5? 5y?q?T?FY]T??B[NQm????;S?~Uj?,lF1 ;?pC??;?aW??E???_6`_?????????c/$W???3`9b}t????zn?????[?|????U?D:v?TN???L?y????/???Y??F^ ~K??Z=8?M??Z?g{??????;?B%?? $?O?B~?&}8#.?v?+?j<%?Q?????.iM???)?_CU???N?C5P??? + y? +?Z????`}??-?Klu???Jh??@???(???2g%b????O~?g???|?/??2t??r??l2??P?p?"?!K???[?2"???????????Qh???????????J??F???\??zS???Z?/??]??L?D??N?u ????"?T(T!?WU?MY?????s??-??^??D4S?Y???RQ??.?S????*a?????????]?X>??j9]??; ?????"- +??'????K???? ?????& ??WrV9????'x9?????y??? -?4X????l?Z?L?F??j??E??jU???Y?r?Y?????b?3??UR???[???*?^;??(?/>S????]h[?J?L????q??QY???$#RZlD?;?-E?>8?$??[v?N j ????????;T?!A?}?^?A?3? _;?B??????^n {??*B&???H?? ?x?o???/i6 z?]?C??BIH?b +]?cbNX???w?J?x?Y??:???L??RY??|?6??A??O?? +?(?p[N??? m?I?????a???:????? q??0??2I???vmn?M/L"?`?z4???t7???XG?????T.*????6?V`(bQI({O?#??y?F????H???9cD??Dr??????CZ"?"R8Q?q|???h?n???b?^|?v-v? ?0k??:j?ey???? ab?(K??E?H???a??*?????????C?v?/????M????HX?Ft???K?U? K%k??t????m?b???>?R`?H????~??5?u??m????v??!???h????K??=?F????)r-???5_???!n?????? ??? ???"?????Bl?? K_9/endstream +endobj +63 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 107 0 R +/FirstChar 34 +/LastChar 121 +/Widths 108 0 R +/BaseFont /RPRATX+CMTT10 +/FontDescriptor 61 0 R +>> endobj +61 0 obj << +/Ascent 611 +/CapHeight 611 +/Descent -222 +/FontName /RPRATX+CMTT10 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/FontBBox [-4 -235 731 800] +/Flags 4 +/CharSet (/quotedbl/percent/parenleft/parenright/plus/comma/hyphen/period/slash/colon/equal/A/C/E/F/L/M/N/O/P/R/S/T/U/V/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/w/x/y) +/FontFile 62 0 R +>> endobj +108 0 obj +[525 0 0 525 0 0 525 525 0 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 525 0 0 525 0 0 0 525 0 525 0 525 525 0 0 0 0 0 525 525 525 525 525 0 525 525 525 525 525 0 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 525 0 525 525 525 ] +endobj +107 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 34/quotedbl 35/.notdef 37/percent 38/.notdef 40/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash 48/.notdef 58/colon 59/.notdef 61/equal 62/.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E/F 71/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y 122/.notdef] +>> endobj +58 0 obj << +/Length1 1117 +/Length2 4847 +/Length3 532 +/Length 5563 +/Filter /FlateDecode +>> +stream +x???y?/?"(???e?????G]? &+ ?I?? B????????????``(??W?0??f8?0?0?/??jj?t5?-?!?$H??})??9u??G?Z?H+u?d?9??^}/????Ge?VHW???px?? 4??? +?z?6v?????????r'????????u????? ?s????J?? +????Y?3?4[%??!j???k? ??????0??x. ?c???U-5w?!)???`X?[E???6?%???????S{?~ ?????E??G}L5!v?1??'7???+Nmf???6;?????W????m????9?????dJu????E?4????1 ~Ka_??>??Y??U<8~??2??T??e???@D?G?ZL??v????Gk???y????h%qc??!???:u q? !O??"??-??~???{ kq??oz?s???`?S??????|?v??7O???23?A??+?{??i??w'?}U????????)U)|N ?z?!??*?z2??7?E????1.? +?N??r??u???N?j ???f?w?d????6?y??;?IZ??/?y?8|*F>???1??d?,??up???\??B??V?R:???-???y?y???????^Y?q??kB????{E(??p!}?????\??@???j????F-uDX??[*)???b{?cE????D???g?? +??!BR????D??|?w?Ig?/r#J??> ??@Z){????^t`??c?d;????^g?0D(?H????? +d??t??????S????![? +?u[!???*?j??D??`??9?z????.????Qa?.?Y?????"? ?i1??!???CQ:?nE?CN????c?6e"E????"1t???'E??a???b?5ry??sGz?lxl ??ZW;?h?H????????=X=s\ ?4?7E?b??$????????u?x?a????{m?X?????F ??k???&??N???o#????H?Px?o?-??n?5;?$??,??xT8???)?????^?? q???'?B????5? U?c`4\????????t8??O?M??????i??| 0??.?\????~7???p??m?????????ZV??s|??? ? +?x?x?O???.*??S ??8??????X?? }?`{???'??z ??G??????? +3??|V?P???\?!???U???>???T?U\&[??~a??( 9G?:?)??N???????=Yw?????|??IC????[E????9o?|?S???{????;n???@TL?z??)????????olD?-~v?\?hN??7r???u????E????}??I? ??????????!.?????"??vkv+??|????I?????P)\9??0????T r?cF?9? \i??X? ?S|?i?-?u???96?L}??? +o??\g???w?0?s?8???f???F?g5?YqWq??Z???<?Y???\?*M?l?????g?K????m?e??}S?=;y?M?e????????Y)??M?I??, +??C??R@ ? ?7Y ? ???S??o?'??9?H??+?????5???-?n,_??????B/????$?5??p?=?y*:=?.??p +&Np???xi?Kr??????#????G?[?9???K?W+?W3?0?{z?V?u?)????~?6?$???? ??>IS??F??D?????L9??OVB[??t?r?}?mb'Y?|?3$m`??U?n?]???????v?7$???ghT?_?R?\???; ? ???i??q??2^].?kn???? P=?-???v? ??j?????u?5"^-?o?'???,?T?mc??=? +w&20??^?n??|p2?o ?H{??S?w???{???tO?h??'}? ??V???GC?;?D)?*? ???????7[wd?v??D???h??P??H???????%}:#91?+Z????????>??N?.W0?,??E? ??1 ? ????%?,?o?????#?(?p?h?{??B??iR4?@?F?]^n?O+ ???2??s??:?????????m??I? S??r?g? +s??c?wT???|?&Ne??_%!??? ?????=Sb9/?E??????5?=!???b?[??4?w;t?v?s?f:??7???yC????????R?????p??t??????\/??????zZ?????)D??+d?L?U?7???9??????Th&?o?????tw?T?8k?EQ?????????8??ml@ +gX???b?? ?c??l??L????|O??9?6}J?????fO.????m??8IBw???^|p?????:O?W???G?+?]?M??F??T?q?h??Uo?????y?J???=?*EU????_&${w )?????oG?T??Kyd?MM???????Q?????F?50z]K?Yy??????????? M?t- ???:??I?R????{?.??/?s?F7???(??2??H?? 8??a?? +???Xn??VDR?M???:???&?????N?????h'?.?J?1??i??W?y%?a!JM#*????{qDD? ;=pQ]?h?L?[?j??{???? +33r?dNkFiC?_??D$ ??""k??R?l?S?S???8M??????o(?i2?m????N,???|????" F??????????p?????gUi?*]?X???k?m);????1????7?????%?.?=ut???c??g??Vs?H???i?????? ~r?7??9???sv???C3J?yb?Z????3??????;n?.C??Cf??\`D?:? ??$?;nm??j?Vs????Yl?2??:$k????\???\?-??]?????&{?_?z$???????M??L?????I?F\^"???+?}y??z????z?E??%???_?|???p????C??f9m??*??Px0?"??4hz????T??`?j??QqD?Nsl??V?I????=i[Fl}`aDc?jg????k????GIVi&H???}[Ix????x7?Zo??{??hMvz? ??????$y]@N?? ????g?fF?? G??j?\R9????.?+KQg??[?.??y???kY??x)???Yi?%[?? 9c+??8???'ynR'????o#???M?i??d?4<: +eV??2+ ??$+5?T???TMO???bl?? ???ON??U ???*?? ???p???C?|?? ?  ???c??=79?[??X:?/???r?<e??W `k[w??Qjo????I??'??g??%??????~?Y???:?>u?,w5 ?3W?????w?????[S??g:o??q??f?*??|?z|? +k??\???s?????????g?????n?|???ZQ-?Uy1?/?Q(???dB?If????E??.>. ??W>T?Kj??s?n{?ITN???RU<]@o?]??Un???????.?j???????$?L??R??fK? +?b????z?d?eE??V??? ?"S????J?'R???????B?. ??I?????!???b?h$?N?_L?2eendstream +endobj +59 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 109 0 R +/FirstChar 70 +/LastChar 122 +/Widths 110 0 R +/BaseFont /OSQHOH+CMBX12 +/FontDescriptor 57 0 R +>> endobj +57 0 obj << +/Ascent 694 +/CapHeight 686 +/Descent -194 +/FontName /OSQHOH+CMBX12 +/ItalicAngle 0 +/StemV 109 +/XHeight 444 +/FontBBox [-53 -251 1139 750] +/Flags 4 +/CharSet (/F/G/H/I/O/P/S/T/W/a/c/d/e/f/g/h/i/l/n/o/p/r/s/t/u/y/z) +/FontFile 58 0 R +>> endobj +110 0 obj +[707 884 880 419 0 0 0 0 0 845 769 0 0 625 782 0 0 1162 0 0 0 0 0 0 0 0 0 547 0 500 625 513 344 562 625 312 0 0 312 0 625 562 625 0 459 444 437 625 0 0 0 594 500 ] +endobj +109 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 70/F/G/H/I 74/.notdef 79/O/P 81/.notdef 83/S/T 85/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c/d/e/f/g/h/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 121/y/z 123/.notdef] +>> endobj +46 0 obj << +/Length1 1686 +/Length2 11515 +/Length3 532 +/Length 12472 +/Filter /FlateDecode +>> +stream +x???eT???hq ?4????wo?-8 ww????w????????;9??|???f???jU??????? +J?????@1['zff???"3????I??\?h?dnk#b??0ss??????_v6vr??????????J???$N??5????? k?d??ad`P?52:?1????p(?. at cff?????hjn????????-??_acg??r:8??TkR@???6Vnc? ??-???C??s???3??k????? ?????;????? ???5:??g??_n?@csg???t2?27?1???2w3w+?;?L ????6??)??? +??2* +???????? ?m?????Y??????7???`? +?b???z??'???%jcdklnc +`a?88?!?N???sc?+? +fd??uM?z?0?u@?kCA{?h?w?_?B??? ?h?l?46???N?3???#?fc0?8m??&D??;?????????????????;????? h?;??*kk?;?`t:????lm??0;H????qv?????? PiGP??aPaG??u???????#??W????G9 at 3?V?7q?h???? r?M C????????oU??M K??? ?q?*(?&???? ???ouC?7????!? ?????]=???w?$b??@"F?O???}Y???!?Aj? ??????IX?? ???a?A?$?????Av H??i8??????)N ???Y??? ?/*i?u?E7?? _?2E?m???????~???\~ju?8N#?/???([?JDyv??K???+5??S],?J?[`5+?"j?}q0??__P?b?~??{[|?k?]??muF????}????D3j%bU???T???.????R??;X!? +0Ur?B/?)K?g`U?????M?c? ?u9?kjU'~!??Y-??c??3??Z?g:???- ?|?s=$?s??J??????y??:e??jSkB#5Y?bk???N`?3#_??? z#?????y8 ??z8"?o?>ZQ?{?"???T8????#???U?v`$????pc?X??T?SD?}??U??? G??f e?*?X?C?^0?????8????&??X??4A?< T????v?a???D??a\\v[jiR??Z?U{?????p?>Y+kU??f??O4?-M?S??9?#;SK5?_??@????r???r?3?Qi$??/?2??om???iy"L?hG???????]????b?J^?N??6???I??$??????@?u X?? ?!{?????_?????;???V??;??????,?J???????b??M3}?Em?H???^-??2?&??86???c`??d???}?%???pN??1?\@????? ?RA??b????]R?o?X??*??D??M?????????<\j?? ce !?????TV?P_@?}??.?LRzNEhM???y??p?"??f??{i~]??????"??b?n?(U???????7?Z??J,????/.?????T??2l???o?"?????>?????{???G{? .Ly?`?]L????ff +??>n?xe??{y????&V?y_? +M?=s??!???????0A,?"0??U?w??s?GWc????+???4?n`??!85>?P3*? +t?ys ??????pE??:??}/??Z~??r??4?fx {w?{&6x}???w??a?]>?? ???M?{BC ??????79???(???'Kd ???4???'H???v-???K +M$????y???[f{J|?+?g?????=?????F8nTW? ???P??nM?i_)q:a@???k??&Qu??4E3?qr?(????`)b??9\????iI?3?{?2???z?9??W?e?????0SO?z??w +??`!???}vf???K?t=?????! +????W?:v???>v?M? ????a???h??SR???d? ????BEbg??F????? f??YB8?b??L?I?-hM???/?e??N6BwQ?z]?????!2?~??????I?@M|HW?F??)g8?\??|???[G?PQ=;a= ?lA?L?0????-???T??]?z??]??Nd???.????h?@???}??~?d???"d ??QV?????Z??G??????P|?">'????1uk?????Gl| ?W??k?+? X?R????????^?z??7?n????K???V???????.?p?????(??cu+??-??b~?/?Q?X?F??m?,??G?????~????7.x???|? ;??j??D?????z??"c:?k??X?9????????9?1kK??7)?z??M?O???_???:~,?\.??.i?NhpP?"U ?`v?/???????DiC|e???????=?Z??,?????G??deP??L??{r?I????A??oGM7>????Kb? ??'?B;XYs???P%?_?gM??yte?!??e?T77?????_??M?*???8{?f???? ?m??q??5?4??????!?6?}??G?+|??z?^????~x1Vns%J?Wd???&3Ni? +?q?G?xWQl?&???)=??)??????o7?'??M???6L[r???nZ,^??SBm?????????>'??H?H?U*(??<{??]?k?????????v????{?ZJU):??%E??????Ft?#?9???O=?M<$???~m???l??????vM +?6?5??kr??xu?Y8???E????>?x ?????|{8|i????????c?????????\????>a?i??Y?Q?A7??????3??x?.?h? s7_?{Vt?%"n????{??&?b?m?yZD????.?XO?????Z??]L^y????}???=v?]??y???v?-?,???z t? +? ?K????22KvN6?>4??q?_?r?#L??????Hylw?n??????)??D?j/d?xN?'D?d?4?~????M???[?G?A??~.??2? ?$???L{Q???D???}W"???}?????SE1kah????a,v?0}??#~??X?kp?1O$??c??w??(?0? ?9???6|?f??J?H0gt_3?G-??)1???????;]??a?B>{??*???$%?i?c???hu_?m\6??$????v4?E?c??O*aJme??"??VZ?N?O2???.???????????+?qJJw%?hM V(??,4rM???????0?Y ?4D??E??X?P8?P?9????{fJX?ty?f#?>cm/a:?P?n?Zs????Cz ??6??`? ???Q?4.-????w??I?#e???]wiH????`WwZ??/kAp??n???1?zA????S??` +6???T%??8?&0R?W!? ????K??%{?T?o?????)5?}??%????f?p???1???Y>m??{?k?????????}???7&_?&#Ih?d+?(?3?R?????t5? ?- I?mo???Q???X????Y??cd?Y??%?????o?}3p9}?z?`|r?C???3?? +??C?d-??De???????wr?s9??X??&????o?L?9d?D???????F??#???7??????S?????T3?X?2Twii????!>?S????"?9?J^c???????m?????\?.U?c+?+?G??f\???-\?pR???p??????.?_?w/?a?\???D??-1????jC??e8vG ???N|^???? 5???8? ;??H??h?D%2-E}?R???^?q??W???????????"OP?J?L?m???S??)??:??k??K? ????/?H + ?v?d??q?:`?\??J???t?/" W???owi{?~R;?'?????&?h;?Lx??0?S?F!p?g?4?q?_???????[???#??????C#0j?X{@0?<4jR\q???w +?6?M?>g??(?wu?S?f?x?#6p+????3?W#?Nt???| ?A????f??????=.??3???W???????????EC:??E?Ne??P?~W??zm#? ?4I??&????(??W??@B ??C??f%?`TOtYD??A~z???B?B???Q??t@??0?u?????|?sx?^i??$dy ??p?\?U# ?K???? ?{C???P ?k??{?t??????????V9?JMYb@???}?&{?|?IV???64}??; ??{??????Hq??cN? +?S???????\ +??+??z?? so???s$?H??????v???*P?V?Ho>?p$0?????_?????~????/??b?c?( ??? ?X??Y2 ?xP?+? +??Y??m??S??N ?l??u+h?vC???+i???J+??|??e???x?bZ?C?'? +x????l.S??ZaQ@???49k???E??+??d0????1??.R???)???b?R2?uz?? ??N`???v?<[?$:?=\?N???w??J???(?K??t:?||r???M??}k???QU)?.?N?K"??\`q??? ?M??/?/???S4?ipM?:6?-???????xG????{??????8???I????s?????|??g?T?? +m?" 6"??`?a????t??"?O?. at V??9????y???})X,z<T??5??G???@i9?e??T??,xI?I^? [????\?O??iQ??gLe3HDy??V???Ode??mwPe?jn???H.%????j?Q?O?u??u;T?+????Z? +h.#?p?#?U?m???$[?=???\/?z????B?????0QLQ%????1?#?????????3??????????q??? ??}???c +M?o????X?'?>?DY???????]?[???x???\???????Y?Te?H?v ????fGL?s????Fzb????(_Mc)_??? ?z?X??T????`????????l{/??T N???6??:8?!@o???e+j???X?????????qtY}M?????<9Qd.I???/b?S???p??@I?? J?v???k??S????V?????????@0????S??????~?S?3?-fY???J??f/N????F????i?R?B?jDcR?? {?>jj?`?6\-z?? ???Fkr???#l?C at CB???p?}Y!?^?N??;?['5?Z?Wmt??6?X?_???????????@?????6.x?HN????%???Di?B?B?Jfv?9?? -? ?jP?\8?s???[_@???????H???(QQM=?????Qm?:o???`sh????_? f???????????3-{GVX.?p? ?%?i???8??????>.???W??D?? ?rJ?f-~???v??g??3?>> ???Y??Fx/t] C???:c ???J???B?~6?c???w[cz?NN3????????S??VeHau?|?? |?mq?TA;????#G?U??(?O??a????~? _?e?j~&????q?? +C????g??2??yR???y????)S???????FD??!??v???m? ???>'???e;Q???,?T?.}?-X?j?}???`:??Py~???q????i?? >;E?P?? +??????o??J?{?PFHQ?_$??b???J x???77???3?*?H?C#? ?3?5?='+v?e?+???? +????GL????{??[?l????{?N ?????=?5?????5???P2???!??? ???A9??+EZS?|?XxW?W?u?cLkk?]?????A?Bm?b?3U???g`l? +???*= ??#(U?6??E????i%3?78#?????? mG?,:V?e????-????I{G?hH3?{??q1GAV"LEo?3?????U?? qc? +?iH0???RM???)??????R???k?m???:??pU?g?y"8.??????12?{3shYTd7L??L?U?j~?'? ????dn?U??u??+???zCF0gL?~]M?????p??c??y ??????`o8#?}???u?l?}?3?s??D +?V???k?????:? .???j??Y+?0k?J?a?R?s>?+??)???_?B4R?\?Z?????5??LRS??5d????'???B????p?%???kg??A(0???[??!??a?B?^.pw?O???NJ?dhj??g?4?E?5????#c???J?}>?|??G?????3?;?lt???|????+}J ??D?????v?xQ?=????^??>3 ?*?d??R#D??u??? ??O????Z?g?fl?~yz???{?T?-?!D Z?0??u?? ?U`???m?s??}??U??B?G?^&t?+?"??*R?UB??u?&???+??||:>H?F??!?k?,mZO??[?"?.??$?????????????n ?? ??C?^j!?d?_????C x?C?t?q???'? +!1v`/':t???F?po.f?Y]???t)?pH???*??LP??Q?o/??E ?Gp??/?p?9b????F82?72??????J????N?-??@?H2???y7??fD?.?? o??c(?u??[n????p???\^W?k??????&<1H?????;J?B?`B??Kp??G???z?0??{ni{?]e?????>?%?*a???hhv????>??-=????(Mn?AMI?u?O?,?Q???G?lu???-?~B!5D?x7???78????D~???All.Ujf?G??K?????;S??'?V????.?w??????:sJ??{????!?XX?bQ??^ ?q??Y????v?????F??W?jz?X?^???W'E? +h`:Y????H?^????s}??+???.?wuc???2?&??x ???l???_d\?????|????????9???;v?????l?S??#!??r?<\?"=3??_3?"???5?5??=??????(??E? +???????????T?).OJ'?G???dd???&?*?T^??WL66?e????I??Tw??5v[pwA??R??w?*?B?H?Q#???3??rB?s??/??{S?j??8??C]?}?0??d??/Lm0F[L????kb???E?????C +u?f?X?z?S8!???? ['?????&??C4?`~?S??iU?2?%??^????90O%Nc5:?6F[?.MZ&\EX? ????@?M???P v=?%H?&??JJ??w?v?8??O91c???'j?4)\?? ???f????? Keq*?Mna??@?e?1??\.z?@J???'?j?D??Z?$???tN?& ????B'P??x????1?!??6{????$?5??W?X_X????=aV??fq?????>!_x???{?k???gt??A??%?D?W?w?& Y??a?^??}?S?P?$?? 0/$1)??????O?2o????"J8U9?I?Z#??????J??@?,m?+??Y?Ebb???a??z?>%a???-??O??? ^??p???8???#????)??}?p??? Be?l???<??9?+Q?tvj? ?W?R?l9?Rz?l? ?????1??H?h+ b??#? +??????%*| ???][T??Wm/2Y??B????R?????????= I?1 ?^?? ~?Q??,?Q?c??d)?+??M?q+?YB6??Jz?T??|Re??Yo??h???}??%~???G??'"deMCt??T^,a??>L??y?????I?r8e??????s???$???H??d)??i??|?Hc8?dS?V????`{Z????q?8?>n??M??????nV??=?M????MQ?4k???w??!E?????2???+?t?aR ?MRSS??$??FhwE??S?%? %?*db??????jN^?A? ????yNeI)???<}2?MM8?q????c??P???.??^HSx?;????qu?W?V?????.KZ??}#??qGy????y?qA??9N?; ?C8?h ????????*3???? J??g ??4?????n??? ++??+SM???[!?\??Kp`|a?$E?0?????!?O???????u?k?Xh^??G:?E?????????d?XpO?????Z???,??f??????X?2????J??$? ?y`*?V =?????C1Ei=W"??ym?B@ +??2? ?{?-5?*?"R?e??8?j/]?]5Y]:_?ME=?U??+??H~?&,&????qH???-?${t??????????F?8_??@?P??l?6OW?i??IEy??nOJ???(;?S??Kk??? #%??UO2}V #)? ???{lb?? 3????{?[l Nm?[??9o1 W??(?;???hN??;41???q???C?>?#???/?p?)?8:u??K??i?8??2?FI?~?,?I?ZK?tF]????X?08Q??F??[E!z??????bI? + ?????>?????bfg??P?jp)? ?O????k?;?d????_??*??[??????????&???!n?????c?;?{??~1#???1H??>ZFRn??hBT??Sa ????t?&?????'?b&l ?,XXE??? ????/???F?$?????Y-LY%??]=?????????Q]??lo??G_{???M$???(J]???3??Dd??&????V??8?????u?d?w ?~??)j?Q???H???=?Y?&?)?A +6???v??r-???????$Ny???}n??`?z???s???\$?[??p????}??L?( 'o*?@q/?>?$?s:?#??Dqn?o?n?A.?'T?@??-?0-8;?r:?;???4???S??s?/???]W?`?????2??[????db?|.?CXV???I 6py?l21????K2#m???d????????{"?"?$H? ? +5~???|oz???`?? Z????ol????Zf!o???I?o?Kb]?,?F??/?e??Vfb [??q?TC??>??"????????gC??????h?Pr|Z??T???T3??Sf2[?????^???p???H#?9??w?w??????vu?u??5??R!a??zw??2"=???^wV???6~ ?6?Kf"??B?????T??]??Oy????hk?J??|F:HJ7?????af? ??RF?7?????c??A?4 ??+?8???f?y?P'M-2?x???Z???QD????[(???PWs?????\fT?1???*jB8?"??F???{?'c???????????W??????5]?>^?G#a?t??y??_ ?EsS????8s?s6GPM??M???{k??????S?=?????6?.?h???s$M?,??F??d`?v??5i{?W?????????EZeP?=D???B?6???;jL?? is???f???A?? ???????????????E?3endstream +endobj +47 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 111 0 R +/FirstChar 11 +/LastChar 122 +/Widths 112 0 R +/BaseFont /ELUPCG+CMR10 +/FontDescriptor 45 0 R +>> endobj +45 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /ELUPCG+CMR10 +/ItalicAngle 0 +/StemV 69 +/XHeight 431 +/FontBBox [-251 -250 1009 969] +/Flags 4 +/CharSet (/ff/fi/quotedblright/quoteright/parenleft/parenright/plus/comma/hyphen/period/zero/one/two/three/six/seven/colon/semicolon/A/B/C/E/F/G/H/I/L/N/O/P/R/S/T/W/quotedblleft/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) +/FontFile 46 0 R +>> endobj +112 0 obj +[583 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 0 778 278 333 278 0 500 500 500 500 0 0 500 500 0 0 278 278 0 0 0 0 0 750 708 722 0 681 653 785 750 361 0 0 625 0 750 778 681 0 736 556 722 0 0 1028 0 0 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 0 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] +endobj +111 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 54/six/seven 56/.notdef 58/colon/semicolon 60/.notdef 65/A/B/C 68/.notdef 69/E/F/G/H/I 74/.notdef 76/L 77/.notdef 78/N/O/P 81/.notdef 82/R/S/T 85/.notdef 87/W 88/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] +>> endobj +43 0 obj << +/Length1 1041 +/Length2 4846 +/Length3 532 +/Length 5537 +/Filter /FlateDecode +>> +stream +x???g????u?k??z?????T?vP %$*,*P????D?EDT?????P[ W?EA????b ?f???$%?D???jw?$?? ?S???$ Pq?"a[8d?r??a4 ??0????*???_+<FPO(?j/L$* +??AP;?# N??I??H?#l????)o(?c +???&?c?w??C????nP??? [?.?????o??K?w??c?? ???? ??? +???P$??S???0??p??m?Q??0? +?? +?G???????? N[WO??8n??0??m?g?P1???????g ???????????E?fLu?0_??????D??????mvA????1I)?-i?G??=??`p{?/??q ?#P?%LIH?_ ???1=A????II?*?4??7?????8???`?a? ???DED@??P???b??(:??C?????o??1??????b?? F????b???7?a??~??[U? $?9?????/% ??????? ?B"?p??? sk??0??B}???ID>?9?.?$?n?H)?????x?7m??????] ?u=?k?/?2?H????|.??B??~gR +}??P+-$+????^?]W?v?`j[??x?RC????????Z??e???2&??m?????L?'Z?>? U-????4?D@ H???z??3j6x????? ?F:h?]? ?n??#?kM??a'R????_W?(?+???!{][??+???*wr??????>?b*u?G?}^???{u?=???w(?????????? ??&??ex??b g????9QB??L<&:???{??PXn?-??i?|?????A?a:i?(?p??G??g+b????_????LFz???'?I?F??}???gf?U?\?B??sa????=3?v??>"\???E?h???v??I~??E?@?T?Dv^????#?;??*??|#x?h?q(?/?T??_`8???T??&,P'}[Zy?sxW?+V??J#?(?4? je???.L?"U??r?KNA?6?< ? ??R??#??l{?yM??|??KqL?2?3R?|c??RC??/??[??O????s_T}z?T??3??D?????mD:^????KY:?ph??6????C?[?'~?7RX??????vsF?)????1??oC??;? #?xt?????eU_???7?G_ )?hK??????CH?`???rL?+????g,?x?o3?????X?V??A?h;??R???Q?l???u?7??v??E?1???)?Cr?l????????h&TJ{?Kf??I$??????????-6??/?????kn1???Q[??KNr??#c~????y?S?{?% ?v ??????E(?\????g??}?l???,??$5? NpD???~?|?c/???'B??4???J*Nn????E'F?g ?z?@???????k?#?W??0o2?Q .?????????u???fM?aie?X%e?9??7?>??D??+??k????^??V??$q??%P~[?sd?y??? ?2s@??K??Rk? ;Y7? ??????'(??????"??k?????g??D??? ?%?P??#?0??r@?6G???D????7}?t???0????(?B?y???x9?????E???1?qC??YCl??O??Z=?T???c ?Xg??'???w ?g???y???7(???? 3M?R??????` b5?~??=?Z?????=ea21???]??????r>/?B$??????2S?:?=?P5?G??{?c6??3`?1 ]???M?\???I??MIr??P?T,;???????_:???-???B_?^o]LK???????????t???0HW;?c=o??Ou,?4????X???E8?Z??L?8#oq????r???.7???J????Y???sQ??Q? ?k??he???/%??)?7L?,??M(V?N??'_????!??IOI?u?}?&h??p?g????p??????^??W?b??^u#:OU?%,~?f?d?a?l8m?:^???_?8?yS???S?/d?]?\J?:???4l?fO(2?V?^=?t?2??N?\??I???|{j???????hD?G??? +#}J???L?zx????wl*G??c?M???[???jS@???B?l?*??K|2??~.?????(A??;K?p6L ???c?92??Pqb?????YY???e???9?j?{t??j3???%?]?Zt*%C?y??kq?.,2Q*?7?(j?lQ8????yMc?$P?lh??????8H?O??T??|/:?x???qx?5??S?:c]@z??? ?M/?*?L?F?Vmy? 5n? r??%?3???^??b9=??B7g??7IB?Ksnr??6???????E???U QO??0?ZZ +???+3f??b?GZ????????{?4e}???B??I3=<??C?????o???Z3???kz4??k??;????r??=??? ??.Q]???J????}?? +P0?gx?"W? I??2x?????9???=??T? 3l?@N!??????d???_??????B?W?i???U???? +V???>x???,q???+? ?56?????V?g /L???N??|?????:?UV?R??mK????w+?kb?'?b?p?#?d?@????=????W??? d?\??b ??:?*?(??????Z??A?C??? ??T????\?kZuH??=??U??XZ???'?A\j??H}????y?\??????A???D\B +"V? ??}+N???o?AN??????????WT|U??)?z.?`CF????F???????L???#?Sf??-???????????C?9of?6^b??q??????ST?-?6??? ?y???4??6RE???\$s?P9J?)? +?5RL???Yr??N?????',?x?$?C?2B?f?k???i?f?n?ms??t[&?)?k?|??' ?4??+9g??;????5/??C&4'G????r????JV?` N??I*?A?B#??O?sE?0????F????*?O?D?Y??s~???>P,?g???????LIE??'????0?????QQ??xO? ?K?j?????hW??5E?S+??O6?F'??4??? +??-LDd?Z????3|???#M;g}?5 ?RzH???Se?G??.Om}x??=???D?<`?S???c?}??x? ?????W?X?{?=????X$Nkh?`??:#?5???UU?9I}?i]KhpV?rp??#k?R?c??[Mm???C7B%B?Vfr????>?=B??)?:tc=?Z?{???Snz?????)?????=J} xlL? +???"?P?Q?}?Zs????#????RPu7???T|????i???????,OY??uy??$i?k?R?T?? ?U?\?*???\:?NsuWiq???$?8?&?N??"??$? ?I?$??????5?8Mj&_????>???>#`!E ?????Qo?v??|R<?62?7?0R ?8}??T'2?G?G'? ????V?v?$s?n?9TY??n????[u_6??????1???8zEJ?????H?sR[??m????\)?H??p[???*d??7??G{%?W?1(0?5????????.?1 ?h:??O???????????_?????'????0?w|??l? ??? +T??????????t?? ??RL?D??"n'Tq????M??z????0?r?? tZ~?????`&xV1%a?ArY?#?C???(/??bE?} ????7????/????S?c^?T?6EZ4?~???uK??i?????x?#5"??#y??A?X?C?I.????R?3??pS??????????*??DSL???f??? ???7???4?????{qv??,???????#?y_????[?i??L ?u{??-Y??o???y?Qa?y;-???hL ??Hj??~?j??#?3g y??T.:l???3?Z?L??N???#???Es??$?*??L?X?2??ku?????R??b5?xofD[e~??mV??p:?k???/?:TP???V??"T? +u??K7`z-?K?C????%b"?m????$G?I???u{M)?f???!Wu?o?CM?v?vT`@????4????y?U???G/?V?????r?*-?x2??G????V????Fw???^|?$s\?P3?x?Bh1>k???h??????vA?m?O7????0??????X~2=R?????w?r????a?'????Y????i?'y???O"?yx??9?Z?????? ?+??B??"]?? G? }endstream +endobj +44 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 113 0 R +/FirstChar 46 +/LastChar 121 +/Widths 114 0 R +/BaseFont /LQSFAO+CMBX10 +/FontDescriptor 42 0 R +>> endobj +42 0 obj << +/Ascent 694 +/CapHeight 686 +/Descent -194 +/FontName /LQSFAO+CMBX10 +/ItalicAngle 0 +/StemV 114 +/XHeight 444 +/FontBBox [-301 -250 1164 946] +/Flags 4 +/CharSet (/period/A/C/D/I/S/a/d/e/f/h/i/l/n/o/p/r/s/t/u/y) +/FontFile 43 0 R +>> endobj +114 0 obj +[319 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 639 0 0 0 0 0 0 0 0 0 0 0 0 0 559 0 0 639 527 351 0 639 319 0 0 319 0 639 575 639 0 474 454 447 639 0 0 0 607 ] +endobj +113 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 46/period 47/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 83/S 84/.notdef 97/a 98/.notdef 100/d/e/f 103/.notdef 104/h/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 121/y 122/.notdef] +>> endobj +40 0 obj << +/Length1 933 +/Length2 3180 +/Length3 532 +/Length 3819 +/Filter /FlateDecode +>> +stream +x???y???~q?????]e5?I`#???{??T?%????Y?>?{???'?h??-r?~`Bl??4??6i??[??6??F~??k?S?yw???????r??9??);A??{??J3?RU??q?q?P???Gz?? +a???+XJZ?j?????y?`LT??kM?_>??.}??L?t??Dz???@????2R????:x???(a????!?a?NI?????ra??G_??P? ?F3?c??+6|??k????}??y????P???S?B?????????4????}??2+?"3???!P?xB??o???>?~?W??;r????Q???[???~ao +J?EZ?bC???77?p???z??vX???L|???ix????s?o??/?Z????????K???a?V???@_?K 8?zA?2?^????/???*?=k,t?\??G???Kml??:$?'{?z&tk?gN?? (???#?a:A?I???*[????#??+1 O???????????j??:?r:$p????M????grC??rd?k/?m?L??b??p??g??Y?>?[F% ??{r??u? z6?d??????>Y +?=,2?iM3??.?x;?ja\?zCmn?z????Q??Sw?q??\S?Q?????|?Q?v?????Z???I?????u?Nv??? ???4E??D??????????+?rj?`N?A??{?????G?????1;?I????Hc?? {?O]=O?O{??Ib'w??j??k???C?Ax??:;?????<2?"?????,?/??B3? .???6?#?V?8?V???8"??????-???e&(? .CgMQQub?(???W}?Z?R~??"[????K????6d?F\3?????AE??A??6?E/???ZJ??K???S??1?&?Ve?=??P?io at BV???X5^??#LR?qn?????????ll??=??Y?U???`]rr?\?t??????[z?y? ???$?L;?l? ?TWi>b?8????q???EcA?i??O??FW  %??Fe_?M?O5?n??????+??3?Z?~(?????J????????T?u?>K;0,???mf??P?z?P?{L.M??c???Bk????9v???RK?u?mV?????8???w??=?'?o?M???K??,/? ?WC@?h??_/|??e??TNN?n?y????,m??|???f"?,%??v??????P??H?????f??V? ?bw?&??????3????????????& +?fC[}??????gh?????<?????p?????kB???5A?????f; +???2$b[i]{??%yL?yHd_??Rc????3)?P]N?????`?????????????\) ???\?6???*WJ??y???v??E(!n6??b @`???oQ??>?????!?( +??????? W???endstream +endobj +41 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 115 0 R +/FirstChar 46 +/LastChar 121 +/Widths 116 0 R +/BaseFont /IJZGFK+CMR17 +/FontDescriptor 39 0 R +>> endobj +39 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -195 +/FontName /IJZGFK+CMR17 +/ItalicAngle 0 +/StemV 53 +/XHeight 430 +/FontBBox [-33 -250 945 749] +/Flags 4 +/CharSet (/period/T/a/e/g/h/i/m/n/p/s/t/u/y) +/FontFile 40 0 R +>> endobj +116 0 obj +[250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 668 0 0 0 0 0 0 0 0 0 0 0 0 459 0 0 0 406 0 459 511 250 0 0 0 772 511 0 511 0 0 359 354 511 0 0 0 485 ] +endobj +115 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 46/period 47/.notdef 84/T 85/.notdef 97/a 98/.notdef 101/e 102/.notdef 103/g/h/i 106/.notdef 109/m/n 111/.notdef 112/p 113/.notdef 115/s/t/u 118/.notdef 121/y 122/.notdef] +>> endobj +69 0 obj << +/Type /Pages +/Count 3 +/Kids [34 0 R 75 0 R 87 0 R] +>> endobj +117 0 obj << +/Type /Outlines +/First 7 0 R +/Last 31 0 R +/Count 7 +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 117 0 R +/Prev 27 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 117 0 R +/Prev 23 0 R +/Next 31 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 117 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 117 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 117 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 117 0 R +/Prev 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 117 0 R +/Next 11 0 R +>> endobj +118 0 obj << +/Names [(Doc-Start) 38 0 R (contents) 48 0 R (contents.0) 6 0 R (introduction) 56 0 R (introduction.0) 10 0 R (page.1) 37 0 R (page.2) 77 0 R (page.3) 89 0 R (section*.1) 49 0 R (section*.2) 60 0 R (section*.3) 68 0 R (section*.4) 81 0 R (section*.5) 85 0 R (section*.6) 90 0 R (section*.7) 97 0 R (testing-header-files) 70 0 R (testing-header-files.0) 18 0 R (testing-organization) 67 0 R (testing-organization.0) 14 0 R (testing-python-scripts) 73 0 R (testing-python-scripts.0) 30 0 R (testing-source-files) 71 0 R (testing-source-files.0) 22 0 R (testing-swig-interface-files) 72 0 R (testing-swig-interface-files.0) 26 0 R] +/Limits [(Doc-Start) (testing-swig-interface-files.0)] +>> endobj +119 0 obj << +/Kids [118 0 R] +>> endobj +120 0 obj << +/Dests 119 0 R +>> endobj +121 0 obj << +/Type /Catalog +/Pages 69 0 R +/Outlines 117 0 R +/Names 120 0 R +/PageMode /UseOutlines +/OpenAction 33 0 R +>> endobj +122 0 obj << +/Author(Bill Spotz)/Title(Testing the numpy.i Typemaps)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() +/CreationDate (D:20070913152306-06'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.6) +>> endobj +xref +0 123 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000009 00000 n +0000004918 00000 n +0000068530 00000 n +0000000055 00000 n +0000000081 00000 n +0000005100 00000 n +0000068444 00000 n +0000000131 00000 n +0000000162 00000 n +0000005283 00000 n +0000068356 00000 n +0000000221 00000 n +0000000260 00000 n +0000009560 00000 n +0000068268 00000 n +0000000319 00000 n +0000000358 00000 n +0000009743 00000 n +0000068180 00000 n +0000000417 00000 n +0000000456 00000 n +0000009926 00000 n +0000068092 00000 n +0000000523 00000 n +0000000570 00000 n +0000015242 00000 n +0000068017 00000 n +0000000631 00000 n +0000000672 00000 n +0000003039 00000 n +0000005405 00000 n +0000000722 00000 n +0000004735 00000 n +0000004796 00000 n +0000067208 00000 n +0000063111 00000 n +0000067049 00000 n +0000062361 00000 n +0000056544 00000 n +0000062201 00000 n +0000055258 00000 n +0000042506 00000 n +0000055099 00000 n +0000004857 00000 n +0000004978 00000 n +0000003232 00000 n +0000003389 00000 n +0000003554 00000 n +0000003719 00000 n +0000003884 00000 n +0000004057 00000 n +0000005039 00000 n +0000041807 00000 n +0000035964 00000 n +0000041647 00000 n +0000005161 00000 n +0000034753 00000 n +0000024858 00000 n +0000034593 00000 n +0000004223 00000 n +0000004393 00000 n +0000004563 00000 n +0000005222 00000 n +0000005344 00000 n +0000067870 00000 n +0000009499 00000 n +0000009682 00000 n +0000009865 00000 n +0000015181 00000 n +0000009987 00000 n +0000008777 00000 n +0000005522 00000 n +0000009438 00000 n +0000008928 00000 n +0000009096 00000 n +0000009267 00000 n +0000009621 00000 n +0000024540 00000 n +0000023153 00000 n +0000024381 00000 n +0000009804 00000 n +0000015364 00000 n +0000013474 00000 n +0000010092 00000 n +0000015059 00000 n +0000015120 00000 n +0000013662 00000 n +0000013832 00000 n +0000014003 00000 n +0000014173 00000 n +0000014343 00000 n +0000014513 00000 n +0000015303 00000 n +0000022288 00000 n +0000015482 00000 n +0000022129 00000 n +0000014683 00000 n +0000014867 00000 n +0000022814 00000 n +0000022576 00000 n +0000024771 00000 n +0000024747 00000 n +0000035434 00000 n +0000035136 00000 n +0000042237 00000 n +0000042056 00000 n +0000056034 00000 n +0000055669 00000 n +0000062818 00000 n +0000062604 00000 n +0000067633 00000 n +0000067433 00000 n +0000067943 00000 n +0000068602 00000 n +0000069309 00000 n +0000069348 00000 n +0000069386 00000 n +0000069514 00000 n +trailer +<< +/Size 123 +/Root 121 0 R +/Info 122 0 R +/ID [ ] +>> +startxref +69815 +%%EOF Added: trunk/numpy/doc/swig/doc/testing.txt =================================================================== --- trunk/numpy/doc/swig/doc/testing.txt 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/doc/testing.txt 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,173 @@ +============================ +Testing the numpy.i Typemaps +============================ + +:Author: Bill Spotz +:Institution: Sandia National Laboratories +:Date: 6 April, 2007 + +.. contents:: + +Introduction +============ + +Writing tests for the ``numpy.i`` `SWIG `_ +interface file is a combinatorial headache. At present, 12 different +data types are supported, each with 23 different argument signatures, +for a total of 276 typemaps supported "out of the box". Each of these +typemaps, in turn, might require several unit tests in order to verify +expected behavior for both proper and improper inputs. Currently, +this results in 1,020 individual unit tests that are performed when +``make test`` is run in the ``numpy/docs/swig`` subdirectory. + +To facilitate this many similar unit tests, some high-level +programming techniques are employed, including C and `SWIG`_ macros, +as well as `python `_ inheritance. The +purpose of this document is to describe the testing infrastructure +employed to verify that the ``numpy.i`` typemaps are working as +expected. + +Testing Organization +==================== + +There are three indepedent testing frameworks supported, for one-, +two-, and three-dimensional arrays respectively. For one-dimensional +arrays, there are two C++ files, a header and a source, named:: + + Vector.h + Vector.cxx + +that contain prototypes and code for a variety of functions that have +one-dimensional arrays as function arguments. The file:: + + Vector.i + +is a `SWIG`_ interface file that defines a python module ``Vector`` +that wraps the functions in ``Vector.h`` while utilizing the typemaps +in ``numpy.i`` to correctly handle the C arrays. + +The ``Makefile`` calls ``swig`` to generate ``Vector.py`` and +``Vector_wrap.cxx``, and also executes the ``setup.py`` script that +compiles ``Vector_wrap.cxx`` and links together the extension module +``_Vector.so`` or ``_Vector.dylib``, depending on the platform. This +extension module and the proxy file ``Vector.py`` are both placed in a +subdirectory under the ``build`` directory. + +The actual testing takes place with a `python`_ script named:: + + testVector.py + +that uses the standard `python`_ library module ``unittest``, which +performs several tests of each function defined in ``Vector.h`` for +each data type supported. + +Two-dimensional arrays are tested in exactly the same manner. The +above description applies, but with ``Matrix`` substituted for +``Vector``. For three-dimensional tests, substitute ``Tensor`` for +``Vector``. For the descriptions that follow, we will reference the +``Vector`` tests, but the same information applies to ``Matrix`` and +``Tensor`` tests. + +The command ``make test`` will ensure that all of the test software is +built and then run all three test scripts. + +Testing Header Files +==================== + +``Vector.h`` is a C++ header file that defines a C macro called +``TEST_FUNC_PROTOS`` that takes two arguments: ``TYPE``, which is a +data type name such as ``unsigned int``; and ``SNAME``, which is a +short name for the same data type with no spaces, e.g. ``uint``. This +macro defines several function prototypes that have the prefix +``SNAME`` and have at least one argument that is an array of type +``TYPE``. Those functions that have return arguments return a +``TYPE`` value. + +``TEST_FUNC_PROTOS`` is then implemented for all of the data types +supported by ``numpy.i``: + + * ``signed char`` + * ``unsigned char`` + * ``short`` + * ``unsigned short`` + * ``int`` + * ``unsigned int`` + * ``long`` + * ``unsigned long`` + * ``long long`` + * ``unsigned long long`` + * ``float`` + * ``double`` + +Testing Source Files +==================== + +``Vector.cxx`` is a C++ source file that implements compilable code +for each of the function prototypes specified in ``Vector.h``. It +defines a C macro ``TEST_FUNCS`` that has the same arguments and works +in the same way as ``TEST_FUNC_PROTOS`` does in ``Vector.h``. +``TEST_FUNCS`` is implemented for each of the 12 data types as above. + +Testing SWIG Interface Files +============================ + +``Vector.i`` is a `SWIG`_ interface file that defines python module +``Vector``. It follows the conventions for using ``numpy.i`` as +described in the `numpy.i documentation `_. It +defines a `SWIG`_ macro ``%apply_numpy_typemaps`` that has a single +argument ``TYPE``. It uses the `SWIG`_ directive ``%apply`` as +described in the `numpy.i documentation`_ to apply the provided +typemaps to the argument signatures found in ``Vector.h``. This macro +is then implemented for all of the data types supported by +``numpy.i``. It then does a ``%include "Vector.h"`` to wrap all of +the function prototypes in ``Vector.h`` using the typemaps in +``numpy.i``. + +Testing Python Scripts +====================== + +After ``make`` is used to build the testing extension modules, +``testVector.py`` can be run to execute the tests. As with other +scripts that use ``unittest`` to facilitate unit testing, +``testVector.py`` defines a class that inherits from +``unittest.TestCase``:: + + class VectorTestCase(unittest.TestCase): + +However, this class is not run directly. Rather, it serves as a base +class to several other python classes, each one specific to a +particular data type. The ``VectorTestCase`` class stores two strings +for typing information: + + **self.typeStr** + A string that matches one of the ``SNAME`` prefixes used in + ``Vector.h`` and ``Vector.cxx``. For example, ``"double"``. + + **self.typeCode** + A short (typically single-character) string that represents a + data type in numpy and corresponds to ``self.typeStr``. For + example, if ``self.typeStr`` is ``"double"``, then + ``self.typeCode`` should be ``"d"``. + +Each test defined by the ``VectorTestCase`` class extracts the python +function it is trying to test by accessing the ``Vector`` module's +dictionary:: + + length = Vector.__dict__[self.typeStr + "Length"] + +In the case of double precision tests, this will return the python +function ``Vector.doubleLength``. + +We then define a new test case class for each supported data type with +a short definition such as:: + + class doubleTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + +Each of these 12 classes is collected into a ``unittest.TestSuite``, +which is then executed. Errors and failures are summed together and +returned as the exit argument. Any non-zero result indicates that at +least one test did not pass. Deleted: trunk/numpy/doc/swig/numpy_swig.html =================================================================== --- trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/numpy_swig.html 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,1071 +0,0 @@ - - - - - -numpy.i: a SWIG Interface File for NumPy - - - - - -
-

numpy.i: a SWIG Interface File for NumPy

- --- - - - - - - - -
Author:Bill Spotz
Institution:Sandia National Laboratories
Date:13 September, 2007
- -
-

Introduction

-

The Simple Wrapper and Interface Generator (or SWIG) is a powerful tool for generating wrapper -code for interfacing to a wide variety of scripting languages. -SWIG can parse header files, and using only the code prototypes, -create an interface to the target language. But SWIG is not -omnipotent. For example, it cannot know from the prototype:

-
-double rms(double* seq, int n);
-
-

what exactly seq is. Is it a single value to be altered in-place? -Is it an array, and if so what is its length? Is it input-only? -Output-only? Input-output? SWIG cannot determine these details, -and does not attempt to do so.

-

Making an educated guess, humans can conclude that this is probably a -routine that takes an input-only array of length n of double -values called seq and returns the root mean square. The default -behavior of SWIG, however, will be to create a wrapper function -that compiles, but is nearly impossible to use from the scripting -language in the way the C routine was intended.

-

For python, the preferred way of handling -contiguous (or technically, strided) blocks of homogeneous data is -with the module NumPy, which provides full -object-oriented access to arrays of data. Therefore, the most logical -python interface for the rms function would be (including doc -string):

-
-def rms(seq):
-    """
-    rms: return the root mean square of a sequence
-    rms(numpy.ndarray) -> double
-    rms(list) -> double
-    rms(tuple) -> double
-    """
-
-

where seq would be a NumPy array of double values, and its -length n would be extracted from seq internally before being -passed to the C routine. Even better, since NumPy supports -construction of arrays from arbitrary python sequences, seq -itself could be a nearly arbitrary sequence (so long as each element -can be converted to a double) and the wrapper code would -internally convert it to a NumPy array before extracting its data -and length.

-

SWIG allows these types of conversions to be defined via a -mechanism called typemaps. This document provides information on how -to use numpy.i, a SWIG interface file that defines a series of -typemaps intended to make the type of array-related conversions -described above relatively simple to implement. For example, suppose -that the rms function prototype defined above was in a header file -named rms.h. To obtain the python interface discussed above, -your SWIG interface file would need the following:

-
-%{
-#define SWIG_FILE_WITH_INIT
-#include "rms.h"
-%}
-
-%include "numpy.i"
-
-%init %{
-import_array();
-%}
-
-%apply (double* IN_ARRAY1, int DIM1) {(double* seq, int n)};
-%include "rms.h"
-
-

Typemaps are keyed off a list of one or more function arguments, -either by type or by type and name. We will refer to such lists as -signatures. One of the many typemaps defined by numpy.i is used -above and has the signature (double* IN_ARRAY1, int DIM1). The -argument names are intended to suggest that the double* argument -is an input array of one dimension and that the int represents -that dimension. This is precisely the pattern in the rms -prototype.

-

Most likely, no actual prototypes to be wrapped will have the argument -names IN_ARRAY1 and DIM1. We use the %apply directive to -apply the typemap for one-dimensional input arrays of type double -to the actual prototype used by rms. Using numpy.i -effectively, therefore, requires knowing what typemaps are available -and what they do.

-

A SWIG interface file that includes the SWIG directives given -above will produce wrapper code that looks something like:

-
- 1 PyObject *_wrap_rms(PyObject *args) {
- 2   PyObject *resultobj = 0;
- 3   double *arg1 = (double *) 0 ;
- 4   int arg2 ;
- 5   double result;
- 6   PyArrayObject *array1 = NULL ;
- 7   int is_new_object1 = 0 ;
- 8   PyObject * obj0 = 0 ;
- 9
-10   if (!PyArg_ParseTuple(args,(char *)"O:rms",&obj0)) SWIG_fail;
-11   {
-12     array1 = obj_to_array_contiguous_allow_conversion(
-13                  obj0, NPY_DOUBLE, &is_new_object1);
-14     npy_intp size[1] = {
-15       -1
-16     };
-17     if (!array1 || !require_dimensions(array1, 1) ||
-18         !require_size(array1, size, 1)) SWIG_fail;
-19     arg1 = (double*) array1->data;
-20     arg2 = (int) array1->dimensions[0];
-21   }
-22   result = (double)rms(arg1,arg2);
-23   resultobj = SWIG_From_double((double)(result));
-24   {
-25     if (is_new_object1 && array1) Py_DECREF(array1);
-26   }
-27   return resultobj;
-28 fail:
-29   {
-30     if (is_new_object1 && array1) Py_DECREF(array1);
-31   }
-32   return NULL;
-33 }
-
-

The typemaps from numpy.i are responsible for the following lines -of code: 12--20, 25 and 30. Line 10 parses the input to the rms -function. From the format string "O:rms", we can see that the -argument list is expected to be a single python object (specified -by the O before the colon) and whose pointer is stored in -obj0. A number of functions, supplied by numpy.i, are called -to make and check the (possible) conversion from a generic python -object to a NumPy array. These functions are explained in the -section Helper Functions, but hopefully their names are -self-explanatory. At line 12 we use obj0 to construct a NumPy -array. At line 17, we check the validity of the result: that it is -non-null and that it has a single dimension of arbitrary length. Once -these states are verified, we extract the data buffer and length in -lines 19 and 20 so that we can call the underlying C function at line -22. Line 25 performs memory management for the case where we have -created a new array that is no longer needed.

-

This code has a significant amount of error handling. Note the -SWIG_fail is a macro for goto fail, refering to the label at -line 28. If the user provides the wrong number of arguments, this -will be caught at line 10. If construction of the NumPy array -fails or produces an array with the wrong number of dimensions, these -errors are caught at line 17. And finally, if an error is detected, -memory is still managed correctly at line 30.

-

Note that if the C function signature was in a different order:

-
-double rms(int n, double* seq);
-
-

that SWIG would not match the typemap signature given above with -the argument list for rms. Fortunately, numpy.i has a set of -typemaps with the data pointer given last:

-
-%apply (int DIM1, double* IN_ARRAY1) {(int n, double* seq)};
-
-

This simply has the effect of switching the definitions of arg1 -and arg2 in lines 3 and 4 of the generated code above, and their -assignments in lines 19 and 20.

-
-
-

Using numpy.i

-

The numpy.i file is currently located in the numpy/docs/swig -sub-directory under the numpy installation directory. Typically, -you will want to copy it to the directory where you are developing -your wrappers. If it is ever adopted by SWIG developers, then it -will be installed in a standard place where SWIG can find it.

-

A simple module that only uses a single SWIG interface file should -include the following:

-
-%{
-#define SWIG_FILE_WITH_INIT
-%}
-%include "numpy.i"
-%init %{
-import_array();
-%}
-
-

Within a compiled python module, import_array() should only get -called once. This could be in a C/C++ file that you have written and -is linked to the module. If this is the case, then none of your -interface files should #define SWIG_FILE_WITH_INIT or call -import_array(). Or, this initialization call could be in a -wrapper file generated by SWIG from an interface file that has the -%init block as above. If this is the case, and you have more than -one SWIG interface file, then only one interface file should -#define SWIG_FILE_WITH_INIT and call import_array().

-
-
-

Available Typemaps

-

The typemap directives provided by numpy.i for arrays of different -data types, say double and int, and dimensions of different -types, say int or long, are identical to one another except -for the C and NumPy type specifications. The typemaps are -therefore implemented (typically behind the scenes) via a macro:

-
-%numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE)
-
-

that can be invoked for appropriate (DATA_TYPE, DATA_TYPECODE, -DIM_TYPE) triplets. For example:

-
-%numpy_typemaps(double, NPY_DOUBLE, int)
-%numpy_typemaps(int,    NPY_INT   , int)
-
-

The numpy.i interface file uses the %numpy_typemaps macro to -implement typemaps for the following C data types and int -dimension types:

-
-
    -
  • signed char
  • -
  • unsigned char
  • -
  • short
  • -
  • unsigned short
  • -
  • int
  • -
  • unsigned int
  • -
  • long
  • -
  • unsigned long
  • -
  • long long
  • -
  • unsigned long long
  • -
  • float
  • -
  • double
  • -
-
-

In the following descriptions, we reference a generic DATA_TYPE, which -could be any of the C data types listed above.

-
-

Input Arrays

-

Input arrays are defined as arrays of data that are passed into a -routine but are not altered in-place or returned to the user. The -python input array is therefore allowed to be almost any python -sequence (such as a list) that can be converted to the requested type -of array. The input array signatures are

-
-
    -
  • ( DATA_TYPE IN_ARRAY1[ANY] )
  • -
  • ( DATA_TYPE* IN_ARRAY1,  int DIM1 )
  • -
  • ( int DIM1,  DATA_TYPE* IN_ARRAY1 )
  • -
  • ( DATA_TYPE IN_ARRAY2[ANY][ANY] )
  • -
  • ( DATA_TYPE* IN_ARRAY2,  int DIM1,  int DIM2 )
  • -
  • ( int DIM1,  int DIM2,  DATA_TYPE* IN_ARRAY2 )
  • -
  • ( DATA_TYPE IN_ARRAY3[ANY][ANY][ANY] )
  • -
  • ( DATA_TYPE* IN_ARRAY3,  int DIM1,  int DIM2,  int DIM3 )
  • -
  • ( int DIM1,  int DIM2,  int DIM3,  DATA_TYPE* IN_ARRAY3 )
  • -
-
-

The first signature listed, ( DATA_TYPE IN_ARRAY[ANY] ) is for -one-dimensional arrays with hard-coded dimensions. Likewise, -( DATA_TYPE IN_ARRAY2[ANY][ANY] ) is for two-dimensional arrays -with hard-coded dimensions, and similarly for three-dimensional.

-
-
-

In-Place Arrays

-

In-place arrays are defined as arrays that are modified in-place. The -input values may or may not be used, but the values at the time the -function returns are significant. The provided python argument -must therefore be a NumPy array of the required type. The in-place -signatures are

-
-
    -
  • ( DATA_TYPE INPLACE_ARRAY1[ANY] )
  • -
  • ( DATA_TYPE* INPLACE_ARRAY1,  int DIM1 )
  • -
  • ( int DIM1,  DATA_TYPE* INPLACE_ARRAY1 )
  • -
  • ( DATA_TYPE INPLACE_ARRAY2[ANY][ANY] )
  • -
  • ( DATA_TYPE* INPLACE_ARRAY2,  int DIM1,  int DIM2 )
  • -
  • ( int DIM1,  int DIM2,  DATA_TYPE* INPLACE_ARRAY2 )
  • -
  • ( DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY] )
  • -
  • ( DATA_TYPE* INPLACE_ARRAY3,  int DIM1,  int DIM2,  int DIM3 )
  • -
  • ( int DIM1,  int DIM2,  int DIM3,  DATA_TYPE* INPLACE_ARRAY3 )
  • -
-
-

These typemaps now check to make sure that the INPLACE_ARRAY -arguments use native byte ordering. If not, an exception is raised.

-
-
-

Argout Arrays

-

Argout arrays are arrays that appear in the input arguments in C, but -are in fact output arrays. This pattern occurs often when there is -more than one output variable and the single return argument is -therefore not sufficient. In python, the convential way to return -multiple arguments is to pack them into a sequence (tuple, list, etc.) -and return the sequence. This is what the argout typemaps do. If a -wrapped function that uses these argout typemaps has more than one -return argument, they are packed into a tuple or list, depending on -the version of python. The python user does not pass these -arrays in, they simply get returned. The argout signatures are

-
-
    -
  • ( DATA_TYPE ARGOUT_ARRAY1[ANY] )
  • -
  • ( DATA_TYPE* ARGOUT_ARRAY1,  int DIM1 )
  • -
  • ( int DIM1,  DATA_TYPE* ARGOUT_ARRAY1 )
  • -
  • ( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )
  • -
  • ( DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY] )
  • -
-
-

These are typically used in situations where in C/C++, you would -allocate a(n) array(s) on the heap, and call the function to fill the -array(s) values. In python, the arrays are allocated for you and -returned as new array objects.

-

Note that we support DATA_TYPE* argout typemaps in 1D, but not 2D -or 3D. This because of a quirk with the SWIG typemap syntax and -cannot be avoided. Note that for these types of 1D typemaps, the -python function will take a single argument representing DIM1.

-
-
-

Output Arrays

-

The numpy.i interface file does not support typemaps for output -arrays, for several reasons. First, C/C++ return arguments are -limited to a single value. This prevents obtaining dimension -information in a general way. Second, arrays with hard-coded lengths -are not permitted as return arguments. In other words:

-
-double[3] newVector(double x, double y, double z);
-
-

is not legal C/C++ syntax. Therefore, we cannot provide typemaps of -the form:

-
-%typemap(out) (TYPE[ANY]);
-
-

If you run into a situation where a function or method is returning a -pointer to an array, your best bet is to write your own version of the -function to be wrapped, either with %extend for the case of class -methods or %ignore and %rename for the case of functions.

-
-
-

Other Common Types: bool

-

Note that C++ type bool is not supported in the list in the -Available Typemaps section. NumPy bools are a single byte, while -the C++ bool is four bytes (at least on my system). Therefore:

-
-%numpy_typemaps(bool, NPY_BOOL, int)
-
-

will result in typemaps that will produce code that reference -improper data lengths. You can implement the following macro -expansion:

-
-%numpy_typemaps(bool, NPY_UINT, int)
-
-

to fix the data length problem, and Input Arrays will work fine, -but In-Place Arrays might fail type-checking.

-
-
-

Other Common Types: complex

-

Typemap conversions for complex floating-point types is also not -supported automatically. This is because python and NumPy are -written in C, which does not have native complex types. Both -python and NumPy implement their own (essentially equivalent) -struct definitions for complex variables:

-
-/* Python */
-typedef struct {double real; double imag;} Py_complex;
-
-/* NumPy */
-typedef struct {float  real, imag;} npy_cfloat;
-typedef struct {double real, imag;} npy_cdouble;
-
-

We could have implemented:

-
-%numpy_typemaps(Py_complex , NPY_CDOUBLE, int)
-%numpy_typemaps(npy_cfloat , NPY_CFLOAT , int)
-%numpy_typemaps(npy_cdouble, NPY_CDOUBLE, int)
-
-

which would have provided automatic type conversions for arrays of -type Py_complex, npy_cfloat and npy_cdouble. However, it -seemed unlikely that there would be any independent (non-python, -non-NumPy) application code that people would be using SWIG to -generate a python interface to, that also used these definitions -for complex types. More likely, these application codes will define -their own complex types, or in the case of C++, use std::complex. -Assuming these data structures are compatible with python and -NumPy complex types, %numpy_typemap expansions as above (with -the user's complex type substituted for the first argument) should -work.

-
-
-
-

Helper Functions

-

The numpy.i file containes several macros and routines that it -uses internally to build its typemaps. However, these functions may -be useful elsewhere in your interface file.

-
-

Macros

-
-
-
is_array(a)
-
Evaluates as true if a is non-NULL and can be cast to a -PyArrayObject*.
-
array_type(a)
-
Evaluates to the integer data type code of a, assuming a can -be cast to a PyArrayObject*.
-
array_numdims(a)
-
Evaluates to the integer number of dimensions of a, assuming -a can be cast to a PyArrayObject*.
-
array_dimensions(a)
-
Evaluates to an array of type npy_intp and length -array_numdims(a), giving the lengths of all of the dimensions -of a, assuming a can be cast to a PyArrayObject*.
-
array_size(a,i)
-
Evaluates to the i-th dimension size of a, assuming a -can be cast to a PyArrayObject*.
-
array_data(a)
-
Evaluates to a pointer of type void* that points to the data -buffer of a, assuming a can be cast to a PyArrayObject*.
-
array_is_contiguous(a)
-
Evaluates as true if a is a contiguous array. Equivalent to -(PyArray_ISCONTIGUOUS(a)).
-
array_is_native(a)
-
Evaluates as true if the data buffer of a uses native byte -order. Equivalent to (PyArray_ISNOTSWAPPED(a)).
-
-
-
-
-

Routines

-
-

pytype_string()

-
-

Return type: char*

-

Arguments:

-
    -
  • PyObject* py_obj, a general python object.
  • -
-

Return a string describing the type of py_obj.

-
-

typecode_string()

-
-

Return type: char*

-

Arguments:

-
    -
  • int typecode, a NumPy integer typecode.
  • -
-

Return a string describing the type corresponding to the NumPy -typecode.

-
-

type_match()

-
-

Return type: int

-

Arguments:

-
    -
  • int actual_type, the NumPy typecode of a NumPy array.
  • -
  • int desired_type, the desired NumPy typecode.
  • -
-

Make sure that actual_type is compatible with -desired_type. For example, this allows character and -byte types, or int and long types, to match. This is now -equivalent to PyArray_EquivTypenums().

-
-

obj_to_array_no_conversion()

-
-

Return type: PyArrayObject*

-

Arguments:

-
    -
  • PyObject* input, a general python object.
  • -
  • int typecode, the desired NumPy typecode.
  • -
-

Cast input to a PyArrayObject* if legal, and ensure that -it is of type typecode. If input cannot be cast, or the -typecode is wrong, set a python error and return NULL.

-
-

obj_to_array_allow_conversion()

-
-

Return type: PyArrayObject*

-

Arguments:

-
    -
  • PyObject* input, a general python object.
  • -
  • int typecode, the desired NumPy typecode of the resulting -array.
  • -
  • int* is_new_object, returns a value of 0 if no conversion -performed, else 1.
  • -
-

Convert input to a NumPy array with the given typecode. -On success, return a valid PyArrayObject* with the correct -type. On failure, the python error string will be set and the -routine returns NULL.

-
-

make_contiguous()

-
-

Return type: PyArrayObject*

-

Arguments:

-
    -
  • PyArrayObject* ary, a NumPy array.
  • -
  • int* is_new_object, returns a value of 0 if no conversion -performed, else 1.
  • -
  • int min_dims, minimum allowable dimensions.
  • -
  • int max_dims, maximum allowable dimensions.
  • -
-

Check to see if ary is contiguous. If so, return the input -pointer and flag it as not a new object. If it is not contiguous, -create a new PyArrayObject* using the original data, flag it -as a new object and return the pointer.

-
-

obj_to_array_contiguous_allow_conversion()

-
-

Return type: PyArrayObject*

-

Arguments:

-
    -
  • PyObject* input, a general python object.
  • -
  • int typecode, the desired NumPy typecode of the resulting -array.
  • -
  • int* is_new_object, returns a value of 0 if no conversion -performed, else 1.
  • -
-

Convert input to a contiguous PyArrayObject* of the -specified type. If the input object is not a contiguous -PyArrayObject*, a new one will be created and the new object -flag will be set.

-
-

require_contiguous()

-
-

Return type: int

-

Arguments:

-
    -
  • PyArrayObject* ary, a NumPy array.
  • -
-

Test whether ary is contiguous. If so, return 1. Otherwise, -set a python error and return 0.

-
-

require_native()

-
-

Return type: int

-

Arguments:

-
    -
  • PyArray_Object* ary, a NumPy array.
  • -
-

Require that ary is not byte-swapped. If the array is not -byte-swapped, return 1. Otherwise, set a python error and -return 0.

-
-

require_dimensions()

-
-

Return type: int

-

Arguments:

-
    -
  • PyArrayObject* ary, a NumPy array.
  • -
  • int exact_dimensions, the desired number of dimensions.
  • -
-

Require ary to have a specified number of dimensions. If the -array has the specified number of dimensions, return 1. -Otherwise, set a python error and return 0.

-
-

require_dimensions_n()

-
-

Return type: int

-

Arguments:

-
    -
  • PyArrayObject* ary, a NumPy array.
  • -
  • int* exact_dimensions, an array of integers representing -acceptable numbers of dimensions.
  • -
  • int n, the length of exact_dimensions.
  • -
-

Require ary to have one of a list of specified number of -dimensions. If the array has one of the specified number of -dimensions, return 1. Otherwise, set the python error string -and return 0.

-
-

require_size()

-
-

Return type: int

-

Arguments:

-
    -
  • PyArrayObject* ary, a NumPy array.
  • -
  • npy_int* size, an array representing the desired lengths of -each dimension.
  • -
  • int n, the length of size.
  • -
-

Require ary to have a specified shape. If the array has the -specified shape, return 1. Otherwise, set the python error -string and return 0.

-
-
-
-
-
-

Beyond the Provided Typemaps

-

There are many C or C++ array/NumPy array situations not covered by -a simple %include "numpy.i" and subsequent %apply directives.

-
-

A Common Example

-

Consider a reasonable prototype for a dot product function:

-
-double dot(int len, double* vec1, double* vec2);
-
-

The python interface that we want is:

-
-def dot(vec1, vec2):
-    """
-    dot(PyObject,PyObject) -> double
-    """
-
-

The problem here is that there is one dimension argument and two array -arguments, and our typemaps are set up for dimensions that apply to a -single array (in fact, SWIG does not provide a mechanism for -associating len with vec2 that takes two python input -arguments). The recommended solution is the following:

-
-%apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1),
-                                      (int len2, double* vec2)}
-%rename (dot) my_dot;
-%exception my_dot {
-    $action
-    if (PyErr_Occurred()) SWIG_fail;
-}
-%inline %{
-double my_dot(int len1, double* vec1, int len2, double* vec2) {
-    if (len1 != len2) {
-        PyErr_Format(PyExc_ValueError,
-                     "Arrays of lengths (%d,%d) given",
-                     len1, len2);
-        return 0.0;
-    }
-    return dot(len1, vec1, vec2);
-}
-%}
-
-

If the header file that contains the prototype for double dot() -also contains other prototypes that you want to wrap, so that you need -to %include this header file, then you will also need a %ignore -dot; directive, placed after the %rename and before the -%include directives. Or, if the function in question is a class -method, you will want to use %extend rather than %inline in -addition to %ignore.

-

A note on error handling: Note that my_dot returns a -double but that it can also raise a python error. The -resulting wrapper function will return a python float -representation of 0.0 when the vector lengths do not match. Since -this is not NULL, the python interpreter will not know to check -for an error. For this reason, we add the %exception directive -above for my_dot to get the behavior we want (note that -$action is a macro that gets expanded to a valid call to -my_dot). In general, you will probably want to write a SWIG -macro to perform this task.

-
-
-

Other Situations

-

There are other wrapping situations in which numpy.i may be -helpful when you encounter them.

-
-
    -
  • In some situations, it is possible that you could use the -%numpy_templates macro to implement typemaps for your own -types. See the Other Common Types: bool or Other Common -Types: complex sections for examples. Another situation is if -your dimensions are of a type other than int (say long for -example):

    -
    -%numpy_typemaps(double, NPY_DOUBLE, long)
    -
    -
  • -
  • You can use the code in numpy.i to write your own typemaps. -For example, if you had a four-dimensional array as a function -argument, you could cut-and-paste the appropriate -three-dimensional typemaps into your interface file. The -modifications for the fourth dimension would be trivial.

    -
  • -
  • Sometimes, the best approach is to use the %extend directive -to define new methods for your classes (or overload existing ones) -that take a PyObject* (that either is or can be converted to a -PyArrayObject*) instead of a pointer to a buffer. In this -case, the helper routines in numpy.i can be very useful.

    -
  • -
  • Writing typemaps can be a bit nonintuitive. If you have specific -questions about writing SWIG typemaps for NumPy, the -developers of numpy.i do monitor the -Numpy-discussion and -Swig-user mail lists.

    -
  • -
-
-
-
-

A Final Note

-

When you use the %apply directive, as is usually necessary to use -numpy.i, it will remain in effect until you tell SWIG that it -shouldn't be. If the arguments to the functions or methods that you -are wrapping have common names, such as length or vector, -these typemaps may get applied in situations you do not expect or -want. Therefore, it is always a good idea to add a %clear -directive after you are done with a specific typemap:

-
-%apply (double* IN_ARRAY1, int DIM1) {(double* vector, int length)}
-%include "my_header.h"
-%clear (double* vector, int length);
-
-

In general, you should target these typemap signatures specifically -where you want them, and then clear them after you are done.

-
-
-
-

Summary

-

Out of the box, numpy.i provides typemaps that support conversion -between NumPy arrays and C arrays:

-
-
    -
  • That can be one of 12 different scalar types: signed char, -unsigned char, short, unsigned short, int, -unsigned int, long, unsigned long, long long, -unsigned long long, float and double.
  • -
  • That support 23 different argument signatures for each data type, -including:
      -
    • One-dimensional, two-dimensional and three-dimensional arrays.
    • -
    • Input-only, in-place, and argout behavior.
    • -
    • Hard-coded dimensions, data-buffer-then-dimensions -specification, and dimensions-then-data-buffer specification.
    • -
    -
  • -
-
-

The numpy.i interface file also provides additional tools for -wrapper developers, including:

-
-
    -
  • A SWIG macro (%numpy_typemaps) with three arguments for -implementing the 23 argument signatures for the user's choice of -(1) C data type, (2) NumPy data type (assuming they match), and -(3) dimension type.
  • -
  • Seven C macros and eleven C functions that can be used to write -specialized typemaps, extensions, or inlined functions that handle -cases not covered by the provided typemaps.
  • -
-
-
-
-

Acknowledgements

-

Many people have worked to glue SWIG and NumPy together (as well -as SWIG and the predecessors of NumPy, Numeric and numarray). -The effort to standardize this work into numpy.i began at the 2005 -SciPy Conference with a conversation between -Fernando Perez and myself. Fernando collected helper functions and -typemaps from Michael Hunter, Anna Omelchenko and Michael Sanner. -Sebastian Hasse has also provided additional error checking and use -cases. The work of these contributors has made this end result -possible.

-
-
- - - Deleted: trunk/numpy/doc/swig/numpy_swig.pdf =================================================================== --- trunk/numpy/doc/swig/numpy_swig.pdf 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/numpy_swig.pdf 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,2545 +0,0 @@ -%PDF-1.4 -5 0 obj -<< /S /GoTo /D (contents.0) >> -endobj -8 0 obj -(Contents) -endobj -9 0 obj -<< /S /GoTo /D (introduction.0) >> -endobj -12 0 obj -(Introduction) -endobj -13 0 obj -<< /S /GoTo /D (using-numpy-i.0) >> -endobj -16 0 obj -(Using numpy.i) -endobj -17 0 obj -<< /S /GoTo /D (available-typemaps.0) >> -endobj -20 0 obj -(Available Typemaps) -endobj -21 0 obj -<< /S /GoTo /D (input-arrays.1) >> -endobj -24 0 obj -(Input Arrays) -endobj -25 0 obj -<< /S /GoTo /D (in-place-arrays.1) >> -endobj -28 0 obj -(In-Place Arrays) -endobj -29 0 obj -<< /S /GoTo /D (argout-arrays.1) >> -endobj -32 0 obj -(Argout Arrays) -endobj -33 0 obj -<< /S /GoTo /D (output-arrays.1) >> -endobj -36 0 obj -(Output Arrays) -endobj -37 0 obj -<< /S /GoTo /D (other-common-types-bool.1) >> -endobj -40 0 obj -(Other Common Types: bool) -endobj -41 0 obj -<< /S /GoTo /D (other-common-types-complex.1) >> -endobj -44 0 obj -(Other Common Types: complex) -endobj -45 0 obj -<< /S /GoTo /D (helper-functions.0) >> -endobj -48 0 obj -(Helper Functions) -endobj -49 0 obj -<< /S /GoTo /D (macros.1) >> -endobj -52 0 obj -(Macros) -endobj -53 0 obj -<< /S /GoTo /D (routines.1) >> -endobj -56 0 obj -(Routines) -endobj -57 0 obj -<< /S /GoTo /D (beyond-the-provided-typemaps.0) >> -endobj -60 0 obj -(Beyond the Provided Typemaps) -endobj -61 0 obj -<< /S /GoTo /D (a-common-example.1) >> -endobj -64 0 obj -(A Common Example) -endobj -65 0 obj -<< /S /GoTo /D (other-situations.1) >> -endobj -68 0 obj -(Other Situations) -endobj -69 0 obj -<< /S /GoTo /D (a-final-note.1) >> -endobj -72 0 obj -(A Final Note) -endobj -73 0 obj -<< /S /GoTo /D (summary.0) >> -endobj -76 0 obj -(Summary) -endobj -77 0 obj -<< /S /GoTo /D (acknowledgements.0) >> -endobj -80 0 obj -(Acknowledgements) -endobj -81 0 obj -<< /S /GoTo /D [82 0 R /Fit ] >> -endobj -84 0 obj << -/Length 1941 -/Filter /FlateDecode ->> -stream -x??YYsE~???G??N??????@AH%??@x????,c?9??t????J?*??W?t????B?????^7?yf??f6???>;;?D??aJ?#O[i????5?Y?tM5?%???5???0??O???J??e?j?/P?i?P?Lw~????X???1L?wt???? ??k?=9nW??q+9???;o?????V< ???K^?<_~3?? -O???l?o?J-H???a?n?|I2\??(????@-???r*?Ni??d,?????U?????$?O?????t?H??u?1?3? ?? /wC?b\? -+ -& ?L$kwG:???&J?? ????s;"hN? j&????d??c|q?????J9?? ?MF?-???????wP???????U???I0xR3 -^XC?? -Qr?,?A??!??C?*C?4?????.?Z?=`td%???(?v???H?_????0???????a:r*??>??oj??e??!!?7?n2Q?C????LsZ?8]?M??1??Z{????E?0/??,4@?O?1{H[???BV?J^?K1?????}??iFc??X P???0$SoAcV???#??E?F?F?P???!f?? ?thnESsVM??d????{@?T!,H????t?)_?? ?Q??????=??{??T??/%>)PGk??5?!??*}H6???2U??0?F???<[??X?y??.??P25??.n??????4?D#?5???A??m??{?T???l1????? ,?{??h?W????*??VGKl????????Y???9???!u???y?? ???f=,, -?.?????"=??B??)????9???i????4^??@M????sjO?(T???EN????F??:iq?R??Z',??9???y?w? -){?}?6y7???K*?]?????,?.?B[??b<=li0?D???M-?H??L?} ??u??jOoQ?Bo????s????:'?????9??S?CvR???? 2????:9?*u?=y????55?a?? ({H4??-???22U??U??s?a?? ??c?;hjnC_? -;mg?A?tB??????????)???<?u}S?z?\??#?????????q??`??????L???e?U?jfF ???V`?_??!??f4&w??1`?????|Zz?5K???x:???????q?Uf??8? <??????w??-p!pD???P???%?V2-? ????e??????qo?=??M??`7e??W&??Y!g??5?b#???r???E*?D??????|DT? -q|n?3f??7!??u??x???m:??s?? ??Ns???w?$???`?n?Z???f??%?"?nq?e?? -?,,u???d?a??jr?}?i????0C4^?}N??????-??q#?iMZ?c?q0Q?a??78f?yNN?m4R?k1?-?X?d? b/l?C??W?^??(????Iga?W????Y0KfNw6Kr??.?+??uoO????l?D????P+?rq"??????4????H??????>????<}LEt?&??7???????n?`^???????m at x??x?? 2M[ +?????"??HQ????c1??_??}endstream -endobj -82 0 obj << -/Type /Page -/Contents 84 0 R -/Resources 83 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 127 0 R -/Annots [ 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 121 0 R 122 0 R 123 0 R ] ->> endobj -98 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 572.1561 154.7972 581.0627] -/Subtype /Link -/A << /S /GoTo /D (introduction) >> ->> endobj -99 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 550.2982 162.5882 560.9481] -/Subtype /Link -/A << /S /GoTo /D (using-numpy-i) >> ->> endobj -100 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 530.3729 189.1283 541.2121] -/Subtype /Link -/A << /S /GoTo /D (available-typemaps) >> ->> endobj -101 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 510.4476 178.7476 521.0976] -/Subtype /Link -/A << /S /GoTo /D (input-arrays) >> ->> endobj -102 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 494.5074 190.5034 505.3466] -/Subtype /Link -/A << /S /GoTo /D (in-place-arrays) >> ->> endobj -103 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 478.5672 185.4226 489.2171] -/Subtype /Link -/A << /S /GoTo /D (argout-arrays) >> ->> endobj -104 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 462.6269 186.7573 473.2769] -/Subtype /Link -/A << /S /GoTo /D (output-arrays) >> ->> endobj -105 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 446.6867 245.8948 457.5259] -/Subtype /Link -/A << /S /GoTo /D (other-common-types-bool) >> ->> endobj -106 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 430.7465 262.7715 441.5857] -/Subtype /Link -/A << /S /GoTo /D (other-common-types-complex) >> ->> endobj -107 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 410.8212 174.6126 421.6604] -/Subtype /Link -/A << /S /GoTo /D (helper-functions) >> ->> endobj -108 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 392.8286 153.5624 401.5459] -/Subtype /Link -/A << /S /GoTo /D (macros) >> ->> endobj -109 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 376.8884 160.5759 385.6056] -/Subtype /Link -/A << /S /GoTo /D (routines) >> ->> endobj -110 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 355.0304 240.5847 365.8697] -/Subtype /Link -/A << /S /GoTo /D (beyond-the-provided-typemaps) >> ->> endobj -111 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 335.1051 213.6367 345.9444] -/Subtype /Link -/A << /S /GoTo /D (a-common-example) >> ->> endobj -112 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 321.0976 194.7271 330.0042] -/Subtype /Link -/A << /S /GoTo /D (other-situations) >> ->> endobj -113 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 305.1574 179.6044 314.0639] -/Subtype /Link -/A << /S /GoTo /D (a-final-note) >> ->> endobj -114 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 283.2994 142.0953 293.9494] -/Subtype /Link -/A << /S /GoTo /D (summary) >> ->> endobj -115 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 263.3741 182.5135 274.2134] -/Subtype /Link -/A << /S /GoTo /D (acknowledgements) >> ->> endobj -121 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [288.033 198.1192 317.1934 209.9797] -/Subtype/Link/A<> ->> endobj -122 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [312.5275 186.722 341.6879 197.5612] -/Subtype/Link/A<> ->> endobj -123 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [350.8735 174.7668 380.0339 185.6061] -/Subtype/Link/A<> ->> endobj -85 0 obj << -/D [82 0 R /XYZ 74.4095 789.6651 null] ->> endobj -86 0 obj << -/D [82 0 R /XYZ 74.4095 771.7323 null] ->> endobj -96 0 obj << -/D [82 0 R /XYZ 74.4095 613.3264 null] ->> endobj -6 0 obj << -/D [82 0 R /XYZ 74.4095 613.3264 null] ->> endobj -97 0 obj << -/D [82 0 R /XYZ 74.4095 585.1076 null] ->> endobj -116 0 obj << -/D [82 0 R /XYZ 74.4095 254.4078 null] ->> endobj -10 0 obj << -/D [82 0 R /XYZ 74.4095 254.4078 null] ->> endobj -120 0 obj << -/D [82 0 R /XYZ 74.4095 213.5613 null] ->> endobj -83 0 obj << -/Font << /F39 89 0 R /F44 92 0 R /F8 95 0 R /F51 119 0 R /F56 126 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -147 0 obj << -/Length 4012 -/Filter /FlateDecode ->> -stream -x??k???????E???R?7? ?4NS4I?^QMQ????????????;Cr(R??? P??1?????t??m?le???X?j??fw|?mn????X??R?Ri _???j?7M?????>za7?u?????? %??h????z????WWl??^5B???????Gxu???]???JgH?k?Q&??#@ p} ???k9,hl?????1?????}???=\?w1??????????-?4[$????j??????~? ?6o?????IN??????#.D?W? 0???s??9B?m??& #EOuXy>>?6???\l?Z???? ?, at HD?J??l????&?G4???{i???*?5?????"?}v??P0?Z?H?k-?*?*~z??0?dR???|@%?5Zd?_??????????vF?Le???R??Y^N?????)??w-???6f_i'????x??Q???$+"????p Tt???0ON"Dp??(??7QP?-i??o?S??2 r(\)?_"u?????@?^9???ZAv~J?4n???????????PG??1????????>? A?e?EI????[??z?C^&??p}???Ix? :7,h?dD?????Ydc?`^??6?? -??)pqr??<lTx?eS???|@e?j??M%S?U??3S??V&????? ^?????????j!??????????u?O??h??v??,X?`p??????7^3????????????? 1??????$Z?1R?2)??? Ol???dp:???8?>?)4 ????(??"??8?wpC???3A?6?s?-?ci??G;????m??s?0?"??????s??N(?|&??G?n?`"????y??(?\b;?*e?F;+?b???j???" o???q???????u?????? -?L??]??$????@N?{a??=??a??I?>Jd??-:??U???c??m?:?l??o??y?|Dp?????6?)?A?? I????????c????\@ - T?v???y=??/?tH*?????O???*?????i?????[???`?Q"?=?8??~??}F?C?Ol?4???p{???"???9p????????M?sWQJ??????gQ?S63X? ?m+??r??U?`e?? ??;????m?;?Q[(???'?&?`??hW?;??n?tT?=B]??s??A??W ??b?????C3`?T4?<`??K!??zJ???yBNE??BF?j??'???C???d?b'???BZ??????H|RjJ?Cq?Y ????S???C???E5?????xX>?/y?? ??'B??????}8???j[?0).;>_PniZ??z???Re53???]?J??????q??q???-??`??m?????????????2?)??~???.???Z?7s?? ?tL??? ?!MVKG??)QH?!)U&]??U?[??J???:? -??(?-H_??HS?`???#???AV?i?`?=jN???????D?5?W???N??k??? ???6?B?b1S????l%???t? e???8$;??^ NzvV??:?Q2??P??|Y?m????????L??= ?&??[?O at +?~?[??l?D?m!A]??q??N?s'? ?~tT?+???E4?Qi"?/???dq2???E(???7??c?b?}?Hy?> ???)q?S?r??*?+???4??1o ???????)'??????I?-q{R?|????A]??BI?l??e)?>^:.?@8?1??U??v???nYG?>????WVx??D?-I=;XAv???"???)?0LB?????+?7???C??B???f??A?B|d?d% ?QB|??/?????<???p -????1???? ???j?+?????L^fj?Z?N?????????? JJ /d?? -Nj|vR?aF???luBv???4??:??8_?HPH????????L-e?kY?f?????9\???E|?3\??ws ??;|?*??3?!??Z?p?_DK[??3U\?O?? ?N?O??|@?M?? -?a???e?!C~?+{??:S???b?o>x?}??????E??g~??u???C?~?7?????B2A?q????e????N?Z?=?(-?r?q??K??96K+?[SVS?)`????????Cl? vH?? L??}J???q?'D5???????????P?J?a]@"1??)???-?}??TL?? d????? -?R?)???????7!?n?y????o?r???E?.4?0?i?#???????sU???B?(?&?`_??^>??jw??#??Z?Bbr? -'}??Z|???*?rXu?UV???????? > endobj -149 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [312.8897 746.8856 342.0501 757.7248] -/Subtype/Link/A<> ->> endobj -150 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [124.3686 699.0649 153.529 709.9041] -/Subtype/Link/A<> ->> endobj -151 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [105.5626 674.5966 137.9707 686.4571] -/Subtype/Link/A<> ->> endobj -155 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [178.0471 663.1994 213.3644 674.0386] -/Subtype/Link/A<> ->> endobj -156 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [145.9004 650.6863 178.3085 662.5467] -/Subtype/Link/A<> ->> endobj -157 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [185.0642 539.3837 220.3815 550.5019] -/Subtype/Link/A<> ->> endobj -158 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [375.3565 527.7075 410.6737 538.5467] -/Subtype/Link/A<> ->> endobj -159 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [168.2912 515.1944 200.6993 527.0548] -/Subtype/Link/A<> ->> endobj -160 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [486.5452 503.2392 521.8625 515.0997] -/Subtype/Link/A<> ->> endobj -161 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [88.3572 479.8868 117.5176 490.7261] -/Subtype/Link/A<> ->> endobj -162 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [332.17 467.6527 361.3304 478.7709] -/Subtype/Link/A<> ->> endobj -163 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [199.781 432.0662 232.1891 442.9054] -/Subtype/Link/A<> ->> endobj -164 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [368.9173 432.0662 398.0777 442.9054] -/Subtype/Link/A<> ->> endobj -148 0 obj << -/D [146 0 R /XYZ 74.4095 789.6651 null] ->> endobj -145 0 obj << -/Font << /F8 95 0 R /F56 126 0 R /F58 154 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -167 0 obj << -/Length 3126 -/Filter /FlateDecode ->> -stream -x??ko????? -%rqb?o???R:??G?^)?<o7a|0?????W?i -?K?G?W?j?Vc? _i?????RJ?) -R??????2?&?p:?"?Z???? \???O H??;x???-??#??w????!?[L ?Gb?x???,?LZ?s????0????????bO?Q?a???????r???*?z?C??p?csf??????k?hL?? f??M??????\??6*??L?=l ???kx?W???kzrn\6;?????_e???V20???}l?n)??t??[?0(?:gAxDq?7??}p1T????2????d??E??^]?????:?O??Z,?d????c|???~|?????????vf? 5?a?3 -??Y?????`???zJ~?<{~???O9?|??????PrN?v?l{1??X??4??*9?$??Q???S??\??????6u.???h3??|)1??????D+?q????S??? ?K??Y)P?.???-?[??`?@??s -?s?Ho?? a??y`?o? -?"?xRm?d???????3r????W|???=h?vU??/F?????? -?$mx???,??B?J5 ??*A?o??h?'j)?u:??X???kZ?Y??:ue?D????f?yh? -?T??x???= -R?R???1?6??Q?NlB?"F????Lbz?54%[`?>C? D P#s??^t??&\??4??eK???>+)T?LX? ;l????<6???z?"an?= +a|??W;?.??%?m???m+ -???|??W??a/t??w?CC??2?????u?  ??*??b2??5 ???)xG!?z?^??K?G?Oz L??:X?7C+k*???????????P?1???????\???oI?'?1?l???]p]???????|??rM???m8U]WB?0?|Y=?5n?4?10Fx/???L?p/]??'??TZ9MN???,O?s?7?8?7?/ ????x???????? ?#H2D\??m?:t?4????H??????GM???F6?Ul\?T]t??G???Z?????I??????)6??G??????j,?]????4g"I_%??]??c????2???" 3??m%!?d ?!?TK+??MUK#)?>?Y?9??l?????m3+?4KZ??P???k?j?an?7?I?????D^>S#[???)D?|?? ?????A -p+_?6Iw?F~?=?????e?5?????_??+E??M?)?_? -y?:Y??|?,J?>>???-^e ??S!???d?N+???`x????O,?/??!#?U????-7l}&???%?0k????0??A????n??M????E?????????^?"@?}?????I?#.??G????j ?r??????-?[g????$u??%~?{i??? -?C??E(4LB6e?~Y?/3?{Q????dQ?????? ?X3Y3??E^??C????Y,?i????}v?s?P9A???)1??bfA??l{3Z|?o?? ??d?nf?UC???>@R\??U?b#-TH???> endobj -169 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [98.5482 758.8407 127.7087 769.68] -/Subtype/Link/A<> ->> endobj -170 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [258.754 758.8407 287.9144 769.68] -/Subtype/Link/A<> ->> endobj -171 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [204.2029 307.9714 236.611 319.8319] -/Subtype/Link/A<> ->> endobj -172 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [185.0902 284.6191 217.4983 295.4583] -/Subtype/Link/A<> ->> endobj -173 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [267.0288 284.6191 302.3461 295.4583] -/Subtype/Link/A<> ->> endobj -174 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [73.4132 272.3849 149.368 283.5031] -/Subtype /Link -/A << /S /GoTo /D (helper-functions) >> ->> endobj -175 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 260.7087 108.7305 271.548] -/Subtype/Link/A<> ->> endobj -176 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [270.1513 188.9777 305.4686 199.817] -/Subtype/Link/A<> ->> endobj -168 0 obj << -/D [166 0 R /XYZ 74.4095 789.6651 null] ->> endobj -165 0 obj << -/Font << /F8 95 0 R /F56 126 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -179 0 obj << -/Length 3162 -/Filter /FlateDecode ->> -stream -x??k???????E???D?/?j>9v??H? ?"??X??????^n7u????3??"EJ{???0???? g8o????|aSm?????4_?????={? F??)?x??6Z??v?X4)??/<|j=?;?-.^-`Lj????t?Y\\?}y?]"?{?D?@?(D???z??G??`?)?8?{?????????w_ < -f?f???9?q?"????R?F?j?*^??lk????????k??p??d??M????J#??u??.*F??E ?%?jWO?(T???`???X?? ????X?@??Z???I?2#u????s?K??1?>??K??/)6??~+??G2??K ?LK?[?K@?oH???ax?? ?Cm??^3&Y????!^????? ?:?? -??=,,dX????U???*?-????\r Fz?C???n ??en??????`?_ds[??x6? 8%??}3??o?#@???? >|???n?KLAx;?? ??;?????N???9??sf??V?z??w?{q*u?M?A?=h?Sw?+Z?F?%+j??h;?VZ?/i;*?K?I=v#??#UDi????(m? ??N?????`?N?h?B??Z?T G2Sl???t~^z%????-??????P??u ?2'?^??Q?3- ???#?q((?T????^?>wY?(??r3???!????$5??vC ?g?lF?Dt7?e]??_???ik??????? -?',??(%=???? ?%??q??]??5]?Q?w?CI??vXZ???V??\zt5l?F????K1YJicx???? ??T -u??5??????U?}??gT =???????? ??D?BQ??g?y?????>I&?&?&??? ??@?'?^U[E8??'w????^c??N?s ??;???f???5|?\?? ('?.?CRfdB?1?7)|? -?(???"? ?5Y??8w?Y????y?r?^?S????6???tP????1???,:9?gNK1??HV??{?`h4o?&?????r????W?\??5???^?d??????hWTj`?0?J?z?????????????_LQL7#TH|k.?E? ? ??S?!?>???????7?:????kB;?4??}V???]V3?6??P??O??\??? ??W???]?? =_?U? )??qw??^??"??c?e4?c?x?m9 9???6?H ?-??_?2i??\\???G?a?:??8???j<'?OX?????????????<,T?U???N?e?/f?????C?17????:@?? ?????j?%??)???u"??+?=?]??\???!??IV???v"??????a?a";5 Ml?????D!????3?E&?U*%j,?Z?{??xF(?????zB?0?d?f????iX>????4 v????i?R_?9??)?TwLh?hf?M*???t *e?=?K?E?R"4?u??w?N,???a\?yY$@3?P'e1Gs???h])?p???eb8S]B&??L??Lfh&2??IB?? c'f?i???> endobj -181 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [110.73 758.8407 139.8904 769.68] -/Subtype/Link/A<> ->> endobj -183 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [175.0442 617.5703 204.2046 628.4095] -/Subtype/Link/A<> ->> endobj -184 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [474.6661 617.5703 503.8266 628.4095] -/Subtype/Link/A<> ->> endobj -185 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [265.7793 593.6599 294.9398 604.4991] -/Subtype/Link/A<> ->> endobj -186 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [173.2926 482.8242 205.7007 493.9425] -/Subtype/Link/A<> ->> endobj -187 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [270.0076 447.2377 299.1681 458.077] -/Subtype/Link/A<> ->> endobj -188 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [314.0087 435.2825 343.1691 446.1218] -/Subtype/Link/A<> ->> endobj -190 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 344.2349 108.7305 356.0954] -/Subtype/Link/A<> ->> endobj -180 0 obj << -/D [178 0 R /XYZ 74.4095 789.6651 null] ->> endobj -128 0 obj << -/D [178 0 R /XYZ 74.4095 697.101 null] ->> endobj -14 0 obj << -/D [178 0 R /XYZ 74.4095 697.101 null] ->> endobj -182 0 obj << -/D [178 0 R /XYZ 74.4095 653.5817 null] ->> endobj -129 0 obj << -/D [178 0 R /XYZ 74.4095 424.0447 null] ->> endobj -18 0 obj << -/D [178 0 R /XYZ 74.4095 424.0447 null] ->> endobj -189 0 obj << -/D [178 0 R /XYZ 74.4095 380.8043 null] ->> endobj -177 0 obj << -/Font << /F8 95 0 R /F56 126 0 R /F51 119 0 R /F14 193 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -196 0 obj << -/Length 2490 -/Filter /FlateDecode ->> -stream -x??Z]o?6}?_?G{1f?O???n???;(??,??B?x2A?q?Jf????_?%%?N?]Fd???,?n?On4i?]???x?"i9?[?dq?W??1?lU??W???$!?!m???!???A???&@~??(????^?N???\??!?&?m????E]&????N??@?!hF {??}|=vq?8|??W?.???i?4??.???gkP {? -??}??s x??;????.&??=??#$?,??] -e??-])??I>?~.??I??%??PB ?j U/*?&??%T? ?????r???s?]?la????J??s??.???7u?t?8?\@?o*u9F??????%Z?l???l?{??t????}??%?m?O??? ???M?e?JzGX]?-?;?]?;??z???hT?z7P445?JzGX]?-?;?]?;??p?`???Y?D???-m?jcTA?VU?H;?=??W;?}?l???&???Qi?D???bT)*V?J?E%?]?J????S??%2?9Q???L%*U?J???R?EQ?y???^83??3?????P?qY?B?"a??hQr????/???E??9(~F????OT?w?*?.???+????? ?Ky_"?U~?????Gxx?W?`???6?j_9}????s?Z??r?? ??U%?d>??1????>??\? ?f}t???:L???>????=??cj??{?}w??i???m???? -???;n??wP??P{3yn?u??=??s5o?? ??i?K??ul?VJA?$8L?!8?YpVa??1D??F????C?(B.?i????H????:2??yl???????m??O? x;??C~??????Z??m9nlm4?uq?????m?rf??xa????-???W:I?=?Q?r}8:?-???]?YWn???? p??y#???-6;????????[????-?q??s+?&?????vn4p???a{???B?}9c????fw'"?i?d|4 ?w????6)????>???|?p?M?r  ?W??b+x??? f??????r /?P7?????UEk?????p??U??X?LqO?JFP)U@????.????????????F??G???V@?E ?]A?? -?????3????U?Q?DX=%Z??w!)?+??W?(??0( +?B?R?"??-?T?????O?Q????#?P???X?U?T??#U?E??y"???BV{? ???T6?1??V?J?v???w>*?+e???&mx?5??l?*?3???,??x?? ?Ly??6?????????a?'/???>?N?yO?????/??;????O??u???/?x????R???????@S?DK???L??+BG~?? ???"??Q?y???u?s??c???m4??E?,?%??+?`^||??b??|l????g??w??VJ?M????$K>??p7-??E??O??$T at aAvN2???!Z)6??;???endstream -endobj -195 0 obj << -/Type /Page -/Contents 196 0 R -/Resources 194 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 127 0 R -/Annots [ 199 0 R 200 0 R 202 0 R 203 0 R ] ->> endobj -199 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [192.2385 577.419 224.6466 588.2582] -/Subtype/Link/A<> ->> endobj -200 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [447.6812 577.419 480.0893 588.2582] -/Subtype/Link/A<> ->> endobj -202 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [444.362 322.3246 476.7701 333.1638] -/Subtype/Link/A<> ->> endobj -203 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [161.7108 310.3694 197.0281 321.2086] -/Subtype/Link/A<> ->> endobj -197 0 obj << -/D [195 0 R /XYZ 74.4095 789.6651 null] ->> endobj -130 0 obj << -/D [195 0 R /XYZ 74.4095 636.402 null] ->> endobj -22 0 obj << -/D [195 0 R /XYZ 74.4095 636.402 null] ->> endobj -198 0 obj << -/D [195 0 R /XYZ 74.4095 601.9391 null] ->> endobj -131 0 obj << -/D [195 0 R /XYZ 74.4095 381.3075 null] ->> endobj -26 0 obj << -/D [195 0 R /XYZ 74.4095 381.3075 null] ->> endobj -201 0 obj << -/D [195 0 R /XYZ 74.4095 346.8447 null] ->> endobj -132 0 obj << -/D [195 0 R /XYZ 74.4095 138.1683 null] ->> endobj -30 0 obj << -/D [195 0 R /XYZ 74.4095 138.1683 null] ->> endobj -194 0 obj << -/Font << /F14 193 0 R /F56 126 0 R /F8 95 0 R /F51 119 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -206 0 obj << -/Length 3459 -/Filter /FlateDecode ->> -stream -x??[_s???????P??!?L?;????Wi'?d2??,???\Q??~??. ?x7???????b??????U?k?tf???????f??Y]C?w??hmkml 3?k#??Y+W???????^??;c??????uk?vuq?S????????gk??y??)Y}???????|??[uug?E.?j-\?????? -????A???|?3?2?h}?6y?Y`"??X????wgki?-4??(????????*E??????L:j6?M??T??=??L?mAm?7(??iX?=?????????? *&??Ly???*????}??nl37J?????P?k???9??????3??]???$??? =?E*????=J?c>rTR??4?????d5 ??a77^sl&0]V???;d??????Dgj??[???u??_?Xu?4??e??iZ????????|`????y??u?;U?S8?H?,??Jq??v???T????~??F??%?z?'4~^T?{?:7?X?C?G?????hY8?5?? ?z?M?u?A???i?c?????????ft3??ge ??~??X?-??E???sc?1]????$D,?????&34?lmD???1?)???Y?j?*q8D??>E? ?>w???"???hfu? -????s???b?????ir???6a????2?? ?????? l!?o@tlO??=???q?R??us??4?? -]?i}Hh?_j?????????R????|??NX????l? -??&?Fz?????.? ??K???0KX ?Q????M???:U[!?#?2???S/5a{??T?M??B??WF?e)??P -??S\xu????V????@~D??????]??????TG?he?T??R?uz????-?8?\4??C--?a(?m`;???P ???q??ZK!????????R??????Y?$a?U?[ V?? ???? Lh????0D_?J??????F?GLQ?[w` ??K???P????d \"*?Q;?@???@?%y??j???i??+.????U??a|r??????????O?U???????????^??7????/????6?b?A?V?????M??};????q??:p???G?%?3?q?/?????????N??u5?I????UwB?#?O??t??+??D?e??????}???1????]+???S??G???_?v????y??~b????tFr???v?1??M?s!?.?{-?4??{????)?OY?:??m??????????h?B?$W|SS?ls?Q2N9Q?aL???`?ZL?? ???i?H????[4?E???"4?T?$?*j?>???.???v?_??5r???a??? 17????K)??@?k ???9???:m0E????~???z.O???)&?8a?Z??\???T?Y????D??????-??N?0KE p?f??S?S?i?p ???#YL;vZ?????=/?X?0??k?????h?r??dn?????? B??????2?v?Q????X??+?J?-?*^pf?d??*?uX%_?2?6?U/| ?uij -?p?{???r?7????!?u???;????|??n?B?????O????m4?%??R{,???i?iNw???H?/?w?M??M?ZYHQ??Lt?k 0GY?w=7????C?Z??c??n? ?????m?-?`?EBy?? ??b? ^1.?t(??qU7???)?????@?Bv????????jvcG?i??????xB?ed???,???4???w?|5?x+ke?6w???W?=*i?????G?&????B3&????L?%?3L???o??z(???z?????4+??D????I -?E?x??Kc????p???I??N?k?%?v?9????!??}l?????s?6??}??7???x???{t??(?:???Kg?%R???O'?!a?s?Y+q?+??Z?????>9h?^?B?0???C?n???????D?A??n?NYLC???T(?w~??i?~???q??D??p???3?8??!?X????^???%?S?% -*R??e??d?y,P?????????q?<|? -??r?????du?/?~?j??#?+eq??"??36????????7?>n????Z??f.Ys?)?? H?7 -!#h?>?!????JGQ.?`?6??$??-?!H??6?A?Q??s??[? ?\3???^"??j?8?~ O ???3 -z?j???????a ?:?:?j??? !??P?;?w???R?0????Q3??y? ???%?\??D?? ?4?4??&A?[0????OIU;??g? -??A{??????Z?.?9??r?,zP???OOiz?U??M??OMmt3?31??J?A????3; g!???B2?<% ?????????8??????Kz5?n??y?4?$p?[AZ?7?7?|?'??Le??$?Pr??? ?F?h`??-@????~?6??6Q??{???X8????_P[????Z??im!q???e1?4??:s????0E??%??W?X???_???x[r?LS???s>?x]??/?\F?A!??M?M?"?pg??????8?Fa??N?6qQ??@?\N&b???x??+$CvI??P!???%Tx?I /`q?R?!Y? -?u.???6?p-???_2H???}??r??u??_:M??li:J;? ??b(??.?\w(????#??G?v?G??????' O}a?2Z??????;?]?"F???*@?????`l]c@?N??;h?q?a(?]o????Pb2??$DS+???? e?ew?o?f??? -sendstream -endobj -205 0 obj << -/Type /Page -/Contents 206 0 R -/Resources 204 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 127 0 R -/Annots [ 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 217 0 R 218 0 R 219 0 R ] ->> endobj -209 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [194.6375 716.5495 227.0456 727.3887] -/Subtype/Link/A<> ->> endobj -210 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [280.5773 680.6839 312.9854 691.5232] -/Subtype/Link/A<> ->> endobj -211 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [338.3317 680.6839 370.7398 691.5232] -/Subtype/Link/A<> ->> endobj -212 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [325.0489 552.6042 357.457 564.4647] -/Subtype/Link/A<> ->> endobj -213 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [112.7078 517.2966 141.8683 528.1359] -/Subtype/Link/A<> ->> endobj -214 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 505.3415 105.8213 516.1807] -/Subtype/Link/A<> ->> endobj -217 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [333.1098 273.3621 423.3722 284.2013] -/Subtype /Link -/A << /S /GoTo /D (available-typemaps) >> ->> endobj -218 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [253.4973 169.7506 313.0848 180.5899] -/Subtype /Link -/A << /S /GoTo /D (input-arrays) >> ->> endobj -219 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [403.0247 169.7506 474.368 180.5899] -/Subtype /Link -/A << /S /GoTo /D (in-place-arrays) >> ->> endobj -207 0 obj << -/D [205 0 R /XYZ 74.4095 789.6651 null] ->> endobj -208 0 obj << -/D [205 0 R /XYZ 74.4095 753.0247 null] ->> endobj -133 0 obj << -/D [205 0 R /XYZ 74.4095 506.3377 null] ->> endobj -34 0 obj << -/D [205 0 R /XYZ 74.4095 506.3377 null] ->> endobj -215 0 obj << -/D [205 0 R /XYZ 74.4095 471.6552 null] ->> endobj -134 0 obj << -/D [205 0 R /XYZ 74.4095 320.3306 null] ->> endobj -38 0 obj << -/D [205 0 R /XYZ 74.4095 320.3306 null] ->> endobj -216 0 obj << -/D [205 0 R /XYZ 74.4095 285.9271 null] ->> endobj -135 0 obj << -/D [205 0 R /XYZ 74.4095 158.7917 null] ->> endobj -42 0 obj << -/D [205 0 R /XYZ 74.4095 158.7917 null] ->> endobj -204 0 obj << -/Font << /F51 119 0 R /F8 95 0 R /F14 193 0 R /F56 126 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -222 0 obj << -/Length 3687 -/Filter /FlateDecode ->> -stream -x??[?s????B_:????~r\;?I??V'?I2Z?e??????????xp8???$?9???X,??? GvL?;6?H?????h??????_@?gG,?H??T???D?\qJ???x^2?????s?e?8?????a,??????7?? ???YnN??????j?? -??'???C?5]??t????b???c??@u????????I?-.sD+;???d????? ?|^?7?7L??27?:&GR?U9Q?g??ZW??4??j????>????YP?Z?a?Gp??vu?w?9I?7V?????????F?ul?+?7??"??Kx????2???=????~?"?#i?4?~?]?? ?Q1^?qd?x????:J????&F?i?????_E?5h??/???m??l????0??[????+????~eJ?} ???aH?7??Q~???N?????r*?????r???????W?Z????hP??!?:?Y?????I6?k??OX?";t???{?${??_??? m("8#`?Y?+CQ???N%?LM?? ?4E/??w??l W???????<+?{?Nkb;=C$??*0?D?8;?$????GM??v??????'kh???d*}}n?BX?9*?a????K???%y | ??5bhE????HD{????X }*.? ??j?}X?]j -l?R?.M?????=?R ?X?U?E?T{???X R%EQ??+??gqV??:?^???~M?????P?E?????%[?m???i;?????I?=??????[???0Sn??G)????0?0????e??6??????.?s.?H???ng??V?P???X???8??[g}d??O??????C |C0M?drT? 9T??'iN??n$????l}?5??zI???E ?V ?M????????u?G???vaq??>????.3Z?r?#??RI?!???zOU?g???),??X-?tA?S?5????/B?v???? -?_?L?gtI?rU?>?Dn???#?*?????J?????????:k=^??!jXW??3)?-?^???w?8qF???`:i???????)???e??????e???!?hi7????????;*E???G???b??w ,S?E?9R?x? -~?q??s??ms??R????jq?S?Hm?o??eL;W? ??C??DJ?6(L?k????A??)????#???0Is??????o?????Ab?g????g+??.??????M?????(G?/:??.R=??\1b???'?V??W+M?? ???Yu w?????????? -?{=a????4?N?h??L?d{. ?U?????V.U?^? -?W?jF?2?-??p?????????:N}B -?rT|g???X?E ????????h?AC -8x}??H"?RD?U?L????%QM?cSQDS#+~x?=?2?s?????)????@??????} ??Za*?f??\??:jL??? -?_?D??U?`?BC\TK?'?Y?????????D???R?????O??o|?Y}O?I$??Q????s}o4??????????mH? ?b??x???L|??!U??3??-ym?i|?6??&^???2???cvH??2?s'?yA?????gN8??? ?????_{*endstream -endobj -221 0 obj << -/Type /Page -/Contents 222 0 R -/Resources 220 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 237 0 R -/Annots [ 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R ] ->> endobj -225 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [110.0908 728.5046 142.4989 739.3439] -/Subtype/Link/A<> ->> endobj -226 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [162.8935 728.5046 198.2108 739.3439] -/Subtype/Link/A<> ->> endobj -227 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [489.4544 728.5046 521.8625 739.3439] -/Subtype/Link/A<> ->> endobj -228 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [92.7704 715.9915 128.0877 727.852] -/Subtype/Link/A<> ->> endobj -229 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [486.6948 540.649 519.1029 552.5095] -/Subtype/Link/A<> ->> endobj -230 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [92.7704 528.6939 128.0877 540.5543] -/Subtype/Link/A<> ->> endobj -231 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [337.2248 528.6939 366.3852 540.5543] -/Subtype/Link/A<> ->> endobj -232 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [432.0992 528.6939 464.5073 540.5543] -/Subtype/Link/A<> ->> endobj -233 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [148.2193 492.8283 180.6274 504.6888] -/Subtype/Link/A<> ->> endobj -234 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [202.5826 492.8283 237.8998 504.6888] -/Subtype/Link/A<> ->> endobj -223 0 obj << -/D [221 0 R /XYZ 74.4095 789.6651 null] ->> endobj -224 0 obj << -/D [221 0 R /XYZ 74.4095 753.0247 null] ->> endobj -136 0 obj << -/D [221 0 R /XYZ 74.4095 481.8694 null] ->> endobj -46 0 obj << -/D [221 0 R /XYZ 74.4095 481.8694 null] ->> endobj -235 0 obj << -/D [221 0 R /XYZ 74.4095 438.7979 null] ->> endobj -137 0 obj << -/D [221 0 R /XYZ 74.4095 415.7379 null] ->> endobj -50 0 obj << -/D [221 0 R /XYZ 74.4095 415.7379 null] ->> endobj -236 0 obj << -/D [221 0 R /XYZ 74.4095 383.3746 null] ->> endobj -138 0 obj << -/D [221 0 R /XYZ 74.4095 163.9773 null] ->> endobj -54 0 obj << -/D [221 0 R /XYZ 74.4095 163.9773 null] ->> endobj -220 0 obj << -/Font << /F51 119 0 R /F8 95 0 R /F56 126 0 R /F44 92 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -240 0 obj << -/Length 2912 -/Filter /FlateDecode ->> -stream -x??[[sb?~???Q????/~s\v*??N??v?X???%X ???}z???3h?U?+???????s 3 ??Lq??3? ?R???? -??????H??\".???? A1?R??"g?????~o AF:??? K??Q???????>??7?????????Il1g?i?z??A? -v???1?V????|wJ*-*c#?YT???^?:'??9#???????u ?0??Q?????????-@?? -#f4?????1t?x???"~|???????l??????B~???7???~???????)CB0???D?IqD?.Sh9?T?@)A???D??}?p???h7?\P?~NuT6????,h?"????6?8@?lV@?^?????\?"??E?????[?;+?q??b-??g??F??0?1}MD?EN?4A?=???W??B???GZS5??Z???3???????a ???????Z9????f??????&?F???J?????????????V???z?TQ????J????@?]??D??9????n l?f???0L?????#?4?????-(?{u?,d!?fj??.???>?'A??}???]???????w?x?mK???K???n???IM?????(?&? ?p??T?d???q&??????n???p? *?? ? 8??Cqd??9vB1??????? ??iD59+?.?+??? ?ju??9????x* -4LD?h?% ???@? ('?H@?l????????&?Bl???Y?R?C??J?j4?4bX?2?H???K;??"}??"/4lGYIq???*NT??kZ???????~?c??F??JJ??0[?%1$???&??t%!?ZJ_?t???r~?k?cq? 1*;Z?aF6???l???rnX???a.?r????v!???????b?%??_?$???ch ]?????;h?o?_?H?vd{??i?'?i??(??&??S?Ccz^???????????s?,?9?|???.??X??y%A??,???????~?E?^??8??AQ2%?3???S?|??????8????Z????k?j?$??,??C??.????????sk????V?:??S? ,n??z ??W????|6????6??^??Cl??Z???@b??????;????4??m??Q;?i8?:?!?yo?????r??7j?8.? -??j?n?T??qRh?k???1?y?1N,-????????t?#%??Z??1P7K- -?????7?(D??Rv"?D????. ??n?6?48?????l???????&;k?v ?{?)?k?H?B?]????E?v???f;?;Q??=NT?F""k]???(A"`hF???????e@?M?4??l"??Q?I?!??D??D??z?l?W6g??????|kp?*YkF??n???T??Y?Y?>?????b??????Q|??????L=? ??x?RKx??K? ?y?|?fnX9}???)A?z9?9??WKw??t?}?$???c???~?*??)??V???)?Oo????a????h???1??b?"??? ???????x???@5??c????D???????[~Y???m5E?bU???????W?j- C? j?-?)c??????1*?a?b]Y??XW?h]?????l?.ve?S????M]?m??J?[???485????? ?F(??V ?n??d????Nm?r???D?{m??RCy:(?s???9? K?i??dn?vK?B?'????wg?j{?Y????g?*?4h? R?V?xE?F!l????edS????6)?`o?????b???\? -Z??n?V???mR??mZzl? -????V:????/r???j?#????U??]>R ?s??1???1A,?@u?soe???0?3?6?6?? a?9v???CqAf?Z??Y#????#\??V?l??eKx??{?3???J?/>?PS???E?eH?????}?(?3?G`??????!???U??OQl??3?$?VT?~???V3 ?S? ???Y???6D?i??K?K??At{?C,?????????????????-f???1??U???i?{3;?0c??9???a?<~~\????6_ ????? %?y???p?s?= -a??Lp??????????????? D v?ad??x???~?]/?????mV?eT?[?Vo?BS?V ??n???Slz??)??Q???????+^?m?Q?@????*??"D$%? -ND??5??,D???_?mOP??&ZD?EF??{?????E?kq???y??W?endstream -endobj -239 0 obj << -/Type /Page -/Contents 240 0 R -/Resources 238 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 237 0 R -/Annots [ 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R ] ->> endobj -243 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [271.0812 690.5936 303.4893 701.7118] -/Subtype/Link/A<> ->> endobj -244 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [215.8886 605.3217 251.2059 616.4399] -/Subtype/Link/A<> ->> endobj -245 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [370.565 589.4719 405.8823 600.5901] -/Subtype/Link/A<> ->> endobj -246 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [240.3865 520.0498 275.7037 531.168] -/Subtype/Link/A<> ->> endobj -247 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [338.6766 520.0498 373.9939 531.168] -/Subtype/Link/A<> ->> endobj -248 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [279.4096 506.1473 314.7268 517.2655] -/Subtype/Link/A<> ->> endobj -249 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [265.8608 396.965 298.2689 408.0832] -/Subtype/Link/A<> ->> endobj -250 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [258.5279 383.0625 293.8452 394.1807] -/Subtype/Link/A<> ->> endobj -251 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [368.8832 355.2575 401.2913 366.3757] -/Subtype/Link/A<> ->> endobj -252 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [265.8608 273.8803 298.2689 284.9985] -/Subtype/Link/A<> ->> endobj -253 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [258.5279 259.9778 293.8452 271.096] -/Subtype/Link/A<> ->> endobj -254 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [207.6747 230.2254 242.992 241.3437] -/Subtype/Link/A<> ->> endobj -255 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [389.5264 218.2703 421.9345 229.3885] -/Subtype/Link/A<> ->> endobj -256 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [247.2111 136.893 282.5284 147.8219] -/Subtype/Link/A<> ->> endobj -241 0 obj << -/D [239 0 R /XYZ 74.4095 789.6651 null] ->> endobj -242 0 obj << -/D [239 0 R /XYZ 74.4095 755.3439 null] ->> endobj -238 0 obj << -/Font << /F51 119 0 R /F44 92 0 R /F8 95 0 R /F56 126 0 R /F14 193 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -259 0 obj << -/Length 2796 -/Filter /FlateDecode ->> -stream -x??[Ks#???W?H?v`??9?8?????rQWR"??(Y???s0???*oUj??p????nt????d?8?????I)???? /?a?g$?p.R????? ??? |^??-|.???p??= -j???D???~V?????X>?g???<?;;F?k?E????\?????m??o???z?????]^nVT????w?n????@????????+?t?X?? ???#?k?????????@??~K???Bh?????????+?nYW_????K3K?$??]????sT97??A??z?<????"??x?$r??y?a i?Y?#Y?%???????)???Wr??????nY???|?4?X ;i? ?>??vc\Z~?6F??b??1??6???d7??Y?9`&????|????Hw? 0??9?~mg?}?J?????x?v[0'???'{?&#hl'?(?=?^?~4?d????i?"JXw^?????[?`???`M????.?YB"}??>/??k??^@?p??/?h?$g?O??x:?(p?L???F??Kg??sL???c?C?$?????9?,? ?} -Qm?}_?)???$?\???%?????5:??????;7???n??iXn??hw?\??????dKY???_?#p]x???8??j????r?aO;??RH3Up=?, ?h??\??i????g?????????d???+u?D!?sG??vt??XjVX??nk5?? ]*z:'?==T#??>?f?x?i??6$?????!??L????%X??:??+ &x?[?o?b ??#????{!??Q?5??5 `"?B???gr?p"?}???Q???y???aI?x0T?k??\?B?+???????y?$?d?????????Z?c???`?T?(?E??i?D?V?a??z?ED??7??)?????o??oM?c??r????-Z??~?Y?mC??9??(??{?A5}?f??'(????[???vo3?V????~U???P?-?l?:Qu???,m]&[?$?IW???~????r????=g?z??J?W?7?X?rL? ???????m?)?gr?A<????};Y3P?yJ]z)??R??BL????T???$V???Se?a???^??:4???7??O??? ???j?j????u`?p???t ?~? -?oW8Umfq2?!*y???#?P -M;',5??z???dO?|??'6(?/??F?vc%??V??_????6$?;?? oJ?P??p??c?l???@:VB???I?/?\;?????????n??????OQ?YB$T,?>???[??o???[??M???0?{??Z???S?5?^?u???d?R?????-7????j???????Jrc7w^j]?mhD?????C?H????l?????&H0J?fNT?????J???{?????V^??W?D?G ???Rn?+?*k2L???v??f??@??????e?`??N???~Z?Ix???t?????&E?$???f1?f??&F `Ao_*??7?FUl??~????q?9Fcz??sl??D?????o??*??b??1-????%?/??A???????Q?"U??5??jV -??\f???r\=!:?N{??`?C?0?_c?#??f:??(?v?? K?e?D?m0?j"?U??[d2?=fa??w??xx|???5?B!?4;??)?H????W?p}?????????ex_?r????? ??i;?c???M}5}???+p?]Y!?7?FQ?ai;?z|K?@?7!?H??&?!`?gl? ?r4 ??>e?F???j$)?????z???z??i?&b?do?????d???9?F?LdVcw -$?_s???dD??????4}I????tJiN?????[L?rS5????????Eo8????l???p2?Cz??????-=???o???J!???Vs?V?E?~?5??QV??GY.?xc? ??YP???6Y?? ;\?Ct?3? K?N??E???]??z7_?????f?O??*?l? 0?$? e???b????A?? ??k??wW???3?cn??3?V?Y???:? )K???y??~??????5??r????k?????#0?$??$M'?%?a$??/X???4?J??\???|?i?W ?I&????*:????B?S??????cu%?6???tO????6 -). -?9E1?uf?1?0??&?/ ?q?v???%;?uKv[n*?3???=????? g???D?M3???-=???7C"%?5zQ????,????)w??Rn=?r??S '?P??VY?ii?????l??M!?{z??:??!???cv????J> endobj -261 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [265.8608 621.0773 298.2689 632.1956] -/Subtype/Link/A<> ->> endobj -262 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [258.5279 607.1296 293.8452 618.2479] -/Subtype/Link/A<> ->> endobj -263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [247.2111 483.5929 282.5284 494.5218] -/Subtype/Link/A<> ->> endobj -264 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [399.6904 467.6527 432.0985 478.7709] -/Subtype/Link/A<> ->> endobj -265 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [252.4315 385.959 287.7488 396.888] -/Subtype/Link/A<> ->> endobj -266 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [193.9002 358.3426 226.3083 369.1819] -/Subtype/Link/A<> ->> endobj -267 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [247.2111 288.3252 282.5284 299.2541] -/Subtype/Link/A<> ->> endobj -268 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [337.8484 246.761 370.2565 257.6003] -/Subtype/Link/A<> ->> endobj -269 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [247.2111 176.7436 282.5284 187.6725] -/Subtype/Link/A<> ->> endobj -260 0 obj << -/D [258 0 R /XYZ 74.4095 789.6651 null] ->> endobj -257 0 obj << -/Font << /F14 193 0 R /F56 126 0 R /F8 95 0 R /F44 92 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -272 0 obj << -/Length 2577 -/Filter /FlateDecode ->> -stream -x??Zmo?6??_?g\???????i?-pm.5?ph?B?????????????!?%Q+?AP?????p^r????b??zQV????|sT,.a??'? S?????]iQ???X?L?8;z??ZXf?0???? )??4????????????'|y?<{x????~?B?d?,?*?kj?|?){B,???Dx D????j????(???? -d????????W?{?&??[|?4-????J?es???\!????"k??????t?X????A?-?-;Y??,?"9???N?zO{v{p?&??s?????m?E?E??c?m?X?_?[?US[BN????Na?T????e|??u??x??>E?p?????-?h??z~???d??lY???a?S?K?y?l?_? F;f???A??KT?????*`g}i?k?? $A??rZ4!v_R`??W??|y??????????? ?I?D? -?Z^?z?b??~??E??}?\*?????(J????????5X????I[??=??qk?bs$??tx?>???_??"?U????1TV?2????o??.??Cm?e???E?LUe]? ????9LCP/?q????????nC?Qn~???l???B?~;???@ v??Cq?SwyGY ?P????/?????B?-?V)???9H??K? U??Sfc????@5?????_f ??k |??l?????? l\?Z??(?%??(K?EY ????r?(??GY*v???G?OIuN?????u?'5???otQ?bU????????}?T??w?`q -1?u??# -[????\_? ???p??5?9?~??????+,????yBv???l???v>???<????w;??0????D?h?C?;0z?hV -"d&??W?1?@?K??D@?3????t`??y?LlX??????\X?(?????s ?@/??`D???B?q? ?D?l?!???2 ??"?p=@?L?B????J???!?????zs?*[???c??s]$????:>b?@?+ $d?@?a7 T3Z&6`?????y?^*??K?t^OZ#???@&?N0????????`o??N$?M? ??'?q0j6?7?85 -?????N?Y ?G8 ?q???z?]ob??????????3?5 z?|?bn????f???<{?+????n??!)????"4Y?<#?? -???nM?&???L???????????x}L??e??cS?????x????;O?D?d?2{??W? ?wW??iv$??F8}?i26???xG???????x?????fV*?.??*]0???E ???^???????5????jF?,?? ????u?? 9"?I4Z????[Kkar?d?J?/??.\?8???U?>???????b??P?B?????t?7?B???*??1S!X??\?I?s|5???E??tm????{??7?f???RHV?r!kki??t _??#O??>?EK8??J??6?p?T3Jh7?M_???*?d?|??F?????????u? ???(* E^?~kw?Q`?]???? _Sr p?rH&?`?? e1? "??1?u?O~?????9=w?\C??r?ug??2?yI?.H?+??*????2b??dL??????s???2/h?? ??X???17??=?Z^?? ?????=?Z???> endobj -274 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [442.6299 746.8856 475.038 757.7248] -/Subtype/Link/A<> ->> endobj -275 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [247.2111 669.6024 282.5284 680.5313] -/Subtype/Link/A<> ->> endobj -276 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [214.901 616.7703 247.3091 627.6095] -/Subtype/Link/A<> ->> endobj -278 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [217.5744 555.4411 252.8916 567.3016] -/Subtype/Link/A<> ->> endobj -280 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [108.8202 463.8776 141.2283 474.7169] -/Subtype/Link/A<> ->> endobj -281 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [405.2133 381.0078 434.3737 392.8683] -/Subtype/Link/A<> ->> endobj -282 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [322.8707 369.0527 355.2788 380.9131] -/Subtype/Link/A<> ->> endobj -273 0 obj << -/D [271 0 R /XYZ 74.4095 789.6651 null] ->> endobj -139 0 obj << -/D [271 0 R /XYZ 74.4095 611.1535 null] ->> endobj -58 0 obj << -/D [271 0 R /XYZ 74.4095 611.1535 null] ->> endobj -277 0 obj << -/D [271 0 R /XYZ 74.4095 568.1002 null] ->> endobj -140 0 obj << -/D [271 0 R /XYZ 74.4095 544.7612 null] ->> endobj -62 0 obj << -/D [271 0 R /XYZ 74.4095 544.7612 null] ->> endobj -279 0 obj << -/D [271 0 R /XYZ 74.4095 510.9338 null] ->> endobj -270 0 obj << -/Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F14 193 0 R /F51 119 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -285 0 obj << -/Length 4358 -/Filter /FlateDecode ->> -stream -x??[m?$?q??_?0d????wR?$;???????cn?wo??????N? ??Ud??{z???0??R$??b?SUl~3??~cS??7?yf??7??g?????g?h?2Lic?f??V??9c?????wo>??W??3o??ys????????????l????J?6??|?~#??x?????"????????&??H???n? ?w??? _????p???s?Z}????[?%?{|?t??o???_iSMCp?8w??@??{?????2??Q?6?!????Z2F3?u???s????td?]%??YM3?7[?%???*r???"???_??????nv?Gx?K???#?p??o?jp?s????M?8?q??{? ?[??S???O@?D?'A?????e?43?R??????w|?F??">!???r ??x_?of?[????(!??=? ???c\&???s??2?F?????@h??3??R??g?? g??|? ??n??+P??=u?BR???KS??Y!|5?8?8???k`???NaYo???n [K5z???????6????lb?[ ??[zO2D????p{O#NR_?????bXk9 Lx??-???z???R??(b?#6??????cbt??]d??>???gx??{????N??i\4??I??E???'="??E/=s???O?vT&?F??0??<(??????xm?H?yG?r ?????f??????}???N???"?Rh -?0-E?_?i???1??i""??|C????'b??9c\??yJ???Bn?:??B)??M?>:?????r???`}?A_h?q?%??83??U?|a?4????w?o???t!?????E6???Sr??Hoq??????)??????}}DU????H?R??L???g?j?)??}B??zf2zk?? ?VX?Xr??2?Pt?? ?n?$4?\\??????????` ?2O??E?*?m?Y?U?@7[ ? `7?b}u2??n0????W??Z~??TW???+?? @>?X dd???8???R?q[ x?72b?5??w?u??????????=?>@Ra?;????q.\??1??G???? F??v?cl?aA|T]R? ?`???t?????z?vq ?t???6?H? B??s?????S?????LG0?Z????4?S????#?Vq?4?????@`?K0?c -?,?^t??]D ]d????g3>? ??\\1??~[7??y??.?????glX????%?TW??? ?f?J??????????X?j?G?v?????F?iI t??Z??{Y??????]tVo???O?\???1?h?????Ii ??69?_c?`??????8yv9(? -?X?>0Uq?>'??H? 2?>#Q3$?x ??c?mNN;af??_???#1[?"?????s?y??G??`B????f p???r9A? ??m?g?c???>?.WMn ?3?? ?v?e?aBC?5~??j>n?e?? 0????"?#?v?????C??ml7?y -T?c|W{l?o?:>R? ?)#??\L?h?n?$K??*a?????K???s9?5?lK???1??nmu?8.???i??8f?]??>???4?7?8??|??6eLc???8K=8?????B?;2?:? -6??:?#Rlvd?DF=`?+?4?o?+{3Q-? b?,6?^? ??<5??Y?f4??x;?Nj?j?o???l??4?{??D?????ve?? 4??/3??'}?$???2D?X?f??-?:\??-?B?c?(S?,G|??.??Y?m?[??y?v?i??|?""???s?b$0?W]???S???#N?G???O??l???v?DH????BB??+??? -3XtbK9',(\?"?[+?+T?5f?#=K?G?S?e.'W???'fH???_??????5?eN?P?[q?Ji-??0)??^??Hd???????]6Z???u2zv -!??[?????^W?'R?3?G?+?? ??????M5N????b(????HR?K5Y!5x?\?w?v?%??_?)???????5????????#????U??~G-?? ?\?&??e????"???r?%?j???8???n?_?=??DIX ??]?d??p?I????? e???>f 3??d?TE?#?nA\??fI@?nB?-MwB?4D?^??????_J?m???55??+???Z??????_??????&???kO??????PA??n?+??&???m?n??w????K7r\PN?x8O?M ?????Q?T8?D??k8_-???3He??t?????l????i?,8??S?ZV$?o??%?u{????4.?K?F?/????X?7?_?!}??????2 jy?p2?:?nC-???RQ???j??q???TWF?u??"%|?b "??cD??C??~?????A???F0??a?y>'D!W?2(30?? ???E7??,\>???43t??]?YM!????w???#N?J?|?&m+??^0Xv*wUm??A,bj??z?$????N????m?`???G X?5 d?U?l0??5?????k?9](?p???????3?Vm?:?v???!?t~?U?Nu _*?&????v?S?UqEJ???+???r??u'???C?AC?Xp|I1e(p@?~???SzX??p1F?3?????*q??G?????a?G??!????H??a???F+~Q???|?0WO?3?w??*|b})-'??fxz?%?0??2?YN|??? ?????,?V?9???!???kI?D?????n?dw?????e?? EDW?6?i?c???2r>sS>q????;u?qL????y=?wLh??'?mE4?!N7?????/~1?0???5??endstream -endobj -284 0 obj << -/Type /Page -/Contents 285 0 R -/Resources 283 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 237 0 R -/Annots [ 287 0 R 288 0 R 289 0 R 290 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 300 0 R 302 0 R ] ->> endobj -287 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [489.4544 710.7411 521.8625 721.8593] -/Subtype/Link/A<> ->> endobj -288 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [300.2304 699.0649 332.6385 709.9041] -/Subtype/Link/A<> ->> endobj -289 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [286.2454 687.1097 318.6535 697.949] -/Subtype/Link/A<> ->> endobj -290 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [143.6789 651.2442 172.8394 662.0835] -/Subtype/Link/A<> ->> endobj -292 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [356.307 573.1126 484.2022 583.9518] -/Subtype /Link -/A << /S /GoTo /D (other-common-types-bool) >> ->> endobj -293 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [120.2376 561.1574 266.3938 571.9966] -/Subtype /Link -/A << /S /GoTo /D (other-common-types-complex) >> ->> endobj -294 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [153.5984 401.4762 182.7589 412.5944] -/Subtype/Link/A<> ->> endobj -295 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [241.6158 401.4762 276.9331 412.5944] -/Subtype/Link/A<> ->> endobj -296 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [459.8353 401.4762 496.9558 412.5944] -/Subtype/Link/A<> ->> endobj -297 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [120.2376 389.8 165.5172 400.6392] -/Subtype/Link/A<> ->> endobj -298 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [186.1994 389.8 229.7456 400.6392] -/Subtype/Link/A<> ->> endobj -300 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [108.1855 323.6235 137.3459 334.4627] -/Subtype/Link/A<> ->> endobj -302 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [423.987 157.0286 459.3042 168.1469] -/Subtype/Link/A<> ->> endobj -286 0 obj << -/D [284 0 R /XYZ 74.4095 789.6651 null] ->> endobj -141 0 obj << -/D [284 0 R /XYZ 74.4095 652.2405 null] ->> endobj -66 0 obj << -/D [284 0 R /XYZ 74.4095 652.2405 null] ->> endobj -291 0 obj << -/D [284 0 R /XYZ 74.4095 619.8772 null] ->> endobj -142 0 obj << -/D [284 0 R /XYZ 74.4095 382.8262 null] ->> endobj -70 0 obj << -/D [284 0 R /XYZ 74.4095 382.8262 null] ->> endobj -299 0 obj << -/D [284 0 R /XYZ 74.4095 350.4628 null] ->> endobj -143 0 obj << -/D [284 0 R /XYZ 74.4095 213.0382 null] ->> endobj -74 0 obj << -/D [284 0 R /XYZ 74.4095 213.0382 null] ->> endobj -301 0 obj << -/D [284 0 R /XYZ 74.4095 169.4087 null] ->> endobj -283 0 obj << -/Font << /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F14 193 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -305 0 obj << -/Length 2527 -/Filter /FlateDecode ->> -stream -x??Z?o???_???k ???d??i?\????>?E?Y????n??/???????(Q+-?#?8??pf8_6?j???????+?<3F????????????F)??6^fV??????j??{????,???Yk?g?x??3k?E?????? WW??susw?9g??Lvs????Zn??}???D?? ?J?l??q] +VJ????x?7???F ??m? 6?a6]x9?????x(?k???? ??NHw?n?V??v??Oa?.}??????7?b??0?????|}??? ?F?,;x$???8????)?L??r?P+#?s?v@>e?\T???????v*?T?????^ y?Z?K?r???u?-??H?#?C???5?X./?t?? `F0???X?????h?s??%_ N??M?K z'WN?.:l?w????7????Z ??K??=s{%}??Qg??/???}?k?kq_H4d?n}?)?n -M????0^?Vr?b??l??l??????=F???uz?{?7 im??????y??qq?K~]?=????p'cQ?1)??h -?? J??(?V?\?-)9??(ytP?tV?%?;? za?;?B,=w?4!?80??,?,?K?!*G?&y:?=??="A??i???pD?3e?LF]???d????Z?y?C?]????[?y ?#tJbH ?l=???)m"?ct???1?????r?zJ???? ?}8dk?B??????1?K??-R?????C???D??a??`?i*?Bak??I???3??Q??W?_}CBJ?0h -J?~?6?d?P?d???dI??.?pg????u$?P?9?????}???(?D???-??+?~~x[?a???q+GOT+?F3????nw??e?_?3?Pj???5?.z??&?':??????????4???????9?!7_?E???e@?u??????? ?R?K??+h???x^??x??eD????S ?Tz*??Y, -?` I{????????8?M?wI?Ec? ?jj?:?u,????J??_????)h?-d?+??*f?d???P?`???WR?O?:S9?g??1??\ Z??? ?g?????Mmi?W??Q???Z????B? ?5D?G??&%??????"[??r@???????l3??aJX??K?????V??"??+???=?}?$?fV??/??!??? -J?3?B?H??(u3*??p_?}?}4????????????u??>Uu??? ????k?q$o?bt"oJ???UL?K?,s?br?3? -64FZ=fo#`???N\|?D?"B?v%C?V?+???'?el?j?=???4?????6?? '?:??t ?? 5???e??!??<*??y?/?8?Bhu?g?G.?\????s?N ?K??#?*J?~c??????j??????????G -?? Y?*?c-?y??I??ATLE?Jd??TW?w?Wus??????0?`??r??t?? ?)???e89=}? H??md,??w*?????&? #?u?8?~????A????Z> endobj -307 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [132.3327 622.7909 161.4931 634.6514] -/Subtype/Link/A<> ->> endobj -308 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [414.726 610.8357 450.0432 622.6962] -/Subtype/Link/A<> ->> endobj -310 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [219.6728 508.2807 248.8332 520.1412] -/Subtype/Link/A<> ->> endobj -311 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [268.4819 508.2807 303.7992 520.1412] -/Subtype/Link/A<> ->> endobj -312 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [390.3215 508.2807 419.4819 520.1412] -/Subtype/Link/A<> ->> endobj -313 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 496.3255 108.7305 508.186] -/Subtype/Link/A<> ->> endobj -314 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 484.9283 100.1426 495.7676] -/Subtype/Link/A<> ->> endobj -318 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [324.6699 428.3346 360.0704 438.2891] -/Subtype/Link/A<> ->> endobj -319 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [382.9052 428.3346 454.0182 438.2891] -/Subtype/Link/A<> ->> endobj -306 0 obj << -/D [304 0 R /XYZ 74.4095 789.6651 null] ->> endobj -144 0 obj << -/D [304 0 R /XYZ 74.4095 564.5693 null] ->> endobj -78 0 obj << -/D [304 0 R /XYZ 74.4095 564.5693 null] ->> endobj -309 0 obj << -/D [304 0 R /XYZ 74.4095 520.9398 null] ->> endobj -303 0 obj << -/Font << /F14 193 0 R /F8 95 0 R /F56 126 0 R /F44 92 0 R /F51 119 0 R /F67 317 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -316 0 obj << -/Length1 1231 -/Length2 5942 -/Length3 532 -/Length 6719 -/Filter /FlateDecode ->> -stream -x???g\X??Az??{?H?J??[J?i??A?t?*E?RD)R?? ???Nf???w??{???I??????z??;????DD??#~" Q?PC?X??j?`?~p$B???????j??@ q HFAR^AZ? ?@z?QpW7???????d?j^0???;?????PGO?  -???E?j??@??W??a?0T?Y??P????????pAe?;?{?'C?bM?&o???O4??3 at b{??N????8???????Oy???[?? ????y???? ?G:?P?????mM? ???w??? ??!\=a@??Cp_0<?l???]=}a?a?????/ b???,????:??R??p??)????k?b?/??Z?????????~?????t?#??AZ??B9??{?%i`G8???? ?_1Q???I(???y?R?@17?? ?g??? P?{HH?_!9?X0 ????!?XZ(??+/ ?? -?[??/,??>X?b???Y???,?/????H[????y?H?T??????")???/??1????R??a5?~v??$????o??? %?b.?!? ?7? -{??Xe?_?*#~C?2?7??G???7?N??7????b? ?????? ???UWG??H?E$?' -???J???_?P -????9????? ?????`P??????S?U?G? ??kS?A}??[????????????Y?Uf????r^?????7?E?$??Z pX? -na?8??G?xsGmQ?5???????e~?Gb????^*??Q)?*WQ 9?c???????]fx?9?XQ/??t?]?f?\??\??}?x5s??V????????]??R8?3??c??of?R"???0|??HN???k???GDE??.?{?????%Pfu???{???,E???.??!?h'?9?RI?2?????Y.?3?X$???i?6????p ?sc?C?n???*&(Vw????) ???F^?\?u?g^??~?]???? ??&???? -KH??5v?A?H5T+??;??????)Q?z#???$| -?U?{o&?`???3?Q????b?*?f?1?`????Lf?qD?M??t?a?Go?????+&???????f????YQoe?????/?p+N?/?]????'l?Lvy? ?Cr?????(?,???iN$??r:p????? c???8?+[??K??f?????bV?????Xw? -???????#?,??hn -b???>????C?? ???????f??Z??????U16?mC1s&?~h?????9?D(?????_???-?f??!T?? ?z??r~z???Ch????{q???)?;??=?????c??<? ??n?5? ?Gm???????v??????%?q?~???????? ?6?LyT?1.?"?%?EPCA??????m???????1V1Mn???? ?\?x? aGYzK?3???h?_??YW??q?????F?7F^??}???3?fC?9^>???P???Y??T????AS?q?dC?`Ql???jV,?Z?>?f??u?(f????z?w??6??PBT??4_???>o????Ri?P?????p??8??C??Pg? y???u ?h?'??????G p)??_?_????#bm???8??c?i^D?Pu?i?t?0?d??w-?)?(?>ab????F2ZU?97?i??q`???????B???D???&Z?%???%??L???P?7?c???!+s?\?I??????????r?"?;+3S,??9lT?d?u???9?Bb?0????????5?W at r-??bP?0|?g???????n??l?????h3???fF?p?lc????2~?S????.????a??v?+?\p~V??Q???fk??:k????'#??IS??b>?/?L?%????????L?K??\k?)?NNV??(?C$?>]??i??E????5?(?Q4?) -?BH??????!g???`%(?i??%Iw?9?d????(???>,?0??=?y)Eep???;???u????????X?v_???????S?????q????Z?pY?z???9?!??DdWW?sge?7?/ -??_??fC???>????<??a?6-?I??{?)vp??? w??}?d??Lq?u???-??@?M??? ?]?t???Y?`_Q???uCC?l? g1??R??#? ??O??.?J?>_;??t?????\?E?????C0kG???|g??K?$????V?? 5?_{??o? ?Xw?W?^,?2?B???|6?rR8C5????T8?;??ROh?u?A~??#s+?????????r???H???????jJ?????t???? ??E???V6I???3\????ol?yh*?1di???~??G?7?????J ??7?2W*???^???q??&u???;?.Z??f??#???w?????q?????f?F(b.??+t0?/?}d? ?\??????F?&?~???!???irD+AE7_?UI2i=?C?N???.?wG???????_?Q??h???????HR;5 ??[??li=AL?0)??w?C& ?.?(???????8^$?< ?u?RCt?>?M>}??"|??[???x?i??0?f?hb??]??s??H3?*?f??`??s??e!lRp[M?d?k?S?x???|?!?Z?I?%??iC?=?3n??\?U????P???15K?Y??-?**?$`?a?????1h?Kj?? ???:#l???T????bm??_?B??"X???|r????L?? -?W_????hFu?X??????f?_??2h at I??{???N????*??????Wa??7{????1P\?'??hX??'_?V?vd?5X?T??|'????U?.??[??J???v?a??36{??sK4?-)DJC??Y_*P?j??w\??.????????,}g?:$?b???!8?>"~??s\ ????? -6D4[???{??mtS??x?]????j?\???????Uh?a??.??????????,o??y/}ec&???o?{#??G???????;C)??/???b?.?>????L -??????Q?K?;??L?\?G?E\?>m??"?L`#V?Z`k?~WJV??L?q*] ?9ue??Y8?????c?????????6d?bg???D??????k?sn?R??6??? ?C???>3????V????JM????E???Gv????l)???_??????]???@j?{ -4 ????;??sI ??(?>??6? -??/????JPV??l?qt:%??V????$}H??m"?????58??%????(s}r???/e???;5n? uYugq*??(?(?bv??w? yYp???he4`? tp???(??5%????%????? ???/a)????P?k? ?B"??5???r??_?@?FO????0?:????d3u?????Y??U?.Ex??F?6????*o?k"?I???Y?qm?e?f?@?i $T?????*&???+?`???p)?? ??1(?W??:?W????}?d??vYg&S??4e{???%f???#|ir???=?C?{???????Z??B?U??h??@t1YWf G"4.8-???k??1?%qt?%?%@?`,??y???~??l???!#????*B???? GC(??&?J:[???G????a&"?_?6V'3????JK!???s???????PXFCd?;????aY???'8,???[y;C???k???7rvWA?~>vP??bm?K?!'?U?7?A?l?x?R???c$?????%LN?Ty?t~?;e?l?${OK|?????i????b????s1????????n?C?>???kU?z?N:6????YK?Nu??*QLR W?????$??I3?>?_????5?+!?2u???i?????????> endobj -315 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /VJWYQA+CMR9 -/ItalicAngle 0 -/StemV 74 -/XHeight 431 -/FontBBox [-39 -250 1036 750] -/Flags 4 -/CharSet (/hyphen/period/zero/one/two/three/seven/eight/nine/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) -/FontFile 316 0 R ->> endobj -321 0 obj -[343 285 0 514 514 514 514 0 0 0 514 514 514 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] -endobj -320 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 55/seven/eight/nine/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] ->> endobj -192 0 obj << -/Length1 750 -/Length2 576 -/Length3 532 -/Length 1110 -/Filter /FlateDecode ->> -stream -x?SU ?uL?OJu??+?5?3?Rp? ?44P0?3?RUu.JM,???sI,I?R0??4Tp,MW04U00?22?25?RUp?/?,?L?(Q?p?)2Wp?M-?LN?S?M,?H??????????ZR???????Q??Z?ZT????eh????\????????r?g^Z??9D8??&U?ZT t????? -@'????T*???q????J???B7??4'?/1d<8?0?s3s*?*?s JKR?|?SR??????B????Y??.?Y???????????kh?g`l -??,v??HM ?,I?PHK?)N?????;|`??G??y?hC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` -?L? 2?RR+R+?.????/jQM?BZ~(Z??I? ??% q.L?89?WT?Y*?Z? 644S077?EQ?\ZT??WN+?????2?A??Z???u?Z~?uK??mm+?\_X????????7?D?????Rl:/P1?d????????(??l=U?h?d?_O??E?k?v-X1??t???`????i????_y. ?1?????????:?un~Q???3/??S??}??]?? -???$e~s?]F1????/??Q???m????|<?????/??q'}I???+6???E??g???xT.??G??gt???v??G??U|?????~??]?R????_k?9???:?{?p??G?? ??d}dN<6??-uB?o?H??=c?M?vH??z?q?a???RK?~,K???}????????m??????yo??~?????v? -?_????s>???.#????????{?/?????k????\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,?? ?r?endstream -endobj -193 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 322 0 R -/FirstChar 15 -/LastChar 15 -/Widths 323 0 R -/BaseFont /XENHRL+CMSY10 -/FontDescriptor 191 0 R ->> endobj -191 0 obj << -/Ascent 750 -/CapHeight 683 -/Descent -194 -/FontName /XENHRL+CMSY10 -/ItalicAngle -14.035 -/StemV 85 -/XHeight 431 -/FontBBox [-29 -960 1116 775] -/Flags 4 -/CharSet (/bullet) -/FontFile 192 0 R ->> endobj -323 0 obj -[500 ] -endobj -322 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 15/bullet 16/.notdef] ->> endobj -153 0 obj << -/Length1 884 -/Length2 3123 -/Length3 532 -/Length 3745 -/Filter /FlateDecode ->> -stream -x???WXS???)?E)K??iH??J??7U ? -??@])RA:(????*?("]?&A?l at B?p???o{=??>?????o??????S??????j??(?T????H??!?ii4?P$?y T??? -?6?@??5??R " ?I?~d??8?>?C? ?s?,?b(N?=? -??????????Vx??'H?q0 ?X -?:??O?D< P?+??r?{?${?M?~?<?M?HDW??!p#}7??????????\]?0n???????c??~?R????( 0$?@2?w??_? A????Y] -???=Gtt(R?P?+N??&??8c??1????8H????^??>???-.??????'?1"?????2???L?l?*#?B?????????X?@tPJ?L??A???N( ?8?}???0"?B_?+s ????}?????IH??~A$????Dp??H?C8?T??_?.???8???????^JMM?o?t?*??+?J?????E&?D???J????'???? B?#a?C??+n>??????r?S$57??UXY?:lfH?@???[? ?s&?^)?? ?:?????`??Px6j??O};??]?G?)8??$????D?rj8?u?v??M?>j:h????K~???e?+U??}C???????????v???8?*SUg??l??(????8???K97???W?????_9?(M ??Ii~j^??o ??y??/?????Z?H+m?&??U?N?af???)?l??f G>o????aQ????L???j=s?U????|????]??????jy?D?-i??m??w]?o?o????Y|P?? ;=v??Z????y]u? m*0?Z ,DH???r???d(?O??P?G??Z????K?:d`?\bI???a??????G??-?( B????}?_??}?:???,'~&?M??P?OB?47????}L(?M:?i?????i??U?L????H ??4?????p????Oe?????Fc??8~u?&m??:G??????8?l???S???4o??????u??Y?????a????Q{"2)j?a\??$??,??????????-???~$??????T?9,?)?Vb?h?nJ?Bu?gSY.??_?o -?~G???0?A???L l ??8mbc)J?>M?$???m???m???u?b?BQ!?pT??{??fr??t|9????U???&??C?Uz????j???h?8.U|?u?W???C;??K?|?Kt??????]???????Tm|??B??"]O$?fS?I>?*?A?<;???h)?uL??????G r|._?????????+b? -?ONY??????5I?n?mdl?Y7?!U/?g8 ???|n????\????^??-??tl9????a?? -?L.?-??y?z?8?+??b????3&?K(???l?Y{X?uP[A???h??[??=???H?P??il???????f?? -]/?@]l?u??oW?-??????{K|[???^Y??'%??N???????e:b??4qMB??????fr??FOP??Bh\???$????C??*??:???T I?|?\??e?Gc?$??`?b??'^??k??????~?8cb{d?u?Rn>?q?H:?X?th?&G?>c??????F~!?T?X?{?2~???<K??:?A-X???'?>??6???????53'???????LR????[??????j?l?:n?AM??;?>"?Uw??2j??7??y/??s<> #`?.h?}e??-?d`C????A?u?@???Y.H??U???????@??kw????U??g???6~?p9?j?'Ft?I?????zj???eJ???2???Nn?"???cV???c??A? g?%????8trQ?,B?aS???u& ?Aj????,J?]k???????6?G?Ojt????????@?I? ?'?;?{?>?z?? -l?????c1??)?? ??oh?C?xA?h????N??N??%@?]???$? ??t9?N?????)??q]???????q??? ???????N(YU???C???;?52?\ 9?2?.Eo[xR?u??.?k0&^?/J.w,??g??2??L ???!????iQ?6t??U[??????????X????????4!?? ?/;H?d????7.????X? -?F??Dt?g j?N>]??^r?\[l???x?)???BM??y ?t?S??X??E??????? {Y&?&???????y???F?:?g??v?X?VZ??????y>t??zKtZ?????????'?E??y3??]B?????kc?w`2.69??tG?rf???u?U?Ov3E=??????X???=1???W?5?=??} o?x?#???=?Z?n??' *????.?:??n??7?8Pq????n??j>?QdUt????????s\]???>??????#?O???:?J?o???;?( 3??mv? ??-?????v??0F?U? J???l:????9???];U????$??N?TkS?R?e?a??x?2T|?|?j?m????*MO5AC?Jr??JF????5fTO??Q??? -?2?J?O????+??5???q??z?_?+N?Ck?6??:???,?S?z?ao=fokn,_?k????V|??Bv?y??:?D????_x-O???=2ap??m}T??KFc?"[??n????[s=??m$DJZ???'??G?;/~Fd?l??????????zIbo??3ivV?1I^?v?|#??o????x?naw?n???#$????????p?????31-[???I????/???>????(F??Q????n?? v???yY?V,???p7.?ss3?X??LvX?'F?)??;P?0G?????]%6??4L%z??r?{? ?/????Z:??????? C?~.?y????y??@?GM?i??y3r??????YY???!?n6????OUQ~9?r??(?I???hs??E????????A???7.??84e"=?n?^Q"?}|$??d??~??j? J,?ExA? ?|????#???)$7 ???Y%??endstream -endobj -154 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 324 0 R -/FirstChar 97 -/LastChar 117 -/Widths 325 0 R -/BaseFont /IBOUGZ+CMTI10 -/FontDescriptor 152 0 R ->> endobj -152 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /IBOUGZ+CMTI10 -/ItalicAngle -14.04 -/StemV 68 -/XHeight 431 -/FontBBox [-163 -250 1146 969] -/Flags 4 -/CharSet (/a/d/e/g/i/n/r/s/t/u) -/FontFile 153 0 R ->> endobj -325 0 obj -[511 0 0 511 460 0 460 0 307 0 0 0 0 562 0 0 0 422 409 332 537 ] -endobj -324 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 97/a 98/.notdef 100/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 110/n 111/.notdef 114/r/s/t/u 118/.notdef] ->> endobj -125 0 obj << -/Length1 2040 -/Length2 13177 -/Length3 532 -/Length 14314 -/Filter /FlateDecode ->> -stream -x???UX???p $?Cpk??????6??????%w??\?k??????s??sh.???9j????&'VR?6?7J????330?D?????? LL"p???N@#K{;1# ???? ??`?03????~?????N??.*Q?&q?m?N?&Fvy# ?-h #????%??? lcP?? g? -???4e?cf?Z??????vp??8I???8?+l????Cn@'g???_????????'?h??`????????p??Q0??g?U??7?????????.@'???)???O???? bx3,?L??H??????T_?????ee0??m?l???W? ???j?45??d0?????ys??a????????'???d?s??0????F?j?O?? 4?? hg4?3??????uv?f-? ?????? H??????O?i??`?????/!K??2??m??-?D@?^@'??n??????uq?3??t?p?5dhf???????Y??5?? ???$? t???CF????jg????{????!??????(H??j??? A?.?G?????C????W??r???8A???C????U??j"??@???(???S?C?|??&.P>??????@T???j?[??????@?5?(?????#c'#k???Un?????r???????M????t2?9????!PF?3h?????? ?9k!???/m??/?X???m[?? ?????.`][?v!H??/i8?? ??????s??B???_*??_?r? AV??d????? ??y???\qnk?"Y?x0?r??@?JL?z??O???/+??SK"?F=.??????8??/?&j??n??~?g??j{]?'???.?1?$???? ???t????3??jyk?_??B?X??o???/???:?i????^??S??M(??X?3??A-f?q??~??M???b} -?H:>2?????"?oh?XozN`?Q??>?/?;??_S??????b??QM????X? -?Z!?l?P???|?t??M?+>?E?$6???-??e?k???WT???????e????4O??H??????#??????OV???a??????T??;D???v??5???6? k???;???N??;?v?n?????4C???RM/"????X+???X#d????S????J" ?????#J???V?4h???V?/g8?w??R5?~?;Vg?L'?A??yl?????d?]&Cd?T Zc?(?s??kM?"??L]? ???????? ???T??D?_\:$Xi??;?^W'?? ?,q???L?~????$+?? us?UI?>?????!?m??:zV?]3???|????OnR?P???rr4???'??%?M???????d?B???????????uE,#???;?Sx?^?{??[?:o???>??T6??3?Re??D???'?(V?-&z?Z?y&?05/tW??G???r'??????&"??r?r?N??=X? ??:??>m????o?r????????*cS??&(+??E?!? -??yZ?K?J?M????q??K?6??~H?@????~?U???x}Z??DjV0??QE~s?A?Xw?????? ??{? t????T?B?%??} -U??????????C/?RG? qG?q#?{0?wu?=?\? F???Hk?:????0[??IFK(??[L??t????&?:M5? ??? -&??n}T?H.,???I?/G5 ??1?#z????*Y3?"??Hd?O?YP?k,? ????f??Z;?? |?q?F??|???????'?H??tJ9^?S???T'|n?????}/?/4-"?Q??U?t???**c???!?+?? ru??????Ney???%$R??$???Y&0?t?????? ??l??~'R?R?e44??qdU????0o?B???er????d>??#????D???q?????6??X???"[VJ?#Zxk????U??????????O?V??*????I?Y????????vLs?i~???hp????i.???6????Dbl???4??V????5?S?????????y? ?|?t??uHb9??0???M!?V??Y_? ??? Eb??/?r??c???pe?D??Q?4?E\??_3? ????Q?N -?j,a??H?????????????n1?p?'????1?'????h??K?^? ?I???&?5|?]9??P????r????(t??*????/?q??N??D?9F?X0@???8?D???P{?sD??/??'m;??+/[}??????rrd?Xx?x???k,????????Rs?H???;???VUk`>??x??C?$?{b?ld??E??H?K{9?qFV?y??? _???????ue *~?_??T?n????? -N?'?n+??#a?Ef?? ??u5??? (?b?????g??h!?(?*#??1m?q??g[??/?Xx\*???ZwK?#?)X;E??}?????Fo???D??o.d?[??~:??R?q?"?z-?????}?? ?C2Cr?"?????;o??E?g?VEY?*???+?? ?????J2?? ??a?k??????q??g?(??ww???V?c}?MA ???I??o;???V???'?Y9?85)????i @~z??4????p?;?s8?W????4?S??E~???w(??I?Yw?}??B$A?%z??2?_??H?? ;c??t>??H?uY ?F??9?2f;? ?1?? '??(?(K|??F???e? ,???T?e]K??]?o??~?6G??(?_5?C<5?eB]??!????R=??xF3N[?i?aJ?y?!??d?L ??1???f???????`}?Q?+??F??qa?<5???2?? ?3?8`?)v???r???4?#9??}?`V??&I!c~?n??!??bB?A????~)???????????7L??R`??M??0???W????s? 0?PS?(m;??K`A????E???>5?s?C???,b?)]F?o????X?s?Q?4?#?v??!???G?}????m?2i?X???J]?>tKz[u?? -?????^????Uq?I0? H ?#??P?M??w???????o?a??????s?w???j1?& ??]?c????'?Ze?+2F??l?W?g9???b????6??B?b??? c??#?VG:f?p?????a^?&A?????????????[?1?Re?gCu???/??r???Zs??QNJE?J?-Q??Bzw(y'U?FTd????a?]??!?G??????@?Z?&??? ?Q?O??v\p?+??|???ep?{z?E??_PM6??>??????v?>c????r?8%;q??$??w??L???*?? ??b??3\????V???sn??&?1??(???KA$?GF?\KL????< ?U??J?aM?Z?@+#?#?8???D????C???4I/???5???@d$o?q? ??[???_+?????,Zl?H7;?t???G{?9?2??=?s?}'>?3|??)>O?xD?j?????~??2?W?T???p5?]U?bVH???????z]g??E?65 -k???0$?q????????Je??K??E0???????n~ -]BmW???BE?p??x?^cc??TEt???6 ?)31Qp?-B??Z???B -\?cTE?????????????G??^BE??'???????'?????Re?d??A8??7?y?E??U?#5!?.? ??????/}f??\I l????.??]?o4A????o?~b??? 2?[1.???? Q????????a??I? -HR\??S?x/d1 :6????????6Rn?b???)Pc?UN}?????P?+l?)??????`?HQVT?Ye ?c?,??h6~?????l^?uAR???{????C???= W??*?P?-?? Bp?mN~???U?{t???!k??zes???&L???????M??f?,d?+??o?Z???T? ?9???x?????Z???#?O2-3Ch????8 ???ic?C????yl?l?A???M?l?|?*?o ??F?K??`?? -?J ?????z?K??=???????5?;a???i0???tf? ??'???9?????? -g?;??????+?z?{O??,???"??]??k?~?o?|? C'>?X???????j?B!?6???????Gu??????b?5??????LX?>G?V?q??,?? -???????p???y??|?`?nl?8??<>M}?????X??T?\?|??2C?:?J???????????ym?WO????Q?WJE???????j?1a;??o?Z???t??6u?3?+??=?.7;????&?;????Lg??????hk??V?7c??#?c?????K$8?N???6???W?z?? ????r?K%??rl???\??1???jB??NN?/n?bSt???? 0?RR+|?^g4???4?+?? ?~9???????MM j?????????9v??yH{???:????^??~%??wN????????????4??'??y???c??????l??F? o?Rrt? ??5?F??{??.? 5/?n]a???9?r?P????4k?I??????0?H???t??????~?7????K}LS???H??H??F?] ??A~?)?*?mU?r??P@ -???b?]????)e!zl?p?I/??%`G??t??C??????v4}?????M%.???Z ??b?/6)??????aL??X????????S??6?b?A? e_d?&SV%??`???NA6? ?-??EY?????/b? ???,?J? ?????A??Q?Ik8??T.?{pLU? ?g3?J?b??|i??M?Q???;??%1??ZR_???=1pM??#??O?j?????`Gk?Z?I:h??c?1c???]???R?Ve???Y?R)??+=???.??????;?>c??g&?v?G?OI????bf??aI/??????? ?4[?? ??x??? O?}X????@?aw?k&? 4;?L????wx?V?s{????Y'?G?????]?k?: -?([?d? ~?@gF?t??6_>n?4?x?'?????GJ?WLQgug ?[?V???kx*???? xjn$8?????????}???? d 2bI/?????Y*?s!??-?$K ????p?as?c?g?c????w)??g?H? -??3 ?'d?S i??p???"???????`gg=?,???:?cQ?????vL|????M?\?t-??aZ!??e? 2??^??!??WJ????? 9?6Xz%?!??sH???????t?OHb???$`?w??W!????qP?&m?_n?Y>?K?U??J????w??s{`)??Q?A_)?HLU?`_d1r??O????#???-??=?~?+@?@?b????!sl(u1?>"V;V?j?(?k??p???? a(???i??U??&?,Z?6.?-??JP?h{???}'????B???;tx?????fo3? ??r???i_?U???n_R -???^?;~??bN,?Q_w?????? ? ????"7*oN??1???+?OX?K????Rc??3???~??q????uN-??w????#I?? ???wo$???mI?Q?%Cwy]?????j??k#???F???^?9????;L8?zHA??k?C??{huGApjMl;?? ?]??????e?.?M????????????????Ys?Y7,?AF??5X` ???:?t??lR???$?Wt[$?B,?B??t?(???QcxX?.????@???'_? ??M8X??=^???:ja?}???-.??IM?%?????R?_4?E?,??C??i???v??D-??????Ir?O ??TF)>zD.~???????\)t?B!@?G\G??3??9???.Id??? -`???????d?Q )? ???????ouX??;????=??f?? -9????????? - ???U??f?B'???S?)???{???0??(?r>i?!?N>,???H^?2???????y?<)??\??5?{?+? ????????m? ??w?3H?)? ??%w??????^??uW?? ???*?o?? ??????dV?.[,??b???J??44?`o? -?8?e??????y?O9* c6?vaKV?$o?z?t?1x??v?3?x? 0?C?????,????:b? -?????Cu?:1?H?????1an??A?*>$g)M9?n?'f???6 at O8n H0>SAF?\v^|(a??3?? ?????F????c????*|??R?? ??lO? ge??fv?j?+0??qY??fZ?????7?? m???ii??WM4??,?%=?-?~?E??f?G?wM7???|???y???^A?\????y?Ozc?;??j?????? ???????'il%????w???-J??s??f?w?.'fa?%???B)?w??q?/??9z?M????b?$*?g????'?*={P???>S?Da?0?P???????|?N?I??????^?,Gf??+Ub?N ???X`??*?{?~9???N+???????4#?>?.?hY?Jh[~+?5!Y@????["?o3R??#?*???eyF?W? x??o5?2???,????ZO???Ke?O????????d?R?e?*??????,?h??KC? "??:??*?]e??h/?:?j?????? -???k???iL20?d_Y?C9??f????????NG?T?K?XC??(???J???&?M?9????+A? -Z?????mY???????=?t?}tV1 ??b}???1???p??x???M ????o??????$??W+?c???8??Yo(s(??*+E?] -??????/?I=?M? ??0+?????w????????????;???b??jM?A??y bD???l_??y?)E?+"?ZE????MssI{n??[???????????~3????F??l????v????Zn?lu?x$??V4???^?tK?_?:9'i\!???K+7?8????8?5'Y?d9?o? q????lS?9E? ?I???pj?)??{??????????m6P/??I????;?~?}S0?o?G?fRy???-'?? X??o?-7??aP??>??'.%??*??I??? ?%?I?~?z&A?a?^*?S?????[?E?D6E????c???~k+??CVv7?aP?E??i??K?????|#(]??0?6,oTL????;??V???_?%?%?5x??3 -??? -bC?u??!t??/?rN??v????'f?N?'?`??????? 4]???}?& --o??#V!??????pf?1j?a??.I????Q????P]? .W"?*23??????9????.~0??? ?Dd?m??IN?/????ml???C???,L9>)?Y???"?J5UE? ##??[V3(??2 N#?XY???-`]?B%[$0zm?]5h *A????????{???U%??a5???t???????%???W??????F@$6?dy?5?il???~?1bV?DM,t?`??,??-???????Xg?@=?X?~??Y??V??^??MiC?d`?M???J/?\es? -j+?z??i??Z4?UJ ???6??@[?? H???{{????H???? f?K????{??,?h?]??J?????dE!?Hn?8??j?O?Bf)H?)=???:H??????^,??????[F??N&??fQIa ?c -Vz????????9s??[?????C?? ??\??3`?7%?f?am??R8?U_???"???x`{GKXO?51??*?K???b?Y???1Bo? ?!72????j5t~?$?N?*???? ?k?L -????& H?s????t 6-k??tGGf???.3/(?~???d??ay?(????????l????|g5j$y ???>7p????????Oo???j2??JrW??f?????m"?m-?? ???n??tR??????%?"I???|'h??if(????6?C?p???}?*???c????????`?5??l?>?%????'kY -"????7,?`???J??I[}v???V???H/^Z??sZd??H???????c4??gM?P??!J???9I[I????????j?????????M?Or?V???M??w??!I?5P?z???4?n?!9???gNZ?c?a,??????`9|?[??:?=???d???? ?? ?&k???=t????RR?E6 UI?Z?16 ?bN2G1?^?X?]??&? ?Z??i; :???8p???8O?%??M??Y??????_?? ????\?m??????i?|endstream -endobj -126 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 326 0 R -/FirstChar 33 -/LastChar 125 -/Widths 327 0 R -/BaseFont /IDCDNJ+CMTT10 -/FontDescriptor 124 0 R ->> endobj -124 0 obj << -/Ascent 611 -/CapHeight 611 -/Descent -222 -/FontName /IDCDNJ+CMTT10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [-4 -235 731 800] -/Flags 4 -/CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/greater/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) -/FontFile 125 0 R ->> endobj -327 0 obj -[525 525 525 525 525 525 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 0 525 525 525 525 525 525 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] -endobj -326 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent/ampersand 39/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal/greater 63/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 126/.notdef] ->> endobj -118 0 obj << -/Length1 1316 -/Length2 6869 -/Length3 532 -/Length 7667 -/Filter /FlateDecode ->> -stream -x???e\????A???????A???s?.?????A$?AE?????g??|?u???~k??&:?W?N?P9'G7nNna????7??? ??I??89?????n!!n????? ??/? ?a2????a6V?ni????P? ?P?YC??=?????? ???h?5?? u??_?? ?????????P????*????mr????'B???~7???I?&???$J?&!P?????o?~/????**? ?@?7?5??!A???o?kj?&?????~???!?? ?&???o??A?!n.???? B?@????????6 ????????p_??? ?u???N ????@?/???????s??1??@x ????7???????7??1??r?????p??q??x?|\??[#??:??}??????~??P/(sz? "??6?!?,@??W9 -??Uc?????6???7???J.l uz7?D?(??wT???~???]3?6M? ?NK??b??Y%???????a?D?u~,?M?W?_&_c_?_aL(???_4?V*???S]/??h?;_??????JI???I???H??QO7:j?????w?????gCR????b???f?J???8?8?U???Q??A?T????])?Uz?ag????O????,q???& Jao[?s-'????uVQ??????(?\????,?&fLzM?(G? ???,???k????N*?n?? [\a?V???? ?!y???G????~?????8\|??q??7 ?}??\??|??A&?;??o??E???m?%?x?t@`I?????!???#3????? ?'q?J?+;?3??"?A??????GQ???"??@^??MVg????N?\?j*?w??l}?Y4 ?5I??k????%?~ya*?ub????????&#U????.?_k??_???0mW??q}x????{VY?UH?????? R,??Z`{?h???*-??G???h+??? A?? ??????ymv\??d??W?Bj~????????D ?^???E?????U??G??????Rr???L?uK???a????7"?' ?=???@ -????:? ????0g?#??V`g%$JU??1/+??m"?????|$C?p???L??????g1 ??5j?j?6u??>?L?A?v?c?W???h?|??V???"??{AAT???V?O86???/???????|?~9???f??zQ?? ?+?UU4???)?q?????D6'?$???+@?9?Q????Q? ]b???UM????k?5D?{D4*>??,h???'? %FT}?> >?o??DR???D????Us?3bY}mg????? 4f??-?'?\?"g?? ^? *lR????{????????Dd]C??^N??5g??gn??PP??Y?W3 ??H??+?B????????W[1/??? ?kg??????U?m???]?????b??7???)d+???{??O?R??)%???.??.???m(C????4? ???\4?5f??? -???b. ax?vL?{ ???? -?r??o+??.?Iy?tv??yy?d??[N/?W? 5,?PJA??10??8??/?S&?????????k?:b???u?D? ?????ky'?x??HH???s|?I?W?Z?K???Z??o ????????o ?5|??('?S?^F?? ?? ??6???s??????????????? O"I?I?S$??r??Cz???U\?YG??9$@???&?1???? ?\??:X?K?t?N??R ^5????4??????g?9Bo????b?{?? ?v;?^@*?s;0??F;?????k??????*?????? z?q?VjIn??P?:???sW[S?????O?????`?a?xr??7:G???!?n??????C3??/??q?'!?yf`???Q??????????r???\?????E)#v???H~????????ji???Dti?????BsM!1N?W????2?N??D?Y=[%g?D???8??5?????SB??5?e\?o?`=s? ?q?z!?&??G1Q?????????=>?)?t?R?$??'??}?x?4[&&+??SW?3&? ???t???v &?v??q??????8?M=X???O5?:??rom??ux?^??d??B?A??????>????}???W?\??q??-?;t;??$^[%?1??}nq??!??=???????V?]??Z??1???1?????????????????@V???S?@??$<;?v/?>\0???O??+?)? Y???;?'???kH3??md) ??)??JE????L?=S9 ???NV?W(???C_an??? -?Y? AE??Z?X???^???e{????I?W?e?W??3??>y????4????X??E?31?n??7???'?P??}`0??`iJ?cD??D,?0?U???????3???f,???X???5c?Jz?K?%?????}?q??('_???o??&?????e?B/T????? ?????? ??|k?F?0X{??&??2?2?q???A?f?? @?S*?5?????[??V??C?J????5e??O? ??o)w?i?G?*~V5???{????N??y[?h???(??2EU???8mK?N????+h??5k??*?@?x? q?IECa???L.?G??4NG>A ??M??x?E?}%?=?ev??????????y??3g??D?_??iZ??ziK?i?~??u+??{???!??K?y;A? ?613~??%???Q?B?? -???_?`???????2??BO???{2g2?P?????j]M?j?;?,???Dl?? ?I????;????7?5m???j??3??$?J???zK??????f?xJ??????z??rc?]Gw??d?ggF'x?~"?B?D?c~(????Y??:?5?[??lP???+?K?t]?>N?k?K_??_E/?26????*?? ?O???!?>H????l??l??5???Y??]!/?k??$?&l????v?n MI?7Ep'????7?F??B??D\??n)?>K??U ??D?L>UQ?????e?????j??>?om????!A?ej?!???K????Q?s}M??`??'g??$1n?P???6y8??h?U??{Om?5? ?"????????????Nf)??pee???,V??%>sw??I?(?????4u#?%??????/??y??\dN.?HnaG????? ???c~??4?k?X??tG???_?pA????;?wg-WR?oJ???-??L?'?X?tI??@????????.^^_??z???.[$2???=eE]cr#;?%c[52>??OB???{????6?V????h;|??v????n*5??0??f ?G?W???? ??^h?? ?<Q?"s?q,?w7??IBB???v???????d?g?/I??fN????I?: ????a????????~?x???.???2??wT\?Q?????w?P?N01???Z???? ?[?????m/??G?p?|t 6?=?W???)?lP????/i|$???e????V\?81??d??u+!0?????w????k?4?PO]??4????r???W????? ???n?????(???a?!?.|lk[;>??!N?-}???@fU???????&<.?doE?????L?|p*}?h$v??!x??+g???7y?[????M????W?W????Ka??_?????p?(+?T?4?????{?[???x8z?L??z???O????db?????????U??????????!Gr???[M???K ???M??8?Of4@?1??~i?"[&?_????f??vP~??{#???;l1p$?R??F????gcG???L?M?????T~???????????l????/????q??3??)G_]O?P?$?-????s?"> C6P??rD?xxy>????M??????*8'eE?Y`???m?L_]?K?WN --?;??N??w-???????????}?@??r?J??}#??? ??7??????|??)????V?%M??_?j_,6Uf*??e?DC?p???<~.D?:DM@????I????Z??O?`]???Q?AKz?-?i??WI? ????|3B?_,@???.?? -gJO??%?MD??r?7#h?2??9U?????????2X,fH?F?????9???=??od???/4???p?Z?????.?]??\??????????`Bu!U??????l???c??C?go???M???_(N`????c<.l??tS?.K??(Q?m??V??Ol/? -BQ???>??dM9v)??5?I?J????? VA?g?o_J??@ ??I??z?im}"g -???9?Wl??25]?`?05L???K?@????:?"?K??}?I??@.??3?)r??+?r???=(??????u???1~???*>*?M????v??~?z???&??Q??,Hz?Ry?????????\Pw???6???? -$E? kEVN??g???/??*H?%?`???6????c??(C?w|??f??cR[:zZ????}?^?qo???|*o???m?h?y?N???????b???? ????AS%??????????????C?07'0???m?endstream -endobj -119 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 328 0 R -/FirstChar 45 -/LastChar 121 -/Widths 329 0 R -/BaseFont /FURLYT+CMBX12 -/FontDescriptor 117 0 R ->> endobj -117 0 obj << -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /FURLYT+CMBX12 -/ItalicAngle 0 -/StemV 109 -/XHeight 444 -/FontBBox [-53 -251 1139 750] -/Flags 4 -/CharSet (/hyphen/period/colon/A/B/C/E/F/H/I/M/N/O/P/R/S/T/U/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) -/FontFile 118 0 R ->> endobj -329 0 obj -[375 312 0 0 0 0 0 0 0 0 0 0 0 312 0 0 0 0 0 0 850 800 812 0 738 707 0 880 419 0 0 0 1067 880 845 769 0 839 625 782 865 0 0 0 0 0 0 0 0 0 0 0 547 625 500 625 513 0 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 594 594 ] -endobj -328 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 58/colon 59/.notdef 65/A/B/C 68/.notdef 69/E/F 71/.notdef 72/H/I 74/.notdef 77/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] ->> endobj -94 0 obj << -/Length1 1823 -/Length2 13445 -/Length3 532 -/Length 14470 -/Filter /FlateDecode ->> -stream -x???eT\????[?{???]????qw??????? ??$Xpr???|;9??????f0??5W????UtS?*?1????%?A.??L?|1UV+ ?(%??????$n??????$?&?7?_>N>N6$J????????? ?F???$n??????P0v????05????Z]?j{???'????x?7?????C?r?i?????I!z??z??sqkK??j???Q?????8??s?m??}???? -??Ch?_???p?x?G?Ix?????n?A???K??z$tVR??Z?{`?Z8`??8?]EP? ?? ???? a8?wR"\?????C?????`?h??????@v???g|?}E ?#???) ??7?C.??b;??5?%7FS?V????Ww0-}???6C???????????i"?E?HV{hO???/~J&?P??O?p????Tq???c??vDc=????u???U?^f??|?)16??aL7?U?+??D????y|??4'????B? }?m?????? -?EQ??????.???C?f?????D??w??N]??c ?N?|y?7 ????Z??M?|??? ?8q????l??qU1??%v??`?'e?[??q?-?O?v?P? ???vE??^???C?TY???p'^?a??l????????7???4%??????|H}y??tlY?MTn;??j???H???H???????=!/?Y ????B??s?9?{??? ??')?~???b???i?? ??????Y?Z???7???pn???>K??????A?6K?q?0E??????T?oC8e?y?? ??????p?]D??+? g????'iP?????=at??G??q |r??[????/???_????Y??J??rto7?C??Q?o??m??S?E?R?????=> -6??N\?????w?Q??Cm*??`8f??_?F?/?1?#???WU??LB?f????5oS?S???d????y;?-?????#?4?? V"??_?;???[???wiA?F???F6??????Oj-{?h?(? ?5v?d??bj???'CMX?6??[h3?P?????#L?et?T5y;}c)&????y?fIP???xu???i??K*+?'?zf??0{&?m.E\&?1????kz -? ??? ??D????5???C'??R?>5????U????k2?G^Y?9?{??b???6?5???w5?????o\?.???_?"???????G????9??=?B= ?T?P?????H?85&p?????S:?p?C._?? 'p???B?6Z?24?{?? -V?????O?? ??|?1?$}?Iy????x?Q??9???W)!?)?????<9???A???g ?H^?1??2|?+??F/?? T|??? ??=????? ????uv????%?]I?C"?94????6????IkdE5??5?U??h?`tv,]11??-?FH|???N?u?\? -?????:?O?f??N???(??'S??M?-??}????? ????????B???HD???{??r?w -???!?S??6????R.0?? ?D?? -??F??m??T?W?1*????c_???4????d$x]Le ` ?n?ey?? w?q????t?u)vT? )Q?r#??K?7?.????Zg~??? ??zv???????????7????rxo???{m???r?o$??S?*????e?Jv;?{?????>????[a1??????7,qG??|~*b?V?T??Es 8tC?_}Y?Q?-|??w????F?k?d?s ???#??????L9mV???@??L~???X[ ?+U0,f?`_?V?????1??n??e???1}?????D?;]U?Z?K?3r?^??L?cJ??o?????OP#?T??]??1?;?5*N??#?`?#6G??H ???Ym?J??'FFr?3??GD???? Y?c?j9? A?@?????@?D^z???l?t?? -,?I??????x??E??^?yN??7???$R(???4???6sC??X?(JV?V?sK7???s ?J=??o?h_ 7??o????6B??N.u????D???/z???????2?3??+????C?H?Wq?J ?Q?*??%??g$W?-.?.?????q?{o9f??+)???#?` ??&?6h?ue?-Z?_??w???h]???-?t}?6\?????o|u%n?Z?????>????1????????3?v?Ec?????B?????4?J4??-Y[??#?H??2?t??4+??;??D?l?9????W8??WK`?9?w1????n'???%????i???36c???2s^%BA}??O?X?j?6A?#?,#?N?5?@8??sR?-?}????????& ???6???md??7?d??????g ???5??.???Qi??? ?????hI??tR?}???? ???2??E+????V???L???X??_?=??Eu??}SUU0XW/\8y M?jB??????G?? ?? D[d?\??u[~?? ??3?2??+?0??Z+w?Z_Q????NoM????????H?D??H?u??????G}??-E???u????}"????????n?Nq?q?vm?CR ?HH?-F????????)G???|?F??????}????=^I ??5?$Jm???K???]J????????z?r+?a?*?gT????'??????d{?zm??[???o??????o?????P?5U8_?J?o???wz??a??Q|oV?."?Mre??jE?? ??]S[J??????X????? )k??????T?????' t?'?]?3??@?CWd?? D~????P?????:MG????I?g?Y0N%??E?K$k?????+%o??U ?#????? ???R'7????F?T}??z{s?k?x??????????)????*R???O9c -?-4<0????N?$?%??d9uJ?z???????R?Z3?F`?y]?6@??,????,JR????{O???? ?? ??y r???/????MB?"?????@?x?0?EU?n ?%v5gc?T?sE ?'? =W ?H,?Q?N5/?ts???????????e??.??8XX????*I7Y??$c?I}?????HAU?????nbq????=???????????~f??#(B?~d?P\??i,?|??N????36X??i??y ??Nx??h??? ?'?^M45?Y?>?? hV????x??jP??Mf????;|iT?6 -?[???#??C???2?????[??????d?I???y?Q8#???21<q?????@Y????s?&s T"?[A??? ????5????=?'?3???z4I0"???k8??i?BD???p??&?4?^?W?~??hlE??.?-?,j??$???\?E?Ja?w-s?P?0:)00?-?V???K"???]?I at H\<5?????I??F-?????-?4p??3???g???????SZ??v??a?Qn???wxEY?/??A? ???#_ T???DteJ??? -???c)?Gv]q4?]#Z?3`Z?1?f{'?????,?&?0)?????>f}?Ga???[?N?W?M?$???`%%?,H????6^kJN?+?????h?4? gxE?????>?X?????}??????+ k#K]v?MV???no?e?Qo`?? ???%?j??????????8???`)?q?a?Ke?H?N1???????f??ce?s?%?]?ZX??m??}??????? -?6QO?{t&????5??????F?8d2???ar^?????[??E?????>?f??b?#???,H)!???&?????N a?h???[z\i?????!??P?????#?b?????w???z?E?r%u0?n??\???q??6?"??u???$d ???l???z?#?-:?PX?H~?_ ??????%?&??5?Ht???.?yL?F????T??(??B???v??(?[??%?jj)????]?????~:??fK8?????|4?=???+?? ??=t?{?e?Lc"HdL???2????t."?"???w?Pv??????p?e -/??T???dr}?????!???=?K?XH????Y?????+5?b?%????s-??b^?i??{??O??} -?D?Qy?T?g???d? ????zv??t?????Q????)?@???? /:d????V7]B?S ;1?)~??*g??? ?!??z????z#??H?.R`?R??? ?^??? ?!??.?J?_rb5-?c?p~???s?G?? ?7???f????I?#?FWy ?Arz?9"?e????~????? ??*?6(/y????4Eb???*}8vL?"??N?  ?"?n??i?? -" ?;??V??D??C?? 1O???????Of?!?l?????d5N??HQnw?=?q?~|?v;???@??:~ t?!???F}D??g???$?"?E??uul??K?????|??(?=??????H?d???2%9??K?1???s'?j???1q?r?By??[?$v9?$??n?????:?W??o?! -#?>~DJD?????_?c+(o?nf?#@le?e&?o?G??K?k????????7??5G?W?R?+??loS&)>??cd?.??^-??_%6M?m?L8????*/?e?? }'?IG-?"?m???\tmL???|`??3??????t??M??FIC??E???"??n?g??q??????|^?!??O3?X???vG?? X%?!?8??-?^k?Mt??*???0?????A?>?=?????0?9[???????0???m#?_"?N??!??????????j????[ kU?T?O_?`??;p????????H?|???A???U???^{(?Q????EZe2??q+???KL:4[?????/??Y2?*wqI?BM?, ???_?d??Y???I???? ?R#}?wNW~????2?????a$o??1???Q????G?????*mCn?L ???m9??r??u??vK?????c?&????Mp?N?o|?R?R?&??}???sxf(???6f???( ??O$?J-a?0Mw2????`??b?j?I?X??e?wT????C??xg????Y???} ??A!?s??x?Sx?|$ie?PzI?1????a???8?[K?t?k$?dZ8?K??}Y_???b??????[n???????yx?????g?)?????qKW??:????y??#?{E;j???op????w?~??f?????1M]+Q #?????5?!???.???of?????!7PX???-???3*??a?n?????L??????Yl,????9??[C ?????A??4Ck??S2u??h??^Kx?3v???? %V????/-?8DF?,??????ci??E?WK??#??????????&~Cvq?9???????Qg#??Z[$?????!???"??I{7v???%???`? ?_S0U????$?%?$???x???\??Csi??????PL??X????+D cC;xk????????o*b?]J??iT??B?u??????"??q?a?g???~?????o??~????{????V?=*?|??O[?? m???2E6z???p`???db??D????[y?)?J?  Z>??^D??FHC0=h[?"?????p5??"???%i??y`?%??M?N#/???????3t???kZ??'??BD?]?s??V?zR?f???FEJ??1 -??~????F6???}idC??l????6H4?afY?y?T+-,??w???????GC???BT??e???d ??gv?3?m?b??????????????^^![Yw? ?4??gyK^n)??mni? ? _?pY?^?#?'??\?? ?'????S?O?[?Dx?e?8????@?3y?b????{???????P?:T???D?????o"?qT????y??.?u[????? ll??vV??/?8??9q?Q#?9?0L??(??#y?t??O/?? l???g?94FQ%??!?g?$ ?GBPh[????L(Yx?U? = SC??:?6?G?????????x?? Q)??K??s4 -)@{f#nt?3\?>?UD"??mp??E????je??Y(??f ?J?Y:S?C????? &??L?v?c?h???!=44?j!?:??????F?8,???Q???l?>2??BA>?8??w??S??^??R???M?L?????M_/m=????OMcIn???"6??Jd?/?N???V??)?'???+?F???? ???l?????F>???a?:|Dj?r?Y?y??0?1????lo?8MYN ?"??????Qc{mN`?C[??a?u?O??P?5i?2???H??e????aa??~T??!H?k?+~BdB????}??HuG?tZ3S???f1?? ?B??rj???c?*??????M?07~?????P????XC???y????"??.?%a? ??D????G?:???????8??H???c ?O2????5???x??k??Jz[??h???KD????????(????-t????7{{% ?W????? ???p?G???V?dL??h?HU?3M?"??|??????|??9/{2?z??+???m^r"[tN(o=_a?3?~)?0 at A?Psy"+r??p??sT?87BTy?2???zT at C ??+??T? ??)??M??K???oz?????^4?I?<_4?????e???j"J??~?tGvP????????j?????}q????n?e*??Q??? ?!T??]v??Enn???w?op?n~???%S[>j?)?N'?aGYL???? ds???d?,?%?sn7????+??Wu?? y?-?????F3??R~?QX??B5???gH???v/????u?-w?-?? >+??w=?+?2???6~g]????N?(???9F7?H+??EI?i?-)T?[~?????o? w?%??.-?????%??n?Z?q|??c ?T?[??eNC?1?Av,?Y?RB?-?r5v??t?a?$??? 'OU!???4??Eb???@??????P -??>?y?K? N}?8??^???)?????p?????&?'???MZl??????*l????cs:?V?yy?????p0??????Ou;$?=???#?+???p?=d??/?4?%oc~?#??J???k,^??Ax?????? ?2?3&1???*?c,]B?K\?/\"uh???O?@???`????6nMC????<=TE3?Q???????0????0W????}????;???Et??k*??O??#??????=N?'C???oPz????-?KI???t-?r?l}??8???QYH?"RR??_?PH??F???p ????a?Ok??'??R?=???SZJj\?V???.?P?+3B?|?/t ?1h???d?qY?u??sx?"?V$T?=m???g{ ??F??^???p?=[c[?w?????%????F[???!=?IB??z????=??D(?????II???3Xb?u?xE7??C?sI?? ??????eLj'??em??(???????? -?tv?\????%?? ?_;?.j? v???*-????????kT=??~!??:X?_K?;? *?0???M?`v?u@?.|?*?,?`??|???RO?Q?F???,?s#????E_?N????}gW???C?????r&??%:O?????2????4]??y???,O2?![???H???hn??x ?p?????.?x~???L???r??????????Z?S?D???VQ?V?u?T???x???????????+???$???q[?ox???/???x????E??~c??\???z+6{???????PM?R?Io?F?Ub??ZI???u??s?JL?">VX~?????k?????? ?Yx'7?-????????_|o??????d(R???a?[???`??=?????????7???????l???6? ???G????Fd?_??Q*p??^??o??P??Sjb??j?F?):?=????????????F??????N?SA?Q%%? 1??????K]?kd???I?Yd???DH?Z~GB{?n#u:????P??YU????(wf??D?M??n?72G&????\?r &??F*6?+.????t?9<>???????BM????-???_???{i?#??2l??g7?iD?????:;-?K[?????V5?????? ???????4??TR?-?t??? ? ???`B;????Wn\?T?)O9 =!????????wOc??????t? ???K7??????=??E???'?f???l????????jQ4?!N?S??Mx??y_ %?Q??%?>???g????????u3?0A?w???????/\)C?h??@*Y????????U???k?ap?p??]???l} -?\\P?D??????K?~&?C?4=??????Ox:}k? ?????^???R'p???????V[??3~?????pop |??]??5&Ti?2?A???z??C??Y?w?|?T}>h*??`Q??2T??A??hFi&???\V??|Nu?o&a??H? -?S`/?{ }?oh??E???_???vZ??#}e?HSp?|\i??E?K?~ -??SxtA?9???h???2;rR??????? ?:G9/??+?k??~^????'=?|\5?????? ?Qd?????????{?UZ?'???&l?KU;m?\o?????p???`????@%+&???????OL`j 4vr??3v?A?_? ??endstream -endobj -95 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 330 0 R -/FirstChar 11 -/LastChar 122 -/Widths 331 0 R -/BaseFont /CWHPWL+CMR10 -/FontDescriptor 93 0 R ->> endobj -93 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /CWHPWL+CMR10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [-251 -250 1009 969] -/Flags 4 -/CharSet (/ff/fi/fl/ffi/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 94 0 R ->> endobj -331 0 obj -[583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 0 0 625 917 750 778 681 0 736 556 722 750 0 1028 0 750 0 0 0 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] -endobj -330 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I 74/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] ->> endobj -91 0 obj << -/Length1 1242 -/Length2 6715 -/Length3 532 -/Length 7487 -/Filter /FlateDecode ->> -stream -x???eX[???q Z??b??!??w? $@ A??VAJ?Phq???)^??R?X?B?????9??|???u????s?1?g????1?aUG???A i????HRpp? ?` ?? -FA?? ))a?:?s??K??J ?8?*4???r?p??$Tr?"a`w?.? u??p????*??@????A??H(D!0??s??????J??x{?{????H????b$!w8?:??????Z?]\????Y??N??u? ??W???Eu(???S???)#??c-sPrw?C?B?`^?0?(??rp:??^???Pw?+`?????????2?????E0?e???O????b?????????I?\??????????PXLF"?hfz0$ a????1pG?0?1-ytD ??P?????????????????? -: ??????I??cF??q1????$T??0???! ???3?????d??CR?]?C !?3?7??BCLY?????b?`??8P??7?H??? ?o??p?1'*??b4??0???!???7?X!C???o??B??+??c??b?|?Aa??7?h??? ?????n???[ee?_?????bB???D???o??H?l???*`???a?? -??:??2./????????`+;5$??t|n% ?M??j{?,U[\?d?%???b??f??m 4V? ?L~9?k???V????L]???E?Es???71l???O??- z^???p??|%????i?S??!.a?? 7????a5?|??>F4z??2=oq4?B????Z ~)??Q?9_K_????,g???Z??VW??m:???????j]uq??A?S8,yV???r???':?????!?D???[????????? ?h>M?p????2?}?a?????a??u???x??% ??f???B???7??R??htzRq????@?????????maC?S?}?5???u"?????t??7?h??? ????K???0??s????;X?"?O???Y}F ???R????*e????? 3(???Q????r???X??????BG? ?/??t??d???V"V??cb3?l ??YA?(?9??e?????YbDHmv???1?~{??r?????A9??? }?!o?}???vg??{j?UV??Q??z?)iAJsN???%??3?E?????.???e???S??W???k???x?A?W??2???w??_N? ?Z??9~f??]????|???Z7???.8"?}T??S??=u????4*T5)?????f??U?????C_??? ?>Z?_?7?;??o??z?M?????? ???Z|?+r01?]???:?,?3??????5?????P?????G?^4*>h?'S[???;??dpU???-g!5????X?dC2r,????}3??? -F??? X -???f.??a?????ur?>J?????`????'>?R????n? -???{??!Jo?????[?# ????g???o"???\L????^??????m?mFJ6???J??s???JEe????/????(MYX%bh?????`?@!+pYO;KH?G??N?7D?x???P??'?2 /????h??G*)??%?%;N?lY?i?sf?B?+F?d??:?!?_V??|??{h????G??/??????o?z17?????????l???????? ??l'??????????wR?o?O,?^`?d????Ckb??7?T??Y???)IZb?9??Ng???W?8@i?E2()??*~????????~-?+????W??F?>kq'?5?o????4"e?????$8?g?@???4-n8>(?]??M???6k?P]l?8????? ??GG\??6????tWl?9??1?????????I4?K?p??VB?`X?i??a??#oK3??%y??pG ?>:???9ah???b?*?w???e??QcaC?M?'???f4?^h\??L1??d????P??4DHW-0x?'f?jk???D}?tJ???[d??????DSw???|? ?)?0?r?cb??O?e?r?Tw??Q]x?)?4??? b ???Mv]#Xg?`???"?????????????^{?????|??????nfQ?7,???F?qK?A??U? ,???0???&?l[????|?c???? ?5?????E??_???.?YIzp?%NA\??o?B?pFe?R?3c?&+??|?"W7?E?o???U?|GvLw?/???$UgH?n???x???????O\??s UI%???rD=? ???E'???O;?}Wz^e?]?c ?????"6Y9?,RA????Wx??????"??;9???R+?G?>Y?2?SL|??_??"???N+?]?F~6????r???(R??????????????[h??Q????w?=???u???a]????yw????z7L%??B??N?,]?m????e- n?Tb?t??D??g=U!??NCq??h?4????0f?????o??)^r?R??G???[\???|1^C ? ????#?qS[??.???+j?TB???r?#2?{"G??!?&?G?J#??????Y?C???&?m?? ???&???{?F?? ??k?G?Y??????r??S??ZNr?u????X?#?N?l???x???:?? 4?9ys?DN?V??6,???>:??? sg?? ???????T?*"TV?}z????%?? ->?x?C/?X?? ???{Hw?e9???vw?r???????>????????r?/??w????z???Jv??i???p?A??2c???h??{? 8?M1}M??:"??????c??n?Y?Q8[?U???8?n?v? L?? ?|u?????????l??&?p5??\T\z.u?\'?????6??? ?W????+F?|? ???d?S?S?l??'g~_P??y?0?w??f??q??????:?O ??(??;}8?T/=cc?nf????y????(??/?y?? ? ??*6?+?+)8?F??.]???N?N"??o???%???\]??3?'7???$P6?(?PN?N?????W@??_??qb?????iL?M??3{mZl-?-Z?J?G?8???P??O???}?P2B+??^=?;4 ?i:?R!??b??k 1= V ??P??_6%?L?B?????@^C?S?nW???&,K?k?~???Ny?ql?n4?????#?T????u? ?Y?`]"??=?N?,??l?]%K?1~\s?'?Jlr???-??!UF??????@??n??3?*??????_?????:p??lR?~FU?E??J?'???C?S??P?D?)???a@?c?*?df%?x????M???????"???)4,???f?R?5??J???c{d??*??{%??q??E????V?x??? ??h???z^w?J(^?5?<|???r?? ??????G?G??B?G??ID???????k??Exq?????+??r?Y?2???f??EL&R5B?G?EFK??X??Y?????A?E???=?i????X|?O??s????j????;]??<T??W=KMiu??L1?7??????:??f?O?V?%?f?x]S x???"?]?[?vz!???L?Q?vE?(?f???mrR?.?f?P?wvj???a) ??:??jQ?J?L??fh?$ \??????? ,?|f0?A???+,?*}??G?(? >I??%?L??KV^w?~L??P?2z??R/?U?z??X???QC$???:?C?u+z%????h??R???/??@5A?jy??U ??Xs7_?r?7??,R???R??a(? [H???t??oA?????S?x???b??b??AK?R+??f???? r?(??Dr???? 8V? d??AfzFi?}? ???U????y???Q??a??p?*^Q[ +]???T?I{u?E???K???G??,?????nr?{???Fo?????KOa/,?F7?$E??*?J?? -??#a|R? ?xI???9????#'v%?N?xVh.? g2?n?3?/2su?????????????erX-v6S?? -E[???}??X???(Zv?? ?l??!????u?m?[8????s??T?? ??c?(??d?,??e?Te??_??:??HT??nf?(-%????J?}H?6D!?-????y#'????--uTw^?????>r76U[Q??)?`???B ???Q-?;?t?>WG ????????:h?L??,???p?6?5:M?T7?}?{i>?$<9?> endobj -90 0 obj << -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /VHBEVB+CMBX10 -/ItalicAngle 0 -/StemV 114 -/XHeight 444 -/FontBBox [-301 -250 1164 946] -/Flags 4 -/CharSet (/parenleft/parenright/comma/colon/A/C/D/I/a/b/c/d/e/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/y/z/endash) -/FontFile 91 0 R ->> endobj -333 0 obj -[447 447 0 0 319 0 0 0 0 0 0 0 0 0 0 0 0 0 319 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 0 575 639 319 351 607 319 958 639 575 639 607 474 454 447 639 607 831 0 607 511 575 ] -endobj -332 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 58/colon 59/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w 120/.notdef 121/y/z/endash 124/.notdef] ->> endobj -88 0 obj << -/Length1 1064 -/Length2 4328 -/Length3 532 -/Length 5027 -/Filter /FlateDecode ->> -stream -x???e\T{??I?A?8(?0? !?)?? ?#0?P????? %?C????H?t?????;z?^??/w_?g?ys?O???aa?OHT?D?}?K???#1?~3?B??6????phl? z?P??????K??/g[?Y????\?6?R7FG??@?o??@=??#N`?d?H? ?|???????H2???4 ??HMV???????JK????'?????0}?????????{????19???????NjF??k???YW&_ivs?v?/????????*????????x??c?i??????????U? ?(?9JO???,N8 ?:?1?:0ff??I?` ????o?%,??(??????8Y?)l?Z??7?!??????q?;/v????v???i?????{??"?q(^?9?y??Zv???_b?dT?l5??SN????k??????er???=]??f gL??/???A???x?:w??9)??U?Ryt?,??x???0?b?$???Q???-?3^?J??P??Z"s?[???4??Xz?y??K??&_?7Eb'??????Do?G???3?? Ny??????~?Q$-g;??M?M:%?V{???qI??zqy?X?D????)?~??+??FC??cF??*7CJl?n?+??M?R*?????&Yd?X6$J]"?J??S?v? ?~?u???(??k?"r"????e??????9??(?]?Sp??^?zt8?#??YW???Hk?m?k?q?W.Go????s?N????Pi[??\?! ????????3?? -?`??w??S ?FO%?r??lD??????B?2?????O$?l>a? ??,=\??yA?F?G???h?P?????y???0}?M? ??????S???. b:?4k[8r??pU? }???4(?:???t v? -??Z???N??#????9??EsY???,|?n?aM2K??oe??t??+$?iMc???U???? @??o>?T??0=???HZ?Tl?3???\????\????????% 4?? ???m????:,?k?Gc$^e??|O"???>_/?1??bO????@??g??Fk?Kx???????x???T??????iEK8?y??6?&??VO?c? -??~?????K ????q????H?X??7??B??Fc?_??gw???]]2$??????s???l??K?v???-[A??A/??????u???9?G??Z .?6f???NQg??F?>??r?ix?#?????????W?e????? ??6{??ko??G}?W?????????NKdt?s?????bO|E????6??H?XM?;>???????Y??U??~x[? -?51??UNs;y?lK ??G%????^??????m??\?.a??;??q?)?j??? I???,,j? Suz?d?J?E??T -???9?&?? - O??\?n???2?FTl?<$3?N?HF?q,???$7?q?h!Ho???q~!fGA]W?8?D??x?? ???W1sz?)??G??#h?????Pv?x?z?????7?~K?n -E???a.@????H?2p?+?8????.?':?9.O??~I??W ???_?? ?@|???m?L??>???????7??U? ?????J??3??)$4?1????~?????,jx +???\1?????{j?*?!%????|??????5IX[???4 ???????L???t???B?????9?????}We??:??????o??Mi??VV?-?0???s3?r?_ej74'?D`??q:?7 f??3?7???{#?9;???\7h???Amy???i??O?????R?>|.?d?>??R?MsCJ?5????{??F???] ??cls? ??Z????I,T)h.U?zI?+N??????xvRE?O?/^?????~???%D@|?s?????]+?3K????{k_??&???DS"???r???R?E?Q?/???w?h@Z??k??]X b(m%&?bK?H?m?????e?JP6)??U???Q??3lb??a^???_5?????x|yLM?]m`??????#f?????/|??I??Y??!D?5??e??e\???Fy??+????5If|?T/$8?`=e5??xZ?~`?? ?1S????????U q?[n=*t?6X_???????????? $?k?33??-+}????Eg???BR??`[??i????[W/?:F???^??Z?~??T2+Ld????),F???? ???4L? -?????*???+D_%v?~x???Q8?h??lNQ????/??????????3C^9?5i/???r"e1?o??%? =A>?4?????;?????|^????H? ??cKYg?R?J?A'b?9??=q?R[z??? T???????q??Ws8;??j???h??????????????Mq?? .???????<`??p?????????x?k?|,=??q??????j???G$?M??X???q??K??)?<]O?(?:^??__??p7>???Yn}???q.?:??????????? ??+yz??k1??????7?kG]JC?7'I8?3??&?m>????lR??1/???m p???N??.Z%?F\?x#[??[??f?C??s#???????O?U ????cl|nW? ?y=~|???7-?k???2&S??????G??H???*/?????6??u?;?=?l3:??D}"???!q?U7e?(g????x????S?Q? ?;??W(?????|???W?x8{??t8?M???I?!?????(?mD?b???D?Ye??P?w?3?:??(?[???x=??h?B??d???],???8S?".~3C1[e?k???X???u?+1?!????zI?????9??z??????7??????U??I??Q??d???x>?R??w9?9??!?Lx? ?N?a????N?Z??VE??X?I\??y4UN??)????W?????Al?A?#I?T???7?r?7|j????/z???b? ???vcD???j?^?sp????A?9?Lf??? ?Z????p???P?9?????? ?*F?? ? L?"???={z?'????3>&????&???]?Ih???? I?,!E??;V???T?/????????????+d?Z&???>?4M?v??H|?~?[?Wi??|??c??-,?q??E?-3i?.'??,l??'x u{?D???0???tRYo+??dv>_;_t?3nHI???L?????????`?x7?LP?wU??T(?u ?????6?Z?xu~-kF??^]????`???T>}K?dC&?F???`?JW????J*?O?r'?YhJ?y??< -?Q?mf??L!??K??+????.$L??|4|? ?7>?N??P?J???W>3??*Y\??Q ???????B?.P?`??| -9???*?{??B?????lk{?m? ?I??H3????G?Xr:???????G???%??Z?????M8?g???$?F?Ddu/ ?/?? ???9??h ?????5?endstream -endobj -89 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 334 0 R -/FirstChar 46 -/LastChar 121 -/Widths 335 0 R -/BaseFont /DLXSBH+CMR17 -/FontDescriptor 87 0 R ->> endobj -87 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -195 -/FontName /DLXSBH+CMR17 -/ItalicAngle 0 -/StemV 53 -/XHeight 430 -/FontBBox [-33 -250 945 749] -/Flags 4 -/CharSet (/period/colon/F/G/I/N/P/S/W/a/c/e/f/i/l/m/n/o/p/r/t/u/y) -/FontFile 88 0 R ->> endobj -335 0 obj -[250 0 0 0 0 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 0 0 0 0 602 726 0 328 0 0 0 0 693 0 628 0 0 511 0 0 0 955 0 0 0 0 0 0 0 0 0 459 0 406 0 406 276 0 0 250 0 0 250 772 511 459 511 0 354 0 354 511 0 0 0 485 ] -endobj -334 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 46/period 47/.notdef 58/colon 59/.notdef 70/F/G 72/.notdef 73/I 74/.notdef 78/N 79/.notdef 80/P 81/.notdef 83/S 84/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r 115/.notdef 116/t/u 118/.notdef 121/y 122/.notdef] ->> endobj -127 0 obj << -/Type /Pages -/Count 6 -/Parent 336 0 R -/Kids [82 0 R 146 0 R 166 0 R 178 0 R 195 0 R 205 0 R] ->> endobj -237 0 obj << -/Type /Pages -/Count 6 -/Parent 336 0 R -/Kids [221 0 R 239 0 R 258 0 R 271 0 R 284 0 R 304 0 R] ->> endobj -336 0 obj << -/Type /Pages -/Count 12 -/Kids [127 0 R 237 0 R] ->> endobj -337 0 obj << -/Type /Outlines -/First 7 0 R -/Last 79 0 R -/Count 8 ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 337 0 R -/Prev 75 0 R ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 337 0 R -/Prev 59 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 59 0 R -/Prev 67 0 R ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 59 0 R -/Prev 63 0 R -/Next 71 0 R ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 59 0 R -/Next 67 0 R ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 337 0 R -/Prev 47 0 R -/Next 75 0 R -/First 63 0 R -/Last 71 0 R -/Count -3 ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 47 0 R -/Prev 51 0 R ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 47 0 R -/Next 55 0 R ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 337 0 R -/Prev 19 0 R -/Next 59 0 R -/First 51 0 R -/Last 55 0 R -/Count -2 ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 19 0 R -/Prev 39 0 R ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 19 0 R -/Prev 35 0 R -/Next 43 0 R ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 19 0 R -/Prev 31 0 R -/Next 39 0 R ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 19 0 R -/Prev 27 0 R -/Next 35 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 19 0 R -/Prev 23 0 R -/Next 31 0 R ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 19 0 R -/Next 27 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 337 0 R -/Prev 15 0 R -/Next 47 0 R -/First 23 0 R -/Last 43 0 R -/Count -6 ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 337 0 R -/Prev 11 0 R -/Next 19 0 R ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 337 0 R -/Prev 7 0 R -/Next 15 0 R ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 337 0 R -/Next 11 0 R ->> endobj -338 0 obj << -/Names [(Doc-Start) 86 0 R (a-common-example) 140 0 R (a-common-example.1) 62 0 R (a-final-note) 142 0 R (a-final-note.1) 70 0 R (acknowledgements) 144 0 R (acknowledgements.0) 78 0 R (argout-arrays) 132 0 R (argout-arrays.1) 30 0 R (available-typemaps) 129 0 R (available-typemaps.0) 18 0 R (beyond-the-provided-typemaps) 139 0 R (beyond-the-provided-typemaps.0) 58 0 R (contents) 96 0 R (contents.0) 6 0 R (helper-functions) 136 0 R (helper-functions.0) 46 0 R (in-place-arrays) 131 0 R (in-place-arrays.1) 26 0 R (input-arrays) 130 0 R (input-arrays.1) 22 0 R (introduction) 116 0 R (introduction.0) 10 0 R (macros) 137 0 R (macros.1) 50 0 R (other-common-types-bool) 134 0 R (other-common-types-bool.1) 38 0 R (other-common-types-complex) 135 0 R (other-common-types-complex.1) 42 0 R (other-situations) 141 0 R (other-situations.1) 66 0 R (output-arrays) 133 0 R (output-arrays.1) 34 0 R (page.1) 85 0 R (page.10) 273 0 R (page.11) 286 0 R (page.12) 306 0 R (page.2) 148 0 R (page.3) 168 0 R (page.4) 180 0 R (page.5) 197 0 R (page.6) 207 0 R (page.7) 223 0 R (page.8) 241 0 R (page.9) 260 0 R (routines) 138 0 R (routines.1) 54 0 R (section*.1) 97 0 R (section*.10) 224 0 R (section*.11) 235 0 R (section*.12) 236 0 R (section*.13) 242 0 R (section*.14) 277 0 R (section*.15) 279 0 R (section*.16) 291 0 R (section*.17) 299 0 R (section*.18) 301 0 R (section*.19) 309 0 R (section*.2) 120 0 R (section*.3) 182 0 R (section*.4) 189 0 R (section*.5) 198 0 R (section*.6) 201 0 R (section*.7) 208 0 R (section*.8) 215 0 R (section*.9) 216 0 R (summary) 143 0 R (summary.0) 74 0 R (using-numpy-i) 128 0 R (using-numpy-i.0) 14 0 R] -/Limits [(Doc-Start) (using-numpy-i.0)] ->> endobj -339 0 obj << -/Kids [338 0 R] ->> endobj -340 0 obj << -/Dests 339 0 R ->> endobj -341 0 obj << -/Type /Catalog -/Pages 336 0 R -/Outlines 337 0 R -/Names 340 0 R -/PageMode /UseOutlines -/OpenAction 81 0 R ->> endobj -342 0 obj << -/Author(Bill Spotz)/Title(numpy.i: a SWIG Interface File for NumPy)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20070913110820-06'00') -/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.6) ->> endobj -xref -0 343 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f -0000000009 00000 n -0000007634 00000 n -0000141098 00000 n -0000000055 00000 n -0000000081 00000 n -0000007817 00000 n -0000141012 00000 n -0000000131 00000 n -0000000162 00000 n -0000024629 00000 n -0000140924 00000 n -0000000214 00000 n -0000000246 00000 n -0000024816 00000 n -0000140799 00000 n -0000000303 00000 n -0000000340 00000 n -0000028601 00000 n -0000140725 00000 n -0000000391 00000 n -0000000422 00000 n -0000028788 00000 n -0000140638 00000 n -0000000476 00000 n -0000000510 00000 n -0000028976 00000 n -0000140551 00000 n -0000000562 00000 n -0000000594 00000 n -0000034600 00000 n -0000140464 00000 n -0000000646 00000 n -0000000678 00000 n -0000034788 00000 n -0000140377 00000 n -0000000740 00000 n -0000000783 00000 n -0000034976 00000 n -0000140303 00000 n -0000000848 00000 n -0000000894 00000 n -0000041045 00000 n -0000140178 00000 n -0000000949 00000 n -0000000984 00000 n -0000041233 00000 n -0000140104 00000 n -0000001029 00000 n -0000001054 00000 n -0000041421 00000 n -0000140030 00000 n -0000001101 00000 n -0000001128 00000 n -0000056494 00000 n -0000139905 00000 n -0000001195 00000 n -0000001242 00000 n -0000056682 00000 n -0000139831 00000 n -0000001297 00000 n -0000001332 00000 n -0000064004 00000 n -0000139744 00000 n -0000001387 00000 n -0000001422 00000 n -0000064192 00000 n -0000139670 00000 n -0000001473 00000 n -0000001504 00000 n -0000064380 00000 n -0000139582 00000 n -0000001550 00000 n -0000001576 00000 n -0000069140 00000 n -0000139507 00000 n -0000001631 00000 n -0000001666 00000 n -0000003736 00000 n -0000007940 00000 n -0000001716 00000 n -0000007451 00000 n -0000007512 00000 n -0000138307 00000 n -0000133001 00000 n -0000138148 00000 n -0000132162 00000 n -0000124395 00000 n -0000132002 00000 n -0000123143 00000 n -0000108393 00000 n -0000122984 00000 n -0000007573 00000 n -0000007694 00000 n -0000004033 00000 n -0000004190 00000 n -0000004348 00000 n -0000004512 00000 n -0000004671 00000 n -0000004833 00000 n -0000004993 00000 n -0000005153 00000 n -0000005323 00000 n -0000005496 00000 n -0000005658 00000 n -0000005811 00000 n -0000005966 00000 n -0000006140 00000 n -0000006303 00000 n -0000006466 00000 n -0000006625 00000 n -0000006778 00000 n -0000007755 00000 n -0000107526 00000 n -0000099576 00000 n -0000107364 00000 n -0000007878 00000 n -0000006940 00000 n -0000007110 00000 n -0000007280 00000 n -0000098085 00000 n -0000083487 00000 n -0000097923 00000 n -0000139130 00000 n -0000024567 00000 n -0000024753 00000 n -0000028539 00000 n -0000028725 00000 n -0000028913 00000 n -0000034537 00000 n -0000034725 00000 n -0000034913 00000 n -0000040982 00000 n -0000041170 00000 n -0000041358 00000 n -0000056431 00000 n -0000056619 00000 n -0000063941 00000 n -0000064129 00000 n -0000064317 00000 n -0000069077 00000 n -0000014690 00000 n -0000012151 00000 n -0000008059 00000 n -0000014627 00000 n -0000012389 00000 n -0000012560 00000 n -0000012730 00000 n -0000083003 00000 n -0000078976 00000 n -0000082841 00000 n -0000012903 00000 n -0000013077 00000 n -0000013250 00000 n -0000013424 00000 n -0000013598 00000 n -0000013771 00000 n -0000013945 00000 n -0000014115 00000 n -0000014284 00000 n -0000014456 00000 n -0000019614 00000 n -0000017992 00000 n -0000014786 00000 n -0000019551 00000 n -0000018190 00000 n -0000018358 00000 n -0000018526 00000 n -0000018698 00000 n -0000018871 00000 n -0000019045 00000 n -0000019206 00000 n -0000019378 00000 n -0000024941 00000 n -0000022939 00000 n -0000019697 00000 n -0000024504 00000 n -0000023137 00000 n -0000024690 00000 n -0000023304 00000 n -0000023475 00000 n -0000023646 00000 n -0000023817 00000 n -0000023990 00000 n -0000024160 00000 n -0000024878 00000 n -0000024331 00000 n -0000078656 00000 n -0000077266 00000 n -0000078495 00000 n -0000029038 00000 n -0000027620 00000 n -0000025050 00000 n -0000028476 00000 n -0000028662 00000 n -0000027786 00000 n -0000027958 00000 n -0000028850 00000 n -0000028130 00000 n -0000028302 00000 n -0000035038 00000 n -0000032686 00000 n -0000029147 00000 n -0000034411 00000 n -0000034474 00000 n -0000032892 00000 n -0000033065 00000 n -0000033238 00000 n -0000033411 00000 n -0000033583 00000 n -0000033754 00000 n -0000034662 00000 n -0000034850 00000 n -0000033926 00000 n -0000034091 00000 n -0000034250 00000 n -0000041483 00000 n -0000038914 00000 n -0000035147 00000 n -0000040856 00000 n -0000040919 00000 n -0000039128 00000 n -0000039301 00000 n -0000039475 00000 n -0000039648 00000 n -0000039820 00000 n -0000039992 00000 n -0000040165 00000 n -0000040336 00000 n -0000040509 00000 n -0000040682 00000 n -0000041107 00000 n -0000041295 00000 n -0000139246 00000 n -0000047379 00000 n -0000044583 00000 n -0000041591 00000 n -0000047253 00000 n -0000047316 00000 n -0000044829 00000 n -0000045002 00000 n -0000045176 00000 n -0000045349 00000 n -0000045522 00000 n -0000045695 00000 n -0000045869 00000 n -0000046041 00000 n -0000046215 00000 n -0000046388 00000 n -0000046561 00000 n -0000046734 00000 n -0000046907 00000 n -0000047080 00000 n -0000052204 00000 n -0000050376 00000 n -0000047500 00000 n -0000052141 00000 n -0000050582 00000 n -0000050755 00000 n -0000050929 00000 n -0000051103 00000 n -0000051276 00000 n -0000051448 00000 n -0000051621 00000 n -0000051795 00000 n -0000051967 00000 n -0000056807 00000 n -0000054969 00000 n -0000052312 00000 n -0000056368 00000 n -0000055159 00000 n -0000055331 00000 n -0000055505 00000 n -0000056556 00000 n -0000055677 00000 n -0000056744 00000 n -0000055851 00000 n -0000056024 00000 n -0000056195 00000 n -0000064505 00000 n -0000061366 00000 n -0000056928 00000 n -0000063878 00000 n -0000061604 00000 n -0000061777 00000 n -0000061950 00000 n -0000062122 00000 n -0000064066 00000 n -0000062293 00000 n -0000062462 00000 n -0000062635 00000 n -0000062806 00000 n -0000062980 00000 n -0000063165 00000 n -0000063347 00000 n -0000064254 00000 n -0000063534 00000 n -0000064442 00000 n -0000063705 00000 n -0000069265 00000 n -0000067233 00000 n -0000064626 00000 n -0000069014 00000 n -0000067439 00000 n -0000067610 00000 n -0000069202 00000 n -0000067783 00000 n -0000067954 00000 n -0000068128 00000 n -0000068299 00000 n -0000068471 00000 n -0000076399 00000 n -0000069399 00000 n -0000076239 00000 n -0000068638 00000 n -0000068822 00000 n -0000076935 00000 n -0000076695 00000 n -0000078889 00000 n -0000078865 00000 n -0000083307 00000 n -0000083225 00000 n -0000098984 00000 n -0000098620 00000 n -0000108072 00000 n -0000107817 00000 n -0000123955 00000 n -0000123570 00000 n -0000132708 00000 n -0000132454 00000 n -0000138772 00000 n -0000138554 00000 n -0000139363 00000 n -0000139433 00000 n -0000141170 00000 n -0000142866 00000 n -0000142905 00000 n -0000142943 00000 n -0000143072 00000 n -trailer -<< -/Size 343 -/Root 341 0 R -/Info 342 0 R -/ID [ ] ->> -startxref -143385 -%%EOF Deleted: trunk/numpy/doc/swig/numpy_swig.txt =================================================================== --- trunk/numpy/doc/swig/numpy_swig.txt 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/numpy_swig.txt 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,785 +0,0 @@ -========================================== - numpy.i: a SWIG Interface File for NumPy -========================================== - -:Author: Bill Spotz -:Institution: Sandia National Laboratories -:Date: 13 September, 2007 - -.. contents:: - -Introduction -============ - -The Simple Wrapper and Interface Generator (or `SWIG -`_) is a powerful tool for generating wrapper -code for interfacing to a wide variety of scripting languages. -`SWIG`_ can parse header files, and using only the code prototypes, -create an interface to the target language. But `SWIG`_ is not -omnipotent. For example, it cannot know from the prototype:: - - double rms(double* seq, int n); - -what exactly ``seq`` is. Is it a single value to be altered in-place? -Is it an array, and if so what is its length? Is it input-only? -Output-only? Input-output? `SWIG`_ cannot determine these details, -and does not attempt to do so. - -Making an educated guess, humans can conclude that this is probably a -routine that takes an input-only array of length ``n`` of ``double`` -values called ``seq`` and returns the root mean square. The default -behavior of `SWIG`_, however, will be to create a wrapper function -that compiles, but is nearly impossible to use from the scripting -language in the way the C routine was intended. - -For `python `_, the preferred way of handling -contiguous (or technically, *strided*) blocks of homogeneous data is -with the module `NumPy `_, which provides full -object-oriented access to arrays of data. Therefore, the most logical -`python`_ interface for the ``rms`` function would be (including doc -string):: - - def rms(seq): - """ - rms: return the root mean square of a sequence - rms(numpy.ndarray) -> double - rms(list) -> double - rms(tuple) -> double - """ - -where ``seq`` would be a `NumPy`_ array of ``double`` values, and its -length ``n`` would be extracted from ``seq`` internally before being -passed to the C routine. Even better, since `NumPy`_ supports -construction of arrays from arbitrary `python`_ sequences, ``seq`` -itself could be a nearly arbitrary sequence (so long as each element -can be converted to a ``double``) and the wrapper code would -internally convert it to a `NumPy`_ array before extracting its data -and length. - -`SWIG`_ allows these types of conversions to be defined via a -mechanism called typemaps. This document provides information on how -to use ``numpy.i``, a `SWIG`_ interface file that defines a series of -typemaps intended to make the type of array-related conversions -described above relatively simple to implement. For example, suppose -that the ``rms`` function prototype defined above was in a header file -named ``rms.h``. To obtain the `python`_ interface discussed above, -your `SWIG`_ interface file would need the following:: - - %{ - #define SWIG_FILE_WITH_INIT - #include "rms.h" - %} - - %include "numpy.i" - - %init %{ - import_array(); - %} - - %apply (double* IN_ARRAY1, int DIM1) {(double* seq, int n)}; - %include "rms.h" - -Typemaps are keyed off a list of one or more function arguments, -either by type or by type and name. We will refer to such lists as -*signatures*. One of the many typemaps defined by ``numpy.i`` is used -above and has the signature ``(double* IN_ARRAY1, int DIM1)``. The -argument names are intended to suggest that the ``double*`` argument -is an input array of one dimension and that the ``int`` represents -that dimension. This is precisely the pattern in the ``rms`` -prototype. - -Most likely, no actual prototypes to be wrapped will have the argument -names ``IN_ARRAY1`` and ``DIM1``. We use the ``%apply`` directive to -apply the typemap for one-dimensional input arrays of type ``double`` -to the actual prototype used by ``rms``. Using ``numpy.i`` -effectively, therefore, requires knowing what typemaps are available -and what they do. - -A `SWIG`_ interface file that includes the `SWIG`_ directives given -above will produce wrapper code that looks something like:: - - 1 PyObject *_wrap_rms(PyObject *args) { - 2 PyObject *resultobj = 0; - 3 double *arg1 = (double *) 0 ; - 4 int arg2 ; - 5 double result; - 6 PyArrayObject *array1 = NULL ; - 7 int is_new_object1 = 0 ; - 8 PyObject * obj0 = 0 ; - 9 - 10 if (!PyArg_ParseTuple(args,(char *)"O:rms",&obj0)) SWIG_fail; - 11 { - 12 array1 = obj_to_array_contiguous_allow_conversion( - 13 obj0, NPY_DOUBLE, &is_new_object1); - 14 npy_intp size[1] = { - 15 -1 - 16 }; - 17 if (!array1 || !require_dimensions(array1, 1) || - 18 !require_size(array1, size, 1)) SWIG_fail; - 19 arg1 = (double*) array1->data; - 20 arg2 = (int) array1->dimensions[0]; - 21 } - 22 result = (double)rms(arg1,arg2); - 23 resultobj = SWIG_From_double((double)(result)); - 24 { - 25 if (is_new_object1 && array1) Py_DECREF(array1); - 26 } - 27 return resultobj; - 28 fail: - 29 { - 30 if (is_new_object1 && array1) Py_DECREF(array1); - 31 } - 32 return NULL; - 33 } - -The typemaps from ``numpy.i`` are responsible for the following lines -of code: 12--20, 25 and 30. Line 10 parses the input to the ``rms`` -function. From the format string ``"O:rms"``, we can see that the -argument list is expected to be a single `python`_ object (specified -by the ``O`` before the colon) and whose pointer is stored in -``obj0``. A number of functions, supplied by ``numpy.i``, are called -to make and check the (possible) conversion from a generic `python`_ -object to a `NumPy`_ array. These functions are explained in the -section `Helper Functions`_, but hopefully their names are -self-explanatory. At line 12 we use ``obj0`` to construct a `NumPy`_ -array. At line 17, we check the validity of the result: that it is -non-null and that it has a single dimension of arbitrary length. Once -these states are verified, we extract the data buffer and length in -lines 19 and 20 so that we can call the underlying C function at line -22. Line 25 performs memory management for the case where we have -created a new array that is no longer needed. - -This code has a significant amount of error handling. Note the -``SWIG_fail`` is a macro for ``goto fail``, refering to the label at -line 28. If the user provides the wrong number of arguments, this -will be caught at line 10. If construction of the `NumPy`_ array -fails or produces an array with the wrong number of dimensions, these -errors are caught at line 17. And finally, if an error is detected, -memory is still managed correctly at line 30. - -Note that if the C function signature was in a different order:: - - double rms(int n, double* seq); - -that `SWIG`_ would not match the typemap signature given above with -the argument list for ``rms``. Fortunately, ``numpy.i`` has a set of -typemaps with the data pointer given last:: - - %apply (int DIM1, double* IN_ARRAY1) {(int n, double* seq)}; - -This simply has the effect of switching the definitions of ``arg1`` -and ``arg2`` in lines 3 and 4 of the generated code above, and their -assignments in lines 19 and 20. - -Using numpy.i -============= - -The ``numpy.i`` file is currently located in the ``numpy/docs/swig`` -sub-directory under the ``numpy`` installation directory. Typically, -you will want to copy it to the directory where you are developing -your wrappers. If it is ever adopted by `SWIG`_ developers, then it -will be installed in a standard place where `SWIG`_ can find it. - -A simple module that only uses a single `SWIG`_ interface file should -include the following:: - - %{ - #define SWIG_FILE_WITH_INIT - %} - %include "numpy.i" - %init %{ - import_array(); - %} - -Within a compiled `python`_ module, ``import_array()`` should only get -called once. This could be in a C/C++ file that you have written and -is linked to the module. If this is the case, then none of your -interface files should ``#define SWIG_FILE_WITH_INIT`` or call -``import_array()``. Or, this initialization call could be in a -wrapper file generated by `SWIG`_ from an interface file that has the -``%init`` block as above. If this is the case, and you have more than -one `SWIG`_ interface file, then only one interface file should -``#define SWIG_FILE_WITH_INIT`` and call ``import_array()``. - -Available Typemaps -================== - -The typemap directives provided by ``numpy.i`` for arrays of different -data types, say ``double`` and ``int``, and dimensions of different -types, say ``int`` or ``long``, are identical to one another except -for the C and `NumPy`_ type specifications. The typemaps are -therefore implemented (typically behind the scenes) via a macro:: - - %numpy_typemaps(DATA_TYPE, DATA_TYPECODE, DIM_TYPE) - -that can be invoked for appropriate ``(DATA_TYPE, DATA_TYPECODE, -DIM_TYPE)`` triplets. For example:: - - %numpy_typemaps(double, NPY_DOUBLE, int) - %numpy_typemaps(int, NPY_INT , int) - -The ``numpy.i`` interface file uses the ``%numpy_typemaps`` macro to -implement typemaps for the following C data types and ``int`` -dimension types: - - * ``signed char`` - * ``unsigned char`` - * ``short`` - * ``unsigned short`` - * ``int`` - * ``unsigned int`` - * ``long`` - * ``unsigned long`` - * ``long long`` - * ``unsigned long long`` - * ``float`` - * ``double`` - -In the following descriptions, we reference a generic ``DATA_TYPE``, which -could be any of the C data types listed above. - -Input Arrays ------------- - -Input arrays are defined as arrays of data that are passed into a -routine but are not altered in-place or returned to the user. The -`python`_ input array is therefore allowed to be almost any `python`_ -sequence (such as a list) that can be converted to the requested type -of array. The input array signatures are - - * ``( DATA_TYPE IN_ARRAY1[ANY] )`` - * ``( DATA_TYPE* IN_ARRAY1, int DIM1 )`` - * ``( int DIM1, DATA_TYPE* IN_ARRAY1 )`` - * ``( DATA_TYPE IN_ARRAY2[ANY][ANY] )`` - * ``( DATA_TYPE* IN_ARRAY2, int DIM1, int DIM2 )`` - * ``( int DIM1, int DIM2, DATA_TYPE* IN_ARRAY2 )`` - * ``( DATA_TYPE IN_ARRAY3[ANY][ANY][ANY] )`` - * ``( DATA_TYPE* IN_ARRAY3, int DIM1, int DIM2, int DIM3 )`` - * ``( int DIM1, int DIM2, int DIM3, DATA_TYPE* IN_ARRAY3 )`` - -The first signature listed, ``( DATA_TYPE IN_ARRAY[ANY] )`` is for -one-dimensional arrays with hard-coded dimensions. Likewise, -``( DATA_TYPE IN_ARRAY2[ANY][ANY] )`` is for two-dimensional arrays -with hard-coded dimensions, and similarly for three-dimensional. - -In-Place Arrays ---------------- - -In-place arrays are defined as arrays that are modified in-place. The -input values may or may not be used, but the values at the time the -function returns are significant. The provided `python`_ argument -must therefore be a `NumPy`_ array of the required type. The in-place -signatures are - - * ``( DATA_TYPE INPLACE_ARRAY1[ANY] )`` - * ``( DATA_TYPE* INPLACE_ARRAY1, int DIM1 )`` - * ``( int DIM1, DATA_TYPE* INPLACE_ARRAY1 )`` - * ``( DATA_TYPE INPLACE_ARRAY2[ANY][ANY] )`` - * ``( DATA_TYPE* INPLACE_ARRAY2, int DIM1, int DIM2 )`` - * ``( int DIM1, int DIM2, DATA_TYPE* INPLACE_ARRAY2 )`` - * ``( DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY] )`` - * ``( DATA_TYPE* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3 )`` - * ``( int DIM1, int DIM2, int DIM3, DATA_TYPE* INPLACE_ARRAY3 )`` - -These typemaps now check to make sure that the ``INPLACE_ARRAY`` -arguments use native byte ordering. If not, an exception is raised. - -Argout Arrays -------------- - -Argout arrays are arrays that appear in the input arguments in C, but -are in fact output arrays. This pattern occurs often when there is -more than one output variable and the single return argument is -therefore not sufficient. In `python`_, the convential way to return -multiple arguments is to pack them into a sequence (tuple, list, etc.) -and return the sequence. This is what the argout typemaps do. If a -wrapped function that uses these argout typemaps has more than one -return argument, they are packed into a tuple or list, depending on -the version of `python`_. The `python`_ user does not pass these -arrays in, they simply get returned. The argout signatures are - - * ``( DATA_TYPE ARGOUT_ARRAY1[ANY] )`` - * ``( DATA_TYPE* ARGOUT_ARRAY1, int DIM1 )`` - * ``( int DIM1, DATA_TYPE* ARGOUT_ARRAY1 )`` - * ``( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )`` - * ``( DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY] )`` - -These are typically used in situations where in C/C++, you would -allocate a(n) array(s) on the heap, and call the function to fill the -array(s) values. In `python`_, the arrays are allocated for you and -returned as new array objects. - -Note that we support ``DATA_TYPE*`` argout typemaps in 1D, but not 2D -or 3D. This because of a quirk with the `SWIG`_ typemap syntax and -cannot be avoided. Note that for these types of 1D typemaps, the -`python`_ function will take a single argument representing ``DIM1``. - -Output Arrays -------------- - -The ``numpy.i`` interface file does not support typemaps for output -arrays, for several reasons. First, C/C++ return arguments are -limited to a single value. This prevents obtaining dimension -information in a general way. Second, arrays with hard-coded lengths -are not permitted as return arguments. In other words:: - - double[3] newVector(double x, double y, double z); - -is not legal C/C++ syntax. Therefore, we cannot provide typemaps of -the form:: - - %typemap(out) (TYPE[ANY]); - -If you run into a situation where a function or method is returning a -pointer to an array, your best bet is to write your own version of the -function to be wrapped, either with ``%extend`` for the case of class -methods or ``%ignore`` and ``%rename`` for the case of functions. - -Other Common Types: bool ------------------------- - -Note that C++ type ``bool`` is not supported in the list in the -`Available Typemaps`_ section. NumPy bools are a single byte, while -the C++ ``bool`` is four bytes (at least on my system). Therefore:: - - %numpy_typemaps(bool, NPY_BOOL, int) - -will result in typemaps that will produce code that reference -improper data lengths. You can implement the following macro -expansion:: - - %numpy_typemaps(bool, NPY_UINT, int) - -to fix the data length problem, and `Input Arrays`_ will work fine, -but `In-Place Arrays`_ might fail type-checking. - -Other Common Types: complex ---------------------------- - -Typemap conversions for complex floating-point types is also not -supported automatically. This is because `python`_ and `NumPy`_ are -written in C, which does not have native complex types. Both -`python`_ and `NumPy`_ implement their own (essentially equivalent) -``struct`` definitions for complex variables:: - - /* Python */ - typedef struct {double real; double imag;} Py_complex; - - /* NumPy */ - typedef struct {float real, imag;} npy_cfloat; - typedef struct {double real, imag;} npy_cdouble; - -We could have implemented:: - - %numpy_typemaps(Py_complex , NPY_CDOUBLE, int) - %numpy_typemaps(npy_cfloat , NPY_CFLOAT , int) - %numpy_typemaps(npy_cdouble, NPY_CDOUBLE, int) - -which would have provided automatic type conversions for arrays of -type ``Py_complex``, ``npy_cfloat`` and ``npy_cdouble``. However, it -seemed unlikely that there would be any independent (non-`python`_, -non-`NumPy`_) application code that people would be using `SWIG`_ to -generate a `python`_ interface to, that also used these definitions -for complex types. More likely, these application codes will define -their own complex types, or in the case of C++, use ``std::complex``. -Assuming these data structures are compatible with `python`_ and -`NumPy`_ complex types, ``%numpy_typemap`` expansions as above (with -the user's complex type substituted for the first argument) should -work. - -Helper Functions -================ - -The ``numpy.i`` file containes several macros and routines that it -uses internally to build its typemaps. However, these functions may -be useful elsewhere in your interface file. - -Macros ------- - - **is_array(a)** - Evaluates as true if ``a`` is non-``NULL`` and can be cast to a - ``PyArrayObject*``. - - **array_type(a)** - Evaluates to the integer data type code of ``a``, assuming ``a`` can - be cast to a ``PyArrayObject*``. - - **array_numdims(a)** - Evaluates to the integer number of dimensions of ``a``, assuming - ``a`` can be cast to a ``PyArrayObject*``. - - **array_dimensions(a)** - Evaluates to an array of type ``npy_intp`` and length - ``array_numdims(a)``, giving the lengths of all of the dimensions - of ``a``, assuming ``a`` can be cast to a ``PyArrayObject*``. - - **array_size(a,i)** - Evaluates to the ``i``-th dimension size of ``a``, assuming ``a`` - can be cast to a ``PyArrayObject*``. - - **array_data(a)** - Evaluates to a pointer of type ``void*`` that points to the data - buffer of ``a``, assuming ``a`` can be cast to a ``PyArrayObject*``. - - **array_is_contiguous(a)** - Evaluates as true if ``a`` is a contiguous array. Equivalent to - ``(PyArray_ISCONTIGUOUS(a))``. - - **array_is_native(a)** - Evaluates as true if the data buffer of ``a`` uses native byte - order. Equivalent to ``(PyArray_ISNOTSWAPPED(a))``. - -Routines --------- - - **pytype_string()** - - Return type: ``char*`` - - Arguments: - - * ``PyObject* py_obj``, a general `python`_ object. - - Return a string describing the type of ``py_obj``. - - - **typecode_string()** - - Return type: ``char*`` - - Arguments: - - * ``int typecode``, a `NumPy`_ integer typecode. - - Return a string describing the type corresponding to the `NumPy`_ - ``typecode``. - - **type_match()** - - Return type: ``int`` - - Arguments: - - * ``int actual_type``, the `NumPy`_ typecode of a `NumPy`_ array. - - * ``int desired_type``, the desired `NumPy`_ typecode. - - Make sure that ``actual_type`` is compatible with - ``desired_type``. For example, this allows character and - byte types, or int and long types, to match. This is now - equivalent to ``PyArray_EquivTypenums()``. - - - **obj_to_array_no_conversion()** - - Return type: ``PyArrayObject*`` - - Arguments: - - * ``PyObject* input``, a general `python`_ object. - - * ``int typecode``, the desired `NumPy`_ typecode. - - Cast ``input`` to a ``PyArrayObject*`` if legal, and ensure that - it is of type ``typecode``. If ``input`` cannot be cast, or the - ``typecode`` is wrong, set a `python`_ error and return ``NULL``. - - - **obj_to_array_allow_conversion()** - - Return type: ``PyArrayObject*`` - - Arguments: - - * ``PyObject* input``, a general `python`_ object. - - * ``int typecode``, the desired `NumPy`_ typecode of the resulting - array. - - * ``int* is_new_object``, returns a value of 0 if no conversion - performed, else 1. - - Convert ``input`` to a `NumPy`_ array with the given ``typecode``. - On success, return a valid ``PyArrayObject*`` with the correct - type. On failure, the `python`_ error string will be set and the - routine returns ``NULL``. - - - **make_contiguous()** - - Return type: ``PyArrayObject*`` - - Arguments: - - * ``PyArrayObject* ary``, a `NumPy`_ array. - - * ``int* is_new_object``, returns a value of 0 if no conversion - performed, else 1. - - * ``int min_dims``, minimum allowable dimensions. - - * ``int max_dims``, maximum allowable dimensions. - - Check to see if ``ary`` is contiguous. If so, return the input - pointer and flag it as not a new object. If it is not contiguous, - create a new ``PyArrayObject*`` using the original data, flag it - as a new object and return the pointer. - - - **obj_to_array_contiguous_allow_conversion()** - - Return type: ``PyArrayObject*`` - - Arguments: - - * ``PyObject* input``, a general `python`_ object. - - * ``int typecode``, the desired `NumPy`_ typecode of the resulting - array. - - * ``int* is_new_object``, returns a value of 0 if no conversion - performed, else 1. - - Convert ``input`` to a contiguous ``PyArrayObject*`` of the - specified type. If the input object is not a contiguous - ``PyArrayObject*``, a new one will be created and the new object - flag will be set. - - - **require_contiguous()** - - Return type: ``int`` - - Arguments: - - * ``PyArrayObject* ary``, a `NumPy`_ array. - - Test whether ``ary`` is contiguous. If so, return 1. Otherwise, - set a `python`_ error and return 0. - - - **require_native()** - - Return type: ``int`` - - Arguments: - - * ``PyArray_Object* ary``, a `NumPy`_ array. - - Require that ``ary`` is not byte-swapped. If the array is not - byte-swapped, return 1. Otherwise, set a `python`_ error and - return 0. - - **require_dimensions()** - - Return type: ``int`` - - Arguments: - - * ``PyArrayObject* ary``, a `NumPy`_ array. - - * ``int exact_dimensions``, the desired number of dimensions. - - Require ``ary`` to have a specified number of dimensions. If the - array has the specified number of dimensions, return 1. - Otherwise, set a `python`_ error and return 0. - - - **require_dimensions_n()** - - Return type: ``int`` - - Arguments: - - * ``PyArrayObject* ary``, a `NumPy`_ array. - - * ``int* exact_dimensions``, an array of integers representing - acceptable numbers of dimensions. - - * ``int n``, the length of ``exact_dimensions``. - - Require ``ary`` to have one of a list of specified number of - dimensions. If the array has one of the specified number of - dimensions, return 1. Otherwise, set the `python`_ error string - and return 0. - - - **require_size()** - - Return type: ``int`` - - Arguments: - - * ``PyArrayObject* ary``, a `NumPy`_ array. - - * ``npy_int* size``, an array representing the desired lengths of - each dimension. - - * ``int n``, the length of ``size``. - - Require ``ary`` to have a specified shape. If the array has the - specified shape, return 1. Otherwise, set the `python`_ error - string and return 0. - - -Beyond the Provided Typemaps -============================ - -There are many C or C++ array/`NumPy`_ array situations not covered by -a simple ``%include "numpy.i"`` and subsequent ``%apply`` directives. - -A Common Example ----------------- - -Consider a reasonable prototype for a dot product function:: - - double dot(int len, double* vec1, double* vec2); - -The `python`_ interface that we want is:: - - def dot(vec1, vec2): - """ - dot(PyObject,PyObject) -> double - """ - -The problem here is that there is one dimension argument and two array -arguments, and our typemaps are set up for dimensions that apply to a -single array (in fact, `SWIG`_ does not provide a mechanism for -associating ``len`` with ``vec2`` that takes two `python`_ input -arguments). The recommended solution is the following:: - - %apply (int DIM1, double* IN_ARRAY1) {(int len1, double* vec1), - (int len2, double* vec2)} - %rename (dot) my_dot; - %exception my_dot { - $action - if (PyErr_Occurred()) SWIG_fail; - } - %inline %{ - double my_dot(int len1, double* vec1, int len2, double* vec2) { - if (len1 != len2) { - PyErr_Format(PyExc_ValueError, - "Arrays of lengths (%d,%d) given", - len1, len2); - return 0.0; - } - return dot(len1, vec1, vec2); - } - %} - -If the header file that contains the prototype for ``double dot()`` -also contains other prototypes that you want to wrap, so that you need -to ``%include`` this header file, then you will also need a ``%ignore -dot;`` directive, placed after the ``%rename`` and before the -``%include`` directives. Or, if the function in question is a class -method, you will want to use ``%extend`` rather than ``%inline`` in -addition to ``%ignore``. - -**A note on error handling:** Note that ``my_dot`` returns a -``double`` but that it can also raise a `python`_ error. The -resulting wrapper function will return a `python`_ float -representation of 0.0 when the vector lengths do not match. Since -this is not ``NULL``, the `python`_ interpreter will not know to check -for an error. For this reason, we add the ``%exception`` directive -above for ``my_dot`` to get the behavior we want (note that -``$action`` is a macro that gets expanded to a valid call to -``my_dot``). In general, you will probably want to write a `SWIG`_ -macro to perform this task. - -Other Situations ----------------- - -There are other wrapping situations in which ``numpy.i`` may be -helpful when you encounter them. - - * In some situations, it is possible that you could use the - ``%numpy_templates`` macro to implement typemaps for your own - types. See the `Other Common Types: bool`_ or `Other Common - Types: complex`_ sections for examples. Another situation is if - your dimensions are of a type other than ``int`` (say ``long`` for - example):: - - %numpy_typemaps(double, NPY_DOUBLE, long) - - * You can use the code in ``numpy.i`` to write your own typemaps. - For example, if you had a four-dimensional array as a function - argument, you could cut-and-paste the appropriate - three-dimensional typemaps into your interface file. The - modifications for the fourth dimension would be trivial. - - * Sometimes, the best approach is to use the ``%extend`` directive - to define new methods for your classes (or overload existing ones) - that take a ``PyObject*`` (that either is or can be converted to a - ``PyArrayObject*``) instead of a pointer to a buffer. In this - case, the helper routines in ``numpy.i`` can be very useful. - - * Writing typemaps can be a bit nonintuitive. If you have specific - questions about writing `SWIG`_ typemaps for `NumPy`_, the - developers of ``numpy.i`` do monitor the - `Numpy-discussion `_ and - `Swig-user `_ mail lists. - -A Final Note ------------- - -When you use the ``%apply`` directive, as is usually necessary to use -``numpy.i``, it will remain in effect until you tell `SWIG`_ that it -shouldn't be. If the arguments to the functions or methods that you -are wrapping have common names, such as ``length`` or ``vector``, -these typemaps may get applied in situations you do not expect or -want. Therefore, it is always a good idea to add a ``%clear`` -directive after you are done with a specific typemap:: - - %apply (double* IN_ARRAY1, int DIM1) {(double* vector, int length)} - %include "my_header.h" - %clear (double* vector, int length); - -In general, you should target these typemap signatures specifically -where you want them, and then clear them after you are done. - -Summary -======= - -Out of the box, ``numpy.i`` provides typemaps that support conversion -between `NumPy`_ arrays and C arrays: - - * That can be one of 12 different scalar types: ``signed char``, - ``unsigned char``, ``short``, ``unsigned short``, ``int``, - ``unsigned int``, ``long``, ``unsigned long``, ``long long``, - ``unsigned long long``, ``float`` and ``double``. - - * That support 23 different argument signatures for each data type, - including: - - + One-dimensional, two-dimensional and three-dimensional arrays. - - + Input-only, in-place, and argout behavior. - - + Hard-coded dimensions, data-buffer-then-dimensions - specification, and dimensions-then-data-buffer specification. - -The ``numpy.i`` interface file also provides additional tools for -wrapper developers, including: - - * A `SWIG`_ macro (``%numpy_typemaps``) with three arguments for - implementing the 23 argument signatures for the user's choice of - (1) C data type, (2) `NumPy`_ data type (assuming they match), and - (3) dimension type. - - * Seven C macros and eleven C functions that can be used to write - specialized typemaps, extensions, or inlined functions that handle - cases not covered by the provided typemaps. - -Acknowledgements -================ - -Many people have worked to glue `SWIG`_ and `NumPy`_ together (as well -as `SWIG`_ and the predecessors of `NumPy`_, Numeric and numarray). -The effort to standardize this work into ``numpy.i`` began at the 2005 -`SciPy `_ Conference with a conversation between -Fernando Perez and myself. Fernando collected helper functions and -typemaps from Michael Hunter, Anna Omelchenko and Michael Sanner. -Sebastian Hasse has also provided additional error checking and use -cases. The work of these contributors has made this end result -possible. Deleted: trunk/numpy/doc/swig/setup.py =================================================================== --- trunk/numpy/doc/swig/setup.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/setup.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,43 +0,0 @@ -#! /usr/bin/env python - -# System imports -from distutils.core import * -from distutils import sysconfig - -# Third-party modules - we depend on numpy for everything -import numpy - -# Obtain the numpy include directory. This logic works across numpy versions. -try: - numpy_include = numpy.get_include() -except AttributeError: - numpy_include = numpy.get_numpy_include() - -# _Vector extension module -_Vector = Extension("_Vector", - ["Vector_wrap.cxx", - "vector.cxx"], - include_dirs = [numpy_include], - ) - -# _Matrix extension module -_Matrix = Extension("_Matrix", - ["Matrix_wrap.cxx", - "matrix.cxx"], - include_dirs = [numpy_include], - ) - -# _Tensor extension module -_Tensor = Extension("_Tensor", - ["Tensor_wrap.cxx", - "tensor.cxx"], - include_dirs = [numpy_include], - ) - -# NumyTypemapTests setup -setup(name = "NumpyTypemapTests", - description = "Functions that work on arrays", - author = "Bill Spotz", - py_modules = ["Vector", "Matrix", "Tensor"], - ext_modules = [_Vector , _Matrix , _Tensor ] - ) Added: trunk/numpy/doc/swig/test/Makefile =================================================================== --- trunk/numpy/doc/swig/test/Makefile 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Makefile 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,27 @@ +# SWIG +INTERFACES = Vector.i Matrix.i Tensor.i +WRAPPERS = $(INTERFACES:.i=_wrap.cxx) +PROXIES = $(INTERFACES:.i=.py ) + +# Default target: build the tests +.PHONY : all +all: $(WRAPPERS) Vector.cxx Vector.h Matrix.cxx Matrix.h Tensor.cxx Tensor.h + ./setup.py build + +# Test target: run the tests +.PHONY : test +test: all + testVector.py + testMatrix.py + testTensor.py + +# Rule: %.i -> %_wrap.cxx +%_wrap.cxx: %.i %.h ../numpy.i + swig -c++ -python $< + +# Clean target +.PHONY : clean +clean: + $(RM) -r build + $(RM) $(WRAPPERS) + $(RM) $(PROXIES) Added: trunk/numpy/doc/swig/test/Matrix.cxx =================================================================== --- trunk/numpy/doc/swig/test/Matrix.cxx 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Matrix.cxx 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,112 @@ +#include +#include +#include +#include "Matrix.h" + +// The following macro defines a family of functions that work with 2D +// arrays with the forms +// +// TYPE SNAMEDet( TYPE matrix[2][2]); +// TYPE SNAMEMax( TYPE * matrix, int rows, int cols); +// TYPE SNAMEMin( int rows, int cols, TYPE * matrix); +// void SNAMEScale( TYPE matrix[3][3]); +// void SNAMEFloor( TYPE * array, int rows, int cols, TYPE floor); +// void SNAMECeil( int rows, int cols, TYPE * array, TYPE ceil); +// void SNAMELUSplit(TYPE in[3][3], TYPE lower[3][3], TYPE upper[3][3]); +// +// for any specified type TYPE (for example: short, unsigned int, long +// long, etc.) with given short name SNAME (for example: short, uint, +// longLong, etc.). The macro is then expanded for the given +// TYPE/SNAME pairs. The resulting functions are for testing numpy +// interfaces, respectively, for: +// +// * 2D input arrays, hard-coded length +// * 2D input arrays +// * 2D input arrays, data last +// * 2D in-place arrays, hard-coded lengths +// * 2D in-place arrays +// * 2D in-place arrays, data last +// * 2D argout arrays, hard-coded length +// +#define TEST_FUNCS(TYPE, SNAME) \ +\ +TYPE SNAME ## Det(TYPE matrix[2][2]) { \ + return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]; \ +} \ +\ +TYPE SNAME ## Max(TYPE * matrix, int rows, int cols) { \ + int i, j, index; \ + TYPE result = matrix[0]; \ + for (j=0; j result) result = matrix[index]; \ + } \ + } \ + return result; \ +} \ +\ +TYPE SNAME ## Min(int rows, int cols, TYPE * matrix) { \ + int i, j, index; \ + TYPE result = matrix[0]; \ + for (j=0; j ceil) array[index] = ceil; \ + } \ + } \ +} \ +\ +void SNAME ## LUSplit(TYPE matrix[3][3], TYPE lower[3][3], TYPE upper[3][3]) { \ + for (int i=0; i<3; ++i) { \ + for (int j=0; j<3; ++j) { \ + if (i >= j) { \ + lower[i][j] = matrix[i][j]; \ + upper[i][j] = 0; \ + } else { \ + lower[i][j] = 0; \ + upper[i][j] = matrix[i][j]; \ + } \ + } \ + } \ +} + +TEST_FUNCS(signed char , schar ) +TEST_FUNCS(unsigned char , uchar ) +TEST_FUNCS(short , short ) +TEST_FUNCS(unsigned short , ushort ) +TEST_FUNCS(int , int ) +TEST_FUNCS(unsigned int , uint ) +TEST_FUNCS(long , long ) +TEST_FUNCS(unsigned long , ulong ) +TEST_FUNCS(long long , longLong ) +TEST_FUNCS(unsigned long long, ulongLong) +TEST_FUNCS(float , float ) +TEST_FUNCS(double , double ) Added: trunk/numpy/doc/swig/test/Matrix.h =================================================================== --- trunk/numpy/doc/swig/test/Matrix.h 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Matrix.h 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,52 @@ +#ifndef MATRIX_H +#define MATRIX_H + +// The following macro defines the prototypes for a family of +// functions that work with 2D arrays with the forms +// +// TYPE SNAMEDet( TYPE matrix[2][2]); +// TYPE SNAMEMax( TYPE * matrix, int rows, int cols); +// TYPE SNAMEMin( int rows, int cols, TYPE * matrix); +// void SNAMEScale( TYPE array[3][3]); +// void SNAMEFloor( TYPE * array, int rows, int cols, TYPE floor); +// void SNAMECeil( int rows, int cols, TYPE * array, TYPE ceil ); +// void SNAMELUSplit(TYPE in[3][3], TYPE lower[3][3], TYPE upper[3][3]); +// +// for any specified type TYPE (for example: short, unsigned int, long +// long, etc.) with given short name SNAME (for example: short, uint, +// longLong, etc.). The macro is then expanded for the given +// TYPE/SNAME pairs. The resulting functions are for testing numpy +// interfaces, respectively, for: +// +// * 2D input arrays, hard-coded lengths +// * 2D input arrays +// * 2D input arrays, data last +// * 2D in-place arrays, hard-coded lengths +// * 2D in-place arrays +// * 2D in-place arrays, data last +// * 2D argout arrays, hard-coded length +// +#define TEST_FUNC_PROTOS(TYPE, SNAME) \ +\ +TYPE SNAME ## Det( TYPE matrix[2][2]); \ +TYPE SNAME ## Max( TYPE * matrix, int rows, int cols); \ +TYPE SNAME ## Min( int rows, int cols, TYPE * matrix); \ +void SNAME ## Scale( TYPE array[3][3], TYPE val); \ +void SNAME ## Floor( TYPE * array, int rows, int cols, TYPE floor); \ +void SNAME ## Ceil( int rows, int cols, TYPE * array, TYPE ceil ); \ +void SNAME ## LUSplit(TYPE matrix[3][3], TYPE lower[3][3], TYPE upper[3][3]); + +TEST_FUNC_PROTOS(signed char , schar ) +TEST_FUNC_PROTOS(unsigned char , uchar ) +TEST_FUNC_PROTOS(short , short ) +TEST_FUNC_PROTOS(unsigned short , ushort ) +TEST_FUNC_PROTOS(int , int ) +TEST_FUNC_PROTOS(unsigned int , uint ) +TEST_FUNC_PROTOS(long , long ) +TEST_FUNC_PROTOS(unsigned long , ulong ) +TEST_FUNC_PROTOS(long long , longLong ) +TEST_FUNC_PROTOS(unsigned long long, ulongLong) +TEST_FUNC_PROTOS(float , float ) +TEST_FUNC_PROTOS(double , double ) + +#endif Added: trunk/numpy/doc/swig/test/Matrix.i =================================================================== --- trunk/numpy/doc/swig/test/Matrix.i 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Matrix.i 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,45 @@ +// -*- c++ -*- +%module Matrix + +%{ +#define SWIG_FILE_WITH_INIT +#include "Matrix.h" +%} + +// Get the NumPy typemaps +%include "../numpy.i" + +%init %{ + import_array(); +%} + +%define %apply_numpy_typemaps(TYPE) + +%apply (TYPE IN_ARRAY2[ANY][ANY]) {(TYPE matrix[ANY][ANY])}; +%apply (TYPE* IN_ARRAY2, int DIM1, int DIM2) {(TYPE* matrix, int rows, int cols)}; +%apply (int DIM1, int DIM2, TYPE* IN_ARRAY2) {(int rows, int cols, TYPE* matrix)}; + +%apply (TYPE INPLACE_ARRAY2[ANY][ANY]) {(TYPE array[3][3])}; +%apply (TYPE* INPLACE_ARRAY2, int DIM1, int DIM2) {(TYPE* array, int rows, int cols)}; +%apply (int DIM1, int DIM2, TYPE* INPLACE_ARRAY2) {(int rows, int cols, TYPE* array)}; + +%apply (TYPE ARGOUT_ARRAY2[ANY][ANY]) {(TYPE lower[3][3])}; +%apply (TYPE ARGOUT_ARRAY2[ANY][ANY]) {(TYPE upper[3][3])}; + +%enddef /* %apply_numpy_typemaps() macro */ + +%apply_numpy_typemaps(signed char ) +%apply_numpy_typemaps(unsigned char ) +%apply_numpy_typemaps(short ) +%apply_numpy_typemaps(unsigned short ) +%apply_numpy_typemaps(int ) +%apply_numpy_typemaps(unsigned int ) +%apply_numpy_typemaps(long ) +%apply_numpy_typemaps(unsigned long ) +%apply_numpy_typemaps(long long ) +%apply_numpy_typemaps(unsigned long long) +%apply_numpy_typemaps(float ) +%apply_numpy_typemaps(double ) + +// Include the header file to be wrapped +%include "Matrix.h" Added: trunk/numpy/doc/swig/test/Tensor.cxx =================================================================== --- trunk/numpy/doc/swig/test/Tensor.cxx 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Tensor.cxx 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,131 @@ +#include +#include +#include +#include "Tensor.h" + +// The following macro defines a family of functions that work with 3D +// arrays with the forms +// +// TYPE SNAMENorm( TYPE tensor[2][2][2]); +// TYPE SNAMEMax( TYPE * tensor, int rows, int cols, int num); +// TYPE SNAMEMin( int rows, int cols, int num, TYPE * tensor); +// void SNAMEScale( TYPE tensor[3][3][3]); +// void SNAMEFloor( TYPE * array, int rows, int cols, int num, TYPE floor); +// void SNAMECeil( int rows, int cols, int num, TYPE * array, TYPE ceil); +// void SNAMELUSplit(TYPE in[2][2][2], TYPE lower[2][2][2], TYPE upper[2][2][2]); +// +// for any specified type TYPE (for example: short, unsigned int, long +// long, etc.) with given short name SNAME (for example: short, uint, +// longLong, etc.). The macro is then expanded for the given +// TYPE/SNAME pairs. The resulting functions are for testing numpy +// interfaces, respectively, for: +// +// * 3D input arrays, hard-coded length +// * 3D input arrays +// * 3D input arrays, data last +// * 3D in-place arrays, hard-coded lengths +// * 3D in-place arrays +// * 3D in-place arrays, data last +// * 3D argout arrays, hard-coded length +// +#define TEST_FUNCS(TYPE, SNAME) \ +\ +TYPE SNAME ## Norm(TYPE tensor[2][2][2]) { \ + double result = 0; \ + for (int k=0; k<2; ++k) \ + for (int j=0; j<2; ++j) \ + for (int i=0; i<2; ++i) \ + result += tensor[i][j][k] * tensor[i][j][k]; \ + return (TYPE)sqrt(result/8); \ +} \ +\ +TYPE SNAME ## Max(TYPE * tensor, int rows, int cols, int num) { \ + int i, j, k, index; \ + TYPE result = tensor[0]; \ + for (k=0; k result) result = tensor[index]; \ + } \ + } \ + } \ + return result; \ +} \ +\ +TYPE SNAME ## Min(int rows, int cols, int num, TYPE * tensor) { \ + int i, j, k, index; \ + TYPE result = tensor[0]; \ + for (k=0; k ceil) array[index] = ceil; \ + } \ + } \ + } \ +} \ +\ +void SNAME ## LUSplit(TYPE tensor[2][2][2], TYPE lower[2][2][2], \ + TYPE upper[2][2][2]) { \ + int sum; \ + for (int k=0; k<2; ++k) { \ + for (int j=0; j<2; ++j) { \ + for (int i=0; i<2; ++i) { \ + sum = i + j + k; \ + if (sum < 2) { \ + lower[i][j][k] = tensor[i][j][k]; \ + upper[i][j][k] = 0; \ + } else { \ + upper[i][j][k] = tensor[i][j][k]; \ + lower[i][j][k] = 0; \ + } \ + } \ + } \ + } \ +} + +TEST_FUNCS(signed char , schar ) +TEST_FUNCS(unsigned char , uchar ) +TEST_FUNCS(short , short ) +TEST_FUNCS(unsigned short , ushort ) +TEST_FUNCS(int , int ) +TEST_FUNCS(unsigned int , uint ) +TEST_FUNCS(long , long ) +TEST_FUNCS(unsigned long , ulong ) +TEST_FUNCS(long long , longLong ) +TEST_FUNCS(unsigned long long, ulongLong) +TEST_FUNCS(float , float ) +TEST_FUNCS(double , double ) Added: trunk/numpy/doc/swig/test/Tensor.h =================================================================== --- trunk/numpy/doc/swig/test/Tensor.h 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Tensor.h 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,52 @@ +#ifndef TENSOR_H +#define TENSOR_H + +// The following macro defines the prototypes for a family of +// functions that work with 3D arrays with the forms +// +// TYPE SNAMENorm( TYPE tensor[2][2][2]); +// TYPE SNAMEMax( TYPE * tensor, int rows, int cols, int num); +// TYPE SNAMEMin( int rows, int cols, int num, TYPE * tensor); +// void SNAMEScale( TYPE array[3][3][3]); +// void SNAMEFloor( TYPE * array, int rows, int cols, int num, TYPE floor); +// void SNAMECeil( int rows, int cols, int num, TYPE * array, TYPE ceil ); +// void SNAMELUSplit(TYPE in[3][3][3], TYPE lower[3][3][3], TYPE upper[3][3][3]); +// +// for any specified type TYPE (for example: short, unsigned int, long +// long, etc.) with given short name SNAME (for example: short, uint, +// longLong, etc.). The macro is then expanded for the given +// TYPE/SNAME pairs. The resulting functions are for testing numpy +// interfaces, respectively, for: +// +// * 3D input arrays, hard-coded lengths +// * 3D input arrays +// * 3D input arrays, data last +// * 3D in-place arrays, hard-coded lengths +// * 3D in-place arrays +// * 3D in-place arrays, data last +// * 3D argout arrays, hard-coded length +// +#define TEST_FUNC_PROTOS(TYPE, SNAME) \ +\ +TYPE SNAME ## Norm( TYPE tensor[2][2][2]); \ +TYPE SNAME ## Max( TYPE * tensor, int rows, int cols, int num); \ +TYPE SNAME ## Min( int rows, int cols, int num, TYPE * tensor); \ +void SNAME ## Scale( TYPE array[3][3][3], TYPE val); \ +void SNAME ## Floor( TYPE * array, int rows, int cols, int num, TYPE floor); \ +void SNAME ## Ceil( int rows, int cols, int num, TYPE * array, TYPE ceil ); \ +void SNAME ## LUSplit(TYPE tensor[2][2][2], TYPE lower[2][2][2], TYPE upper[2][2][2]); + +TEST_FUNC_PROTOS(signed char , schar ) +TEST_FUNC_PROTOS(unsigned char , uchar ) +TEST_FUNC_PROTOS(short , short ) +TEST_FUNC_PROTOS(unsigned short , ushort ) +TEST_FUNC_PROTOS(int , int ) +TEST_FUNC_PROTOS(unsigned int , uint ) +TEST_FUNC_PROTOS(long , long ) +TEST_FUNC_PROTOS(unsigned long , ulong ) +TEST_FUNC_PROTOS(long long , longLong ) +TEST_FUNC_PROTOS(unsigned long long, ulongLong) +TEST_FUNC_PROTOS(float , float ) +TEST_FUNC_PROTOS(double , double ) + +#endif Added: trunk/numpy/doc/swig/test/Tensor.i =================================================================== --- trunk/numpy/doc/swig/test/Tensor.i 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Tensor.i 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,49 @@ +// -*- c++ -*- +%module Tensor + +%{ +#define SWIG_FILE_WITH_INIT +#include "Tensor.h" +%} + +// Get the NumPy typemaps +%include "../numpy.i" + +%init %{ + import_array(); +%} + +%define %apply_numpy_typemaps(TYPE) + +%apply (TYPE IN_ARRAY3[ANY][ANY][ANY]) {(TYPE tensor[ANY][ANY][ANY])}; +%apply (TYPE* IN_ARRAY3, int DIM1, int DIM2, int DIM3) + {(TYPE* tensor, int rows, int cols, int num)}; +%apply (int DIM1, int DIM2, int DIM3, TYPE* IN_ARRAY3) + {(int rows, int cols, int num, TYPE* tensor)}; + +%apply (TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) {(TYPE array[3][3][3])}; +%apply (TYPE* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) + {(TYPE* array, int rows, int cols, int num)}; +%apply (int DIM1, int DIM2, int DIM3, TYPE* INPLACE_ARRAY3) + {(int rows, int cols, int num, TYPE* array)}; + +%apply (TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) {(TYPE lower[2][2][2])}; +%apply (TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) {(TYPE upper[2][2][2])}; + +%enddef /* %apply_numpy_typemaps() macro */ + +%apply_numpy_typemaps(signed char ) +%apply_numpy_typemaps(unsigned char ) +%apply_numpy_typemaps(short ) +%apply_numpy_typemaps(unsigned short ) +%apply_numpy_typemaps(int ) +%apply_numpy_typemaps(unsigned int ) +%apply_numpy_typemaps(long ) +%apply_numpy_typemaps(unsigned long ) +%apply_numpy_typemaps(long long ) +%apply_numpy_typemaps(unsigned long long) +%apply_numpy_typemaps(float ) +%apply_numpy_typemaps(double ) + +// Include the header file to be wrapped +%include "Tensor.h" Added: trunk/numpy/doc/swig/test/Vector.cxx =================================================================== --- trunk/numpy/doc/swig/test/Vector.cxx 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/Vector.cxx 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,100 @@ +#include +#include +#include +#include "Vector.h" + +// The following macro defines a family of functions that work with 1D +// arrays with the forms +// +// TYPE SNAMELength( TYPE vector[3]); +// TYPE SNAMEProd( TYPE * series, int size); +// TYPE SNAMESum( int size, TYPE * series); +// void SNAMEReverse(TYPE array[3]); +// void SNAMEOnes( TYPE * array, int size); +// void SNAMEZeros( int size, TYPE * array); +// void SNAMEEOSplit(TYPE vector[3], TYPE even[3], odd[3]); +// void SNAMETwos( TYPE * twoVec, int size); +// void SNAMEThrees( int size, TYPE * threeVec); +// +// for any specified type TYPE (for example: short, unsigned int, long +// long, etc.) with given short name SNAME (for example: short, uint, +// longLong, etc.). The macro is then expanded for the given +// TYPE/SNAME pairs. The resulting functions are for testing numpy +// interfaces, respectively, for: +// +// * 1D input arrays, hard-coded length +// * 1D input arrays +// * 1D input arrays, data last +// * 1D in-place arrays, hard-coded length +// * 1D in-place arrays +// * 1D in-place arrays, data last +// * 1D argout arrays, hard-coded length +// * 1D argout arrays +// * 1D argout arrays, data last +// +#define TEST_FUNCS(TYPE, SNAME) \ +\ +TYPE SNAME ## Length(TYPE vector[3]) { \ + double result = 0; \ + for (int i=0; i<3; ++i) result += vector[i]*vector[i]; \ + return (TYPE)sqrt(result); \ +} \ +\ +TYPE SNAME ## Prod(TYPE * series, int size) { \ + TYPE result = 1; \ + for (int i=0; i>sys.stderr, self.typeStr, "... ", + det = Matrix.__dict__[self.typeStr + "Det"] + matrix = [[8,7],[6,9]] + self.assertEquals(det(matrix), 30) + + # Test (type IN_ARRAY2[ANY][ANY]) typemap + def testDetBadList(self): + "Test det function with bad list" + print >>sys.stderr, self.typeStr, "... ", + det = Matrix.__dict__[self.typeStr + "Det"] + matrix = [[8,7], ["e", "pi"]] + self.assertRaises(BadListError, det, matrix) + + # Test (type IN_ARRAY2[ANY][ANY]) typemap + def testDetWrongDim(self): + "Test det function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + det = Matrix.__dict__[self.typeStr + "Det"] + matrix = [8,7] + self.assertRaises(TypeError, det, matrix) + + # Test (type IN_ARRAY2[ANY][ANY]) typemap + def testDetWrongSize(self): + "Test det function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + det = Matrix.__dict__[self.typeStr + "Det"] + matrix = [[8,7,6], [5,4,3], [2,1,0]] + self.assertRaises(TypeError, det, matrix) + + # Test (type IN_ARRAY2[ANY][ANY]) typemap + def testDetNonContainer(self): + "Test det function with non-container" + print >>sys.stderr, self.typeStr, "... ", + det = Matrix.__dict__[self.typeStr + "Det"] + self.assertRaises(TypeError, det, None) + + # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap + def testMax(self): + "Test max function" + print >>sys.stderr, self.typeStr, "... ", + max = Matrix.__dict__[self.typeStr + "Max"] + matrix = [[6,5,4],[3,2,1]] + self.assertEquals(max(matrix), 6) + + # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap + def testMaxBadList(self): + "Test max function with bad list" + print >>sys.stderr, self.typeStr, "... ", + max = Matrix.__dict__[self.typeStr + "Max"] + matrix = [[6,"five",4], ["three", 2, "one"]] + self.assertRaises(BadListError, max, matrix) + + # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap + def testMaxNonContainer(self): + "Test max function with non-container" + print >>sys.stderr, self.typeStr, "... ", + max = Matrix.__dict__[self.typeStr + "Max"] + self.assertRaises(TypeError, max, None) + + # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap + def testMaxWrongDim(self): + "Test max function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + max = Matrix.__dict__[self.typeStr + "Max"] + self.assertRaises(TypeError, max, [0, 1, 2, 3]) + + # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap + def testMin(self): + "Test min function" + print >>sys.stderr, self.typeStr, "... ", + min = Matrix.__dict__[self.typeStr + "Min"] + matrix = [[9,8],[7,6],[5,4]] + self.assertEquals(min(matrix), 4) + + # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap + def testMinBadList(self): + "Test min function with bad list" + print >>sys.stderr, self.typeStr, "... ", + min = Matrix.__dict__[self.typeStr + "Min"] + matrix = [["nine","eight"], ["seven","six"]] + self.assertRaises(BadListError, min, matrix) + + # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap + def testMinWrongDim(self): + "Test min function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + min = Matrix.__dict__[self.typeStr + "Min"] + self.assertRaises(TypeError, min, [1,3,5,7,9]) + + # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap + def testMinNonContainer(self): + "Test min function with non-container" + print >>sys.stderr, self.typeStr, "... ", + min = Matrix.__dict__[self.typeStr + "Min"] + self.assertRaises(TypeError, min, False) + + # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap + def testScale(self): + "Test scale function" + print >>sys.stderr, self.typeStr, "... ", + scale = Matrix.__dict__[self.typeStr + "Scale"] + matrix = N.array([[1,2,3],[2,1,2],[3,2,1]],self.typeCode) + scale(matrix,4) + self.assertEquals((matrix == [[4,8,12],[8,4,8],[12,8,4]]).all(), True) + + # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap + def testScaleWrongDim(self): + "Test scale function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + scale = Matrix.__dict__[self.typeStr + "Scale"] + matrix = N.array([1,2,2,1],self.typeCode) + self.assertRaises(TypeError, scale, matrix) + + # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap + def testScaleWrongSize(self): + "Test scale function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + scale = Matrix.__dict__[self.typeStr + "Scale"] + matrix = N.array([[1,2],[2,1]],self.typeCode) + self.assertRaises(TypeError, scale, matrix) + + # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap + def testScaleWrongType(self): + "Test scale function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + scale = Matrix.__dict__[self.typeStr + "Scale"] + matrix = N.array([[1,2,3],[2,1,2],[3,2,1]],'c') + self.assertRaises(TypeError, scale, matrix) + + # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap + def testScaleNonArray(self): + "Test scale function with non-array" + print >>sys.stderr, self.typeStr, "... ", + scale = Matrix.__dict__[self.typeStr + "Scale"] + matrix = [[1,2,3],[2,1,2],[3,2,1]] + self.assertRaises(TypeError, scale, matrix) + + # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap + def testFloor(self): + "Test floor function" + print >>sys.stderr, self.typeStr, "... ", + floor = Matrix.__dict__[self.typeStr + "Floor"] + matrix = N.array([[6,7],[8,9]],self.typeCode) + floor(matrix,7) + N.testing.assert_array_equal(matrix, N.array([[7,7],[8,9]])) + + # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap + def testFloorWrongDim(self): + "Test floor function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + floor = Matrix.__dict__[self.typeStr + "Floor"] + matrix = N.array([6,7,8,9],self.typeCode) + self.assertRaises(TypeError, floor, matrix) + + # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap + def testFloorWrongType(self): + "Test floor function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + floor = Matrix.__dict__[self.typeStr + "Floor"] + matrix = N.array([[6,7], [8,9]],'c') + self.assertRaises(TypeError, floor, matrix) + + # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap + def testFloorNonArray(self): + "Test floor function with non-array" + print >>sys.stderr, self.typeStr, "... ", + floor = Matrix.__dict__[self.typeStr + "Floor"] + matrix = [[6,7], [8,9]] + self.assertRaises(TypeError, floor, matrix) + + # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap + def testCeil(self): + "Test ceil function" + print >>sys.stderr, self.typeStr, "... ", + ceil = Matrix.__dict__[self.typeStr + "Ceil"] + matrix = N.array([[1,2],[3,4]],self.typeCode) + ceil(matrix,3) + N.testing.assert_array_equal(matrix, N.array([[1,2],[3,3]])) + + # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap + def testCeilWrongDim(self): + "Test ceil function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + ceil = Matrix.__dict__[self.typeStr + "Ceil"] + matrix = N.array([1,2,3,4],self.typeCode) + self.assertRaises(TypeError, ceil, matrix) + + # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap + def testCeilWrongType(self): + "Test ceil function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + ceil = Matrix.__dict__[self.typeStr + "Ceil"] + matrix = N.array([[1,2], [3,4]],'c') + self.assertRaises(TypeError, ceil, matrix) + + # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap + def testCeilNonArray(self): + "Test ceil function with non-array" + print >>sys.stderr, self.typeStr, "... ", + ceil = Matrix.__dict__[self.typeStr + "Ceil"] + matrix = [[1,2], [3,4]] + self.assertRaises(TypeError, ceil, matrix) + + # Test (type ARGOUT_ARRAY2[ANY][ANY]) typemap + def testLUSplit(self): + "Test luSplit function" + print >>sys.stderr, self.typeStr, "... ", + luSplit = Matrix.__dict__[self.typeStr + "LUSplit"] + lower, upper = luSplit([[1,2,3],[4,5,6],[7,8,9]]) + self.assertEquals((lower == [[1,0,0],[4,5,0],[7,8,9]]).all(), True) + self.assertEquals((upper == [[0,2,3],[0,0,6],[0,0,0]]).all(), True) + +###################################################################### + +class scharTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "schar" + self.typeCode = "b" + +###################################################################### + +class ucharTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "uchar" + self.typeCode = "B" + +###################################################################### + +class shortTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "short" + self.typeCode = "h" + +###################################################################### + +class ushortTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "ushort" + self.typeCode = "H" + +###################################################################### + +class intTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "int" + self.typeCode = "i" + +###################################################################### + +class uintTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "uint" + self.typeCode = "I" + +###################################################################### + +class longTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "long" + self.typeCode = "l" + +###################################################################### + +class ulongTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "ulong" + self.typeCode = "L" + +###################################################################### + +class longLongTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "longLong" + self.typeCode = "q" + +###################################################################### + +class ulongLongTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "ulongLong" + self.typeCode = "Q" + +###################################################################### + +class floatTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "float" + self.typeCode = "f" + +###################################################################### + +class doubleTestCase(MatrixTestCase): + def __init__(self, methodName="runTest"): + MatrixTestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + +###################################################################### + +if __name__ == "__main__": + + # Build the test suite + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite( scharTestCase)) + suite.addTest(unittest.makeSuite( ucharTestCase)) + suite.addTest(unittest.makeSuite( shortTestCase)) + suite.addTest(unittest.makeSuite( ushortTestCase)) + suite.addTest(unittest.makeSuite( intTestCase)) + suite.addTest(unittest.makeSuite( uintTestCase)) + suite.addTest(unittest.makeSuite( longTestCase)) + suite.addTest(unittest.makeSuite( ulongTestCase)) + suite.addTest(unittest.makeSuite( longLongTestCase)) + suite.addTest(unittest.makeSuite(ulongLongTestCase)) + suite.addTest(unittest.makeSuite( floatTestCase)) + suite.addTest(unittest.makeSuite( doubleTestCase)) + + # Execute the test suite + print "Testing 2D Functions of Module Matrix" + print "NumPy version", N.__version__ + print + result = unittest.TextTestRunner(verbosity=2).run(suite) + sys.exit(len(result.errors) + len(result.failures)) Property changes on: trunk/numpy/doc/swig/test/testMatrix.py ___________________________________________________________________ Name: svn:executable + * Added: trunk/numpy/doc/swig/test/testTensor.py =================================================================== --- trunk/numpy/doc/swig/test/testTensor.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/testTensor.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,405 @@ +#! /usr/bin/env python + +# System imports +from distutils.util import get_platform +from math import sqrt +import os +import sys +import unittest + +# Import NumPy +import numpy as N +major, minor = [ int(d) for d in N.__version__.split(".")[:2] ] +if major == 0: BadListError = TypeError +else: BadListError = ValueError + +# Add the distutils-generated build directory to the python search path and then +# import the extension module +libDir = "lib.%s-%s" % (get_platform(), sys.version[:3]) +sys.path.insert(0,os.path.join("build", libDir)) +import Tensor + +###################################################################### + +class TensorTestCase(unittest.TestCase): + + def __init__(self, methodName="runTests"): + unittest.TestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + self.result = sqrt(28.0/8) + + # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap + def testNorm(self): + "Test norm function" + print >>sys.stderr, self.typeStr, "... ", + norm = Tensor.__dict__[self.typeStr + "Norm"] + tensor = [[[0,1], [2,3]], + [[3,2], [1,0]]] + if isinstance(self.result, int): + self.assertEquals(norm(tensor), self.result) + else: + self.assertAlmostEqual(norm(tensor), self.result, 6) + + # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap + def testNormBadList(self): + "Test norm function with bad list" + print >>sys.stderr, self.typeStr, "... ", + norm = Tensor.__dict__[self.typeStr + "Norm"] + tensor = [[[0,"one"],[2,3]], + [[3,"two"],[1,0]]] + self.assertRaises(BadListError, norm, tensor) + + # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap + def testNormWrongDim(self): + "Test norm function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + norm = Tensor.__dict__[self.typeStr + "Norm"] + tensor = [[0,1,2,3], + [3,2,1,0]] + self.assertRaises(TypeError, norm, tensor) + + # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap + def testNormWrongSize(self): + "Test norm function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + norm = Tensor.__dict__[self.typeStr + "Norm"] + tensor = [[[0,1,0], [2,3,2]], + [[3,2,3], [1,0,1]]] + self.assertRaises(TypeError, norm, tensor) + + # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap + def testNormNonContainer(self): + "Test norm function with non-container" + print >>sys.stderr, self.typeStr, "... ", + norm = Tensor.__dict__[self.typeStr + "Norm"] + self.assertRaises(TypeError, norm, None) + + # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testMax(self): + "Test max function" + print >>sys.stderr, self.typeStr, "... ", + max = Tensor.__dict__[self.typeStr + "Max"] + tensor = [[[1,2], [3,4]], + [[5,6], [7,8]]] + self.assertEquals(max(tensor), 8) + + # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testMaxBadList(self): + "Test max function with bad list" + print >>sys.stderr, self.typeStr, "... ", + max = Tensor.__dict__[self.typeStr + "Max"] + tensor = [[[1,"two"], [3,4]], + [[5,"six"], [7,8]]] + self.assertRaises(BadListError, max, tensor) + + # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testMaxNonContainer(self): + "Test max function with non-container" + print >>sys.stderr, self.typeStr, "... ", + max = Tensor.__dict__[self.typeStr + "Max"] + self.assertRaises(TypeError, max, None) + + # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testMaxWrongDim(self): + "Test max function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + max = Tensor.__dict__[self.typeStr + "Max"] + self.assertRaises(TypeError, max, [0, -1, 2, -3]) + + # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap + def testMin(self): + "Test min function" + print >>sys.stderr, self.typeStr, "... ", + min = Tensor.__dict__[self.typeStr + "Min"] + tensor = [[[9,8], [7,6]], + [[5,4], [3,2]]] + self.assertEquals(min(tensor), 2) + + # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap + def testMinBadList(self): + "Test min function with bad list" + print >>sys.stderr, self.typeStr, "... ", + min = Tensor.__dict__[self.typeStr + "Min"] + tensor = [[["nine",8], [7,6]], + [["five",4], [3,2]]] + self.assertRaises(BadListError, min, tensor) + + # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap + def testMinNonContainer(self): + "Test min function with non-container" + print >>sys.stderr, self.typeStr, "... ", + min = Tensor.__dict__[self.typeStr + "Min"] + self.assertRaises(TypeError, min, True) + + # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap + def testMinWrongDim(self): + "Test min function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + min = Tensor.__dict__[self.typeStr + "Min"] + self.assertRaises(TypeError, min, [[1,3],[5,7]]) + + # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap + def testScale(self): + "Test scale function" + print >>sys.stderr, self.typeStr, "... ", + scale = Tensor.__dict__[self.typeStr + "Scale"] + tensor = N.array([[[1,0,1], [0,1,0], [1,0,1]], + [[0,1,0], [1,0,1], [0,1,0]], + [[1,0,1], [0,1,0], [1,0,1]]],self.typeCode) + scale(tensor,4) + self.assertEquals((tensor == [[[4,0,4], [0,4,0], [4,0,4]], + [[0,4,0], [4,0,4], [0,4,0]], + [[4,0,4], [0,4,0], [4,0,4]]]).all(), True) + + # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap + def testScaleWrongType(self): + "Test scale function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + scale = Tensor.__dict__[self.typeStr + "Scale"] + tensor = N.array([[[1,0,1], [0,1,0], [1,0,1]], + [[0,1,0], [1,0,1], [0,1,0]], + [[1,0,1], [0,1,0], [1,0,1]]],'c') + self.assertRaises(TypeError, scale, tensor) + + # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap + def testScaleWrongDim(self): + "Test scale function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + scale = Tensor.__dict__[self.typeStr + "Scale"] + tensor = N.array([[1,0,1], [0,1,0], [1,0,1], + [0,1,0], [1,0,1], [0,1,0]],self.typeCode) + self.assertRaises(TypeError, scale, tensor) + + # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap + def testScaleWrongSize(self): + "Test scale function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + scale = Tensor.__dict__[self.typeStr + "Scale"] + tensor = N.array([[[1,0], [0,1], [1,0]], + [[0,1], [1,0], [0,1]], + [[1,0], [0,1], [1,0]]],self.typeCode) + self.assertRaises(TypeError, scale, tensor) + + # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap + def testScaleNonArray(self): + "Test scale function with non-array" + print >>sys.stderr, self.typeStr, "... ", + scale = Tensor.__dict__[self.typeStr + "Scale"] + self.assertRaises(TypeError, scale, True) + + # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testFloor(self): + "Test floor function" + print >>sys.stderr, self.typeStr, "... ", + floor = Tensor.__dict__[self.typeStr + "Floor"] + tensor = N.array([[[1,2], [3,4]], + [[5,6], [7,8]]],self.typeCode) + floor(tensor,4) + N.testing.assert_array_equal(tensor, N.array([[[4,4], [4,4]], + [[5,6], [7,8]]])) + + # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testFloorWrongType(self): + "Test floor function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + floor = Tensor.__dict__[self.typeStr + "Floor"] + tensor = N.array([[[1,2], [3,4]], + [[5,6], [7,8]]],'c') + self.assertRaises(TypeError, floor, tensor) + + # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testFloorWrongDim(self): + "Test floor function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + floor = Tensor.__dict__[self.typeStr + "Floor"] + tensor = N.array([[1,2], [3,4], [5,6], [7,8]],self.typeCode) + self.assertRaises(TypeError, floor, tensor) + + # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap + def testFloorNonArray(self): + "Test floor function with non-array" + print >>sys.stderr, self.typeStr, "... ", + floor = Tensor.__dict__[self.typeStr + "Floor"] + self.assertRaises(TypeError, floor, object) + + # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap + def testCeil(self): + "Test ceil function" + print >>sys.stderr, self.typeStr, "... ", + ceil = Tensor.__dict__[self.typeStr + "Ceil"] + tensor = N.array([[[9,8], [7,6]], + [[5,4], [3,2]]],self.typeCode) + ceil(tensor,5) + N.testing.assert_array_equal(tensor, N.array([[[5,5], [5,5]], + [[5,4], [3,2]]])) + + # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap + def testCeilWrongType(self): + "Test ceil function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + ceil = Tensor.__dict__[self.typeStr + "Ceil"] + tensor = N.array([[[9,8], [7,6]], + [[5,4], [3,2]]],'c') + self.assertRaises(TypeError, ceil, tensor) + + # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap + def testCeilWrongDim(self): + "Test ceil function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + ceil = Tensor.__dict__[self.typeStr + "Ceil"] + tensor = N.array([[9,8], [7,6], [5,4], [3,2]], self.typeCode) + self.assertRaises(TypeError, ceil, tensor) + + # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap + def testCeilNonArray(self): + "Test ceil function with non-array" + print >>sys.stderr, self.typeStr, "... ", + ceil = Tensor.__dict__[self.typeStr + "Ceil"] + tensor = [[[9,8], [7,6]], + [[5,4], [3,2]]] + self.assertRaises(TypeError, ceil, tensor) + + # Test (type ARGOUT_ARRAY3[ANY][ANY][ANY]) typemap + def testLUSplit(self): + "Test luSplit function" + print >>sys.stderr, self.typeStr, "... ", + luSplit = Tensor.__dict__[self.typeStr + "LUSplit"] + lower, upper = luSplit([[[1,1], [1,1]], + [[1,1], [1,1]]]) + self.assertEquals((lower == [[[1,1], [1,0]], + [[1,0], [0,0]]]).all(), True) + self.assertEquals((upper == [[[0,0], [0,1]], + [[0,1], [1,1]]]).all(), True) + +###################################################################### + +class scharTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "schar" + self.typeCode = "b" + self.result = int(self.result) + +###################################################################### + +class ucharTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "uchar" + self.typeCode = "B" + self.result = int(self.result) + +###################################################################### + +class shortTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "short" + self.typeCode = "h" + self.result = int(self.result) + +###################################################################### + +class ushortTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "ushort" + self.typeCode = "H" + self.result = int(self.result) + +###################################################################### + +class intTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "int" + self.typeCode = "i" + self.result = int(self.result) + +###################################################################### + +class uintTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "uint" + self.typeCode = "I" + self.result = int(self.result) + +###################################################################### + +class longTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "long" + self.typeCode = "l" + self.result = int(self.result) + +###################################################################### + +class ulongTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "ulong" + self.typeCode = "L" + self.result = int(self.result) + +###################################################################### + +class longLongTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "longLong" + self.typeCode = "q" + self.result = int(self.result) + +###################################################################### + +class ulongLongTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "ulongLong" + self.typeCode = "Q" + self.result = int(self.result) + +###################################################################### + +class floatTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "float" + self.typeCode = "f" + +###################################################################### + +class doubleTestCase(TensorTestCase): + def __init__(self, methodName="runTest"): + TensorTestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + +###################################################################### + +if __name__ == "__main__": + + # Build the test suite + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite( scharTestCase)) + suite.addTest(unittest.makeSuite( ucharTestCase)) + suite.addTest(unittest.makeSuite( shortTestCase)) + suite.addTest(unittest.makeSuite( ushortTestCase)) + suite.addTest(unittest.makeSuite( intTestCase)) + suite.addTest(unittest.makeSuite( uintTestCase)) + suite.addTest(unittest.makeSuite( longTestCase)) + suite.addTest(unittest.makeSuite( ulongTestCase)) + suite.addTest(unittest.makeSuite( longLongTestCase)) + suite.addTest(unittest.makeSuite(ulongLongTestCase)) + suite.addTest(unittest.makeSuite( floatTestCase)) + suite.addTest(unittest.makeSuite( doubleTestCase)) + + # Execute the test suite + print "Testing 3D Functions of Module Tensor" + print "NumPy version", N.__version__ + print + result = unittest.TextTestRunner(verbosity=2).run(suite) + sys.exit(len(result.errors) + len(result.failures)) Property changes on: trunk/numpy/doc/swig/test/testTensor.py ___________________________________________________________________ Name: svn:executable + * Added: trunk/numpy/doc/swig/test/testVector.py =================================================================== --- trunk/numpy/doc/swig/test/testVector.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/test/testVector.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -0,0 +1,384 @@ +#! /usr/bin/env python + +# System imports +from distutils.util import get_platform +import os +import sys +import unittest + +# Import NumPy +import numpy as N +major, minor = [ int(d) for d in N.__version__.split(".")[:2] ] +if major == 0: BadListError = TypeError +else: BadListError = ValueError + +# Add the distutils-generated build directory to the python search path and then +# import the extension module +libDir = "lib.%s-%s" % (get_platform(), sys.version[:3]) +sys.path.insert(0,os.path.join("build", libDir)) +import Vector + +###################################################################### + +class VectorTestCase(unittest.TestCase): + + def __init__(self, methodName="runTest"): + unittest.TestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + + # Test the (type IN_ARRAY1[ANY]) typemap + def testLength(self): + "Test length function" + print >>sys.stderr, self.typeStr, "... ", + length = Vector.__dict__[self.typeStr + "Length"] + self.assertEquals(length([5, 12, 0]), 13) + + # Test the (type IN_ARRAY1[ANY]) typemap + def testLengthBadList(self): + "Test length function with bad list" + print >>sys.stderr, self.typeStr, "... ", + length = Vector.__dict__[self.typeStr + "Length"] + self.assertRaises(BadListError, length, [5, "twelve", 0]) + + # Test the (type IN_ARRAY1[ANY]) typemap + def testLengthWrongSize(self): + "Test length function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + length = Vector.__dict__[self.typeStr + "Length"] + self.assertRaises(TypeError, length, [5, 12]) + + # Test the (type IN_ARRAY1[ANY]) typemap + def testLengthWrongDim(self): + "Test length function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + length = Vector.__dict__[self.typeStr + "Length"] + self.assertRaises(TypeError, length, [[1,2], [3,4]]) + + # Test the (type IN_ARRAY1[ANY]) typemap + def testLengthNonContainer(self): + "Test length function with non-container" + print >>sys.stderr, self.typeStr, "... ", + length = Vector.__dict__[self.typeStr + "Length"] + self.assertRaises(TypeError, length, None) + + # Test the (type* IN_ARRAY1, int DIM1) typemap + def testProd(self): + "Test prod function" + print >>sys.stderr, self.typeStr, "... ", + prod = Vector.__dict__[self.typeStr + "Prod"] + self.assertEquals(prod([1,2,3,4]), 24) + + # Test the (type* IN_ARRAY1, int DIM1) typemap + def testProdBadList(self): + "Test prod function with bad list" + print >>sys.stderr, self.typeStr, "... ", + prod = Vector.__dict__[self.typeStr + "Prod"] + self.assertRaises(BadListError, prod, [[1,"two"], ["e","pi"]]) + + # Test the (type* IN_ARRAY1, int DIM1) typemap + def testProdWrongDim(self): + "Test prod function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + prod = Vector.__dict__[self.typeStr + "Prod"] + self.assertRaises(TypeError, prod, [[1,2], [8,9]]) + + # Test the (type* IN_ARRAY1, int DIM1) typemap + def testProdNonContainer(self): + "Test prod function with non-container" + print >>sys.stderr, self.typeStr, "... ", + prod = Vector.__dict__[self.typeStr + "Prod"] + self.assertRaises(TypeError, prod, None) + + # Test the (int DIM1, type* IN_ARRAY1) typemap + def testSum(self): + "Test sum function" + print >>sys.stderr, self.typeStr, "... ", + sum = Vector.__dict__[self.typeStr + "Sum"] + self.assertEquals(sum([5,6,7,8]), 26) + + # Test the (int DIM1, type* IN_ARRAY1) typemap + def testSumBadList(self): + "Test sum function with bad list" + print >>sys.stderr, self.typeStr, "... ", + sum = Vector.__dict__[self.typeStr + "Sum"] + self.assertRaises(BadListError, sum, [3,4, 5, "pi"]) + + # Test the (int DIM1, type* IN_ARRAY1) typemap + def testSumWrongDim(self): + "Test sum function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + sum = Vector.__dict__[self.typeStr + "Sum"] + self.assertRaises(TypeError, sum, [[3,4], [5,6]]) + + # Test the (int DIM1, type* IN_ARRAY1) typemap + def testSumNonContainer(self): + "Test sum function with non-container" + print >>sys.stderr, self.typeStr, "... ", + sum = Vector.__dict__[self.typeStr + "Sum"] + self.assertRaises(TypeError, sum, True) + + # Test the (type INPLACE_ARRAY1[ANY]) typemap + def testReverse(self): + "Test reverse function" + print >>sys.stderr, self.typeStr, "... ", + reverse = Vector.__dict__[self.typeStr + "Reverse"] + vector = N.array([1,2,4],self.typeCode) + reverse(vector) + self.assertEquals((vector == [4,2,1]).all(), True) + + # Test the (type INPLACE_ARRAY1[ANY]) typemap + def testReverseWrongDim(self): + "Test reverse function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + reverse = Vector.__dict__[self.typeStr + "Reverse"] + vector = N.array([[1,2], [3,4]],self.typeCode) + self.assertRaises(TypeError, reverse, vector) + + # Test the (type INPLACE_ARRAY1[ANY]) typemap + def testReverseWrongSize(self): + "Test reverse function with wrong size" + print >>sys.stderr, self.typeStr, "... ", + reverse = Vector.__dict__[self.typeStr + "Reverse"] + vector = N.array([9,8,7,6,5,4],self.typeCode) + self.assertRaises(TypeError, reverse, vector) + + # Test the (type INPLACE_ARRAY1[ANY]) typemap + def testReverseWrongType(self): + "Test reverse function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + reverse = Vector.__dict__[self.typeStr + "Reverse"] + vector = N.array([1,2,4],'c') + self.assertRaises(TypeError, reverse, vector) + + # Test the (type INPLACE_ARRAY1[ANY]) typemap + def testReverseNonArray(self): + "Test reverse function with non-array" + print >>sys.stderr, self.typeStr, "... ", + reverse = Vector.__dict__[self.typeStr + "Reverse"] + self.assertRaises(TypeError, reverse, [2,4,6]) + + # Test the (type* INPLACE_ARRAY1, int DIM1) typemap + def testOnes(self): + "Test ones function" + print >>sys.stderr, self.typeStr, "... ", + ones = Vector.__dict__[self.typeStr + "Ones"] + vector = N.zeros(5,self.typeCode) + ones(vector) + N.testing.assert_array_equal(vector, N.array([1,1,1,1,1])) + + # Test the (type* INPLACE_ARRAY1, int DIM1) typemap + def testOnesWrongDim(self): + "Test ones function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + ones = Vector.__dict__[self.typeStr + "Ones"] + vector = N.zeros((5,5),self.typeCode) + self.assertRaises(TypeError, ones, vector) + + # Test the (type* INPLACE_ARRAY1, int DIM1) typemap + def testOnesWrongType(self): + "Test ones function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + ones = Vector.__dict__[self.typeStr + "Ones"] + vector = N.zeros((5,5),'c') + self.assertRaises(TypeError, ones, vector) + + # Test the (type* INPLACE_ARRAY1, int DIM1) typemap + def testOnesNonArray(self): + "Test ones function with non-array" + print >>sys.stderr, self.typeStr, "... ", + ones = Vector.__dict__[self.typeStr + "Ones"] + self.assertRaises(TypeError, ones, [2,4,6,8]) + + # Test the (int DIM1, type* INPLACE_ARRAY1) typemap + def testZeros(self): + "Test zeros function" + print >>sys.stderr, self.typeStr, "... ", + zeros = Vector.__dict__[self.typeStr + "Zeros"] + vector = N.ones(5,self.typeCode) + zeros(vector) + N.testing.assert_array_equal(vector, N.array([0,0,0,0,0])) + + # Test the (int DIM1, type* INPLACE_ARRAY1) typemap + def testZerosWrongDim(self): + "Test zeros function with wrong dimensions" + print >>sys.stderr, self.typeStr, "... ", + zeros = Vector.__dict__[self.typeStr + "Zeros"] + vector = N.ones((5,5),self.typeCode) + self.assertRaises(TypeError, zeros, vector) + + # Test the (int DIM1, type* INPLACE_ARRAY1) typemap + def testZerosWrongType(self): + "Test zeros function with wrong type" + print >>sys.stderr, self.typeStr, "... ", + zeros = Vector.__dict__[self.typeStr + "Zeros"] + vector = N.ones(6,'c') + self.assertRaises(TypeError, zeros, vector) + + # Test the (int DIM1, type* INPLACE_ARRAY1) typemap + def testZerosNonArray(self): + "Test zeros function with non-array" + print >>sys.stderr, self.typeStr, "... ", + zeros = Vector.__dict__[self.typeStr + "Zeros"] + self.assertRaises(TypeError, zeros, [1,3,5,7,9]) + + # Test the (type ARGOUT_ARRAY1[ANY]) typemap + def testEOSplit(self): + "Test eoSplit function" + print >>sys.stderr, self.typeStr, "... ", + eoSplit = Vector.__dict__[self.typeStr + "EOSplit"] + even, odd = eoSplit([1,2,3]) + self.assertEquals((even == [1,0,3]).all(), True) + self.assertEquals((odd == [0,2,0]).all(), True) + + # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap + def testTwos(self): + "Test twos function" + print >>sys.stderr, self.typeStr, "... ", + twos = Vector.__dict__[self.typeStr + "Twos"] + vector = twos(5) + self.assertEquals((vector == [2,2,2,2,2]).all(), True) + + # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap + def testTwosNonInt(self): + "Test twos function with non-integer dimension" + print >>sys.stderr, self.typeStr, "... ", + twos = Vector.__dict__[self.typeStr + "Twos"] + self.assertRaises(TypeError, twos, 5.0) + + # Test the (int DIM1, type* ARGOUT_ARRAY1) typemap + def testThrees(self): + "Test threes function" + print >>sys.stderr, self.typeStr, "... ", + threes = Vector.__dict__[self.typeStr + "Threes"] + vector = threes(6) + self.assertEquals((vector == [3,3,3,3,3,3]).all(), True) + + # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap + def testThreesNonInt(self): + "Test threes function with non-integer dimension" + print >>sys.stderr, self.typeStr, "... ", + threes = Vector.__dict__[self.typeStr + "Threes"] + self.assertRaises(TypeError, threes, "threes") + +###################################################################### + +class scharTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "schar" + self.typeCode = "b" + +###################################################################### + +class ucharTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "uchar" + self.typeCode = "B" + +###################################################################### + +class shortTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "short" + self.typeCode = "h" + +###################################################################### + +class ushortTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "ushort" + self.typeCode = "H" + +###################################################################### + +class intTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "int" + self.typeCode = "i" + +###################################################################### + +class uintTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "uint" + self.typeCode = "I" + +###################################################################### + +class longTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "long" + self.typeCode = "l" + +###################################################################### + +class ulongTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "ulong" + self.typeCode = "L" + +###################################################################### + +class longLongTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "longLong" + self.typeCode = "q" + +###################################################################### + +class ulongLongTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "ulongLong" + self.typeCode = "Q" + +###################################################################### + +class floatTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "float" + self.typeCode = "f" + +###################################################################### + +class doubleTestCase(VectorTestCase): + def __init__(self, methodName="runTest"): + VectorTestCase.__init__(self, methodName) + self.typeStr = "double" + self.typeCode = "d" + +###################################################################### + +if __name__ == "__main__": + + # Build the test suite + suite = unittest.TestSuite() + suite.addTest(unittest.makeSuite( scharTestCase)) + suite.addTest(unittest.makeSuite( ucharTestCase)) + suite.addTest(unittest.makeSuite( shortTestCase)) + suite.addTest(unittest.makeSuite( ushortTestCase)) + suite.addTest(unittest.makeSuite( intTestCase)) + suite.addTest(unittest.makeSuite( uintTestCase)) + suite.addTest(unittest.makeSuite( longTestCase)) + suite.addTest(unittest.makeSuite( ulongTestCase)) + suite.addTest(unittest.makeSuite( longLongTestCase)) + suite.addTest(unittest.makeSuite(ulongLongTestCase)) + suite.addTest(unittest.makeSuite( floatTestCase)) + suite.addTest(unittest.makeSuite( doubleTestCase)) + + # Execute the test suite + print "Testing 1D Functions of Module Vector" + print "NumPy version", N.__version__ + print + result = unittest.TextTestRunner(verbosity=2).run(suite) + sys.exit(len(result.errors) + len(result.failures)) Property changes on: trunk/numpy/doc/swig/test/testVector.py ___________________________________________________________________ Name: svn:executable + * Deleted: trunk/numpy/doc/swig/testMatrix.py =================================================================== --- trunk/numpy/doc/swig/testMatrix.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testMatrix.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,365 +0,0 @@ -#! /usr/bin/env python - -# System imports -from distutils.util import get_platform -import os -import sys -import unittest - -# Import NumPy -import numpy as N -major, minor = [ int(d) for d in N.__version__.split(".")[:2] ] -if major == 0: BadListError = TypeError -else: BadListError = ValueError - -# Add the distutils-generated build directory to the python search path and then -# import the extension module -libDir = "lib.%s-%s" % (get_platform(), sys.version[:3]) -sys.path.insert(0,os.path.join("build", libDir)) -import Matrix - -###################################################################### - -class MatrixTestCase(unittest.TestCase): - - def __init__(self, methodName="runTests"): - unittest.TestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - - # Test (type IN_ARRAY2[ANY][ANY]) typemap - def testDet(self): - "Test det function" - print >>sys.stderr, self.typeStr, "... ", - det = Matrix.__dict__[self.typeStr + "Det"] - matrix = [[8,7],[6,9]] - self.assertEquals(det(matrix), 30) - - # Test (type IN_ARRAY2[ANY][ANY]) typemap - def testDetBadList(self): - "Test det function with bad list" - print >>sys.stderr, self.typeStr, "... ", - det = Matrix.__dict__[self.typeStr + "Det"] - matrix = [[8,7], ["e", "pi"]] - self.assertRaises(BadListError, det, matrix) - - # Test (type IN_ARRAY2[ANY][ANY]) typemap - def testDetWrongDim(self): - "Test det function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - det = Matrix.__dict__[self.typeStr + "Det"] - matrix = [8,7] - self.assertRaises(TypeError, det, matrix) - - # Test (type IN_ARRAY2[ANY][ANY]) typemap - def testDetWrongSize(self): - "Test det function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - det = Matrix.__dict__[self.typeStr + "Det"] - matrix = [[8,7,6], [5,4,3], [2,1,0]] - self.assertRaises(TypeError, det, matrix) - - # Test (type IN_ARRAY2[ANY][ANY]) typemap - def testDetNonContainer(self): - "Test det function with non-container" - print >>sys.stderr, self.typeStr, "... ", - det = Matrix.__dict__[self.typeStr + "Det"] - self.assertRaises(TypeError, det, None) - - # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap - def testMax(self): - "Test max function" - print >>sys.stderr, self.typeStr, "... ", - max = Matrix.__dict__[self.typeStr + "Max"] - matrix = [[6,5,4],[3,2,1]] - self.assertEquals(max(matrix), 6) - - # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap - def testMaxBadList(self): - "Test max function with bad list" - print >>sys.stderr, self.typeStr, "... ", - max = Matrix.__dict__[self.typeStr + "Max"] - matrix = [[6,"five",4], ["three", 2, "one"]] - self.assertRaises(BadListError, max, matrix) - - # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap - def testMaxNonContainer(self): - "Test max function with non-container" - print >>sys.stderr, self.typeStr, "... ", - max = Matrix.__dict__[self.typeStr + "Max"] - self.assertRaises(TypeError, max, None) - - # Test (type* IN_ARRAY2, int DIM1, int DIM2) typemap - def testMaxWrongDim(self): - "Test max function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - max = Matrix.__dict__[self.typeStr + "Max"] - self.assertRaises(TypeError, max, [0, 1, 2, 3]) - - # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap - def testMin(self): - "Test min function" - print >>sys.stderr, self.typeStr, "... ", - min = Matrix.__dict__[self.typeStr + "Min"] - matrix = [[9,8],[7,6],[5,4]] - self.assertEquals(min(matrix), 4) - - # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap - def testMinBadList(self): - "Test min function with bad list" - print >>sys.stderr, self.typeStr, "... ", - min = Matrix.__dict__[self.typeStr + "Min"] - matrix = [["nine","eight"], ["seven","six"]] - self.assertRaises(BadListError, min, matrix) - - # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap - def testMinWrongDim(self): - "Test min function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - min = Matrix.__dict__[self.typeStr + "Min"] - self.assertRaises(TypeError, min, [1,3,5,7,9]) - - # Test (int DIM1, int DIM2, type* IN_ARRAY2) typemap - def testMinNonContainer(self): - "Test min function with non-container" - print >>sys.stderr, self.typeStr, "... ", - min = Matrix.__dict__[self.typeStr + "Min"] - self.assertRaises(TypeError, min, False) - - # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap - def testScale(self): - "Test scale function" - print >>sys.stderr, self.typeStr, "... ", - scale = Matrix.__dict__[self.typeStr + "Scale"] - matrix = N.array([[1,2,3],[2,1,2],[3,2,1]],self.typeCode) - scale(matrix,4) - self.assertEquals((matrix == [[4,8,12],[8,4,8],[12,8,4]]).all(), True) - - # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap - def testScaleWrongDim(self): - "Test scale function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - scale = Matrix.__dict__[self.typeStr + "Scale"] - matrix = N.array([1,2,2,1],self.typeCode) - self.assertRaises(TypeError, scale, matrix) - - # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap - def testScaleWrongSize(self): - "Test scale function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - scale = Matrix.__dict__[self.typeStr + "Scale"] - matrix = N.array([[1,2],[2,1]],self.typeCode) - self.assertRaises(TypeError, scale, matrix) - - # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap - def testScaleWrongType(self): - "Test scale function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - scale = Matrix.__dict__[self.typeStr + "Scale"] - matrix = N.array([[1,2,3],[2,1,2],[3,2,1]],'c') - self.assertRaises(TypeError, scale, matrix) - - # Test (type INPLACE_ARRAY2[ANY][ANY]) typemap - def testScaleNonArray(self): - "Test scale function with non-array" - print >>sys.stderr, self.typeStr, "... ", - scale = Matrix.__dict__[self.typeStr + "Scale"] - matrix = [[1,2,3],[2,1,2],[3,2,1]] - self.assertRaises(TypeError, scale, matrix) - - # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap - def testFloor(self): - "Test floor function" - print >>sys.stderr, self.typeStr, "... ", - floor = Matrix.__dict__[self.typeStr + "Floor"] - matrix = N.array([[6,7],[8,9]],self.typeCode) - floor(matrix,7) - N.testing.assert_array_equal(matrix, N.array([[7,7],[8,9]])) - - # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap - def testFloorWrongDim(self): - "Test floor function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - floor = Matrix.__dict__[self.typeStr + "Floor"] - matrix = N.array([6,7,8,9],self.typeCode) - self.assertRaises(TypeError, floor, matrix) - - # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap - def testFloorWrongType(self): - "Test floor function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - floor = Matrix.__dict__[self.typeStr + "Floor"] - matrix = N.array([[6,7], [8,9]],'c') - self.assertRaises(TypeError, floor, matrix) - - # Test (type* INPLACE_ARRAY2, int DIM1, int DIM2) typemap - def testFloorNonArray(self): - "Test floor function with non-array" - print >>sys.stderr, self.typeStr, "... ", - floor = Matrix.__dict__[self.typeStr + "Floor"] - matrix = [[6,7], [8,9]] - self.assertRaises(TypeError, floor, matrix) - - # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap - def testCeil(self): - "Test ceil function" - print >>sys.stderr, self.typeStr, "... ", - ceil = Matrix.__dict__[self.typeStr + "Ceil"] - matrix = N.array([[1,2],[3,4]],self.typeCode) - ceil(matrix,3) - N.testing.assert_array_equal(matrix, N.array([[1,2],[3,3]])) - - # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap - def testCeilWrongDim(self): - "Test ceil function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - ceil = Matrix.__dict__[self.typeStr + "Ceil"] - matrix = N.array([1,2,3,4],self.typeCode) - self.assertRaises(TypeError, ceil, matrix) - - # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap - def testCeilWrongType(self): - "Test ceil function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - ceil = Matrix.__dict__[self.typeStr + "Ceil"] - matrix = N.array([[1,2], [3,4]],'c') - self.assertRaises(TypeError, ceil, matrix) - - # Test (int DIM1, int DIM2, type* INPLACE_ARRAY2) typemap - def testCeilNonArray(self): - "Test ceil function with non-array" - print >>sys.stderr, self.typeStr, "... ", - ceil = Matrix.__dict__[self.typeStr + "Ceil"] - matrix = [[1,2], [3,4]] - self.assertRaises(TypeError, ceil, matrix) - - # Test (type ARGOUT_ARRAY2[ANY][ANY]) typemap - def testLUSplit(self): - "Test luSplit function" - print >>sys.stderr, self.typeStr, "... ", - luSplit = Matrix.__dict__[self.typeStr + "LUSplit"] - lower, upper = luSplit([[1,2,3],[4,5,6],[7,8,9]]) - self.assertEquals((lower == [[1,0,0],[4,5,0],[7,8,9]]).all(), True) - self.assertEquals((upper == [[0,2,3],[0,0,6],[0,0,0]]).all(), True) - -###################################################################### - -class scharTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "schar" - self.typeCode = "b" - -###################################################################### - -class ucharTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "uchar" - self.typeCode = "B" - -###################################################################### - -class shortTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "short" - self.typeCode = "h" - -###################################################################### - -class ushortTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "ushort" - self.typeCode = "H" - -###################################################################### - -class intTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "int" - self.typeCode = "i" - -###################################################################### - -class uintTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "uint" - self.typeCode = "I" - -###################################################################### - -class longTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "long" - self.typeCode = "l" - -###################################################################### - -class ulongTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "ulong" - self.typeCode = "L" - -###################################################################### - -class longLongTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "longLong" - self.typeCode = "q" - -###################################################################### - -class ulongLongTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "ulongLong" - self.typeCode = "Q" - -###################################################################### - -class floatTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "float" - self.typeCode = "f" - -###################################################################### - -class doubleTestCase(MatrixTestCase): - def __init__(self, methodName="runTest"): - MatrixTestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - -###################################################################### - -if __name__ == "__main__": - - # Build the test suite - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite( scharTestCase)) - suite.addTest(unittest.makeSuite( ucharTestCase)) - suite.addTest(unittest.makeSuite( shortTestCase)) - suite.addTest(unittest.makeSuite( ushortTestCase)) - suite.addTest(unittest.makeSuite( intTestCase)) - suite.addTest(unittest.makeSuite( uintTestCase)) - suite.addTest(unittest.makeSuite( longTestCase)) - suite.addTest(unittest.makeSuite( ulongTestCase)) - suite.addTest(unittest.makeSuite( longLongTestCase)) - suite.addTest(unittest.makeSuite(ulongLongTestCase)) - suite.addTest(unittest.makeSuite( floatTestCase)) - suite.addTest(unittest.makeSuite( doubleTestCase)) - - # Execute the test suite - print "Testing 2D Functions of Module Matrix" - print "NumPy version", N.__version__ - print - result = unittest.TextTestRunner(verbosity=2).run(suite) - sys.exit(len(result.errors) + len(result.failures)) Deleted: trunk/numpy/doc/swig/testTensor.py =================================================================== --- trunk/numpy/doc/swig/testTensor.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testTensor.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,405 +0,0 @@ -#! /usr/bin/env python - -# System imports -from distutils.util import get_platform -from math import sqrt -import os -import sys -import unittest - -# Import NumPy -import numpy as N -major, minor = [ int(d) for d in N.__version__.split(".")[:2] ] -if major == 0: BadListError = TypeError -else: BadListError = ValueError - -# Add the distutils-generated build directory to the python search path and then -# import the extension module -libDir = "lib.%s-%s" % (get_platform(), sys.version[:3]) -sys.path.insert(0,os.path.join("build", libDir)) -import Tensor - -###################################################################### - -class TensorTestCase(unittest.TestCase): - - def __init__(self, methodName="runTests"): - unittest.TestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - self.result = sqrt(28.0/8) - - # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap - def testNorm(self): - "Test norm function" - print >>sys.stderr, self.typeStr, "... ", - norm = Tensor.__dict__[self.typeStr + "Norm"] - tensor = [[[0,1], [2,3]], - [[3,2], [1,0]]] - if isinstance(self.result, int): - self.assertEquals(norm(tensor), self.result) - else: - self.assertAlmostEqual(norm(tensor), self.result, 6) - - # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap - def testNormBadList(self): - "Test norm function with bad list" - print >>sys.stderr, self.typeStr, "... ", - norm = Tensor.__dict__[self.typeStr + "Norm"] - tensor = [[[0,"one"],[2,3]], - [[3,"two"],[1,0]]] - self.assertRaises(BadListError, norm, tensor) - - # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap - def testNormWrongDim(self): - "Test norm function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - norm = Tensor.__dict__[self.typeStr + "Norm"] - tensor = [[0,1,2,3], - [3,2,1,0]] - self.assertRaises(TypeError, norm, tensor) - - # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap - def testNormWrongSize(self): - "Test norm function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - norm = Tensor.__dict__[self.typeStr + "Norm"] - tensor = [[[0,1,0], [2,3,2]], - [[3,2,3], [1,0,1]]] - self.assertRaises(TypeError, norm, tensor) - - # Test (type IN_ARRAY3[ANY][ANY][ANY]) typemap - def testNormNonContainer(self): - "Test norm function with non-container" - print >>sys.stderr, self.typeStr, "... ", - norm = Tensor.__dict__[self.typeStr + "Norm"] - self.assertRaises(TypeError, norm, None) - - # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testMax(self): - "Test max function" - print >>sys.stderr, self.typeStr, "... ", - max = Tensor.__dict__[self.typeStr + "Max"] - tensor = [[[1,2], [3,4]], - [[5,6], [7,8]]] - self.assertEquals(max(tensor), 8) - - # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testMaxBadList(self): - "Test max function with bad list" - print >>sys.stderr, self.typeStr, "... ", - max = Tensor.__dict__[self.typeStr + "Max"] - tensor = [[[1,"two"], [3,4]], - [[5,"six"], [7,8]]] - self.assertRaises(BadListError, max, tensor) - - # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testMaxNonContainer(self): - "Test max function with non-container" - print >>sys.stderr, self.typeStr, "... ", - max = Tensor.__dict__[self.typeStr + "Max"] - self.assertRaises(TypeError, max, None) - - # Test (type* IN_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testMaxWrongDim(self): - "Test max function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - max = Tensor.__dict__[self.typeStr + "Max"] - self.assertRaises(TypeError, max, [0, -1, 2, -3]) - - # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap - def testMin(self): - "Test min function" - print >>sys.stderr, self.typeStr, "... ", - min = Tensor.__dict__[self.typeStr + "Min"] - tensor = [[[9,8], [7,6]], - [[5,4], [3,2]]] - self.assertEquals(min(tensor), 2) - - # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap - def testMinBadList(self): - "Test min function with bad list" - print >>sys.stderr, self.typeStr, "... ", - min = Tensor.__dict__[self.typeStr + "Min"] - tensor = [[["nine",8], [7,6]], - [["five",4], [3,2]]] - self.assertRaises(BadListError, min, tensor) - - # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap - def testMinNonContainer(self): - "Test min function with non-container" - print >>sys.stderr, self.typeStr, "... ", - min = Tensor.__dict__[self.typeStr + "Min"] - self.assertRaises(TypeError, min, True) - - # Test (int DIM1, int DIM2, int DIM3, type* IN_ARRAY3) typemap - def testMinWrongDim(self): - "Test min function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - min = Tensor.__dict__[self.typeStr + "Min"] - self.assertRaises(TypeError, min, [[1,3],[5,7]]) - - # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap - def testScale(self): - "Test scale function" - print >>sys.stderr, self.typeStr, "... ", - scale = Tensor.__dict__[self.typeStr + "Scale"] - tensor = N.array([[[1,0,1], [0,1,0], [1,0,1]], - [[0,1,0], [1,0,1], [0,1,0]], - [[1,0,1], [0,1,0], [1,0,1]]],self.typeCode) - scale(tensor,4) - self.assertEquals((tensor == [[[4,0,4], [0,4,0], [4,0,4]], - [[0,4,0], [4,0,4], [0,4,0]], - [[4,0,4], [0,4,0], [4,0,4]]]).all(), True) - - # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap - def testScaleWrongType(self): - "Test scale function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - scale = Tensor.__dict__[self.typeStr + "Scale"] - tensor = N.array([[[1,0,1], [0,1,0], [1,0,1]], - [[0,1,0], [1,0,1], [0,1,0]], - [[1,0,1], [0,1,0], [1,0,1]]],'c') - self.assertRaises(TypeError, scale, tensor) - - # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap - def testScaleWrongDim(self): - "Test scale function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - scale = Tensor.__dict__[self.typeStr + "Scale"] - tensor = N.array([[1,0,1], [0,1,0], [1,0,1], - [0,1,0], [1,0,1], [0,1,0]],self.typeCode) - self.assertRaises(TypeError, scale, tensor) - - # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap - def testScaleWrongSize(self): - "Test scale function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - scale = Tensor.__dict__[self.typeStr + "Scale"] - tensor = N.array([[[1,0], [0,1], [1,0]], - [[0,1], [1,0], [0,1]], - [[1,0], [0,1], [1,0]]],self.typeCode) - self.assertRaises(TypeError, scale, tensor) - - # Test (type INPLACE_ARRAY3[ANY][ANY][ANY]) typemap - def testScaleNonArray(self): - "Test scale function with non-array" - print >>sys.stderr, self.typeStr, "... ", - scale = Tensor.__dict__[self.typeStr + "Scale"] - self.assertRaises(TypeError, scale, True) - - # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testFloor(self): - "Test floor function" - print >>sys.stderr, self.typeStr, "... ", - floor = Tensor.__dict__[self.typeStr + "Floor"] - tensor = N.array([[[1,2], [3,4]], - [[5,6], [7,8]]],self.typeCode) - floor(tensor,4) - N.testing.assert_array_equal(tensor, N.array([[[4,4], [4,4]], - [[5,6], [7,8]]])) - - # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testFloorWrongType(self): - "Test floor function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - floor = Tensor.__dict__[self.typeStr + "Floor"] - tensor = N.array([[[1,2], [3,4]], - [[5,6], [7,8]]],'c') - self.assertRaises(TypeError, floor, tensor) - - # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testFloorWrongDim(self): - "Test floor function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - floor = Tensor.__dict__[self.typeStr + "Floor"] - tensor = N.array([[1,2], [3,4], [5,6], [7,8]],self.typeCode) - self.assertRaises(TypeError, floor, tensor) - - # Test (type* INPLACE_ARRAY3, int DIM1, int DIM2, int DIM3) typemap - def testFloorNonArray(self): - "Test floor function with non-array" - print >>sys.stderr, self.typeStr, "... ", - floor = Tensor.__dict__[self.typeStr + "Floor"] - self.assertRaises(TypeError, floor, object) - - # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap - def testCeil(self): - "Test ceil function" - print >>sys.stderr, self.typeStr, "... ", - ceil = Tensor.__dict__[self.typeStr + "Ceil"] - tensor = N.array([[[9,8], [7,6]], - [[5,4], [3,2]]],self.typeCode) - ceil(tensor,5) - N.testing.assert_array_equal(tensor, N.array([[[5,5], [5,5]], - [[5,4], [3,2]]])) - - # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap - def testCeilWrongType(self): - "Test ceil function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - ceil = Tensor.__dict__[self.typeStr + "Ceil"] - tensor = N.array([[[9,8], [7,6]], - [[5,4], [3,2]]],'c') - self.assertRaises(TypeError, ceil, tensor) - - # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap - def testCeilWrongDim(self): - "Test ceil function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - ceil = Tensor.__dict__[self.typeStr + "Ceil"] - tensor = N.array([[9,8], [7,6], [5,4], [3,2]], self.typeCode) - self.assertRaises(TypeError, ceil, tensor) - - # Test (int DIM1, int DIM2, int DIM3, type* INPLACE_ARRAY3) typemap - def testCeilNonArray(self): - "Test ceil function with non-array" - print >>sys.stderr, self.typeStr, "... ", - ceil = Tensor.__dict__[self.typeStr + "Ceil"] - tensor = [[[9,8], [7,6]], - [[5,4], [3,2]]] - self.assertRaises(TypeError, ceil, tensor) - - # Test (type ARGOUT_ARRAY3[ANY][ANY][ANY]) typemap - def testLUSplit(self): - "Test luSplit function" - print >>sys.stderr, self.typeStr, "... ", - luSplit = Tensor.__dict__[self.typeStr + "LUSplit"] - lower, upper = luSplit([[[1,1], [1,1]], - [[1,1], [1,1]]]) - self.assertEquals((lower == [[[1,1], [1,0]], - [[1,0], [0,0]]]).all(), True) - self.assertEquals((upper == [[[0,0], [0,1]], - [[0,1], [1,1]]]).all(), True) - -###################################################################### - -class scharTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "schar" - self.typeCode = "b" - self.result = int(self.result) - -###################################################################### - -class ucharTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "uchar" - self.typeCode = "B" - self.result = int(self.result) - -###################################################################### - -class shortTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "short" - self.typeCode = "h" - self.result = int(self.result) - -###################################################################### - -class ushortTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "ushort" - self.typeCode = "H" - self.result = int(self.result) - -###################################################################### - -class intTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "int" - self.typeCode = "i" - self.result = int(self.result) - -###################################################################### - -class uintTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "uint" - self.typeCode = "I" - self.result = int(self.result) - -###################################################################### - -class longTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "long" - self.typeCode = "l" - self.result = int(self.result) - -###################################################################### - -class ulongTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "ulong" - self.typeCode = "L" - self.result = int(self.result) - -###################################################################### - -class longLongTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "longLong" - self.typeCode = "q" - self.result = int(self.result) - -###################################################################### - -class ulongLongTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "ulongLong" - self.typeCode = "Q" - self.result = int(self.result) - -###################################################################### - -class floatTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "float" - self.typeCode = "f" - -###################################################################### - -class doubleTestCase(TensorTestCase): - def __init__(self, methodName="runTest"): - TensorTestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - -###################################################################### - -if __name__ == "__main__": - - # Build the test suite - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite( scharTestCase)) - suite.addTest(unittest.makeSuite( ucharTestCase)) - suite.addTest(unittest.makeSuite( shortTestCase)) - suite.addTest(unittest.makeSuite( ushortTestCase)) - suite.addTest(unittest.makeSuite( intTestCase)) - suite.addTest(unittest.makeSuite( uintTestCase)) - suite.addTest(unittest.makeSuite( longTestCase)) - suite.addTest(unittest.makeSuite( ulongTestCase)) - suite.addTest(unittest.makeSuite( longLongTestCase)) - suite.addTest(unittest.makeSuite(ulongLongTestCase)) - suite.addTest(unittest.makeSuite( floatTestCase)) - suite.addTest(unittest.makeSuite( doubleTestCase)) - - # Execute the test suite - print "Testing 3D Functions of Module Tensor" - print "NumPy version", N.__version__ - print - result = unittest.TextTestRunner(verbosity=2).run(suite) - sys.exit(len(result.errors) + len(result.failures)) Deleted: trunk/numpy/doc/swig/testVector.py =================================================================== --- trunk/numpy/doc/swig/testVector.py 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testVector.py 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,384 +0,0 @@ -#! /usr/bin/env python - -# System imports -from distutils.util import get_platform -import os -import sys -import unittest - -# Import NumPy -import numpy as N -major, minor = [ int(d) for d in N.__version__.split(".")[:2] ] -if major == 0: BadListError = TypeError -else: BadListError = ValueError - -# Add the distutils-generated build directory to the python search path and then -# import the extension module -libDir = "lib.%s-%s" % (get_platform(), sys.version[:3]) -sys.path.insert(0,os.path.join("build", libDir)) -import Vector - -###################################################################### - -class VectorTestCase(unittest.TestCase): - - def __init__(self, methodName="runTest"): - unittest.TestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - - # Test the (type IN_ARRAY1[ANY]) typemap - def testLength(self): - "Test length function" - print >>sys.stderr, self.typeStr, "... ", - length = Vector.__dict__[self.typeStr + "Length"] - self.assertEquals(length([5, 12, 0]), 13) - - # Test the (type IN_ARRAY1[ANY]) typemap - def testLengthBadList(self): - "Test length function with bad list" - print >>sys.stderr, self.typeStr, "... ", - length = Vector.__dict__[self.typeStr + "Length"] - self.assertRaises(BadListError, length, [5, "twelve", 0]) - - # Test the (type IN_ARRAY1[ANY]) typemap - def testLengthWrongSize(self): - "Test length function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - length = Vector.__dict__[self.typeStr + "Length"] - self.assertRaises(TypeError, length, [5, 12]) - - # Test the (type IN_ARRAY1[ANY]) typemap - def testLengthWrongDim(self): - "Test length function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - length = Vector.__dict__[self.typeStr + "Length"] - self.assertRaises(TypeError, length, [[1,2], [3,4]]) - - # Test the (type IN_ARRAY1[ANY]) typemap - def testLengthNonContainer(self): - "Test length function with non-container" - print >>sys.stderr, self.typeStr, "... ", - length = Vector.__dict__[self.typeStr + "Length"] - self.assertRaises(TypeError, length, None) - - # Test the (type* IN_ARRAY1, int DIM1) typemap - def testProd(self): - "Test prod function" - print >>sys.stderr, self.typeStr, "... ", - prod = Vector.__dict__[self.typeStr + "Prod"] - self.assertEquals(prod([1,2,3,4]), 24) - - # Test the (type* IN_ARRAY1, int DIM1) typemap - def testProdBadList(self): - "Test prod function with bad list" - print >>sys.stderr, self.typeStr, "... ", - prod = Vector.__dict__[self.typeStr + "Prod"] - self.assertRaises(BadListError, prod, [[1,"two"], ["e","pi"]]) - - # Test the (type* IN_ARRAY1, int DIM1) typemap - def testProdWrongDim(self): - "Test prod function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - prod = Vector.__dict__[self.typeStr + "Prod"] - self.assertRaises(TypeError, prod, [[1,2], [8,9]]) - - # Test the (type* IN_ARRAY1, int DIM1) typemap - def testProdNonContainer(self): - "Test prod function with non-container" - print >>sys.stderr, self.typeStr, "... ", - prod = Vector.__dict__[self.typeStr + "Prod"] - self.assertRaises(TypeError, prod, None) - - # Test the (int DIM1, type* IN_ARRAY1) typemap - def testSum(self): - "Test sum function" - print >>sys.stderr, self.typeStr, "... ", - sum = Vector.__dict__[self.typeStr + "Sum"] - self.assertEquals(sum([5,6,7,8]), 26) - - # Test the (int DIM1, type* IN_ARRAY1) typemap - def testSumBadList(self): - "Test sum function with bad list" - print >>sys.stderr, self.typeStr, "... ", - sum = Vector.__dict__[self.typeStr + "Sum"] - self.assertRaises(BadListError, sum, [3,4, 5, "pi"]) - - # Test the (int DIM1, type* IN_ARRAY1) typemap - def testSumWrongDim(self): - "Test sum function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - sum = Vector.__dict__[self.typeStr + "Sum"] - self.assertRaises(TypeError, sum, [[3,4], [5,6]]) - - # Test the (int DIM1, type* IN_ARRAY1) typemap - def testSumNonContainer(self): - "Test sum function with non-container" - print >>sys.stderr, self.typeStr, "... ", - sum = Vector.__dict__[self.typeStr + "Sum"] - self.assertRaises(TypeError, sum, True) - - # Test the (type INPLACE_ARRAY1[ANY]) typemap - def testReverse(self): - "Test reverse function" - print >>sys.stderr, self.typeStr, "... ", - reverse = Vector.__dict__[self.typeStr + "Reverse"] - vector = N.array([1,2,4],self.typeCode) - reverse(vector) - self.assertEquals((vector == [4,2,1]).all(), True) - - # Test the (type INPLACE_ARRAY1[ANY]) typemap - def testReverseWrongDim(self): - "Test reverse function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - reverse = Vector.__dict__[self.typeStr + "Reverse"] - vector = N.array([[1,2], [3,4]],self.typeCode) - self.assertRaises(TypeError, reverse, vector) - - # Test the (type INPLACE_ARRAY1[ANY]) typemap - def testReverseWrongSize(self): - "Test reverse function with wrong size" - print >>sys.stderr, self.typeStr, "... ", - reverse = Vector.__dict__[self.typeStr + "Reverse"] - vector = N.array([9,8,7,6,5,4],self.typeCode) - self.assertRaises(TypeError, reverse, vector) - - # Test the (type INPLACE_ARRAY1[ANY]) typemap - def testReverseWrongType(self): - "Test reverse function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - reverse = Vector.__dict__[self.typeStr + "Reverse"] - vector = N.array([1,2,4],'c') - self.assertRaises(TypeError, reverse, vector) - - # Test the (type INPLACE_ARRAY1[ANY]) typemap - def testReverseNonArray(self): - "Test reverse function with non-array" - print >>sys.stderr, self.typeStr, "... ", - reverse = Vector.__dict__[self.typeStr + "Reverse"] - self.assertRaises(TypeError, reverse, [2,4,6]) - - # Test the (type* INPLACE_ARRAY1, int DIM1) typemap - def testOnes(self): - "Test ones function" - print >>sys.stderr, self.typeStr, "... ", - ones = Vector.__dict__[self.typeStr + "Ones"] - vector = N.zeros(5,self.typeCode) - ones(vector) - N.testing.assert_array_equal(vector, N.array([1,1,1,1,1])) - - # Test the (type* INPLACE_ARRAY1, int DIM1) typemap - def testOnesWrongDim(self): - "Test ones function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - ones = Vector.__dict__[self.typeStr + "Ones"] - vector = N.zeros((5,5),self.typeCode) - self.assertRaises(TypeError, ones, vector) - - # Test the (type* INPLACE_ARRAY1, int DIM1) typemap - def testOnesWrongType(self): - "Test ones function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - ones = Vector.__dict__[self.typeStr + "Ones"] - vector = N.zeros((5,5),'c') - self.assertRaises(TypeError, ones, vector) - - # Test the (type* INPLACE_ARRAY1, int DIM1) typemap - def testOnesNonArray(self): - "Test ones function with non-array" - print >>sys.stderr, self.typeStr, "... ", - ones = Vector.__dict__[self.typeStr + "Ones"] - self.assertRaises(TypeError, ones, [2,4,6,8]) - - # Test the (int DIM1, type* INPLACE_ARRAY1) typemap - def testZeros(self): - "Test zeros function" - print >>sys.stderr, self.typeStr, "... ", - zeros = Vector.__dict__[self.typeStr + "Zeros"] - vector = N.ones(5,self.typeCode) - zeros(vector) - N.testing.assert_array_equal(vector, N.array([0,0,0,0,0])) - - # Test the (int DIM1, type* INPLACE_ARRAY1) typemap - def testZerosWrongDim(self): - "Test zeros function with wrong dimensions" - print >>sys.stderr, self.typeStr, "... ", - zeros = Vector.__dict__[self.typeStr + "Zeros"] - vector = N.ones((5,5),self.typeCode) - self.assertRaises(TypeError, zeros, vector) - - # Test the (int DIM1, type* INPLACE_ARRAY1) typemap - def testZerosWrongType(self): - "Test zeros function with wrong type" - print >>sys.stderr, self.typeStr, "... ", - zeros = Vector.__dict__[self.typeStr + "Zeros"] - vector = N.ones(6,'c') - self.assertRaises(TypeError, zeros, vector) - - # Test the (int DIM1, type* INPLACE_ARRAY1) typemap - def testZerosNonArray(self): - "Test zeros function with non-array" - print >>sys.stderr, self.typeStr, "... ", - zeros = Vector.__dict__[self.typeStr + "Zeros"] - self.assertRaises(TypeError, zeros, [1,3,5,7,9]) - - # Test the (type ARGOUT_ARRAY1[ANY]) typemap - def testEOSplit(self): - "Test eoSplit function" - print >>sys.stderr, self.typeStr, "... ", - eoSplit = Vector.__dict__[self.typeStr + "EOSplit"] - even, odd = eoSplit([1,2,3]) - self.assertEquals((even == [1,0,3]).all(), True) - self.assertEquals((odd == [0,2,0]).all(), True) - - # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap - def testTwos(self): - "Test twos function" - print >>sys.stderr, self.typeStr, "... ", - twos = Vector.__dict__[self.typeStr + "Twos"] - vector = twos(5) - self.assertEquals((vector == [2,2,2,2,2]).all(), True) - - # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap - def testTwosNonInt(self): - "Test twos function with non-integer dimension" - print >>sys.stderr, self.typeStr, "... ", - twos = Vector.__dict__[self.typeStr + "Twos"] - self.assertRaises(TypeError, twos, 5.0) - - # Test the (int DIM1, type* ARGOUT_ARRAY1) typemap - def testThrees(self): - "Test threes function" - print >>sys.stderr, self.typeStr, "... ", - threes = Vector.__dict__[self.typeStr + "Threes"] - vector = threes(6) - self.assertEquals((vector == [3,3,3,3,3,3]).all(), True) - - # Test the (type* ARGOUT_ARRAY1, int DIM1) typemap - def testThreesNonInt(self): - "Test threes function with non-integer dimension" - print >>sys.stderr, self.typeStr, "... ", - threes = Vector.__dict__[self.typeStr + "Threes"] - self.assertRaises(TypeError, threes, "threes") - -###################################################################### - -class scharTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "schar" - self.typeCode = "b" - -###################################################################### - -class ucharTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "uchar" - self.typeCode = "B" - -###################################################################### - -class shortTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "short" - self.typeCode = "h" - -###################################################################### - -class ushortTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "ushort" - self.typeCode = "H" - -###################################################################### - -class intTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "int" - self.typeCode = "i" - -###################################################################### - -class uintTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "uint" - self.typeCode = "I" - -###################################################################### - -class longTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "long" - self.typeCode = "l" - -###################################################################### - -class ulongTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "ulong" - self.typeCode = "L" - -###################################################################### - -class longLongTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "longLong" - self.typeCode = "q" - -###################################################################### - -class ulongLongTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "ulongLong" - self.typeCode = "Q" - -###################################################################### - -class floatTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "float" - self.typeCode = "f" - -###################################################################### - -class doubleTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - -###################################################################### - -if __name__ == "__main__": - - # Build the test suite - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite( scharTestCase)) - suite.addTest(unittest.makeSuite( ucharTestCase)) - suite.addTest(unittest.makeSuite( shortTestCase)) - suite.addTest(unittest.makeSuite( ushortTestCase)) - suite.addTest(unittest.makeSuite( intTestCase)) - suite.addTest(unittest.makeSuite( uintTestCase)) - suite.addTest(unittest.makeSuite( longTestCase)) - suite.addTest(unittest.makeSuite( ulongTestCase)) - suite.addTest(unittest.makeSuite( longLongTestCase)) - suite.addTest(unittest.makeSuite(ulongLongTestCase)) - suite.addTest(unittest.makeSuite( floatTestCase)) - suite.addTest(unittest.makeSuite( doubleTestCase)) - - # Execute the test suite - print "Testing 1D Functions of Module Vector" - print "NumPy version", N.__version__ - print - result = unittest.TextTestRunner(verbosity=2).run(suite) - sys.exit(len(result.errors) + len(result.failures)) Deleted: trunk/numpy/doc/swig/testing.html =================================================================== --- trunk/numpy/doc/swig/testing.html 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testing.html 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,482 +0,0 @@ - - - - - -Testing the numpy.i Typemaps - - - - - -
-

Testing the numpy.i Typemaps

- --- - - - - - - - -
Author:Bill Spotz
Institution:Sandia National Laboratories
Date:6 April, 2007
- -
-

Introduction

-

Writing tests for the numpy.i SWIG -interface file is a combinatorial headache. At present, 12 different -data types are supported, each with 23 different argument signatures, -for a total of 276 typemaps supported "out of the box". Each of these -typemaps, in turn, might require several unit tests in order to verify -expected behavior for both proper and improper inputs. Currently, -this results in 1,020 individual unit tests that are performed when -make test is run in the numpy/docs/swig subdirectory.

-

To facilitate this many similar unit tests, some high-level -programming techniques are employed, including C and SWIG macros, -as well as python inheritance. The -purpose of this document is to describe the testing infrastructure -employed to verify that the numpy.i typemaps are working as -expected.

-
-
-

Testing Organization

-

There are three indepedent testing frameworks supported, for one-, -two-, and three-dimensional arrays respectively. For one-dimensional -arrays, there are two C++ files, a header and a source, named:

-
-Vector.h
-Vector.cxx
-
-

that contain prototypes and code for a variety of functions that have -one-dimensional arrays as function arguments. The file:

-
-Vector.i
-
-

is a SWIG interface file that defines a python module Vector -that wraps the functions in Vector.h while utilizing the typemaps -in numpy.i to correctly handle the C arrays.

-

The Makefile calls swig to generate Vector.py and -Vector_wrap.cxx, and also executes the setup.py script that -compiles Vector_wrap.cxx and links together the extension module -_Vector.so or _Vector.dylib, depending on the platform. This -extension module and the proxy file Vector.py are both placed in a -subdirectory under the build directory.

-

The actual testing takes place with a python script named:

-
-testVector.py
-
-

that uses the standard python library module unittest, which -performs several tests of each function defined in Vector.h for -each data type supported.

-

Two-dimensional arrays are tested in exactly the same manner. The -above description applies, but with Matrix substituted for -Vector. For three-dimensional tests, substitute Tensor for -Vector. For the descriptions that follow, we will reference the -Vector tests, but the same information applies to Matrix and -Tensor tests.

-

The command make test will ensure that all of the test software is -built and then run all three test scripts.

-
-
-

Testing Header Files

-

Vector.h is a C++ header file that defines a C macro called -TEST_FUNC_PROTOS that takes two arguments: TYPE, which is a -data type name such as unsigned int; and SNAME, which is a -short name for the same data type with no spaces, e.g. uint. This -macro defines several function prototypes that have the prefix -SNAME and have at least one argument that is an array of type -TYPE. Those functions that have return arguments return a -TYPE value.

-

TEST_FUNC_PROTOS is then implemented for all of the data types -supported by numpy.i:

-
-
    -
  • signed char
  • -
  • unsigned char
  • -
  • short
  • -
  • unsigned short
  • -
  • int
  • -
  • unsigned int
  • -
  • long
  • -
  • unsigned long
  • -
  • long long
  • -
  • unsigned long long
  • -
  • float
  • -
  • double
  • -
-
-
-
-

Testing Source Files

-

Vector.cxx is a C++ source file that implements compilable code -for each of the function prototypes specified in Vector.h. It -defines a C macro TEST_FUNCS that has the same arguments and works -in the same way as TEST_FUNC_PROTOS does in Vector.h. -TEST_FUNCS is implemented for each of the 12 data types as above.

-
-
-

Testing SWIG Interface Files

-

Vector.i is a SWIG interface file that defines python module -Vector. It follows the conventions for using numpy.i as -described in the numpy.i documentation. It -defines a SWIG macro %apply_numpy_typemaps that has a single -argument TYPE. It uses the SWIG directive %apply as -described in the numpy.i documentation to apply the provided -typemaps to the argument signatures found in Vector.h. This macro -is then implemented for all of the data types supported by -numpy.i. It then does a %include "Vector.h" to wrap all of -the function prototypes in Vector.h using the typemaps in -numpy.i.

-
-
-

Testing Python Scripts

-

After make is used to build the testing extension modules, -testVector.py can be run to execute the tests. As with other -scripts that use unittest to facilitate unit testing, -testVector.py defines a class that inherits from -unittest.TestCase:

-
-class VectorTestCase(unittest.TestCase):
-
-

However, this class is not run directly. Rather, it serves as a base -class to several other python classes, each one specific to a -particular data type. The VectorTestCase class stores two strings -for typing information:

-
-
-
self.typeStr
-
A string that matches one of the SNAME prefixes used in -Vector.h and Vector.cxx. For example, "double".
-
self.typeCode
-
A short (typically single-character) string that represents a -data type in numpy and corresponds to self.typeStr. For -example, if self.typeStr is "double", then -self.typeCode should be "d".
-
-
-

Each test defined by the VectorTestCase class extracts the python -function it is trying to test by accessing the Vector module's -dictionary:

-
-length = Vector.__dict__[self.typeStr + "Length"]
-
-

In the case of double precision tests, this will return the python -function Vector.doubleLength.

-

We then define a new test case class for each supported data type with -a short definition such as:

-
-class doubleTestCase(VectorTestCase):
-    def __init__(self, methodName="runTest"):
-        VectorTestCase.__init__(self, methodName)
-        self.typeStr  = "double"
-        self.typeCode = "d"
-
-

Each of these 12 classes is collected into a unittest.TestSuite, -which is then executed. Errors and failures are summed together and -returned as the exit argument. Any non-zero result indicates that at -least one test did not pass.

-
-
- - - Deleted: trunk/numpy/doc/swig/testing.pdf =================================================================== --- trunk/numpy/doc/swig/testing.pdf 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testing.pdf 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,1016 +0,0 @@ -%PDF-1.4 -5 0 obj -<< /S /GoTo /D (contents.0) >> -endobj -8 0 obj -(Contents) -endobj -9 0 obj -<< /S /GoTo /D (introduction.0) >> -endobj -12 0 obj -(Introduction) -endobj -13 0 obj -<< /S /GoTo /D (testing-organization.0) >> -endobj -16 0 obj -(Testing Organization) -endobj -17 0 obj -<< /S /GoTo /D (testing-header-files.0) >> -endobj -20 0 obj -(Testing Header Files) -endobj -21 0 obj -<< /S /GoTo /D (testing-source-files.0) >> -endobj -24 0 obj -(Testing Source Files) -endobj -25 0 obj -<< /S /GoTo /D (testing-swig-interface-files.0) >> -endobj -28 0 obj -(Testing SWIG Interface Files) -endobj -29 0 obj -<< /S /GoTo /D (testing-python-scripts.0) >> -endobj -32 0 obj -(Testing Python Scripts) -endobj -33 0 obj -<< /S /GoTo /D [34 0 R /Fit ] >> -endobj -36 0 obj << -/Length 2238 -/Filter /FlateDecode ->> -stream -x??Y[??~???4?X??>???????-?yh?0?f?B,i+im?}???p4??.???(??^?m?]? e?????[`gp?2???Z?=??@?? ??;?#>????!AP???#6?2|A~t???'???F6lc&O8?$4B???P?m??? ???????R^????8?4cI?4?0??GL?d?????"U? k??8?I'l-?WDD?????G$?#???E??N?/o ?F?/?F4MX? L???C"??????E???#???1???d???s?8_N-J>&`Q??zfb???.?,,??yX~??w????!?C?n1hZJ??@?Y?????JH????=??m(??c?b?KwXr_?u ???9 ?Q???D4b -=??????det-?????8???>7k? &??z?TrB??iLN???+??pf?h??k????]c]?/\??!??CLU?b?u??)?? e??!.????3????zt(?T??5s?3C?????o?NCT^?O???k-M?4??%? Uk0?>??2?????8??M)?e?v?;???:???k??0]*??s?Y{?WJ???`?4q?(=?^'Ah???umc??q?a?c.}!??t{baq|~?&r????Y2???0??Tw?1???????d????-??`??[??? L?;??????\?#?8?e??w?r?????C2d\????W?Jm(?? -???U?"M??a????????a???h???3?b????????hzyg????RAU{?.??|????;8??x6??????+?~????j?p_?????D|????j=?{L_u?z=?????vwd???Td?x?6?]??Z%?&;???????x?}?$]r??????M?&!_9G?G ?? ?k7?e?h????/$HA???????}L ?^?6????1s???I RP????L(??n????=?A?E??$?'???w>?????????8???????? ?????h??? -????"????#_?????v?g#?S???I?l?IM??:?2 ??[CQ7???B?f?:??T??h?^????i??}{?? G?}:?=???s7?YP ???????t?KJ????yov?-E????ep????`?8???L%????{R?D?m??z?\?$??a???}?`3????7?aS??5?K?4h?)?2???$?C?K!??PNY?.\#????:?????j?#??7U{fX>"?]|-#??-???B/?e?$?Y??D?S?. -?kN<?A?Y?2?<?? u?,?.?????RN?? -?,Y-?w_$?XE??ez??aaj??????3]?v?-?9??1A?/??B?????RR???????(F{NO_??+Wf?? W?1??d?i??????8????%????p??SW?TYH?????"??c???a?p???{H??Z????>???U???{??k[L???????o+W?\c??-M=N?+?(?????K?6???r???P?????????U??-? -???MS?lK\??,S?G????'u??S*"?}#??Y?N.?8?????????"??l?I6^^Y~a??1p???o`??\v????C??????bOt.???+7~?????????????2?Wh?`C???.n??(S?????u4?cd]?M????D?#?Z?????e(??e????\???5??EQ?R? 8%E?x?????Lny???>?????OA?XZ?????%?? -rJ$ -????B#??=o????S??y?4{???A????[I?4?' ?????-?x?@3?s??{????8?_??? ?1??C??'!+??:?j??NM??_{???endstream -endobj -34 0 obj << -/Type /Page -/Contents 36 0 R -/Resources 35 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 69 0 R -/Annots [ 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 64 0 R 65 0 R 66 0 R ] ->> endobj -50 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 572.1561 154.7972 581.0627] -/Subtype /Link -/A << /S /GoTo /D (introduction) >> ->> endobj -51 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 550.2982 191.9077 560.9481] -/Subtype /Link -/A << /S /GoTo /D (testing-organization) >> ->> endobj -52 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 530.3729 189.8853 541.2121] -/Subtype /Link -/A << /S /GoTo /D (testing-header-files) >> ->> endobj -53 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 510.4476 187.9425 521.2868] -/Subtype /Link -/A << /S /GoTo /D (testing-source-files) >> ->> endobj -54 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 490.5223 227.5535 501.3616] -/Subtype /Link -/A << /S /GoTo /D (testing-swig-interface-files) >> ->> endobj -55 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.3198 470.597 200.6545 481.4363] -/Subtype /Link -/A << /S /GoTo /D (testing-python-scripts) >> ->> endobj -64 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [204.9922 405.6211 234.1526 416.7393] -/Subtype/Link/A<> ->> endobj -65 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [136.0988 334.1691 165.2593 345.0083] -/Subtype/Link/A<> ->> endobj -66 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [244.5817 334.1691 276.9898 345.0083] -/Subtype/Link/A<> ->> endobj -37 0 obj << -/D [34 0 R /XYZ 74.4095 789.6651 null] ->> endobj -38 0 obj << -/D [34 0 R /XYZ 74.4095 771.7323 null] ->> endobj -48 0 obj << -/D [34 0 R /XYZ 74.4095 613.3264 null] ->> endobj -6 0 obj << -/D [34 0 R /XYZ 74.4095 613.3264 null] ->> endobj -49 0 obj << -/D [34 0 R /XYZ 74.4095 585.1076 null] ->> endobj -56 0 obj << -/D [34 0 R /XYZ 74.4095 461.6307 null] ->> endobj -10 0 obj << -/D [34 0 R /XYZ 74.4095 461.6307 null] ->> endobj -60 0 obj << -/D [34 0 R /XYZ 74.4095 420.7842 null] ->> endobj -67 0 obj << -/D [34 0 R /XYZ 74.4095 322.9312 null] ->> endobj -14 0 obj << -/D [34 0 R /XYZ 74.4095 322.9312 null] ->> endobj -68 0 obj << -/D [34 0 R /XYZ 74.4095 279.5807 null] ->> endobj -35 0 obj << -/Font << /F39 41 0 R /F44 44 0 R /F8 47 0 R /F51 59 0 R /F56 63 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -76 0 obj << -/Length 3176 -/Filter /FlateDecode ->> -stream -x??[m?????_??:$???.?Om?)????-??(h??|?%$9???wf???\?:??!?"?;3??;ylE?[I$?????h??j?EWp??W,?H??T????????X??j?/???W_????t????? -? %??hF?????????>?lc???_?z??mZ?QC8Sv??q?K??@?s&G???7??/???A?????!$V?J? -?D??\"-Sc7??/p?;?????;???)???=^?g???\?7]???@v?????z???s3?w???l????;?{???9vR?Ya??8v#?7?J?;?}????n??wA?? B8?.?i???c????J??a#?w???pqR!a??????[????c?????l????x -0????:p??=Bw???&???>?????(g?rzZ ?#??? ??&L?s?t??? [?????&?'c? 7o??????#???9,?0^?+?Q?J?????!zj??H)???]a?~G?'????aO1B?]?????)@?x#?G??7??#?/As???l?9@????):F < ??????BDgK_;.????a??Pnm???)???[b#?.??~?=??r?j -?+%??V??2?Z#?(f "?`?\R????.9??Tj???y#c??k?n??1???'`????,?/@=?p???s?~?K??q?9 ???!@?bE50U0 A?????uDB?/"???!??uh??.k$???;?C?{????5?5?????!???]??4????]t?????w?? -?.???4? !?qj!?+QZ?m??m?W?????2??J?_???????O??(J?YF??"?i???_?mcL??{m????&????JL????I????Y?W?????????5?P????5????)?^?T??G?i?-????t?????vP}???z?? -???o0?yt2?9t"?2:sl3tj???|??????D?#?y?3?9?#???sl3?k?*?|_?"5Q?t%A?T2?9T"?2*sl3Tj???|??????jCm)-4??jgTsjG?e???fj?|'???^a ?!C%?/?, ?Q?!????c?!S??@&?[?}=?Z??T?H?T3H$?E$f?H????(???F^??Dk?P??Ts`E?e???f`?|'??????%q?????????y?3?9?#???sl3?k???|?????[????Lo$?\J??????P?9~8?7x>?hz?%B??\?#j??o2QC?t?}?? ??#jY?te???7?HU?D??-W?/Q?3????g??????|?.???y!???? B"L??@????U???2(F????Ny??? ??????0_??_?0?f???h????z???M??8??5????? W?G4??"NN?P?8????s?S??+?=Z?????"?W??w?[??I???:p|???~?^~!SC???????H????o?u -???i%??????I5??:`?endstream -endobj -75 0 obj << -/Type /Page -/Contents 76 0 R -/Resources 74 0 R -/MediaBox [0 0 595.2757 841.8898] -/Parent 69 0 R -/Annots [ 78 0 R 79 0 R 80 0 R ] ->> endobj -78 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [106.2195 758.8407 135.3799 769.68] -/Subtype/Link/A<> ->> endobj -79 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [253.2366 687.1097 285.6447 697.949] -/Subtype/Link/A<> ->> endobj -80 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [185.549 647.2592 217.9571 658.0984] -/Subtype/Link/A<> ->> endobj -77 0 obj << -/D [75 0 R /XYZ 74.4095 789.6651 null] ->> endobj -70 0 obj << -/D [75 0 R /XYZ 74.4095 564.5693 null] ->> endobj -18 0 obj << -/D [75 0 R /XYZ 74.4095 564.5693 null] ->> endobj -81 0 obj << -/D [75 0 R /XYZ 74.4095 520.9398 null] ->> endobj -71 0 obj << -/D [75 0 R /XYZ 74.4095 248.7539 null] ->> endobj -22 0 obj << -/D [75 0 R /XYZ 74.4095 248.7539 null] ->> endobj -85 0 obj << -/D [75 0 R /XYZ 74.4095 203.1918 null] ->> endobj -72 0 obj << -/D [75 0 R /XYZ 74.4095 156.2214 null] ->> endobj -26 0 obj << -/D [75 0 R /XYZ 74.4095 156.2214 null] ->> endobj -74 0 obj << -/Font << /F8 47 0 R /F56 63 0 R /F51 59 0 R /F14 84 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -88 0 obj << -/Length 3305 -/Filter /FlateDecode ->> -stream -x??ko???{~???5?e????!M?4E{8\???!Pve{Q{?X?/w???!?%Q??\?+QCr?/*?????VLUN???1c4???>??????'?`?2LiS?C??Z??Yc??:_??O??n?bR????~/?Ym\}v??quq?????????_??e?W?????7?o?????K?o??????? L???o??9s?ap??l-8???~?????.p?:??????6???5R?sw?????3?>yu?H??0a+???????W?+??!?T?_?L?=?o??????r?5hf????r??Wr&??4????0???@ Rv??=???'????J7Po?e??D T J_B?D:???K:wW?j??^e?F????f?,?4?>??,H??ZSF?? >u???[??i?X}?????????@???d7L\BF,H?%[5?U?:3?=-yJ?D??z0?? a??x??k"g?~#OLA_J??X{?d?????:??R?'}??67??H -~?GX>?G??Fz?ccf?I?\????z!?WN?G (?y1{I?????B???8??@ x?])? -? -g:?z4?t??S?0?`?*+???[N2??o?t?}???(,3 Da4Y8?????BO??kaM???W??? ug???]?8??ppd????d??"+????X??(?'??7'DzjN????,???N???EN3]91?? }????U???|*?1?\q??$??????????????q??\????J??B_3?+>bI?|5?8?i ?Cr? -?2???x????e??(U?Q?b??: ?????/w???"A-4??4????????}1:???e?3z??Hq??;?ga?- 'c$???????%?t??tL??2?fh'_???3?i?4 ???????y??nLa?d?a??G???p?!=??`"????U8???b?6|??E???a<}J -??'??????m5????J???r&????w?.;j;?I'?6???Z}?N1??EF??????W[?T\??4???i??> ~?LZ1????e???#)??r??????[??9????vq?JT?/?h -???<` ?1??6??#-???>??i????1?rUDML2i?]?,$?N?? ?&?p*????&??>?????6}???@$?7??6*??????hM????Hr?Ko???\?[ ?y?~b'Y%?[?J?YD ??U???.?#b???L?Y&t]> endobj -91 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [135.2839 737.0327 164.4443 747.8719] -/Subtype/Link/A<> ->> endobj -92 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [208.3454 724.7985 311.5372 735.9168] -/Subtype/Link/A<> ->> endobj -93 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [364.7967 724.7985 393.9571 735.9168] -/Subtype/Link/A<> ->> endobj -94 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [268.4471 712.8434 297.6075 723.9616] -/Subtype/Link/A<> ->> endobj -95 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [458.303 712.8434 521.8625 723.9616] -/Subtype/Link/A<> ->> endobj -96 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [73.4132 701.1672 119.3703 712.0064] -/Subtype/Link/A<> ->> endobj -101 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [324.6699 247.1243 360.0704 257.0788] -/Subtype/Link/A<> ->> endobj -102 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [382.9052 247.1243 454.0182 257.0788] -/Subtype/Link/A<> ->> endobj -89 0 obj << -/D [87 0 R /XYZ 74.4095 789.6651 null] ->> endobj -90 0 obj << -/D [87 0 R /XYZ 74.4095 749.1338 null] ->> endobj -73 0 obj << -/D [87 0 R /XYZ 74.4095 677.9741 null] ->> endobj -30 0 obj << -/D [87 0 R /XYZ 74.4095 677.9741 null] ->> endobj -97 0 obj << -/D [87 0 R /XYZ 74.4095 634.6237 null] ->> endobj -86 0 obj << -/Font << /F51 59 0 R /F56 63 0 R /F8 47 0 R /F44 44 0 R /F58 100 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -99 0 obj << -/Length1 1248 -/Length2 6154 -/Length3 532 -/Length 6940 -/Filter /FlateDecode ->> -stream -x???eX?[???@??b?????K??? $A??{??V???[ E?K?K?)???w???o???c????????`?????0(? ?H)? ???X??RN`38?6???@AA @?? -?? ? q -? -b??`N+k8?Q???"~??=? ba(????? 3;???{?$????p????N?`;A,?s?????y?% ???0????)W??3??a? ???A?< ?%? - ? ?p?????????????%??????C??/???Uh??????~? ??%?????` ??9??p?MJch??L??R4fdI??8???????xd??QEG??Z???tB?m?m?[ -??vo?O???q?????????-?g??[?/?p?g.y?U?V?J? -?Nr?0Jk??/?"????d??????i??????U?Ku, ? [q?K|??2?k????t -kw!????I?7?$???h??V??L??#v?? ????J<`???F[?P?zOZ???L?d??t\&\?????]?????h?h??????@a????]>???cB??nz??n?????????~z?; ^?,>?n?v?i?????$4?l?j?(?>aS???r?????k???Q?????W?????]:?M???%g8??P?0??????q2?H?????M?C?=?c?2?6??.??G??U??????z??]????u?0??`?+0?"?UT????"Y?????+?h????*???d???.#E?????? q???o"?? ???1??? k8??B????%?????????X$?{;?C?P?P?O?.yvu???2???4lnqA?1wW?s~9?g9??W???N??-?K9?z(a?R}^}v?ut l????"?N`?/u0k???6c/?,?!g ????E7?????&?J??S?6L=?~??}???;4/?D2??26e?3?a*?e?4h TG|?????(a???Ak????<???N??????{1??ID?k?_???????,?????bw??XAYrh_???>J?????*}?;1?10??`?D?k?X*?????7???#???e??????&7???9?@4(????P???+???: a}?????f????!l??k??????_o??????P?V?wpM?@i?kQ???Y????csz??-?A???gg??G???Mr????%???y???M???????D%??^t??[?a??V??JpT?????7?~??A??~?)??E&2u?(?????_G????p}RL?~?k8U?biK???U?(4?2g???4?2??n?+AlR?f?bB???_?gt?????&?????1%?#L??V[?H???c?hcZ??(\?\NHn?????o???*??T???????Q~p???:?.?^?T??w??r?????:??jk??qp^3?????O??+?={??CQ??|A?[?_?S???z?6?u~-f??ZzL`?Z????.CUl???????QM?d??#w???Y???????X?6x\c? -?????u????|???BN?yWv?R???W??gq+ |? l)????w?x???po??5?q?5?g9?????~??\?S?k???????&?+?????????????E???V??????y?H?%`Z.?"d\)?????l??~W#9G???v????aM????:?=?)?d/?0?}???m??Y?T??N!P??4??#?????????/%?/0K???&???^?lG?W^M|???W?=??I[?v[?2J"?%??n???8?5?`(?????????????f= ??x?????~??9e??s7??q?r?}g?9?F??8??}????d? ?/?????a[r}0?L?^?*????c{???)??]ike?>??????O;?`???h??_N?n T'???????7??????????v?ah??{m?U?3-????y???'W??K?C?BJh1???j??????G?"??6? ??0???{)??gt`???zD?L?<{g????@}??J?aD??&?7?? s??u??????u???[y`??p???*????Yk8??ph???c?B????q??V"?ba?????|??]??????Ut#o???J?t??? ?2?%2????b?????????P??????Y?6?D?y=??dP????????P??fI%?)???l???F?|/ T2?f+~???m????????7???9??????([?_?d????(?????n???p at 6?yf?[???{|?a?SN6?^$?L;??$?????Q5??4?B?$&?m???9?3b?7!.=HC???;??)???TT????*?F?x???>{??VW?w??????hDq@?d=?,?}uD?*?)5????O3?x"?z????? ????rH4??4??(??mn?g???&%?O???I?X??XE??xo??.?k?????\o )m?F??? ?k?Hk??8?]3R?8??L?oY?"???I???[??[+|?Wk?s?????/?UT?)?Yy???P-?? -B??p???G?E??? !????? P?*S?l?a?6? -?ob~*?Q???????vT.Xw]?\???V?K?$V? ?r?????zf???"p??}"f?, ?? ??>v???Ty???6??V*?VH????y?B???g8p?cC??M?? ??\ofn???????*????u??? -hmHMH?WV?)41}[? ?B??!3~9?:^G?3V??T?)P?E???V??????D>?a{?????n????O??s?? ?DD9? ?)Z?%????3? b?J8???94d?3?n???D?^O?*??????????!??Dv??6?l?G??]???yC???v?5???P<(B???;L??4?????Fkl?]g????;?bc??j? ????I)?z?:[f8\??7R?m?c2??^?n4?(?6? ?N?i?~????TS#f???*F?Yv15?Nn??{?????? yYdR?3?AU??8? F.!??5???0????6??"?VAZj ?1?????Fs??~??????:??1X/ee??O??_?????%?g??W?q0?`?K?????@=1???`?????or??-??.??G4?.??a?BPm-d?M%?eod&?r?UUkb??r`???????%W(t????z*F?/?#??^p???????I9???`.??(??#+Y??35A?c????????/???lD5?QVW6????i~n????yC???pM  -%??????n>??????J??Lp?`???oQ??9?nd???;]?0D?5?9??|?*?ei_nox?~?|d?c?%w?{????q?????#Mf?/(i?nh??h?6]??7+}?_)??,I???[??f????N?j6j?=3_ -?????L??@?qECn?E??jB?????????/??????'??x?zc{K??;??x,?C?f[\??~???u@?z???????A?=?; !R~??UgK?&??G6??{??????? ??? ??|??c?j?,????? Zr???s????W'??3??6?c ~??z=,?f?o?P??O?eR7Sr?e?$8]???q\?????????b??m<p???1???? ?{?V?m?u?oJ??/{?? -?????????St???f????y????y _?7????A8?s??;.m-?~??5T????]???? ??S~?&Y??}$??=? ???????0Pi??l7J???s}??(F???u?IY?oN?S&???? -k1 ??Mu92+l?f\????_???'??? /?S????|??~?Cvf?z????g?d?Y8?Z??O????$W2?9[????fK}???,???\??&??K\?D&???Z??wE?V>?b'????N?*???:???d??????mW5vF.?j??15 ?M?zt???y? m,?v??????6?)??LL?Y????)U????s???4???^2????0???E?@? ??3???zV?{P?G"!??????+?u?x???'s?{???.?I?^?ekdp?cLP?i????f?*O?%????$_???????I?Ku????$???&? -?@?BU?4????????6???Y???9p}??I??=ez?ABZ?S?f7????JR??????C?4w?*Y?2=??-v?m? "=|??.???c????e?Q[?Xz_???9L??3?v?[?U6n6???H2?p??%??*u??Y?r????????GX?????0{3'[?????endstream -endobj -100 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 103 0 R -/FirstChar 45 -/LastChar 121 -/Widths 104 0 R -/BaseFont /ALKKQK+CMR9 -/FontDescriptor 98 0 R ->> endobj -98 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /ALKKQK+CMR9 -/ItalicAngle 0 -/StemV 74 -/XHeight 431 -/FontBBox [-39 -250 1036 750] -/Flags 4 -/CharSet (/hyphen/period/zero/one/two/three/five/seven/eight/nine/colon/C/D/G/S/T/U/a/b/c/d/e/f/i/l/m/n/o/r/s/t/u/x/y) -/FontFile 99 0 R ->> endobj -104 0 obj -[343 285 0 514 514 514 514 0 514 0 514 514 514 285 0 0 0 0 0 0 0 0 742 785 0 0 806 0 0 0 0 0 0 0 0 0 0 0 571 742 771 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 0 0 285 0 0 285 856 571 514 0 0 402 405 400 571 0 0 542 542 ] -endobj -103 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 53/five 54/.notdef 55/seven/eight/nine/colon 59/.notdef 67/C/D 69/.notdef 71/G 72/.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e/f 103/.notdef 105/i 106/.notdef 108/l/m/n/o 112/.notdef 114/r/s/t/u 118/.notdef 120/x/y 122/.notdef] ->> endobj -83 0 obj << -/Length1 750 -/Length2 576 -/Length3 532 -/Length 1110 -/Filter /FlateDecode ->> -stream -x?SU ?uL?OJu??+?5?3?Rp? ?44P0?3?RUu.JM,???sI,I?R0??4Tp,MW04U00?22?25?RUp?/?,?L?(Q?p?)2Wp?M-?LN?S?M,?H??????????ZR???????Q??Z?ZT????eh????\????????r?g^Z??9D8??&U?ZT t????? -@'????T*???q????J???B7??4'?/1d<8?0?s3s*?*?s JKR?|?SR??????B????Y??.?Y???????????kh?g`l -??,v??HM ?,I?PHK?)N?????;|`?????F9iC?,???WRY??`?P ?"??P*??P?6?300*B+?2???????t#S3?????J.` -?L? 2?RR+R+?.????/jQM?BZ~(Z??I? ??% q.L?89?WT?Y*?Z? 644S077?EQ?\ZT??WN+?????2?A??Z???u?Z~?uK??mm+?\_X????????7?D?????Rl:/P1?d????????(??l=U?h?d?_O??E?k?v-X1??t???`????i????_y. ?1?????????:?un~Q???3/??S??}??]?? -???$e~s?]F1????/??Q???m????|<?????/??q'}I???+6???E??g???xT.??G??gt???v??G??U|?????~??]?R????_k?9???:?{?p??G?? ??d}dN<6??-uB?o?H??=c?M?vH??z?q?a???RK?~,K???}????????m??????yo??~?????v? -?_????s>???.#????????{?/?????k????\m?|??r???X???????ad?j|?????R/?,2?p?0, H?IM,*??M,????r?endstream -endobj -84 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 105 0 R -/FirstChar 15 -/LastChar 15 -/Widths 106 0 R -/BaseFont /OWUQZB+CMSY10 -/FontDescriptor 82 0 R ->> endobj -82 0 obj << -/Ascent 750 -/CapHeight 683 -/Descent -194 -/FontName /OWUQZB+CMSY10 -/ItalicAngle -14.035 -/StemV 85 -/XHeight 431 -/FontBBox [-29 -960 1116 775] -/Flags 4 -/CharSet (/bullet) -/FontFile 83 0 R ->> endobj -106 0 obj -[500 ] -endobj -105 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 15/bullet 16/.notdef] ->> endobj -62 0 obj << -/Length1 1548 -/Length2 8704 -/Length3 532 -/Length 9616 -/Filter /FlateDecode ->> -stream -x???eX?????"???R,???Cq/?5@?@???)????Hq+N???E{???g?g???~??M?!?w?9?;??>??P?d???e?PVA????;????]??F -4?????P? ?C@? ?p?8??9a4?????????????B@??eS?5????? 6?? ;;??_'?@g ?h??????Cf at +??_??,???.???? -?8?L???????;?y,??hl*`X6 ??? [?\???N?????w?????????u}kG????+Rtb\?}wW??????M??@???A}T???)&y?i??d;?????y????#?M?Vk???!????pI?n~_?i?A?????w -?n}????@^?w??v?!A??\??N%??!?n? q????mBP?????m.?wy???O?p??????????mDBRY??? ??n?????v????Uv?TFL?8,??,vN?k??t{?M?l<7c%???D?2!??s?R&????@P?s?2??3bE?? v?"??? bi?G@???$??z?_??cd ??A/':@??-??k_???e????U1?>(?R??$?o??y???????E??3???<{???????>????=a?7?O?5?????????es:?O??{??,?Y?????L??9??J??V?;0pJ?? -H!h?B?Sk???9?]???f 8??????{A??T??G?????0N?~G?? ,na @???????c?/3???????2??????{???t] ?>????HKl -^????`?^U?????*??uO6n??XYiDAW9 }?P?=???d???yT>LI?I`??2(?????????o??3?0#????5??????'?R???7L??v?b?????B2h]????K?Ws?2?_K1? ???O???&4h#t2???IC?1???O!G?F??&??F???wY?A?W?zn!u?????????????LEZ?N???1??????B??%?L\; ? -?N\?,??L??.?????6v??K[\*?????;???P????5?j??%?r??A?i?\?????f??????K6P?????0??'C??????y?@ ?????Z??????f"?U??3?l???I+NE????LX??Bh?$???~:m_ ?DF?Z?L*d$?? (?s>G???I? ???9??ZT?-(??? 8?|[??????A?t??~?;??K???r???/|????U? -???_'E?0E?4?L?h??kA?V???L???? ?P1????X?u4S?g#?_?6??v?&K?e1Hx??`?S?i?y/qT#??}????@-??h?~?2?L?"??:Y8??4U?R??c???|??wK?@?c?`'?Of????????h???U???e????vF?r???n???&Z???????97??)??O???9"? ?}Z?????A?=?!???LlI???Z?S??zk0N???XSP??t??m????#?B1aHq?g?X?5E??Vi? Q????ts???y9??l2???&?^?}?"$s???f??|d/ U?v??(|?Y?l?`??_?Y;"????e?G?qMUZ?H?????X?!??W?!L?ng-?7H=?Lg??????,??+?y??_r6]Es9'aV?%1n??k????}?J?`N?t???:??f6?H????D??\?!j??%??????????|@*?K????1?Ukk??}????'????OrO???wt??? -??w??h???<? )?A???%????c$?z??[ ?^XC??X?????$???}???? ??N?qW#???|r>? ?J??yf?o?????E?I?????pTL?~Q??`???? ?V?`,???% ?$???n_??RCn??????e??[?i????^??N:????k/ ?kqT??O?? r?TV4SY6@????U????Nh??C?c?? b~t??^ ?1? !?J????????????EKK?????aQM?f??7?[??9?C????????m,?g?U?7V?z?B3?Q#?????????!M?'|?$???J+??EY1??c?????}???bD?I.????k?f2? Q?>?Mv??Qk????C??mJ?yJJl??Ir? ???:?????8???D?Rfnq&?'?????d???O?kG??? x ??k????&?x?$??OF???B???????m???T?h?M????(? ?,"-8U????@?5y?G?A@??Oj?`' ???;?4??????c?????K??8b??e$???I?r`?H?rc?9?H ??a????PI???oBu??>2ao?7???tNL_ae???????)$P??&$M?????y??I?>??5?baY4?-?,R???c(???? -Q3?A?9????nHG??3?i4?\????SmH??;?n5P???6???Dd??h?RXf+?/???x| ???[?????b?T?B???H??T@>f?bd?*?9?)??l ?`?M???H?"?UU?F?|??kj?????H0z|???$??6q??Q?9?X??s\/??IU4????j??;???X?]?a{e@?????!?-?????Qp7??[O?????V?9????K?????0z?8?8Y-?-??9.@???(???~GW???i???*E??t??cf`?c???DY??c?R?'?????v?W?r? I]??/?????R?>???a? \?G??????Z?C???Jp#?????)?[!D??RM?G??]??????,?Dfd???H?Jx??.W?8w??X?R?*#??px?r???I??Hr ?z?????N}????M?J? t??m?????????v:u??DY?W??~y??T?????_? -?b?g'6??+?V?bN -?*yC?2?????&vV?????4 ?Q??s? ??_??A??mE?&?As???? ]?????????s@??????,>?/??f??1U^?hq?? ?%[%5"???Ki0SoO???q??H ???]? V?z"J6?'eKh? -?,??X??^8Z????????_?????]????????? -w?_?H?'?O??9??k???&?(? T?o+???}?????? q??l?D? P???p~??zfRn?????O?????]?r?8W?????h O2??*?Q??? q?? ???Yq?-4~?H?????{dK??mD%B???0?n??~???M???<7?Ai?7?&?sk??x?qCvA+M*????s:w;?A?^^?Ah?nE?E?5s??p/foA?"9???????-%?&????{,;?f???U???MEEP??#d????\??N!??X??*?t\?eQ?? {%??????k?q??c???~#????&?Zf??=??$??>?Rm?;?=?n???v?h(??k*!#]??/?F?? ????X#m ?:i_???D??N>??pV???"???t? ]?u?$???????N?t??(o3?X????Lx?bk??}??Lg[I_}J{?m?6Dq??x???!I?'?%????d4???J???Ap?l?q?5?N?????O? -3&v?\?a+??U?????????6N?2'??)'????e?5~#???7?2? x???[?? ???=/?)??F??K, H?(?'???8???A???; ?hv???@_??D??`????z Aa??e ?W???g?1??u????H?9OXatc2O????n"<???cZ?*\6???? ?w???2D!<P;V1?^N ?7???W?S,J?w9?'?t??Tiv?????g?Q? 1c?????`??\DO??q@?su???|8??p9??w"8???\?)?=KAy????m???n???B(????? ?5????%t????E?~?D -B????????2V!.??L?W=?E)q?Q?B??????? '??W?M?a?i!?3?????e????I??_w6???????.????~Fb?.??m^-?~?R??2x?`??L?????*???????"~??????Gy.8???S??Cn?;y??N?|??(???|,+eo?J???;?b9:??? )Co?N?????4??C??3?!?*???";?1?lo?e -?? ???>?]??;?:i?K?.m???~k at Wl????^nW?????k$ -???Q???Lrv?'{1??"*????5ax??I????#?h5??s??U???v??l? K????????I????`?>??,G;JF?5?????T???n?D?\????@ --no=???u>3???yO?m???????n???xz??k????-???z??g ->?v?\dvI?8???&_????8'?kf?? m?M????a??f~?E??k?itO?&?S`?&1.???(???WSh?)?????{;pgJ???J????(&a?nh8B?s?? l?J??h>????????W?????{x???*??x&,G??N}?Z?-??{k?O?tPt???H?N????????6?????w?< 5????o ?R?'?i>Z??lc????~?t?[???5????W?O??g?%?"?s?Q???:?u?5?%??tS?1???o?j8???}???U$OY?Z a22?/???q??}ZT ????3C?V??Y???D?R?{???@?D?5?;:?L????!????N?!?6?"A?_???c oWh?Yp??~?d?~?XDXo,_F?????q1?vd?P:}K?^F?"???qW ??9 - ?>}:?[8~V??T?????>?K?]oJ9?Y???? S???h????????!??}C? -?*D????)??9?r}??V?Z?r??????9\ ????-Pe?g7?G)?\???1???? ?D???85t ?'???+??fj???Q*?}?E -?Q?a[%?t?^???? ???U-?+st?AX??CD?E??$???qi5?`r???zu???!?!?J?*??V???/G?^Z?0?6\????+??? ?B ???H?? &)? ?E;?K??N???3Q? ?;?+4^i2?m%>??~?? ??G=?? -?V????"?8????RVS ?P??????????t???.?aH??????r???? ?HKDD???????????`=D?aY???XN??D??w8Ld??~?H????????\ u%?i??ea?=?N}?z?(>u??+Cj0??PY????W_?>???C?&g????_?6M|????c??]`F:?`6??[???[JH%J?????U??O?|?q???&7=H??[?? -????yg ??????u???l?kn?V????|?#>PA{N????1??.H?L??M????F?NO?]??/?Sex??? P?/r|o???&b???????????&?[=e?T??????nj?????t??? D??=?[?v ?oj5????3??#C???h?????n{??j!O?Aj?1?y??-???J???????0a??*??y?a???fG+??o??i?~\??0?m{??a2?Oz8it ?Qfq?I?zV? ????O??6$??='????R????C??`?H??z@??*?>?P3?????~????E%3???? - E,* e??}??:?H8W??=???g????H???H??Q??CsHK?\D -'?6??????~VU ?????_??[??o?v?7\?1f??M????;!?K?xjy?j??%{??g?{????S?1?1f;g{???i?? -r?4 ??{7/?{????~i???jS?????FT%A?_^??.q3?2Z??+?g'??&????I2G4???&Y?7? -??2?ip???????l?+?`????8s?? F???c=+? ?|???-??KI??>?????????F???? ?????C?|?0JWNl?&???;??f??A???o^p1??4???3?,?,]?????{O?S?BLA? ???m??j???I??=??yI?{??r:?l??????o???\?{?~??????AH????u>???i?5JM.%???\????+6????h????Z???2&]/??S???#x????*?-2?W?}???P???>?E???? ?!jN????2?? -?r?B????g???3?c?f??_BM?,O??0z$L??c)???)??3??Y??"?0????wq??.???t{?IPy3??????.??g??J?a?d >?.??3???> endobj -61 0 obj << -/Ascent 611 -/CapHeight 611 -/Descent -222 -/FontName /QTEEXJ+CMTT10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [-4 -235 731 800] -/Flags 4 -/CharSet (/quotedbl/percent/parenleft/parenright/plus/comma/hyphen/period/slash/colon/equal/A/C/E/F/L/M/N/O/P/R/S/T/U/V/Y/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/w/x/y) -/FontFile 62 0 R ->> endobj -108 0 obj -[525 0 0 525 0 0 525 525 0 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 525 0 0 525 0 0 0 525 0 525 0 525 525 0 0 0 0 0 525 525 525 525 525 0 525 525 525 525 525 0 0 525 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 525 0 525 525 525 ] -endobj -107 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 34/quotedbl 35/.notdef 37/percent 38/.notdef 40/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash 48/.notdef 58/colon 59/.notdef 61/equal 62/.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E/F 71/.notdef 76/L/M/N/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y 122/.notdef] ->> endobj -58 0 obj << -/Length1 1117 -/Length2 4847 -/Length3 532 -/Length 5563 -/Filter /FlateDecode ->> -stream -x???w<\k???(? ?[t??N?????3 f?1?G?AB?%??? "$A?w=!D ???s??$???????????????~{=???24QuF9B?PH?X???R?K`Qqr^^u4?G!50P,/T?.??8?Q??R??"??Q??h??+P?#IPE@?p'$p?? -E?5?<???T=<??vx?Po(??,J?p' ?u?#???p????????X?/?@??xS??? ????Bz??P????;??0?Oq-???????]??u???_(?'E?P?P4?????????9?r????U?Y???X???K?#H-n??"|"??G?;=/??Ge???W?W8}O??c_?km?y=J=[??_? hf???????y? |???adoC???????d?????o?? 4n???ptX??udE??Zhez?FG????2?M?*??????MN?8?!??????B(?In?be?V???H??TXtG??n??????O????)?? ??3^?sa?a?l?f?$??Y?{S?Y????)?,`????t?ab?n$?*? ??u???[Cf?S^q????&i???%????????2????w!A?????T??? ??'??t?N?/??zh?*of?=???????u0???'?p??i?at ]?!????TX?k??e??^???w5???I???K????????????r???&?W??????? -???[~?t&???4b???????!9?N?Ru?????v????,9a?????8N?????p?/?M????lh??%?V)cR?t at io????Kr?Y?)??0???h??E-?7?v??TO???w??_^??J:V&A?m???????????????> ?x??A???o?o????l#?????l??-<v^???`w????e???cWH?? ? O?.F?z??h??g??Z?8P? ???&D`a6???????K'???? ??<#7??tI???Dqa? ?"????????]R_???;?wSD52?v??#???i)???????!:?o??+V??WV??p-??????e?C?ZUTOwm?e??Adp ?y? ??????k???YV{?p??[???}WU???????i?9?????i)'???d@???;???V?\e??G?D1?w???4d?l???[??:Q:?[W^?\&?Q???k????q?u ??Z?OVd??x????jh?e?V?g>?%????V?)??o?m? l|ro???rx-gs???'??z ??g??????????LJ?a?c?y??Bq?;????}~??:?#6?>Pk?1???sF-?AW?Jc?d?|????:???G? ?o)d%???J?#Z????D??zi??sq|?Y?W;|?X -(8l????AC?P?4????~? ? 1~2?.^OY??z?jf??????m??"0?le?L{.??>??|??????S??ATi~??`a??????K?]???O?????lh~?6??????4?c??xU>? -]???eiR?????@r???????K???????I?$??'7d????-X -l1???^????????`*?y?N???)[W????b????,?v?;4???4,:???}?u6?g?????8?Hr?,????Q?&??-/?j?? -Z]?-????`??j??`??:??????????o?9???????Q???$???$??????m?%???{??[????=????5[k????O??B??6?????I?F9??{Ey????;rJ?Wd??\?&Vi?&@ )&?????40?-0?w??xQ?+_;3#?????f?????O?()?vj?????e9??6 -??C u??H?I?d??}??\???$???[??dF?yT=?_[M?N*???0C$?(X\t?W?q5D?q?j?R??n????F?C??}?c?JR:?G???????R?9?;?/?+4R>?^?`P???}?A?=?@V??7?R:?0;/?4?? LeoQy-bLs??}???????????I???o3&:^?y??????^P??%J???y??;??f??S??T??????X?cw???? ? a??m?t?5O*??T?X?B????!???????9j?????B?Uej????gX?`?????\y??i????3??S???;?????&W&????eg??i??f???$??s?3%N??-?????]?O?]??w\G??w? ??????z??2kI7?EL3?d???l?zz?7;? ???i?$)??X?I/x?D5?]????~.^??????n??d?^???e/A?'???f?+}?%?G?? ~??9`?tM?2w?????kU??eD?v-????????k???h?m[????0???N?????????E?NX^"???+|?????P?kl??[t???J?e_???R?c?E???????[ ?`!T?? -Q?U??????"?5??4?G?#?[?jo??N????H???J??a???"??#??g'4 ]C? ?=J?L7F?????S????@$?D{@7?5,?g??Q?dt???o?,"%??r???m???E?6???;*?U?b??!oEu????*??s@????4?\?F?'H? ?H?/?H?IY????7$>?w?81??}~?$}JW?%?AB???(?A? -?vY??8I?h?)H??????jj???5???9?a?{???4.??_Z??????? U -z>1.?j?Q.q?@bQ_^m#:??i????l??Y\?%?*???&??B>??#??R??7l=?D J?8?K??>???_?"??s?i?}R?"s=0? G??????Q?;i[?]????o?R??R?y*???&{}??j???pW?8gv?u???U???A?? -Q ??X!??[???2??&?"&??????pk?_???q???8$??????6?o=?^??F?*.f?G5 -???? 9?C?8W?6????? ?????????????!??u at cP?;??2?endstream -endobj -59 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 109 0 R -/FirstChar 70 -/LastChar 122 -/Widths 110 0 R -/BaseFont /DUUZPU+CMBX12 -/FontDescriptor 57 0 R ->> endobj -57 0 obj << -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /DUUZPU+CMBX12 -/ItalicAngle 0 -/StemV 109 -/XHeight 444 -/FontBBox [-53 -251 1139 750] -/Flags 4 -/CharSet (/F/G/H/I/O/P/S/T/W/a/c/d/e/f/g/h/i/l/n/o/p/r/s/t/u/y/z) -/FontFile 58 0 R ->> endobj -110 0 obj -[707 884 880 419 0 0 0 0 0 845 769 0 0 625 782 0 0 1162 0 0 0 0 0 0 0 0 0 547 0 500 625 513 344 562 625 312 0 0 312 0 625 562 625 0 459 444 437 625 0 0 0 594 500 ] -endobj -109 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 70/F/G/H/I 74/.notdef 79/O/P 81/.notdef 83/S/T 85/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c/d/e/f/g/h/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 121/y/z 123/.notdef] ->> endobj -46 0 obj << -/Length1 1686 -/Length2 11515 -/Length3 532 -/Length 12471 -/Filter /FlateDecode ->> -stream -x???eT???hq ?4????wo?-8 ww????w????????;9??|???f???jU??????? -J?????@1['zff???"3????I??\?h?dnk#b??0ss??????_v6vr??????????J???$N??5????? k?d??ad`P?52:?1????p(?. at cff?????hjn????????-??_acg??r:8??TkR@???6Vnc? ??-???C??s???3??k????? ?????;????? ???5:??g??_n?@csg???t2?27?1???2w3w+?;?L ????6??)??? -??? -?r??????? ?m?????Y??????7???`? -?b???z??'???%jcdklnc -`a?88?!?N???sc?+? -fd??uM?z?0?u@?kCA{?h?w?_?B??? ?h?l?46???N?3???#?fc0?8m??&D??;?????????????????;????? h?;??*kk?;?`t:????lm??0;H????qv?????? PiGP??aPaG??u???????#??W????G9 at 3?V?7q???o???8A?b? d(??@?"??@}??M? -2? d)??@??!.P??ZS?7??T?M?n(?&???????9?????????q?D H???)c????/ ??:? H???????v??? ??da??4?#??d??A? H??i??? ???????6??Y9?? +??d???Gd??????@???????!![Wz???1??fn7???e9;??D???t????lb???@W?????o?Eb}P??h?D 4 ??iC?\M?t??B4?U???=?j??ci -?.?.??g|??????????G%????????7??_????????????\???O???i?????e+P?(????ui??v?pp???X?| ??`%VDM?/f??? j\ ??qo?op?????????pY???wX?hF?D???4??{??Ey?PQ??z+R?J?]?%8?aI? ???tw??:??.K^}a1dO?62v#? ?4?t??????~??6??v`??VI??V?@c??]???i??????i?????~^???W?f??q? q????1W?O?DR?w??2"&? ?wA??`6??P*?7^,^??K?1?? []??????????????q??K???)???I??????Aa???????=r?/!23????:???_???g?9?$??U?"??&?V????4?n|n??j,Z1qe????&? lU<??'jF??G?#??????Sxl???Vv?vo}2??V;o??q??cq=m??y??({)t??#L?|F?????????????s?3W?SH???f?????;????j?[`J??!f?:???U?7?cW??}?f??q!U~????2?=^?B??_?G??3a?@?5]?;Z???['??????U???\N??F? d??q????????.?6?a??G??9A??)vOh?aw^?#??&g|?%??YVq?O,N?? ?5???H-7p???*?"?D??????;??KYKw?T?1????K?N?[?r #??~Ym ???5??T???Ll?Q?????%?????? -???px ???0D?UOw;?&??9???Ga!?? ???0??Cf?I?Y??y?T)?=?z1????5?m?0LO??N?(L???;???-???i???z???g~J??+?|???Q9 &?EOC???T0 :e{?v??]?1j??{???????Q?J{??SK?0?O?=lL?x3l??)[?w\??k??!'??a???{?%x?-cgN???????8??|)???o?u?}???>?+%N' h4?amy?$?n??h?;N???\??,E ??????h?4? ???Y?/6?{??*??o'????-(?C?i??;??A3?*r??G?Y?K???lv??\?e??R????OB?????LxW?lA8"??*?R^?s??T??UX?_d???}??2?n?c?7???o??*?~-yEu+Zjpt?Q>W? T???????4;?y???? -??!^??????p???Rx?N`?\??%?[?O??%7j????? ?????Q??????'>????_\?/?8aG??C????(9?uUwUo?[dLgyMrK;?\0?7??1?2fm???&?R?t??P??7????W?????%:?%-?? j\?*A??%??3??4?(m?? p??puz??T+?eV?4u?H??? ?P? Z?{O?? "???Q4?[?????W?|I??A??Z?`?"k?Y?D]? ?????8????????k-?????E=?E?$??|?T?W???,?F?G??+K?x{if?J2c??#??s?????N?O??????? -%???F?i??ZV???1??????????? -??6G_[?{?L ??.?l??g??%LC -??S cN??wH?!??f????<*??E???x??9?v?l?7??. S????N???b-?N>?M??#&Q/(;??sj?L?F?v??d?G?F??*?7???)?M05?9?`u,q -?3? ^ kXAX`??i?j{?? ??+??8?+??x??Ie?u^'???%?>??????????bIq?d???????\<%???/???>?l???7F??0???Qr/t?sy??xS8??@????? ?d$ ??l%??g&]????????$?e!???m?b?1j~y??2???#?;??t??4???d\??H???? ????:Fq??A???=?????BlTJ&?N??!8??,??N?g ?Dg??k?i?x?n>Zi?z%s???N???ON?>???"?o-?6?*%?%??iU?`Id?? c ???????????e?[?t??< ?)]???w???????tw?v?????p?"??R6p????1?:????l?*?_?MU??F$?>l>?1T??nYU????????4;???/v???/?E????*?&????R(?!'?L??????`K?gC????E\???@??<0V&??)?$???:t??>????^w&Z???|9?<2?=?a:???@wzL?i?-?V??????(??????UQ?+r ?}??Cs?K??;`?0r1???????0????i|n?6r?HOl6~^?+?i,??53?Vo?1???w?,?7T"?????m?????? ???U_???#U ??? ?s???s? H??>??}???/*??g??X?4?-\? ??l??????????,v????G?2[q?e?? -??????$? ??Gy???[?????]??T??]?'?Vt l`e?|M?:??dU??? ????HY -???=? -}-?Q??+F? 9muR???P?U?_???V?-??_? V??>??3???w/ ?s??Z??? x[?Z\?????a????4j:???;)b:?,??V?O?v?i9y?%?c:???)%z???0 G????m2?,h?s??H?~rz??H7?RJ???????S???(g???*h????N8???efj{??]???i9?????Y?T????;??.?g_N??????????lz?????aY2k??H????ka(#9t_g??t?Y????V???y?????nkL???i????T?5yJbb??? )????????/? b#N???"h???cy????z?????6?=??/[?+??X????x??3[a?RU>???Z??A:O?C@?8ot?C0e*|=?=???00?=??>}?M0A?????D]?l'????E?J??/??_????Lg?*?O?_:???1??y?g???*?ZA?7Q^???U_?w/?)*??DXZ????Z b?/1?????wF\?iphdq?wf????d????p?O7R>[A??`??????9s{u?????t?? ????#?????w"?V?&r?J??@?7?:}uA??>(??s?Hk??o ? -???.s?I`m??K?<4?W?M?X?v??6?? ??_???X??g??r?c#?????p?Hc?6?v2?d&?gD7?xR?????E??????Vu?E??Q8i?? i?a|??? .?((?J????r&Q ???*??"n U?8 FVb?P? =6??u?[?Z*?y???W?Ug?????9O?%TY??4F&vof-???? ????*R????r?[????????N?r%6?[o?????O??)r???~|?Z9???????? ??`??o{6???-?w?z???H!C??j??{M?VZ;[?!????_??=k?f??P?3lRjs?G}??8e???V?F??+S ?w?"????p?)Bj*???????R]H?????dTt}???9F3?t ??;$?3,Uh?????)???I?c? M???????h??w5?bdL???S?????????H?V|Fw?????UB????3?y?Oi??_???R??/*?gC??????g?!Xe???\j?H?1?N~??A????R+??????/OO?/????5?hA??xt@??x3?1? -?????-bx8?O\??c0T????????%X??UE??J?#=?????^?t?~?O???Bg?)?H?<$???M?i]kP??????9c3v????b|?C????mz6?3b?K-??L????~OzH?.>n????S!$???D?.????? 2? ??.???^?\? *4=???%??(??b????!G,?!????G????Ff?7??}Y)?????ESHIT`?? ?F???????"??->| ??N?v??[95????? --??y????'?2?^pG?TL?w ?????WO& v?-m???L?????'??]%??>? ?N???g???gtry??M?"?)??.????1????(????????O(??(?&??=?G?????]?1????J?L?Hq)????c?c?s???????e???2c??]SgN?"?v?????=? ?Z,*???aq#?>7??X???y??????j^M/K??[x???U??B'?_????B??]??p???t????e???n?~?A&??B:???-_|???K0`??????@?8???>g??p??:???-{?vw$??S???k2C?g???k&^?Au??????87x4E??h^?W???0??????5??I???H????,?\??C????K??????f?o???\?5??G??n?f?n ?.??P???NX?]??V"j$W?pFRWNs???e~@cb{o?RM?'_w? ?OF?????? ?h? ??{MLy?6?H?Y{H?N? ?kQ?~ -'????a?drT4t???s?f?u*"0?JP??d?????<:???il?F??h???I???k???d??7???????*|?X??*S????N??a?d>??V??5|?@?~Rk?4{???(?s???)?r???_=?jl~W + C\??,$???????7b{??Y????3T?????D~?????X?#9?????? ??Qav;?M????U??t????*?mM7-#?g?Q????7??;q|;7[$??????~????VOy?=???F?pam=1???0g?]>???N??W??&????Wc??H?I\?????g???D??BI?g?.?????)'?b??0?D??&?+V?!>?????`??d?,NE??-l??(??8f???EoH?'???C????Q????;????????VZ?J;?C??<9?"5?`???f?y0????f2??k?G}??U?4V?????au???C????mA??V?m#;??8?s%*??N >?S?j_j?-RJ???????U?03???`meA???w?YaPU?????C?/?????k?j?@????E& UQ(????B?W?^??^[????" ?/????R???2 -z?e7?r,?,e?q???i?ne0K???YI?J??O -? 7=??x?????cy??o?^????D???i?N?a???%?y????=/????? iX?l7??W?p????????)??,1?#-?m??Ta%se?IT?v+?????????^?q???yT-f?yv??{x?(???68??[h?????3?s??????????*q?????O}s ??/???(Fv???7?`??????????b- ? t?HG?h^?W?4?s?, ?????R+???????~54???VPYQ??D??4Le?*??5?VZs(?(??J?49??^hAaQ???s????PUD???_'^?????f##?K???????3v????o???d?X??4???%?b??????u:?????+???H?????????:mV=?(?????I)?Zpe?} -"4si a?za??????B??*a$e??U?`/?M,U?a??q]??b?!s??a???{?=c??-f??? ?t'???1?9?~H#???y?????E?4"?G??z 3=?'?V?(I?????9 Rk????k6???'??????|?(D??????aS,)R??z?s??{V??U????9 -T .?v??I?VVp?g???0???W?cqz ??u?~^?@?x?!S????9>?M??A?x yg`~???/f?c??S0????A??A???M???{* ????8????D??~?$b\??-?? ??Yr?A:5????U???????? ?:+??)??7?K?????cS r?!5#? =? ??M????k?R8????[?E???? ?{F??L??????? -Qz?u????.?l??nAT?????E?7???????6K?d3?> endobj -45 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -194 -/FontName /CMPONM+CMR10 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/FontBBox [-251 -250 1009 969] -/Flags 4 -/CharSet (/ff/fi/quotedblright/quoteright/parenleft/parenright/plus/comma/hyphen/period/zero/one/two/three/six/seven/colon/semicolon/A/B/C/E/F/G/H/I/L/N/O/P/R/S/T/W/quotedblleft/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) -/FontFile 46 0 R ->> endobj -112 0 obj -[583 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 0 778 278 333 278 0 500 500 500 500 0 0 500 500 0 0 278 278 0 0 0 0 0 750 708 722 0 681 653 785 750 361 0 0 625 0 750 778 681 0 736 556 722 0 0 1028 0 0 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 0 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] -endobj -111 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 54/six/seven 56/.notdef 58/colon/semicolon 60/.notdef 65/A/B/C 68/.notdef 69/E/F/G/H/I 74/.notdef 76/L 77/.notdef 78/N/O/P 81/.notdef 82/R/S/T 85/.notdef 87/W 88/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] ->> endobj -43 0 obj << -/Length1 1041 -/Length2 4846 -/Length3 532 -/Length 5537 -/Filter /FlateDecode ->> -stream -x???e\????i ?Sj?rhI?AaH?a?!f`$$D?n?JD?NAii%?D?%????}={????u?k??zx8?A?U???0 $-,&"&P?????DDEUIyx?P04?P?A??b??? ?-v????$?DA?<5?? -????? ?J????Pp? ?A;?\?P ???>"???C? ?f'B*&??C?[?A -??Ia?H?#l?????G0?????M????????????`X/???]\???E??????J????+????HW7O4 #?`(??????aN???h?m\?P?? ???C? ??GC?6.??q???-` ??????????????=8m????????,?7c???{,D???&b??,?m?;(??p?K?6(??)??`I -?'?#?`??7?1P?Dc??%y ?G?H5T?a{????I?*?4??7????????` ?a? ????DE@??P ??????( :??XC?????o??????????b?Q V????b???7?c?}~??[U??',?=?????/%I??$????z?P0?????5?b{8???`?0(??$*??R^p?`??PW??M?????-d!?q?.E?u??k????i?W W????=??? 5?????N\?>?^M?md6?K???q?|?h??????;6??4??eO?N???{??Fk?>s?tX?????L?'? p? n??i??I}V@??pi?s -%?????t -Mvc??R????:iaY???????????C``%s????[?j?^?G??????-????3+|h? ??V|gr:?z??Q?z)-e?n???VH????^? .????2???lk? z?????4[?}? ??}Yy?4?T?~ ?????V?\npx\???T5??e?s??/???????O???t^??H4?!ws??????2?;?t?????#?????HM?EX?s???X at 2??a?"?m???g?? -? w? ?(??G?$?^??^ 8a ???v?"{? -???|???p?W??o{? bQ[??/?{??Qm?n???!??Z???x?<???^??L??}?J?lP?dN~{F????m??w?RE?? @???W??}&??O$8????D??.?_'mSZy?cx[?;Z?=?FBq?9x~ ??N?=?Y?M?~?zL at I?? 1???[;v?????????? ?W?XT ?&=2?????E?[v?????X????b$l9?Kux?y?g?>?:?"?V? ??????????^'??F&????|???rzK'??? -B?=q nE.V?j? ?Nuj5?b??n%X{$?`??????"????i31?d?.? G??f?4?<J=]?^?1???3M? ??,P????Vn?P????????B?)??????n;z|???p?????Sg??h???8]?? -?h??p??????????+>?$$6???@??w?e>?8????>???????%?@??N?$Bd_??f?~?4???[?kj?m?C??mM???g?3?}X;??0??:?3XK???v?'??q??????go??)?2f????Y?zH??m?????]??{`???3??D??4?????G??$??N???-????o0?G??T}L?Je???O?i7?t???8[_?????s??????e??R?? r???}d????\Xr?p!&????&?UW2]??C?D?^2>9??F??A*?|?6C7?2??k????I$|?wI?KH#?t?X?,uQ??)?.?=0?4~?n?y??/|:?????U??V??sq&? ?R??#?U????]?=?????s??W??E4+O??? ??]fo$?FN$?c?;???8 at -a?i???DA?HL[?t??=??e?]Na???L2.??????Qb5"?? ???uX??????G?|c$?)lN??J???K)OR?h?!??gJ?[?~3?OYy???V?m???,???]?\?????M??|k?r?d??A????2?)??@????^k??, ??????h??4?)X?R? -:??? X???=???}p?-?W3?5?xX?{-?e?`?.?=??????:g??u????$p?ca??6??Jd?W~H?{n?|?2??z%W???v???%??>????(I?7K?p8??\??p? ?PVk?69?fy??.S?q???????^w?xa???3??????yl?p=????/??b]??|???(|???????? 9??O> @???~.q6G??????`._?? ??U$?7? ?C??y|07?bT;??C???1V???????2I .?V{|yc???F?????%?z????AO?%c????r?x1???????r?F????m<????c?;&?QVs???d??Y???+Y?s7?+q????w?L=?.?{??????hr?@2??L???s????G???T4 ??rF??mT:tc?'e+??odbO?????#V????{B?A?#?+.?.`?&bj??w?6?O?3???v?l??????'??)U????'???1R?=?JN1?Z??_O????A?b?_?y? gk?"??????a"X?^????h?K{?????????b? ??M??M\g?S+?/S?7???? ?f??a???Kq?oe?/????k???g+?N9??g??????Z\???3RN2??-WT???????>?DTF ?>=? ??KieS??#] ???Z?&??|??:2n??3V(???%<8+U5?J???5A+?q?????Lb?`??c?3?4?? }??1T??????!?F????)W???>;BL?T???nn?e^{???__QiQH*?)??j?=p??????w.??FgT[&1????<^?V????z?????????iW;?'?b??#?z? #5??wJ?t?zUv??????lFM?tm?????^?%???Uc|???????SZ?_+???s?Y???'w ??????y??g;?8U?$?>'??mr? ?m?K;???]?????Vp|`?t?K7???j4 ??G2Aj#_??????,W/u??TL -K?OG[?ob????????1l -4?]??!????u?Awm??LnG???n?Us-;[?Mz?x???:3??? uZ?.?w????Y??WNI~?q^?3?]???(??be?}s?(?O??"?^???|??*@ ???a5???j???wn???M??:9?eY\Mn?iw?|??7i?Zs??:???y??rC?,?{?E]X~[DHb?V??D:?5?u???f7?)f????C?c?xU??3?n7W,R?N??J???%?????|??"?*?ZO ??m?I??F+??FS?.???>ZO??J/z!6????^{??h??j???X,dh_I{}?V!_\?D1"x(-?x0????????U3~h`??t??G?}??p? -?????Jb>>k?~????w+??????nRo?KQTz=1"?Xq 69P??? ?u?t????7???N?io?? ??M????x?E?{Cj}?8?k?????!???P? -?t?A9??[? ?endstream -endobj -44 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 113 0 R -/FirstChar 46 -/LastChar 121 -/Widths 114 0 R -/BaseFont /YZLJTK+CMBX10 -/FontDescriptor 42 0 R ->> endobj -42 0 obj << -/Ascent 694 -/CapHeight 686 -/Descent -194 -/FontName /YZLJTK+CMBX10 -/ItalicAngle 0 -/StemV 114 -/XHeight 444 -/FontBBox [-301 -250 1164 946] -/Flags 4 -/CharSet (/period/A/C/D/I/S/a/d/e/f/h/i/l/n/o/p/r/s/t/u/y) -/FontFile 43 0 R ->> endobj -114 0 obj -[319 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 869 0 831 882 0 0 0 0 436 0 0 0 0 0 0 0 0 0 639 0 0 0 0 0 0 0 0 0 0 0 0 0 559 0 0 639 527 351 0 639 319 0 0 319 0 639 575 639 0 474 454 447 639 0 0 0 607 ] -endobj -113 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 46/period 47/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 73/I 74/.notdef 83/S 84/.notdef 97/a 98/.notdef 100/d/e/f 103/.notdef 104/h/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 121/y 122/.notdef] ->> endobj -40 0 obj << -/Length1 933 -/Length2 3180 -/Length3 532 -/Length 3819 -/Filter /FlateDecode ->> -stream -x???y???~q?????]e5?I`#???{??T?%????Y?>?{???'?h??-r?~`Bl??4??6i??[??6??F~??k?S?yw???????r??9??);A??{??J3?RU??q?q?P???Gz?? -a???+XJZ?j?????y?`LT??kM?_>??.}??L?t??Dz???@????2R????:x???(a????!?a?NI?????ra??G_??P? ?F3?c??+6|??k????}??y????P???S?B?????????4????}??2+?"3???!P?xB??o???>?~?W??;r????Q???[???~ao -J?EZ?bC???77?p???z??vX???L|???ix????s?o??/?Z????????K???a?V???@_?K 8?zA?2?^????/???*?=k,t?\??G???Kml??:$?'{?z&tk?gN?? (???#?a:A?I???*[????#??+1 O???????????j??:?r:$p????M????grC??rd?k/?m?L??b??p??g??Y?>?[F% ??{r??u? z6?d??????>Y -?=,2?iM3??.?x;?ja\?zCmn?z????Q??Sw?q??\S?Q?????|?Q?v?????Z???I?????u?Nv??? ???4E??D??????????+?rj?`N?A??{?????G?????1;?I????Hc?? {?O]=O?O{??Ib'w??j??k???C?Ax??:;?????<2?"?????,?/??B3? .???6?#?V?8?V???8"??????-???e&(? .CgMQQub?(???W}?Z?R~??"[????K????6d?F\3?????AE??A??6?E/???ZJ??K???S??1?&?Ve?=??P?io at BV???X5^??#LR?qn?????????ll??=??Y?U???`]rr?\?t??????[z?y? ???$?L;?l? ?TWi>b?8????q???EcA?i??O??FW  %??Fe_?M?O5?n??????+??3?Z?~(?????J????????T?u?>K;0,???mf??P?z?P?{L.M??c???Bk????9v???RK?u?mV?????8???w??=?'?o?M???K??,/? ?WC@?h??_/|??e??TNN?n?y????,m??|???f"?,%??v??????P??H?????f??V? ?bw?&??????3????????????& -?fC[}??????gh?????<?????p?????kB???5A?????f; -???2$b[i]{??%yL?yHd_??Rc????3)?P]N?????`?????????????\) ???\?6???*WJ??y???v??E(!n6??b @`???oQ??>?????!?( -??????? ????endstream -endobj -41 0 obj << -/Type /Font -/Subtype /Type1 -/Encoding 115 0 R -/FirstChar 46 -/LastChar 121 -/Widths 116 0 R -/BaseFont /PHUSNY+CMR17 -/FontDescriptor 39 0 R ->> endobj -39 0 obj << -/Ascent 694 -/CapHeight 683 -/Descent -195 -/FontName /PHUSNY+CMR17 -/ItalicAngle 0 -/StemV 53 -/XHeight 430 -/FontBBox [-33 -250 945 749] -/Flags 4 -/CharSet (/period/T/a/e/g/h/i/m/n/p/s/t/u/y) -/FontFile 40 0 R ->> endobj -116 0 obj -[250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 668 0 0 0 0 0 0 0 0 0 0 0 0 459 0 0 0 406 0 459 511 250 0 0 0 772 511 0 511 0 0 359 354 511 0 0 0 485 ] -endobj -115 0 obj << -/Type /Encoding -/Differences [ 0 /.notdef 46/period 47/.notdef 84/T 85/.notdef 97/a 98/.notdef 101/e 102/.notdef 103/g/h/i 106/.notdef 109/m/n 111/.notdef 112/p 113/.notdef 115/s/t/u 118/.notdef 121/y 122/.notdef] ->> endobj -69 0 obj << -/Type /Pages -/Count 3 -/Kids [34 0 R 75 0 R 87 0 R] ->> endobj -117 0 obj << -/Type /Outlines -/First 7 0 R -/Last 31 0 R -/Count 7 ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 117 0 R -/Prev 27 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 117 0 R -/Prev 23 0 R -/Next 31 0 R ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 117 0 R -/Prev 19 0 R -/Next 27 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 117 0 R -/Prev 15 0 R -/Next 23 0 R ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 117 0 R -/Prev 11 0 R -/Next 19 0 R ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 117 0 R -/Prev 7 0 R -/Next 15 0 R ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 117 0 R -/Next 11 0 R ->> endobj -118 0 obj << -/Names [(Doc-Start) 38 0 R (contents) 48 0 R (contents.0) 6 0 R (introduction) 56 0 R (introduction.0) 10 0 R (page.1) 37 0 R (page.2) 77 0 R (page.3) 89 0 R (section*.1) 49 0 R (section*.2) 60 0 R (section*.3) 68 0 R (section*.4) 81 0 R (section*.5) 85 0 R (section*.6) 90 0 R (section*.7) 97 0 R (testing-header-files) 70 0 R (testing-header-files.0) 18 0 R (testing-organization) 67 0 R (testing-organization.0) 14 0 R (testing-python-scripts) 73 0 R (testing-python-scripts.0) 30 0 R (testing-source-files) 71 0 R (testing-source-files.0) 22 0 R (testing-swig-interface-files) 72 0 R (testing-swig-interface-files.0) 26 0 R] -/Limits [(Doc-Start) (testing-swig-interface-files.0)] ->> endobj -119 0 obj << -/Kids [118 0 R] ->> endobj -120 0 obj << -/Dests 119 0 R ->> endobj -121 0 obj << -/Type /Catalog -/Pages 69 0 R -/Outlines 117 0 R -/Names 120 0 R -/PageMode /UseOutlines -/OpenAction 33 0 R ->> endobj -122 0 obj << -/Author(Bill Spotz)/Title(Testing the numpy.i Typemaps)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() -/CreationDate (D:20070815133933-07'00') -/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) ->> endobj -xref -0 123 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f -0000000009 00000 n -0000004918 00000 n -0000068971 00000 n -0000000055 00000 n -0000000081 00000 n -0000005100 00000 n -0000068885 00000 n -0000000131 00000 n -0000000162 00000 n -0000005283 00000 n -0000068797 00000 n -0000000221 00000 n -0000000260 00000 n -0000009560 00000 n -0000068709 00000 n -0000000319 00000 n -0000000358 00000 n -0000009743 00000 n -0000068621 00000 n -0000000417 00000 n -0000000456 00000 n -0000009926 00000 n -0000068533 00000 n -0000000523 00000 n -0000000570 00000 n -0000015244 00000 n -0000068458 00000 n -0000000631 00000 n -0000000672 00000 n -0000003039 00000 n -0000005405 00000 n -0000000722 00000 n -0000004735 00000 n -0000004796 00000 n -0000067649 00000 n -0000063552 00000 n -0000067490 00000 n -0000062802 00000 n -0000056985 00000 n -0000062642 00000 n -0000055699 00000 n -0000042948 00000 n -0000055540 00000 n -0000004857 00000 n -0000004978 00000 n -0000003232 00000 n -0000003389 00000 n -0000003554 00000 n -0000003719 00000 n -0000003884 00000 n -0000004057 00000 n -0000005039 00000 n -0000042249 00000 n -0000036406 00000 n -0000042089 00000 n -0000005161 00000 n -0000035195 00000 n -0000025299 00000 n -0000035035 00000 n -0000004223 00000 n -0000004393 00000 n -0000004563 00000 n -0000005222 00000 n -0000005344 00000 n -0000068311 00000 n -0000009499 00000 n -0000009682 00000 n -0000009865 00000 n -0000015183 00000 n -0000009987 00000 n -0000008777 00000 n -0000005522 00000 n -0000009438 00000 n -0000008928 00000 n -0000009096 00000 n -0000009267 00000 n -0000009621 00000 n -0000024981 00000 n -0000023594 00000 n -0000024822 00000 n -0000009804 00000 n -0000015366 00000 n -0000013476 00000 n -0000010092 00000 n -0000015061 00000 n -0000015122 00000 n -0000013664 00000 n -0000013834 00000 n -0000014005 00000 n -0000014175 00000 n -0000014345 00000 n -0000014515 00000 n -0000015305 00000 n -0000022703 00000 n -0000015484 00000 n -0000022544 00000 n -0000014685 00000 n -0000014869 00000 n -0000023244 00000 n -0000023002 00000 n -0000025212 00000 n -0000025188 00000 n -0000035876 00000 n -0000035578 00000 n -0000042679 00000 n -0000042498 00000 n -0000056475 00000 n -0000056110 00000 n -0000063259 00000 n -0000063045 00000 n -0000068074 00000 n -0000067874 00000 n -0000068384 00000 n -0000069043 00000 n -0000069750 00000 n -0000069789 00000 n -0000069827 00000 n -0000069955 00000 n -trailer -<< -/Size 123 -/Root 121 0 R -/Info 122 0 R -/ID [ ] ->> -startxref -70256 -%%EOF Deleted: trunk/numpy/doc/swig/testing.txt =================================================================== --- trunk/numpy/doc/swig/testing.txt 2007-09-13 17:53:08 UTC (rev 4033) +++ trunk/numpy/doc/swig/testing.txt 2007-09-13 21:43:16 UTC (rev 4034) @@ -1,173 +0,0 @@ -============================ -Testing the numpy.i Typemaps -============================ - -:Author: Bill Spotz -:Institution: Sandia National Laboratories -:Date: 6 April, 2007 - -.. contents:: - -Introduction -============ - -Writing tests for the ``numpy.i`` `SWIG `_ -interface file is a combinatorial headache. At present, 12 different -data types are supported, each with 23 different argument signatures, -for a total of 276 typemaps supported "out of the box". Each of these -typemaps, in turn, might require several unit tests in order to verify -expected behavior for both proper and improper inputs. Currently, -this results in 1,020 individual unit tests that are performed when -``make test`` is run in the ``numpy/docs/swig`` subdirectory. - -To facilitate this many similar unit tests, some high-level -programming techniques are employed, including C and `SWIG`_ macros, -as well as `python `_ inheritance. The -purpose of this document is to describe the testing infrastructure -employed to verify that the ``numpy.i`` typemaps are working as -expected. - -Testing Organization -==================== - -There are three indepedent testing frameworks supported, for one-, -two-, and three-dimensional arrays respectively. For one-dimensional -arrays, there are two C++ files, a header and a source, named:: - - Vector.h - Vector.cxx - -that contain prototypes and code for a variety of functions that have -one-dimensional arrays as function arguments. The file:: - - Vector.i - -is a `SWIG`_ interface file that defines a python module ``Vector`` -that wraps the functions in ``Vector.h`` while utilizing the typemaps -in ``numpy.i`` to correctly handle the C arrays. - -The ``Makefile`` calls ``swig`` to generate ``Vector.py`` and -``Vector_wrap.cxx``, and also executes the ``setup.py`` script that -compiles ``Vector_wrap.cxx`` and links together the extension module -``_Vector.so`` or ``_Vector.dylib``, depending on the platform. This -extension module and the proxy file ``Vector.py`` are both placed in a -subdirectory under the ``build`` directory. - -The actual testing takes place with a `python`_ script named:: - - testVector.py - -that uses the standard `python`_ library module ``unittest``, which -performs several tests of each function defined in ``Vector.h`` for -each data type supported. - -Two-dimensional arrays are tested in exactly the same manner. The -above description applies, but with ``Matrix`` substituted for -``Vector``. For three-dimensional tests, substitute ``Tensor`` for -``Vector``. For the descriptions that follow, we will reference the -``Vector`` tests, but the same information applies to ``Matrix`` and -``Tensor`` tests. - -The command ``make test`` will ensure that all of the test software is -built and then run all three test scripts. - -Testing Header Files -==================== - -``Vector.h`` is a C++ header file that defines a C macro called -``TEST_FUNC_PROTOS`` that takes two arguments: ``TYPE``, which is a -data type name such as ``unsigned int``; and ``SNAME``, which is a -short name for the same data type with no spaces, e.g. ``uint``. This -macro defines several function prototypes that have the prefix -``SNAME`` and have at least one argument that is an array of type -``TYPE``. Those functions that have return arguments return a -``TYPE`` value. - -``TEST_FUNC_PROTOS`` is then implemented for all of the data types -supported by ``numpy.i``: - - * ``signed char`` - * ``unsigned char`` - * ``short`` - * ``unsigned short`` - * ``int`` - * ``unsigned int`` - * ``long`` - * ``unsigned long`` - * ``long long`` - * ``unsigned long long`` - * ``float`` - * ``double`` - -Testing Source Files -==================== - -``Vector.cxx`` is a C++ source file that implements compilable code -for each of the function prototypes specified in ``Vector.h``. It -defines a C macro ``TEST_FUNCS`` that has the same arguments and works -in the same way as ``TEST_FUNC_PROTOS`` does in ``Vector.h``. -``TEST_FUNCS`` is implemented for each of the 12 data types as above. - -Testing SWIG Interface Files -============================ - -``Vector.i`` is a `SWIG`_ interface file that defines python module -``Vector``. It follows the conventions for using ``numpy.i`` as -described in the `numpy.i documentation `_. It -defines a `SWIG`_ macro ``%apply_numpy_typemaps`` that has a single -argument ``TYPE``. It uses the `SWIG`_ directive ``%apply`` as -described in the `numpy.i documentation`_ to apply the provided -typemaps to the argument signatures found in ``Vector.h``. This macro -is then implemented for all of the data types supported by -``numpy.i``. It then does a ``%include "Vector.h"`` to wrap all of -the function prototypes in ``Vector.h`` using the typemaps in -``numpy.i``. - -Testing Python Scripts -====================== - -After ``make`` is used to build the testing extension modules, -``testVector.py`` can be run to execute the tests. As with other -scripts that use ``unittest`` to facilitate unit testing, -``testVector.py`` defines a class that inherits from -``unittest.TestCase``:: - - class VectorTestCase(unittest.TestCase): - -However, this class is not run directly. Rather, it serves as a base -class to several other python classes, each one specific to a -particular data type. The ``VectorTestCase`` class stores two strings -for typing information: - - **self.typeStr** - A string that matches one of the ``SNAME`` prefixes used in - ``Vector.h`` and ``Vector.cxx``. For example, ``"double"``. - - **self.typeCode** - A short (typically single-character) string that represents a - data type in numpy and corresponds to ``self.typeStr``. For - example, if ``self.typeStr`` is ``"double"``, then - ``self.typeCode`` should be ``"d"``. - -Each test defined by the ``VectorTestCase`` class extracts the python -function it is trying to test by accessing the ``Vector`` module's -dictionary:: - - length = Vector.__dict__[self.typeStr + "Length"] - -In the case of double precision tests, this will return the python -function ``Vector.doubleLength``. - -We then define a new test case class for each supported data type with -a short definition such as:: - - class doubleTestCase(VectorTestCase): - def __init__(self, methodName="runTest"): - VectorTestCase.__init__(self, methodName) - self.typeStr = "double" - self.typeCode = "d" - -Each of these 12 classes is collected into a ``unittest.TestSuite``, -which is then executed. Errors and failures are summed together and -returned as the exit argument. Any non-zero result indicates that at -least one test did not pass. From numpy-svn at scipy.org Thu Sep 13 23:46:01 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 13 Sep 2007 22:46:01 -0500 (CDT) Subject: [Numpy-svn] r4035 - trunk/numpy/core Message-ID: <20070914034601.8FFFE39C103@new.scipy.org> Author: charris Date: 2007-09-13 22:45:59 -0500 (Thu, 13 Sep 2007) New Revision: 4035 Modified: trunk/numpy/core/fromnumeric.py Log: More documentation. Modified: trunk/numpy/core/fromnumeric.py =================================================================== --- trunk/numpy/core/fromnumeric.py 2007-09-13 21:43:16 UTC (rev 4034) +++ trunk/numpy/core/fromnumeric.py 2007-09-14 03:45:59 UTC (rev 4035) @@ -112,7 +112,7 @@ *See Also*: - `numpy.ndarray.reshape` : Equivalent method. + `ndarray.reshape` : Equivalent method. """ try: @@ -156,7 +156,7 @@ *See Also*: - `numpy.ndarray.choose` : equivalent method + `ndarray.choose` : equivalent method *Examples* @@ -200,7 +200,7 @@ *See Also*: - `numpy.ndarray.repeat` : equivalent method + `ndarray.repeat` : equivalent method *Examples* @@ -844,7 +844,7 @@ a : array_type axis : {None, integer} - Axis over which the sums are taken. If None is used, then the sum is + Axis over which the sum is taken. If None is used, then the sum is over all the array elements. dtype : {None, dtype}, optional @@ -860,20 +860,24 @@ *Returns*: - Sum along specified axis : {array, scalar}, type as explained above. + Sum along specified axis : {array, scalar}, type as above. If the sum is along an axis, then an array is returned whose shape is the same as a with the specified axis removed. For 1d arrays or dtype=None, the result is a 0d array. + *See Also*: + + `ndarray.sum` : equivalent method + *Examples* - >>> N.sum([0.5, 1.5]) + >>> sum([0.5, 1.5]) 2.0 - >>> N.sum([0.5, 1.5], dtype=N.int32) + >>> sum([0.5, 1.5], dtype=N.int32) 1 - >>> N.sum([[0, 1], [0, 5]]) + >>> sum([[0, 1], [0, 5]]) 6 - >>> N.sum([[0, 1], [0, 5]], axis=1) + >>> sum([[0, 1], [0, 5]], axis=1) array([1, 5]) """ @@ -893,8 +897,48 @@ def product (a, axis=None, dtype=None, out=None): """Product of the array elements over the given axis. - Blah, Blah. + *Parameters*: + a : array_type + + axis : {None, integer} + Axis over which the product is taken. If None is used, then the + product is over all the array elements. + + dtype : {None, dtype}, optional + Determines the type of the returned array and of the accumulator + where the elements are multiplied. If dtype has the value None and a + is of integer type of precision less than the default platform + integer precision, then the default integer precision is used. + Otherwise, the precision is the same as that of a. + + out : {None, array}, optional + Array into which the product can be placed. It's type is preserved and + it must be of the right shape to hold the output. + + *Returns*: + + product along specified axis : {array, scalar}, type as above. + If the product is along an axis, then an array is returned whose shape + is the same as a with the specified axis removed. For 1d arrays or + dtype=None, the result is a 0d array. + + *See Also*: + + `ndarray.prod` : equivalent method + + *Examples* + + >>> product([1.,2.]) + 2.0 + >>> product([1.,2.], dtype=int32) + 2 + >>> product([[1.,2.],[3.,4.]]) + 24.0 + >>> product([[1.,2.],[3.,4.]], axis=1) + array([ 2., 12.]) + + """ try: prod = a.prod @@ -906,8 +950,10 @@ def sometrue (a, axis=None, out=None): """Perform a logical_or over the given axis. - Blah, Blah. + *See Also*: + `ndarray.any` : equivalent method + """ try: any = a.any @@ -919,8 +965,12 @@ def alltrue (a, axis=None, out=None): """Perform a logical_and over the given axis. - Blah, Blah. + *See Also*: + `ndarray.all` : equivalent method + + `all` : equivalent function + """ try: all = a.all @@ -932,8 +982,10 @@ def any(a,axis=None, out=None): """Return true if any elements of x are true. - Blah, Blah. + *See Also*: + `ndarray.any` : equivalent method + """ try: any = a.any @@ -945,8 +997,12 @@ def all(a,axis=None, out=None): """Return true if all elements of x are true: - Blah, Blah. + *See Also*: + `ndarray.all` : equivalent method + + `alltrue` : equivalent function + """ try: all = a.all @@ -1062,8 +1118,38 @@ def ndim(a): """Return the number of dimensions of a. - Blah, Blah. + If a is not already an array, a conversion is attempted. Scalars are zero + dimensional. + *Parameters*: + + a : array_like + Array_like object whose dimensions are counted. + + *Returns*: + + number of dimensions : int + Just so. + + *See Also*: + + `rank` : equivalent function. + + `ndarray.ndim` : equivalent method + + `shape` : dimensions of array + + `ndarray.shape` : dimensions of array + + *Examples* + + >>> ndim([[1,2,3],[4,5,6]]) + 2 + >>> ndim(array([[1,2,3],[4,5,6]])) + 2 + >>> ndim(1) + 0 + """ try: return a.ndim @@ -1072,11 +1158,41 @@ def rank(a): - """Return the rank of sequence a (the number of dimensions, not - the matrix rank). The rank of a scalar is zero. + """Return the number of dimensions of a. - Blah, Blah. + In old Numeric, rank was the term used for the number of dimensions. If a is + not already an array, a conversion is attempted. Scalars are zero + dimensional. + *Parameters*: + + a : array_like + Array_like object whose dimensions are counted. + + *Returns*: + + number of dimensions : int + Just so. + + *See Also*: + + `ndim` : equivalent function + + `ndarray.ndim` : equivalent method + + `shape` : dimensions of array + + `ndarray.shape` : dimensions of array + + *Examples* + + >>> rank([[1,2,3],[4,5,6]]) + 2 + >>> rank(array([[1,2,3],[4,5,6]])) + 2 + >>> rank(1) + 0 + """ try: return a.ndim @@ -1085,12 +1201,39 @@ def size(a, axis=None): - """Return the number of elements in sequence a, or along a given axis. + """Return the number of elements along given axis. - Blah, Blah. + *Parameters*: + a : array_like + If a is not an array, a conversion is attempted. + axis : {None, int}, optional + Axis along which elements are counted. None means all elements. + + *Returns*: + + element count : int + Count of elements. + + *See Also*: + + `shape` : dimensions of array + + `ndarray.shape` : dimensions of array + + `ndarray.size` : number of elements in array + + *Examples* + + >>> a = array([[1,2,3],[4,5,6]]) + >>> size(a) + 6 + >>> size(a,1) + 3 + >>> size(a,0) + 2 + """ - if axis is None: try: return a.size @@ -1103,6 +1246,53 @@ return asarray(a).shape[axis] +def around(a, decimals=0, out=None): + """Round a to the given number of decimals. + + The real and imaginary parts of complex numbers are rounded separately. + Nothing is done if the input is an integer array with decimals >= 0. + + *Parameters*: + + a : array_like + + decimals : {0, int}, optional + Number of decimal places to round to. When decimals is negative it + specifies the number of positions to the left of the decimal point. + out : {None, array}, optional + Existing array to use for output (by default, make a copy of a). + + *Returns*: + + out : array + May be used to specify a different array to hold the result rather + than the default a. If the type of the array specified by 'out' + differs from that of a, the result is cast to the new type, + otherwise the original type is kept. Floats round to floats by + default. + + *See Also*: + + `round_` : equivalent function + + `ndarray.round` : equivalent method + + *Notes* + + Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round + to 0.0, etc. Results may also be surprising due to the inexact + representation of decimal fractions in IEEE floating point and the + errors introduced in scaling the numbers when decimals is something + other than 0. + + """ + try: + round = a.round + except AttributeError: + return _wrapit(a, 'round', decimals, out) + return round(decimals, out) + + def round_(a, decimals=0, out=None): """Round a to the given number of decimals. @@ -1111,6 +1301,8 @@ *Parameters*: + a : array_like + decimals : {0, int}, optional Number of decimal places to round to. When decimals is negative it specifies the number of positions to the left of the decimal point. @@ -1128,8 +1320,10 @@ *See Also*: - `around` : alias of this function + `around` : equivalent function + `ndarray.round` : equivalent method + *Notes* Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round @@ -1273,7 +1467,7 @@ `mean` : Average - *Notes*: + *Notes* The variance is the average of the squared deviations from the mean, i.e. var = mean((x - x.mean())**2). The computed variance is biased, @@ -1286,8 +1480,3 @@ except AttributeError: return _wrapit(a, 'var', axis, dtype, out) return var(axis, dtype, out) - -# functions that are now aliases - -around = round_ - From numpy-svn at scipy.org Sun Sep 16 01:40:36 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 00:40:36 -0500 (CDT) Subject: [Numpy-svn] r4036 - trunk/numpy/doc Message-ID: <20070916054036.B664EC7C00A@new.scipy.org> Author: charris Date: 2007-09-16 00:40:34 -0500 (Sun, 16 Sep 2007) New Revision: 4036 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: Put type in {}. Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-14 03:45:59 UTC (rev 4035) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-16 05:40:34 UTC (rev 4036) @@ -111,16 +111,17 @@ *Parameters*: - var1 : type information - Explanation - var2 : type information - Explanation + var1 : {array_like} + Array_like means all those objects -- lists, nested lists, etc. -- + that can be converted to an array. + var2 : {integer} + Write out the full type long_variable_name : {'hi', 'ho'}, optional - Choices in brackets, default first. + Choices in brackets, default first when optional. *Returns*: - named : type + named : {type} Explanation list Explanation From numpy-svn at scipy.org Sun Sep 16 01:42:03 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 00:42:03 -0500 (CDT) Subject: [Numpy-svn] r4037 - trunk/numpy/core Message-ID: <20070916054203.090A3C7C00A@new.scipy.org> Author: charris Date: 2007-09-16 00:42:01 -0500 (Sun, 16 Sep 2007) New Revision: 4037 Modified: trunk/numpy/core/fromnumeric.py Log: More documentation. Modified: trunk/numpy/core/fromnumeric.py =================================================================== --- trunk/numpy/core/fromnumeric.py 2007-09-16 05:40:34 UTC (rev 4036) +++ trunk/numpy/core/fromnumeric.py 2007-09-16 05:42:01 UTC (rev 4037) @@ -52,18 +52,14 @@ a : array The source array - indices : int array The indices of the values to extract. - axis : {None, int}, optional The axis over which to select values. None signifies that the operation should be performed over the flattened array. - out : {None, array}, optional If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype. - mode : {'raise', 'wrap', 'clip'}, optional Specifies how out-of-bounds indices will behave. 'raise' -- raise an error @@ -95,11 +91,9 @@ a : array Array to be reshaped. - newshape : shape tuple or int The new shape should be compatible with the original shape. If an integer, then the result will be a 1D array of that length. - order : {'C', 'FORTRAN'}, optional Determines whether the array data should be viewed as in C (row-major) order or FORTRAN (column-major) order. @@ -135,15 +129,12 @@ a : int array This array must contain integers in [0, n-1], where n is the number of choices. - choices : sequence of arrays Each of the choice arrays should have the same shape as the index array. - out : array, optional If provided, the result will be inserted into this array. It should be of the appropriate shape and dtype - mode : {'raise', 'wrap', 'clip'}, optional Specifies how out-of-bounds indices will behave. 'raise' : raise an error @@ -182,14 +173,13 @@ *Parameters*: - a : array - - repeats : int or int array + a : {array_like} + Blah. + repeats : {integer, integer_array} The number of repetitions for each element. If a plain integer, then it is applied to all elements. If an array, it needs to be of the same length as the chosen axis. - - axis : {None, int}, optional + axis : {None, integer}, optional The axis along which to repeat values. If None, then this function will operated on the flattened array `a` and return a similarly flat result. @@ -271,14 +261,11 @@ a : array Array to be sorted. - axis : {None, int} optional Axis along which to sort. None indicates that the flattened array should be used. - kind : {'quicksort', 'mergesort', 'heapsort'}, optional Sorting algorithm to use. - order : {None, list type}, optional When a is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be @@ -340,14 +327,11 @@ a : array Array to be sorted. - axis : {None, int} optional Axis along which to sort. None indicates that the flattened array should be used. - kind : {'quicksort', 'mergesort', 'heapsort'}, optional Sorting algorithm to use. - order : {None, list type}, optional When a is an array with fields defined, this argument specifies which fields to compare first, second, etc. Not all fields need be @@ -355,7 +339,7 @@ *Returns*: - indices : integer array + index_array : {integer_array} Array of indices that sort 'a' along the specified axis. *See Also*: @@ -400,16 +384,15 @@ *Parameters*: - a : array + a : {array_like} Array to look in. - axis : {None, integer} If None, the index is into the flattened array, otherwise along the specified axis *Returns*: - Array of indices + index_array : {integer_array} *Examples* @@ -434,16 +417,15 @@ *Parameters*: - a : array + a : {array_like} Array to look in. - axis : {None, integer} If None, the index is into the flattened array, otherwise along the specified axis *Returns*: - Array of indices + index_array : {integer_array} *Examples* @@ -477,10 +459,8 @@ a : 1-d array Array must be sorted in ascending order. - v : array or list type Array of keys to be searched for in a. - side : {'left', 'right'}, optional If 'left', the index of the first location where the key could be inserted is found, if 'right', the index of the last such element is @@ -528,21 +508,20 @@ *Parameters*: - a : array_like + a : {array_like} Array to be reshaped. - new_shape : tuple - Shape of the new array. + new_shape : {tuple} + Shape of reshaped array. *Returns*: - new_array : array + reshaped_array : {array} The new array is formed from the data in the old array, repeated if necessary to fill out the required number of elements, with the new shape. """ - if isinstance(new_shape, (int, nt.integer)): new_shape = (new_shape,) a = ravel(a) @@ -601,17 +580,14 @@ *Parameters*: - a : array_like + a : {array_like} Array from whis the diagonals are taken. - offset : {0, integer}, optional Offset of the diagonal from the main diagonal. Can be both positive and negative. Defaults to main diagonal. - axis1 : {0, integer}, optional Axis to be used as the first axis of the 2-d subarrays from which the diagonals should be taken. Defaults to first axis. - axis2 : {1, integer}, optional Axis to be used as the second axis of the 2-d subarrays from which the diagonals should be taken. Defaults to second axis. @@ -669,28 +645,23 @@ *Parameters*: - a : array_like + a : {array_like} Array from whis the diagonals are taken. - offset : {0, integer}, optional Offset of the diagonal from the main diagonal. Can be both positive and negative. Defaults to main diagonal. - axis1 : {0, integer}, optional Axis to be used as the first axis of the 2-d subarrays from which the diagonals should be taken. Defaults to first axis. - axis2 : {1, integer}, optional Axis to be used as the second axis of the 2-d subarrays from which the diagonals should be taken. Defaults to second axis. - dtype : {None, dtype}, optional Determines the type of the returned array and of the accumulator where the elements are summed. If dtype has the value None and a is of integer type of precision less than the default integer precision, then the default integer precision is used. Otherwise, the precision is the same as that of a. - out : {None, array}, optional Array into which the sum can be placed. It's type is preserved and it must be of the right shape to hold the output. @@ -722,7 +693,7 @@ *Parameters*: - a : array_like + a : {array_like} order : {'C','F'}, optional If order is 'C' the elements are taken in row major order. If order @@ -730,7 +701,7 @@ *Returns*: - 1d array of the elements of a. + 1d_array : {array} *See Also*: @@ -756,11 +727,11 @@ *Parameters*: - a : array_like + a : {array_like} *Returns*: - Tuple of arrays of indices. + tuple_of_arrays : {tuple} *Examples* @@ -786,11 +757,13 @@ *Parameters*: - a : array type + a : {array_like} + Array whose shape is desired. If a is not an array, a conversion is + attempted. *Returns*: - tuple of integers : + tuple_of_integers : The elements of the tuple are the length of the corresponding array dimension. @@ -841,29 +814,28 @@ *Parameters*: - a : array_type - + a : {array_type} + Array containing elements whose sum is desired. If a is not an array, a + conversion is attempted. axis : {None, integer} Axis over which the sum is taken. If None is used, then the sum is over all the array elements. - dtype : {None, dtype}, optional Determines the type of the returned array and of the accumulator - where the elements are summed. If dtype has the value None and a is - of integer type of precision less than the default platform integer - precision, then the default integer precision is used. Otherwise, - the precision is the same as that of a. - + where the elements are summed. If dtype has the value None and the + type of a is an integer type of precision less than the default + platform integer, then the default platform integer precision is + used. Otherwise, the dtype is the same as that of a. out : {None, array}, optional Array into which the sum can be placed. It's type is preserved and it must be of the right shape to hold the output. *Returns*: - Sum along specified axis : {array, scalar}, type as above. - If the sum is along an axis, then an array is returned whose shape - is the same as a with the specified axis removed. For 1d arrays or - dtype=None, the result is a 0d array. + sum_along_axis : {array, scalar}, see dtype parameter above. + Returns an array whose shape is the same as a with the specified + axis removed. Returns a 0d array when a is 1d or dtype=None. + Returns a reference to the specified output array if specified. *See Also*: @@ -899,29 +871,29 @@ *Parameters*: - a : array_type - + a : {array_like} + Array containing elements whose product is desired. If a is not an array, a + conversion is attempted. axis : {None, integer} Axis over which the product is taken. If None is used, then the product is over all the array elements. - dtype : {None, dtype}, optional Determines the type of the returned array and of the accumulator - where the elements are multiplied. If dtype has the value None and a - is of integer type of precision less than the default platform - integer precision, then the default integer precision is used. - Otherwise, the precision is the same as that of a. - + where the elements are multiplied. If dtype has the value None and + the type of a is an integer type of precision less than the default + platform integer, then the default platform integer precision is + used. Otherwise, the dtype is the same as that of a. out : {None, array}, optional - Array into which the product can be placed. It's type is preserved and - it must be of the right shape to hold the output. + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. *Returns*: - product along specified axis : {array, scalar}, type as above. - If the product is along an axis, then an array is returned whose shape - is the same as a with the specified axis removed. For 1d arrays or - dtype=None, the result is a 0d array. + product_along_axis : {array, scalar}, see dtype parameter above. + Returns an array whose shape is the same as a with the specified + axis removed. Returns a 0d array when a is 1d or dtype=None. + Returns a reference to the specified output array if specified. *See Also*: @@ -1123,13 +1095,14 @@ *Parameters*: - a : array_like - Array_like object whose dimensions are counted. + a : {array_like} + Array whose number of dimensions are desired. If a is not an array, a + conversion is attempted. *Returns*: - number of dimensions : int - Just so. + number_of_dimensions : {integer} + Returns the number of dimensions. *See Also*: @@ -1166,13 +1139,14 @@ *Parameters*: - a : array_like - Array_like object whose dimensions are counted. + a : {array_like} + Array whose number of dimensions is desired. If a is not an array, a + conversion is attempted. *Returns*: - number of dimensions : int - Just so. + number_of_dimensions : {integer} + Returns the number of dimensions. *See Also*: @@ -1205,15 +1179,17 @@ *Parameters*: - a : array_like - If a is not an array, a conversion is attempted. - axis : {None, int}, optional - Axis along which elements are counted. None means all elements. + a : {array_like} + Array whose axis size is desired. If a is not an array, a conversion + is attempted. + axis : {None, integer}, optional + Axis along which the elements are counted. None means all elements + in the array. *Returns*: - element count : int - Count of elements. + element_count : {integer} + Count of elements along specified axis. *See Also*: @@ -1249,27 +1225,30 @@ def around(a, decimals=0, out=None): """Round a to the given number of decimals. - The real and imaginary parts of complex numbers are rounded separately. - Nothing is done if the input is an integer array with decimals >= 0. + The real and imaginary parts of complex numbers are rounded separately. The + result of rounding a float is a float so the type must be cast if integers + are desired. Nothing is done if the input is an integer array and the + decimals parameter has a value >= 0. *Parameters*: - a : array_like - + a : {array_like} + Array containing numbers whose rounded values are desired. If a is + not an array, a conversion is attempted. decimals : {0, int}, optional Number of decimal places to round to. When decimals is negative it specifies the number of positions to the left of the decimal point. out : {None, array}, optional - Existing array to use for output (by default, make a copy of a). + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. Numpy rounds floats to floats by default. - *Returns*: + *Returns*: - out : array - May be used to specify a different array to hold the result rather - than the default a. If the type of the array specified by 'out' - differs from that of a, the result is cast to the new type, - otherwise the original type is kept. Floats round to floats by - default. + rounded_array : {array} + If out=None, returns a new array of the same type as a containing + the rounded values, otherwise a reference to the output array is + returned. *See Also*: @@ -1282,9 +1261,17 @@ Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc. Results may also be surprising due to the inexact representation of decimal fractions in IEEE floating point and the - errors introduced in scaling the numbers when decimals is something - other than 0. + errors introduced when scaling by powers of ten. + *Examples* + + >>> around([.5, 1.5, 2.5, 3.5, 4.5]) + array([ 0., 2., 2., 4., 4.]) + >>> around([1,2,3,11], decimals=1) + array([ 1, 2, 3, 11]) + >>> around([1,2,3,11], decimals=-1) + array([ 0, 0, 0, 10]) + """ try: round = a.round @@ -1296,27 +1283,30 @@ def round_(a, decimals=0, out=None): """Round a to the given number of decimals. - The real and imaginary parts of complex numbers are rounded separately. - Nothing is done if the input is an integer array with decimals >= 0. + The real and imaginary parts of complex numbers are rounded separately. The + result of rounding a float is a float so the type must be cast if integers + are desired. Nothing is done if the input is an integer array and the + decimals parameter has a value >= 0. *Parameters*: - a : array_like - - decimals : {0, int}, optional + a : {array_like} + Array containing numbers whose rounded values are desired. If a is + not an array, a conversion is attempted. + decimals : {0, integer}, optional Number of decimal places to round to. When decimals is negative it specifies the number of positions to the left of the decimal point. out : {None, array}, optional - Existing array to use for output (by default, make a copy of a). + Alternative output array in which to place the result. It must have + the same shape as the expected output but the type will be cast if + necessary. *Returns*: - out : array - May be used to specify a different array to hold the result rather - than the default a. If the type of the array specified by 'out' - differs from that of a, the result is cast to the new type, - otherwise the original type is kept. Floats round to floats by - default. + rounded_array : {array} + If out=None, returns a new array of the same type as a containing + the rounded values, otherwise a reference to the output array is + returned. *See Also*: @@ -1329,9 +1319,17 @@ Numpy rounds to even. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc. Results may also be surprising due to the inexact representation of decimal fractions in IEEE floating point and the - errors introduced in scaling the numbers when decimals is something - other than 0. + errors introduced when scaling by powers of ten. + *Examples* + + >>> round_([.5, 1.5, 2.5, 3.5, 4.5]) + array([ 0., 2., 2., 4., 4.]) + >>> round_([1,2,3,11], decimals=1) + array([ 1, 2, 3, 11]) + >>> round_([1,2,3,11], decimals=-1) + array([ 0, 0, 0, 10]) + """ try: round = a.round @@ -1345,27 +1343,30 @@ Returns the average of the array elements. The average is taken over the flattened array by default, otherwise over the specified - axis. + axis. The dtype returned for integer type arrays is float *Parameters*: - axis : integer + a : {array_like} + Array containing numbers whose mean is desired. If a is not an + array, a conversion is attempted. + axis : {None, integer}, optional Axis along which the means are computed. The default is to compute the standard deviation of the flattened array. - dtype : type + dtype : {None, dtype}, optional Type to use in computing the means. For arrays of integer type the default is float32, for arrays of float types it is the same as the array type. - out : ndarray + out : {None, array}, optional Alternative output array in which to place the result. It must have the same shape as the expected output but the type will be cast if necessary. *Returns*: - mean : array (see dtype parameter above) - A new array holding the result is returned unless out is specified, - in which case a reference to out is returned. + mean : {array, scalar}, see dtype parameter above + If out=None, returns a new array containing the mean values, + otherwise a reference to the output array is returned. *See Also*: @@ -1378,6 +1379,16 @@ The mean is the sum of the elements along the axis divided by the number of elements. + *Examples* + + >>> a = array([[1,2],[3,4]]) + >>> mean(a) + 2.5 + >>> mean(a,0) + array([ 2., 3.]) + >>> mean(a,1) + array([ 1.5, 3.5]) + """ try: mean = a.mean @@ -1395,23 +1406,26 @@ *Parameters*: - axis : integer + a : {array_like} + Array containing numbers whose standard deviation is desired. If a + is not an array, a conversion is attempted. + axis : {None, integer}, optional Axis along which the standard deviation is computed. The default is to compute the standard deviation of the flattened array. - dtype : type + dtype : {None, dtype}, optional Type to use in computing the standard deviation. For arrays of integer type the default is float32, for arrays of float types it is the same as the array type. - out : ndarray + out : {None, array}, optional Alternative output array in which to place the result. It must have the same shape as the expected output but the type will be cast if necessary. *Returns*: - standard_deviation : The return type varies, see above. - A new array holding the result is returned unless out is specified, - in which case a reference to out is returned. + standard_deviation : {array, scalar}, see dtype parameter above. + If out=None, returns a new array containing the standard deviation, + otherwise a reference to the output array is returned. *See Also*: @@ -1419,13 +1433,23 @@ `mean` : Average - *Notes*: + *Notes* The standard deviation is the square root of the average of the squared deviations from the mean, i.e. var = sqrt(mean((x - x.mean())**2)). The computed standard deviation is biased, i.e., the mean is computed by dividing by the number of elements, N, rather than by N-1. + *Examples* + + >>> a = array([[1,2],[3,4]]) + >>> std(a) + 1.1180339887498949 + >>> std(a,0) + array([ 1., 1.]) + >>> std(a,1) + array([ 0.5, 0.5]) + """ try: std = a.std @@ -1438,28 +1462,31 @@ """Compute the variance along the specified axis. Returns the variance of the array elements, a measure of the spread of a - distribution. The variance is computed for the flattened array by default, + distribution. The variance is computed for the flattened array by default, otherwise over the specified axis. *Parameters*: - axis : integer + a : {array_like} + Array containing numbers whose variance is desired. If a is not an + array, a conversion is attempted. + axis : {None, integer}, optional Axis along which the variance is computed. The default is to compute the variance of the flattened array. - dtype : type + dtype : {None, dtype}, optional Type to use in computing the variance. For arrays of integer type the default is float32, for arrays of float types it is the same as the array type. - out : ndarray + out : {None, array}, optional Alternative output array in which to place the result. It must have the same shape as the expected output but the type will be cast if necessary. *Returns*: - variance : array (see dtype parameter above) - A new array holding the result is returned unless out is specified, - in which case a reference to out is returned. + variance : {array, scalar}, see dtype parameter above + If out=None, returns a new array containing the variance, otherwise + a reference to the output array is returned. *See Also*: @@ -1474,6 +1501,16 @@ i.e., the mean is computed by dividing by the number of elements, N, rather than by N-1. + *Examples* + + >>> a = array([[1,2],[3,4]]) + >>> var(a) + 1.25 + >>> var(a,0) + array([ 1., 1.]) + >>> var(a,1) + array([ 0.25, 0.25]) + """ try: var = a.var From numpy-svn at scipy.org Sun Sep 16 01:44:07 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 00:44:07 -0500 (CDT) Subject: [Numpy-svn] r4038 - trunk/numpy/doc Message-ID: <20070916054407.92D01C7C00A@new.scipy.org> Author: charris Date: 2007-09-16 00:44:05 -0500 (Sun, 16 Sep 2007) New Revision: 4038 Added: trunk/numpy/doc/HOWTO_DOCUMENT.py Removed: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: Make HOWTO_DOCUMENT a python file. This may fix attempts to post the output of epydoc. Copied: trunk/numpy/doc/HOWTO_DOCUMENT.py (from rev 4036, trunk/numpy/doc/HOWTO_DOCUMENT.txt) Deleted: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-16 05:42:01 UTC (rev 4037) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-16 05:44:05 UTC (rev 4038) @@ -1,180 +0,0 @@ -# It is desireable that both NumPy and SciPy follow a convention for docstrings -# that provide for some consistency while also allowing epydoc to produce -# nicely-formatted reference guides. However, such a convention has not yet -# been decided on. This is my current thinking on the topic. If you have -# suggestions for improvements, post them on the numpy-dev list together with -# the epydoc output so they may be discussed. -# -# The docstring format uses reST syntax as interpreted by epydoc. The markup -# in this proposal is as basic as possible and in particular avoids the use of -# epydoc consolidated fields. This is both because there are a limited number -# of such fields, inadequate to our current needs, and because epydoc moves -# the fields to the end of the documentation, messing up the ordering. So here -# standard definition lists are used instead. Likewise, epydoc moves headings -# and have an unwelcome size in the default style sheet, hence they have also -# been avoided. -# -# A maximum line width of 79 is suggested, as this will allow the docstrings to -# display on standard terminals. This convention is a bit old and traces back -# to IBM punchcard days, but still seems to be the standard. -# -# Comments: -# -# 1) You can run epydoc on this file like so: -# -# $ epydoc HOWTO_DOCUMENT.txt -# -# The output will be in a directory named html in the same directory as this -# document and may be viewed by loading the index.html file into your browser. -# -# 2) The developmental version of epydoc, version 3.0 beta or later, is -# suggested as it is faster and produces better looking output. Epydoc can be -# downloaded from http://epydoc.sourceforge.net/ -# -# 3) The appearance of some elements can be changed in the epydoc.css -# style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so -# their appearance is controlled by the definition of the -# tag. For instance, to make them bold, insert -# -# em {font-weight: bold;} -# -# The variables' types are in a span of class rst-classifier, hence can be -# changed by inserting something like: -# -# span.rst-classifier {font-weight: normal;} -# -# 4) The first line of the signature should **not** copy the signature unless -# the function is written in C, in which case it is mandatory. If the function -# signature is generic (uses *args or **kwds), then a function signature may be -# included -# -# 5) Use optional in the "type" field for parameters that are non-keyword -# optional for C-functions. -# -# 6) The Other Parameters section is for functions taking a lot of keywords -# which are not always used or neeeded and whose description would clutter then -# main purpose of the function. (Comment by Chuck : I think this should be -# rarely used, if at all) -# -# 7) The See Also section can list additional related functions. The purpose -# of this section is to direct users to other functions they may not be aware -# of or have easy means to discover (i.e. by looking at the docstring of the -# module). Thus, repeating functions that are in the same module is not useful -# and can create a cluttered document. Please use judgement when listing -# additional functions. Routines that provide additional information in their -# docstrings for this function may be useful to include here. -# -# 8) The Notes section can contain algorithmic information if that is useful. -# -# 9) The Examples section is strongly encouraged. The examples can provide a -# mini-tutorial as well as additional regression testing. (Comment by Chuck: -# blank lines in the numpy output, for instance in multidimensional arrays, -# will break doctest.) You can run the tests by doing -# -# >>> import doctest -# >>> doctest.testfile('HOWTO_DOCUMENT.txt') -# -# -# Common reST concepts: - -# A reST-documented module should define -# -# __docformat__ = 'restructuredtext en' -# -# at the top level in accordance with PEP 258. Note that the __docformat__ -# variable in a package's __init__.py file does not apply to objects defined in -# subpackages and submodules. -# -# For paragraphs, indentation is significant and indicates indentation in the -# output. New paragraphs are marked with blank line. -# -# Use *italics*, **bold**, and ``courier`` if needed in any explanations (but -# not for variable names and doctest code or multi-line code) -# -# Use :lm:`eqn` for in-line math in latex format (remember to use the -# raw-format for your text string or escape any '\' symbols). Use :m:`eqn` for -# non-latex math. -# -# A more extensive example of reST markup can be found here: -# http://docutils.sourceforge.net/docs/user/rst/demo.txt -# An example follows. Line spacing and indentation are significant and should -# be carefully followed. - -__docformat__ = "restructuredtext en" - - -def foo(var1, var2, long_var_name='hi') : - """One-line summary or signature. - - Several sentences providing an extended description. You can put - text in mono-spaced type like so: ``var``. - - *Parameters*: - - var1 : {array_like} - Array_like means all those objects -- lists, nested lists, etc. -- - that can be converted to an array. - var2 : {integer} - Write out the full type - long_variable_name : {'hi', 'ho'}, optional - Choices in brackets, default first when optional. - - *Returns*: - - named : {type} - Explanation - list - Explanation - of - Explanation - outputs - even more explaining - - *Other Parameters*: - - only_seldom_used_keywords : type - Explanation - common_parametrs_listed_above : type - Explanation - - *See Also*: - - `otherfunc` : relationship (optional) - - `newfunc` : relationship (optional) - - *Notes* - - Notes about the implementation algorithm (if needed). - - This can have multiple paragraphs as can all sections. - - *Examples* - - examples in doctest format - - >>> a=[1,2,3] - >>> [x + 3 for x in a] - [4, 5, 6] - - """ - pass - - -def newfunc() : - """Do nothing. - - I never saw a purple cow. - - """ - pass - - -def otherfunc() : - """Do nothing. - - I never hope to see one. - - """ - pass - From numpy-svn at scipy.org Sun Sep 16 04:15:04 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 03:15:04 -0500 (CDT) Subject: [Numpy-svn] r4039 - trunk/numpy/f2py/lib Message-ID: <20070916081504.D3D37C7C01E@new.scipy.org> Author: cdavid Date: 2007-09-16 03:15:00 -0500 (Sun, 16 Sep 2007) New Revision: 4039 Modified: trunk/numpy/f2py/lib/ Log: Ignore *.pyc file in f2py/lib Property changes on: trunk/numpy/f2py/lib ___________________________________________________________________ Name: svn:ignore + *.pyc From numpy-svn at scipy.org Sun Sep 16 04:17:51 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 03:17:51 -0500 (CDT) Subject: [Numpy-svn] r4040 - / Message-ID: <20070916081751.9B56EC7C01E@new.scipy.org> Author: cdavid Date: 2007-09-16 03:17:47 -0500 (Sun, 16 Sep 2007) New Revision: 4040 Added: numpy.sunperf/ Log: * Make a branch to support sunperf libraries and sun compilers for numpy. Copied: numpy.sunperf (from rev 4039, trunk) From numpy-svn at scipy.org Sun Sep 16 06:28:20 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 05:28:20 -0500 (CDT) Subject: [Numpy-svn] r4041 - in numpy.sunperf/numpy/distutils: . fcompiler Message-ID: <20070916102820.90D3139C2B8@new.scipy.org> Author: cdavid Date: 2007-09-16 05:28:11 -0500 (Sun, 16 Sep 2007) New Revision: 4041 Added: numpy.sunperf/numpy/distutils/sunccompiler.py Modified: numpy.sunperf/numpy/distutils/ccompiler.py numpy.sunperf/numpy/distutils/fcompiler/sun.py Log: Add support for sun compiler (C and fortran) on Linux: seems to work with g77 compiled blas/lapack Modified: numpy.sunperf/numpy/distutils/ccompiler.py =================================================================== --- numpy.sunperf/numpy/distutils/ccompiler.py 2007-09-16 08:17:47 UTC (rev 4040) +++ numpy.sunperf/numpy/distutils/ccompiler.py 2007-09-16 10:28:11 UTC (rev 4041) @@ -313,6 +313,10 @@ "Intel C Itanium Compiler for Itanium-based applications") ccompiler._default_compilers += (('linux.*','intel'),('linux.*','intele')) +compiler_class['sun'] = ('sunccompiler','SunCCompiler', + "Sun Studio C Compiler for Linux") +ccompiler._default_compilers += (('linux.*','sun'),) + if sys.platform == 'win32': compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler', "Mingw32 port of GNU C Compiler for Win32"\ Modified: numpy.sunperf/numpy/distutils/fcompiler/sun.py =================================================================== --- numpy.sunperf/numpy/distutils/fcompiler/sun.py 2007-09-16 08:17:47 UTC (rev 4040) +++ numpy.sunperf/numpy/distutils/fcompiler/sun.py 2007-09-16 10:28:11 UTC (rev 4041) @@ -1,3 +1,5 @@ +import sys + from numpy.distutils.ccompiler import simple_version_match from numpy.distutils.fcompiler import FCompiler @@ -38,7 +40,9 @@ return ['-xtarget=generic'] def get_libraries(self): opt = [] - opt.extend(['fsu','sunmath','mvec','f77compat']) + opt.extend(['fsu','sunmath']) + if not sys.platform[:5] == 'linux': + opt.extend(['mvec', 'f77compat']) return opt if __name__ == '__main__': Added: numpy.sunperf/numpy/distutils/sunccompiler.py =================================================================== --- numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-16 08:17:47 UTC (rev 4040) +++ numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-16 10:28:11 UTC (rev 4041) @@ -0,0 +1,19 @@ +"""Sun studio compiler (both solaris and linux).""" +from distutils.unixccompiler import UnixCCompiler +from numpy.distutils.exec_command import find_executable + +class SunCCompiler(UnixCCompiler): + """ A modified Intel compiler compatible with an gcc built Python. """ + compiler_type = 'sun' + # Use suncc instead of cc, because it makes it more obvious to follow + # what's going on when several compilers are available. + cc_exe = 'suncc' + + def __init__ (self, verbose=0, dry_run=0, force=0): + UnixCCompiler.__init__ (self, verbose,dry_run, force) + compiler = self.cc_exe + self.set_executables(compiler=compiler, + compiler_so=compiler, + compiler_cxx=compiler, + linker_exe=compiler, + linker_so=compiler + ' -shared') From numpy-svn at scipy.org Sun Sep 16 06:30:48 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 05:30:48 -0500 (CDT) Subject: [Numpy-svn] r4042 - in numpy.sunperf/numpy/distutils: . fcompiler Message-ID: <20070916103048.B0DFD39C13D@new.scipy.org> Author: cdavid Date: 2007-09-16 05:30:44 -0500 (Sun, 16 Sep 2007) New Revision: 4042 Modified: numpy.sunperf/numpy/distutils/fcompiler/sun.py numpy.sunperf/numpy/distutils/sunccompiler.py Log: Fix typo in suncompiler and add comment for modification in sun fcompiler Modified: numpy.sunperf/numpy/distutils/fcompiler/sun.py =================================================================== --- numpy.sunperf/numpy/distutils/fcompiler/sun.py 2007-09-16 10:28:11 UTC (rev 4041) +++ numpy.sunperf/numpy/distutils/fcompiler/sun.py 2007-09-16 10:30:44 UTC (rev 4042) @@ -42,6 +42,7 @@ opt = [] opt.extend(['fsu','sunmath']) if not sys.platform[:5] == 'linux': + # Those are solaris specific libs opt.extend(['mvec', 'f77compat']) return opt Modified: numpy.sunperf/numpy/distutils/sunccompiler.py =================================================================== --- numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-16 10:28:11 UTC (rev 4041) +++ numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-16 10:30:44 UTC (rev 4042) @@ -3,7 +3,7 @@ from numpy.distutils.exec_command import find_executable class SunCCompiler(UnixCCompiler): - """ A modified Intel compiler compatible with an gcc built Python. """ + """ A modified Sun compiler compatible with an gcc built Python. """ compiler_type = 'sun' # Use suncc instead of cc, because it makes it more obvious to follow # what's going on when several compilers are available. From numpy-svn at scipy.org Sun Sep 16 07:40:00 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 06:40:00 -0500 (CDT) Subject: [Numpy-svn] r4043 - numpy.sunperf/numpy/distutils Message-ID: <20070916114000.7BFD039C0FE@new.scipy.org> Author: cdavid Date: 2007-09-16 06:39:56 -0500 (Sun, 16 Sep 2007) New Revision: 4043 Modified: numpy.sunperf/numpy/distutils/system_info.py Log: Initial support for sunperf: works under linux with suncc Modified: numpy.sunperf/numpy/distutils/system_info.py =================================================================== --- numpy.sunperf/numpy/distutils/system_info.py 2007-09-16 10:30:44 UTC (rev 4042) +++ numpy.sunperf/numpy/distutils/system_info.py 2007-09-16 11:39:56 UTC (rev 4043) @@ -209,6 +209,9 @@ 'mkl':mkl_info, 'lapack_mkl':lapack_mkl_info, # use lapack_opt instead 'blas_mkl':blas_mkl_info, # use blas_opt instead + 'sunperf':sunperf_info, + 'lapack_sunperf':lapack_sunperf_info, # use lapack_opt instead + 'blas_sunperf':blas_sunperf_info, # use blas_opt instead 'x11':x11_info, 'fft_opt':fft_opt_info, 'fftw':fftw_info, @@ -838,6 +841,92 @@ class blas_mkl_info(mkl_info): pass +#====================== +# Sunperf system info. +#====================== + +# This is intended to work on solaris (sparc and x86) and +# linux (x86 only). +class sunperf_info(system_info): + section = 'sunperf' + dir_env_var = 'SUNPERF' + _lib_sunperf = ['sunperf', 'fsu', 'mtsk'] + + def get_sunperf_rootdir(self): + sunperfroot = os.environ.get('SUNPERF',None) + if sunperfroot is not None: + return sunperfroot + else: + print ("You have to set sunperf root dir with"\ + "env var SUNPERF for now, sorry") + return None + #paths = os.environ.get('LD_LIBRARY_PATH','').split(os.pathsep) + #ld_so_conf = '/etc/ld.so.conf' + #if os.path.isfile(ld_so_conf): + # for d in open(ld_so_conf,'r').readlines(): + # d = d.strip() + # if d: paths.append(d) + #intel_mkl_dirs = [] + #for path in paths: + # path_atoms = path.split(os.sep) + # for m in path_atoms: + # if m.startswith('mkl'): + # d = os.sep.join(path_atoms[:path_atoms.index(m)+2]) + # intel_mkl_dirs.append(d) + # break + #for d in paths: + # dirs = glob(os.path.join(d,'mkl','*')) + glob(os.path.join(d,'mkl*')) + # for d in dirs: + # if os.path.isdir(os.path.join(d,'lib')): + # return d + #return None + + def __init__(self): + sunperfroot = self.get_sunperf_rootdir() + if sunperfroot is None: + system_info.__init__(self) + else: + from cpuinfo import cpu + # XXX we really just want to detect whereas we are on x86... + if cpu._is_AMD() or cpu._is_Intel(): + if cpu.is_64bits(): + print "amd64 version of sunperf" + elif cpu.has_sse2(): + print "SSE2 version of sunperf" + else: + print "generic x86 version of sunperf" + else: + "No x86 detected" + system_info.__init__(self, + default_lib_dirs = + [os.path.join(sunperfroot, 'lib')], + default_include_dirs = + [os.path.join(sunperfroot, 'include')]) + + def calc_info(self): + lib_dirs = self.get_lib_dirs() + incl_dirs = self.get_include_dirs() + sunperf_libs = self.get_libs('sunperf_libs',self._lib_sunperf) + sunperf = None + for d in lib_dirs: + sunperf = self.check_libs2(d,sunperf_libs) + if sunperf is not None: + break + if sunperf is None: + return + info = {} + dict_append(info,**sunperf) + dict_append(info, + define_macros=[('SCIPY_SUNPERF_H',None)], + include_dirs = incl_dirs) + self.set_info(**info) + +class blas_sunperf_info(sunperf_info): + pass + +class lapack_sunperf_info(sunperf_info): + pass + class atlas_info(system_info): section = 'atlas' dir_env_var = 'ATLAS' @@ -1207,6 +1296,11 @@ self.set_info(**lapack_mkl_info) return + lapack_sunperf_info = get_info('lapack_sunperf') + if lapack_sunperf_info: + self.set_info(**lapack_sunperf_info) + return + atlas_info = get_info('atlas_threads') if not atlas_info: atlas_info = get_info('atlas') @@ -1308,6 +1402,12 @@ self.set_info(**blas_mkl_info) return + blas_sunperf_info = get_info('blas_sunperf') + if blas_sunperf_info: + self.set_info(**blas_sunperf_info) + return + + print "blablas:" atlas_info = get_info('atlas_blas_threads') if not atlas_info: atlas_info = get_info('atlas_blas') From numpy-svn at scipy.org Sun Sep 16 07:48:27 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 06:48:27 -0500 (CDT) Subject: [Numpy-svn] r4044 - numpy.sunperf Message-ID: <20070916114827.659B939C273@new.scipy.org> Author: cdavid Date: 2007-09-16 06:48:23 -0500 (Sun, 16 Sep 2007) New Revision: 4044 Added: numpy.sunperf/test_sunperf.sh Log: Add small shell script for easier testing of sunperf implementation. Added: numpy.sunperf/test_sunperf.sh =================================================================== --- numpy.sunperf/test_sunperf.sh 2007-09-16 11:39:56 UTC (rev 4043) +++ numpy.sunperf/test_sunperf.sh 2007-09-16 11:48:23 UTC (rev 4044) @@ -0,0 +1,19 @@ +INSTALL_PREFIX=/usr/media/src/src/dsp/numpy/numpy.sunperf/tmp +SUNSTUDIOPATH=$HOME/opt/sun/sunstudio12 +PATH=$SUNSTUDIOPATH/bin/:$PATH + +#ATLAS=None +#BLAS=None +#LAPACK=None +SUNPERF=$SUNSTUDIOPATH +LD_LIBRARY_PATH=$SUNSTUDIOPATH/lib + +rm -rf $INSTALL_PREFIX +rm -rf build +ATLAS=$ATLAS BLAS=$BLAS LAPACK=$LAPACK SUNPERF=$SUNPERF python setup.py config --compiler=sun --fcompiler=sun +ATLAS=$ATLAS BLAS=$BLAS LAPACK=$LAPACK SUNPERF=$SUNPERF python setup.py build --compiler=sun --fcompiler=sun + +python setup.py install --prefix=$INSTALL_PREFIX +echo "======================================" +echo " TESTING " +(cd tmp && PYTHONPATH=$INSTALL_PREFIX/lib/python2.5/site-packages python -c "import numpy; numpy.test()") From numpy-svn at scipy.org Sun Sep 16 10:34:08 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 16 Sep 2007 09:34:08 -0500 (CDT) Subject: [Numpy-svn] r4045 - in numpy.sunperf: . numpy/distutils Message-ID: <20070916143408.61C0B39C03B@new.scipy.org> Author: cdavid Date: 2007-09-16 09:33:39 -0500 (Sun, 16 Sep 2007) New Revision: 4045 Modified: numpy.sunperf/numpy/distutils/system_info.py numpy.sunperf/test_sunperf.sh Log: Add mtsk and fui libs for linking for sunperf_info Modified: numpy.sunperf/numpy/distutils/system_info.py =================================================================== --- numpy.sunperf/numpy/distutils/system_info.py 2007-09-16 11:48:23 UTC (rev 4044) +++ numpy.sunperf/numpy/distutils/system_info.py 2007-09-16 14:33:39 UTC (rev 4045) @@ -850,7 +850,8 @@ class sunperf_info(system_info): section = 'sunperf' dir_env_var = 'SUNPERF' - _lib_sunperf = ['sunperf', 'fsu', 'mtsk'] + _lib_sunperf = ['sunperf', 'fsu', 'fui'] + _lib_sunperf_suplink = ['mtsk'] def get_sunperf_rootdir(self): sunperfroot = os.environ.get('SUNPERF',None) @@ -887,19 +888,20 @@ system_info.__init__(self) else: from cpuinfo import cpu - # XXX we really just want to detect whereas we are on x86... - if cpu._is_AMD() or cpu._is_Intel(): - if cpu.is_64bits(): - print "amd64 version of sunperf" - elif cpu.has_sse2(): - print "SSE2 version of sunperf" - else: - print "generic x86 version of sunperf" - else: - "No x86 detected" + ## # XXX we really just want to detect whereas we are on x86... + ## if cpu._is_AMD() or cpu._is_Intel(): + ## if cpu.is_64bits(): + ## print "amd64 version of sunperf" + ## elif cpu.has_sse2(): + ## print "SSE2 version of sunperf" + ## else: + ## print "generic x86 version of sunperf" + ## else: + ## "No x86 detected" system_info.__init__(self, default_lib_dirs = - [os.path.join(sunperfroot, 'lib')], + [os.path.join(sunperfroot, 'lib'), + os.path.join(sunperfroot, 'rtlibs')], default_include_dirs = [os.path.join(sunperfroot, 'include')]) @@ -916,6 +918,19 @@ return info = {} dict_append(info,**sunperf) + + # Look for mtsk: we basically assume that mtsk is here once sunperf is + # detected. + mtsk = None + for d in lib_dirs: + mtsk = self.check_libs2(d,self._lib_sunperf_suplink) + if mtsk is not None: + break + if mtsk is None: + return + dict_append(info,**mtsk) + + # Now, the info is complete dict_append(info, define_macros=[('SCIPY_SUNPERF_H',None)], include_dirs = incl_dirs) Modified: numpy.sunperf/test_sunperf.sh =================================================================== --- numpy.sunperf/test_sunperf.sh 2007-09-16 11:48:23 UTC (rev 4044) +++ numpy.sunperf/test_sunperf.sh 2007-09-16 14:33:39 UTC (rev 4045) @@ -1,12 +1,13 @@ -INSTALL_PREFIX=/usr/media/src/src/dsp/numpy/numpy.sunperf/tmp -SUNSTUDIOPATH=$HOME/opt/sun/sunstudio12 +INSTALL_PREFIX=/home/david/numpy.sunperf/tmp +SUNSTUDIOPATH=/opt/sun/sunstudio12 PATH=$SUNSTUDIOPATH/bin/:$PATH +LD_LIBRARY_PATH=$SUNSTUDIOPATH/lib/:$SUNSTUDIOPATH/rtlibs/:$LD_LIBRARY_PATH +SUNPERF=$SUNSTUDIOPATH + #ATLAS=None #BLAS=None #LAPACK=None -SUNPERF=$SUNSTUDIOPATH -LD_LIBRARY_PATH=$SUNSTUDIOPATH/lib rm -rf $INSTALL_PREFIX rm -rf build @@ -16,4 +17,4 @@ python setup.py install --prefix=$INSTALL_PREFIX echo "======================================" echo " TESTING " -(cd tmp && PYTHONPATH=$INSTALL_PREFIX/lib/python2.5/site-packages python -c "import numpy; numpy.test()") +(cd tmp && LD_LIBRARY_PATH=$LD_LIBRARY_PATH PYTHONPATH=$INSTALL_PREFIX/lib/python2.5/site-packages python -c "import numpy; numpy.test()") From numpy-svn at scipy.org Tue Sep 18 01:30:54 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Tue, 18 Sep 2007 00:30:54 -0500 (CDT) Subject: [Numpy-svn] r4046 - numpy.sunperf/numpy/distutils Message-ID: <20070918053054.8CAD439C0D8@new.scipy.org> Author: cdavid Date: 2007-09-18 00:30:49 -0500 (Tue, 18 Sep 2007) New Revision: 4046 Modified: numpy.sunperf/numpy/distutils/sunccompiler.py Log: Replace suncc call by cc on solaris for sun compilers Modified: numpy.sunperf/numpy/distutils/sunccompiler.py =================================================================== --- numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-16 14:33:39 UTC (rev 4045) +++ numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-18 05:30:49 UTC (rev 4046) @@ -5,9 +5,12 @@ class SunCCompiler(UnixCCompiler): """ A modified Sun compiler compatible with an gcc built Python. """ compiler_type = 'sun' - # Use suncc instead of cc, because it makes it more obvious to follow - # what's going on when several compilers are available. - cc_exe = 'suncc' + if platform[:5] == 'linux': + # Use suncc instead of cc, because it makes it more obvious to follow + # what's going on when several compilers are available on linux. + cc_exe = 'suncc' + else: + cc_exe = 'cc' def __init__ (self, verbose=0, dry_run=0, force=0): UnixCCompiler.__init__ (self, verbose,dry_run, force) From numpy-svn at scipy.org Wed Sep 19 12:29:03 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 11:29:03 -0500 (CDT) Subject: [Numpy-svn] r4047 - branches Message-ID: <20070919162903.2892539C221@new.scipy.org> Author: cdavid Date: 2007-09-19 11:28:51 -0500 (Wed, 19 Sep 2007) New Revision: 4047 Added: branches/numpy.scons/ Log: Create a new branch to replace *some* numpy.distutils tasks by scons: the two main things we are interested in are custom compilation environments (for fine grained control of compilation option) and easier config facilities (replacing system_info.py by something easier ?). This will be done step by step, the first being the ability to use scons instead of numpy.core.Extension to build extension. Copied: branches/numpy.scons (from rev 4046, trunk) From numpy-svn at scipy.org Wed Sep 19 15:05:38 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 14:05:38 -0500 (CDT) Subject: [Numpy-svn] r4048 - trunk Message-ID: <20070919190538.CEC4739C14C@new.scipy.org> Author: chris.barker Date: 2007-09-19 14:05:07 -0500 (Wed, 19 Sep 2007) New Revision: 4048 Modified: trunk/DEV_README.txt Log: test Modified: trunk/DEV_README.txt =================================================================== --- trunk/DEV_README.txt 2007-09-19 16:28:51 UTC (rev 4047) +++ trunk/DEV_README.txt 2007-09-19 19:05:07 UTC (rev 4048) @@ -1,4 +1,3 @@ - Thank you for your willingness to help make NumPy the best array system available. @@ -12,4 +11,3 @@ Please add meaningful comments when you check changes in. These comments form the basis of the change-log. - From numpy-svn at scipy.org Wed Sep 19 22:08:57 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 21:08:57 -0500 (CDT) Subject: [Numpy-svn] r4049 - trunk/numpy/lib/src Message-ID: <20070920020857.243CE39C01B@new.scipy.org> Author: oliphant Date: 2007-09-19 21:08:54 -0500 (Wed, 19 Sep 2007) New Revision: 4049 Modified: trunk/numpy/lib/src/_compiled_base.c Log: Fix ticket #572: memory leak in _insert for 0-d input. Modified: trunk/numpy/lib/src/_compiled_base.c =================================================================== --- trunk/numpy/lib/src/_compiled_base.c 2007-09-19 19:05:07 UTC (rev 4048) +++ trunk/numpy/lib/src/_compiled_base.c 2007-09-20 02:08:54 UTC (rev 4049) @@ -287,6 +287,7 @@ Py_DECREF(amask); Py_DECREF(avals); PyDataMem_FREE(zero); + Py_DECREF(ainput); Py_INCREF(Py_None); return Py_None; } From numpy-svn at scipy.org Wed Sep 19 22:29:59 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 21:29:59 -0500 (CDT) Subject: [Numpy-svn] r4050 - trunk/numpy/lib Message-ID: <20070920022959.0040639C2A5@new.scipy.org> Author: oliphant Date: 2007-09-19 21:29:24 -0500 (Wed, 19 Sep 2007) New Revision: 4050 Modified: trunk/numpy/lib/twodim_base.py Log: Fix so that rot90 only works on first two axes. Modified: trunk/numpy/lib/twodim_base.py =================================================================== --- trunk/numpy/lib/twodim_base.py 2007-09-20 02:08:54 UTC (rev 4049) +++ trunk/numpy/lib/twodim_base.py 2007-09-20 02:29:24 UTC (rev 4050) @@ -36,9 +36,9 @@ raise ValueError, "Input must >= 2-d." k = k % 4 if k == 0: return m - elif k == 1: return fliplr(m).transpose() + elif k == 1: return fliplr(m).swapaxes(0,1) elif k == 2: return fliplr(flipud(m)) - else: return fliplr(m.transpose()) # k==3 + else: return fliplr(m.swapaxes(0,1)) # k==3 def eye(N, M=None, k=0, dtype=float): """ eye returns a N-by-M 2-d array where the k-th diagonal is all ones, From numpy-svn at scipy.org Wed Sep 19 22:44:21 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 21:44:21 -0500 (CDT) Subject: [Numpy-svn] r4051 - trunk/numpy/distutils Message-ID: <20070920024421.39BA439C076@new.scipy.org> Author: oliphant Date: 2007-09-19 21:44:19 -0500 (Wed, 19 Sep 2007) New Revision: 4051 Modified: trunk/numpy/distutils/misc_util.py Log: Fix problem with msvc_on_amd64 not working prior to Python 2.5 Modified: trunk/numpy/distutils/misc_util.py =================================================================== --- trunk/numpy/distutils/misc_util.py 2007-09-20 02:29:24 UTC (rev 4050) +++ trunk/numpy/distutils/misc_util.py 2007-09-20 02:44:19 UTC (rev 4051) @@ -321,7 +321,10 @@ def msvc_on_amd64(): if not (sys.platform=='win32' or os.name=='nt'): return - from distutils.msvccompiler import get_build_architecture + try: # get_build_architecture is only on Python 2.5 + from distutils.msvccompiler import get_build_architecture + except ImportError: + return if get_build_architecture() != 'AMD64': return if os.environ.has_key('DISTUTILS_USE_SDK'): From numpy-svn at scipy.org Wed Sep 19 22:59:51 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Wed, 19 Sep 2007 21:59:51 -0500 (CDT) Subject: [Numpy-svn] r4052 - trunk/numpy/distutils Message-ID: <20070920025951.7E7AF39C230@new.scipy.org> Author: oliphant Date: 2007-09-19 21:59:49 -0500 (Wed, 19 Sep 2007) New Revision: 4052 Modified: trunk/numpy/distutils/cpuinfo.py Log: Get rid of print statement. Modified: trunk/numpy/distutils/cpuinfo.py =================================================================== --- trunk/numpy/distutils/cpuinfo.py 2007-09-20 02:44:19 UTC (rev 4051) +++ trunk/numpy/distutils/cpuinfo.py 2007-09-20 02:59:49 UTC (rev 4052) @@ -524,7 +524,6 @@ break else: pnum+=1 - print proc info.append({"Processor":proc}) phnd=_winreg.OpenKey(chnd,proc) pidx=0 From numpy-svn at scipy.org Thu Sep 20 02:45:34 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 01:45:34 -0500 (CDT) Subject: [Numpy-svn] r4053 - trunk/numpy/core/tests Message-ID: <20070920064534.9DF0539C2AE@new.scipy.org> Author: stefan Date: 2007-09-20 01:45:23 -0500 (Thu, 20 Sep 2007) New Revision: 4053 Modified: trunk/numpy/core/tests/test_regression.py Log: Add regression test for ticket #572. Modified: trunk/numpy/core/tests/test_regression.py =================================================================== --- trunk/numpy/core/tests/test_regression.py 2007-09-20 02:59:49 UTC (rev 4052) +++ trunk/numpy/core/tests/test_regression.py 2007-09-20 06:45:23 UTC (rev 4053) @@ -716,6 +716,9 @@ assert x != y assert x == x + def check_mem_insert(self, level=rlevel): + """Ticket #572""" + N.lib.place(1,1,1) if __name__ == "__main__": NumpyTest().run() From numpy-svn at scipy.org Thu Sep 20 04:32:34 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 03:32:34 -0500 (CDT) Subject: [Numpy-svn] r4054 - in branches/numpy.scons: . numpy/distutils numpy/distutils/command Message-ID: <20070920083234.65E3C39C388@new.scipy.org> Author: cdavid Date: 2007-09-20 03:32:14 -0500 (Thu, 20 Sep 2007) New Revision: 4054 Added: branches/numpy.scons/numpy/distutils/command/scons.py Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/command/__init__.py branches/numpy.scons/numpy/distutils/core.py Log: Add a fake scons command (does nothing for now) Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info + timestamp: 2007-09-20 17:09:08.556999922 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids + numpy/distutils/command/scons.py scons.py-20070920080716-xuge6qwroc9z4jhc-1 Name: bzr:revision-id:v3-trunk0 + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa Modified: branches/numpy.scons/numpy/distutils/command/__init__.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/__init__.py 2007-09-20 06:45:23 UTC (rev 4053) +++ branches/numpy.scons/numpy/distutils/command/__init__.py 2007-09-20 08:32:14 UTC (rev 4054) @@ -27,5 +27,6 @@ 'install_data', 'install_headers', 'bdist_rpm', + 'scons', 'sdist', ] + distutils_all Added: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 06:45:23 UTC (rev 4053) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 08:32:14 UTC (rev 4054) @@ -0,0 +1,15 @@ +from distutils.core import Command + +class scons(Command): + description = "Scons builder" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + pass + Modified: branches/numpy.scons/numpy/distutils/core.py =================================================================== --- branches/numpy.scons/numpy/distutils/core.py 2007-09-20 06:45:23 UTC (rev 4053) +++ branches/numpy.scons/numpy/distutils/core.py 2007-09-20 08:32:14 UTC (rev 4054) @@ -23,7 +23,7 @@ from numpy.distutils.extension import Extension from numpy.distutils.command import config, config_compiler, \ build, build_py, build_ext, build_clib, build_src, build_scripts, \ - sdist, install_data, install_headers, install, bdist_rpm + sdist, install_data, install_headers, install, bdist_rpm, scons from numpy.distutils.misc_util import get_data_files, is_sequence, is_string numpy_cmdclass = {'build': build.build, @@ -36,6 +36,7 @@ 'build_py': build_py.build_py, 'build_clib': build_clib.build_clib, 'sdist': sdist.sdist, + 'scons': scons.scons, 'install_data': install_data.install_data, 'install_headers': install_headers.install_headers, 'install': install.install, From numpy-svn at scipy.org Thu Sep 20 04:32:55 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 03:32:55 -0500 (CDT) Subject: [Numpy-svn] r4055 - in branches/numpy.scons: . numpy numpy/distutils Message-ID: <20070920083255.3AA7239C387@new.scipy.org> Author: cdavid Date: 2007-09-20 03:32:42 -0500 (Thu, 20 Sep 2007) New Revision: 4055 Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/misc_util.py branches/numpy.scons/numpy/setup.py Log: Add numpy.distutils command add_sconscript (does nothing, only hook) Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-20 17:09:08.556999922 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-20 17:15:09.678999901 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/distutils/command/scons.py scons.py-20070920080716-xuge6qwroc9z4jhc-1 + Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs Modified: branches/numpy.scons/numpy/distutils/misc_util.py =================================================================== --- branches/numpy.scons/numpy/distutils/misc_util.py 2007-09-20 08:32:14 UTC (rev 4054) +++ branches/numpy.scons/numpy/distutils/misc_util.py 2007-09-20 08:32:42 UTC (rev 4055) @@ -575,7 +575,7 @@ class Configuration(object): _list_keys = ['packages', 'ext_modules', 'data_files', 'include_dirs', - 'libraries', 'headers', 'scripts', 'py_modules'] + 'libraries', 'headers', 'scripts', 'py_modules', 'scons_scripts'] _dict_keys = ['package_dir'] _extra_keys = ['name', 'version'] @@ -1166,6 +1166,27 @@ self.warn('distutils distribution has been initialized,'\ ' it may be too late to add a library '+ name) + def add_sconscript(self, sconscript, + subpackage_path=None, + standalone = False): + """Add a list of sconscript to configuration. + """ + #print "%s: adding %s" % (__file__, sconscript) + if standalone: + parent_name = None + else: + parent_name = self.name + + dist = self.get_distribution() + fullsconsname = self.paths(sconscript) + + if dist is not None: + dist.scons_scripts.extend(fullsconsname) + self.warn('distutils distribution has been initialized,'\ + ' it may be too late to add a subpackage '+ subpackage_name) + else: + self.scons_scripts.extend(fullsconsname) + def add_scripts(self,*files): """Add scripts to configuration. """ Modified: branches/numpy.scons/numpy/setup.py =================================================================== --- branches/numpy.scons/numpy/setup.py 2007-09-20 08:32:14 UTC (rev 4054) +++ branches/numpy.scons/numpy/setup.py 2007-09-20 08:32:42 UTC (rev 4055) @@ -4,6 +4,7 @@ from numpy.distutils.misc_util import Configuration config = Configuration('numpy',parent_package,top_path) config.add_subpackage('distutils') + config.add_subpackage('scons_fake') config.add_subpackage('testing') config.add_subpackage('f2py') config.add_subpackage('core') From numpy-svn at scipy.org Thu Sep 20 04:33:15 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 03:33:15 -0500 (CDT) Subject: [Numpy-svn] r4056 - in branches/numpy.scons: . numpy numpy/distutils numpy/scons_fake Message-ID: <20070920083315.C927039C387@new.scipy.org> Author: cdavid Date: 2007-09-20 03:33:02 -0500 (Thu, 20 Sep 2007) New Revision: 4056 Added: branches/numpy.scons/numpy/distutils/numpy_distribution.py branches/numpy.scons/numpy/scons_fake/ branches/numpy.scons/numpy/scons_fake/setup.py Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/core.py Log: Replace distutils.Distribution by our own NumpyDistribution subclass, for scons support Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-20 17:15:09.678999901 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-20 17:19:10.516000032 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - + numpy/scons_fake scons_fake-20070920081521-unftng09muypbx5t-1 numpy/scons_fake/setup.py setup.py-20070920081521-unftng09muypbx5t-2 numpy/distutils/numpy_distribution.py numpy_distribution.p-20070920081526-b24h80xbm48z2tfx-1 Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z Modified: branches/numpy.scons/numpy/distutils/core.py =================================================================== --- branches/numpy.scons/numpy/distutils/core.py 2007-09-20 08:32:42 UTC (rev 4055) +++ branches/numpy.scons/numpy/distutils/core.py 2007-09-20 08:33:02 UTC (rev 4056) @@ -21,6 +21,7 @@ import distutils.dist from numpy.distutils.extension import Extension +from numpy.distutils.numpy_distribution import NumpyDistribution from numpy.distutils.command import config, config_compiler, \ build, build_py, build_ext, build_clib, build_src, build_scripts, \ sdist, install_data, install_headers, install, bdist_rpm, scons @@ -94,9 +95,10 @@ # class is local to a function in setuptools.command.easy_install if dist is not None and \ repr(dist).find('DistributionWithoutHelpCommands') != -1: + raise NotImplementedError("setuptools not supported yet for numpy.scons branch") dist = None if always and dist is None: - dist = distutils.dist.Distribution() + dist = NumpyDistribution() return dist def _exit_interactive_session(_cache=[]): @@ -174,6 +176,9 @@ and not new_attr.has_key('headers'): new_attr['headers'] = [] + # Use our custom NumpyDistribution class instead of distutils' one + new_attr['distclass'] = NumpyDistribution + return old_setup(**new_attr) def _check_append_library(libraries, item): Added: branches/numpy.scons/numpy/distutils/numpy_distribution.py =================================================================== --- branches/numpy.scons/numpy/distutils/numpy_distribution.py 2007-09-20 08:32:42 UTC (rev 4055) +++ branches/numpy.scons/numpy/distutils/numpy_distribution.py 2007-09-20 08:33:02 UTC (rev 4056) @@ -0,0 +1,9 @@ +from distutils.core import Distribution + +class NumpyDistribution(Distribution): + def __init__(self, attrs = None): + self.scons_scripts = [] + Distribution.__init__(self, attrs) + + def has_scons_scripts(self): + return bool(self.scons_scripts) Added: branches/numpy.scons/numpy/scons_fake/setup.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-20 08:32:42 UTC (rev 4055) +++ branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-20 08:33:02 UTC (rev 4056) @@ -0,0 +1,12 @@ + +def configuration(parent_package='',top_path=None): + from numpy.distutils.misc_util import Configuration + from numpy.distutils.system_info import get_info + config = Configuration('scons_fake',parent_package,top_path) + + config.add_sconscript('SConstruct') + return config + +if __name__ == '__main__': + from numpy.distutils.core import setup + setup(configuration=configuration) From numpy-svn at scipy.org Thu Sep 20 04:33:37 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 03:33:37 -0500 (CDT) Subject: [Numpy-svn] r4057 - in branches/numpy.scons: . numpy/distutils/command Message-ID: <20070920083337.16D2C39C387@new.scipy.org> Author: cdavid Date: 2007-09-20 03:33:24 -0500 (Thu, 20 Sep 2007) New Revision: 4057 Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/command/scons.py Log: Now, scons is launched for each scons scripts added by add_sconscript Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-20 17:19:10.516000032 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-20 17:26:41.709000111 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/scons_fake scons_fake-20070920081521-unftng09muypbx5t-1 numpy/scons_fake/setup.py setup.py-20070920081521-unftng09muypbx5t-2 numpy/distutils/numpy_distribution.py numpy_distribution.p-20070920081526-b24h80xbm48z2tfx-1 + numpy/scons_fake/SConstruct sconstruct-20070920082558-qarsz8evm38aeo1q-1 Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i Modified: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 08:33:02 UTC (rev 4056) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 08:33:24 UTC (rev 4057) @@ -8,8 +8,16 @@ pass def finalize_options(self): - pass + if self.distribution.has_scons_scripts(): + print "Got it: scons scripts are %s" % self.distribution.scons_scripts + self.scons_scripts = self.distribution.scons_scripts def run(self): - pass - + # XXX: when a scons script is missing, scons only prints warnings, and + # does not return a failure (status is 0). We have to detect this from + # distutils (this cannot work for recursive scons builds...) + for i in self.scons_scripts: + cmd = "scons -f " + i + ' -I. ' + import os + st = os.system(cmd) + print "status is %d" % st From numpy-svn at scipy.org Thu Sep 20 05:46:04 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 04:46:04 -0500 (CDT) Subject: [Numpy-svn] r4058 - numpy.sunperf/numpy/distutils Message-ID: <20070920094604.6AAFD39C3EF@new.scipy.org> Author: cdavid Date: 2007-09-20 04:45:57 -0500 (Thu, 20 Sep 2007) New Revision: 4058 Modified: numpy.sunperf/numpy/distutils/sunccompiler.py Log: fix missing sys import for sun C compiler Modified: numpy.sunperf/numpy/distutils/sunccompiler.py =================================================================== --- numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-20 08:33:24 UTC (rev 4057) +++ numpy.sunperf/numpy/distutils/sunccompiler.py 2007-09-20 09:45:57 UTC (rev 4058) @@ -1,11 +1,13 @@ """Sun studio compiler (both solaris and linux).""" +import sys + from distutils.unixccompiler import UnixCCompiler from numpy.distutils.exec_command import find_executable class SunCCompiler(UnixCCompiler): """ A modified Sun compiler compatible with an gcc built Python. """ compiler_type = 'sun' - if platform[:5] == 'linux': + if sys.platform[:5] == 'linux': # Use suncc instead of cc, because it makes it more obvious to follow # what's going on when several compilers are available on linux. cc_exe = 'suncc' From numpy-svn at scipy.org Thu Sep 20 08:36:10 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 07:36:10 -0500 (CDT) Subject: [Numpy-svn] r4059 - numpy.sunperf/numpy/distutils Message-ID: <20070920123610.90F3439C128@new.scipy.org> Author: cdavid Date: 2007-09-20 07:36:04 -0500 (Thu, 20 Sep 2007) New Revision: 4059 Modified: numpy.sunperf/numpy/distutils/system_info.py Log: Remove mtsk dependency for sunperf on solaris Modified: numpy.sunperf/numpy/distutils/system_info.py =================================================================== --- numpy.sunperf/numpy/distutils/system_info.py 2007-09-20 09:45:57 UTC (rev 4058) +++ numpy.sunperf/numpy/distutils/system_info.py 2007-09-20 12:36:04 UTC (rev 4059) @@ -919,18 +919,19 @@ info = {} dict_append(info,**sunperf) - # Look for mtsk: we basically assume that mtsk is here once sunperf is - # detected. - mtsk = None - for d in lib_dirs: - mtsk = self.check_libs2(d,self._lib_sunperf_suplink) - if mtsk is not None: - break - if mtsk is None: - return - dict_append(info,**mtsk) + # Look for mtsk: we basically assume that mtsk is here once sunperf is + # detected. There is no need for mtsk for Solaris ? + if sys.platform[:5] == 'linux': + mtsk = None + for d in lib_dirs: + mtsk = self.check_libs2(d,self._lib_sunperf_suplink) + if mtsk is not None: + break + if mtsk is None: + return + dict_append(info,**mtsk) - # Now, the info is complete + # Now, the info is complete dict_append(info, define_macros=[('SCIPY_SUNPERF_H',None)], include_dirs = incl_dirs) From numpy-svn at scipy.org Thu Sep 20 09:17:41 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 08:17:41 -0500 (CDT) Subject: [Numpy-svn] r4060 - in branches/numpy.scons: . numpy/distutils numpy/distutils/command numpy/scons_fake Message-ID: <20070920131741.8AB4039C0E8@new.scipy.org> Author: cdavid Date: 2007-09-20 08:17:21 -0500 (Thu, 20 Sep 2007) New Revision: 4060 Added: branches/numpy.scons/numpy/scons_fake/SConstruct branches/numpy.scons/numpy/scons_fake/foo.c Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/command/build_ext.py branches/numpy.scons/numpy/distutils/command/scons.py branches/numpy.scons/numpy/distutils/misc_util.py branches/numpy.scons/numpy/scons_fake/setup.py Log: Random hacks/experiments to understand how distutils create/pass build dir and source dir values Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-20 17:26:41.709000111 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-20 22:07:30.914000034 +0900 committer: David Cournapeau properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/scons_fake/SConstruct sconstruct-20070920082558-qarsz8evm38aeo1q-1 + numpy/scons_fake/SConstruct sconstruct-20070920125938-jw3np1dk1gtr5a4s-1 numpy/scons_fake/foo.f foo.f-20070920125945-d65hghrwpt9bnt0m-1 numpy/scons_fake/foo.c foo.c-20070920125943-f6sf0rnbhik75mtj-1 Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p Modified: branches/numpy.scons/numpy/distutils/command/build_ext.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/build_ext.py 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/distutils/command/build_ext.py 2007-09-20 13:17:21 UTC (rev 4060) @@ -295,6 +295,8 @@ "but no C++ linker found, using default linker" % (ext.name)) kws = {'depends':ext.depends} + print "====================================" + print "tmp build dir is %s" % self.build_temp output_dir = self.build_temp include_dirs = ext.include_dirs + get_numpy_include_dirs() Modified: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 13:17:21 UTC (rev 4060) @@ -1,5 +1,13 @@ +import os +import os.path + from distutils.core import Command +from numpy.distutils.ccompiler import CCompiler +# XXX: this is super ugly. The object/source filenames generations is handled +# inside compiler classes in distutils, so to get the same convention, we +# instantiate a CCompiler object, which will not be used for compilation at +# all. class scons(Command): description = "Scons builder" user_options = [] @@ -17,7 +25,7 @@ # does not return a failure (status is 0). We have to detect this from # distutils (this cannot work for recursive scons builds...) for i in self.scons_scripts: + print "Basename for %s is %s" % (i, os.path.dirname(i)) cmd = "scons -f " + i + ' -I. ' - import os st = os.system(cmd) print "status is %d" % st Modified: branches/numpy.scons/numpy/distutils/misc_util.py =================================================================== --- branches/numpy.scons/numpy/distutils/misc_util.py 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/distutils/misc_util.py 2007-09-20 13:17:21 UTC (rev 4060) @@ -1178,6 +1178,8 @@ parent_name = self.name dist = self.get_distribution() + # Convert the sconscript name to a relative filename (relative from top + # setup.py's directory) fullsconsname = self.paths(sconscript) if dist is not None: Added: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-20 13:17:21 UTC (rev 4060) @@ -0,0 +1,3 @@ +env = Environment() + +env.Library('foo', source = ['foo.c']) Added: branches/numpy.scons/numpy/scons_fake/foo.c =================================================================== --- branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-20 13:17:21 UTC (rev 4060) @@ -0,0 +1,4 @@ +int foo(void) +{ + return 0; +} Modified: branches/numpy.scons/numpy/scons_fake/setup.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-20 12:36:04 UTC (rev 4059) +++ branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-20 13:17:21 UTC (rev 4060) @@ -1,9 +1,46 @@ +import os +import os.path +def get_object_names(source_filenames, strip_dir=0, output_dir=''): + # ripped off distutilc.ccompiler (CCompiler_object_filenames) + if output_dir is None: + output_dir = '' + obj_names = [] + for src_name in source_filenames: + base, ext = os.path.splitext(os.path.normpath(src_name)) + base = os.path.splitdrive(base)[1] # Chop off the drive + base = base[os.path.isabs(base):] # If abs, chop off leading / + if base.startswith('..'): + # Resolve starting relative path components, middle ones + # (if any) have been handled by os.path.normpath above. + i = base.rfind('..')+2 + d = base[:i] + d = os.path.basename(os.path.abspath(d)) + base = d + base[i:] + #XXX: how to know which file types are supported ? + #if ext not in self.src_extensions: + # raise UnknownFileError, \ + # "unknown file type '%s' (from '%s')" % (ext, src_name) + if strip_dir: + base = os.path.basename(base) + #XXX: change '.o' to something like obj_extension + obj_name = os.path.join(output_dir,base + '.o') + obj_names.append(obj_name) + return obj_names + def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration from numpy.distutils.system_info import get_info config = Configuration('scons_fake',parent_package,top_path) + print "===================================================" + print "parent package is %s, top path %s" % (parent_package, top_path) + print "THIS package is %s" % config.name + print "THIS package path is %s" % config.package_path + #print get_object_names(['foo.c']) + + #config.add_library('_fortran_foo', + # sources=['foo.f']) config.add_sconscript('SConstruct') return config From numpy-svn at scipy.org Thu Sep 20 13:34:41 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 12:34:41 -0500 (CDT) Subject: [Numpy-svn] r4061 - in branches/numpy.scons/numpy: distutils/command scons_fake Message-ID: <20070920173441.5D2A939C198@new.scipy.org> Author: cdavid Date: 2007-09-20 12:34:32 -0500 (Thu, 20 Sep 2007) New Revision: 4061 Modified: branches/numpy.scons/numpy/distutils/command/scons.py branches/numpy.scons/numpy/scons_fake/SConstruct Log: First working sconsified shared library, but with lot of manual work inside Scons Modified: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 13:17:21 UTC (rev 4060) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-20 17:34:32 UTC (rev 4061) @@ -1,31 +1,47 @@ import os import os.path -from distutils.core import Command +#from distutils.core import build_py as old_build_py +from distutils.command.build_ext import build_ext as old_build_py from numpy.distutils.ccompiler import CCompiler # XXX: this is super ugly. The object/source filenames generations is handled -# inside compiler classes in distutils, so to get the same convention, we -# instantiate a CCompiler object, which will not be used for compilation at -# all. -class scons(Command): +# inside compiler classes and build_ext in distutils, so to get the same +# convention, we derive scons command from build_ext instead of just Command. +class scons(old_build_py): description = "Scons builder" user_options = [] def initialize_options(self): + old_build_py.initialize_options(self) pass def finalize_options(self): + old_build_py.finalize_options(self) if self.distribution.has_scons_scripts(): print "Got it: scons scripts are %s" % self.distribution.scons_scripts self.scons_scripts = self.distribution.scons_scripts + # build_py = self.get_finalized_command('build_py') + #print "!!!!!!!!!!!!!!!!!!" + #print self.build_temp + #print self.build_lib + #print self.package def run(self): # XXX: when a scons script is missing, scons only prints warnings, and # does not return a failure (status is 0). We have to detect this from # distutils (this cannot work for recursive scons builds...) for i in self.scons_scripts: - print "Basename for %s is %s" % (i, os.path.dirname(i)) + #print "For sconscript %s" % i + #print "\tbuild dir (object files) is %s" % \ + # os.path.join(self.build_temp, os.path.dirname(i)) + #print "\ttarget dir (.so files) is %s" % \ + # os.path.join(self.build_lib, os.path.dirname(i)) + #print "Basename for %s is %s" % (i, os.path.dirname(i)) cmd = "scons -f " + i + ' -I. ' + cmd += ' src_prefix=%s ' % os.path.dirname(i) + cmd += ' obj_prefix=%s ' % os.path.join(self.build_temp, os.path.dirname(i)) + cmd += ' lib_prefix=%s ' % os.path.join(self.build_lib, os.path.dirname(i)) st = os.system(cmd) - print "status is %d" % st + if st: + print "status is %d" % st Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-20 13:17:21 UTC (rev 4060) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-20 17:34:32 UTC (rev 4061) @@ -1,3 +1,19 @@ +# vim:syntax=python +import os.path + env = Environment() +src_prefix = ARGUMENTS.get('src_prefix', '') +obj_prefix = ARGUMENTS.get('obj_prefix', '') +lib_prefix = ARGUMENTS.get('lib_prefix', '') -env.Library('foo', source = ['foo.c']) +source = ['foo.c'] +object = ['foo'] +if len(src_prefix): + source = [os.path.join(src_prefix, i) for i in source] +if len(src_prefix): + object = [os.path.join(obj_prefix, i) for i in object] + +onodes = [] +for i in range(len(source)): + onodes.append(env.SharedObject(object[i], source = [source[i]])) +env.SharedLibrary(os.path.join(lib_prefix, 'foo'), onodes) From numpy-svn at scipy.org Thu Sep 20 15:26:28 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 14:26:28 -0500 (CDT) Subject: [Numpy-svn] r4062 - trunk Message-ID: <20070920192628.5163E39C035@new.scipy.org> Author: stefan Date: 2007-09-20 14:26:09 -0500 (Thu, 20 Sep 2007) New Revision: 4062 Modified: trunk/DEV_README.txt Log: Remove trailing whitespace. Add a reminder about unit tests. Modified: trunk/DEV_README.txt =================================================================== --- trunk/DEV_README.txt 2007-09-20 17:34:32 UTC (rev 4061) +++ trunk/DEV_README.txt 2007-09-20 19:26:09 UTC (rev 4062) @@ -1,13 +1,14 @@ Thank you for your willingness to help make NumPy the best array system available. -The only rules we like to follow are to try hard to keep the SVN -repository in a buildable state and to not indiscriminately muck with -what others have contributed. +The only rules we like to follow are to try hard to keep the SVN +repository in a buildable state and to not indiscriminately muck with +what others have contributed. Simple changes and obvious improvements are always welcome. Changes -that fundamentally change behavior need discussion on +that fundamentally change behavior need discussion on numpy-discussions at scipy.org before anything is done. Please add meaningful comments when you check changes in. These comments -form the basis of the change-log. +form the basis of the change-log. Add unit tests to excercise new +code, and regression tests whenever you fix a bug. From numpy-svn at scipy.org Thu Sep 20 15:30:41 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 14:30:41 -0500 (CDT) Subject: [Numpy-svn] r4063 - trunk/numpy/lib/tests Message-ID: <20070920193041.C672939C088@new.scipy.org> Author: stefan Date: 2007-09-20 14:30:24 -0500 (Thu, 20 Sep 2007) New Revision: 4063 Modified: trunk/numpy/lib/tests/test_twodim_base.py Log: Add test -- dimensions for rot90. Modified: trunk/numpy/lib/tests/test_twodim_base.py =================================================================== --- trunk/numpy/lib/tests/test_twodim_base.py 2007-09-20 19:26:09 UTC (rev 4062) +++ trunk/numpy/lib/tests/test_twodim_base.py 2007-09-20 19:30:24 UTC (rev 4063) @@ -133,6 +133,9 @@ for k in range(0,13,4): assert_equal(rot90(a,k=k),b4) + def check_axes(self): + a = ones((50,40,3)) + assert_equal(rot90(a).shape,(40,50,3)) class test_histogram2d(NumpyTestCase): def check_simple(self): From numpy-svn at scipy.org Thu Sep 20 17:12:44 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 16:12:44 -0500 (CDT) Subject: [Numpy-svn] r4064 - trunk/numpy Message-ID: <20070920211244.BF63339C1D6@new.scipy.org> Author: stefan Date: 2007-09-20 16:12:04 -0500 (Thu, 20 Sep 2007) New Revision: 4064 Modified: trunk/numpy/add_newdocs.py Log: Update documentation for `where`. Modified: trunk/numpy/add_newdocs.py =================================================================== --- trunk/numpy/add_newdocs.py 2007-09-20 19:30:24 UTC (rev 4063) +++ trunk/numpy/add_newdocs.py 2007-09-20 21:12:04 UTC (rev 4064) @@ -339,19 +339,31 @@ """) add_newdoc('numpy.core.multiarray','where', - """where(condition, | x, y) + """where(condition, x, y) or where(condition) - The result is shaped like condition and has elements of x and y where - condition is respectively true or false. If x or y are not given, - condition.nonzero() is returned. + Return elements from `x` or `y`, depending on `condition`. - To group the indices by element, rather than dimension, use + *Parameters*: + condition : array of bool + When True, yield x, otherwise yield y. + x,y : 1-dimensional arrays + Values from which to choose. - transpose(where(condition)) + *Notes* + This is equivalent to - instead. This always results in a 2d array, with a row of indices for - each element that satisfies the condition. + [xv if c else yv for (c,xv,yv) in zip(condition,x,y)] + The result is shaped like `condition` and has elements of `x` + or `y` where `condition` is respectively True or False. + + In the special case, where only `condition` is given, the + tuple condition.nonzero() is returned, instead. + + *Examples* + >>> where([True,False,True],[1,2,3],[4,5,6]) + array([1, 5, 3]) + """) From numpy-svn at scipy.org Thu Sep 20 21:22:49 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 20:22:49 -0500 (CDT) Subject: [Numpy-svn] r4065 - in trunk/numpy/core: src tests Message-ID: <20070921012249.2C87639C192@new.scipy.org> Author: oliphant Date: 2007-09-20 20:22:44 -0500 (Thu, 20 Sep 2007) New Revision: 4065 Modified: trunk/numpy/core/src/multiarraymodule.c trunk/numpy/core/tests/test_regression.py Log: Fix ticket #546: invalid argmax for non-native arrays. Modified: trunk/numpy/core/src/multiarraymodule.c =================================================================== --- trunk/numpy/core/src/multiarraymodule.c 2007-09-20 21:12:04 UTC (rev 4064) +++ trunk/numpy/core/src/multiarraymodule.c 2007-09-21 01:22:44 UTC (rev 4065) @@ -3675,9 +3675,11 @@ op = ap; } + /* Will get native-byte order contiguous copy. + */ ap = (PyArrayObject *)\ - PyArray_ContiguousFromAny((PyObject *)op, - PyArray_NOTYPE, 1, 0); + PyArray_ContiguousFromAny((PyObject *)op, + op->descr->type_num, 1, 0); Py_DECREF(op); if (ap == NULL) return NULL; @@ -3693,7 +3695,7 @@ if (m == 0) { PyErr_SetString(MultiArrayError, "attempt to get argmax/argmin "\ - "of an empty sequence??"); + "of an empty sequence"); goto fail; } @@ -3719,7 +3721,7 @@ } NPY_BEGIN_THREADS_DESCR(ap->descr) - n = PyArray_SIZE(ap)/m; + n = PyArray_SIZE(ap)/m; rptr = (intp *)rp->data; for (ip = ap->data, i=0; idescr) - Py_DECREF(ap); + Py_DECREF(ap); if (copyret) { PyArrayObject *obj; obj = (PyArrayObject *)rp->base; Modified: trunk/numpy/core/tests/test_regression.py =================================================================== --- trunk/numpy/core/tests/test_regression.py 2007-09-20 21:12:04 UTC (rev 4064) +++ trunk/numpy/core/tests/test_regression.py 2007-09-21 01:22:44 UTC (rev 4065) @@ -697,6 +697,11 @@ x = N.array(['a']*32) assert_array_equal(x.argsort(kind='m'), N.arange(32)) + def check_argmax_byteorder(self, level=rlevel): + """Ticket #546""" + a = arange(3, dtype='>f') + assert a[a.argmax()] == a.max() + def check_numeric_random(self, level=rlevel): """Ticket #552""" from numpy.oldnumeric.random_array import randint @@ -720,5 +725,6 @@ """Ticket #572""" N.lib.place(1,1,1) + if __name__ == "__main__": NumpyTest().run() From numpy-svn at scipy.org Thu Sep 20 21:56:06 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 20:56:06 -0500 (CDT) Subject: [Numpy-svn] r4066 - trunk/numpy/core/tests Message-ID: <20070921015606.0B6FB39C063@new.scipy.org> Author: oliphant Date: 2007-09-20 20:56:03 -0500 (Thu, 20 Sep 2007) New Revision: 4066 Modified: trunk/numpy/core/tests/test_regression.py Log: Fix missing import. Modified: trunk/numpy/core/tests/test_regression.py =================================================================== --- trunk/numpy/core/tests/test_regression.py 2007-09-21 01:22:44 UTC (rev 4065) +++ trunk/numpy/core/tests/test_regression.py 2007-09-21 01:56:03 UTC (rev 4066) @@ -699,7 +699,7 @@ def check_argmax_byteorder(self, level=rlevel): """Ticket #546""" - a = arange(3, dtype='>f') + a = N.arange(3, dtype='>f') assert a[a.argmax()] == a.max() def check_numeric_random(self, level=rlevel): From numpy-svn at scipy.org Fri Sep 21 00:19:59 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 23:19:59 -0500 (CDT) Subject: [Numpy-svn] r4067 - trunk/numpy/core/src Message-ID: <20070921041959.D410239C110@new.scipy.org> Author: oliphant Date: 2007-09-20 23:19:00 -0500 (Thu, 20 Sep 2007) New Revision: 4067 Modified: trunk/numpy/core/src/multiarraymodule.c Log: Fix places where RENEW is called so that if reallocation fails, cleanup is done gracefully. Modified: trunk/numpy/core/src/multiarraymodule.c =================================================================== --- trunk/numpy/core/src/multiarraymodule.c 2007-09-21 01:56:03 UTC (rev 4066) +++ trunk/numpy/core/src/multiarraymodule.c 2007-09-21 04:19:00 UTC (rev 4067) @@ -3679,7 +3679,7 @@ */ ap = (PyArrayObject *)\ PyArray_ContiguousFromAny((PyObject *)op, - op->descr->type_num, 1, 0); + op->descr->type_num, 1, 0); Py_DECREF(op); if (ap == NULL) return NULL; @@ -5998,8 +5998,8 @@ { PyArrayObject *r; intp i; - char *dptr, *clean_sep; - + char *dptr, *clean_sep, *tmp; + int err = 0; intp thisbuf = 0; intp size; intp bytes, totalbytes; @@ -6025,19 +6025,29 @@ dptr += dtype->elsize; if (num < 0 && thisbuf == size) { totalbytes += bytes; - r->data = PyDataMem_RENEW(r->data, totalbytes); - dptr = r->data + (totalbytes - bytes); + tmp = PyDataMem_RENEW(r->data, totalbytes); + if (tmp == NULL) { + err = 1; + break; + } + r->data = tmp; + dptr = tmp + (totalbytes - bytes); thisbuf = 0; } if (skip_sep(&stream, clean_sep, stream_data) < 0) break; } if (num < 0) { - r->data = PyDataMem_RENEW(r->data, (*nread)*dtype->elsize); - PyArray_DIM(r,0) = *nread; + tmp = PyDataMem_RENEW(r->data, (*nread)*dtype->elsize); + if (tmp == NULL) err=1; + else { + PyArray_DIM(r,0) = *nread; + r->data = tmp; + } } NPY_END_ALLOW_THREADS; free(clean_sep); + if (err == 1) PyErr_NoMemory(); if (PyErr_Occurred()) { Py_DECREF(r); return NULL; @@ -6229,6 +6239,7 @@ { PyArrayObject *ret; size_t nread = 0; + char *tmp; if (PyDataType_REFCHK(dtype)) { PyErr_SetString(PyExc_ValueError, @@ -6262,8 +6273,13 @@ if (((intp) nread) < num) { fprintf(stderr, "%ld items requested but only %ld read\n", (long) num, (long) nread); - ret->data = PyDataMem_RENEW(ret->data, - nread * ret->descr->elsize); + tmp = PyDataMem_RENEW(ret->data, + nread * ret->descr->elsize); + if (tmp == NULL) { + Py_DECREF(ret); + return PyErr_NoMemory(); + } + ret->data = tmp; PyArray_DIM(ret,0) = nread; } return (PyObject *)ret; @@ -6384,11 +6400,12 @@ (assuming realloc is reasonably good about reusing space...) */ if (i==0) i = 1; - ret->data = PyDataMem_RENEW(ret->data, i * elsize); - if (ret->data == NULL) { + new_data = PyDataMem_RENEW(ret->data, i * elsize); + if (new_data == NULL) { PyErr_SetString(PyExc_MemoryError, "cannot allocate array memory"); goto done; } + ret->data = new_data; done: Py_XDECREF(iter); From numpy-svn at scipy.org Fri Sep 21 00:25:43 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Thu, 20 Sep 2007 23:25:43 -0500 (CDT) Subject: [Numpy-svn] r4068 - trunk Message-ID: <20070921042543.D875A39C284@new.scipy.org> Author: chris.barker Date: 2007-09-20 23:25:10 -0500 (Thu, 20 Sep 2007) New Revision: 4068 Modified: trunk/DEV_README.txt Log: Just a check to make sure I can log in Modified: trunk/DEV_README.txt =================================================================== --- trunk/DEV_README.txt 2007-09-21 04:19:00 UTC (rev 4067) +++ trunk/DEV_README.txt 2007-09-21 04:25:10 UTC (rev 4068) @@ -9,6 +9,7 @@ that fundamentally change behavior need discussion on numpy-discussions at scipy.org before anything is done. + Please add meaningful comments when you check changes in. These comments form the basis of the change-log. Add unit tests to excercise new code, and regression tests whenever you fix a bug. From numpy-svn at scipy.org Fri Sep 21 01:24:45 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 00:24:45 -0500 (CDT) Subject: [Numpy-svn] r4069 - in trunk/numpy/linalg: . tests Message-ID: <20070921052445.44EEE39C110@new.scipy.org> Author: oliphant Date: 2007-09-21 00:23:46 -0500 (Fri, 21 Sep 2007) New Revision: 4069 Modified: trunk/numpy/linalg/linalg.py trunk/numpy/linalg/tests/test_linalg.py Log: Apply patch to fix ticket #557 (pinv causing error with empty arrays) Modified: trunk/numpy/linalg/linalg.py =================================================================== --- trunk/numpy/linalg/linalg.py 2007-09-21 04:25:10 UTC (rev 4068) +++ trunk/numpy/linalg/linalg.py 2007-09-21 05:23:46 UTC (rev 4069) @@ -20,7 +20,7 @@ intc, single, double, csingle, cdouble, inexact, complexfloating, \ newaxis, ravel, all, Inf, dot, add, multiply, identity, sqrt, \ maximum, flatnonzero, diagonal, arange, fastCopyAndTranspose, sum, \ - isfinite + isfinite, size from numpy.lib import triu from numpy.linalg import lapack_lite @@ -126,6 +126,11 @@ if not (isfinite(a).all()): raise LinAlgError, "Array must not contain infs or NaNs" +def _assertNonEmpty(*arrays): + for a in arrays: + if size(a) == 0: + raise LinAlgError("Arrays cannot be empty") + # Linear equations def tensorsolve(a, b, axes=None): @@ -718,6 +723,7 @@ """ a, wrap = _makearray(a) _assertRank2(a) + _assertNonEmpty(a) m, n = a.shape t, result_t = _commonType(a) real_t = _linalgRealType(t) @@ -783,6 +789,7 @@ rcond of the largest. """ a, wrap = _makearray(a) + _assertNonEmpty(a) a = a.conjugate() u, s, vt = svd(a, 0) m = u.shape[0] Modified: trunk/numpy/linalg/tests/test_linalg.py =================================================================== --- trunk/numpy/linalg/tests/test_linalg.py 2007-09-21 04:25:10 UTC (rev 4068) +++ trunk/numpy/linalg/tests/test_linalg.py 2007-09-21 05:23:46 UTC (rev 4069) @@ -4,7 +4,7 @@ from numpy.testing import * set_package_path() from numpy import array, single, double, csingle, cdouble, dot, identity, \ - multiply + multiply, atleast_2d from numpy import linalg restore_path() @@ -37,6 +37,15 @@ b = array([2.+1j, 1.+2j], dtype=cdouble) self.do(a, b) + def check_empty(self): + a = atleast_2d(array([], dtype = double)) + b = atleast_2d(array([], dtype = double)) + try: + self.do(a, b) + raise AssertionError("%s should fail with empty matrices", self.__name__[5:]) + except linalg.LinAlgError, e: + pass + class test_solve(LinalgTestCase): def do(self, a, b): x = linalg.solve(a, b) From numpy-svn at scipy.org Fri Sep 21 03:46:26 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 02:46:26 -0500 (CDT) Subject: [Numpy-svn] r4070 - in branches/numpy.scons: . numpy/distutils numpy/distutils/command numpy/scons_fake Message-ID: <20070921074626.6CFA039C179@new.scipy.org> Author: cdavid Date: 2007-09-21 02:46:01 -0500 (Fri, 21 Sep 2007) New Revision: 4070 Added: branches/numpy.scons/numpy/distutils/scons/ Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/command/scons.py branches/numpy.scons/numpy/scons_fake/SConstruct Log: Almost getting build dir and install dir right Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-20 22:07:30.914000034 +0900 committer: David Cournapeau properties: branch-nick: numpy.scons + timestamp: 2007-09-21 16:37:42.802000046 +0900 committer: David Cournapeau properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/scons_fake/SConstruct sconstruct-20070920125938-jw3np1dk1gtr5a4s-1 numpy/scons_fake/foo.f foo.f-20070920125945-d65hghrwpt9bnt0m-1 numpy/scons_fake/foo.c foo.c-20070920125943-f6sf0rnbhik75mtj-1 + numpy/distutils/scons scons-20070921045716-02vll2lwyv36uchw-1 Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m Modified: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-21 05:23:46 UTC (rev 4069) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-21 07:46:01 UTC (rev 4070) @@ -42,6 +42,7 @@ cmd += ' src_prefix=%s ' % os.path.dirname(i) cmd += ' obj_prefix=%s ' % os.path.join(self.build_temp, os.path.dirname(i)) cmd += ' lib_prefix=%s ' % os.path.join(self.build_lib, os.path.dirname(i)) + print cmd st = os.system(cmd) if st: print "status is %d" % st Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-21 05:23:46 UTC (rev 4069) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-21 07:46:01 UTC (rev 4070) @@ -1,19 +1,37 @@ # vim:syntax=python +from os.path import join as pjoin import os.path -env = Environment() -src_prefix = ARGUMENTS.get('src_prefix', '') -obj_prefix = ARGUMENTS.get('obj_prefix', '') -lib_prefix = ARGUMENTS.get('lib_prefix', '') +opts = Options() +opts.Add('pkg_name', 'name of the package (including parent package if any)', '') +opts.Add('build_prefix', 'build prefix (NOT including the package name)', pjoin('build', 'scons')) +opts.Add('distutils_libdir', 'build dir for libraries of distutils (NOT including the package name)', pjoin('build', 'lib')) +#pkg_name = 'scons_fake' +#build_prefix = pjoin('build', 'scons') +#build_dir = pjoin(build_prefix, pkg_name) +env = Environment(options = opts) +env.AppendUnique(build_dir = pjoin(env['build_prefix'], env['pkg_name'].replace('.', os.path.sep))) +env.AppendUnique(distutils_installdir = pjoin(env['distutils_libdir'], env['pkg_name'].replace('.', os.path.sep))) + +def NumpySharedLibrary(env, target, source, *args, **kw): + source = [pjoin(env['build_dir'], i) for i in source] + # XXX: why target is a list ? It is always true ? + lib = env.SharedLibrary("$build_dir/%s" % target[0], source, *args, **kw) + + inst_lib = env.Install("$distutils_installdir", lib) + return lib, inst_lib + +env['BUILDERS']['NumpySharedLibrary'] = NumpySharedLibrary +BuildDir(env['build_dir'], '.') + source = ['foo.c'] -object = ['foo'] -if len(src_prefix): - source = [os.path.join(src_prefix, i) for i in source] -if len(src_prefix): - object = [os.path.join(obj_prefix, i) for i in object] - -onodes = [] -for i in range(len(source)): - onodes.append(env.SharedObject(object[i], source = [source[i]])) -env.SharedLibrary(os.path.join(lib_prefix, 'foo'), onodes) +#if len(build_dir) > 0: +# source = [pjoin(build_dir, i) for i in source] +#if len(src_prefix): +# object = [pjoin(obj_prefix, i) for i in object] +# +#onodes = [] +#for i in range(len(source)): +# onodes.append(env.SharedObject(object[i], source = [source[i]])) +env.NumpySharedLibrary('foo', source) From numpy-svn at scipy.org Fri Sep 21 12:54:59 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 11:54:59 -0500 (CDT) Subject: [Numpy-svn] r4071 - in trunk/numpy/core: code_generators include/numpy Message-ID: <20070921165459.AF04739C238@new.scipy.org> Author: oliphant Date: 2007-09-21 11:54:38 -0500 (Fri, 21 Sep 2007) New Revision: 4071 Modified: trunk/numpy/core/code_generators/generate_ufunc_api.py trunk/numpy/core/include/numpy/ufuncobject.h Log: Add a fix for ticket #582 by adding a framework for clearing the floating point exception registers for extension modules compiled with different compilers. Modified: trunk/numpy/core/code_generators/generate_ufunc_api.py =================================================================== --- trunk/numpy/core/code_generators/generate_ufunc_api.py 2007-09-21 07:46:01 UTC (rev 4070) +++ trunk/numpy/core/code_generators/generate_ufunc_api.py 2007-09-21 16:54:38 UTC (rev 4071) @@ -48,13 +48,13 @@ return 0; } -#define import_umath() { if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); return; }} +#define import_umath() { UFUNC_NOFPE if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); return; }} -#define import_umath1(ret) { if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); return ret; }} +#define import_umath1(ret) { UFUNC_NOFPE if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); return ret; }} -#define import_umath2(msg, ret) { if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, msg); return ret; }} +#define import_umath2(msg, ret) { UFUNC_NOFPE if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, msg); return ret; }} -#define import_ufunc() { if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); }} +#define import_ufunc() { UFUNC_NOFPE if (_import_umath() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.umath failed to import"); }} #endif Modified: trunk/numpy/core/include/numpy/ufuncobject.h =================================================================== --- trunk/numpy/core/include/numpy/ufuncobject.h 2007-09-21 07:46:01 UTC (rev 4070) +++ trunk/numpy/core/include/numpy/ufuncobject.h 2007-09-21 16:54:38 UTC (rev 4071) @@ -245,6 +245,11 @@ #include + /* Clear the floating point exception default of Borland C++ */ +#if defined(__BORLANDC__) +#define UFUNC_NOFPE _control87(MCW_EM, MCW_EM); +#endif + #define UFUNC_CHECK_STATUS(ret) { \ int fpstatus = (int) _clearfp(); \ \ @@ -358,7 +363,12 @@ } #endif + /* Make sure it gets defined if it isn't already */ +#ifndef UFUNC_NOFPE +#define UFUNC_NOFPE +#endif + #ifdef __cplusplus } #endif From numpy-svn at scipy.org Fri Sep 21 13:15:00 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 12:15:00 -0500 (CDT) Subject: [Numpy-svn] r4072 - trunk/numpy/core Message-ID: <20070921171500.A969639C011@new.scipy.org> Author: oliphant Date: 2007-09-21 12:14:57 -0500 (Fri, 21 Sep 2007) New Revision: 4072 Modified: trunk/numpy/core/memmap.py Log: Fix memmap passing on it's mmap attribute to views but not closing the file unless it owns the memmap Modified: trunk/numpy/core/memmap.py =================================================================== --- trunk/numpy/core/memmap.py 2007-09-21 16:54:38 UTC (rev 4071) +++ trunk/numpy/core/memmap.py 2007-09-21 17:14:57 UTC (rev 4072) @@ -80,10 +80,7 @@ if obj is not None: if not isinstance(obj, memmap): raise ValueError, "Cannot create a memmap array that way" - # it would be nice to carry the along the _mmap name - # but then we might have problems because self could close - # it while obj is still holding it. So, we don't do - # anything at this point. + self._mmap = obj._mmap else: self._mmap = None @@ -91,9 +88,10 @@ self._mmap.flush() def close(self): - self._mmap.close() + if (self.base is self._mmap): + self._mmap.close() def __del__(self): if self._mmap is not None: self._mmap.flush() - del self._mmap + self.close() From numpy-svn at scipy.org Fri Sep 21 13:21:10 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 12:21:10 -0500 (CDT) Subject: [Numpy-svn] r4073 - trunk/numpy/core Message-ID: <20070921172110.4C0AB39C011@new.scipy.org> Author: oliphant Date: 2007-09-21 12:21:06 -0500 (Fri, 21 Sep 2007) New Revision: 4073 Modified: trunk/numpy/core/memmap.py Log: Raise an error if you try to close a memory-map that you don't own. Modified: trunk/numpy/core/memmap.py =================================================================== --- trunk/numpy/core/memmap.py 2007-09-21 17:14:57 UTC (rev 4072) +++ trunk/numpy/core/memmap.py 2007-09-21 17:21:06 UTC (rev 4073) @@ -90,8 +90,14 @@ def close(self): if (self.base is self._mmap): self._mmap.close() + else: + raise ValueError, "Cannot close a memmap that is being used " \ + "by another object." def __del__(self): if self._mmap is not None: self._mmap.flush() - self.close() + try: + self.close() + except: + pass From numpy-svn at scipy.org Fri Sep 21 13:32:32 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Fri, 21 Sep 2007 12:32:32 -0500 (CDT) Subject: [Numpy-svn] r4074 - trunk/numpy/core Message-ID: <20070921173232.6407E39C1FC@new.scipy.org> Author: oliphant Date: 2007-09-21 12:32:21 -0500 (Fri, 21 Sep 2007) New Revision: 4074 Modified: trunk/numpy/core/memmap.py Log: A little refactoring of memmap Modified: trunk/numpy/core/memmap.py =================================================================== --- trunk/numpy/core/memmap.py 2007-09-21 17:21:06 UTC (rev 4073) +++ trunk/numpy/core/memmap.py 2007-09-21 17:32:21 UTC (rev 4074) @@ -85,19 +85,20 @@ self._mmap = None def sync(self): - self._mmap.flush() + if self._mmap is not None: + self._mmap.flush() def close(self): if (self.base is self._mmap): self._mmap.close() - else: + elif self._mmap is not None: raise ValueError, "Cannot close a memmap that is being used " \ "by another object." def __del__(self): - if self._mmap is not None: - self._mmap.flush() - try: - self.close() - except: - pass + self.sync() + try: + self.close() + except ValueError: + pass + From numpy-svn at scipy.org Sat Sep 22 03:29:01 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 02:29:01 -0500 (CDT) Subject: [Numpy-svn] r4075 - trunk/numpy/distutils Message-ID: <20070922072901.EEBC339C03D@new.scipy.org> Author: pearu Date: 2007-09-22 02:28:45 -0500 (Sat, 22 Sep 2007) New Revision: 4075 Modified: trunk/numpy/distutils/misc_util.py Log: backport the usage of get_build_architecture to pyhton <=2.4 Modified: trunk/numpy/distutils/misc_util.py =================================================================== --- trunk/numpy/distutils/misc_util.py 2007-09-21 17:32:21 UTC (rev 4074) +++ trunk/numpy/distutils/misc_util.py 2007-09-22 07:28:45 UTC (rev 4075) @@ -22,7 +22,7 @@ 'get_script_files', 'get_lib_source_files', 'get_data_files', 'dot_join', 'get_frame', 'minrelpath','njoin', 'is_sequence', 'is_string', 'as_list', 'gpaths', 'get_language', - 'quote_args'] + 'quote_args', 'get_build_architecture'] def quote_args(args): # don't used _nt_quote_args as it does not check if @@ -321,10 +321,6 @@ def msvc_on_amd64(): if not (sys.platform=='win32' or os.name=='nt'): return - try: # get_build_architecture is only on Python 2.5 - from distutils.msvccompiler import get_build_architecture - except ImportError: - return if get_build_architecture() != 'AMD64': return if os.environ.has_key('DISTUTILS_USE_SDK'): @@ -1514,3 +1510,20 @@ f.close() return target + +if sys.version[:3] >= '2.5': + from distutils.msvccompiler import get_build_architecture +else: + #copied from python 2.5.1 distutils/msvccompiler.py + def get_build_architecture(): + """Return the processor architecture. + + Possible results are "Intel", "Itanium", or "AMD64". + """ + + prefix = " bit (" + i = string.find(sys.version, prefix) + if i == -1: + return "Intel" + j = string.find(sys.version, ")", i) + return sys.version[i+len(prefix):j] From numpy-svn at scipy.org Sat Sep 22 07:54:56 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 06:54:56 -0500 (CDT) Subject: [Numpy-svn] r4076 - in branches/numpy.scons: . numpy/distutils/command numpy/scons_fake Message-ID: <20070922115456.7089139C064@new.scipy.org> Author: cdavid Date: 2007-09-22 06:54:36 -0500 (Sat, 22 Sep 2007) New Revision: 4076 Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/command/scons.py branches/numpy.scons/numpy/scons_fake/SConstruct branches/numpy.scons/numpy/scons_fake/setup.py Log: More improvements on passing dir from distutils to scons Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-21 16:37:42.802000046 +0900 committer: David Cournapeau properties: branch-nick: numpy.scons + timestamp: 2007-09-22 19:16:56.497999907 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/distutils/scons scons-20070921045716-02vll2lwyv36uchw-1 + Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl Modified: branches/numpy.scons/numpy/distutils/command/scons.py =================================================================== --- branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-22 07:28:45 UTC (rev 4075) +++ branches/numpy.scons/numpy/distutils/command/scons.py 2007-09-22 11:54:36 UTC (rev 4076) @@ -1,5 +1,6 @@ import os import os.path +from os.path import join as pjoin, dirname as pdirname #from distutils.core import build_py as old_build_py from distutils.command.build_ext import build_ext as old_build_py @@ -32,17 +33,10 @@ # does not return a failure (status is 0). We have to detect this from # distutils (this cannot work for recursive scons builds...) for i in self.scons_scripts: - #print "For sconscript %s" % i - #print "\tbuild dir (object files) is %s" % \ - # os.path.join(self.build_temp, os.path.dirname(i)) - #print "\ttarget dir (.so files) is %s" % \ - # os.path.join(self.build_lib, os.path.dirname(i)) - #print "Basename for %s is %s" % (i, os.path.dirname(i)) cmd = "scons -f " + i + ' -I. ' - cmd += ' src_prefix=%s ' % os.path.dirname(i) - cmd += ' obj_prefix=%s ' % os.path.join(self.build_temp, os.path.dirname(i)) - cmd += ' lib_prefix=%s ' % os.path.join(self.build_lib, os.path.dirname(i)) - print cmd + cmd += ' src_dir=%s ' % pdirname(i) + cmd += ' distutils_libdir=%s ' % pjoin(self.build_lib, pdirname(i)) + #print cmd st = os.system(cmd) if st: print "status is %d" % st Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 07:28:45 UTC (rev 4075) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 11:54:36 UTC (rev 4076) @@ -4,12 +4,10 @@ opts = Options() opts.Add('pkg_name', 'name of the package (including parent package if any)', '') +opts.Add('src_dir', 'src dir relative to top called', '.') opts.Add('build_prefix', 'build prefix (NOT including the package name)', pjoin('build', 'scons')) opts.Add('distutils_libdir', 'build dir for libraries of distutils (NOT including the package name)', pjoin('build', 'lib')) -#pkg_name = 'scons_fake' -#build_prefix = pjoin('build', 'scons') -#build_dir = pjoin(build_prefix, pkg_name) env = Environment(options = opts) env.AppendUnique(build_dir = pjoin(env['build_prefix'], env['pkg_name'].replace('.', os.path.sep))) env.AppendUnique(distutils_installdir = pjoin(env['distutils_libdir'], env['pkg_name'].replace('.', os.path.sep))) @@ -23,15 +21,10 @@ return lib, inst_lib env['BUILDERS']['NumpySharedLibrary'] = NumpySharedLibrary -BuildDir(env['build_dir'], '.') +if len(env['src_dir']) > 0: + BuildDir(env['build_dir'], env['src_dir']) +else: + BuildDir(env['build_dir'], '.') source = ['foo.c'] -#if len(build_dir) > 0: -# source = [pjoin(build_dir, i) for i in source] -#if len(src_prefix): -# object = [pjoin(obj_prefix, i) for i in object] -# -#onodes = [] -#for i in range(len(source)): -# onodes.append(env.SharedObject(object[i], source = [source[i]])) env.NumpySharedLibrary('foo', source) Modified: branches/numpy.scons/numpy/scons_fake/setup.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-22 07:28:45 UTC (rev 4075) +++ branches/numpy.scons/numpy/scons_fake/setup.py 2007-09-22 11:54:36 UTC (rev 4076) @@ -33,10 +33,10 @@ from numpy.distutils.system_info import get_info config = Configuration('scons_fake',parent_package,top_path) - print "===================================================" - print "parent package is %s, top path %s" % (parent_package, top_path) - print "THIS package is %s" % config.name - print "THIS package path is %s" % config.package_path + ## print "===================================================" + ## print "parent package is %s, top path %s" % (parent_package, top_path) + ## print "THIS package is %s" % config.name + ## print "THIS package path is %s" % config.package_path #print get_object_names(['foo.c']) #config.add_library('_fortran_foo', From numpy-svn at scipy.org Sat Sep 22 07:55:42 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 06:55:42 -0500 (CDT) Subject: [Numpy-svn] r4077 - in branches/numpy.scons: . numpy/distutils/scons numpy/scons_fake Message-ID: <20070922115542.EFD4739C064@new.scipy.org> Author: cdavid Date: 2007-09-22 06:55:05 -0500 (Sat, 22 Sep 2007) New Revision: 4077 Added: branches/numpy.scons/numpy/distutils/scons/__init__.py branches/numpy.scons/numpy/scons_fake/__init__.py Modified: branches/numpy.scons/ branches/numpy.scons/numpy/scons_fake/SConstruct branches/numpy.scons/numpy/scons_fake/foo.c Log: Make scons_fake a ctype example Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-22 19:16:56.497999907 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-22 20:37:08.022000074 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - + numpy/scons_fake/__init__.py __init__.py-20070922113634-7m61zd3x0182bwro-1 numpy/distutils/scons/__init__.py __init__.py-20070922113607-9hdtgj7ooqldhu4w-1 Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl 3745 david at david-laptop-20070922113708-ror18thshang1cpu Added: branches/numpy.scons/numpy/distutils/scons/__init__.py =================================================================== --- branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 11:54:36 UTC (rev 4076) +++ branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 11:55:05 UTC (rev 4077) @@ -0,0 +1,45 @@ +from os.path import join as pjoin +import os.path + +from SCons.Options import Options +from SCons.Environment import Environment +from SCons.Script import BuildDir + + +def NumpySharedLibrary(env, target, source, *args, **kw): + source = [pjoin(env['build_dir'], i) for i in source] + # XXX: why target is a list ? It is always true ? + lib = env.SharedLibrary("$build_dir/%s" % target[0], source, *args, **kw) + + inst_lib = env.Install("$distutils_installdir", lib) + return lib, inst_lib + +def GetNumpyOptions(args): + """Call this with args=ARGUMENTS to take into account command line args.""" + opts = Options(None, args) + opts.Add('pkg_name', 'name of the package (including parent package if any)', '') + opts.Add('src_dir', 'src dir relative to top called', '.') + opts.Add('build_prefix', 'build prefix (NOT including the package name)', + pjoin('build', 'scons')) + opts.Add('distutils_libdir', + 'build dir for libraries of distutils (NOT including the package name)', + pjoin('build', 'lib')) + + return opts + +def GetNumpyEnvironment(args): + """Call this with args = ARGUMENTS.""" + opts = GetNumpyOptions(args) + env = Environment(options = opts) + env.AppendUnique(build_dir = pjoin(env['build_prefix'])) + env.AppendUnique(distutils_installdir = pjoin(env['distutils_libdir'], + env['pkg_name'])) + + env['BUILDERS']['NumpySharedLibrary'] = NumpySharedLibrary + print env['src_dir'] + if len(env['src_dir']) > 0: + BuildDir(env['build_dir'], env['src_dir']) + else: + BuildDir(env['build_dir'], '.') + + return env Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 11:54:36 UTC (rev 4076) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 11:55:05 UTC (rev 4077) @@ -1,30 +1,12 @@ # vim:syntax=python -from os.path import join as pjoin -import os.path +from numpy.distutils.scons import GetNumpyEnvironment -opts = Options() -opts.Add('pkg_name', 'name of the package (including parent package if any)', '') -opts.Add('src_dir', 'src dir relative to top called', '.') -opts.Add('build_prefix', 'build prefix (NOT including the package name)', pjoin('build', 'scons')) -opts.Add('distutils_libdir', 'build dir for libraries of distutils (NOT including the package name)', pjoin('build', 'lib')) +env = GetNumpyEnvironment(ARGUMENTS) -env = Environment(options = opts) -env.AppendUnique(build_dir = pjoin(env['build_prefix'], env['pkg_name'].replace('.', os.path.sep))) -env.AppendUnique(distutils_installdir = pjoin(env['distutils_libdir'], env['pkg_name'].replace('.', os.path.sep))) +config = env.Configure() +config.CheckHeader('stdio.h') +config.CheckLib('c', 'printf') +config.Finish() -def NumpySharedLibrary(env, target, source, *args, **kw): - source = [pjoin(env['build_dir'], i) for i in source] - # XXX: why target is a list ? It is always true ? - lib = env.SharedLibrary("$build_dir/%s" % target[0], source, *args, **kw) - - inst_lib = env.Install("$distutils_installdir", lib) - return lib, inst_lib - -env['BUILDERS']['NumpySharedLibrary'] = NumpySharedLibrary -if len(env['src_dir']) > 0: - BuildDir(env['build_dir'], env['src_dir']) -else: - BuildDir(env['build_dir'], '.') - source = ['foo.c'] env.NumpySharedLibrary('foo', source) Added: branches/numpy.scons/numpy/scons_fake/__init__.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 11:54:36 UTC (rev 4076) +++ branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 11:55:05 UTC (rev 4077) @@ -0,0 +1,6 @@ +from numpy.ctypeslib import load_library + +_FOO = load_library("libfoo.so", __file__) +def foo(): + _FOO.foo() + Modified: branches/numpy.scons/numpy/scons_fake/foo.c =================================================================== --- branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-22 11:54:36 UTC (rev 4076) +++ branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-22 11:55:05 UTC (rev 4077) @@ -1,4 +1,6 @@ +#include + int foo(void) { - return 0; + printf("hello\n"); } From numpy-svn at scipy.org Sat Sep 22 09:48:12 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 08:48:12 -0500 (CDT) Subject: [Numpy-svn] r4078 - in branches/numpy.scons/numpy: distutils/scons scons_fake Message-ID: <20070922134812.3784A39C049@new.scipy.org> Author: cdavid Date: 2007-09-22 08:47:45 -0500 (Sat, 22 Sep 2007) New Revision: 4078 Modified: branches/numpy.scons/numpy/distutils/scons/__init__.py branches/numpy.scons/numpy/scons_fake/SConstruct branches/numpy.scons/numpy/scons_fake/__init__.py branches/numpy.scons/numpy/scons_fake/foo.c Log: Add a CTypesBuilder which does not install exp/lib files on windows Modified: branches/numpy.scons/numpy/distutils/scons/__init__.py =================================================================== --- branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 11:55:05 UTC (rev 4077) +++ branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 13:47:45 UTC (rev 4078) @@ -13,7 +13,17 @@ inst_lib = env.Install("$distutils_installdir", lib) return lib, inst_lib + + +def NumpyCTypes(env, target, source, *args, **kw): + source = [pjoin(env['build_dir'], i) for i in source] + # XXX: why target is a list ? It is always true ? + lib = env.SharedLibrary("$build_dir/%s" % target[0], source, *args, **kw) + lib = [i for i in lib if not (str(i).endswith('.exp') or str(i).endswith('.lib')) ] + inst_lib = env.Install("$distutils_installdir", lib) + return lib, inst_lib + def GetNumpyOptions(args): """Call this with args=ARGUMENTS to take into account command line args.""" opts = Options(None, args) @@ -36,6 +46,7 @@ env['pkg_name'])) env['BUILDERS']['NumpySharedLibrary'] = NumpySharedLibrary + env['BUILDERS']['NumpyCTypes'] = NumpyCTypes print env['src_dir'] if len(env['src_dir']) > 0: BuildDir(env['build_dir'], env['src_dir']) Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 11:55:05 UTC (rev 4077) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 13:47:45 UTC (rev 4078) @@ -9,4 +9,4 @@ config.Finish() source = ['foo.c'] -env.NumpySharedLibrary('foo', source) +env.NumpyCTypes('foo', source) Modified: branches/numpy.scons/numpy/scons_fake/__init__.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 11:55:05 UTC (rev 4077) +++ branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 13:47:45 UTC (rev 4078) @@ -1,6 +1,6 @@ from numpy.ctypeslib import load_library -_FOO = load_library("libfoo.so", __file__) +_FOO = load_library("foo.dll", __file__) def foo(): _FOO.foo() Modified: branches/numpy.scons/numpy/scons_fake/foo.c =================================================================== --- branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-22 11:55:05 UTC (rev 4077) +++ branches/numpy.scons/numpy/scons_fake/foo.c 2007-09-22 13:47:45 UTC (rev 4078) @@ -1,6 +1,13 @@ #include -int foo(void) +#ifdef WIN32 +#define FOO_EXPORT __declspec(dllexport) +#else +#define FOO_EXPORT +#endif + +int FOO_EXPORT foo(void) { printf("hello\n"); + return 0; } From numpy-svn at scipy.org Sat Sep 22 10:06:48 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 09:06:48 -0500 (CDT) Subject: [Numpy-svn] r4079 - in branches/numpy.scons: . numpy/distutils/scons numpy/scons_fake Message-ID: <20070922140648.4B79939C049@new.scipy.org> Author: cdavid Date: 2007-09-22 09:06:28 -0500 (Sat, 22 Sep 2007) New Revision: 4079 Modified: branches/numpy.scons/ branches/numpy.scons/numpy/distutils/scons/__init__.py branches/numpy.scons/numpy/scons_fake/__init__.py Log: Specific prefix for ctypes shared libraries Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-22 20:37:08.022000074 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-22 23:05:34.460999966 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:file-ids - numpy/scons_fake/__init__.py __init__.py-20070922113634-7m61zd3x0182bwro-1 numpy/distutils/scons/__init__.py __init__.py-20070922113607-9hdtgj7ooqldhu4w-1 + Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl 3745 david at david-laptop-20070922113708-ror18thshang1cpu + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl 3745 david at david-laptop-20070922113708-ror18thshang1cpu 3747 david at david-laptop-20070922140534-n9xsl096tjrzmct1 Modified: branches/numpy.scons/numpy/distutils/scons/__init__.py =================================================================== --- branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 13:47:45 UTC (rev 4078) +++ branches/numpy.scons/numpy/distutils/scons/__init__.py 2007-09-22 14:06:28 UTC (rev 4079) @@ -18,12 +18,12 @@ def NumpyCTypes(env, target, source, *args, **kw): source = [pjoin(env['build_dir'], i) for i in source] # XXX: why target is a list ? It is always true ? - lib = env.SharedLibrary("$build_dir/%s" % target[0], source, *args, **kw) + # XXX: handle cases where SHLIBPREFIX is in args + lib = env.SharedLibrary("$build_dir/%s" % target[0], source, SHLIBPREFIX = '', *args, **kw) lib = [i for i in lib if not (str(i).endswith('.exp') or str(i).endswith('.lib')) ] inst_lib = env.Install("$distutils_installdir", lib) return lib, inst_lib - def GetNumpyOptions(args): """Call this with args=ARGUMENTS to take into account command line args.""" opts = Options(None, args) Modified: branches/numpy.scons/numpy/scons_fake/__init__.py =================================================================== --- branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 13:47:45 UTC (rev 4078) +++ branches/numpy.scons/numpy/scons_fake/__init__.py 2007-09-22 14:06:28 UTC (rev 4079) @@ -1,6 +1,6 @@ from numpy.ctypeslib import load_library -_FOO = load_library("foo.dll", __file__) +_FOO = load_library("foo", __file__) def foo(): _FOO.foo() From numpy-svn at scipy.org Sat Sep 22 11:24:23 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 10:24:23 -0500 (CDT) Subject: [Numpy-svn] r4080 - branches/numpy.scons/numpy/scons_fake Message-ID: <20070922152423.EB7BE39C03D@new.scipy.org> Author: cdavid Date: 2007-09-22 10:24:00 -0500 (Sat, 22 Sep 2007) New Revision: 4080 Modified: branches/numpy.scons/numpy/scons_fake/SConstruct Log: Fix scons_fake/SConstruct for win32 case Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 14:06:28 UTC (rev 4079) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 15:24:00 UTC (rev 4080) @@ -9,4 +9,5 @@ config.Finish() source = ['foo.c'] +env.AppendUnique(CPPDEFINES = 'WIN32') env.NumpyCTypes('foo', source) From numpy-svn at scipy.org Sat Sep 22 11:41:05 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sat, 22 Sep 2007 10:41:05 -0500 (CDT) Subject: [Numpy-svn] r4081 - in branches/numpy.scons: . numpy/scons_fake Message-ID: <20070922154105.670EE39C049@new.scipy.org> Author: cdavid Date: 2007-09-22 10:40:52 -0500 (Sat, 22 Sep 2007) New Revision: 4081 Modified: branches/numpy.scons/ branches/numpy.scons/numpy/scons_fake/SConstruct Log: Add WIN32 define only for win32 platform Property changes on: branches/numpy.scons ___________________________________________________________________ Name: bzr:revision-info - timestamp: 2007-09-22 23:05:34.460999966 +0900 committer: david properties: branch-nick: numpy.scons + timestamp: 2007-09-23 00:40:07.401000023 +0900 committer: david properties: branch-nick: numpy.scons Name: bzr:revision-id:v3-trunk0 - 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl 3745 david at david-laptop-20070922113708-ror18thshang1cpu 3747 david at david-laptop-20070922140534-n9xsl096tjrzmct1 + 3737 david at david-laptop-20070920080908-n8pj8vmszdir3zoa 3738 david at david-laptop-20070920081509-58kkojgmml3t7jxs 3739 david at david-laptop-20070920081910-phlk1ujthksgpm0z 3740 david at david-laptop-20070920082641-bdhrt6eafeoli50i 3741 david at ar.media.kyoto-u.ac.jp-20070920130730-satdeppbh1k0bq2p 3743 david at ar.media.kyoto-u.ac.jp-20070921073742-vpv8pwv0j8fbd93m 3744 david at david-laptop-20070922101656-61kfi2faucemr2rl 3745 david at david-laptop-20070922113708-ror18thshang1cpu 3747 david at david-laptop-20070922140534-n9xsl096tjrzmct1 3749 david at david-laptop-20070922154007-usit009fr6vp377j Modified: branches/numpy.scons/numpy/scons_fake/SConstruct =================================================================== --- branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 15:24:00 UTC (rev 4080) +++ branches/numpy.scons/numpy/scons_fake/SConstruct 2007-09-22 15:40:52 UTC (rev 4081) @@ -3,11 +3,12 @@ env = GetNumpyEnvironment(ARGUMENTS) -config = env.Configure() config.CheckHeader('stdio.h') config.CheckLib('c', 'printf') config.Finish() source = ['foo.c'] -env.AppendUnique(CPPDEFINES = 'WIN32') +import sys +if sys.platform == 'win32': + env.AppendUnique(CPPDEFINES = 'WIN32') env.NumpyCTypes('foo', source) From numpy-svn at scipy.org Sun Sep 23 07:12:15 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:12:15 -0500 (CDT) Subject: [Numpy-svn] r4082 - trunk/numpy/doc Message-ID: <20070923111215.734EF39C09E@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:12:12 -0500 (Sun, 23 Sep 2007) New Revision: 4082 Added: trunk/numpy/doc/example.py Modified: trunk/numpy/doc/HOWTO_DOCUMENT.py Log: documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.py =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.py 2007-09-22 15:40:52 UTC (rev 4081) +++ trunk/numpy/doc/HOWTO_DOCUMENT.py 2007-09-23 11:12:12 UTC (rev 4082) @@ -1,180 +1,112 @@ -# It is desireable that both NumPy and SciPy follow a convention for docstrings -# that provide for some consistency while also allowing epydoc to produce -# nicely-formatted reference guides. However, such a convention has not yet -# been decided on. This is my current thinking on the topic. If you have -# suggestions for improvements, post them on the numpy-dev list together with -# the epydoc output so they may be discussed. -# -# The docstring format uses reST syntax as interpreted by epydoc. The markup -# in this proposal is as basic as possible and in particular avoids the use of -# epydoc consolidated fields. This is both because there are a limited number -# of such fields, inadequate to our current needs, and because epydoc moves -# the fields to the end of the documentation, messing up the ordering. So here -# standard definition lists are used instead. Likewise, epydoc moves headings -# and have an unwelcome size in the default style sheet, hence they have also -# been avoided. -# -# A maximum line width of 79 is suggested, as this will allow the docstrings to -# display on standard terminals. This convention is a bit old and traces back -# to IBM punchcard days, but still seems to be the standard. -# -# Comments: -# -# 1) You can run epydoc on this file like so: -# -# $ epydoc HOWTO_DOCUMENT.txt -# -# The output will be in a directory named html in the same directory as this -# document and may be viewed by loading the index.html file into your browser. -# -# 2) The developmental version of epydoc, version 3.0 beta or later, is -# suggested as it is faster and produces better looking output. Epydoc can be -# downloaded from http://epydoc.sourceforge.net/ -# -# 3) The appearance of some elements can be changed in the epydoc.css -# style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so -# their appearance is controlled by the definition of the -# tag. For instance, to make them bold, insert -# -# em {font-weight: bold;} -# -# The variables' types are in a span of class rst-classifier, hence can be -# changed by inserting something like: -# -# span.rst-classifier {font-weight: normal;} -# -# 4) The first line of the signature should **not** copy the signature unless -# the function is written in C, in which case it is mandatory. If the function -# signature is generic (uses *args or **kwds), then a function signature may be -# included -# -# 5) Use optional in the "type" field for parameters that are non-keyword -# optional for C-functions. -# -# 6) The Other Parameters section is for functions taking a lot of keywords -# which are not always used or neeeded and whose description would clutter then -# main purpose of the function. (Comment by Chuck : I think this should be -# rarely used, if at all) -# -# 7) The See Also section can list additional related functions. The purpose -# of this section is to direct users to other functions they may not be aware -# of or have easy means to discover (i.e. by looking at the docstring of the -# module). Thus, repeating functions that are in the same module is not useful -# and can create a cluttered document. Please use judgement when listing -# additional functions. Routines that provide additional information in their -# docstrings for this function may be useful to include here. -# -# 8) The Notes section can contain algorithmic information if that is useful. -# -# 9) The Examples section is strongly encouraged. The examples can provide a -# mini-tutorial as well as additional regression testing. (Comment by Chuck: -# blank lines in the numpy output, for instance in multidimensional arrays, -# will break doctest.) You can run the tests by doing -# -# >>> import doctest -# >>> doctest.testfile('HOWTO_DOCUMENT.txt') -# -# -# Common reST concepts: +=========================== +How-to document NumPy/SciPy +=========================== -# A reST-documented module should define -# -# __docformat__ = 'restructuredtext en' -# -# at the top level in accordance with PEP 258. Note that the __docformat__ -# variable in a package's __init__.py file does not apply to objects defined in -# subpackages and submodules. -# -# For paragraphs, indentation is significant and indicates indentation in the -# output. New paragraphs are marked with blank line. -# -# Use *italics*, **bold**, and ``courier`` if needed in any explanations (but -# not for variable names and doctest code or multi-line code) -# -# Use :lm:`eqn` for in-line math in latex format (remember to use the -# raw-format for your text string or escape any '\' symbols). Use :m:`eqn` for -# non-latex math. -# -# A more extensive example of reST markup can be found here: -# http://docutils.sourceforge.net/docs/user/rst/demo.txt -# An example follows. Line spacing and indentation are significant and should -# be carefully followed. +.. Contents:: -__docformat__ = "restructuredtext en" +Overview +-------- +It is desireable that both NumPy and SciPy follow a convention for docstrings +that provide for some consistency while also allowing epydoc to produce +nicely-formatted reference guides. However, such a convention has not yet +been decided on. This is my current thinking on the topic. If you have +suggestions for improvements, post them on the numpy-dev list together with +the epydoc output so they may be discussed. -def foo(var1, var2, long_var_name='hi') : - """One-line summary or signature. +The docstring format uses reST syntax as interpreted by epydoc. The markup +in this proposal is as basic as possible and in particular avoids the use of +epydoc consolidated fields. This is both because there are a limited number +of such fields, inadequate to our current needs, and because epydoc moves +the fields to the end of the documentation, messing up the ordering. So here +standard definition lists are used instead. Likewise, epydoc moves headings +and have an unwelcome size in the default style sheet, hence they have also +been avoided. - Several sentences providing an extended description. You can put - text in mono-spaced type like so: ``var``. +A maximum line width of 79 is suggested, as this will allow the docstrings to +display on standard terminals. This convention is a bit old and traces back +to IBM punchcard days, but still seems to be the standard. - *Parameters*: +Using Epydoc +------------ - var1 : {array_like} - Array_like means all those objects -- lists, nested lists, etc. -- - that can be converted to an array. - var2 : {integer} - Write out the full type - long_variable_name : {'hi', 'ho'}, optional - Choices in brackets, default first when optional. +1) You can run epydoc on this file like so: - *Returns*: +$ epydoc HOWTO_DOCUMENT.txt - named : {type} - Explanation - list - Explanation - of - Explanation - outputs - even more explaining +The output will be in a directory named html in the same directory as this +document and may be viewed by loading the index.html file into your browser. - *Other Parameters*: +2) The developmental version of epydoc, version 3.0 beta or later, is +suggested as it is faster and produces better looking output. Epydoc can be +downloaded from http://epydoc.sourceforge.net/ - only_seldom_used_keywords : type - Explanation - common_parametrs_listed_above : type - Explanation +3) The appearance of some elements can be changed in the epydoc.css +style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so +their appearance is controlled by the definition of the +tag. For instance, to make them bold, insert - *See Also*: +em {font-weight: bold;} - `otherfunc` : relationship (optional) +The variables' types are in a span of class rst-classifier, hence can be +changed by inserting something like: - `newfunc` : relationship (optional) +span.rst-classifier {font-weight: normal;} - *Notes* +4) The first line of the signature should **not** copy the signature unless +the function is written in C, in which case it is mandatory. If the function +signature is generic (uses *args or **kwds), then a function signature may be +included - Notes about the implementation algorithm (if needed). +5) Use optional in the "type" field for parameters that are non-keyword +optional for C-functions. - This can have multiple paragraphs as can all sections. +6) The Other Parameters section is for functions taking a lot of keywords +which are not always used or neeeded and whose description would clutter then +main purpose of the function. (Comment by Chuck : I think this should be +rarely used, if at all) - *Examples* +7) The See Also section can list additional related functions. The purpose +of this section is to direct users to other functions they may not be aware +of or have easy means to discover (i.e. by looking at the docstring of the +module). Thus, repeating functions that are in the same module is not useful +and can create a cluttered document. Please use judgement when listing +additional functions. Routines that provide additional information in their +docstrings for this function may be useful to include here. - examples in doctest format +8) The Notes section can contain algorithmic information if that is useful. - >>> a=[1,2,3] - >>> [x + 3 for x in a] - [4, 5, 6] +9) The Examples section is strongly encouraged. The examples can provide a +mini-tutorial as well as additional regression testing. (Comment by Chuck: +blank lines in the numpy output, for instance in multidimensional arrays, +will break doctest.) You can run the tests by doing - """ - pass +>>> import doctest +>>> doctest.testfile('HOWTO_DOCUMENT.txt') -def newfunc() : - """Do nothing. +Common reST concepts: - I never saw a purple cow. +A reST-documented module should define - """ - pass + __docformat__ = 'restructuredtext en' +at the top level in accordance with PEP 258. Note that the __docformat__ +variable in a package's __init__.py file does not apply to objects defined in +subpackages and submodules. -def otherfunc() : - """Do nothing. +For paragraphs, indentation is significant and indicates indentation in the +output. New paragraphs are marked with blank line. - I never hope to see one. +Use *italics*, **bold**, and ``courier`` if needed in any explanations (but +not for variable names and doctest code or multi-line code) - """ - pass +Use :lm:`eqn` for in-line math in latex format (remember to use the +raw-format for your text string or escape any '\' symbols). Use :m:`eqn` for +non-latex math. +A more extensive example of reST markup can be found here: +http://docutils.sourceforge.net/docs/user/rst/demo.txt +An example follows. Line spacing and indentation are significant and should +be carefully followed. + Added: trunk/numpy/doc/example.py =================================================================== --- trunk/numpy/doc/example.py 2007-09-22 15:40:52 UTC (rev 4081) +++ trunk/numpy/doc/example.py 2007-09-23 11:12:12 UTC (rev 4082) @@ -0,0 +1,78 @@ + +__docformat__ = "restructuredtext en" + + +def foo(var1, var2, long_var_name='hi') : + """One-line summary or signature. + + Several sentences providing an extended description. You can put + text in mono-spaced type like so: ``var``. + + *Parameters*: + + var1 : {array_like} + Array_like means all those objects -- lists, nested lists, etc. -- + that can be converted to an array. + var2 : {integer} + Write out the full type + long_variable_name : {'hi', 'ho'}, optional + Choices in brackets, default first when optional. + + *Returns*: + + named : {type} + Explanation + list + Explanation + of + Explanation + outputs + even more explaining + + *Other Parameters*: + + only_seldom_used_keywords : type + Explanation + common_parametrs_listed_above : type + Explanation + + *See Also*: + + `otherfunc` : relationship (optional) + + `newfunc` : relationship (optional) + + *Notes* + + Notes about the implementation algorithm (if needed). + + This can have multiple paragraphs as can all sections. + *Examples* + + examples in doctest format + + >>> a=[1,2,3] + >>> [x + 3 for x in a] + [4, 5, 6] + + """ + pass + + +def newfunc() : + """Do nothing. + + I never saw a purple cow. + + """ + pass + + +def otherfunc() : + """Do nothing. + + I never hope to see one. + + """ + pass + From numpy-svn at scipy.org Sun Sep 23 07:14:08 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:14:08 -0500 (CDT) Subject: [Numpy-svn] r4083 - trunk/numpy/doc Message-ID: <20070923111408.21CD439C09E@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:14:05 -0500 (Sun, 23 Sep 2007) New Revision: 4083 Added: trunk/numpy/doc/HOWTO_DOCUMENT.txt Removed: trunk/numpy/doc/HOWTO_DOCUMENT.py Log: updating file extension to .txt Deleted: trunk/numpy/doc/HOWTO_DOCUMENT.py =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.py 2007-09-23 11:12:12 UTC (rev 4082) +++ trunk/numpy/doc/HOWTO_DOCUMENT.py 2007-09-23 11:14:05 UTC (rev 4083) @@ -1,112 +0,0 @@ -=========================== -How-to document NumPy/SciPy -=========================== - -.. Contents:: - -Overview --------- - -It is desireable that both NumPy and SciPy follow a convention for docstrings -that provide for some consistency while also allowing epydoc to produce -nicely-formatted reference guides. However, such a convention has not yet -been decided on. This is my current thinking on the topic. If you have -suggestions for improvements, post them on the numpy-dev list together with -the epydoc output so they may be discussed. - -The docstring format uses reST syntax as interpreted by epydoc. The markup -in this proposal is as basic as possible and in particular avoids the use of -epydoc consolidated fields. This is both because there are a limited number -of such fields, inadequate to our current needs, and because epydoc moves -the fields to the end of the documentation, messing up the ordering. So here -standard definition lists are used instead. Likewise, epydoc moves headings -and have an unwelcome size in the default style sheet, hence they have also -been avoided. - -A maximum line width of 79 is suggested, as this will allow the docstrings to -display on standard terminals. This convention is a bit old and traces back -to IBM punchcard days, but still seems to be the standard. - -Using Epydoc ------------- - -1) You can run epydoc on this file like so: - -$ epydoc HOWTO_DOCUMENT.txt - -The output will be in a directory named html in the same directory as this -document and may be viewed by loading the index.html file into your browser. - -2) The developmental version of epydoc, version 3.0 beta or later, is -suggested as it is faster and produces better looking output. Epydoc can be -downloaded from http://epydoc.sourceforge.net/ - -3) The appearance of some elements can be changed in the epydoc.css -style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so -their appearance is controlled by the definition of the -tag. For instance, to make them bold, insert - -em {font-weight: bold;} - -The variables' types are in a span of class rst-classifier, hence can be -changed by inserting something like: - -span.rst-classifier {font-weight: normal;} - -4) The first line of the signature should **not** copy the signature unless -the function is written in C, in which case it is mandatory. If the function -signature is generic (uses *args or **kwds), then a function signature may be -included - -5) Use optional in the "type" field for parameters that are non-keyword -optional for C-functions. - -6) The Other Parameters section is for functions taking a lot of keywords -which are not always used or neeeded and whose description would clutter then -main purpose of the function. (Comment by Chuck : I think this should be -rarely used, if at all) - -7) The See Also section can list additional related functions. The purpose -of this section is to direct users to other functions they may not be aware -of or have easy means to discover (i.e. by looking at the docstring of the -module). Thus, repeating functions that are in the same module is not useful -and can create a cluttered document. Please use judgement when listing -additional functions. Routines that provide additional information in their -docstrings for this function may be useful to include here. - -8) The Notes section can contain algorithmic information if that is useful. - -9) The Examples section is strongly encouraged. The examples can provide a -mini-tutorial as well as additional regression testing. (Comment by Chuck: -blank lines in the numpy output, for instance in multidimensional arrays, -will break doctest.) You can run the tests by doing - ->>> import doctest ->>> doctest.testfile('HOWTO_DOCUMENT.txt') - - -Common reST concepts: - -A reST-documented module should define - - __docformat__ = 'restructuredtext en' - -at the top level in accordance with PEP 258. Note that the __docformat__ -variable in a package's __init__.py file does not apply to objects defined in -subpackages and submodules. - -For paragraphs, indentation is significant and indicates indentation in the -output. New paragraphs are marked with blank line. - -Use *italics*, **bold**, and ``courier`` if needed in any explanations (but -not for variable names and doctest code or multi-line code) - -Use :lm:`eqn` for in-line math in latex format (remember to use the -raw-format for your text string or escape any '\' symbols). Use :m:`eqn` for -non-latex math. - -A more extensive example of reST markup can be found here: -http://docutils.sourceforge.net/docs/user/rst/demo.txt -An example follows. Line spacing and indentation are significant and should -be carefully followed. - Copied: trunk/numpy/doc/HOWTO_DOCUMENT.txt (from rev 4082, trunk/numpy/doc/HOWTO_DOCUMENT.py) From numpy-svn at scipy.org Sun Sep 23 07:32:43 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:32:43 -0500 (CDT) Subject: [Numpy-svn] r4084 - trunk/numpy/doc Message-ID: <20070923113243.9366739C106@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:32:41 -0500 (Sun, 23 Sep 2007) New Revision: 4084 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: more documentation work Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:14:05 UTC (rev 4083) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:32:41 UTC (rev 4084) @@ -27,46 +27,45 @@ display on standard terminals. This convention is a bit old and traces back to IBM punchcard days, but still seems to be the standard. -Using Epydoc ------------- -1) You can run epydoc on this file like so: +Sections +-------- -$ epydoc HOWTO_DOCUMENT.txt +The proposed sections of the docstring are: + 1. '''Short summary:''' A one-line summary not using variable names or the +function name (unless a C-function). + 1. '''Extended summary:''' A few sentences giving an extended description. + 1. '''Parameters:''' + 1. '''Returns:''' + 1. '''Other parameters:''' An optional section used to describe little used +parameters so that functions with a large number of keyword argument can still +be well documented without cluttering the main parameters' list. + 1. '''See also:''' An optional section used to refer the reader to other +related !SciPy code. This section can be extremely useful, but needs to be +used with caution. It can be difficult to maintain and if not used +judiciously this section can quickly loose its usefulness. For example if a +function points the reader to each and every other function in the same +package, it becomes pointless and creates a bunch of similar-looking text that +will likely get ignored by the reader. In general, you might want to only +include references to code that has a very close relationship to the current +function (e.g., {{{trapz()}}} and {{{cumtrapz()}}}) or if the code you point +to provides additional information in its docstring that gives more insight +into what the current function is actually doing. + 1. '''Notes:''' An optional section that provides additional information +about the code possibly including a discussion or presentation of the +algorithm. This section may include mathematical equations possibly written in +[http://www.latex-project.org/ LaTeX]. + 1. '''Examples:''' An optional section for examples using the +[http://www.python.org/doc/lib/module-doctest.html doctest] format. It can +provide an inline mini-tutorial as well as additional regression testing. +While optional, this section is strongly encouraged. -The output will be in a directory named html in the same directory as this -document and may be viewed by loading the index.html file into your browser. - -2) The developmental version of epydoc, version 3.0 beta or later, is -suggested as it is faster and produces better looking output. Epydoc can be -downloaded from http://epydoc.sourceforge.net/ - -3) The appearance of some elements can be changed in the epydoc.css -style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so -their appearance is controlled by the definition of the -tag. For instance, to make them bold, insert - -em {font-weight: bold;} - -The variables' types are in a span of class rst-classifier, hence can be -changed by inserting something like: - -span.rst-classifier {font-weight: normal;} - -4) The first line of the signature should **not** copy the signature unless -the function is written in C, in which case it is mandatory. If the function -signature is generic (uses *args or **kwds), then a function signature may be -included - -5) Use optional in the "type" field for parameters that are non-keyword -optional for C-functions. - -6) The Other Parameters section is for functions taking a lot of keywords +The Other Parameters section is for functions taking a lot of keywords which are not always used or neeeded and whose description would clutter then main purpose of the function. (Comment by Chuck : I think this should be rarely used, if at all) -7) The See Also section can list additional related functions. The purpose +The See Also section can list additional related functions. The purpose of this section is to direct users to other functions they may not be aware of or have easy means to discover (i.e. by looking at the docstring of the module). Thus, repeating functions that are in the same module is not useful @@ -79,13 +78,14 @@ 9) The Examples section is strongly encouraged. The examples can provide a mini-tutorial as well as additional regression testing. (Comment by Chuck: blank lines in the numpy output, for instance in multidimensional arrays, -will break doctest.) You can run the tests by doing +will break doctest.) You can run the tests by doing:: ->>> import doctest ->>> doctest.testfile('HOWTO_DOCUMENT.txt') + >>> import doctest + >>> doctest.testfile('HOWTO_DOCUMENT.txt') -Common reST concepts: +Common reST concepts +-------------------- A reST-documented module should define @@ -110,3 +110,36 @@ An example follows. Line spacing and indentation are significant and should be carefully followed. +Using Epydoc +------------ + +You can run epydoc on this file like so:: + + $ epydoc HOWTO_DOCUMENT.txt + +The output will be in a directory named html in the same directory as this +document and may be viewed by loading the index.html file into your browser. + +The developmental version of epydoc, version 3.0 beta or later, is +suggested as it is faster and produces better looking output. Epydoc can be +downloaded from http://epydoc.sourceforge.net/ + +The appearance of some elements can be changed in the epydoc.css +style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so +their appearance is controlled by the definition of the +tag. For instance, to make them bold, insert:: + + em {font-weight: bold;} + +The variables' types are in a span of class rst-classifier, hence can be +changed by inserting something like:: + + span.rst-classifier {font-weight: normal;} + +The first line of the signature should **not** copy the signature unless +the function is written in C, in which case it is mandatory. If the function +signature is generic (uses *args or **kwds), then a function signature may be +included. + +Use optional in the "type" field for parameters that are non-keyword +optional for C-functions. From numpy-svn at scipy.org Sun Sep 23 07:36:51 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:36:51 -0500 (CDT) Subject: [Numpy-svn] r4085 - trunk/numpy/doc Message-ID: <20070923113651.3B50B39C107@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:36:49 -0500 (Sun, 23 Sep 2007) New Revision: 4085 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: more documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:32:41 UTC (rev 4084) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:36:49 UTC (rev 4085) @@ -32,15 +32,28 @@ -------- The proposed sections of the docstring are: - 1. '''Short summary:''' A one-line summary not using variable names or the -function name (unless a C-function). - 1. '''Extended summary:''' A few sentences giving an extended description. - 1. '''Parameters:''' - 1. '''Returns:''' - 1. '''Other parameters:''' An optional section used to describe little used + +1. **Short summary:** +A one-line summary not using variable names or the function name (unless a +C-function). + +1. **Extended summary:** +A few sentences giving an extended description. + +1. '''Parameters:''' + +1. '''Returns:''' + +1. '''Other parameters:''' An optional section used to describe little used parameters so that functions with a large number of keyword argument can still be well documented without cluttering the main parameters' list. - 1. '''See also:''' An optional section used to refer the reader to other + +The Other Parameters section is for functions taking a lot of keywords +which are not always used or neeeded and whose description would clutter then +main purpose of the function. (Comment by Chuck : I think this should be +rarely used, if at all) + +1. '''See also:''' An optional section used to refer the reader to other related !SciPy code. This section can be extremely useful, but needs to be used with caution. It can be difficult to maintain and if not used judiciously this section can quickly loose its usefulness. For example if a @@ -51,19 +64,17 @@ function (e.g., {{{trapz()}}} and {{{cumtrapz()}}}) or if the code you point to provides additional information in its docstring that gives more insight into what the current function is actually doing. - 1. '''Notes:''' An optional section that provides additional information + +1. '''Notes:''' An optional section that provides additional information about the code possibly including a discussion or presentation of the algorithm. This section may include mathematical equations possibly written in [http://www.latex-project.org/ LaTeX]. - 1. '''Examples:''' An optional section for examples using the + +1. '''Examples:''' An optional section for examples using the [http://www.python.org/doc/lib/module-doctest.html doctest] format. It can provide an inline mini-tutorial as well as additional regression testing. While optional, this section is strongly encouraged. -The Other Parameters section is for functions taking a lot of keywords -which are not always used or neeeded and whose description would clutter then -main purpose of the function. (Comment by Chuck : I think this should be -rarely used, if at all) The See Also section can list additional related functions. The purpose of this section is to direct users to other functions they may not be aware From numpy-svn at scipy.org Sun Sep 23 07:44:08 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:44:08 -0500 (CDT) Subject: [Numpy-svn] r4086 - trunk/numpy/doc Message-ID: <20070923114408.BDF0639C02D@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:44:07 -0500 (Sun, 23 Sep 2007) New Revision: 4086 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: more documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:36:49 UTC (rev 4085) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:44:07 UTC (rev 4086) @@ -37,14 +37,15 @@ A one-line summary not using variable names or the function name (unless a C-function). -1. **Extended summary:** +2. **Extended summary:** A few sentences giving an extended description. -1. '''Parameters:''' +3. **Parameters:** -1. '''Returns:''' +4. **Returns:**' -1. '''Other parameters:''' An optional section used to describe little used +5. **Other parameters:** +An optional section used to describe little used parameters so that functions with a large number of keyword argument can still be well documented without cluttering the main parameters' list. @@ -53,7 +54,7 @@ main purpose of the function. (Comment by Chuck : I think this should be rarely used, if at all) -1. '''See also:''' An optional section used to refer the reader to other +6. **See also:** An optional section used to refer the reader to other related !SciPy code. This section can be extremely useful, but needs to be used with caution. It can be difficult to maintain and if not used judiciously this section can quickly loose its usefulness. For example if a @@ -65,17 +66,6 @@ to provides additional information in its docstring that gives more insight into what the current function is actually doing. -1. '''Notes:''' An optional section that provides additional information -about the code possibly including a discussion or presentation of the -algorithm. This section may include mathematical equations possibly written in -[http://www.latex-project.org/ LaTeX]. - -1. '''Examples:''' An optional section for examples using the -[http://www.python.org/doc/lib/module-doctest.html doctest] format. It can -provide an inline mini-tutorial as well as additional regression testing. -While optional, this section is strongly encouraged. - - The See Also section can list additional related functions. The purpose of this section is to direct users to other functions they may not be aware of or have easy means to discover (i.e. by looking at the docstring of the @@ -84,9 +74,19 @@ additional functions. Routines that provide additional information in their docstrings for this function may be useful to include here. -8) The Notes section can contain algorithmic information if that is useful. +7. **Notes:** An optional section that provides additional information +about the code possibly including a discussion or presentation of the +algorithm. This section may include mathematical equations possibly written in +[http://www.latex-project.org/ LaTeX]. -9) The Examples section is strongly encouraged. The examples can provide a +The Notes section can contain algorithmic information if that is useful. + +8. **Examples:** An optional section for examples using the +[http://www.python.org/doc/lib/module-doctest.html doctest] format. It can +provide an inline mini-tutorial as well as additional regression testing. +While optional, this section is strongly encouraged. + +The Examples section is strongly encouraged. The examples can provide a mini-tutorial as well as additional regression testing. (Comment by Chuck: blank lines in the numpy output, for instance in multidimensional arrays, will break doctest.) You can run the tests by doing:: From numpy-svn at scipy.org Sun Sep 23 07:53:13 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 06:53:13 -0500 (CDT) Subject: [Numpy-svn] r4087 - trunk/numpy/doc Message-ID: <20070923115313.916D739C092@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 06:53:11 -0500 (Sun, 23 Sep 2007) New Revision: 4087 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:44:07 UTC (rev 4086) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:53:11 UTC (rev 4087) @@ -112,9 +112,9 @@ Use *italics*, **bold**, and ``courier`` if needed in any explanations (but not for variable names and doctest code or multi-line code) -Use :lm:`eqn` for in-line math in latex format (remember to use the -raw-format for your text string or escape any '\' symbols). Use :m:`eqn` for -non-latex math. +Use ``:lm:`eqn``` for in-line math in latex format (remember to use the +raw-format for your text string or escape any '\' symbols). Use ``:m:`eqn``` +for non-latex math. A more extensive example of reST markup can be found here: http://docutils.sourceforge.net/docs/user/rst/demo.txt @@ -154,3 +154,4 @@ Use optional in the "type" field for parameters that are non-keyword optional for C-functions. + From numpy-svn at scipy.org Sun Sep 23 08:21:06 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:21:06 -0500 (CDT) Subject: [Numpy-svn] r4088 - trunk/numpy/doc Message-ID: <20070923122106.C599739C122@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 07:21:04 -0500 (Sun, 23 Sep 2007) New Revision: 4088 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt trunk/numpy/doc/example.py Log: more documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 11:53:11 UTC (rev 4087) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:21:04 UTC (rev 4088) @@ -98,7 +98,7 @@ Common reST concepts -------------------- -A reST-documented module should define +A reST-documented module should define:: __docformat__ = 'restructuredtext en' @@ -118,9 +118,15 @@ A more extensive example of reST markup can be found here: http://docutils.sourceforge.net/docs/user/rst/demo.txt -An example follows. Line spacing and indentation are significant and should +Line spacing and indentation are significant and should be carefully followed. +Here is a short example in plain text: +http://svn.scipy.org/svn/numpy/trunk/numpy/doc/example.py +Here is the rendered version of that file: +http://www.scipy.org/scipy/numpy/wiki/RenderedExample + + Using Epydoc ------------ @@ -149,8 +155,8 @@ The first line of the signature should **not** copy the signature unless the function is written in C, in which case it is mandatory. If the function -signature is generic (uses *args or **kwds), then a function signature may be -included. +signature is generic (uses ``*args`` or ``**kwds``), then a function signature +may be included. Use optional in the "type" field for parameters that are non-keyword optional for C-functions. Modified: trunk/numpy/doc/example.py =================================================================== --- trunk/numpy/doc/example.py 2007-09-23 11:53:11 UTC (rev 4087) +++ trunk/numpy/doc/example.py 2007-09-23 12:21:04 UTC (rev 4088) @@ -1,4 +1,14 @@ +"""This is the docstring for the example.py module. Modules names should +have short, all-lowercase names. The module name may have underscores if +this improves readability. +Every module should have a docstring at the very top of the file. The +module's docstring may extend over multiple lines. If your docstring does +extend over multiple lines, the closing three quotation marks must be on +a line by itself, preferably preceeded by a blank line. + +""" + __docformat__ = "restructuredtext en" From numpy-svn at scipy.org Sun Sep 23 08:32:44 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:32:44 -0500 (CDT) Subject: [Numpy-svn] r4089 - trunk/numpy/doc Message-ID: <20070923123244.3147E39C0EF@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 07:32:41 -0500 (Sun, 23 Sep 2007) New Revision: 4089 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt trunk/numpy/doc/example.py Log: cont. documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:21:04 UTC (rev 4088) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:32:41 UTC (rev 4089) @@ -7,6 +7,8 @@ Overview -------- +(`epydoc `__) + It is desireable that both NumPy and SciPy follow a convention for docstrings that provide for some consistency while also allowing epydoc to produce nicely-formatted reference guides. However, such a convention has not yet Modified: trunk/numpy/doc/example.py =================================================================== --- trunk/numpy/doc/example.py 2007-09-23 12:21:04 UTC (rev 4088) +++ trunk/numpy/doc/example.py 2007-09-23 12:32:41 UTC (rev 4089) @@ -57,6 +57,7 @@ Notes about the implementation algorithm (if needed). This can have multiple paragraphs as can all sections. + *Examples* examples in doctest format From numpy-svn at scipy.org Sun Sep 23 08:34:26 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:34:26 -0500 (CDT) Subject: [Numpy-svn] r4090 - trunk/numpy/doc Message-ID: <20070923123426.BE57739C0EF@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 07:34:24 -0500 (Sun, 23 Sep 2007) New Revision: 4090 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: docs Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:32:41 UTC (rev 4089) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:34:24 UTC (rev 4090) @@ -8,6 +8,7 @@ -------- (`epydoc `__) +`epydoc ` It is desireable that both NumPy and SciPy follow a convention for docstrings that provide for some consistency while also allowing epydoc to produce From numpy-svn at scipy.org Sun Sep 23 08:35:19 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:35:19 -0500 (CDT) Subject: [Numpy-svn] r4091 - trunk/numpy/doc Message-ID: <20070923123519.26C5C39C0EF@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 07:35:17 -0500 (Sun, 23 Sep 2007) New Revision: 4091 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: docs Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:34:24 UTC (rev 4090) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 12:35:17 UTC (rev 4091) @@ -8,7 +8,7 @@ -------- (`epydoc `__) -`epydoc ` +`epydoc `__ It is desireable that both NumPy and SciPy follow a convention for docstrings that provide for some consistency while also allowing epydoc to produce From numpy-svn at scipy.org Sun Sep 23 08:55:55 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:55:55 -0500 (CDT) Subject: [Numpy-svn] r4092 - trunk/numpy/distutils Message-ID: <20070923125555.124F639C0A4@new.scipy.org> Author: pearu Date: 2007-09-23 07:55:51 -0500 (Sun, 23 Sep 2007) New Revision: 4092 Modified: trunk/numpy/distutils/misc_util.py Log: fix missing string import Modified: trunk/numpy/distutils/misc_util.py =================================================================== --- trunk/numpy/distutils/misc_util.py 2007-09-23 12:35:17 UTC (rev 4091) +++ trunk/numpy/distutils/misc_util.py 2007-09-23 12:55:51 UTC (rev 4092) @@ -5,6 +5,7 @@ import copy import glob import atexit +import string import tempfile try: @@ -1520,7 +1521,6 @@ Possible results are "Intel", "Itanium", or "AMD64". """ - prefix = " bit (" i = string.find(sys.version, prefix) if i == -1: From numpy-svn at scipy.org Sun Sep 23 08:57:23 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 07:57:23 -0500 (CDT) Subject: [Numpy-svn] r4093 - trunk/numpy/distutils Message-ID: <20070923125723.4C1C439C0A4@new.scipy.org> Author: pearu Date: 2007-09-23 07:57:12 -0500 (Sun, 23 Sep 2007) New Revision: 4093 Modified: trunk/numpy/distutils/ccompiler.py Log: fixing link error: added debug message Modified: trunk/numpy/distutils/ccompiler.py =================================================================== --- trunk/numpy/distutils/ccompiler.py 2007-09-23 12:55:51 UTC (rev 4092) +++ trunk/numpy/distutils/ccompiler.py 2007-09-23 12:57:12 UTC (rev 4093) @@ -381,6 +381,7 @@ lib_opts.extend(list(i)) else: lib_opts.append(i) + print 'DEBUG:',lib_opts, library_dirs, runtime_library_dirs return lib_opts ccompiler.gen_lib_options = gen_lib_options From numpy-svn at scipy.org Sun Sep 23 09:16:34 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:16:34 -0500 (CDT) Subject: [Numpy-svn] r4094 - trunk/numpy/distutils Message-ID: <20070923131634.5E73039C0A4@new.scipy.org> Author: pearu Date: 2007-09-23 08:16:28 -0500 (Sun, 23 Sep 2007) New Revision: 4094 Modified: trunk/numpy/distutils/ccompiler.py Log: fixing link error: added debug message, 2. Modified: trunk/numpy/distutils/ccompiler.py =================================================================== --- trunk/numpy/distutils/ccompiler.py 2007-09-23 12:57:12 UTC (rev 4093) +++ trunk/numpy/distutils/ccompiler.py 2007-09-23 13:16:28 UTC (rev 4094) @@ -381,7 +381,7 @@ lib_opts.extend(list(i)) else: lib_opts.append(i) - print 'DEBUG:',lib_opts, library_dirs, runtime_library_dirs + log.info('DEBUG:'+`lib_opts, library_dirs, runtime_library_dirs`) return lib_opts ccompiler.gen_lib_options = gen_lib_options From numpy-svn at scipy.org Sun Sep 23 09:20:55 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:20:55 -0500 (CDT) Subject: [Numpy-svn] r4095 - trunk/numpy/doc Message-ID: <20070923132055.9549C39C0A4@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 08:20:53 -0500 (Sun, 23 Sep 2007) New Revision: 4095 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: more doc work Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:16:28 UTC (rev 4094) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:20:53 UTC (rev 4095) @@ -1,36 +1,49 @@ -=========================== -How-to document NumPy/SciPy -=========================== +================================= +A Guide to NumPy/SciPy Docstrings +================================= .. Contents:: Overview -------- -(`epydoc `__) -`epydoc `__ +A documentation string (docstring) is a string that describes a module, +function, class, or method definition. The docstring is a special attribute +of the object (``object.__doc__``) and, for consistency, is surrounded by +triple double quotes. -It is desireable that both NumPy and SciPy follow a convention for docstrings -that provide for some consistency while also allowing epydoc to produce -nicely-formatted reference guides. However, such a convention has not yet -been decided on. This is my current thinking on the topic. If you have -suggestions for improvements, post them on the numpy-dev list together with -the epydoc output so they may be discussed. +Obviously, it is highly desireable that both NumPy and SciPy follow a common +convention for docstrings that provide for consistency while also allowing +epydoc to produce nicely-formatted reference guides. This document describes +the current community consensus for this standard. If you have suggestions +for improvements, post them on the numpy-dev list together with the epydoc +output so they may be discussed. -The docstring format uses reST syntax as interpreted by epydoc. The markup -in this proposal is as basic as possible and in particular avoids the use of -epydoc consolidated fields. This is both because there are a limited number -of such fields, inadequate to our current needs, and because epydoc moves -the fields to the end of the documentation, messing up the ordering. So here -standard definition lists are used instead. Likewise, epydoc moves headings -and have an unwelcome size in the default style sheet, hence they have also -been avoided. +Our docstring standard uses `reST `__ +syntax and is rendered using `epydoc `__. The +markup in this proposal is as basic as possible and in particular avoids the +use of epydoc consolidated fields. This is both because there are a limited +number of such fields, inadequate to our current needs, and because epydoc +moves the fields to the end of the documentation, messing up the ordering. So +here standard definition lists are used instead. Likewise, epydoc moves +headings and have an unwelcome size in the default style sheet, hence they +have also been avoided. -A maximum line width of 79 is suggested, as this will allow the docstrings to -display on standard terminals. This convention is a bit old and traces back -to IBM punchcard days, but still seems to be the standard. +Status +------ +We are currently trying to: + +1. Agree on docstring standards. + +2. Work with Ed loper to ensure that epydoc provides the functionality we +need. + +3. Convert existing docstrings to the new format and write them for those +that currently lack docstrings. + + Sections -------- @@ -52,50 +65,33 @@ parameters so that functions with a large number of keyword argument can still be well documented without cluttering the main parameters' list. -The Other Parameters section is for functions taking a lot of keywords -which are not always used or neeeded and whose description would clutter then -main purpose of the function. (Comment by Chuck : I think this should be -rarely used, if at all) - -6. **See also:** An optional section used to refer the reader to other -related !SciPy code. This section can be extremely useful, but needs to be -used with caution. It can be difficult to maintain and if not used -judiciously this section can quickly loose its usefulness. For example if a -function points the reader to each and every other function in the same -package, it becomes pointless and creates a bunch of similar-looking text that -will likely get ignored by the reader. In general, you might want to only -include references to code that has a very close relationship to the current -function (e.g., {{{trapz()}}} and {{{cumtrapz()}}}) or if the code you point -to provides additional information in its docstring that gives more insight -into what the current function is actually doing. - -The See Also section can list additional related functions. The purpose -of this section is to direct users to other functions they may not be aware -of or have easy means to discover (i.e. by looking at the docstring of the -module). Thus, repeating functions that are in the same module is not useful -and can create a cluttered document. Please use judgement when listing -additional functions. Routines that provide additional information in their +6. **See also:** +An optional section used to refer to related code. This section can be +extremely useful, but needs to be used with caution. It can be difficult +to maintain and if not used judiciously this section can quickly loose its +usefulness. The purpose of this section is to direct users to other +functions they may not be aware of or have easy means to discover (i.e., +by looking at the docstring of the module). Thus, repeating functions +that are in the same module is not useful and can create a cluttered +document. Routines that provide additional information in their docstrings for this function may be useful to include here. -7. **Notes:** An optional section that provides additional information +7. **Notes:** +An optional section that provides additional information about the code possibly including a discussion or presentation of the -algorithm. This section may include mathematical equations possibly written in -[http://www.latex-project.org/ LaTeX]. +algorithm. This section may include mathematical equations possibly written +in `LaTeX `__. -The Notes section can contain algorithmic information if that is useful. - -8. **Examples:** An optional section for examples using the -[http://www.python.org/doc/lib/module-doctest.html doctest] format. It can -provide an inline mini-tutorial as well as additional regression testing. -While optional, this section is strongly encouraged. - -The Examples section is strongly encouraged. The examples can provide a -mini-tutorial as well as additional regression testing. (Comment by Chuck: +8. **Examples:** +An optional section for examples using the +`doctest `__ format. It +can provide an inline mini-tutorial as well as additional regression testing. +While optional, this section is strongly encouraged. (Comment by Chuck: blank lines in the numpy output, for instance in multidimensional arrays, will break doctest.) You can run the tests by doing:: >>> import doctest - >>> doctest.testfile('HOWTO_DOCUMENT.txt') + >>> doctest.testfile('example.py') Common reST concepts @@ -105,9 +101,10 @@ __docformat__ = 'restructuredtext en' -at the top level in accordance with PEP 258. Note that the __docformat__ -variable in a package's __init__.py file does not apply to objects defined in -subpackages and submodules. +at the top level in accordance with +`PEP 258 http://www.python.org/dev/peps/pep-0258>`__. Note that the +__docformat__ variable in a package's __init__.py file does not apply to +objects defined in subpackages and submodules. For paragraphs, indentation is significant and indicates indentation in the output. New paragraphs are marked with blank line. From numpy-svn at scipy.org Sun Sep 23 09:22:58 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:22:58 -0500 (CDT) Subject: [Numpy-svn] r4096 - trunk/numpy/doc Message-ID: <20070923132258.781B839C0A4@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 08:22:55 -0500 (Sun, 23 Sep 2007) New Revision: 4096 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: typo Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:20:53 UTC (rev 4095) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:22:55 UTC (rev 4096) @@ -102,7 +102,7 @@ __docformat__ = 'restructuredtext en' at the top level in accordance with -`PEP 258 http://www.python.org/dev/peps/pep-0258>`__. Note that the +`PEP 258 `__. Note that the __docformat__ variable in a package's __init__.py file does not apply to objects defined in subpackages and submodules. From numpy-svn at scipy.org Sun Sep 23 09:25:33 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:25:33 -0500 (CDT) Subject: [Numpy-svn] r4097 - trunk/numpy/doc Message-ID: <20070923132533.617C839C0A4@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 08:25:31 -0500 (Sun, 23 Sep 2007) New Revision: 4097 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: more documentation Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:22:55 UTC (rev 4096) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:25:31 UTC (rev 4097) @@ -121,10 +121,10 @@ Line spacing and indentation are significant and should be carefully followed. -Here is a short example in plain text: -http://svn.scipy.org/svn/numpy/trunk/numpy/doc/example.py -Here is the rendered version of that file: -http://www.scipy.org/scipy/numpy/wiki/RenderedExample +Here is a short example module in +`plain text `__ +and +`rendered `__ Using Epydoc From numpy-svn at scipy.org Sun Sep 23 09:28:05 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:28:05 -0500 (CDT) Subject: [Numpy-svn] r4098 - trunk/numpy/distutils/command Message-ID: <20070923132805.6156439C113@new.scipy.org> Author: pearu Date: 2007-09-23 08:27:54 -0500 (Sun, 23 Sep 2007) New Revision: 4098 Modified: trunk/numpy/distutils/command/build_ext.py Log: fixing link error: added debug message, 3. Modified: trunk/numpy/distutils/command/build_ext.py =================================================================== --- trunk/numpy/distutils/command/build_ext.py 2007-09-23 13:25:31 UTC (rev 4097) +++ trunk/numpy/distutils/command/build_ext.py 2007-09-23 13:27:54 UTC (rev 4098) @@ -390,6 +390,8 @@ else: kws = {} + log.debug('DEBUG: linker=%s,library_dirs=%s,ext.runtime_library_dirs=%s' % (linker, library_dirs, ext.runtime_library_dirs)) + linker(objects, ext_filename, libraries=libraries, library_dirs=library_dirs, From numpy-svn at scipy.org Sun Sep 23 09:36:56 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:36:56 -0500 (CDT) Subject: [Numpy-svn] r4099 - trunk/numpy/doc Message-ID: <20070923133656.79B2639C126@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 08:36:54 -0500 (Sun, 23 Sep 2007) New Revision: 4099 Modified: trunk/numpy/doc/example.py Log: more doc work Modified: trunk/numpy/doc/example.py =================================================================== --- trunk/numpy/doc/example.py 2007-09-23 13:27:54 UTC (rev 4098) +++ trunk/numpy/doc/example.py 2007-09-23 13:36:54 UTC (rev 4099) @@ -9,7 +9,15 @@ """ +import os # standard library imports first + +import numpy as np # related third party imports next +import scipy as sp # imports should be at the top of the module +import matplotlib as mpl # imports should usually be on separate lines + + __docformat__ = "restructuredtext en" +__all__ = [foo, newfunc, otherfunc]] def foo(var1, var2, long_var_name='hi') : @@ -67,6 +75,7 @@ [4, 5, 6] """ + pass @@ -76,6 +85,7 @@ I never saw a purple cow. """ + pass @@ -85,5 +95,6 @@ I never hope to see one. """ + pass From numpy-svn at scipy.org Sun Sep 23 09:39:26 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:39:26 -0500 (CDT) Subject: [Numpy-svn] r4100 - trunk/numpy/distutils Message-ID: <20070923133926.06FC339C0EB@new.scipy.org> Author: pearu Date: 2007-09-23 08:39:22 -0500 (Sun, 23 Sep 2007) New Revision: 4100 Modified: trunk/numpy/distutils/misc_util.py Log: fixing link error: wrong gen_lib_options is being used, may be it is a import problem. Modified: trunk/numpy/distutils/misc_util.py =================================================================== --- trunk/numpy/distutils/misc_util.py 2007-09-23 13:36:54 UTC (rev 4099) +++ trunk/numpy/distutils/misc_util.py 2007-09-23 13:39:22 UTC (rev 4100) @@ -1513,7 +1513,9 @@ return target if sys.version[:3] >= '2.5': - from distutils.msvccompiler import get_build_architecture + def get_build_architecture(): + from distutils.msvccompiler import get_build_architecture + return get_build_architecture() else: #copied from python 2.5.1 distutils/msvccompiler.py def get_build_architecture(): From numpy-svn at scipy.org Sun Sep 23 09:56:58 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 08:56:58 -0500 (CDT) Subject: [Numpy-svn] r4101 - in trunk/numpy/distutils: . command Message-ID: <20070923135658.3693D39C092@new.scipy.org> Author: pearu Date: 2007-09-23 08:56:50 -0500 (Sun, 23 Sep 2007) New Revision: 4101 Modified: trunk/numpy/distutils/__init__.py trunk/numpy/distutils/ccompiler.py trunk/numpy/distutils/command/build_ext.py Log: fixing link error: fixed. Removing debug messages and added a warning message on the situation that triggered this issue: numpy.distutils must always be imported before distutils. Modified: trunk/numpy/distutils/__init__.py =================================================================== --- trunk/numpy/distutils/__init__.py 2007-09-23 13:39:22 UTC (rev 4100) +++ trunk/numpy/distutils/__init__.py 2007-09-23 13:56:50 UTC (rev 4101) @@ -1,5 +1,22 @@ from __version__ import version as __version__ + +# Check that distutils has not been imported before. +import sys +if 'distutils' in sys.modules: + sys.stderr.write('''\ +******************************************************** +WARNING!WARNING!WARNING!WARNING!WARNING!WARNING!WARNING! + +distutils has been imported before numpy.distutils +and now numpy.distutils cannot apply all of its +customizations to distutils effectively. + +To avoid this warning, make sure that numpy.distutils +is imported *before* distutils. +******************************************************** +''') + # Must import local ccompiler ASAP in order to get # customized CCompiler.spawn effective. import ccompiler Modified: trunk/numpy/distutils/ccompiler.py =================================================================== --- trunk/numpy/distutils/ccompiler.py 2007-09-23 13:39:22 UTC (rev 4100) +++ trunk/numpy/distutils/ccompiler.py 2007-09-23 13:56:50 UTC (rev 4101) @@ -381,7 +381,6 @@ lib_opts.extend(list(i)) else: lib_opts.append(i) - log.info('DEBUG:'+`lib_opts, library_dirs, runtime_library_dirs`) return lib_opts ccompiler.gen_lib_options = gen_lib_options Modified: trunk/numpy/distutils/command/build_ext.py =================================================================== --- trunk/numpy/distutils/command/build_ext.py 2007-09-23 13:39:22 UTC (rev 4100) +++ trunk/numpy/distutils/command/build_ext.py 2007-09-23 13:56:50 UTC (rev 4101) @@ -390,8 +390,6 @@ else: kws = {} - log.debug('DEBUG: linker=%s,library_dirs=%s,ext.runtime_library_dirs=%s' % (linker, library_dirs, ext.runtime_library_dirs)) - linker(objects, ext_filename, libraries=libraries, library_dirs=library_dirs, From numpy-svn at scipy.org Sun Sep 23 10:29:26 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 09:29:26 -0500 (CDT) Subject: [Numpy-svn] r4102 - in trunk/numpy/doc: . html Message-ID: <20070923142926.8F96439C019@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 09:29:19 -0500 (Sun, 23 Sep 2007) New Revision: 4102 Added: trunk/numpy/doc/html/ trunk/numpy/doc/html/api-objects.txt trunk/numpy/doc/html/crarr.png trunk/numpy/doc/html/epydoc.css trunk/numpy/doc/html/epydoc.js trunk/numpy/doc/html/example-module.html trunk/numpy/doc/html/example-pysrc.html trunk/numpy/doc/html/frames.html trunk/numpy/doc/html/help.html trunk/numpy/doc/html/identifier-index.html trunk/numpy/doc/html/index.html trunk/numpy/doc/html/module-tree.html trunk/numpy/doc/html/redirect.html trunk/numpy/doc/html/toc-everything.html trunk/numpy/doc/html/toc-example-module.html trunk/numpy/doc/html/toc.html Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt trunk/numpy/doc/example.py Log: get the example working Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 14:29:19 UTC (rev 4102) @@ -121,26 +121,19 @@ Line spacing and indentation are significant and should be carefully followed. -Here is a short example module in -`plain text `__ -and -`rendered `__ Using Epydoc ------------ -You can run epydoc on this file like so:: - $ epydoc HOWTO_DOCUMENT.txt +Currently we recommend that you build eydoc from the trunk: -The output will be in a directory named html in the same directory as this -document and may be viewed by loading the index.html file into your browser. + svn co https://epydoc.svn.sourceforge.net/svnroot/epydoc/trunk/epydoc +epydoc + cd epydoc/src + sudo python setup.py install -The developmental version of epydoc, version 3.0 beta or later, is -suggested as it is faster and produces better looking output. Epydoc can be -downloaded from http://epydoc.sourceforge.net/ - The appearance of some elements can be changed in the epydoc.css style sheet. The list headings, i.e. *Parameters*:, are emphasized text, so their appearance is controlled by the definition of the @@ -161,3 +154,21 @@ Use optional in the "type" field for parameters that are non-keyword optional for C-functions. +Example +------- + +Here is a short example module in +`plain text `__ +and +`rendered `__ + +To try this yourself, simply download the example.py:: + + svn co http://svn.scipy.org/svn/numpy/trunk/numpy/doc/example.py . + +You can run epydoc on this file like so:: + + $ epydoc example.txt + +The output will be in a directory named html in the same directory as this +document and may be viewed by loading the index.html file into your browser. Modified: trunk/numpy/doc/example.py =================================================================== --- trunk/numpy/doc/example.py 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/example.py 2007-09-23 14:29:19 UTC (rev 4102) @@ -17,7 +17,6 @@ __docformat__ = "restructuredtext en" -__all__ = [foo, newfunc, otherfunc]] def foo(var1, var2, long_var_name='hi') : Added: trunk/numpy/doc/html/api-objects.txt =================================================================== --- trunk/numpy/doc/html/api-objects.txt 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/api-objects.txt 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,4 @@ +example example-module.html +example.otherfunc example-module.html#otherfunc +example.foo example-module.html#foo +example.newfunc example-module.html#newfunc Added: trunk/numpy/doc/html/crarr.png =================================================================== (Binary files differ) Property changes on: trunk/numpy/doc/html/crarr.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/numpy/doc/html/epydoc.css =================================================================== --- trunk/numpy/doc/html/epydoc.css 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/epydoc.css 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,315 @@ + + +/* Epydoc CSS Stylesheet + * + * This stylesheet can be used to customize the appearance of epydoc's + * HTML output. + * + */ + +/* Default Colors & Styles + * - Set the default foreground & background color with 'body'; and + * link colors with 'a:link' and 'a:visited'. + * - Use bold for decision list terms. + * - The heading styles defined here are used for headings *within* + * docstring descriptions. All headings used by epydoc itself use + * either class='epydoc' or class='toc' (CSS styles for both + * defined below). + */ +body { background: #ffffff; color: #000000; } +p { margin-top: 0.5em; margin-bottom: 0.5em; } +a:link { color: #0000ff; } +a:visited { color: #204080; } +dt { font-weight: bold; } +h1 { font-size: +140%; font-style: italic; + font-weight: bold; } +h2 { font-size: +125%; font-style: italic; + font-weight: bold; } +h3 { font-size: +110%; font-style: italic; + font-weight: normal; } +code { font-size: 100%; } + +/* Page Header & Footer + * - The standard page header consists of a navigation bar (with + * pointers to standard pages such as 'home' and 'trees'); a + * breadcrumbs list, which can be used to navigate to containing + * classes or modules; options links, to show/hide private + * variables and to show/hide frames; and a page title (using + *

). The page title may be followed by a link to the + * corresponding source code (using 'span.codelink'). + * - The footer consists of a navigation bar, a timestamp, and a + * pointer to epydoc's homepage. + */ +h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } +h2.epydoc { font-size: +130%; font-weight: bold; } +h3.epydoc { font-size: +115%; font-weight: bold; + margin-top: 0.2em; } +td h3.epydoc { font-size: +115%; font-weight: bold; + margin-bottom: 0; } +table.navbar { background: #a0c0ff; color: #000000; + border: 2px groove #c0d0d0; } +table.navbar table { color: #000000; } +th.navbar-select { background: #70b0ff; + color: #000000; } +table.navbar a { text-decoration: none; } +table.navbar a:link { color: #0000ff; } +table.navbar a:visited { color: #204080; } +span.breadcrumbs { font-size: 85%; font-weight: bold; } +span.options { font-size: 70%; } +span.codelink { font-size: 85%; } +td.footer { font-size: 85%; } + +/* Table Headers + * - Each summary table and details section begins with a 'header' + * row. This row contains a section title (marked by + * 'span.table-header') as well as a show/hide private link + * (marked by 'span.options', defined above). + * - Summary tables that contain user-defined groups mark those + * groups using 'group header' rows. + */ +td.table-header { background: #70b0ff; color: #000000; + border: 1px solid #608090; } +td.table-header table { color: #000000; } +td.table-header table a:link { color: #0000ff; } +td.table-header table a:visited { color: #204080; } +span.table-header { font-size: 120%; font-weight: bold; } +th.group-header { background: #c0e0f8; color: #000000; + text-align: left; font-style: italic; + font-size: 115%; + border: 1px solid #608090; } + +/* Summary Tables (functions, variables, etc) + * - Each object is described by a single row of the table with + * two cells. The left cell gives the object's type, and is + * marked with 'code.summary-type'. The right cell gives the + * object's name and a summary description. + * - CSS styles for the table's header and group headers are + * defined above, under 'Table Headers' + */ +table.summary { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin-bottom: 0.5em; } +td.summary { border: 1px solid #608090; } +code.summary-type { font-size: 85%; } +table.summary a:link { color: #0000ff; } +table.summary a:visited { color: #204080; } + + +/* Details Tables (functions, variables, etc) + * - Each object is described in its own div. + * - A single-row summary table w/ table-header is used as + * a header for each details section (CSS style for table-header + * is defined above, under 'Table Headers'). + */ +table.details { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +table.details table { color: #000000; } +table.details a:link { color: #0000ff; } +table.details a:visited { color: #204080; } + +/* Fields */ +dl.fields { margin-left: 2em; margin-top: 1em; + margin-bottom: 1em; } +dl.fields dd ul { margin-left: 0em; padding-left: 0em; } +dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } +div.fields { margin-left: 2em; } +div.fields p { margin-bottom: 0.5em; } + +/* Index tables (identifier index, term index, etc) + * - link-index is used for indices containing lists of links + * (namely, the identifier index & term index). + * - index-where is used in link indices for the text indicating + * the container/source for each link. + * - metadata-index is used for indices containing metadata + * extracted from fields (namely, the bug index & todo index). + */ +table.link-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; } +td.link-index { border-width: 0px; } +table.link-index a:link { color: #0000ff; } +table.link-index a:visited { color: #204080; } +span.index-where { font-size: 70%; } +table.metadata-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +td.metadata-index { border-width: 1px; border-style: solid; } +table.metadata-index a:link { color: #0000ff; } +table.metadata-index a:visited { color: #204080; } + +/* Function signatures + * - sig* is used for the signature in the details section. + * - .summary-sig* is used for the signature in the summary + * table, and when listing property accessor functions. + * */ +.sig-name { color: #006080; } +.sig-arg { color: #008060; } +.sig-default { color: #602000; } +.summary-sig { font-family: monospace; } +.summary-sig-name { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:link + { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:visited + { color: #006080; font-weight: bold; } +.summary-sig-arg { color: #006040; } +.summary-sig-default { color: #501800; } + +/* To render variables, classes etc. like functions */ +table.summary .summary-name { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:link { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:visited { color: #006080; font-weight: bold; + font-family: monospace; } + +/* Variable values + * - In the 'variable details' sections, each varaible's value is + * listed in a 'pre.variable' box. The width of this box is + * restricted to 80 chars; if the value's repr is longer than + * this it will be wrapped, using a backslash marked with + * class 'variable-linewrap'. If the value's repr is longer + * than 3 lines, the rest will be ellided; and an ellipsis + * marker ('...' marked with 'variable-ellipsis') will be used. + * - If the value is a string, its quote marks will be marked + * with 'variable-quote'. + * - If the variable is a regexp, it is syntax-highlighted using + * the re* CSS classes. + */ +pre.variable { padding: .5em; margin: 0; + background: #dce4ec; color: #000000; + border: 1px solid #708890; } +.variable-linewrap { color: #604000; font-weight: bold; } +.variable-ellipsis { color: #604000; font-weight: bold; } +.variable-quote { color: #604000; font-weight: bold; } +.variable-group { color: #008000; font-weight: bold; } +.variable-op { color: #604000; font-weight: bold; } +.variable-string { color: #006030; } +.variable-unknown { color: #a00000; font-weight: bold; } +.re { color: #000000; } +.re-char { color: #006030; } +.re-op { color: #600000; } +.re-group { color: #003060; } +.re-ref { color: #404040; } + +/* Base tree + * - Used by class pages to display the base class hierarchy. + */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Frames-based table of contents headers + * - Consists of two frames: one for selecting modules; and + * the other listing the contents of the selected module. + * - h1.toc is used for each frame's heading + * - h2.toc is used for subheadings within each frame. + */ +h1.toc { text-align: center; font-size: 105%; + margin: 0; font-weight: bold; + padding: 0; } +h2.toc { font-size: 100%; font-weight: bold; + margin: 0.5em 0 0 -0.3em; } + +/* Syntax Highlighting for Source Code + * - doctest examples are displayed in a 'pre.py-doctest' block. + * If the example is in a details table entry, then it will use + * the colors specified by the 'table pre.py-doctest' line. + * - Source code listings are displayed in a 'pre.py-src' block. + * Each line is marked with 'span.py-line' (used to draw a line + * down the left margin, separating the code from the line + * numbers). Line numbers are displayed with 'span.py-lineno'. + * The expand/collapse block toggle button is displayed with + * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not + * modify the font size of the text.) + * - If a source code page is opened with an anchor, then the + * corresponding code block will be highlighted. The code + * block's header is highlighted with 'py-highlight-hdr'; and + * the code block's body is highlighted with 'py-highlight'. + * - The remaining py-* classes are used to perform syntax + * highlighting (py-string for string literals, py-name for names, + * etc.) + */ +pre.py-doctest { padding: .5em; margin: 1em; + background: #e8f0f8; color: #000000; + border: 1px solid #708890; } +table pre.py-doctest { background: #dce4ec; + color: #000000; } +pre.py-src { border: 2px solid #000000; + background: #f0f0f0; color: #000000; } +.py-line { border-left: 2px solid #000000; + margin-left: .2em; padding-left: .4em; } +.py-lineno { font-style: italic; font-size: 90%; + padding-left: .5em; } +a.py-toggle { text-decoration: none; } +div.py-highlight-hdr { border-top: 2px solid #000000; + border-bottom: 2px solid #000000; + background: #d8e8e8; } +div.py-highlight { border-bottom: 2px solid #000000; + background: #d0e0e0; } +.py-prompt { color: #005050; font-weight: bold;} +.py-more { color: #005050; font-weight: bold;} +.py-string { color: #006030; } +.py-comment { color: #003060; } +.py-keyword { color: #600000; } +.py-output { color: #404040; } +.py-name { color: #000050; } +.py-name:link { color: #000050 !important; } +.py-name:visited { color: #000050 !important; } +.py-number { color: #005000; } +.py-defname { color: #000060; font-weight: bold; } +.py-def-name { color: #000060; font-weight: bold; } +.py-base-class { color: #000060; } +.py-param { color: #000060; } +.py-docstring { color: #006030; } +.py-decorator { color: #804020; } +/* Use this if you don't want links to names underlined: */ +/*a.py-name { text-decoration: none; }*/ + +/* Graphs & Diagrams + * - These CSS styles are used for graphs & diagrams generated using + * Graphviz dot. 'img.graph-without-title' is used for bare + * diagrams (to remove the border created by making the image + * clickable). + */ +img.graph-without-title { border: none; } +img.graph-with-title { border: 1px solid #000000; } +span.graph-title { font-weight: bold; } +span.graph-caption { } + +/* General-purpose classes + * - 'p.indent-wrapped-lines' defines a paragraph whose first line + * is not indented, but whose subsequent lines are. + * - The 'nomargin-top' class is used to remove the top margin (e.g. + * from lists). The 'nomargin' class is used to remove both the + * top and bottom margin (but not the left or right margin -- + * for lists, that would cause the bullets to disappear.) + */ +p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; + margin: 0; } +.nomargin-top { margin-top: 0; } +.nomargin { margin-top: 0; margin-bottom: 0; } + +/* HTML Log */ +div.log-block { padding: 0; margin: .5em 0 .5em 0; + background: #e8f0f8; color: #000000; + border: 1px solid #000000; } +div.log-error { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffb0b0; color: #000000; + border: 1px solid #000000; } +div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffffb0; color: #000000; + border: 1px solid #000000; } +div.log-info { padding: .1em .3em .1em .3em; margin: 4px; + background: #b0ffb0; color: #000000; + border: 1px solid #000000; } +h2.log-hdr { background: #70b0ff; color: #000000; + margin: 0; padding: 0em 0.5em 0em 0.5em; + border-bottom: 1px solid #000000; font-size: 110%; } +p.log { font-weight: bold; margin: .5em 0 .5em 0; } +tr.opt-changed { color: #000000; font-weight: bold; } +tr.opt-default { color: #606060; } +pre.log { margin: 0; padding: 0; padding-left: 1em; } Added: trunk/numpy/doc/html/epydoc.js =================================================================== --- trunk/numpy/doc/html/epydoc.js 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/epydoc.js 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,280 @@ +function toggle_private() { + // Search for any private/public links on this page. Store + // their old text in "cmd," so we will know what action to + // take; and change their text to the opposite action. + var cmd = "?"; + var elts = document.getElementsByTagName("a"); + for(var i=0; i...
"; + elt.innerHTML = s; + } +} + +function toggle(id) { + elt = document.getElementById(id+"-toggle"); + if (elt.innerHTML == "-") + collapse(id); + else + expand(id); + return false; +} + +function highlight(id) { + var elt = document.getElementById(id+"-def"); + if (elt) elt.className = "py-highlight-hdr"; + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.className = "py-highlight"; + var elt = document.getElementById(id+"-collapsed"); + if (elt) elt.className = "py-highlight"; +} + +function num_lines(s) { + var n = 1; + var pos = s.indexOf("\n"); + while ( pos > 0) { + n += 1; + pos = s.indexOf("\n", pos+1); + } + return n; +} + +// Collapse all blocks that mave more than `min_lines` lines. +function collapse_all(min_lines) { + var elts = document.getElementsByTagName("div"); + for (var i=0; i 0) + if (elt.id.substring(split, elt.id.length) == "-expanded") + if (num_lines(elt.innerHTML) > min_lines) + collapse(elt.id.substring(0, split)); + } +} + +function expandto(href) { + var start = href.indexOf("#")+1; + if (start != 0 && start != href.length) { + if (href.substring(start, href.length) != "-") { + collapse_all(4); + pos = href.indexOf(".", start); + while (pos != -1) { + var id = href.substring(start, pos); + expand(id); + pos = href.indexOf(".", pos+1); + } + var id = href.substring(start, href.length); + expand(id); + highlight(id); + } + } +} + +function kill_doclink(id) { + var parent = document.getElementById(id); + parent.removeChild(parent.childNodes.item(0)); +} +function auto_kill_doclink(ev) { + if (!ev) var ev = window.event; + if (!this.contains(ev.toElement)) { + var parent = document.getElementById(this.parentID); + parent.removeChild(parent.childNodes.item(0)); + } +} + +function doclink(id, name, targets_id) { + var elt = document.getElementById(id); + + // If we already opened the box, then destroy it. + // (This case should never occur, but leave it in just in case.) + if (elt.childNodes.length > 1) { + elt.removeChild(elt.childNodes.item(0)); + } + else { + // The outer box: relative + inline positioning. + var box1 = document.createElement("div"); + box1.style.position = "relative"; + box1.style.display = "inline"; + box1.style.top = 0; + box1.style.left = 0; + + // A shadow for fun + var shadow = document.createElement("div"); + shadow.style.position = "absolute"; + shadow.style.left = "-1.3em"; + shadow.style.top = "-1.3em"; + shadow.style.background = "#404040"; + + // The inner box: absolute positioning. + var box2 = document.createElement("div"); + box2.style.position = "relative"; + box2.style.border = "1px solid #a0a0a0"; + box2.style.left = "-.2em"; + box2.style.top = "-.2em"; + box2.style.background = "white"; + box2.style.padding = ".3em .4em .3em .4em"; + box2.style.fontStyle = "normal"; + box2.onmouseout=auto_kill_doclink; + box2.parentID = id; + + // Get the targets + var targets_elt = document.getElementById(targets_id); + var targets = targets_elt.getAttribute("targets"); + var links = ""; + target_list = targets.split(","); + for (var i=0; i" + + target[0] + ""; + } + + // Put it all together. + elt.insertBefore(box1, elt.childNodes.item(0)); + //box1.appendChild(box2); + box1.appendChild(shadow); + shadow.appendChild(box2); + box2.innerHTML = + "Which "+name+" do you want to see documentation for?" + + ""; + } + return false; +} + +function get_anchor() { + var href = location.href; + var start = href.indexOf("#")+1; + if ((start != 0) && (start != href.length)) + return href.substring(start, href.length); + } +function redirect_url(dottedName) { + // Scan through each element of the "pages" list, and check + // if "name" matches with any of them. + for (var i=0; i-m" or "-c"; + // extract the portion & compare it to dottedName. + var pagename = pages[i].substring(0, pages[i].length-2); + if (pagename == dottedName.substring(0,pagename.length)) { + + // We've found a page that matches `dottedName`; + // construct its URL, using leftover `dottedName` + // content to form an anchor. + var pagetype = pages[i].charAt(pages[i].length-1); + var url = pagename + ((pagetype=="m")?"-module.html": + "-class.html"); + if (dottedName.length > pagename.length) + url += "#" + dottedName.substring(pagename.length+1, + dottedName.length); + return url; + } + } + } Added: trunk/numpy/doc/html/example-module.html =================================================================== --- trunk/numpy/doc/html/example-module.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/example-module.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,328 @@ + + + + + example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Module example + + + + + + +
[hide private]
[frames] | no frames]
+
+ +

Module example

source code

+
+This is the docstring for the example.py module.  Modules names should
+have short, all-lowercase names.  The module name may have underscores if
+this improves readability.
+
+Every module should have a docstring at the very top of the file.  The
+module's docstring may extend over multiple lines.  If your docstring does
+extend over multiple lines, the closing three quotation marks must be on
+a line by itself, preferably preceeded by a blank line.
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
Functions[hide private]
+
+   + + + + + + +
foo(var1, + var2, + long_var_name='hi')
+ One-line summary or signature.
+ source code + +
+ +
+   + + + + + + +
newfunc()
+ Do nothing.
+ source code + +
+ +
+   + + + + + + +
otherfunc()
+ Do nothing.
+ source code + +
+ +
+ + + + + + +
+ + + + + +
Function Details[hide private]
+
+ +
+ +
+ + +
+

foo(var1, + var2, + long_var_name='hi') +

+
source code  +
+ +
+One-line summary or signature.
+
+Several sentences providing an extended description. You can put
+text in mono-spaced type like so: ``var``.
+
+*Parameters*:
+
+    var1 : {array_like}
+        Array_like means all those objects -- lists, nested lists, etc. --
+        that can be converted to an array.
+    var2 : {integer}
+        Write out the full type
+    long_variable_name : {'hi', 'ho'}, optional
+        Choices in brackets, default first when optional.
+
+*Returns*:
+
+    named : {type}
+        Explanation
+    list
+        Explanation
+    of
+        Explanation
+    outputs
+        even more explaining
+
+*Other Parameters*:
+
+    only_seldom_used_keywords : type
+        Explanation
+    common_parametrs_listed_above : type
+        Explanation
+
+*See Also*:
+
+    `otherfunc` : relationship (optional)
+
+    `newfunc` : relationship (optional)
+
+*Notes*
+
+    Notes about the implementation algorithm (if needed).
+
+    This can have multiple paragraphs as can all sections.
+
+*Examples*
+
+    examples in doctest format
+
+    >>> a=[1,2,3]
+    >>> [x + 3 for x in a]
+    [4, 5, 6]
+
+
+
+
+
+
+ +
+ +
+ + +
+

newfunc() +

+
source code  +
+ +
+Do nothing.
+
+I never saw a purple cow.
+
+
+
+
+
+
+ +
+ +
+ + +
+

otherfunc() +

+
source code  +
+ +
+Do nothing.
+
+I never hope to see one.
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/example-pysrc.html =================================================================== --- trunk/numpy/doc/html/example-pysrc.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/example-pysrc.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,208 @@ + + + + + example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Module example + + + + + + +
[hide private]
[frames] | no frames]
+
+

Source Code for Module example

+
+  1  """This is the docstring for the example.py module.  Modules names should 
+  2  have short, all-lowercase names.  The module name may have underscores if 
+  3  this improves readability. 
+  4   
+  5  Every module should have a docstring at the very top of the file.  The 
+  6  module's docstring may extend over multiple lines.  If your docstring does 
+  7  extend over multiple lines, the closing three quotation marks must be on 
+  8  a line by itself, preferably preceeded by a blank line. 
+  9   
+ 10  """ 
+ 11   
+ 12  import os                      # standard library imports first 
+ 13   
+ 14  import numpy as np             # related third party imports next 
+ 15  import scipy as sp             # imports should be at the top of the module 
+ 16  import matplotlib as mpl       # imports should usually be on separate lines 
+ 17   
+ 18   
+ 19  __docformat__ = "restructuredtext en" 
+ 20   
+ 21   
+
22 -def foo(var1, var2, long_var_name='hi') : +
23 """One-line summary or signature. + 24 + 25 Several sentences providing an extended description. You can put + 26 text in mono-spaced type like so: ``var``. + 27 + 28 *Parameters*: + 29 + 30 var1 : {array_like} + 31 Array_like means all those objects -- lists, nested lists, etc. -- + 32 that can be converted to an array. + 33 var2 : {integer} + 34 Write out the full type + 35 long_variable_name : {'hi', 'ho'}, optional + 36 Choices in brackets, default first when optional. + 37 + 38 *Returns*: + 39 + 40 named : {type} + 41 Explanation + 42 list + 43 Explanation + 44 of + 45 Explanation + 46 outputs + 47 even more explaining + 48 + 49 *Other Parameters*: + 50 + 51 only_seldom_used_keywords : type + 52 Explanation + 53 common_parametrs_listed_above : type + 54 Explanation + 55 + 56 *See Also*: + 57 + 58 `otherfunc` : relationship (optional) + 59 + 60 `newfunc` : relationship (optional) + 61 + 62 *Notes* + 63 + 64 Notes about the implementation algorithm (if needed). + 65 + 66 This can have multiple paragraphs as can all sections. + 67 + 68 *Examples* + 69 + 70 examples in doctest format + 71 + 72 >>> a=[1,2,3] + 73 >>> [x + 3 for x in a] + 74 [4, 5, 6] + 75 + 76 """ + 77 + 78 pass +
79 + 80 +
81 -def newfunc() : +
82 """Do nothing. + 83 + 84 I never saw a purple cow. + 85 + 86 """ + 87 + 88 pass +
89 + 90 +
91 -def otherfunc() : +
92 """Do nothing. + 93 + 94 I never hope to see one. + 95 + 96 """ + 97 + 98 pass +
99 +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/frames.html =================================================================== --- trunk/numpy/doc/html/frames.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/frames.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,17 @@ + + + + + API Documentation + + + + + + + + + Added: trunk/numpy/doc/html/help.html =================================================================== --- trunk/numpy/doc/html/help.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/help.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,268 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/identifier-index.html =================================================================== --- trunk/numpy/doc/html/identifier-index.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/identifier-index.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,180 @@ + + + + + Identifier Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+ +
+

Identifier Index

+
+[ + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + _ +] +
+ + + + + + + + + +

E

+ + + + + + + + +

F

+ + + + + + + + +

N

+ + + + + + + + +

O

+ + + + + + + + +
+

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/index.html =================================================================== --- trunk/numpy/doc/html/index.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/index.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,17 @@ + + + + + API Documentation + + + + + + + + + Added: trunk/numpy/doc/html/module-tree.html =================================================================== --- trunk/numpy/doc/html/module-tree.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/module-tree.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,101 @@ + + + + + Module Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+

Module Hierarchy

+
    +
  • example: This is the docstring for the example.py module.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/redirect.html =================================================================== --- trunk/numpy/doc/html/redirect.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/redirect.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,38 @@ +Epydoc Redirect Page + + + + + + + + +

Epydoc Auto-redirect page

+ +

When javascript is enabled, this page will redirect URLs of +the form redirect.html#dotted.name to the +documentation for the object with the given fully-qualified +dotted name.

+

 

+ + + + + Added: trunk/numpy/doc/html/toc-everything.html =================================================================== --- trunk/numpy/doc/html/toc-everything.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/toc-everything.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,34 @@ + + + + + Everything + + + + + +

Everything

+
+

All Functions

+ example.foo
example.newfunc
example.otherfunc

+[hide private] + + + + + Added: trunk/numpy/doc/html/toc-example-module.html =================================================================== --- trunk/numpy/doc/html/toc-example-module.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/toc-example-module.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,34 @@ + + + + + example + + + + + +

Module example

+
+

Functions

+ foo
newfunc
otherfunc

+[hide private] + + + + + Added: trunk/numpy/doc/html/toc.html =================================================================== --- trunk/numpy/doc/html/toc.html 2007-09-23 13:56:50 UTC (rev 4101) +++ trunk/numpy/doc/html/toc.html 2007-09-23 14:29:19 UTC (rev 4102) @@ -0,0 +1,34 @@ + + + + + Table of Contents + + + + + +

Table of Contents

+
+ Everything +
+

Modules

+ example

+ [hide private] + + + + + From numpy-svn at scipy.org Sun Sep 23 10:32:11 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 09:32:11 -0500 (CDT) Subject: [Numpy-svn] r4103 - trunk/numpy/doc Message-ID: <20070923143211.36FE439C092@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 09:32:08 -0500 (Sun, 23 Sep 2007) New Revision: 4103 Removed: trunk/numpy/doc/html/ Log: backing out the last thing i did From numpy-svn at scipy.org Sun Sep 23 10:36:52 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 09:36:52 -0500 (CDT) Subject: [Numpy-svn] r4104 - in trunk/numpy/doc: . html Message-ID: <20070923143652.4FB3739C092@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 09:36:47 -0500 (Sun, 23 Sep 2007) New Revision: 4104 Added: trunk/numpy/doc/html/ trunk/numpy/doc/html/api-objects.txt trunk/numpy/doc/html/crarr.png trunk/numpy/doc/html/epydoc.css trunk/numpy/doc/html/epydoc.js trunk/numpy/doc/html/example-module.html trunk/numpy/doc/html/example-pysrc.html trunk/numpy/doc/html/frames.html trunk/numpy/doc/html/help.html trunk/numpy/doc/html/identifier-index.html trunk/numpy/doc/html/index.html trunk/numpy/doc/html/module-tree.html trunk/numpy/doc/html/redirect.html trunk/numpy/doc/html/toc-everything.html trunk/numpy/doc/html/toc-example-module.html trunk/numpy/doc/html/toc.html Log: one more try Added: trunk/numpy/doc/html/api-objects.txt =================================================================== --- trunk/numpy/doc/html/api-objects.txt 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/api-objects.txt 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,4 @@ +example example-module.html +example.otherfunc example-module.html#otherfunc +example.foo example-module.html#foo +example.newfunc example-module.html#newfunc Added: trunk/numpy/doc/html/crarr.png =================================================================== (Binary files differ) Property changes on: trunk/numpy/doc/html/crarr.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/numpy/doc/html/epydoc.css =================================================================== --- trunk/numpy/doc/html/epydoc.css 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/epydoc.css 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,315 @@ + + +/* Epydoc CSS Stylesheet + * + * This stylesheet can be used to customize the appearance of epydoc's + * HTML output. + * + */ + +/* Default Colors & Styles + * - Set the default foreground & background color with 'body'; and + * link colors with 'a:link' and 'a:visited'. + * - Use bold for decision list terms. + * - The heading styles defined here are used for headings *within* + * docstring descriptions. All headings used by epydoc itself use + * either class='epydoc' or class='toc' (CSS styles for both + * defined below). + */ +body { background: #ffffff; color: #000000; } +p { margin-top: 0.5em; margin-bottom: 0.5em; } +a:link { color: #0000ff; } +a:visited { color: #204080; } +dt { font-weight: bold; } +h1 { font-size: +140%; font-style: italic; + font-weight: bold; } +h2 { font-size: +125%; font-style: italic; + font-weight: bold; } +h3 { font-size: +110%; font-style: italic; + font-weight: normal; } +code { font-size: 100%; } + +/* Page Header & Footer + * - The standard page header consists of a navigation bar (with + * pointers to standard pages such as 'home' and 'trees'); a + * breadcrumbs list, which can be used to navigate to containing + * classes or modules; options links, to show/hide private + * variables and to show/hide frames; and a page title (using + *

). The page title may be followed by a link to the + * corresponding source code (using 'span.codelink'). + * - The footer consists of a navigation bar, a timestamp, and a + * pointer to epydoc's homepage. + */ +h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } +h2.epydoc { font-size: +130%; font-weight: bold; } +h3.epydoc { font-size: +115%; font-weight: bold; + margin-top: 0.2em; } +td h3.epydoc { font-size: +115%; font-weight: bold; + margin-bottom: 0; } +table.navbar { background: #a0c0ff; color: #000000; + border: 2px groove #c0d0d0; } +table.navbar table { color: #000000; } +th.navbar-select { background: #70b0ff; + color: #000000; } +table.navbar a { text-decoration: none; } +table.navbar a:link { color: #0000ff; } +table.navbar a:visited { color: #204080; } +span.breadcrumbs { font-size: 85%; font-weight: bold; } +span.options { font-size: 70%; } +span.codelink { font-size: 85%; } +td.footer { font-size: 85%; } + +/* Table Headers + * - Each summary table and details section begins with a 'header' + * row. This row contains a section title (marked by + * 'span.table-header') as well as a show/hide private link + * (marked by 'span.options', defined above). + * - Summary tables that contain user-defined groups mark those + * groups using 'group header' rows. + */ +td.table-header { background: #70b0ff; color: #000000; + border: 1px solid #608090; } +td.table-header table { color: #000000; } +td.table-header table a:link { color: #0000ff; } +td.table-header table a:visited { color: #204080; } +span.table-header { font-size: 120%; font-weight: bold; } +th.group-header { background: #c0e0f8; color: #000000; + text-align: left; font-style: italic; + font-size: 115%; + border: 1px solid #608090; } + +/* Summary Tables (functions, variables, etc) + * - Each object is described by a single row of the table with + * two cells. The left cell gives the object's type, and is + * marked with 'code.summary-type'. The right cell gives the + * object's name and a summary description. + * - CSS styles for the table's header and group headers are + * defined above, under 'Table Headers' + */ +table.summary { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin-bottom: 0.5em; } +td.summary { border: 1px solid #608090; } +code.summary-type { font-size: 85%; } +table.summary a:link { color: #0000ff; } +table.summary a:visited { color: #204080; } + + +/* Details Tables (functions, variables, etc) + * - Each object is described in its own div. + * - A single-row summary table w/ table-header is used as + * a header for each details section (CSS style for table-header + * is defined above, under 'Table Headers'). + */ +table.details { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +table.details table { color: #000000; } +table.details a:link { color: #0000ff; } +table.details a:visited { color: #204080; } + +/* Fields */ +dl.fields { margin-left: 2em; margin-top: 1em; + margin-bottom: 1em; } +dl.fields dd ul { margin-left: 0em; padding-left: 0em; } +dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } +div.fields { margin-left: 2em; } +div.fields p { margin-bottom: 0.5em; } + +/* Index tables (identifier index, term index, etc) + * - link-index is used for indices containing lists of links + * (namely, the identifier index & term index). + * - index-where is used in link indices for the text indicating + * the container/source for each link. + * - metadata-index is used for indices containing metadata + * extracted from fields (namely, the bug index & todo index). + */ +table.link-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; } +td.link-index { border-width: 0px; } +table.link-index a:link { color: #0000ff; } +table.link-index a:visited { color: #204080; } +span.index-where { font-size: 70%; } +table.metadata-index { border-collapse: collapse; + background: #e8f0f8; color: #000000; + border: 1px solid #608090; + margin: .2em 0 0 0; } +td.metadata-index { border-width: 1px; border-style: solid; } +table.metadata-index a:link { color: #0000ff; } +table.metadata-index a:visited { color: #204080; } + +/* Function signatures + * - sig* is used for the signature in the details section. + * - .summary-sig* is used for the signature in the summary + * table, and when listing property accessor functions. + * */ +.sig-name { color: #006080; } +.sig-arg { color: #008060; } +.sig-default { color: #602000; } +.summary-sig { font-family: monospace; } +.summary-sig-name { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:link + { color: #006080; font-weight: bold; } +table.summary a.summary-sig-name:visited + { color: #006080; font-weight: bold; } +.summary-sig-arg { color: #006040; } +.summary-sig-default { color: #501800; } + +/* To render variables, classes etc. like functions */ +table.summary .summary-name { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:link { color: #006080; font-weight: bold; + font-family: monospace; } +table.summary + a.summary-name:visited { color: #006080; font-weight: bold; + font-family: monospace; } + +/* Variable values + * - In the 'variable details' sections, each varaible's value is + * listed in a 'pre.variable' box. The width of this box is + * restricted to 80 chars; if the value's repr is longer than + * this it will be wrapped, using a backslash marked with + * class 'variable-linewrap'. If the value's repr is longer + * than 3 lines, the rest will be ellided; and an ellipsis + * marker ('...' marked with 'variable-ellipsis') will be used. + * - If the value is a string, its quote marks will be marked + * with 'variable-quote'. + * - If the variable is a regexp, it is syntax-highlighted using + * the re* CSS classes. + */ +pre.variable { padding: .5em; margin: 0; + background: #dce4ec; color: #000000; + border: 1px solid #708890; } +.variable-linewrap { color: #604000; font-weight: bold; } +.variable-ellipsis { color: #604000; font-weight: bold; } +.variable-quote { color: #604000; font-weight: bold; } +.variable-group { color: #008000; font-weight: bold; } +.variable-op { color: #604000; font-weight: bold; } +.variable-string { color: #006030; } +.variable-unknown { color: #a00000; font-weight: bold; } +.re { color: #000000; } +.re-char { color: #006030; } +.re-op { color: #600000; } +.re-group { color: #003060; } +.re-ref { color: #404040; } + +/* Base tree + * - Used by class pages to display the base class hierarchy. + */ +pre.base-tree { font-size: 80%; margin: 0; } + +/* Frames-based table of contents headers + * - Consists of two frames: one for selecting modules; and + * the other listing the contents of the selected module. + * - h1.toc is used for each frame's heading + * - h2.toc is used for subheadings within each frame. + */ +h1.toc { text-align: center; font-size: 105%; + margin: 0; font-weight: bold; + padding: 0; } +h2.toc { font-size: 100%; font-weight: bold; + margin: 0.5em 0 0 -0.3em; } + +/* Syntax Highlighting for Source Code + * - doctest examples are displayed in a 'pre.py-doctest' block. + * If the example is in a details table entry, then it will use + * the colors specified by the 'table pre.py-doctest' line. + * - Source code listings are displayed in a 'pre.py-src' block. + * Each line is marked with 'span.py-line' (used to draw a line + * down the left margin, separating the code from the line + * numbers). Line numbers are displayed with 'span.py-lineno'. + * The expand/collapse block toggle button is displayed with + * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not + * modify the font size of the text.) + * - If a source code page is opened with an anchor, then the + * corresponding code block will be highlighted. The code + * block's header is highlighted with 'py-highlight-hdr'; and + * the code block's body is highlighted with 'py-highlight'. + * - The remaining py-* classes are used to perform syntax + * highlighting (py-string for string literals, py-name for names, + * etc.) + */ +pre.py-doctest { padding: .5em; margin: 1em; + background: #e8f0f8; color: #000000; + border: 1px solid #708890; } +table pre.py-doctest { background: #dce4ec; + color: #000000; } +pre.py-src { border: 2px solid #000000; + background: #f0f0f0; color: #000000; } +.py-line { border-left: 2px solid #000000; + margin-left: .2em; padding-left: .4em; } +.py-lineno { font-style: italic; font-size: 90%; + padding-left: .5em; } +a.py-toggle { text-decoration: none; } +div.py-highlight-hdr { border-top: 2px solid #000000; + border-bottom: 2px solid #000000; + background: #d8e8e8; } +div.py-highlight { border-bottom: 2px solid #000000; + background: #d0e0e0; } +.py-prompt { color: #005050; font-weight: bold;} +.py-more { color: #005050; font-weight: bold;} +.py-string { color: #006030; } +.py-comment { color: #003060; } +.py-keyword { color: #600000; } +.py-output { color: #404040; } +.py-name { color: #000050; } +.py-name:link { color: #000050 !important; } +.py-name:visited { color: #000050 !important; } +.py-number { color: #005000; } +.py-defname { color: #000060; font-weight: bold; } +.py-def-name { color: #000060; font-weight: bold; } +.py-base-class { color: #000060; } +.py-param { color: #000060; } +.py-docstring { color: #006030; } +.py-decorator { color: #804020; } +/* Use this if you don't want links to names underlined: */ +/*a.py-name { text-decoration: none; }*/ + +/* Graphs & Diagrams + * - These CSS styles are used for graphs & diagrams generated using + * Graphviz dot. 'img.graph-without-title' is used for bare + * diagrams (to remove the border created by making the image + * clickable). + */ +img.graph-without-title { border: none; } +img.graph-with-title { border: 1px solid #000000; } +span.graph-title { font-weight: bold; } +span.graph-caption { } + +/* General-purpose classes + * - 'p.indent-wrapped-lines' defines a paragraph whose first line + * is not indented, but whose subsequent lines are. + * - The 'nomargin-top' class is used to remove the top margin (e.g. + * from lists). The 'nomargin' class is used to remove both the + * top and bottom margin (but not the left or right margin -- + * for lists, that would cause the bullets to disappear.) + */ +p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; + margin: 0; } +.nomargin-top { margin-top: 0; } +.nomargin { margin-top: 0; margin-bottom: 0; } + +/* HTML Log */ +div.log-block { padding: 0; margin: .5em 0 .5em 0; + background: #e8f0f8; color: #000000; + border: 1px solid #000000; } +div.log-error { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffb0b0; color: #000000; + border: 1px solid #000000; } +div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; + background: #ffffb0; color: #000000; + border: 1px solid #000000; } +div.log-info { padding: .1em .3em .1em .3em; margin: 4px; + background: #b0ffb0; color: #000000; + border: 1px solid #000000; } +h2.log-hdr { background: #70b0ff; color: #000000; + margin: 0; padding: 0em 0.5em 0em 0.5em; + border-bottom: 1px solid #000000; font-size: 110%; } +p.log { font-weight: bold; margin: .5em 0 .5em 0; } +tr.opt-changed { color: #000000; font-weight: bold; } +tr.opt-default { color: #606060; } +pre.log { margin: 0; padding: 0; padding-left: 1em; } Added: trunk/numpy/doc/html/epydoc.js =================================================================== --- trunk/numpy/doc/html/epydoc.js 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/epydoc.js 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,280 @@ +function toggle_private() { + // Search for any private/public links on this page. Store + // their old text in "cmd," so we will know what action to + // take; and change their text to the opposite action. + var cmd = "?"; + var elts = document.getElementsByTagName("a"); + for(var i=0; i...
"; + elt.innerHTML = s; + } +} + +function toggle(id) { + elt = document.getElementById(id+"-toggle"); + if (elt.innerHTML == "-") + collapse(id); + else + expand(id); + return false; +} + +function highlight(id) { + var elt = document.getElementById(id+"-def"); + if (elt) elt.className = "py-highlight-hdr"; + var elt = document.getElementById(id+"-expanded"); + if (elt) elt.className = "py-highlight"; + var elt = document.getElementById(id+"-collapsed"); + if (elt) elt.className = "py-highlight"; +} + +function num_lines(s) { + var n = 1; + var pos = s.indexOf("\n"); + while ( pos > 0) { + n += 1; + pos = s.indexOf("\n", pos+1); + } + return n; +} + +// Collapse all blocks that mave more than `min_lines` lines. +function collapse_all(min_lines) { + var elts = document.getElementsByTagName("div"); + for (var i=0; i 0) + if (elt.id.substring(split, elt.id.length) == "-expanded") + if (num_lines(elt.innerHTML) > min_lines) + collapse(elt.id.substring(0, split)); + } +} + +function expandto(href) { + var start = href.indexOf("#")+1; + if (start != 0 && start != href.length) { + if (href.substring(start, href.length) != "-") { + collapse_all(4); + pos = href.indexOf(".", start); + while (pos != -1) { + var id = href.substring(start, pos); + expand(id); + pos = href.indexOf(".", pos+1); + } + var id = href.substring(start, href.length); + expand(id); + highlight(id); + } + } +} + +function kill_doclink(id) { + var parent = document.getElementById(id); + parent.removeChild(parent.childNodes.item(0)); +} +function auto_kill_doclink(ev) { + if (!ev) var ev = window.event; + if (!this.contains(ev.toElement)) { + var parent = document.getElementById(this.parentID); + parent.removeChild(parent.childNodes.item(0)); + } +} + +function doclink(id, name, targets_id) { + var elt = document.getElementById(id); + + // If we already opened the box, then destroy it. + // (This case should never occur, but leave it in just in case.) + if (elt.childNodes.length > 1) { + elt.removeChild(elt.childNodes.item(0)); + } + else { + // The outer box: relative + inline positioning. + var box1 = document.createElement("div"); + box1.style.position = "relative"; + box1.style.display = "inline"; + box1.style.top = 0; + box1.style.left = 0; + + // A shadow for fun + var shadow = document.createElement("div"); + shadow.style.position = "absolute"; + shadow.style.left = "-1.3em"; + shadow.style.top = "-1.3em"; + shadow.style.background = "#404040"; + + // The inner box: absolute positioning. + var box2 = document.createElement("div"); + box2.style.position = "relative"; + box2.style.border = "1px solid #a0a0a0"; + box2.style.left = "-.2em"; + box2.style.top = "-.2em"; + box2.style.background = "white"; + box2.style.padding = ".3em .4em .3em .4em"; + box2.style.fontStyle = "normal"; + box2.onmouseout=auto_kill_doclink; + box2.parentID = id; + + // Get the targets + var targets_elt = document.getElementById(targets_id); + var targets = targets_elt.getAttribute("targets"); + var links = ""; + target_list = targets.split(","); + for (var i=0; i" + + target[0] + ""; + } + + // Put it all together. + elt.insertBefore(box1, elt.childNodes.item(0)); + //box1.appendChild(box2); + box1.appendChild(shadow); + shadow.appendChild(box2); + box2.innerHTML = + "Which "+name+" do you want to see documentation for?" + + ""; + } + return false; +} + +function get_anchor() { + var href = location.href; + var start = href.indexOf("#")+1; + if ((start != 0) && (start != href.length)) + return href.substring(start, href.length); + } +function redirect_url(dottedName) { + // Scan through each element of the "pages" list, and check + // if "name" matches with any of them. + for (var i=0; i-m" or "-c"; + // extract the portion & compare it to dottedName. + var pagename = pages[i].substring(0, pages[i].length-2); + if (pagename == dottedName.substring(0,pagename.length)) { + + // We've found a page that matches `dottedName`; + // construct its URL, using leftover `dottedName` + // content to form an anchor. + var pagetype = pages[i].charAt(pages[i].length-1); + var url = pagename + ((pagetype=="m")?"-module.html": + "-class.html"); + if (dottedName.length > pagename.length) + url += "#" + dottedName.substring(pagename.length+1, + dottedName.length); + return url; + } + } + } Added: trunk/numpy/doc/html/example-module.html =================================================================== --- trunk/numpy/doc/html/example-module.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/example-module.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,328 @@ + + + + + example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Module example + + + + + + +
[hide private]
[frames] | no frames]
+
+ +

Module example

source code

+
+This is the docstring for the example.py module.  Modules names should
+have short, all-lowercase names.  The module name may have underscores if
+this improves readability.
+
+Every module should have a docstring at the very top of the file.  The
+module's docstring may extend over multiple lines.  If your docstring does
+extend over multiple lines, the closing three quotation marks must be on
+a line by itself, preferably preceeded by a blank line.
+
+
+ + + + + + + + + + + + + + + + +
+ + + + + +
Functions[hide private]
+
+   + + + + + + +
foo(var1, + var2, + long_var_name='hi')
+ One-line summary or signature.
+ source code + +
+ +
+   + + + + + + +
newfunc()
+ Do nothing.
+ source code + +
+ +
+   + + + + + + +
otherfunc()
+ Do nothing.
+ source code + +
+ +
+ + + + + + +
+ + + + + +
Function Details[hide private]
+
+ +
+ +
+ + +
+

foo(var1, + var2, + long_var_name='hi') +

+
source code  +
+ +
+One-line summary or signature.
+
+Several sentences providing an extended description. You can put
+text in mono-spaced type like so: ``var``.
+
+*Parameters*:
+
+    var1 : {array_like}
+        Array_like means all those objects -- lists, nested lists, etc. --
+        that can be converted to an array.
+    var2 : {integer}
+        Write out the full type
+    long_variable_name : {'hi', 'ho'}, optional
+        Choices in brackets, default first when optional.
+
+*Returns*:
+
+    named : {type}
+        Explanation
+    list
+        Explanation
+    of
+        Explanation
+    outputs
+        even more explaining
+
+*Other Parameters*:
+
+    only_seldom_used_keywords : type
+        Explanation
+    common_parametrs_listed_above : type
+        Explanation
+
+*See Also*:
+
+    `otherfunc` : relationship (optional)
+
+    `newfunc` : relationship (optional)
+
+*Notes*
+
+    Notes about the implementation algorithm (if needed).
+
+    This can have multiple paragraphs as can all sections.
+
+*Examples*
+
+    examples in doctest format
+
+    >>> a=[1,2,3]
+    >>> [x + 3 for x in a]
+    [4, 5, 6]
+
+
+
+
+
+
+ +
+ +
+ + +
+

newfunc() +

+
source code  +
+ +
+Do nothing.
+
+I never saw a purple cow.
+
+
+
+
+
+
+ +
+ +
+ + +
+

otherfunc() +

+
source code  +
+ +
+Do nothing.
+
+I never hope to see one.
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/example-pysrc.html =================================================================== --- trunk/numpy/doc/html/example-pysrc.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/example-pysrc.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,208 @@ + + + + + example + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Module example + + + + + + +
[hide private]
[frames] | no frames]
+
+

Source Code for Module example

+
+  1  """This is the docstring for the example.py module.  Modules names should 
+  2  have short, all-lowercase names.  The module name may have underscores if 
+  3  this improves readability. 
+  4   
+  5  Every module should have a docstring at the very top of the file.  The 
+  6  module's docstring may extend over multiple lines.  If your docstring does 
+  7  extend over multiple lines, the closing three quotation marks must be on 
+  8  a line by itself, preferably preceeded by a blank line. 
+  9   
+ 10  """ 
+ 11   
+ 12  import os                      # standard library imports first 
+ 13   
+ 14  import numpy as np             # related third party imports next 
+ 15  import scipy as sp             # imports should be at the top of the module 
+ 16  import matplotlib as mpl       # imports should usually be on separate lines 
+ 17   
+ 18   
+ 19  __docformat__ = "restructuredtext en" 
+ 20   
+ 21   
+
22 -def foo(var1, var2, long_var_name='hi') : +
23 """One-line summary or signature. + 24 + 25 Several sentences providing an extended description. You can put + 26 text in mono-spaced type like so: ``var``. + 27 + 28 *Parameters*: + 29 + 30 var1 : {array_like} + 31 Array_like means all those objects -- lists, nested lists, etc. -- + 32 that can be converted to an array. + 33 var2 : {integer} + 34 Write out the full type + 35 long_variable_name : {'hi', 'ho'}, optional + 36 Choices in brackets, default first when optional. + 37 + 38 *Returns*: + 39 + 40 named : {type} + 41 Explanation + 42 list + 43 Explanation + 44 of + 45 Explanation + 46 outputs + 47 even more explaining + 48 + 49 *Other Parameters*: + 50 + 51 only_seldom_used_keywords : type + 52 Explanation + 53 common_parametrs_listed_above : type + 54 Explanation + 55 + 56 *See Also*: + 57 + 58 `otherfunc` : relationship (optional) + 59 + 60 `newfunc` : relationship (optional) + 61 + 62 *Notes* + 63 + 64 Notes about the implementation algorithm (if needed). + 65 + 66 This can have multiple paragraphs as can all sections. + 67 + 68 *Examples* + 69 + 70 examples in doctest format + 71 + 72 >>> a=[1,2,3] + 73 >>> [x + 3 for x in a] + 74 [4, 5, 6] + 75 + 76 """ + 77 + 78 pass +
79 + 80 +
81 -def newfunc() : +
82 """Do nothing. + 83 + 84 I never saw a purple cow. + 85 + 86 """ + 87 + 88 pass +
89 + 90 +
91 -def otherfunc() : +
92 """Do nothing. + 93 + 94 I never hope to see one. + 95 + 96 """ + 97 + 98 pass +
99 +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/frames.html =================================================================== --- trunk/numpy/doc/html/frames.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/frames.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,17 @@ + + + + + API Documentation + + + + + + + + + Added: trunk/numpy/doc/html/help.html =================================================================== --- trunk/numpy/doc/html/help.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/help.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,268 @@ + + + + + Help + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+ +

API Documentation

+ +

This document contains the API (Application Programming Interface) +documentation for this project. Documentation for the Python +objects defined by the project is divided into separate pages for each +package, module, and class. The API documentation also includes two +pages containing information about the project as a whole: a trees +page, and an index page.

+ +

Object Documentation

+ +

Each Package Documentation page contains:

+
    +
  • A description of the package.
  • +
  • A list of the modules and sub-packages contained by the + package.
  • +
  • A summary of the classes defined by the package.
  • +
  • A summary of the functions defined by the package.
  • +
  • A summary of the variables defined by the package.
  • +
  • A detailed description of each function defined by the + package.
  • +
  • A detailed description of each variable defined by the + package.
  • +
+ +

Each Module Documentation page contains:

+
    +
  • A description of the module.
  • +
  • A summary of the classes defined by the module.
  • +
  • A summary of the functions defined by the module.
  • +
  • A summary of the variables defined by the module.
  • +
  • A detailed description of each function defined by the + module.
  • +
  • A detailed description of each variable defined by the + module.
  • +
+ +

Each Class Documentation page contains:

+
    +
  • A class inheritance diagram.
  • +
  • A list of known subclasses.
  • +
  • A description of the class.
  • +
  • A summary of the methods defined by the class.
  • +
  • A summary of the instance variables defined by the class.
  • +
  • A summary of the class (static) variables defined by the + class.
  • +
  • A detailed description of each method defined by the + class.
  • +
  • A detailed description of each instance variable defined by the + class.
  • +
  • A detailed description of each class (static) variable defined + by the class.
  • +
+ +

Project Documentation

+ +

The Trees page contains the module and class hierarchies:

+
    +
  • The module hierarchy lists every package and module, with + modules grouped into packages. At the top level, and within each + package, modules and sub-packages are listed alphabetically.
  • +
  • The class hierarchy lists every class, grouped by base + class. If a class has more than one base class, then it will be + listed under each base class. At the top level, and under each base + class, classes are listed alphabetically.
  • +
+ +

The Index page contains indices of terms and + identifiers:

+
    +
  • The term index lists every term indexed by any object's + documentation. For each term, the index provides links to each + place where the term is indexed.
  • +
  • The identifier index lists the (short) name of every package, + module, class, method, function, variable, and parameter. For each + identifier, the index provides a short description, and a link to + its documentation.
  • +
+ +

The Table of Contents

+ +

The table of contents occupies the two frames on the left side of +the window. The upper-left frame displays the project +contents, and the lower-left frame displays the module +contents:

+ + + + + + + + + +
+ Project
Contents
...
+ API
Documentation
Frame


+
+ Module
Contents
 
...
  +

+ +

The project contents frame contains a list of all packages +and modules that are defined by the project. Clicking on an entry +will display its contents in the module contents frame. Clicking on a +special entry, labeled "Everything," will display the contents of +the entire project.

+ +

The module contents frame contains a list of every +submodule, class, type, exception, function, and variable defined by a +module or package. Clicking on an entry will display its +documentation in the API documentation frame. Clicking on the name of +the module, at the top of the frame, will display the documentation +for the module itself.

+ +

The "frames" and "no frames" buttons below the top +navigation bar can be used to control whether the table of contents is +displayed or not.

+ +

The Navigation Bar

+ +

A navigation bar is located at the top and bottom of every page. +It indicates what type of page you are currently viewing, and allows +you to go to related pages. The following table describes the labels +on the navigation bar. Note that not some labels (such as +[Parent]) are not displayed on all pages.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object +
[Module]viewing a modulethe module containing the current object +
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
+ +

The "show private" and "hide private" buttons below +the top navigation bar can be used to control whether documentation +for private objects is displayed. Private objects are usually defined +as objects whose (short) names begin with a single underscore, but do +not end with an underscore. For example, "_x", +"__pprint", and "epydoc.epytext._tokenize" +are private objects; but "re.sub", +"__init__", and "type_" are not. However, +if a module defines the "__all__" variable, then its +contents are used to decide which objects are private.

+ +

A timestamp below the bottom navigation bar indicates when each +page was last updated.

+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/identifier-index.html =================================================================== --- trunk/numpy/doc/html/identifier-index.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/identifier-index.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,180 @@ + + + + + Identifier Index + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+ +
+

Identifier Index

+
+[ + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + _ +] +
+ + + + + + + + + +

E

+ + + + + + + + +

F

+ + + + + + + + +

N

+ + + + + + + + +

O

+ + + + + + + + +
+

+ + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/index.html =================================================================== --- trunk/numpy/doc/html/index.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/index.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,17 @@ + + + + + API Documentation + + + + + + + + + Added: trunk/numpy/doc/html/module-tree.html =================================================================== --- trunk/numpy/doc/html/module-tree.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/module-tree.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,101 @@ + + + + + Module Hierarchy + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + +
[hide private]
[frames] | no frames]
+
+

Module Hierarchy

+
    +
  • example: This is the docstring for the example.py module.
  • +
+ + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + Added: trunk/numpy/doc/html/redirect.html =================================================================== --- trunk/numpy/doc/html/redirect.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/redirect.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,38 @@ +Epydoc Redirect Page + + + + + + + + +

Epydoc Auto-redirect page

+ +

When javascript is enabled, this page will redirect URLs of +the form redirect.html#dotted.name to the +documentation for the object with the given fully-qualified +dotted name.

+

 

+ + + + + Added: trunk/numpy/doc/html/toc-everything.html =================================================================== --- trunk/numpy/doc/html/toc-everything.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/toc-everything.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,34 @@ + + + + + Everything + + + + + +

Everything

+
+

All Functions

+ example.foo
example.newfunc
example.otherfunc

+[hide private] + + + + + Added: trunk/numpy/doc/html/toc-example-module.html =================================================================== --- trunk/numpy/doc/html/toc-example-module.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/toc-example-module.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,34 @@ + + + + + example + + + + + +

Module example

+
+

Functions

+ foo
newfunc
otherfunc

+[hide private] + + + + + Added: trunk/numpy/doc/html/toc.html =================================================================== --- trunk/numpy/doc/html/toc.html 2007-09-23 14:32:08 UTC (rev 4103) +++ trunk/numpy/doc/html/toc.html 2007-09-23 14:36:47 UTC (rev 4104) @@ -0,0 +1,34 @@ + + + + + Table of Contents + + + + + +

Table of Contents

+
+ Everything +
+

Modules

+ example

+ [hide private] + + + + + From numpy-svn at scipy.org Sun Sep 23 10:38:33 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 09:38:33 -0500 (CDT) Subject: [Numpy-svn] r4105 - trunk/numpy/doc Message-ID: <20070923143833.7D84F39C0E7@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 09:38:31 -0500 (Sun, 23 Sep 2007) New Revision: 4105 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: typo Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 14:36:47 UTC (rev 4104) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 14:38:31 UTC (rev 4105) @@ -129,8 +129,7 @@ Currently we recommend that you build eydoc from the trunk: - svn co https://epydoc.svn.sourceforge.net/svnroot/epydoc/trunk/epydoc -epydoc + svn co https://epydoc.svn.sourceforge.net/svnroot/epydoc/trunk/epydoc epydoc cd epydoc/src sudo python setup.py install From numpy-svn at scipy.org Sun Sep 23 10:39:12 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 09:39:12 -0500 (CDT) Subject: [Numpy-svn] r4106 - trunk/numpy/doc Message-ID: <20070923143912.9A98239C0E7@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 09:39:10 -0500 (Sun, 23 Sep 2007) New Revision: 4106 Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt Log: another typo Modified: trunk/numpy/doc/HOWTO_DOCUMENT.txt =================================================================== --- trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 14:38:31 UTC (rev 4105) +++ trunk/numpy/doc/HOWTO_DOCUMENT.txt 2007-09-23 14:39:10 UTC (rev 4106) @@ -127,7 +127,7 @@ ------------ -Currently we recommend that you build eydoc from the trunk: +Currently we recommend that you build eydoc from the trunk:: svn co https://epydoc.svn.sourceforge.net/svnroot/epydoc/trunk/epydoc epydoc cd epydoc/src From numpy-svn at scipy.org Sun Sep 23 16:30:56 2007 From: numpy-svn at scipy.org (numpy-svn at scipy.org) Date: Sun, 23 Sep 2007 15:30:56 -0500 (CDT) Subject: [Numpy-svn] r4107 - trunk/numpy/doc/html Message-ID: <20070923203056.8FC0439C2C4@new.scipy.org> Author: jarrod.millman Date: 2007-09-23 15:30:51 -0500 (Sun, 23 Sep 2007) New Revision: 4107 Modified: trunk/numpy/doc/html/example-module.html trunk/numpy/doc/html/example-pysrc.html trunk/numpy/doc/html/help.html trunk/numpy/doc/html/identifier-index.html trunk/numpy/doc/html/module-tree.html Log: correcting epydoc output Modified: trunk/numpy/doc/html/example-module.html =================================================================== --- trunk/numpy/doc/html/example-module.html 2007-09-23 14:39:10 UTC (rev 4106) +++ trunk/numpy/doc/html/example-module.html 2007-09-23 20:30:51 UTC (rev 4107) @@ -55,18 +55,14 @@

Module example

source code

-
-This is the docstring for the example.py module.  Modules names should
+

This is the docstring for the example.py module. Modules names should have short, all-lowercase names. The module name may have underscores if -this improves readability. - -Every module should have a docstring at the very top of the file. The +this improves readability.

+

Every module should have a docstring at the very top of the file. The module's docstring may extend over multiple lines. If your docstring does extend over multiple lines, the closing three quotation marks must be on -a line by itself, preferably preceeded by a blank line. +a line by itself, preferably preceeded by a blank line.

-
-
-
-One-line summary or signature.
-
-Several sentences providing an extended description. You can put
-text in mono-spaced type like so: ``var``.
-
-*Parameters*:
-
-    var1 : {array_like}
-        Array_like means all those objects -- lists, nested lists, etc. --
-        that can be converted to an array.
-    var2 : {integer}
-        Write out the full type
-    long_variable_name : {'hi', 'ho'}, optional
-        Choices in brackets, default first when optional.
-
-*Returns*:
-
-    named : {type}
-        Explanation
-    list
-        Explanation
-    of
-        Explanation
-    outputs
-        even more explaining
-
-*Other Parameters*:
-
-    only_seldom_used_keywords : type
-        Explanation
-    common_parametrs_listed_above : type
-        Explanation
-
-*See Also*:
-
-    `otherfunc` : relationship (optional)
-
-    `newfunc` : relationship (optional)
-
-*Notes*
-
-    Notes about the implementation algorithm (if needed).
-
-    This can have multiple paragraphs as can all sections.
-
-*Examples*
-
-    examples in doctest format
-
-    >>> a=[1,2,3]
-    >>> [x + 3 for x in a]
-    [4, 5, 6]
-
-
+

One-line summary or signature.

+

Several sentences providing an extended description. You can put +text in mono-spaced type like so: var.

+

Parameters:

+
+
+
var1 : {array_like}
+
Array_like means all those objects -- lists, nested lists, etc. -- +that can be converted to an array.
+
var2 : {integer}
+
Write out the full type
+
long_variable_name : {'hi', 'ho'}, optional
+
Choices in brackets, default first when optional.
+
+
+

Returns:

+
+
+
named : {type}
+
Explanation
+
list
+
Explanation
+
of
+
Explanation
+
outputs
+
even more explaining
+
+
+

Other Parameters:

+
+
+
only_seldom_used_keywords : type
+
Explanation
+
common_parametrs_listed_above : type
+
Explanation
+
+
+

See Also:

+
+

otherfunc : relationship (optional)

+

newfunc : relationship (optional)

+
+

Notes

+
+

Notes about the implementation algorithm (if needed).

+

This can have multiple paragraphs as can all sections.

+
+

Examples

+
+

examples in doctest format

+
+>>> a=[1,2,3]
+>>> [x + 3 for x in a]
+[4, 5, 6]
+
@@ -245,12 +241,8 @@ -
-Do nothing.
-
-I never saw a purple cow.
-
-
+

Do nothing.

+

I never saw a purple cow.

@@ -269,12 +261,8 @@ -
-Do nothing.
-
-I never hope to see one.
-
-
+

Do nothing.

+

I never hope to see one.

@@ -306,7 +294,7 @@