From scipy-svn at scipy.org Tue Apr 1 11:46:06 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 10:46:06 -0500 (CDT) Subject: [Scipy-svn] r4061 - in trunk/scipy/sparse/linalg/eigen: . lobpcg lobpcg/tests Message-ID: <20080401154606.D16D739C40D@new.scipy.org> Author: wnbell Date: 2008-04-01 10:45:54 -0500 (Tue, 01 Apr 2008) New Revision: 4061 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py trunk/scipy/sparse/linalg/eigen/setup.py Log: using LinearOperator in LOBPCG now reworked handling of small problems Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-01 01:55:34 UTC (rev 4060) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-01 15:45:54 UTC (rev 4061) @@ -13,14 +13,21 @@ Examples in tests directory contributed by Nils Wagner. """ +import types +from warnings import warn + import numpy as nm import scipy as sc import scipy.sparse as sp import scipy.linalg as la import scipy.io as io -import types -from symeig import symeig +from scipy.sparse.linalg import aslinearoperator, LinearOperator +try: + from symeig import symeig +except: + raise ImportError('lobpcg requires symeig') + def pause(): raw_input() @@ -41,77 +48,46 @@ aux.shape = (ar.shape[0], 1) return aux -## -# 05.04.2007, c -# 10.04.2007 -# 24.05.2007 def makeOperator( operatorInput, expectedShape ): - """ - Internal. Takes a dense numpy array or a sparse matrix or a function and - makes an operator performing matrix * vector product. + """Internal. Takes a dense numpy array or a sparse matrix or + a function and makes an operator performing matrix * blockvector + products. - :Example: + Example + ------- - operatorA = makeOperator( arrayA, (n, n) ) - vectorB = operatorA( vectorX ) + A = makeOperator( arrayA, (n, n) ) + vectorB = A( vectorX ) """ - class Operator( object ): - def __call__( self, vec ): - return self.call( vec ) - def asMatrix( self ): - return self._asMatrix( self ) + if operatorInput is None: + def ident(x): + return x + operator = LinearOperator(expectedShape, ident, matmat=ident) + else: + operator = aslinearoperator(operatorInput) - operator = Operator() - operator.obj = operatorInput + if operator.shape != expectedShape: + raise ValueError('operator has invalid shape') + + operator.__call__ = operator.matmat - if hasattr( operatorInput, 'shape' ): - operator.shape = operatorInput.shape - operator.dtype = operatorInput.dtype - if operator.shape != expectedShape: - raise ValueError, 'bad operator shape %s != %s' \ - % (expectedShape, operator.shape) - if sp.issparse( operatorInput ): - def call( vec ): - out = operator.obj * vec - if sp.issparse( out ): - out = out.toarray() - return as2d( out ) - def asMatrix( op ): - return op.obj.toarray() - else: - def call( vec ): - return as2d( nm.asarray( sc.dot( operator.obj, vec ) ) ) - def asMatrix( op ): - return op.obj - operator.call = call - operator._asMatrix = asMatrix - operator.kind = 'matrix' + return operator - elif isinstance( operatorInput, types.FunctionType ) or \ - isinstance( operatorInput, types.BuiltinFunctionType ): - operator.shape = expectedShape - operator.dtype = nm.float64 - operator.call = operatorInput - operator.kind = 'function' - return operator -## -# 05.04.2007, c def applyConstraints( blockVectorV, factYBY, blockVectorBY, blockVectorY ): """Internal. Changes blockVectorV in place.""" gramYBV = sc.dot( blockVectorBY.T, blockVectorV ) tmp = la.cho_solve( factYBY, gramYBV ) blockVectorV -= sc.dot( blockVectorY, tmp ) -## -# 05.04.2007, c -def b_orthonormalize( operatorB, blockVectorV, + +def b_orthonormalize( B, blockVectorV, blockVectorBV = None, retInvR = False ): """Internal.""" if blockVectorBV is None: - if operatorB is not None: - blockVectorBV = operatorB( blockVectorV ) + if B is not None: + blockVectorBV = B( blockVectorV ) else: blockVectorBV = blockVectorV # Shared data!!! gramVBV = sc.dot( blockVectorV.T, blockVectorBV ) @@ -119,7 +95,7 @@ la.inv( gramVBV, overwrite_a = True ) # gramVBV is now R^{-1}. blockVectorV = sc.dot( blockVectorV, gramVBV ) - if operatorB is not None: + if B is not None: blockVectorBV = sc.dot( blockVectorBV, gramVBV ) if retInvR: @@ -127,26 +103,23 @@ else: return blockVectorV, blockVectorBV -## -# 04.04.2007, c -# 05.04.2007 -# 06.04.2007 -# 10.04.2007 -# 24.05.2007 -def lobpcg( blockVectorX, operatorA, - operatorB = None, operatorT = None, blockVectorY = None, +def lobpcg( blockVectorX, A, + B = None, M = None, blockVectorY = None, residualTolerance = None, maxIterations = 20, largest = True, verbosityLevel = 0, retLambdaHistory = False, retResidualNormsHistory = False ): - """LOBPCG solves symmetric partial eigenproblems using preconditioning. + """Solve symmetric partial eigenproblems with optional preconditioning + This function implements the Locally Optimal Block Preconditioned + Conjugate Gradient Method (LOBPCG). + TODO write in terms of Ax=lambda B x Parameters ---------- blockVectorX : array_like initial approximation to eigenvectors shape=(n,blockSize) - operatorA : {dense matrix, sparse matrix, LinearOperator} + A : {dense matrix, sparse matrix, LinearOperator} the linear operator of the problem, usually a sparse matrix often called the "stiffness matrix" @@ -157,21 +130,22 @@ blockSize=size(blockVectorX,2) for the initial guess blockVectorX if it is full rank. - Other Parameters - ---------------- - operatorB : {dense matrix, sparse matrix, LinearOperator} + Optional Parameters + ------------------- + B : {dense matrix, sparse matrix, LinearOperator} the right hand side operator in a generalized eigenproblem. - by default, operatorB = Identity + by default, B = Identity often called the "mass matrix" - operatorT : {dense matrix, sparse matrix, LinearOperator} - preconditioner to operatorA; by default operatorT = Identity - operatorT should approximate the inverse of operatorA + M : {dense matrix, sparse matrix, LinearOperator} + preconditioner to A; by default M = Identity + M should approximate the inverse of A blockVectorY : array_like n-by-sizeY matrix of constraints, sizeY < n - The iterations will be performed in the (operatorB-) orthogonal - complement of the column-space of blockVectorY. - blockVectorY must be full rank. + The iterations will be performed in the B-orthogonal complement + of the column-space of blockVectorY. blockVectorY must be full rank. + Other Parameters + ---------------- residualTolerance : scalar solver tolerance. default: residualTolerance=n*sqrt(eps) maxIterations: integer @@ -202,59 +176,40 @@ sizeY = 0 # Block size. + if len(blockVectorX.shape) != 2: + raise ValueError('expected rank-2 array for argument blockVectorX') + n, sizeX = blockVectorX.shape if sizeX > n: - raise ValueError,\ - 'the first input argument blockVectorX must be tall, not fat' +\ - ' (%d, %d)' % blockVectorX.shape + raise ValueError('blockVectorX column dimension exceeds the row dimension') - if n < 1: - raise ValueError,\ - 'the matrix size is wrong (%d)' % n + A = makeOperator(A, (n,n)) + B = makeOperator(B, (n,n)) + M = makeOperator(M, (n,n)) - operatorA = makeOperator( operatorA, (n, n) ) - - if operatorB is not None: - operatorB = makeOperator( operatorB, (n, n) ) - if (n - sizeY) < (5 * sizeX): - print 'The problem size is too small, compared to the block size, for LOBPCG to run.' - print 'Trying to use symeig instead, without preconditioning.' + #warn('The problem size is small compared to the block size.' \ + # ' Using dense eigensolver instead of LOBPCG.') + if blockVectorY is not None: - print 'symeig does not support constraints' - raise ValueError + raise NotImplementedError('symeig does not support constraints') if largest: lohi = (n - sizeX, n) else: lohi = (1, sizeX) - if operatorA.kind == 'function': - print 'symeig does not support matrix A given by function' + A_dense = A(nm.eye(n)) - if operatorB is not None: - if operatorB.kind == 'function': - print 'symeig does not support matrix B given by function' - - _lambda, eigBlockVector = symeig( operatorA.asMatrix(), - operatorB.asMatrix(), - range = lohi ) + if B is not None: + B_dense = B(nm.eye(n)) + _lambda, eigBlockVector = symeig(A_dense, B_dense, range=lohi ) else: - _lambda, eigBlockVector = symeig( operatorA.asMatrix(), - range = lohi ) + _lambda, eigBlockVector = symeig(A_dense, range=lohi ) + return _lambda, eigBlockVector - if operatorT is not None: - operatorT = makeOperator( operatorT, (n, n) ) -## if n != operatorA.shape[0]: -## aux = 'The size (%d, %d) of operatorA is not the same as\n'+\ -## '%d - the number of rows of blockVectorX' % operatorA.shape + (n,) -## raise ValueError, aux -## if operatorA.shape[0] != operatorA.shape[1]: -## raise ValueError, 'operatorA must be a square matrix (%d, %d)' %\ -## operatorA.shape - if residualTolerance is None: residualTolerance = nm.sqrt( 1e-15 ) * n @@ -262,12 +217,12 @@ if verbosityLevel: aux = "Solving " - if operatorB is None: + if B is None: aux += "standard" else: aux += "generalized" aux += " eigenvalue problem with" - if operatorT is None: + if M is None: aux += "out" aux += " preconditioning\n\n" aux += "matrix size %d\n" % n @@ -285,8 +240,8 @@ # Apply constraints to X. if blockVectorY is not None: - if operatorB is not None: - blockVectorBY = operatorB( blockVectorY ) + if B is not None: + blockVectorBY = B( blockVectorY ) else: blockVectorBY = blockVectorY @@ -302,11 +257,11 @@ ## # B-orthonormalize X. - blockVectorX, blockVectorBX = b_orthonormalize( operatorB, blockVectorX ) + blockVectorX, blockVectorBX = b_orthonormalize( B, blockVectorX ) ## # Compute the initial Ritz vectors: solve the eigenproblem. - blockVectorAX = operatorA( blockVectorX ) + blockVectorAX = A( blockVectorX ) gramXAX = sc.dot( blockVectorX.T, blockVectorAX ) # gramXBX is X^T * X. gramXBX = sc.dot( blockVectorX.T, blockVectorX ) @@ -319,7 +274,7 @@ # pause() blockVectorX = sc.dot( blockVectorX, eigBlockVector ) blockVectorAX = sc.dot( blockVectorAX, eigBlockVector ) - if operatorB is not None: + if B is not None: blockVectorBX = sc.dot( blockVectorBX, eigBlockVector ) ## @@ -330,8 +285,8 @@ residualNormsHistory = [] previousBlockSize = sizeX - ident = nm.eye( sizeX, dtype = operatorA.dtype ) - ident0 = nm.eye( sizeX, dtype = operatorA.dtype ) + ident = nm.eye( sizeX, dtype = A.dtype ) + ident0 = nm.eye( sizeX, dtype = A.dtype ) ## # Main iteration loop. @@ -345,13 +300,6 @@ aux = nm.sum( blockVectorR.conjugate() * blockVectorR, 0 ) residualNorms = nm.sqrt( aux ) - -## if iterationNumber == 2: -## print blockVectorAX -## print blockVectorBX -## print blockVectorR -## pause() - residualNormsHistory.append( residualNorms ) ii = nm.where( residualNorms > residualTolerance, True, False ) @@ -362,7 +310,7 @@ currentBlockSize = activeMask.sum() if currentBlockSize != previousBlockSize: previousBlockSize = currentBlockSize - ident = nm.eye( currentBlockSize, dtype = operatorA.dtype ) + ident = nm.eye( currentBlockSize, dtype = A.dtype ) if currentBlockSize == 0: failureFlag = False # All eigenpairs converged. @@ -378,38 +326,30 @@ activeBlockVectorR = as2d( blockVectorR[:,activeMask] ) if iterationNumber > 0: - activeBlockVectorP = as2d( blockVectorP[:,activeMask] ) + activeBlockVectorP = as2d( blockVectorP [:,activeMask] ) activeBlockVectorAP = as2d( blockVectorAP[:,activeMask] ) activeBlockVectorBP = as2d( blockVectorBP[:,activeMask] ) -# print activeBlockVectorR - if operatorT is not None: - ## + if M is not None: # Apply preconditioner T to the active residuals. - activeBlockVectorR = operatorT( activeBlockVectorR ) + activeBlockVectorR = M( activeBlockVectorR ) -# assert nm.all( blockVectorR == activeBlockVectorR ) - ## # Apply constraints to the preconditioned residuals. if blockVectorY is not None: applyConstraints( activeBlockVectorR, gramYBY, blockVectorBY, blockVectorY ) -# assert nm.all( blockVectorR == activeBlockVectorR ) - ## # B-orthonormalize the preconditioned residuals. -# print activeBlockVectorR - aux = b_orthonormalize( operatorB, activeBlockVectorR ) + aux = b_orthonormalize( B, activeBlockVectorR ) activeBlockVectorR, activeBlockVectorBR = aux -# print activeBlockVectorR - activeBlockVectorAR = operatorA( activeBlockVectorR ) + activeBlockVectorAR = A( activeBlockVectorR ) if iterationNumber > 0: - aux = b_orthonormalize( operatorB, activeBlockVectorP, + aux = b_orthonormalize( B, activeBlockVectorP, activeBlockVectorBP, retInvR = True ) activeBlockVectorP, activeBlockVectorBP, invR = aux activeBlockVectorAP = sc.dot( activeBlockVectorAP, invR ) @@ -418,24 +358,24 @@ # Perform the Rayleigh Ritz Procedure: # Compute symmetric Gram matrices: - xaw = sc.dot( blockVectorX.T, activeBlockVectorAR ) + xaw = sc.dot( blockVectorX.T, activeBlockVectorAR ) waw = sc.dot( activeBlockVectorR.T, activeBlockVectorAR ) - xbw = sc.dot( blockVectorX.T, activeBlockVectorBR ) + xbw = sc.dot( blockVectorX.T, activeBlockVectorBR ) if iterationNumber > 0: - xap = sc.dot( blockVectorX.T, activeBlockVectorAP ) + xap = sc.dot( blockVectorX.T, activeBlockVectorAP ) wap = sc.dot( activeBlockVectorR.T, activeBlockVectorAP ) pap = sc.dot( activeBlockVectorP.T, activeBlockVectorAP ) - xbp = sc.dot( blockVectorX.T, activeBlockVectorBP ) + xbp = sc.dot( blockVectorX.T, activeBlockVectorBP ) wbp = sc.dot( activeBlockVectorR.T, activeBlockVectorBP ) gramA = nm.bmat( [[nm.diag( _lambda ), xaw, xap], [xaw.T, waw, wap], [xap.T, wap.T, pap]] ) try: - gramB = nm.bmat( [[ident0, xbw, xbp], - [xbw.T, ident, wbp], - [xbp.T, wbp.T, ident]] ) + gramB = nm.bmat( [[ident0, xbw, xbp], + [ xbw.T, ident, wbp], + [ xbp.T, wbp.T, ident]] ) except: print ident print xbw @@ -457,23 +397,10 @@ print gramB.T - gramB raise -## print nm.diag( _lambda ) -## print xaw -## print waw -## print xbw -## try: -## print xap -## print wap -## print pap -## print xbp -## print wbp -## except: -## pass -## pause() - if verbosityLevel > 10: save( gramA, 'gramA' ) save( gramB, 'gramB' ) + ## # Solve the generalized eigenvalue problem. # _lambda, eigBlockVector = la.eig( gramA, gramB ) @@ -495,7 +422,7 @@ ## aux = nm.sum( eigBlockVector.conjugate() * eigBlockVector, 0 ) ## eigVecNorms = nm.sqrt( aux ) ## eigBlockVector = eigBlockVector / eigVecNorms[nm.newaxis,:] -# eigBlockVector, aux = b_orthonormalize( operatorB, eigBlockVector ) +# eigBlockVector, aux = b_orthonormalize( B, eigBlockVector ) if verbosityLevel > 10: print eigBlockVector @@ -565,15 +492,15 @@ from scipy.sparse import spdiags, speye import time -## def operatorB( vec ): +## def B( vec ): ## return vec n = 100 vals = [nm.arange( n, dtype = nm.float64 ) + 1] - operatorA = spdiags( vals, 0, n, n ) - operatorB = speye( n, n ) -# operatorB[0,0] = 0 - operatorB = nm.eye( n, n ) + A = spdiags( vals, 0, n, n ) + B = speye( n, n ) +# B[0,0] = 0 + B = nm.eye( n, n ) Y = nm.eye( n, 3 ) @@ -594,8 +521,8 @@ # precond = spdiags( ivals, 0, n, n ) tt = time.clock() - eigs, vecs = lobpcg( X, operatorA, operatorB, blockVectorY = Y, - operatorT = precond, + eigs, vecs = lobpcg( X, A, B, blockVectorY = Y, + M = precond, residualTolerance = 1e-4, maxIterations = 40, largest = False, verbosityLevel = 1 ) print 'solution time:', time.clock() - tt Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py 2008-04-01 01:55:34 UTC (rev 4060) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py 2008-04-01 15:45:54 UTC (rev 4061) @@ -7,12 +7,9 @@ from scipy import array, arange, ones, sort, cos, pi, rand, \ set_printoptions, r_, diag, linalg +from scipy.linalg import eig from scipy.sparse.linalg.eigen import lobpcg -try: - from symeig import symeig -except: - raise ImportError('lobpcg requires symeig') set_printoptions(precision=3,linewidth=90) @@ -53,7 +50,9 @@ eigs,vecs = lobpcg.lobpcg(X,A,B,residualTolerance=1e-5, maxIterations=30) eigs.sort() - w,v = symeig(A,B) + #w,v = symeig(A,B) + w,v = eig(A,b=B) + w.sort() assert_almost_equal(w[:m/2],eigs[:m/2],decimal=2) @@ -65,6 +64,11 @@ #ylabel(r'$\lambda_i$') #show() +def test_Small(): + A,B = ElasticRod(10) + compare_solutions(A,B,10) + A,B = MikotaPair(10) + compare_solutions(A,B,10) def test_ElasticRod(): A,B = ElasticRod(100) Modified: trunk/scipy/sparse/linalg/eigen/setup.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-01 01:55:34 UTC (rev 4060) +++ trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-01 15:45:54 UTC (rev 4061) @@ -6,7 +6,7 @@ config = Configuration('eigen',parent_package,top_path) config.add_subpackage(('arpack')) - #config.add_subpackage(('lobpcg')) + config.add_subpackage(('lobpcg')) return config From scipy-svn at scipy.org Tue Apr 1 11:46:51 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 10:46:51 -0500 (CDT) Subject: [Scipy-svn] r4062 - trunk/scipy/sparse/linalg/eigen Message-ID: <20080401154651.9E10139C423@new.scipy.org> Author: wnbell Date: 2008-04-01 10:46:48 -0500 (Tue, 01 Apr 2008) New Revision: 4062 Modified: trunk/scipy/sparse/linalg/eigen/setup.py Log: disable lobpcg in setup Modified: trunk/scipy/sparse/linalg/eigen/setup.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-01 15:45:54 UTC (rev 4061) +++ trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-01 15:46:48 UTC (rev 4062) @@ -6,7 +6,7 @@ config = Configuration('eigen',parent_package,top_path) config.add_subpackage(('arpack')) - config.add_subpackage(('lobpcg')) + #config.add_subpackage(('lobpcg')) return config From scipy-svn at scipy.org Tue Apr 1 12:10:34 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 11:10:34 -0500 (CDT) Subject: [Scipy-svn] r4063 - in trunk/scipy/sparse/linalg/eigen/lobpcg: . tests Message-ID: <20080401161034.053A339C1BB@new.scipy.org> Author: wnbell Date: 2008-04-01 11:10:24 -0500 (Tue, 01 Apr 2008) New Revision: 4063 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py trunk/scipy/sparse/linalg/eigen/lobpcg/tests/large_scale.py Log: minor cleanup updated test Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-01 15:46:48 UTC (rev 4062) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-01 16:10:24 UTC (rev 4063) @@ -251,7 +251,7 @@ # gramYBY is a Cholesky factor from now on... gramYBY = la.cho_factor( gramYBY ) except: - raise ValueError('cannot handle linear dependent constraints') + raise ValueError('cannot handle linearly dependent constraints') applyConstraints( blockVectorX, gramYBY, blockVectorBY, blockVectorY ) @@ -265,14 +265,15 @@ gramXAX = sc.dot( blockVectorX.T, blockVectorAX ) # gramXBX is X^T * X. gramXBX = sc.dot( blockVectorX.T, blockVectorX ) + _lambda, eigBlockVector = symeig( gramXAX ) ii = nm.argsort( _lambda )[:sizeX] if largest: ii = ii[::-1] _lambda = _lambda[ii] + eigBlockVector = nm.asarray( eigBlockVector[:,ii] ) -# pause() - blockVectorX = sc.dot( blockVectorX, eigBlockVector ) + blockVectorX = sc.dot( blockVectorX, eigBlockVector ) blockVectorAX = sc.dot( blockVectorAX, eigBlockVector ) if B is not None: blockVectorBX = sc.dot( blockVectorBX, eigBlockVector ) @@ -285,7 +286,7 @@ residualNormsHistory = [] previousBlockSize = sizeX - ident = nm.eye( sizeX, dtype = A.dtype ) + ident = nm.eye( sizeX, dtype = A.dtype ) ident0 = nm.eye( sizeX, dtype = A.dtype ) ## @@ -369,22 +370,19 @@ xbp = sc.dot( blockVectorX.T, activeBlockVectorBP ) wbp = sc.dot( activeBlockVectorR.T, activeBlockVectorBP ) - gramA = nm.bmat( [[nm.diag( _lambda ), xaw, xap], - [xaw.T, waw, wap], - [xap.T, wap.T, pap]] ) - try: - gramB = nm.bmat( [[ident0, xbw, xbp], - [ xbw.T, ident, wbp], - [ xbp.T, wbp.T, ident]] ) - except: - print ident - print xbw - raise + gramA = nm.bmat( [[nm.diag( _lambda ), xaw, xap], + [ xaw.T, waw, wap], + [ xap.T, wap.T, pap]] ) + + gramB = nm.bmat( [[ident0, xbw, xbp], + [ xbw.T, ident, wbp], + [ xbp.T, wbp.T, ident]] ) else: - gramA = nm.bmat( [[nm.diag( _lambda ), xaw], - [xaw.T, waw]] ) - gramB = nm.bmat( [[ident0, xbw], - [xbw.T, ident0]] ) + gramA = nm.bmat( [[nm.diag( _lambda ), xaw], + [ xaw.T, waw]] ) + gramB = nm.bmat( [[ident0, xbw], + [ xbw.T, ident0]] ) + try: assert nm.allclose( gramA.T, gramA ) except: @@ -427,6 +425,7 @@ if verbosityLevel > 10: print eigBlockVector pause() + ## # Compute Ritz vectors. if iterationNumber > 0: @@ -434,22 +433,20 @@ eigBlockVectorR = eigBlockVector[sizeX:sizeX+currentBlockSize] eigBlockVectorP = eigBlockVector[sizeX+currentBlockSize:] - pp = sc.dot( activeBlockVectorR, eigBlockVectorR )\ - + sc.dot( activeBlockVectorP, eigBlockVectorP ) + pp = sc.dot( activeBlockVectorR, eigBlockVectorR ) + pp += sc.dot( activeBlockVectorP, eigBlockVectorP ) - app = sc.dot( activeBlockVectorAR, eigBlockVectorR )\ - + sc.dot( activeBlockVectorAP, eigBlockVectorP ) + app = sc.dot( activeBlockVectorAR, eigBlockVectorR ) + app += sc.dot( activeBlockVectorAP, eigBlockVectorP ) - bpp = sc.dot( activeBlockVectorBR, eigBlockVectorR )\ - + sc.dot( activeBlockVectorBP, eigBlockVectorP ) + bpp = sc.dot( activeBlockVectorBR, eigBlockVectorR ) + bpp += sc.dot( activeBlockVectorBP, eigBlockVectorP ) else: eigBlockVectorX = eigBlockVector[:sizeX] eigBlockVectorR = eigBlockVector[sizeX:] - pp = sc.dot( activeBlockVectorR, eigBlockVectorR ) - + pp = sc.dot( activeBlockVectorR, eigBlockVectorR ) app = sc.dot( activeBlockVectorAR, eigBlockVectorR ) - bpp = sc.dot( activeBlockVectorBR, eigBlockVectorR ) if verbosityLevel > 10: @@ -457,9 +454,8 @@ print app print bpp pause() -# print pp.shape, app.shape, bpp.shape - blockVectorX = sc.dot( blockVectorX, eigBlockVectorX ) + pp + blockVectorX = sc.dot( blockVectorX, eigBlockVectorX ) + pp blockVectorAX = sc.dot( blockVectorAX, eigBlockVectorX ) + app blockVectorBX = sc.dot( blockVectorBX, eigBlockVectorX ) + bpp Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/tests/large_scale.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/tests/large_scale.py 2008-04-01 15:46:48 UTC (rev 4062) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/tests/large_scale.py 2008-04-01 16:10:24 UTC (rev 4063) @@ -1,7 +1,7 @@ from scipy import array, arange, ones, sort, cos, pi, rand, \ set_printoptions, r_ -from scipy.sandbox import lobpcg -from scipy.sparse import spdiags, speye +from scipy.sparse.linalg import lobpcg +from scipy import sparse from pylab import loglog, show, xlabel, ylabel, title set_printoptions(precision=8,linewidth=90) import time @@ -12,11 +12,11 @@ A moment-based method for large-scale generalized eigenvalue problems Appl. Num. Anal. Comp. Math. Vol. 1 No. 2 (2004) """ - A = speye( n, n ) + A = sparse.eye( n, n ) d0 = array(r_[5,6*ones(n-2),5]) d1 = -4*ones(n) d2 = ones(n) - B = spdiags([d2,d1,d0,d1,d2],[-2,-1,0,1,2],n,n) + B = sparse.spdiags([d2,d1,d0,d1,d2],[-2,-1,0,1,2],n,n) k = arange(1,n+1) w_ex = sort(1./(16.*pow(cos(0.5*k*pi/(n+1)),4))) # exact eigenvalues @@ -28,13 +28,12 @@ # # Large scale # -n = 25000 +n = 2500 A,B, w_ex = sakurai(n) # Mikota pair X = rand(n,m) data=[] tt = time.clock() -eigs,vecs, resnh = lobpcg.lobpcg(X,A,B, - residualTolerance = 1e-6, maxIterations =500, retResidualNormsHistory=1) +eigs,vecs, resnh = lobpcg(X,A,B, residualTolerance = 1e-6, maxIterations =500, retResidualNormsHistory=1) data.append(time.clock()-tt) print 'Results by LOBPCG for n='+str(n) print From scipy-svn at scipy.org Tue Apr 1 17:03:51 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 16:03:51 -0500 (CDT) Subject: [Scipy-svn] r4064 - trunk/scipy/ndimage Message-ID: <20080401210351.68FE139C48F@new.scipy.org> Author: tom.waite Date: 2008-04-01 16:03:45 -0500 (Tue, 01 Apr 2008) New Revision: 4064 Modified: trunk/scipy/ndimage/_segmenter.py Log: Added support for 3D blob extraction and improve the current 2D blob. Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-01 16:10:24 UTC (rev 4063) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-01 21:03:45 UTC (rev 4064) @@ -463,37 +463,58 @@ return ROIList[ROIList['Area']>dust] -def get_blobs(binary_edge_image): +def get_blobs(binary_edge_image, mask=1): """ labeled_edge_image, groups = get_blobs(binary_edge_image) - get the total number of blobs in a 2D image and convert the binary - image to labelled regions + get the total number of blobs in a 2D or 3D image and convert the + binary image (or volume) to labelled regions Parameters ---------- binary_edge_image : {nd_array} - an binary image + an binary image/volume + mask : {int} + the size of the 2D or 3D connectivity mask. For 2D this is 1, 4 or 8. + For 3D this is 1, 6, 14 or 28. Mask = 1 is ANY connection in 3x3 + or 3x3x3 mask for 2D or 3D, respectively. + Returns ---------- label_image : {nd_array} - an image with labeled regions from get_blobs() method + an image/volume with labeled regions from get_blobs() method groups : {int} number of blobs in image determined by get_blobs() method """ - [rows, cols] = binary_edge_image.shape - labeled_edge_image = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) - groups = S.get_blobs(binary_edge_image, labeled_edge_image) - return labeled_edge_image, groups + dimensions = binary_edge_image.ndim + if dimensions == 2: + if mask != 1 and mask != 4 and mask != 8: + mask = 1 + [rows, cols] = binary_edge_image.shape + labeled_edge_image_or_vol = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) + elif dimensions == 3: + if mask != 1 and mask != 6 and mask != 14 and mask != 28: + mask = 1 + [layers, rows, cols] = binary_edge_image.shape + labeled_edge_image_or_vol = NP.zeros(layers*rows*cols, dtype=NP.uint16).reshape(layers, rows, cols) + else: + labeled_edge_image_or_vol = None + groups = 0 + return labeled_edge_image_or_vol, groups + groups = S.get_blobs(binary_edge_image, labeled_edge_image_or_vol, mask) + + return labeled_edge_image_or_vol, groups + + def sobel_edges(sobel_edge_image, sobel_stats, mode=1, sobel_threshold=0.3): """ sobel_edge = sobel_edges(sobel_edge_image, sobel_stats, mode=1, sobel_threshold=0.3) From scipy-svn at scipy.org Tue Apr 1 17:04:10 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 16:04:10 -0500 (CDT) Subject: [Scipy-svn] r4065 - trunk/scipy/ndimage/src/segment Message-ID: <20080401210410.989E939C48F@new.scipy.org> Author: tom.waite Date: 2008-04-01 16:04:08 -0500 (Tue, 01 Apr 2008) New Revision: 4065 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: Added support for 3D blob extraction and improve the current 2D blob. Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-01 21:03:45 UTC (rev 4064) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-01 21:04:08 UTC (rev 4065) @@ -140,6 +140,7 @@ int num; int nd; int type; + int mask; npy_intp *dims; unsigned short *fP1; unsigned short *fP2; @@ -147,7 +148,7 @@ PyObject *iArray = NULL; PyObject *eArray = NULL; - if(!PyArg_ParseTuple(args, "OO", &iArray, &eArray)) + if(!PyArg_ParseTuple(args, "OOi", &iArray, &eArray, &mask)) goto exit; fP1 = (unsigned short *)PyArray_DATA(iArray); @@ -161,8 +162,15 @@ goto exit; - if(!NI_GetBlobs(num, (int)dims[0], (int)dims[1], fP1, fP2, &groups)) + if(nd == 2){ + if(!NI_GetBlobs2D(num, (int)dims[0], (int)dims[1], fP1, fP2, &groups, mask)) goto exit; + } + else if(nd == 3){ + if(!NI_GetBlobs3D(num, (int)dims[0], (int)dims[1], (int)dims[2], fP1, fP2, + &groups, mask)) + goto exit; + } exit: @@ -207,6 +215,9 @@ objNumber = PyArray_DIMS(nArray); // this is the number of labels in the edge image myData = (objStruct*)PyArray_DATA(nArray); + /* need to pass in 2D/3D flag and mask. NI_GetBlobRegions will call + * 2D or 3D blob_extraction */ + if(!NI_GetBlobRegions((int)dims[0], (int)dims[1], (int)objNumber[0], fP1, myData)) goto exit; From scipy-svn at scipy.org Tue Apr 1 17:04:24 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 16:04:24 -0500 (CDT) Subject: [Scipy-svn] r4066 - trunk/scipy/ndimage/src/segment Message-ID: <20080401210424.79FDB39C36D@new.scipy.org> Author: tom.waite Date: 2008-04-01 16:04:22 -0500 (Tue, 01 Apr 2008) New Revision: 4066 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: Added support for 3D blob extraction and improve the current 2D blob. Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-01 21:04:08 UTC (rev 4065) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-01 21:04:22 UTC (rev 4066) @@ -200,8 +200,289 @@ } -int NI_GetBlobs(int samples, int rows, int cols, unsigned short *edges, unsigned short *connectedEdges, int *groups){ +int NI_GetBlobs3D(int samples, int layers, int rows, int cols, unsigned short *edges, + unsigned short *connectedEdges, int *groups, int mask){ + int i, j, k, l, m; + int lOffset, rOffset, Label; + int lOffsetP, lOffsetN; + int rOffsetP, rOffsetN; + int Classes[4096]; + int dwImageSize, ptr; + int HighZ, HighY, HighX, LowZ, LowX, LowY; + bool NewLabel; + bool Change; + bool connected; + int T[27]; + int *ccompImage; + int layerSize; + int TargetArea; + int count; + int status; + + layerSize = rows * cols; + dwImageSize = layers * rows * cols; + ccompImage = calloc(dwImageSize, sizeof(int )); + + Label = 1; + for(i = 1; i < layers-1; ++i){ + lOffset = i * layerSize; + lOffsetP = lOffset+layerSize; + lOffsetN = lOffset-layerSize; + for(j = 1; j < rows-1; ++j){ + rOffset = j * cols; + rOffsetP = rOffset+cols; + rOffsetN = rOffset-cols; + for(k = 1; k < cols-1; ++k){ + if(edges[lOffset+rOffset+k]){ + /* + check 3x3x3 connectivity + */ + + T[0] = edges[lOffset+rOffset+k]; + T[1] = edges[lOffset+rOffset+k+1]; + T[2] = edges[lOffset+rOffsetN+k+1]; + T[3] = edges[lOffset+rOffsetN+k]; + T[4] = edges[lOffset+rOffsetN+k-1]; + T[5] = edges[lOffset+rOffset+k-1]; + T[6] = edges[lOffset+rOffsetP+k-1]; + T[7] = edges[lOffset+rOffsetP+k]; + T[8] = edges[lOffset+rOffsetP+k+1]; + + T[9] = edges[lOffsetN+rOffset+k]; + T[10] = edges[lOffsetN+rOffset+k+1]; + T[11] = edges[lOffsetN+rOffsetN+k+1]; + T[12] = edges[lOffsetN+rOffsetN+k]; + T[13] = edges[lOffsetN+rOffsetN+k-1]; + T[14] = edges[lOffsetN+rOffset+k-1]; + T[15] = edges[lOffsetN+rOffsetP+k-1]; + T[16] = edges[lOffsetN+rOffsetP+k]; + T[17] = edges[lOffsetN+rOffsetP+k+1]; + + T[18] = edges[lOffsetP+rOffset+k]; + T[19] = edges[lOffsetP+rOffset+k+1]; + T[20] = edges[lOffsetP+rOffsetN+k+1]; + T[21] = edges[lOffsetP+rOffsetN+k]; + T[22] = edges[lOffsetP+rOffsetN+k-1]; + T[23] = edges[lOffsetP+rOffset+k-1]; + T[24] = edges[lOffsetP+rOffsetP+k-1]; + T[25] = edges[lOffsetP+rOffsetP+k]; + T[26] = edges[lOffsetP+rOffsetP+k+1]; + + connected = FALSE; + if(mask == 1){ + count = 0; + for(l = 1; l < 27; ++l){ + count += T[l]; + } + if(count){ + connected = TRUE; + } + } + else if(mask == 6){ + count = (T[2] + T[4] + T[6] + T[8] + T[9] + T[18]); + if(count == 6){ + connected = TRUE; + } + } + else if(mask == 14){ + count = (T[2] + T[4] + T[6] + T[8] + T[9] + T[18] + T[11] + + T[13] + T[15] + T[17] + T[20] + T[22] + T[24] + T[26]); + if(count == 14){ + connected = TRUE; + } + } + else if(mask == 26){ + count = 0; + for(l = 1; l < 27; ++l){ + count += T[l]; + } + if(count == 26){ + connected = TRUE; + } + } + if(connected){ + ccompImage[lOffset+rOffset+k] = Label++; + } + } + } + } + } + + + while(1){ + Change = FALSE; + /* + // TOP-DOWN Pass for labeling + */ + for(i = 1; i < layers-1; ++i){ + lOffset = i * layerSize; + lOffsetP = lOffset+layerSize; + lOffsetN = lOffset-layerSize; + for(j = 1; j < rows-1; ++j){ + rOffset = j * cols; + rOffsetP = rOffset+cols; + rOffsetN = rOffset-cols; + for(k = 1; k < cols-1; ++k){ + if(ccompImage[lOffset+rOffset+k] != 0){ + + T[0] = ccompImage[lOffset+rOffset+k]; + T[1] = ccompImage[lOffset+rOffset+k+1]; + T[2] = ccompImage[lOffset+rOffsetN+k+1]; + T[3] = ccompImage[lOffset+rOffsetN+k]; + T[4] = ccompImage[lOffset+rOffsetN+k-1]; + T[5] = ccompImage[lOffset+rOffset+k-1]; + T[6] = ccompImage[lOffset+rOffsetP+k-1]; + T[7] = ccompImage[lOffset+rOffsetP+k]; + T[8] = ccompImage[lOffset+rOffsetP+k+1]; + + T[9] = ccompImage[lOffsetN+rOffset+k]; + T[10] = ccompImage[lOffsetN+rOffset+k+1]; + T[11] = ccompImage[lOffsetN+rOffsetN+k+1]; + T[12] = ccompImage[lOffsetN+rOffsetN+k]; + T[13] = ccompImage[lOffsetN+rOffsetN+k-1]; + T[14] = ccompImage[lOffsetN+rOffset+k-1]; + T[15] = ccompImage[lOffsetN+rOffsetP+k-1]; + T[16] = ccompImage[lOffsetN+rOffsetP+k]; + T[17] = ccompImage[lOffsetN+rOffsetP+k+1]; + + T[18] = ccompImage[lOffsetP+rOffset+k]; + T[19] = ccompImage[lOffsetP+rOffset+k+1]; + T[20] = ccompImage[lOffsetP+rOffsetN+k+1]; + T[21] = ccompImage[lOffsetP+rOffsetN+k]; + T[22] = ccompImage[lOffsetP+rOffsetN+k-1]; + T[23] = ccompImage[lOffsetP+rOffset+k-1]; + T[24] = ccompImage[lOffsetP+rOffsetP+k-1]; + T[25] = ccompImage[lOffsetP+rOffsetP+k]; + T[26] = ccompImage[lOffsetP+rOffsetP+k+1]; + + m = T[0]; + for(l = 1; l < 27; ++l){ + if(T[l] != 0){ + if(T[l] < m) m = T[l]; + } + } + if(m != ccompImage[lOffset+rOffset+k]){ + Change = TRUE; + ccompImage[lOffset+rOffset+k] = m; + } + } + } + } + } + /* + // BOTTOM-UP Pass for labeling + */ + for(i = layers-1; i > 0; --i){ + lOffset = i * layerSize; + lOffsetP = lOffset+layerSize; + lOffsetN = lOffset-layerSize; + for(j = rows-1; j > 0; --j){ + rOffset = j * cols; + rOffsetP = rOffset+cols; + rOffsetN = rOffset-cols; + for(k = cols-1; k > 0; --k){ + if(ccompImage[lOffset+rOffset+k] != 0){ + + T[0] = ccompImage[lOffset+rOffset+k]; + T[1] = ccompImage[lOffset+rOffset+k+1]; + T[2] = ccompImage[lOffset+rOffsetN+k+1]; + T[3] = ccompImage[lOffset+rOffsetN+k]; + T[4] = ccompImage[lOffset+rOffsetN+k-1]; + T[5] = ccompImage[lOffset+rOffset+k-1]; + T[6] = ccompImage[lOffset+rOffsetP+k-1]; + T[7] = ccompImage[lOffset+rOffsetP+k]; + T[8] = ccompImage[lOffset+rOffsetP+k+1]; + + T[9] = ccompImage[lOffsetN+rOffset+k]; + T[10] = ccompImage[lOffsetN+rOffset+k+1]; + T[11] = ccompImage[lOffsetN+rOffsetN+k+1]; + T[12] = ccompImage[lOffsetN+rOffsetN+k]; + T[13] = ccompImage[lOffsetN+rOffsetN+k-1]; + T[14] = ccompImage[lOffsetN+rOffset+k-1]; + T[15] = ccompImage[lOffsetN+rOffsetP+k-1]; + T[16] = ccompImage[lOffsetN+rOffsetP+k]; + T[17] = ccompImage[lOffsetN+rOffsetP+k+1]; + + T[18] = ccompImage[lOffsetP+rOffset+k]; + T[19] = ccompImage[lOffsetP+rOffset+k+1]; + T[20] = ccompImage[lOffsetP+rOffsetN+k+1]; + T[21] = ccompImage[lOffsetP+rOffsetN+k]; + T[22] = ccompImage[lOffsetP+rOffsetN+k-1]; + T[23] = ccompImage[lOffsetP+rOffset+k-1]; + T[24] = ccompImage[lOffsetP+rOffsetP+k-1]; + T[25] = ccompImage[lOffsetP+rOffsetP+k]; + T[26] = ccompImage[lOffsetP+rOffsetP+k+1]; + + m = T[0]; + for(l = 1; l < 27; ++l){ + if(T[l] != 0){ + if(T[l] < m) m = T[l]; + } + } + if(m != ccompImage[lOffset+rOffset+k]){ + Change = TRUE; + ccompImage[lOffset+rOffset+k] = m; + } + } + } + } + } + + if(!Change) break; + + } /* end while loop */ + + Label = 1; + Classes[0] = 0; + ptr = 0; + for(i = 0; i < layers; ++i){ + for(j = 0; j < rows; ++j){ + for(k = 0; k < cols; ++k){ + m = ccompImage[ptr]; + ++ptr; + if(m > 0){ + NewLabel = TRUE; + for(l = 1; l < Label; ++l){ + if(Classes[l] == m) NewLabel = FALSE; + } + if(NewLabel){ + Classes[Label++] = m; + if(Label > 4000){ + return 0; + } + } + } + } + } + } + + ptr = 0; + for(i = 0; i < layers; ++i){ + for(j = 0; j < rows; ++j){ + for(k = 0; k < cols; ++k){ + m = ccompImage[ptr]; + for(l = 1; l < Label; ++l){ + if(Classes[l] == m){ + connectedEdges[ptr] = l; + break; + } + } + ++ptr; + } + } + } + + free(ccompImage); + + status = 1; + return(status); + +} + +int NI_GetBlobs2D(int samples, int rows, int cols, unsigned short *edges, unsigned short *connectedEdges, + int *groups, int mask){ + int i, j, k, l, m; int offset; int Label; @@ -209,10 +490,12 @@ int Classes[4096]; bool NewLabel; bool Change; + bool connected; + int count; unsigned short T[12]; /* - // connected components labeling. pixels touch within 3x3 mask for edge connectedness. + // connected components labeling. pixels with 1, 4 or 8 connectedness. */ Label = 1; offset = 0; @@ -220,7 +503,34 @@ for(j = 0; j < cols; ++j){ connectedEdges[offset+j] = 0; if(edges[offset+j] == 1){ - connectedEdges[offset+j] = Label++; + connected = FALSE; + if(mask == 1){ + count = 0; + for(l = 1; l < 9; ++l){ + count += T[l]; + } + if(count){ + connected = TRUE; + } + } + else if(mask == 4){ + count = (T[2] + T[4] + T[6] + T[8]); + if(count == 4){ + connected = TRUE; + } + } + else if(mask == 8){ + count = 0; + for(l = 1; l < 9; ++l){ + count += T[l]; + } + if(count == 8){ + connected = TRUE; + } + } + if(connected){ + connectedEdges[offset+j] = Label++; + } } } offset += cols; From scipy-svn at scipy.org Tue Apr 1 21:36:57 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 20:36:57 -0500 (CDT) Subject: [Scipy-svn] r4067 - trunk/scipy/sparse/linalg/eigen/lobpcg Message-ID: <20080402013657.98E0139C056@new.scipy.org> Author: wnbell Date: 2008-04-01 20:36:54 -0500 (Tue, 01 Apr 2008) New Revision: 4067 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py Log: fixed typo in lobpcg Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-01 21:04:22 UTC (rev 4066) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-02 01:36:54 UTC (rev 4067) @@ -19,7 +19,6 @@ import numpy as nm import scipy as sc import scipy.sparse as sp -import scipy.linalg as la import scipy.io as io from scipy.sparse.linalg import aslinearoperator, LinearOperator @@ -78,7 +77,7 @@ def applyConstraints( blockVectorV, factYBY, blockVectorBY, blockVectorY ): """Internal. Changes blockVectorV in place.""" gramYBV = sc.dot( blockVectorBY.T, blockVectorV ) - tmp = la.cho_solve( factYBY, gramYBV ) + tmp = sc.linalg.cho_solve( factYBY, gramYBV ) blockVectorV -= sc.dot( blockVectorY, tmp ) @@ -91,8 +90,8 @@ else: blockVectorBV = blockVectorV # Shared data!!! gramVBV = sc.dot( blockVectorV.T, blockVectorBV ) - gramVBV = la.cholesky( gramVBV ) - la.inv( gramVBV, overwrite_a = True ) + gramVBV = sc.linalg.cholesky( gramVBV ) + sc.linalg.inv( gramVBV, overwrite_a = True ) # gramVBV is now R^{-1}. blockVectorV = sc.dot( blockVectorV, gramVBV ) if B is not None: @@ -249,7 +248,7 @@ gramYBY = sc.dot( blockVectorY.T, blockVectorBY ) try: # gramYBY is a Cholesky factor from now on... - gramYBY = la.cho_factor( gramYBY ) + gramYBY = sc.linalg.cho_factor( gramYBY ) except: raise ValueError('cannot handle linearly dependent constraints') @@ -381,7 +380,7 @@ gramA = nm.bmat( [[nm.diag( _lambda ), xaw], [ xaw.T, waw]] ) gramB = nm.bmat( [[ident0, xbw], - [ xbw.T, ident0]] ) + [ xbw.T, ident]] ) try: assert nm.allclose( gramA.T, gramA ) From scipy-svn at scipy.org Tue Apr 1 21:41:18 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 20:41:18 -0500 (CDT) Subject: [Scipy-svn] r4068 - trunk/scipy/ndimage/src/segment Message-ID: <20080402014118.A572739C175@new.scipy.org> Author: tom.waite Date: 2008-04-01 20:41:14 -0500 (Tue, 01 Apr 2008) New Revision: 4068 Modified: trunk/scipy/ndimage/src/segment/ndImage_Segmenter_structs.h Log: additional 3D processing Modified: trunk/scipy/ndimage/src/segment/ndImage_Segmenter_structs.h =================================================================== --- trunk/scipy/ndimage/src/segment/ndImage_Segmenter_structs.h 2008-04-02 01:36:54 UTC (rev 4067) +++ trunk/scipy/ndimage/src/segment/ndImage_Segmenter_structs.h 2008-04-02 01:41:14 UTC (rev 4068) @@ -13,14 +13,17 @@ typedef struct{ // filled in GetObjectStats - int L; - int R; - int T; - int B; + int Left; + int Right; + int Top; + int Bottom; + int Front; + int Back; int Label; - int Area; + int Mass; float cX; float cY; + float cZ; }objStruct; #endif From scipy-svn at scipy.org Tue Apr 1 21:41:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 20:41:46 -0500 (CDT) Subject: [Scipy-svn] r4069 - trunk/scipy/ndimage/src/segment Message-ID: <20080402014146.A506439C175@new.scipy.org> Author: tom.waite Date: 2008-04-01 20:41:42 -0500 (Tue, 01 Apr 2008) New Revision: 4069 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: additional 3D processing Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-02 01:41:14 UTC (rev 4068) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-02 01:41:42 UTC (rev 4069) @@ -218,8 +218,15 @@ /* need to pass in 2D/3D flag and mask. NI_GetBlobRegions will call * 2D or 3D blob_extraction */ - if(!NI_GetBlobRegions((int)dims[0], (int)dims[1], (int)objNumber[0], fP1, myData)) - goto exit; + if(nd == 2){ + if(!NI_GetBlobRegions2D((int)dims[0], (int)dims[1], (int)objNumber[0], fP1, myData)) + goto exit; + } + else if(nd == 3){ + if(!NI_GetBlobRegions3D((int)dims[0], (int)dims[1], (int)dims[2], + (int)objNumber[0], fP1, myData)) + goto exit; + } exit: From scipy-svn at scipy.org Tue Apr 1 21:42:06 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 20:42:06 -0500 (CDT) Subject: [Scipy-svn] r4070 - trunk/scipy/ndimage/src/segment Message-ID: <20080402014206.2C0DE39C175@new.scipy.org> Author: tom.waite Date: 2008-04-01 20:41:57 -0500 (Tue, 01 Apr 2008) New Revision: 4070 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: additional 3D processing Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-02 01:41:42 UTC (rev 4069) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-02 01:41:57 UTC (rev 4070) @@ -662,22 +662,92 @@ } -int NI_GetBlobRegions(int rows, int cols, int numberObjects, unsigned short *labeledEdges, - objStruct objectMetrics[]){ +int NI_GetBlobRegions3D(int layers, int rows, int cols, int numberObjects, + unsigned short *labeledEdges, objStruct objectMetrics[]){ - int i, j, k, m; + + int status; + int i, j, k, l, m; int offset; int count; int LowX; int LowY; + int LowZ; int HighX; int HighY; + int HighZ; + int ptr; + float centerX; + float centerY; + float centerZ; + + for(k = l; l < numberObjects; ++l){ + offset = cols; + LowX = 32767; + LowY = 32767; + LowZ = 32767; + HighX = 0; + HighY = 0; + HighZ = 0; + count = 0; + centerX = (float)0.0; + centerY = (float)0.0; + centerZ = (float)0.0; + ptr = 0; + for(i = 0; i < layers; ++i){ + for(j = 0; j < rows; ++j){ + for(k = 0; k < cols; ++k){ + m = labeledEdges[ptr++]; + if(l == m){ + if(i < LowZ) LowZ = i; + if(j < LowY) LowY = j; + if(k < LowX) LowX = k; + if(i > HighZ) HighZ = i; + if(j > HighY) HighY = j; + if(k > HighX) HighX = k; + centerX += (float)k; + centerY += (float)j; + centerZ += (float)i; + ++count; + } + } + } + } + /* the bounding box for the 2D blob */ + objectMetrics[l-1].Left = LowX; + objectMetrics[l-1].Right = HighX; + objectMetrics[l-1].Bottom = LowY; + objectMetrics[l-1].Top = HighY; + objectMetrics[l-1].Front = LowZ; + objectMetrics[l-1].Back = HighZ; + objectMetrics[l-1].Mass = count; + objectMetrics[l-1].cX = centerX/(float)count; + objectMetrics[l-1].cY = centerY/(float)count; + objectMetrics[l-1].cZ = centerZ/(float)count; + objectMetrics[l-1].Label = l; + } + + status = numberObjects; + + return(status); + +} + +int NI_GetBlobRegions2D(int rows, int cols, int numberObjects, unsigned short *labeledEdges, + objStruct objectMetrics[]){ + + int i, j, k, m; + int count; + int LowX; + int LowY; + int HighX; + int HighY; int status; + int ptr; float centerX; float centerY; for(k = 1; k < numberObjects; ++k){ - offset = cols; LowX = 32767; LowY = 32767; HighX = 0; @@ -685,9 +755,10 @@ count = 0; centerX = (float)0.0; centerY = (float)0.0; - for(i = 1; i < (rows-1); ++i){ - for(j = 1; j < (cols-1); ++j){ - m = labeledEdges[offset+j]; + ptr = 0; + for(i = 0; i < rows; ++i){ + for(j = 0; j < cols; ++j){ + m = labeledEdges[ptr++]; if(k == m){ if(i < LowY) LowY = i; if(j < LowX) LowX = j; @@ -698,17 +769,16 @@ ++count; } } - offset += cols; } /* the bounding box for the 2D blob */ - objectMetrics[k-1].L = LowX; - objectMetrics[k-1].R = HighX; - objectMetrics[k-1].B = LowY; - objectMetrics[k-1].T = HighY; - objectMetrics[k-1].Area = count; - objectMetrics[k-1].cX = centerX/(float)count; - objectMetrics[k-1].cY = centerY/(float)count; - objectMetrics[k-1].Label = k; + objectMetrics[k-1].Left = LowX; + objectMetrics[k-1].Right = HighX; + objectMetrics[k-1].Bottom = LowY; + objectMetrics[k-1].Top = HighY; + objectMetrics[k-1].Mass = count; + objectMetrics[k-1].cX = centerX/(float)count; + objectMetrics[k-1].cY = centerY/(float)count; + objectMetrics[k-1].Label = k; } status = numberObjects; From scipy-svn at scipy.org Tue Apr 1 21:42:24 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 1 Apr 2008 20:42:24 -0500 (CDT) Subject: [Scipy-svn] r4071 - trunk/scipy/ndimage Message-ID: <20080402014224.A8A7539C175@new.scipy.org> Author: tom.waite Date: 2008-04-01 20:42:22 -0500 (Tue, 01 Apr 2008) New Revision: 4071 Modified: trunk/scipy/ndimage/_segmenter.py Log: additional 3D processing Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-02 01:41:57 UTC (rev 4070) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-02 01:42:22 UTC (rev 4071) @@ -2,23 +2,17 @@ import numpy as NP import scipy.ndimage._segment as S -_objstruct = NP.dtype([('L', 'i'), - ('R', 'i'), - ('T', 'i'), - ('B', 'i'), +_objstruct = NP.dtype([('Left', 'i'), + ('Right', 'i'), + ('Top', 'i'), + ('Bottom', 'i'), + ('Front', 'i'), + ('Back', 'i'), ('Label', 'i'), - ('Area', 'i'), + ('Mass', 'i'), ('cX', 'f'), ('cY', 'f'), - ('curveClose', 'i'), - ('cXB', 'f'), - ('cYB', 'f'), - ('bLength', 'f'), - ('minRadius', 'f'), - ('maxRadius', 'f'), - ('aveRadius', 'f'), - ('ratio', 'f'), - ('compactness', 'f'), + ('cZ', 'f'), ('voxelMean', 'f'), ('voxelVar', 'f'), ('TEM', 'f', 21)] @@ -186,10 +180,10 @@ if ROI==None: ROIList = NP.zeros(1, dtype=_objstruct) [rows, cols] = label_image.shape - ROIList['L'] = 2 - ROIList['R'] = cols-3 - ROIList['B'] = 2 - ROIList['T'] = rows-3 + ROIList['Left'] = 2 + ROIList['Right'] = cols-3 + ROIList['Bottom'] = 2 + ROIList['Top'] = rows-3 [rows, cols] = label_image.shape # destination image @@ -207,10 +201,10 @@ indices = range(0, number_regions) inflate = 1 for i in indices: - left = ROI[i]['L']-1 - right = ROI[i]['R']+1 - bottom = ROI[i]['B']-1 - top = ROI[i]['T']+1 + left = ROI[i]['Left']-1 + right = ROI[i]['Right']+1 + bottom = ROI[i]['Bottom']-1 + top = ROI[i]['Top']+1 Label = ROI[i]['Label'] if left < 0: left = 0 @@ -296,10 +290,10 @@ if ROI==None: ROI= NP.zeros(1, dtype=_objstruct) [rows, cols] = label_image.shape - ROI['L'] = 2 - ROI['R'] = cols-3 - ROI['B'] = 2 - ROI['T'] = rows-3 + ROI['Left'] = 2 + ROI['Right'] = cols-3 + ROI['Bottom'] = 2 + ROI['Top'] = rows-3 laws_image_list = {} number_regions = ROI.size @@ -378,28 +372,56 @@ none """ + + dimensions = label_image.ndim + if ROI==None: ROIList = NP.zeros(1, dtype=_objstruct) - [rows, cols] = label_image.shape - ROIList['L'] = 2 - ROIList['R'] = cols-3 - ROIList['B'] = 2 - ROIList['T'] = rows-3 + if dimensions == 2: + [rows, cols] = label_image.shape + ROIList['Left'] = 1 + ROIList['Right'] = cols-1 + ROIList['Bottom'] = 1 + ROIList['Top'] = rows-1 + elif dimensions == 3: + [layers, rows, cols] = label_image.shape + ROIList['Left'] = 1 + ROIList['Right'] = cols-1 + ROIList['Bottom'] = 1 + ROIList['Top'] = rows-1 + ROIList['Front'] = 1 + ROIList['Back'] = layers-1 number_regions = ROI.size indices = range(0, number_regions) inflate = 1 for i in indices: - left = ROI[i]['L'] - right = ROI[i]['R'] - bottom = ROI[i]['B'] - top = ROI[i]['T'] - Label = ROI[i]['Label'] - rows = top-bottom-1 - cols = right-left-1 - section= NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) - section = raw_image[bottom:top, left:right] \ - [label_image[bottom:top, left:right]==Label] + if dimensions == 2: + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + Label = ROI[i]['Label'] + rows = top-bottom-1 + cols = right-left-1 + section= NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) + section = raw_image[bottom:top, left:right] \ + [label_image[bottom:top, left:right]==Label] + elif dimensions == 3: + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + front = ROI[i]['Front'] + back = ROI[i]['Back'] + Label = ROI[i]['Label'] + rows = top-bottom-1 + cols = right-left-1 + layers = back-front-1 + section= NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) + section = raw_image[front:back, bottom:top, left:right] \ + [label_image[front:back, bottom:top, left:right]==Label] + mask = section[section>0] ROI[i]['voxelMean'] = mask.mean() ROI[i]['voxelVar'] = mask.std() @@ -419,7 +441,7 @@ ---------- label_image : {nd_array} - an image with labeled regions from get_blobs() method + a 2D or 3D image with labeled regions from get_blobs() method groups : {int} number of blobs in image determined by get_blobs() method @@ -434,14 +456,17 @@ """ - _c_ext_struct = NP.dtype([('L', 'i'), - ('R', 'i'), - ('T', 'i'), - ('B', 'i'), + _c_ext_struct = NP.dtype([('Left', 'i'), + ('Right', 'i'), + ('Top', 'i'), + ('Bottom', 'i'), + ('Front', 'i'), + ('Back', 'i'), ('Label', 'i'), - ('Area', 'i'), + ('Mass', 'i'), ('cX', 'f'), - ('cY', 'f')] + ('cY', 'f'), + ('cZ', 'f')] ) c_ext_ROI = NP.zeros(groups, dtype=_c_ext_struct) @@ -451,16 +476,19 @@ indices = range(0, groups) for i in indices: - ROIList[i]['L'] = c_ext_ROI[i]['L'] - ROIList[i]['R'] = c_ext_ROI[i]['R'] - ROIList[i]['B'] = c_ext_ROI[i]['B'] - ROIList[i]['T'] = c_ext_ROI[i]['T'] - ROIList[i]['Label'] = c_ext_ROI[i]['Label'] - ROIList[i]['Area'] = c_ext_ROI[i]['Area'] - ROIList[i]['cX'] = c_ext_ROI[i]['cX'] - ROIList[i]['cY'] = c_ext_ROI[i]['cY'] + ROIList[i]['Left'] = c_ext_ROI[i]['Left'] + ROIList[i]['Right'] = c_ext_ROI[i]['Right'] + ROIList[i]['Bottom'] = c_ext_ROI[i]['Bottom'] + ROIList[i]['Top'] = c_ext_ROI[i]['Top'] + ROIList[i]['Front'] = c_ext_ROI[i]['Front'] + ROIList[i]['Back'] = c_ext_ROI[i]['Back'] + ROIList[i]['Label'] = c_ext_ROI[i]['Label'] + ROIList[i]['Mass'] = c_ext_ROI[i]['Mass'] + ROIList[i]['cX'] = c_ext_ROI[i]['cX'] + ROIList[i]['cY'] = c_ext_ROI[i]['cY'] + ROIList[i]['cZ'] = c_ext_ROI[i]['cZ'] - return ROIList[ROIList['Area']>dust] + return ROIList[ROIList['Mass']>dust] def get_blobs(binary_edge_image, mask=1): @@ -692,10 +720,10 @@ ('bottom', 'i')]) measures = NP.zeros(number, dtype=_shortstruct) for i in indices: - measures[i]['left'] = ROI[i]['L'] - measures[i]['right'] = ROI[i]['R'] - measures[i]['top'] = ROI[i]['T'] - measures[i]['bottom'] = ROI[i]['B'] + measures[i]['left'] = ROI[i]['Left'] + measures[i]['right'] = ROI[i]['Right'] + measures[i]['top'] = ROI[i]['Top'] + measures[i]['bottom'] = ROI[i]['Bottom'] return measures From scipy-svn at scipy.org Wed Apr 2 21:08:33 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 2 Apr 2008 20:08:33 -0500 (CDT) Subject: [Scipy-svn] r4072 - trunk/scipy/ndimage/src/segment Message-ID: <20080403010833.C8D1A39C1EB@new.scipy.org> Author: tom.waite Date: 2008-04-02 20:08:30 -0500 (Wed, 02 Apr 2008) New Revision: 4072 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: added binary edge filter Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-02 01:42:22 UTC (rev 4071) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-03 01:08:30 UTC (rev 4072) @@ -429,7 +429,40 @@ } +static PyObject *Segmenter_BinaryEdge(PyObject *self, PyObject *args) +{ + int num; + int nd; + int type; + npy_intp *dims; + unsigned short *mask_image; + unsigned short *edge_image; + PyObject *mArray = NULL; + PyObject *eArray = NULL; + + if(!PyArg_ParseTuple(args, "OO", &mArray, &eArray)) + goto exit; + + mask_image = (unsigned short *)PyArray_DATA(mArray); + nd = PyArray_NDIM(mArray); + dims = PyArray_DIMS(mArray); + type = PyArray_TYPE(mArray); + num = PyArray_SIZE(mArray); + edge_image = (unsigned short *)PyArray_DATA(eArray); + + if(!PyArray_ISCONTIGUOUS(mArray)) + goto exit; + + if(!NI_BinaryEdge(num, (int)dims[0], (int)dims[1], mask_image, edge_image)) + goto exit; + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + static PyObject *Segmenter_LawsTextureMetric(PyObject *self, PyObject *args) { @@ -513,6 +546,7 @@ static PyMethodDef SegmenterMethods[] = { + { "binary_edge", Segmenter_BinaryEdge, METH_VARARGS, NULL }, { "laws_texture_metric", Segmenter_LawsTextureMetric, METH_VARARGS, NULL }, { "canny_hysteresis", Segmenter_CannyHysteresis, METH_VARARGS, NULL }, { "canny_nonmax_supress", Segmenter_CannyNonMaxSupress, METH_VARARGS, NULL }, From scipy-svn at scipy.org Wed Apr 2 21:08:47 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 2 Apr 2008 20:08:47 -0500 (CDT) Subject: [Scipy-svn] r4073 - trunk/scipy/ndimage/src/segment Message-ID: <20080403010847.117A5C7C039@new.scipy.org> Author: tom.waite Date: 2008-04-02 20:08:45 -0500 (Wed, 02 Apr 2008) New Revision: 4073 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: added binary edge filter Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-03 01:08:30 UTC (rev 4072) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-03 01:08:45 UTC (rev 4073) @@ -145,8 +145,47 @@ } +int NI_BinaryEdge(int samples, int rows, int cols, unsigned short *labelImage, unsigned short *edgeImage){ + + int i, j, k; + int maxValue; + int offset; + int offsetM1; + int offsetP1; + int values3x3[8]; + int value; + int status; + + offset = cols; + for(i = 1; i < rows-1; ++i){ + offsetM1 = offset - cols; + offsetP1 = offset + cols; + for(j = 1; j < cols-1; ++j){ + values3x3[0] = labelImage[offset+j] - labelImage[offset+j+1]; + values3x3[1] = labelImage[offset+j] - labelImage[offsetM1+j+1]; + values3x3[2] = labelImage[offset+j] - labelImage[offsetM1+j]; + values3x3[3] = labelImage[offset+j] - labelImage[offsetM1+j-1]; + values3x3[4] = labelImage[offset+j] - labelImage[offset+j-1]; + values3x3[5] = labelImage[offset+j] - labelImage[offsetP1+j-1]; + values3x3[6] = labelImage[offset+j] - labelImage[offsetP1+j]; + values3x3[7] = labelImage[offset+j] - labelImage[offsetP1+j+1]; + maxValue = -1; + for(k = 0; k < 8; ++k){ + maxValue = MAX(maxValue, values3x3[k]); + } + edgeImage[offset+j] = maxValue; + } + offset += cols; + } + + status = 1; + + return(status); + +} + int NI_SobelEdge(int samples, int rows, int cols, double *edgeImage, unsigned short *edges, - int mode, double pAve, int minValue, int maxValue, double sobelLow){ + int mode, double pAve, int minValue, int maxValue, double sobelLow){ int i, j; int offset; From scipy-svn at scipy.org Wed Apr 2 21:09:07 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 2 Apr 2008 20:09:07 -0500 (CDT) Subject: [Scipy-svn] r4074 - trunk/scipy/ndimage Message-ID: <20080403010907.3C59739C1BB@new.scipy.org> Author: tom.waite Date: 2008-04-02 20:09:04 -0500 (Wed, 02 Apr 2008) New Revision: 4074 Modified: trunk/scipy/ndimage/_segmenter.py Log: added binary edge filter Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-03 01:08:45 UTC (rev 4073) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-03 01:09:04 UTC (rev 4074) @@ -150,6 +150,64 @@ return horz_DGFilter, vert_DGFilter, img_means +def binary_edge(label_image, ROI): + """ + binary_edge_image = binary_edge(label_image, ROI) + + takes the ROI dictionary with the blob bounding boxes and generates + the binary edge for each blob. The ROI mask is used to isolate + the binary edges for later use (e.g. contour tracing). + + Parameters + ---------- + + label_image : {nd_array} + an image with labeled regions from get_blobs() method + + ROI : {dictionary} + Region of Interest structure that has blob bounding boxes + + Returns + ---------- + + binary_edge_image : {nd_array} + edge image for each ROI combined into a single image + + """ + + [rows, cols] = label_image.shape + binary_edge_image = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) + number_regions = ROI.size + indices = range(0, number_regions) + for i in indices: + left = ROI[i]['Left']-2 + right = ROI[i]['Right']+2 + bottom = ROI[i]['Bottom']-2 + top = ROI[i]['Top']+2 + Label = ROI[i]['Label'] + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 + + roi_rows = top-bottom + roi_cols = right-left + label_region = NP.zeros(roi_rows*roi_cols, dtype=NP.uint16).reshape(roi_rows, roi_cols) + input = NP.zeros(roi_rows*roi_cols, dtype=NP.uint16).reshape(roi_rows, roi_cols) + # load the labeled region + label_region[0:roi_rows, 0:roi_cols][label_image[bottom:top, left:right]==Label] = 1 + S.binary_edge(label_region, input) + input[0:roi_rows,0:roi_cols][input[0:roi_rows,0:roi_cols]==1] = Label + binary_edge_image[bottom:top,left:right] = binary_edge_image[bottom:top,left:right] + \ + input[0:roi_rows,0:roi_cols] + + return binary_edge_image + + def mat_filter(label_image, thin_kernel, ROI=None): """ mat_image = mat_filter(label_image, thin_kernel, ROI=None) @@ -241,14 +299,14 @@ return mat_image -def texture_filter(raw_image, label_image, laws_kernel, ROI=None, dc_thres=1.0, - mean_feature=1, verbose=0): +def laws_texture_filter(raw_image, label_image, laws_kernel, ROI=None, dc_thres=1.0, + mean_feature=1, verbose=0): """ - texture_images = texture_filter(raw_image, label_image, laws_kernel, ROI=None, verbose=1) + texture_images = laws_texture_filter(raw_image, label_image, laws_kernel, ROI=None, verbose=1) . OR . - texture_filter(raw_image, label_image, laws_kernel, ROI=None, verbose=0) + laws_texture_filter(raw_image, label_image, laws_kernel, ROI=None, verbose=0) Parameters ---------- @@ -301,10 +359,10 @@ indices = range(0, number_regions) filters = range(0, layers) for i in indices: - left = ROI[i]['L'] - right = ROI[i]['R'] - bottom = ROI[i]['B'] - top = ROI[i]['T'] + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] Label = ROI[i]['Label'] rows = top-bottom cols = right-left From scipy-svn at scipy.org Wed Apr 2 21:17:40 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 2 Apr 2008 20:17:40 -0500 (CDT) Subject: [Scipy-svn] r4075 - trunk/scipy/ndimage/tests Message-ID: <20080403011740.6CF3D39C1EB@new.scipy.org> Author: tom.waite Date: 2008-04-02 20:17:38 -0500 (Wed, 02 Apr 2008) New Revision: 4075 Modified: trunk/scipy/ndimage/tests/test_segment.py Log: function name changes for testing Modified: trunk/scipy/ndimage/tests/test_segment.py =================================================================== --- trunk/scipy/ndimage/tests/test_segment.py 2008-04-03 01:09:04 UTC (rev 4074) +++ trunk/scipy/ndimage/tests/test_segment.py 2008-04-03 01:17:38 UTC (rev 4075) @@ -42,8 +42,8 @@ disc_ROI = seg.get_blob_regions(label_disc_mask, disc_mask_groups) laws_kernel = seg.build_laws_kernel() impulse = seg.build_test_impulses() - calib = seg.texture_filter(impulse, label_disc_mask, laws_kernel, - ROI=disc_ROI, verbose=1) + calib = seg.laws_texture_filter(impulse, label_disc_mask, laws_kernel, + ROI=disc_ROI, verbose=1) kernels = calib[0] x = laws_kernel['coefficients'][0] m = NP.outer(x, x) @@ -62,8 +62,8 @@ disc_ROI = seg.get_blob_regions(label_disc_mask, disc_mask_groups) laws_kernel = seg.build_laws_kernel() texture_img = seg.build_test_texture_discs() - seg.texture_filter(texture_img, label_disc_mask, laws_kernel, ROI=disc_ROI, - mean_feature=1, verbose=0) + seg.laws_texture_filter(texture_img, label_disc_mask, laws_kernel, ROI=disc_ROI, + mean_feature=1, verbose=0) tem = disc_ROI['TEM'] return tem From scipy-svn at scipy.org Thu Apr 3 03:18:25 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 3 Apr 2008 02:18:25 -0500 (CDT) Subject: [Scipy-svn] r4076 - trunk/scipy/signal/tests Message-ID: <20080403071825.267C039C05D@new.scipy.org> Author: stefan Date: 2008-04-03 02:18:15 -0500 (Thu, 03 Apr 2008) New Revision: 4076 Modified: trunk/scipy/signal/tests/test_wavelets.py Log: Add tests for Morlet wavelet [contributed by Christoph Weidemann]. Modified: trunk/scipy/signal/tests/test_wavelets.py =================================================================== --- trunk/scipy/signal/tests/test_wavelets.py 2008-04-03 01:17:38 UTC (rev 4075) +++ trunk/scipy/signal/tests/test_wavelets.py 2008-04-03 07:18:15 UTC (rev 4076) @@ -24,11 +24,56 @@ def test_morlet(self): x = wavelets.morlet(50,4.1,complete=True) y = wavelets.morlet(50,4.1,complete=False) + # Test if complete and incomplete wavelet have same lengths: assert_equal(len(x),len(y)) + # Test if complete wavelet is less than incomplete wavelet: + assert_array_less(x,y) x = wavelets.morlet(10,50,complete=False) y = wavelets.morlet(10,50,complete=True) + # For large widths complete and incomplete wavelets should be + # identical within numerical precision: assert_equal(x,y) + # miscellaneous tests: + x = N.array([1.73752399e-09 +9.84327394e-25j, + 6.49471756e-01 +0.00000000e+00j, + 1.73752399e-09 -9.84327394e-25j]) + y = wavelets.morlet(3,w=2,complete=True) + assert_array_almost_equal(x,y) + + x = N.array([2.00947715e-09 +9.84327394e-25j, + 7.51125544e-01 +0.00000000e+00j, + 2.00947715e-09 -9.84327394e-25j]) + y = wavelets.morlet(3,w=2,complete=False) + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,s=4,complete=True) + y = wavelets.morlet(20000,s=8,complete=True)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,s=4,complete=False) + assert_array_almost_equal(y,x,decimal=2) + y = wavelets.morlet(20000,s=8,complete=False)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,w=3,s=5,complete=True) + y = wavelets.morlet(20000,w=3,s=10,complete=True)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,w=3,s=5,complete=False) + assert_array_almost_equal(y,x,decimal=2) + y = wavelets.morlet(20000,w=3,s=10,complete=False)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,w=7,s=10,complete=True) + y = wavelets.morlet(20000,w=7,s=20,complete=True)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + + x = wavelets.morlet(10000,w=7,s=10,complete=False) + assert_array_almost_equal(x,y,decimal=2) + y = wavelets.morlet(20000,w=7,s=20,complete=False)[5000:15000] + assert_array_almost_equal(x,y,decimal=2) + if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Thu Apr 3 11:13:36 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 3 Apr 2008 10:13:36 -0500 (CDT) Subject: [Scipy-svn] r4077 - trunk/scipy/sandbox Message-ID: <20080403151336.DA0DD39C06C@new.scipy.org> Author: wnbell Date: 2008-04-03 10:13:35 -0500 (Thu, 03 Apr 2008) New Revision: 4077 Removed: trunk/scipy/sandbox/lobpcg/ Log: removed lobpcg from the sandbox lobpcg now lives in scipy.sparse.linalg From scipy-svn at scipy.org Thu Apr 3 14:28:49 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 3 Apr 2008 13:28:49 -0500 (CDT) Subject: [Scipy-svn] r4078 - in trunk/scipy/cluster: . tests Message-ID: <20080403182849.AD3DE39C035@new.scipy.org> Author: cdavid Date: 2008-04-03 13:28:44 -0500 (Thu, 03 Apr 2008) New Revision: 4078 Modified: trunk/scipy/cluster/tests/test_vq.py trunk/scipy/cluster/vq.py Log: Handle data of rank 1 for random init in kmean2 Modified: trunk/scipy/cluster/tests/test_vq.py =================================================================== --- trunk/scipy/cluster/tests/test_vq.py 2008-04-03 15:13:35 UTC (rev 4077) +++ trunk/scipy/cluster/tests/test_vq.py 2008-04-03 18:28:44 UTC (rev 4078) @@ -131,6 +131,14 @@ code1 = kmeans2(data1, code, iter = 1)[0] code2 = kmeans2(data1, code, iter = 2)[0] + def test_kmeans2_rank1_2(self): + """Testing simple call to kmeans2 with rank 1 data.""" + data = N.fromfile(open(DATAFILE1), sep = ", ") + data = data.reshape((200, 2)) + data1 = data[:, 0] + + code1 = kmeans2(data1, 2, iter = 1) + def test_kmeans2_init(self): """Testing that kmeans2 init methods work.""" data = N.fromfile(open(DATAFILE1), sep = ", ") Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-03 15:13:35 UTC (rev 4077) +++ trunk/scipy/cluster/vq.py 2008-04-03 18:28:44 UTC (rev 4078) @@ -460,15 +460,28 @@ Number of samples to generate. """ - mu = N.mean(data, 0) - cov = N.atleast_2d(N.cov(data, rowvar = 0)) + def init_rank1(data): + mu = N.mean(data) + cov = N.cov(data) + x = N.random.randn(k) + x *= N.sqrt(cov) + x += mu + return x + def init_rankn(data): + mu = N.mean(data, 0) + cov = N.atleast_2d(N.cov(data, rowvar = 0)) - # k rows, d cols (one row = one obs) - # Generate k sample of a random variable ~ Gaussian(mu, cov) - x = N.random.randn(k, mu.size) - x = N.dot(x, N.linalg.cholesky(cov).T) + mu + # k rows, d cols (one row = one obs) + # Generate k sample of a random variable ~ Gaussian(mu, cov) + x = N.random.randn(k, mu.size) + x = N.dot(x, N.linalg.cholesky(cov).T) + mu + return x - return x + nd = N.ndim(data) + if nd == 1: + return init_rank1(data) + else: + return init_rankn(data) _valid_init_meth = {'random': _krandinit, 'points': _kpoints} From scipy-svn at scipy.org Thu Apr 3 21:01:58 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 3 Apr 2008 20:01:58 -0500 (CDT) Subject: [Scipy-svn] r4079 - trunk/scipy/ndimage/src/segment Message-ID: <20080404010158.9CDDA39C127@new.scipy.org> Author: tom.waite Date: 2008-04-03 20:01:55 -0500 (Thu, 03 Apr 2008) New Revision: 4079 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: Enhancements and bug fix to 3D blob extract. Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-03 18:28:44 UTC (rev 4078) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-04 01:01:55 UTC (rev 4079) @@ -496,6 +496,8 @@ } } + *groups = Label; + ptr = 0; for(i = 0; i < layers; ++i){ for(j = 0; j < rows; ++j){ @@ -720,7 +722,7 @@ float centerY; float centerZ; - for(k = l; l < numberObjects; ++l){ + for(l = 1; l < numberObjects; ++l){ offset = cols; LowX = 32767; LowY = 32767; From scipy-svn at scipy.org Thu Apr 3 21:02:22 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 3 Apr 2008 20:02:22 -0500 (CDT) Subject: [Scipy-svn] r4080 - trunk/scipy/ndimage Message-ID: <20080404010222.E939A39C127@new.scipy.org> Author: tom.waite Date: 2008-04-03 20:02:20 -0500 (Thu, 03 Apr 2008) New Revision: 4080 Modified: trunk/scipy/ndimage/_segmenter.py Log: Enhancements and bug fix to 3D blob extract. Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-04 01:01:55 UTC (rev 4079) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-04 01:02:20 UTC (rev 4080) @@ -208,6 +208,85 @@ return binary_edge_image +def roi_mat_filter(label_image, thin_kernel, ROI): + """ + thin_edge_image = roi_mat_filter(label_image, thin_kernel, ROI) + + gets the largest object in the ROI list and returns the medial axis for + that object. Idea is that the largest object is a reference, e.g. the skull + for anatomical MRI. + + Parameters + ---------- + + label_image : {nd_array} + an image with labeled regions from get_blobs() method + + thin_kernel : {dictionary} + set of 8 'J' and 'K' 3x3 masks from build_morpho_thin_masks() method + + ROI : {dictionary} + Region of Interest structure that has blob bounding boxes. The largest + 2D target bounding box is extracted. + + Returns + ---------- + + thin_edge_image : {nd_array} + thinned edge image for the largest object. + + """ + + + [rows, cols] = label_image.shape + # destination image + thin_edge_image = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) + # scratch memory for thin + input = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + cinput = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + erosion = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + dialation = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + hmt = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + copy = NP.zeros(rows*cols, dtype=NP.uint8).reshape(rows, cols) + + bbox = get_max_bounding_box(ROI) + + left = bbox['Left']-1 + right = bbox['Right']+1 + bottom = bbox['Bottom']-1 + top = bbox['Top']+1 + Label = bbox['Label'] + + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 + + inflate = 1 + roi_rows = top-bottom+2*inflate + roi_cols = right-left+2*inflate + rgrows = top-bottom + rgcols = right-left + # clear the memory + input[0:roi_rows, 0:roi_cols] = 0 + # load the labeled region + input[inflate:inflate+rgrows, inflate:inflate+rgcols] \ + [label_image[bottom:top, left:right]==Label] = 1 + # thin this region + S.thin_filter(thin_kernel['jmask'], thin_kernel['kmask'], thin_kernel['number3x3Masks'], + roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) + + # accumulate the images (do not over-write). for overlapping regions + input[inflate:rgrows+inflate,inflate:rgcols+inflate] \ + [input[inflate:rgrows+inflate,inflate:rgcols+inflate]==1] = Label + thin_edge_image[bottom:top,left:right] = input[inflate:rgrows+inflate,inflate:rgcols+inflate] + + return thin_edge_image + def mat_filter(label_image, thin_kernel, ROI=None): """ mat_image = mat_filter(label_image, thin_kernel, ROI=None) @@ -284,7 +363,7 @@ [label_image[bottom:top, left:right]==Label] = 1 # thin this region S.thin_filter(thin_kernel['jmask'], thin_kernel['kmask'], thin_kernel['number3x3Masks'], - roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy); + roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) # accumulate the images (do not over-write). for overlapping regions input[inflate:rgrows+inflate,inflate:rgcols+inflate] \ @@ -595,7 +674,6 @@ groups = 0 return labeled_edge_image_or_vol, groups - groups = S.get_blobs(binary_edge_image, labeled_edge_image_or_vol, mask) return labeled_edge_image_or_vol, groups @@ -740,12 +818,13 @@ ---------- bounding_box : {dictionary} - the Left, Right, Top and Bottom of the LARGEST bounding box in the ROI + the Left, Right, Top Bottom and Label of the LARGEST bounding box in the ROI """ - max_index = ROI[:]['Area'].argmax() - bounding_box = {'left' : ROI[max_index]['L'], 'right' : ROI[max_index]['R'], - 'top' : ROI[max_index]['T'], 'bottom' : ROI[max_index]['B']} + max_index = ROI[:]['Mass'].argmax() + bounding_box = {'Left' : ROI[max_index]['Left'], 'Right' : ROI[max_index]['Right'], + 'Top' : ROI[max_index]['Top'], 'Bottom' : ROI[max_index]['Bottom'], + 'Label' : ROI[max_index]['Label']} return bounding_box From scipy-svn at scipy.org Fri Apr 4 21:16:03 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 4 Apr 2008 20:16:03 -0500 (CDT) Subject: [Scipy-svn] r4081 - trunk/scipy/ndimage/src/segment Message-ID: <20080405011603.0C3DB39C06B@new.scipy.org> Author: tom.waite Date: 2008-04-04 20:16:00 -0500 (Fri, 04 Apr 2008) New Revision: 4081 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: begin co-occurence texture measures. Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-04 01:02:20 UTC (rev 4080) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-05 01:16:00 UTC (rev 4081) @@ -543,9 +543,48 @@ } +static PyObject *Segmenter_RoiCoOccurence(PyObject *self, PyObject *args) +{ + int num; + int nd; + int type; + int distance; + npy_intp *dims; + npy_intp *dims_coc; + unsigned short *mask_image; + unsigned short *raw_image; + int *coc_matrix; + PyObject *mArray = NULL; + PyObject *rArray = NULL; + PyObject *cArray = NULL; + if(!PyArg_ParseTuple(args, "OOOi", &mArray, &rArray, &cArray, &distance)) + goto exit; + + mask_image = (unsigned short *)PyArray_DATA(mArray); + nd = PyArray_NDIM(mArray); + dims = PyArray_DIMS(mArray); + type = PyArray_TYPE(mArray); + num = PyArray_SIZE(mArray); + raw_image = (unsigned short *)PyArray_DATA(rArray); + coc_matrix = (int *)PyArray_DATA(cArray); + dims_coc = PyArray_DIMS(cArray); + + if(!NI_RoiCoOccurence(num, (int)dims[0], (int)dims[1], mask_image, raw_image, + coc_matrix, distance)) + goto exit; + + + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + static PyMethodDef SegmenterMethods[] = { + { "roi_co_occurence", Segmenter_RoiCoOccurence, METH_VARARGS, NULL }, { "binary_edge", Segmenter_BinaryEdge, METH_VARARGS, NULL }, { "laws_texture_metric", Segmenter_LawsTextureMetric, METH_VARARGS, NULL }, { "canny_hysteresis", Segmenter_CannyHysteresis, METH_VARARGS, NULL }, From scipy-svn at scipy.org Fri Apr 4 21:16:17 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 4 Apr 2008 20:16:17 -0500 (CDT) Subject: [Scipy-svn] r4082 - trunk/scipy/ndimage/src/segment Message-ID: <20080405011617.3A4B939C08B@new.scipy.org> Author: tom.waite Date: 2008-04-04 20:16:15 -0500 (Fri, 04 Apr 2008) New Revision: 4082 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: begin co-occurence texture measures. Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-05 01:16:00 UTC (rev 4081) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-05 01:16:15 UTC (rev 4082) @@ -1390,3 +1390,62 @@ } +int NI_RoiCoOccurence(int samples, int rows, int cols, unsigned short *labelImage, + unsigned short *rawImage, int *cocMatrix, int distance){ + + int i, j, k; + int offset; + int sum; + int d_row; + int status; + int mask; + int pixel; + int moffsets[4]; + int mask_values[4]; + int pixel_values[4]; + + /* built around 8 bit histograms */ + moffsets[0] = 0; + moffsets[1] = 256*256; + moffsets[2] = 2*256*256; + moffsets[3] = 3*256*256; + + offset = 0; + for(i = 0; i < rows-distance; ++i){ + for(j = distance; j < cols-distance; ++j){ + mask = labelImage[offset+j]; + if(mask){ + /* d rows away from current row */ + d_row = cols*distance; + pixel = rawImage[offset+j]; + mask_values[0] = labelImage[offset+j+distance]; + mask_values[1] = labelImage[offset+d_row+j-distance]; + mask_values[2] = labelImage[offset+d_row+j]; + mask_values[3] = labelImage[offset+d_row+j+distance]; + if((mask_values[0]+mask_values[1]+mask_values[2]+mask_values[3]) == 4){ + /* over the mask */ + pixel_values[0] = rawImage[offset+j+distance]; + pixel_values[1] = rawImage[offset+d_row+j-distance]; + pixel_values[2] = rawImage[offset+d_row+j]; + pixel_values[3] = rawImage[offset+d_row+j+distance]; + /* update the 4 2D joint histograms */ + ++cocMatrix[moffsets[0]+pixel_values[0]*256+pixel]; + ++cocMatrix[moffsets[0]+pixel_values[0]+pixel*256]; + ++cocMatrix[moffsets[1]+pixel_values[1]*256+pixel]; + ++cocMatrix[moffsets[1]+pixel_values[1]+pixel*256]; + ++cocMatrix[moffsets[2]+pixel_values[2]*256+pixel]; + ++cocMatrix[moffsets[2]+pixel_values[2]+pixel*256]; + ++cocMatrix[moffsets[3]+pixel_values[3]*256+pixel]; + ++cocMatrix[moffsets[3]+pixel_values[3]+pixel*256]; + } + } + } + offset += cols; + } + + status = 1; + + return(status); + +} + From scipy-svn at scipy.org Fri Apr 4 21:16:34 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 4 Apr 2008 20:16:34 -0500 (CDT) Subject: [Scipy-svn] r4083 - trunk/scipy/ndimage Message-ID: <20080405011634.AAFE439C0AA@new.scipy.org> Author: tom.waite Date: 2008-04-04 20:16:32 -0500 (Fri, 04 Apr 2008) New Revision: 4083 Modified: trunk/scipy/ndimage/_segmenter.py Log: begin co-occurence texture measures. Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-05 01:16:15 UTC (rev 4082) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-05 01:16:32 UTC (rev 4083) @@ -208,6 +208,78 @@ return binary_edge_image +def roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=0): + """ + roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=0) + + - OR - + + texture_arrays = roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=1) + + (N-S, E-W, NW-SE, NE-SW) computes the 4 directional co-occurence matrices and features. + In debug=1 will return the 4 joint histograms for each ROI. + + Parameters + ---------- + + label_image : {nd_array} + an image with labeled regions from get_blobs() method + + raw_image : {nd_array} + raw image from which texture features get extracted + + ROI : {dictionary} + Region of Interest structure that has blob bounding boxes. The largest + 2D target bounding box is extracted. + + + Returns + ---------- + + co_occurence_images : {dictionary} + contains 4 joint histogram images for each ROI + returned if verbose=1 + + """ + num_dirs = 4 + num_bits = 256 + + copy_image = raw_image.copy() + + number_regions = ROI.size + indices = range(0, number_regions) + co_occurence_image_list = {} + for i in indices: + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + Label = ROI[i]['Label'] + rows = top-bottom + cols = right-left + # copy the mask to section image + section = NP.zeros(rows*cols, dtype=label_image.dtype).reshape(rows, cols) + section[0:rows, 0:cols][label_image[bottom:top, left:right]==Label] = 1 + source_region = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + coc_block = NP.zeros(num_dirs*num_bits*num_bits, dtype=NP.int32).reshape(num_dirs, num_bits, num_bits) + source_region[0:rows, 0:cols] = copy_image[bottom:top, left:right] + # scale segment to 8 bits. this needs to be smarter (e.g. use integrated histogram method) + max_value = source_region.max() + min_value = source_region.min() + scale = 255.0 / (max_value-min_value) + image_roi = (scale*(source_region-min_value)).astype(NP.int16) + print 'section shape and max ', section.shape, section.max() + print 'image_roi shape and max ', image_roi.shape, image_roi.max() + # image_roi is short type + S.roi_co_occurence(section, image_roi, coc_block, distance) + co_occurence_image_list[i] = coc_block + + if verbose == 1: + return co_occurence_image_list + else: + return + + def roi_mat_filter(label_image, thin_kernel, ROI): """ thin_edge_image = roi_mat_filter(label_image, thin_kernel, ROI) From scipy-svn at scipy.org Sat Apr 5 14:16:20 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sat, 5 Apr 2008 13:16:20 -0500 (CDT) Subject: [Scipy-svn] r4084 - in trunk/scipy: integrate linalg sparse/linalg/dsolve Message-ID: <20080405181620.60A8339C0C1@new.scipy.org> Author: cdavid Date: 2008-04-05 13:16:14 -0500 (Sat, 05 Apr 2008) New Revision: 4084 Modified: trunk/scipy/integrate/SConstruct trunk/scipy/linalg/SConstruct trunk/scipy/sparse/linalg/dsolve/SConstruct Log: Use Clone instead of deprecated Copy in scons scripts. Modified: trunk/scipy/integrate/SConstruct =================================================================== --- trunk/scipy/integrate/SConstruct 2008-04-05 01:16:32 UTC (rev 4083) +++ trunk/scipy/integrate/SConstruct 2008-04-05 18:16:14 UTC (rev 4084) @@ -44,10 +44,10 @@ env.AppendUnique(LIBPATH = env['build_dir']) env.AppendUnique(LINKFLAGSEND = env['F77_LDFLAGS']) -quadenv = env.Copy() +quadenv = env.Clone() quadenv.Prepend(LIBS = ['quadpack', 'linpack_lite', 'mach']) -odenv = env.Copy() +odenv = env.Clone() odenv.Prepend(LIBS = ['odepack', 'linpack_lite', 'mach']) # Build _quadpack Modified: trunk/scipy/linalg/SConstruct =================================================================== --- trunk/scipy/linalg/SConstruct 2008-04-05 01:16:32 UTC (rev 4083) +++ trunk/scipy/linalg/SConstruct 2008-04-05 18:16:14 UTC (rev 4084) @@ -37,7 +37,7 @@ # # checks # env.AppendUnique(LIBPATH = [get_pythonlib_dir()]) -fenv = env.Copy() +fenv = env.Clone() #======================= # Starting Configuration @@ -156,7 +156,7 @@ #-------------- # Atlas version #-------------- -atlas_env = env.Copy() +atlas_env = env.Clone() if not IsATLAS(env, 'cblas'): atlas_env.AppendUnique(CPPDEFINES = "NO_ATLAS_INFO") atlas_env.NumpyPythonExtension('atlas_version', 'atlas_version.c') Modified: trunk/scipy/sparse/linalg/dsolve/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/dsolve/SConstruct 2008-04-05 01:16:32 UTC (rev 4083) +++ trunk/scipy/sparse/linalg/dsolve/SConstruct 2008-04-05 18:16:14 UTC (rev 4084) @@ -25,7 +25,7 @@ write_info(env) # Build superlu lib -superlu_env = env.Copy() +superlu_env = env.Clone() superlu_def = {} if sys.platform == 'win32': superlu_def['NO_TIMER'] = 1 @@ -36,7 +36,7 @@ superlu = superlu_env.NumpyStaticExtLibrary('superlu_src', source = superlu_src) # Build python extensions -pyenv = env.Copy() +pyenv = env.Clone() pyenv.Append(CPPPATH = [get_numpy_include_dirs(), env['src_dir']]) common_src = ['_superlu_utils.c', '_superluobject.c'] From scipy-svn at scipy.org Sun Apr 6 14:27:27 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 6 Apr 2008 13:27:27 -0500 (CDT) Subject: [Scipy-svn] r4085 - trunk/scipy/ndimage/src/segment Message-ID: <20080406182727.3256B39C039@new.scipy.org> Author: tom.waite Date: 2008-04-06 13:27:20 -0500 (Sun, 06 Apr 2008) New Revision: 4085 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: added co-occurence matrix feature vector Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-05 18:16:14 UTC (rev 4084) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-06 18:27:20 UTC (rev 4085) @@ -549,8 +549,9 @@ int nd; int type; int distance; + int orientation; npy_intp *dims; - npy_intp *dims_coc; + npy_intp *dims_cocm; unsigned short *mask_image; unsigned short *raw_image; int *coc_matrix; @@ -558,7 +559,7 @@ PyObject *rArray = NULL; PyObject *cArray = NULL; - if(!PyArg_ParseTuple(args, "OOOi", &mArray, &rArray, &cArray, &distance)) + if(!PyArg_ParseTuple(args, "OOOii", &mArray, &rArray, &cArray, &distance, &orientation)) goto exit; mask_image = (unsigned short *)PyArray_DATA(mArray); @@ -568,10 +569,10 @@ num = PyArray_SIZE(mArray); raw_image = (unsigned short *)PyArray_DATA(rArray); coc_matrix = (int *)PyArray_DATA(cArray); - dims_coc = PyArray_DIMS(cArray); + dims_cocm = PyArray_DIMS(cArray); if(!NI_RoiCoOccurence(num, (int)dims[0], (int)dims[1], mask_image, raw_image, - coc_matrix, distance)) + coc_matrix, distance, orientation)) goto exit; From scipy-svn at scipy.org Sun Apr 6 14:27:43 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 6 Apr 2008 13:27:43 -0500 (CDT) Subject: [Scipy-svn] r4086 - trunk/scipy/ndimage/src/segment Message-ID: <20080406182743.8F99939C039@new.scipy.org> Author: tom.waite Date: 2008-04-06 13:27:40 -0500 (Sun, 06 Apr 2008) New Revision: 4086 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: added co-occurence matrix feature vector Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-06 18:27:20 UTC (rev 4085) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-06 18:27:40 UTC (rev 4086) @@ -1391,52 +1391,72 @@ int NI_RoiCoOccurence(int samples, int rows, int cols, unsigned short *labelImage, - unsigned short *rawImage, int *cocMatrix, int distance){ + unsigned short *rawImage, int *cocMatrix, int distance, int orientation){ int i, j, k; int offset; int sum; int d_row; + int d_col; int status; + int start_row; + int stop_row; + int start_col; + int stop_col; int mask; int pixel; - int moffsets[4]; - int mask_values[4]; - int pixel_values[4]; + int d_mask_value; + int d_pixel_value; /* built around 8 bit histograms */ - moffsets[0] = 0; - moffsets[1] = 256*256; - moffsets[2] = 2*256*256; - moffsets[3] = 3*256*256; offset = 0; - for(i = 0; i < rows-distance; ++i){ - for(j = distance; j < cols-distance; ++j){ + if(orientation == 90){ + start_row = 0; + stop_row = rows; + start_col = 0; + stop_col = cols-distance; + d_row = 0; + d_col = distance; + } + else if(orientation == 180){ + start_row = 0; + stop_row = rows-distance; + start_col = 0; + stop_col = cols; + d_row = cols*distance; + d_col = 0; + } + else if(orientation == 45){ + start_row = 0; + stop_row = rows-distance; + start_col = distance; + stop_col = cols; + d_row = cols*distance; + d_col = -distance; + } + else if(orientation == 135){ + start_row = 0; + stop_row = rows-distance; + start_col = 0; + stop_col = cols-distance; + d_row = cols*distance; + d_col = distance; + } + + for(i = start_row; i < stop_row; ++i){ + for(j = start_col; j < stop_col; ++j){ mask = labelImage[offset+j]; if(mask){ /* d rows away from current row */ - d_row = cols*distance; pixel = rawImage[offset+j]; - mask_values[0] = labelImage[offset+j+distance]; - mask_values[1] = labelImage[offset+d_row+j-distance]; - mask_values[2] = labelImage[offset+d_row+j]; - mask_values[3] = labelImage[offset+d_row+j+distance]; - if((mask_values[0]+mask_values[1]+mask_values[2]+mask_values[3]) == 4){ + d_mask_value = labelImage[offset+d_row+j+d_col]; + if(d_mask_value){ /* over the mask */ - pixel_values[0] = rawImage[offset+j+distance]; - pixel_values[1] = rawImage[offset+d_row+j-distance]; - pixel_values[2] = rawImage[offset+d_row+j]; - pixel_values[3] = rawImage[offset+d_row+j+distance]; - /* update the 4 2D joint histograms */ - ++cocMatrix[moffsets[0]+pixel_values[0]*256+pixel]; - ++cocMatrix[moffsets[0]+pixel_values[0]+pixel*256]; - ++cocMatrix[moffsets[1]+pixel_values[1]*256+pixel]; - ++cocMatrix[moffsets[1]+pixel_values[1]+pixel*256]; - ++cocMatrix[moffsets[2]+pixel_values[2]*256+pixel]; - ++cocMatrix[moffsets[2]+pixel_values[2]+pixel*256]; - ++cocMatrix[moffsets[3]+pixel_values[3]*256+pixel]; - ++cocMatrix[moffsets[3]+pixel_values[3]+pixel*256]; + d_pixel_value = rawImage[offset+d_row+j+d_col]; + /* update the 2D joint histograms */ + ++cocMatrix[d_pixel_value*256+pixel]; + ++cocMatrix[d_pixel_value+pixel*256]; } } } From scipy-svn at scipy.org Sun Apr 6 14:28:08 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 6 Apr 2008 13:28:08 -0500 (CDT) Subject: [Scipy-svn] r4087 - trunk/scipy/ndimage Message-ID: <20080406182808.E17D039C039@new.scipy.org> Author: tom.waite Date: 2008-04-06 13:28:05 -0500 (Sun, 06 Apr 2008) New Revision: 4087 Modified: trunk/scipy/ndimage/_segmenter.py Log: added co-occurence matrix feature vector Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-06 18:27:40 UTC (rev 4086) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-06 18:28:05 UTC (rev 4087) @@ -15,6 +15,7 @@ ('cZ', 'f'), ('voxelMean', 'f'), ('voxelVar', 'f'), + ('COM', 'f', 6), ('TEM', 'f', 21)] ) @@ -208,16 +209,18 @@ return binary_edge_image -def roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=0): +def roi_co_occurence(label_image, raw_image, ROI, distance=2, orientation=90, verbose=0): """ - roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=0) + roi_co_occurence(label_image, raw_image, ROI, distance=2, orientation=90, verbose=0) - OR - texture_arrays = roi_co_occurence(label_image, raw_image, ROI, distance=2, verbose=1) - (N-S, E-W, NW-SE, NE-SW) computes the 4 directional co-occurence matrices and features. - In debug=1 will return the 4 joint histograms for each ROI. + (N-S, E-W, NW-SE, NE-SW) computes one of 4 directional co-occurence matrices and features. + In debug=1 will return the 4 joint histograms for each ROI. This is used to compute texture + features for a pre-segmented region. The seg_co_occurence() method will be used for texture- + based segmentation. Parameters ---------- @@ -228,6 +231,12 @@ raw_image : {nd_array} raw image from which texture features get extracted + distance : {int} + integer value of pixel offset in forming joint histogram. default value 2 + + orientation : {45, 90, 135, 180} + direction for pixel offet. + ROI : {dictionary} Region of Interest structure that has blob bounding boxes. The largest 2D target bounding box is extracted. @@ -241,11 +250,13 @@ returned if verbose=1 """ - num_dirs = 4 + + if orientation != 45 and orientation != 90 and orientation != 135 and orientation != 180: + orientation = 90 + + epsilon = 2.2e-16 num_bits = 256 - copy_image = raw_image.copy() - number_regions = ROI.size indices = range(0, number_regions) co_occurence_image_list = {} @@ -261,18 +272,37 @@ section = NP.zeros(rows*cols, dtype=label_image.dtype).reshape(rows, cols) section[0:rows, 0:cols][label_image[bottom:top, left:right]==Label] = 1 source_region = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) - coc_block = NP.zeros(num_dirs*num_bits*num_bits, dtype=NP.int32).reshape(num_dirs, num_bits, num_bits) + cocm_block = NP.zeros(num_bits*num_bits, dtype=NP.int32).reshape(num_bits, num_bits) source_region[0:rows, 0:cols] = copy_image[bottom:top, left:right] # scale segment to 8 bits. this needs to be smarter (e.g. use integrated histogram method) max_value = source_region.max() min_value = source_region.min() scale = 255.0 / (max_value-min_value) image_roi = (scale*(source_region-min_value)).astype(NP.int16) - print 'section shape and max ', section.shape, section.max() - print 'image_roi shape and max ', image_roi.shape, image_roi.max() # image_roi is short type - S.roi_co_occurence(section, image_roi, coc_block, distance) - co_occurence_image_list[i] = coc_block + S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) + co_occurence_image_list[i] = cocm_block + # normalize the joint histogram prior to feature extraction + joint_histogram = NP.zeros([num_bits, num_bits], dtype=NP.float64); + joint_histogram = cocm_block.astype(NP.float64) + joint_histogram = joint_histogram / joint_histogram.sum() + # to prevent log(0) + joint_histogram += epsilon + # compute the com features + energy = joint_histogram.std() + H = joint_histogram * NP.log(joint_histogram) + entropy = H.sum() + r, c = joint_histogram.shape + [a, b] = NP.mgrid[1:c+1, 1:r+1] + contrast = ((NP.square(a-b))*joint_histogram).sum() + d = 1.0 + NP.abs(a-b) + homogeneity = (joint_histogram / d).sum() + ROI[i]['COM'][0] = distance + ROI[i]['COM'][1] = orientation + ROI[i]['COM'][2] = energy + ROI[i]['COM'][3] = entropy + ROI[i]['COM'][4] = contrast + ROI[i]['COM'][5] = homogeneity if verbose == 1: return co_occurence_image_list From scipy-svn at scipy.org Mon Apr 7 14:05:53 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 13:05:53 -0500 (CDT) Subject: [Scipy-svn] r4088 - trunk/scipy/io Message-ID: <20080407180553.BEBC239C27E@new.scipy.org> Author: cdavid Date: 2008-04-07 13:05:47 -0500 (Mon, 07 Apr 2008) New Revision: 4088 Added: trunk/scipy/io/arff/ Log: Start integrating arff reader from scikits.learn to scipy.io. From scipy-svn at scipy.org Mon Apr 7 14:07:57 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 13:07:57 -0500 (CDT) Subject: [Scipy-svn] r4089 - trunk/scipy/io/arff Message-ID: <20080407180757.C2C5839C3A9@new.scipy.org> Author: cdavid Date: 2008-04-07 13:07:49 -0500 (Mon, 07 Apr 2008) New Revision: 4089 Added: trunk/scipy/io/arff/myfunctools.py trunk/scipy/io/arff/utils.py Log: Add implementation for functool.partial for python < 2.5 Added: trunk/scipy/io/arff/myfunctools.py =================================================================== --- trunk/scipy/io/arff/myfunctools.py 2008-04-07 18:05:47 UTC (rev 4088) +++ trunk/scipy/io/arff/myfunctools.py 2008-04-07 18:07:49 UTC (rev 4089) @@ -0,0 +1,18 @@ +# Last Change: Mon Aug 20 01:00 PM 2007 J +# Implement partial application (should only be used if functools is not +# available (eg python < 2.5) + +class partial: + def __init__(self, fun, *args, **kwargs): + self.fun = fun + self.pending = args[:] + self.kwargs = kwargs.copy() + + def __call__(self, *args, **kwargs): + if kwargs and self.kwargs: + kw = self.kwargs.copy() + kw.update(kwargs) + else: + kw = kwargs or self.kwargs + + return self.fun(*(self.pending + args), **kw) Added: trunk/scipy/io/arff/utils.py =================================================================== --- trunk/scipy/io/arff/utils.py 2008-04-07 18:05:47 UTC (rev 4088) +++ trunk/scipy/io/arff/utils.py 2008-04-07 18:07:49 UTC (rev 4089) @@ -0,0 +1,7 @@ +#! /usr/bin/env python +# Last Change: Mon Aug 20 02:00 PM 2007 J + +try: + from functools import partial +except ImportError: + from myfunctools import partial From scipy-svn at scipy.org Mon Apr 7 14:19:23 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 13:19:23 -0500 (CDT) Subject: [Scipy-svn] r4090 - in trunk/scipy/io: . arff Message-ID: <20080407181923.1368B39C01A@new.scipy.org> Author: cdavid Date: 2008-04-07 13:19:19 -0500 (Mon, 07 Apr 2008) New Revision: 4090 Added: trunk/scipy/io/arff/__init__.py Modified: trunk/scipy/io/setup.py trunk/scipy/io/setupscons.py Log: Add arff submodule in io package in scipy.io setup files. Added: trunk/scipy/io/arff/__init__.py =================================================================== Modified: trunk/scipy/io/setup.py =================================================================== --- trunk/scipy/io/setup.py 2008-04-07 18:07:49 UTC (rev 4089) +++ trunk/scipy/io/setup.py 2008-04-07 18:19:19 UTC (rev 4090) @@ -11,6 +11,7 @@ config.add_data_dir('examples') config.add_data_dir('docs') config.add_subpackage('matlab') + config.add_subpackage('arff') return config if __name__ == '__main__': Modified: trunk/scipy/io/setupscons.py =================================================================== --- trunk/scipy/io/setupscons.py 2008-04-07 18:07:49 UTC (rev 4089) +++ trunk/scipy/io/setupscons.py 2008-04-07 18:19:19 UTC (rev 4090) @@ -10,6 +10,7 @@ config.add_data_dir('examples') config.add_data_dir('docs') config.add_subpackage('matlab') + config.add_subpackage('arff') return config if __name__ == '__main__': From scipy-svn at scipy.org Mon Apr 7 14:23:16 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 13:23:16 -0500 (CDT) Subject: [Scipy-svn] r4091 - in trunk/scipy/io/arff: . tests tests/data Message-ID: <20080407182316.529E739C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 13:23:10 -0500 (Mon, 07 Apr 2008) New Revision: 4091 Added: trunk/scipy/io/arff/tests/ trunk/scipy/io/arff/tests/data/ trunk/scipy/io/arff/tests/data/test1.arff Log: Add a test directory for arff reader. Added: trunk/scipy/io/arff/tests/data/test1.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test1.arff 2008-04-07 18:19:19 UTC (rev 4090) +++ trunk/scipy/io/arff/tests/data/test1.arff 2008-04-07 18:23:10 UTC (rev 4091) @@ -0,0 +1,10 @@ + at RELATION test1 + + at ATTRIBUTE attr1 REAL + at ATTRIBUTE attr2 REAL + at ATTRIBUTE attr3 REAL + at ATTRIBUTE attr4 REAL + at ATTRIBUTE class {class1, class2, class3, class4} + + at DATA +0.1, 0.2, 0.3, 0.4,class1 From scipy-svn at scipy.org Mon Apr 7 15:09:33 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:09:33 -0500 (CDT) Subject: [Scipy-svn] r4092 - trunk/scipy/io/arff Message-ID: <20080407190933.36CB739C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 14:09:30 -0500 (Mon, 07 Apr 2008) New Revision: 4092 Added: trunk/scipy/io/arff/setup.py Log: Add setup file for arff reader submodule. Added: trunk/scipy/io/arff/setup.py =================================================================== --- trunk/scipy/io/arff/setup.py 2008-04-07 18:23:10 UTC (rev 4091) +++ trunk/scipy/io/arff/setup.py 2008-04-07 19:09:30 UTC (rev 4092) @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +def configuration(parent_package='io',top_path=None): + from numpy.distutils.misc_util import Configuration + config = Configuration('arff', parent_package, top_path) + #config.add_data_dir('tests') + return config + +if __name__ == '__main__': + from numpy.distutils.core import setup + setup(**configuration(top_path='').todict()) Property changes on: trunk/scipy/io/arff/setup.py ___________________________________________________________________ Name: svn:executable + * From scipy-svn at scipy.org Mon Apr 7 15:09:53 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:09:53 -0500 (CDT) Subject: [Scipy-svn] r4093 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407190953.6FC5539C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 14:09:50 -0500 (Mon, 07 Apr 2008) New Revision: 4093 Added: trunk/scipy/io/arff/tests/test_header.py Modified: trunk/scipy/io/arff/tests/ trunk/scipy/io/arff/tests/data/ trunk/scipy/io/arff/tests/data/test1.arff Log: Add tests directory. Property changes on: trunk/scipy/io/arff/tests ___________________________________________________________________ Name: svn:ignore + *.pyc *.swp Property changes on: trunk/scipy/io/arff/tests/data ___________________________________________________________________ Name: svn:ignore + *.pyc *.swp Modified: trunk/scipy/io/arff/tests/data/test1.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test1.arff 2008-04-07 19:09:30 UTC (rev 4092) +++ trunk/scipy/io/arff/tests/data/test1.arff 2008-04-07 19:09:50 UTC (rev 4093) @@ -1,10 +1,10 @@ @RELATION test1 - at ATTRIBUTE attr1 REAL + at ATTRIBUTE attr0 REAL + at ATTRIBUTE attr1 REAL @ATTRIBUTE attr2 REAL - at ATTRIBUTE attr3 REAL - at ATTRIBUTE attr4 REAL - at ATTRIBUTE class {class1, class2, class3, class4} + at ATTRIBUTE attr3 REAL + at ATTRIBUTE class {class0, class1, class2, class3} @DATA 0.1, 0.2, 0.3, 0.4,class1 Added: trunk/scipy/io/arff/tests/test_header.py =================================================================== --- trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:09:30 UTC (rev 4092) +++ trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:09:50 UTC (rev 4093) @@ -0,0 +1,34 @@ +#!/usr/bin/env python +"""Test for parsing arff headers only.""" +import os + +from scipy.testing import * + +from scipy.io.arff.arffread import read_header, MetaData + +data_path = os.path.join(os.path.dirname(__file__), 'data') + +test1 = os.path.join(data_path, 'test1.arff') + +class HeaderTest(TestCase): + def test_trivial1(self): + """Parsing trivial header with nothing.""" + ofile = open(test1) + rel, attrs = read_header(ofile) + + # Test relation + assert rel == 'test1' + + # Test numerical attributes + assert len(attrs) == 5 + for i in range(4): + assert attrs[i][0] == 'attr%d' % i + assert attrs[i][1] == 'REAL' + classes = attrs[4][1] + + # Test nominal attribute + assert attrs[4][0] == 'class' + assert attrs[4][1] == '{class0, class1, class2, class3}' + +if __name__ == "__main__": + nose.run(argv=['', __file__]) From scipy-svn at scipy.org Mon Apr 7 15:10:16 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:10:16 -0500 (CDT) Subject: [Scipy-svn] r4094 - trunk/scipy/io/arff Message-ID: <20080407191016.10B5339C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 14:10:10 -0500 (Mon, 07 Apr 2008) New Revision: 4094 Added: trunk/scipy/io/arff/arffread.py Log: Add arff reader implementation. Added: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-07 19:09:50 UTC (rev 4093) +++ trunk/scipy/io/arff/arffread.py 2008-04-07 19:10:10 UTC (rev 4094) @@ -0,0 +1,519 @@ +#! /usr/bin/env python +# Last Change: Mon Aug 20 08:00 PM 2007 J +import re +import itertools +import sys + +import numpy as N + +from scipy.io.arff.utils import partial + +"""A module to read arff files.""" + +# An Arff file is basically two parts: +# - header +# - data +# +# A header has each of its components starting by @META where META is one of +# the keyword (attribute of relation, for now). + +# TODO: +# - both integer and reals are treated as numeric -> the integer info is lost ! +# - Replace ValueError by ParseError or something + +# We know can handle the following: +# - numeric and nominal attributes +# - missing values for numeric attributes + +r_meta = re.compile('^\s*@') +# Match a comment +r_comment = re.compile(r'^%') +# Match an empty line +r_empty = re.compile(r'^\s+$') +# Match a header line, that is a line which starts by @ + a word +r_headerline = re.compile(r'^@\S*') +r_datameta = re.compile(r'^@[Dd][Aa][Tt][Aa]') +r_relation = re.compile(r'^@[Rr][Ee][Ll][Aa][Tt][Ii][Oo][Nn]\s*(\S*)') +r_attribute = re.compile(r'^@[Aa][Tt][Tt][Rr][Ii][Bb][Uu][Tt][Ee]\s*(..*$)') + +# To get attributes name enclosed with '' +r_comattrval = re.compile(r"'(..+)'\s+(..+$)") +# To get attributes name enclosed with '', possibly spread accross multilines +r_mcomattrval = re.compile(r"'([..\n]+)'\s+(..+$)") +# To get normal attributes +r_wcomattrval = re.compile(r"(\S+)\s+(..+$)") + +#------------------------- +# Module defined exception +#------------------------- +class ArffError(IOError): + pass + +class ParseArffError(ArffError): + pass + +#------------------ +# Various utilities +#------------------ + +# An attribute is defined as @attribute name value +def parse_type(attrtype): + """Given an arff attribute value (meta data), returns its type. + + Expect the value to be a name.""" + uattribute = attrtype.lower().strip() + if uattribute[0] == '{': + return 'nominal' + elif uattribute[:len('real')] == 'real': + return 'numeric' + elif uattribute[:len('integer')] == 'integer': + return 'numeric' + elif uattribute[:len('numeric')] == 'numeric': + return 'numeric' + elif uattribute[:len('string')] == 'string': + return 'string' + elif uattribute[:len('relational')] == 'relational': + return 'relational' + else: + raise ValueError("unknown attribute %s" % uattribute) + + +def get_nominal(attribute): + """If attribute is nominal, returns a list of the values""" + return attribute.split(',') + +def read_data_list(ofile): + """Read each line of the iterable and put it in a list.""" + data = [ofile.next()] + if data[0].strip()[0] == '{': + raise ValueError("This looks like a sparse ARFF: not supported yet") + data.extend([i for i in ofile]) + return data + +def get_ndata(ofile): + """Read the whole file to get number of data attributes.""" + data = [ofile.next()] + loc = 1 + if data[0].strip()[0] == '{': + raise ValueError("This looks like a sparse ARFF: not supported yet") + for i in ofile: + loc += 1 + return loc + +def maxnomlen(atrv): + """Given a string contening a nominal type definition, returns the string + len of the biggest component. + + A nominal type is defined as seomthing framed between brace ({}). + + Example: maxnomlen("{floup, bouga, fl, ratata}") returns 6 (the size of + ratata, the longest nominal value).""" + nomtp = get_nom_val(atrv) + return max(len(i) for i in nomtp) + +def get_nom_val(atrv): + """Given a string contening a nominal type, returns a tuple of the possible + values. + + A nominal type is defined as something framed between brace ({}). + + Example: get_nom_val("{floup, bouga, fl, ratata}") returns ("floup", + "bouga", "fl", "ratata").""" + r_nominal = re.compile('{(..+)}') + m = r_nominal.match(atrv) + if m: + return tuple(i.strip() for i in m.group(1).split(',')) + else: + raise ValueError("This does not look like a nominal string") + +def go_data(ofile): + """Skip header. + + the first next() call of the returned iterator will be the @data line""" + return itertools.dropwhile(lambda x : not r_datameta.match(x), ofile) + +#---------------- +# Parsing header +#---------------- +def tokenize_attribute(iterable, attribute): + """Parse a raw string in header (eg starts by @attribute). + + Given a raw string attribute, try to get the name and type of the + attribute. Constraints: + - The first line must start with @attribute (case insensitive, and + space like characters begore @attribute are allowed) + - Works also if the attribute is spread on multilines. + - Works if empty lines or comments are in between + + :Parameters: + attribute : str + the attribute string. + + :Returns: + name : str + name of the attribute + value : str + value of the attribute + next : str + next line to be parsed + + Example: + - if attribute is a string defined in python as r"floupi real", will + return floupi as name, and real as value. + - if attribute is r"'floupi 2' real", will return 'floupi 2' as name, + and real as value. """ + sattr = attribute.strip() + mattr = r_attribute.match(sattr) + if mattr: + # atrv is everything after @attribute + atrv = mattr.group(1) + if r_comattrval.match(atrv): + name, type = tokenize_single_comma(atrv) + next = iterable.next() + elif r_wcomattrval.match(atrv): + name, type = tokenize_single_wcomma(atrv) + next = iterable.next() + else: + # Not sure we should support this, as it does not seem supported by + # weka. + raise ValueError("multi line not supported yet") + #name, type, next = tokenize_multilines(iterable, atrv) + else: + raise ValueError("First line unparsable: %s" % sattr) + + if type == 'relational': + raise ValueError("relational attributes not supported yet") + return name, type, next + +def tokenize_multilines(iterable, val): + """Can tokenize an attribute spread over several lines.""" + # If one line does not match, read all the following lines up to next + # line with meta character, and try to parse everything up to there. + if not r_mcomattrval.match(val): + all = [val] + i = iterable.next() + while not r_meta.match(i): + all.append(i) + i = iterable.next() + if r_mend.search(i): + raise ValueError("relational attribute not supported yet") + print "".join(all[:-1]) + m = r_comattrval.match("".join(all[:-1])) + return m.group(1), m.group(2), i + else: + raise ValueError("Cannot parse attribute names spread over multi "\ + "lines yet") + +def tokenize_single_comma(val): + # XXX we match twice the same string (here and at the caller level). It is + # stupid, but it is easier for now... + m = r_comattrval.match(val) + if m: + try: + name = m.group(1).strip() + type = m.group(2).strip() + except IndexError: + raise ValueError("Error while tokenizing attribute") + else: + raise ValueError("Error while tokenizing single %s" % val) + return name, type + +def tokenize_single_wcomma(val): + # XXX we match twice the same string (here and at the caller level). It is + # stupid, but it is easier for now... + m = r_wcomattrval.match(val) + if m: + try: + name = m.group(1).strip() + type = m.group(2).strip() + except IndexError: + raise ValueError("Error while tokenizing attribute") + else: + raise ValueError("Error while tokenizing single %s" % val) + return name, type + +def read_header(ofile): + """Read the header of the iterable ofile.""" + i = ofile.next() + + # Pass first comments + while r_comment.match(i): + i = ofile.next() + + # Header is everything up to DATA attribute ? + relation = None + attributes = [] + while not r_datameta.match(i): + m = r_headerline.match(i) + if m: + isattr = r_attribute.match(i) + if isattr: + name, type, i = tokenize_attribute(ofile, i) + attributes.append((name, type)) + else: + isrel = r_relation.match(i) + if isrel: + relation = isrel.group(1) + else: + raise ValueError("Error parsing line %s" % i) + i = ofile.next() + else: + i = ofile.next() + + return relation, attributes + +#-------------------- +# Parsing actual data +#-------------------- +def safe_float(x): + """given a string x, convert it to a float. If the stripped string is a ?, + return a Nan (missing value).""" + if x.strip() == '?': + return N.nan + else: + return N.float(x) + +def safe_nominal(value, pvalue): + svalue = value.strip() + if svalue in pvalue: + return svalue + elif svalue == '?': + return svalue + else: + raise ValueError("%s value not in %s" % (str(svalue), str(pvalue))) + +def get_delim(line): + """Given a string representing a line of data, check whether the + delimiter is ',' or space.""" + l = line.split(',') + if len(l) > 1: + return ',' + else: + l = line.split(' ') + if len(l) > 1: + return ' ' + else: + raise ValueError("delimiter not understood: " + line) + +class MetaData: + """Small container to keep useful informations on a ARFF dataset. + + Also maintains the list of attributes in order, i.e. doing for i in meta, + where meta is an instance of MetaData, will return the different attribute + names in the order they were defined.""" + def __init__(self, rel, attr): + self.name = rel + # We need the dictionary to be ordered + # XXX: may be better to implement an ordered dictionary + self._attributes = {} + self._attrnames = [] + for name, value in attr: + tp = parse_type(value) + self._attrnames.append(name) + if tp == 'nominal': + self._attributes[name] = (tp, get_nom_val(value)) + else: + self._attributes[name] = (tp, None) + + def __repr__(self): + msg = "" + msg += "Dataset: %s\n" % self.name + for i in self._attrnames: + msg += "\t%s's type is %s" % (i, self._attributes[i][0]) + if self._attributes[i][1]: + msg += ", range is %s" % str(self._attributes[i][1]) + msg += '\n' + return msg + + def __iter__(self): + return iter(self._attrnames) + + def __getitem__(self, key): + return self._attributes[key] + +def read_arff(filename): + ofile = open(filename) + + # Parse the header file + try: + rel, attr = read_header(ofile) + except ValueError, e: + msg = "Error while parsing header, error was: " + str(e) + raise ParseArffError(msg) + + # Check whether we have a string attribute (not supported yet) + hasstr = False + for name, value in attr: + type = parse_type(value) + if type == 'string': + hasstr = True + + meta = MetaData(rel, attr) + + # XXX The following code is not great + # Build the type descriptor descr and the list of convertors to convert + # each attribute to the suitable type (which should match the one in + # descr). + + # This can be used once we want to support integer as integer values and + # not as numeric anymore (using masked arrays ?). + acls2dtype = {'real' : N.float, 'integer' : N.float, 'numeric' : N.float} + acls2conv = {'real' : safe_float, 'integer' : safe_float, 'numeric' : safe_float} + descr = [] + convertors = [] + if not hasstr: + for name, value in attr: + type = parse_type(value) + if type == 'date': + raise ValueError("date type not supported yet, sorry") + elif type == 'nominal': + n = maxnomlen(value) + descr.append((name, 'S%d' % n)) + pvalue = get_nom_val(value) + convertors.append(partial(safe_nominal, pvalue = pvalue)) + else: + descr.append((name, acls2dtype[type])) + convertors.append(safe_float) + #dc.append(acls2conv[type]) + #sdescr.append((name, acls2sdtype[type])) + else: + # How to support string efficiently ? Ideally, we should know the max + # size of the string before allocating the numpy array. + raise NotImplementedError("String attributes not supported yet, sorry") + + ni = len(convertors) + + # Get the delimiter from the first line of data: + def next_data_line(row_iter): + """Assumes we are already in the data part (eg after @data).""" + raw = row_iter.next() + while r_empty.match(raw): + raw = row_iter.next() + while r_comment.match(raw): + raw = row_iter.next() + return raw + + try: + dtline = next_data_line(ofile) + delim = get_delim(dtline) + except ValueError, e: + raise ParseArffError("Error while parsing delimiter: " + str(e)) + finally: + ofile.seek(0, 0) + ofile = go_data(ofile) + # skip the @data line + ofile.next() + + def generator(row_iter, delim = ','): + # TODO: this is where we are spending times (~80%). I think things + # could be made more efficiently: + # - We could for example "compile" the function, because some values + # do not change here. + # - The function to convert a line to dtyped values could also be + # generated on the fly from a string and be executed instead of + # looping. + # - The regex are overkill: for comments, checking that a line starts + # by % should be enough and faster, and for empty lines, same thing + # --> this does not seem to change anything. + + # We do not abstract skipping comments and empty lines for performances + # reason. + raw = row_iter.next() + while r_empty.match(raw): + raw = row_iter.next() + while r_comment.match(raw): + raw = row_iter.next() + + row = raw.split(delim) + yield tuple([convertors[i](row[i]) for i in range(ni)]) + for raw in row_iter: + while r_comment.match(raw): + raw = row_iter.next() + while r_empty.match(raw): + raw = row_iter.next() + row = raw.split(delim) + yield tuple([convertors[i](row[i]) for i in range(ni)]) + + a = generator(ofile, delim = delim) + # No error should happen here: it is a bug otherwise + data = N.fromiter(a, descr) + return data, meta + +#----- +# Misc +#----- +def basic_stats(data): + nbfac = data.size * 1. / (data.size - 1) + return N.nanmin(data), N.nanmax(data), N.mean(data), N.std(data) * nbfac + +def print_attribute(name, tp, data): + type = tp[0] + if type == 'numeric' or type == 'real' or type == 'integer': + min, max, mean, std = basic_stats(data) + print "%s,%s,%f,%f,%f,%f" % (name, type, min, max, mean, std) + else: + msg = name + ",{" + for i in range(len(tp[1])-1): + msg += tp[1][i] + "," + msg += tp[1][-1] + msg += "}" + print msg + +def test_weka(filename): + data, meta = read_arff(filename) + print len(data.dtype) + print data.size + for i in meta: + print_attribute(i,meta[i],data[i]) + +def floupi(filename): + data, meta = read_arff(filename) + from attrselect import print_dataset_info + print_dataset_info(data) + print "relation %s, has %d instances" % (meta.name, data.size) + itp = iter(types) + for i in data.dtype.names: + print_attribute(i,itp.next(),data[i]) + #tp = itp.next() + #if tp == 'numeric' or tp == 'real' or tp == 'integer': + # min, max, mean, std = basic_stats(data[i]) + # print "\tinstance %s: min %f, max %f, mean %f, std %f" % \ + # (i, min, max, mean, std) + #else: + # print "\tinstance %s is non numeric" % i + +if __name__ == '__main__': + #import glob + #for i in glob.glob('arff.bak/data/*'): + # relation, attributes = read_header(open(i)) + # print "Parsing header of %s: relation %s, %d attributes" % (i, + # relation, len(attributes)) + + import sys + filename = sys.argv[1] + #filename = 'arff.bak/data/pharynx.arff' + #floupi(filename) + test_weka(filename) + + #gf = [] + #wf = [] + #for i in glob.glob('arff.bak/data/*'): + # try: + # print "=============== reading %s ======================" % i + # floupi(i) + # gf.append(i) + # except ValueError, e: + # print "!!!! Error parsing the file !!!!!" + # print e + # wf.append(i) + # except IndexError, e: + # print "!!!! Error parsing the file !!!!!" + # print e + # wf.append(i) + # except ArffError, e: + # print "!!!! Error parsing the file !!!!!" + # print e + # wf.append(i) + + #print "%d good files" % len(gf) + #print "%d bad files" % len(wf) From scipy-svn at scipy.org Mon Apr 7 15:13:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:13:46 -0500 (CDT) Subject: [Scipy-svn] r4095 - in trunk/scipy/io/arff: . tests Message-ID: <20080407191346.C8D7C39C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 14:13:43 -0500 (Mon, 07 Apr 2008) New Revision: 4095 Modified: trunk/scipy/io/arff/ trunk/scipy/io/arff/tests/test_header.py Log: Change name for arff read test. Property changes on: trunk/scipy/io/arff ___________________________________________________________________ Name: svn:ignore + *.pyc *.swp Modified: trunk/scipy/io/arff/tests/test_header.py =================================================================== --- trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:10:10 UTC (rev 4094) +++ trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:13:43 UTC (rev 4095) @@ -11,7 +11,7 @@ test1 = os.path.join(data_path, 'test1.arff') class HeaderTest(TestCase): - def test_trivial1(self): + def test_fullheader1(self): """Parsing trivial header with nothing.""" ofile = open(test1) rel, attrs = read_header(ofile) From scipy-svn at scipy.org Mon Apr 7 15:21:29 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:21:29 -0500 (CDT) Subject: [Scipy-svn] r4096 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407192129.5852E39C0A1@new.scipy.org> Author: cdavid Date: 2008-04-07 14:21:25 -0500 (Mon, 07 Apr 2008) New Revision: 4096 Added: trunk/scipy/io/arff/tests/data/test2.arff Modified: trunk/scipy/io/arff/tests/test_header.py Log: Add test for parsing type in header of arff files. Added: trunk/scipy/io/arff/tests/data/test2.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test2.arff 2008-04-07 19:13:43 UTC (rev 4095) +++ trunk/scipy/io/arff/tests/data/test2.arff 2008-04-07 19:21:25 UTC (rev 4096) @@ -0,0 +1,15 @@ + at RELATION test2 + + at ATTRIBUTE attr0 REAL + at ATTRIBUTE attr1 real + at ATTRIBUTE attr2 integer + at ATTRIBUTE attr3 Integer + at ATTRIBUTE attr4 Numeric + at ATTRIBUTE attr5 numeric + at ATTRIBUTE attr6 string + at ATTRIBUTE attr7 STRING + at ATTRIBUTE attr8 {bla} + at ATTRIBUTE attr9 {bla, bla} + + at DATA +0.1, 0.2, 0.3, 0.4,class1 Modified: trunk/scipy/io/arff/tests/test_header.py =================================================================== --- trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:13:43 UTC (rev 4095) +++ trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:21:25 UTC (rev 4096) @@ -4,13 +4,25 @@ from scipy.testing import * -from scipy.io.arff.arffread import read_header, MetaData +from scipy.io.arff.arffread import read_header, MetaData, parse_type data_path = os.path.join(os.path.dirname(__file__), 'data') test1 = os.path.join(data_path, 'test1.arff') +test2 = os.path.join(data_path, 'test2.arff') class HeaderTest(TestCase): + def test_type_parsing(self): + """Test parsing type of attribute from their value.""" + ofile = open(test2) + rel, attrs = read_header(ofile) + + expected = ['numeric', 'numeric', 'numeric', 'numeric', 'numeric', + 'numeric', 'string', 'string', 'nominal', 'nominal'] + + for i in range(len(attrs)): + assert parse_type(attrs[i][1]) == expected[i] + def test_fullheader1(self): """Parsing trivial header with nothing.""" ofile = open(test1) From scipy-svn at scipy.org Mon Apr 7 15:28:03 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:28:03 -0500 (CDT) Subject: [Scipy-svn] r4097 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407192803.DCD1439C17F@new.scipy.org> Author: cdavid Date: 2008-04-07 14:27:59 -0500 (Mon, 07 Apr 2008) New Revision: 4097 Added: trunk/scipy/io/arff/tests/data/test3.arff Modified: trunk/scipy/io/arff/tests/test_header.py Log: Change ValueError to ParseArffError exception in parse_type + test. Added: trunk/scipy/io/arff/tests/data/test3.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test3.arff 2008-04-07 19:21:25 UTC (rev 4096) +++ trunk/scipy/io/arff/tests/data/test3.arff 2008-04-07 19:27:59 UTC (rev 4097) @@ -0,0 +1,6 @@ + at RELATION test3 + + at ATTRIBUTE attr0 crap + + at DATA +0.1, 0.2, 0.3, 0.4,class1 Modified: trunk/scipy/io/arff/tests/test_header.py =================================================================== --- trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:21:25 UTC (rev 4096) +++ trunk/scipy/io/arff/tests/test_header.py 2008-04-07 19:27:59 UTC (rev 4097) @@ -4,12 +4,14 @@ from scipy.testing import * -from scipy.io.arff.arffread import read_header, MetaData, parse_type +from scipy.io.arff.arffread import read_header, MetaData, parse_type, \ + ParseArffError data_path = os.path.join(os.path.dirname(__file__), 'data') test1 = os.path.join(data_path, 'test1.arff') test2 = os.path.join(data_path, 'test2.arff') +test3 = os.path.join(data_path, 'test3.arff') class HeaderTest(TestCase): def test_type_parsing(self): @@ -23,6 +25,18 @@ for i in range(len(attrs)): assert parse_type(attrs[i][1]) == expected[i] + def test_badtype_parsing(self): + """Test parsing wrong type of attribute from their value.""" + ofile = open(test3) + rel, attrs = read_header(ofile) + + for name, value in attrs: + try: + parse_type(value) + raise Error("Could parse type of crap, should not happen.") + except ParseArffError: + pass + def test_fullheader1(self): """Parsing trivial header with nothing.""" ofile = open(test1) From scipy-svn at scipy.org Mon Apr 7 15:29:01 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:29:01 -0500 (CDT) Subject: [Scipy-svn] r4098 - trunk/scipy/io/arff Message-ID: <20080407192901.6830839C17F@new.scipy.org> Author: cdavid Date: 2008-04-07 14:28:59 -0500 (Mon, 07 Apr 2008) New Revision: 4098 Modified: trunk/scipy/io/arff/arffread.py Log: Forgot to commit the right dir for arff reader. Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-07 19:27:59 UTC (rev 4097) +++ trunk/scipy/io/arff/arffread.py 2008-04-07 19:28:59 UTC (rev 4098) @@ -75,7 +75,7 @@ elif uattribute[:len('relational')] == 'relational': return 'relational' else: - raise ValueError("unknown attribute %s" % uattribute) + raise ParseArffError("unknown attribute %s" % uattribute) def get_nominal(attribute): From scipy-svn at scipy.org Mon Apr 7 15:37:37 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 14:37:37 -0500 (CDT) Subject: [Scipy-svn] r4099 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407193737.48EAA39C17F@new.scipy.org> Author: cdavid Date: 2008-04-07 14:37:33 -0500 (Mon, 07 Apr 2008) New Revision: 4099 Added: trunk/scipy/io/arff/tests/data/test4.arff trunk/scipy/io/arff/tests/test_data.py Log: Start testing full arff files readers. Added: trunk/scipy/io/arff/tests/data/test4.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test4.arff 2008-04-07 19:28:59 UTC (rev 4098) +++ trunk/scipy/io/arff/tests/data/test4.arff 2008-04-07 19:37:33 UTC (rev 4099) @@ -0,0 +1,12 @@ + at RELATION test4 + + at ATTRIBUTE attr0 REAL + at ATTRIBUTE attr1 REAL + at ATTRIBUTE attr2 REAL + at ATTRIBUTE attr3 REAL + at ATTRIBUTE class {class0, class1, class2, class3} + + at DATA +0.1, 0.2, 0.3, 0.4,class1 +-0.1, -0.2, -0.3, -0.4,class2 +1, 2, 3, 4,class3 Added: trunk/scipy/io/arff/tests/test_data.py =================================================================== --- trunk/scipy/io/arff/tests/test_data.py 2008-04-07 19:28:59 UTC (rev 4098) +++ trunk/scipy/io/arff/tests/test_data.py 2008-04-07 19:37:33 UTC (rev 4099) @@ -0,0 +1,26 @@ +#!/usr/bin/env python +"""Tests for parsing full arff files.""" +import os + +from scipy.testing import * + +from scipy.io.arff.arffread import read_arff + +data_path = os.path.join(os.path.dirname(__file__), 'data') + +test4 = os.path.join(data_path, 'test4.arff') +expect4_data = [(0.1, 0.2, 0.3, 0.4, 'class1'), + (-0.1, -0.2, -0.3, -0.4, 'class2'), + (1, 2, 3, 4, 'class3')] + + +class DataTest(TestCase): + def test1(self): + """Parsing trivial file with nothing.""" + data, meta = read_arff(test4) + for i in range(len(data)): + for j in range(4): + assert_array_almost_equal(expect4_data[i][j], data[i][j]) + +if __name__ == "__main__": + nose.run(argv=['', __file__]) From scipy-svn at scipy.org Mon Apr 7 16:44:15 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 15:44:15 -0500 (CDT) Subject: [Scipy-svn] r4100 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407204415.3B53E39C39F@new.scipy.org> Author: cdavid Date: 2008-04-07 15:44:11 -0500 (Mon, 07 Apr 2008) New Revision: 4100 Added: trunk/scipy/io/arff/tests/data/test5.arff Modified: trunk/scipy/io/arff/tests/data/test4.arff trunk/scipy/io/arff/tests/test_data.py Log: Test arff files with comments in the data section. Modified: trunk/scipy/io/arff/tests/data/test4.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test4.arff 2008-04-07 19:37:33 UTC (rev 4099) +++ trunk/scipy/io/arff/tests/data/test4.arff 2008-04-07 20:44:11 UTC (rev 4100) @@ -1,4 +1,4 @@ - at RELATION test4 + at RELATION test5 @ATTRIBUTE attr0 REAL @ATTRIBUTE attr1 REAL @@ -8,5 +8,7 @@ @DATA 0.1, 0.2, 0.3, 0.4,class1 +% laksjdhf -0.1, -0.2, -0.3, -0.4,class2 +% lsdflkjhaksjdhf 1, 2, 3, 4,class3 Added: trunk/scipy/io/arff/tests/data/test5.arff =================================================================== --- trunk/scipy/io/arff/tests/data/test5.arff 2008-04-07 19:37:33 UTC (rev 4099) +++ trunk/scipy/io/arff/tests/data/test5.arff 2008-04-07 20:44:11 UTC (rev 4100) @@ -0,0 +1,12 @@ + at RELATION test4 + + at ATTRIBUTE attr0 REAL + at ATTRIBUTE attr1 REAL + at ATTRIBUTE attr2 REAL + at ATTRIBUTE attr3 REAL + at ATTRIBUTE class {class0, class1, class2, class3} + + at DATA +0.1, 0.2, 0.3, 0.4,class1 +-0.1, -0.2, -0.3, -0.4,class2 +1, 2, 3, 4,class3 Modified: trunk/scipy/io/arff/tests/test_data.py =================================================================== --- trunk/scipy/io/arff/tests/test_data.py 2008-04-07 19:37:33 UTC (rev 4099) +++ trunk/scipy/io/arff/tests/test_data.py 2008-04-07 20:44:11 UTC (rev 4100) @@ -9,6 +9,7 @@ data_path = os.path.join(os.path.dirname(__file__), 'data') test4 = os.path.join(data_path, 'test4.arff') +test5 = os.path.join(data_path, 'test5.arff') expect4_data = [(0.1, 0.2, 0.3, 0.4, 'class1'), (-0.1, -0.2, -0.3, -0.4, 'class2'), (1, 2, 3, 4, 'class3')] @@ -17,7 +18,14 @@ class DataTest(TestCase): def test1(self): """Parsing trivial file with nothing.""" - data, meta = read_arff(test4) + self._test(test4) + + def test2(self): + """Parsing trivial file with some comments in the data section.""" + self._test(test5) + + def _test(self, test_file): + data, meta = read_arff(test_file) for i in range(len(data)): for j in range(4): assert_array_almost_equal(expect4_data[i][j], data[i][j]) From scipy-svn at scipy.org Mon Apr 7 18:08:20 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 17:08:20 -0500 (CDT) Subject: [Scipy-svn] r4101 - in trunk/scipy/io/arff/tests: . data Message-ID: <20080407220820.2C8BD39C036@new.scipy.org> Author: cdavid Date: 2008-04-07 17:08:16 -0500 (Mon, 07 Apr 2008) New Revision: 4101 Added: trunk/scipy/io/arff/tests/data/missing.arff Modified: trunk/scipy/io/arff/tests/test_data.py Log: Arff reader test for missing data. Added: trunk/scipy/io/arff/tests/data/missing.arff =================================================================== --- trunk/scipy/io/arff/tests/data/missing.arff 2008-04-07 20:44:11 UTC (rev 4100) +++ trunk/scipy/io/arff/tests/data/missing.arff 2008-04-07 22:08:16 UTC (rev 4101) @@ -0,0 +1,8 @@ +% This arff file contains some missing data + at relation missing + at attribute yop real + at attribute yap real + at data +1,5 +2,4 +?,? Modified: trunk/scipy/io/arff/tests/test_data.py =================================================================== --- trunk/scipy/io/arff/tests/test_data.py 2008-04-07 20:44:11 UTC (rev 4100) +++ trunk/scipy/io/arff/tests/test_data.py 2008-04-07 22:08:16 UTC (rev 4101) @@ -2,6 +2,7 @@ """Tests for parsing full arff files.""" import os +import numpy as N from scipy.testing import * from scipy.io.arff.arffread import read_arff @@ -14,6 +15,11 @@ (-0.1, -0.2, -0.3, -0.4, 'class2'), (1, 2, 3, 4, 'class3')] +missing = os.path.join(data_path, 'missing.arff') +expect_missing_raw = N.array([[1, 5], [2, 4], [N.nan, N.nan]]) +expect_missing = N.empty(3, [('yop', N.float), ('yap', N.float)]) +expect_missing['yop'] = expect_missing_raw[:, 0] +expect_missing['yap'] = expect_missing_raw[:, 1] class DataTest(TestCase): def test1(self): @@ -30,5 +36,11 @@ for j in range(4): assert_array_almost_equal(expect4_data[i][j], data[i][j]) +class MissingDataTest(TestCase): + def test_missing(self): + data, meta = read_arff(missing) + for i in ['yop', 'yap']: + assert_array_almost_equal(data[i], expect_missing[i]) + if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Mon Apr 7 18:53:19 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 17:53:19 -0500 (CDT) Subject: [Scipy-svn] r4102 - trunk/scipy/io/arff Message-ID: <20080407225319.4D4B139C07D@new.scipy.org> Author: cdavid Date: 2008-04-07 17:53:14 -0500 (Mon, 07 Apr 2008) New Revision: 4102 Modified: trunk/scipy/io/arff/__init__.py trunk/scipy/io/arff/arffread.py Log: Add a basic doc for arff reader. Modified: trunk/scipy/io/arff/__init__.py =================================================================== --- trunk/scipy/io/arff/__init__.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/io/arff/__init__.py 2008-04-07 22:53:14 UTC (rev 4102) @@ -0,0 +1,12 @@ +"""Module to read arff files (weka format). + +arff is a simple file format which support numerical, string and data values. +It supports sparse data too. + +See http://weka.sourceforge.net/wekadoc/index.php/en:ARFF_(3.4.6) for more +details about arff format and available datasets.""" + +from arffread import * +import arffread + +__all__ = arffread.__all__ Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/io/arff/arffread.py 2008-04-07 22:53:14 UTC (rev 4102) @@ -10,6 +10,8 @@ """A module to read arff files.""" +__all__ = ['MetaData', 'read_arff', 'ArffError', 'ParseArffError'] + # An Arff file is basically two parts: # - header # - data @@ -332,6 +334,18 @@ return self._attributes[key] def read_arff(filename): + """Read an arff file. + + :Note: + + This function should be able to read most arff files. Not implemented + functionalities include: + - date type attributes + - string type attributes + + It can read files with numeric and nominal attributes. + It can read files with sparse data (? in the file). + """ ofile = open(filename) # Parse the header file From scipy-svn at scipy.org Mon Apr 7 20:15:56 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 19:15:56 -0500 (CDT) Subject: [Scipy-svn] r4103 - in trunk/scipy/io/arff: . tests Message-ID: <20080408001556.F047A39C06D@new.scipy.org> Author: cdavid Date: 2008-04-07 19:15:48 -0500 (Mon, 07 Apr 2008) New Revision: 4103 Modified: trunk/scipy/io/arff/arffread.py trunk/scipy/io/arff/tests/test_data.py Log: Rename read_arff to loadarff to be consistent with matlab io code. Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-07 22:53:14 UTC (rev 4102) +++ trunk/scipy/io/arff/arffread.py 2008-04-08 00:15:48 UTC (rev 4103) @@ -10,7 +10,7 @@ """A module to read arff files.""" -__all__ = ['MetaData', 'read_arff', 'ArffError', 'ParseArffError'] +__all__ = ['MetaData', 'loadarff', 'ArffError', 'ParseArffError'] # An Arff file is basically two parts: # - header @@ -333,7 +333,7 @@ def __getitem__(self, key): return self._attributes[key] -def read_arff(filename): +def loadarff(filename): """Read an arff file. :Note: @@ -474,14 +474,14 @@ print msg def test_weka(filename): - data, meta = read_arff(filename) + data, meta = loadarff(filename) print len(data.dtype) print data.size for i in meta: print_attribute(i,meta[i],data[i]) def floupi(filename): - data, meta = read_arff(filename) + data, meta = loadarff(filename) from attrselect import print_dataset_info print_dataset_info(data) print "relation %s, has %d instances" % (meta.name, data.size) Modified: trunk/scipy/io/arff/tests/test_data.py =================================================================== --- trunk/scipy/io/arff/tests/test_data.py 2008-04-07 22:53:14 UTC (rev 4102) +++ trunk/scipy/io/arff/tests/test_data.py 2008-04-08 00:15:48 UTC (rev 4103) @@ -5,7 +5,7 @@ import numpy as N from scipy.testing import * -from scipy.io.arff.arffread import read_arff +from scipy.io.arff.arffread import loadarff data_path = os.path.join(os.path.dirname(__file__), 'data') @@ -31,14 +31,14 @@ self._test(test5) def _test(self, test_file): - data, meta = read_arff(test_file) + data, meta = loadarff(test_file) for i in range(len(data)): for j in range(4): assert_array_almost_equal(expect4_data[i][j], data[i][j]) class MissingDataTest(TestCase): def test_missing(self): - data, meta = read_arff(missing) + data, meta = loadarff(missing) for i in ['yop', 'yap']: assert_array_almost_equal(data[i], expect_missing[i]) From scipy-svn at scipy.org Mon Apr 7 20:36:35 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 19:36:35 -0500 (CDT) Subject: [Scipy-svn] r4104 - trunk/scipy/io/arff Message-ID: <20080408003635.5130939C173@new.scipy.org> Author: cdavid Date: 2008-04-07 19:36:31 -0500 (Mon, 07 Apr 2008) New Revision: 4104 Modified: trunk/scipy/io/arff/arffread.py Log: A bit more doc for loadarff. Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-08 00:15:48 UTC (rev 4103) +++ trunk/scipy/io/arff/arffread.py 2008-04-08 00:36:31 UTC (rev 4104) @@ -300,9 +300,26 @@ class MetaData: """Small container to keep useful informations on a ARFF dataset. - Also maintains the list of attributes in order, i.e. doing for i in meta, - where meta is an instance of MetaData, will return the different attribute - names in the order they were defined.""" + Knows about attributes names and types. + + :Example: + + data, meta = loadarff('iris.arff') + # This will print the attributes names of the iris.arff dataset + for i in meta: + print i + # This works too + meta.names() + # Getting attribute type + types = meta.types() + + :Note: + + Also maintains the list of attributes in order, i.e. doing for i in + meta, where meta is an instance of MetaData, will return the different + attribute names in the order they were defined. + + """ def __init__(self, rel, attr): self.name = rel # We need the dictionary to be ordered @@ -333,9 +350,30 @@ def __getitem__(self, key): return self._attributes[key] + def names(self): + """Return the list of attribute names.""" + return self._attrnames + + def types(self): + """Return the list of attribute types.""" + return [v[0] for v in self._attributes.values()] + def loadarff(filename): """Read an arff file. + :Args: + + filename: str + the name of the file + + :Returns: + + data: record array + the data of the arff file. Each record corresponds to one attribute. + meta: MetaData + this contains informations about the arff file, like type and names + of attributes, the relation (name of the dataset), etc... + :Note: This function should be able to read most arff files. Not implemented From scipy-svn at scipy.org Mon Apr 7 21:11:56 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 20:11:56 -0500 (CDT) Subject: [Scipy-svn] r4105 - trunk/scipy/ndimage Message-ID: <20080408011156.5C4E239C1AF@new.scipy.org> Author: tom.waite Date: 2008-04-07 20:11:40 -0500 (Mon, 07 Apr 2008) New Revision: 4105 Modified: trunk/scipy/ndimage/_segmenter.py Log: added seg_co_occurence Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-08 00:36:31 UTC (rev 4104) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-08 01:11:40 UTC (rev 4105) @@ -283,7 +283,6 @@ S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) co_occurence_image_list[i] = cocm_block # normalize the joint histogram prior to feature extraction - joint_histogram = NP.zeros([num_bits, num_bits], dtype=NP.float64); joint_histogram = cocm_block.astype(NP.float64) joint_histogram = joint_histogram / joint_histogram.sum() # to prevent log(0) @@ -310,6 +309,122 @@ return + +def seg_co_occurence(raw_image, window=16, distance=2, orientation=90): + """ + seg_co_occurence(raw_image, window=16, distance=2, orientation=90) + + (N-S, E-W, NW-SE, NE-SW) computes one of 4 directional co-occurence matrices and features. + In debug=1 will return the 4 joint histograms for each ROI. + + The seg_co_occurence() method is used for texture-based segmentation. Feature images are + returned from which segmentation can be later performed. + + **** + NOTE: This is very slow and a fast method using Unsers histogram approximation will be + added in the future. + **** + + + Parameters + ---------- + + raw_image : {nd_array} + raw image from which texture features get extracted + + window : {int} + integer value of moving 2D window. Window slides in 2D over image and is the + region-of-interest from which co-occurence texture features are extracted. The + window is 2D square so only a single value is entered. Default window is 32x32. + + distance : {int} + integer value of pixel offset in forming joint histogram. default value 2 + + orientation : {45, 90, 135, 180} + direction for pixel offet. + + Returns + ---------- + + cocm_images : {dictionary} + + co_occurence_feature_images. contains 4 normalized feature + windows with keys: energy, entropy, contrast and homogeneity. + + """ + + if orientation != 45 and orientation != 90 and orientation != 135 and orientation != 180: + orientation = 90 + + epsilon = 2.2e-16 + num_bits = 256 + copy_image = raw_image.copy() + [rows, cols] = copy_image.shape + row_indices = range(window, rows-window) + col_indices = range(window, cols-window) + + # create a fixed mask and scratch window for raw source + section = NP.ones(2*window*2*window, dtype=NP.int16).reshape(2*window, 2*window) + source_region = NP.zeros(2*window*2*window, dtype=NP.float64).reshape(2*window, 2*window) + + # output images + energy_image = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + entropy_image = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + homogeneity_image = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + contrast_image = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + cocm_block = NP.zeros(num_bits*num_bits, dtype=NP.int32).reshape(num_bits, num_bits) + + for i in row_indices: + bottom = i - window + top = i + window + for j in col_indices: + left = j - window + right = j + window + source_region[0:2*window, 0:2*window] = copy_image[bottom:top, left:right] + # scale segment to 8 bits. this needs to be smarter (e.g. use integrated histogram method) + max_value = source_region.max() + min_value = source_region.min() + scale = 255.0 / (max_value-min_value) + image_roi = (scale*(source_region-min_value)).astype(NP.int16) + # image_roi is short type + cocm_block[:] = 0.0 + S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) + # normalize the joint histogram prior to feature extraction + joint_histogram = cocm_block.astype(NP.float64) + joint_histogram = joint_histogram / joint_histogram.sum() + # to prevent log(0) + joint_histogram += epsilon + # compute the com features + energy = joint_histogram.std() + H = joint_histogram * NP.log(joint_histogram) + entropy = H.sum() + r, c = joint_histogram.shape + [a, b] = NP.mgrid[1:c+1, 1:r+1] + contrast = ((NP.square(a-b))*joint_histogram).sum() + d = 1.0 + NP.abs(a-b) + homogeneity = (joint_histogram / d).sum() + # store the feature pixel for the 4 images + energy_image[i, j] = energy + entropy_image[i, j] = entropy + contrast_image[i, j] = contrast + homogeneity_image[i, j] = homogeneity + + scale_energy = 1.0 / max(energy_image.max(), abs(energy_image.min())) + scale_entropy = 1.0 / max(entropy_image.max(), abs(entropy_image.min())) + scale_contrast = 1.0 / max(contrast_image.max(), abs(contrast_image.min())) + scale_homogeneity = 1.0 / max(homogeneity_image.max(), abs(homogeneity_image.min())) + + energy_image = scale_energy * energy_image + entropy_image = scale_entropy * entropy_image + homogeneity_image = scale_homogeneity * homogeneity_image + contrast_image = scale_contrast * contrast_image + + cocm_images = {'energy_image' : energy_image, 'entropy_image' : entropy_image, + 'homogeneity_image' : homogeneity_image, 'contrast_image' : contrast_image} + + return cocm_images + + def roi_mat_filter(label_image, thin_kernel, ROI): """ thin_edge_image = roi_mat_filter(label_image, thin_kernel, ROI) From scipy-svn at scipy.org Mon Apr 7 23:04:48 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 22:04:48 -0500 (CDT) Subject: [Scipy-svn] r4106 - in trunk/scipy/interpolate: . tests Message-ID: <20080408030448.6681339C04B@new.scipy.org> Author: rkern Date: 2008-04-07 22:04:42 -0500 (Mon, 07 Apr 2008) New Revision: 4106 Added: trunk/scipy/interpolate/rbf.py trunk/scipy/interpolate/tests/test_rbf.py Modified: trunk/scipy/interpolate/__init__.py trunk/scipy/interpolate/info.py Log: Add the radial basis function interpolation code from the sandbox. Modified: trunk/scipy/interpolate/__init__.py =================================================================== --- trunk/scipy/interpolate/__init__.py 2008-04-08 01:11:40 UTC (rev 4105) +++ trunk/scipy/interpolate/__init__.py 2008-04-08 03:04:42 UTC (rev 4106) @@ -10,6 +10,8 @@ # New interface to fitpack library: from fitpack2 import * +from rbf import Rbf + __all__ = filter(lambda s:not s.startswith('_'),dir()) from scipy.testing.pkgtester import Tester test = Tester().test Modified: trunk/scipy/interpolate/info.py =================================================================== --- trunk/scipy/interpolate/info.py 2008-04-08 01:11:40 UTC (rev 4105) +++ trunk/scipy/interpolate/info.py 2008-04-08 03:04:42 UTC (rev 4106) @@ -30,6 +30,7 @@ to compute unknown values of a univariate function. interp2d -- Create a class whose instances can interpolate to compute unknown values of a bivariate function. + Rbf -- Apply Radial Basis Functions to interpolate scattered N-D data. """ postpone_import = 1 Added: trunk/scipy/interpolate/rbf.py =================================================================== --- trunk/scipy/interpolate/rbf.py 2008-04-08 01:11:40 UTC (rev 4105) +++ trunk/scipy/interpolate/rbf.py 2008-04-08 03:04:42 UTC (rev 4106) @@ -0,0 +1,153 @@ +"""rbf - Radial basis functions for interpolation/smoothing scattered Nd data. + +Written by John Travers , February 2007 +Based closely on Matlab code by Alex Chirokov +Additional, large, improvements by Robert Hetland + +Permission to use, modify, and distribute this software is given under the +terms of the SciPy (BSD style) license. See LICENSE.txt that came with +this distribution for specifics. + +NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + +Copyright (c) 2006-2007, Robert Hetland +Copyright (c) 2007, John Travers + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Robert Hetland nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +from numpy import sqrt, log, asarray, newaxis, all, dot, float64, eye +from scipy import linalg + +class Rbf(object): + """ A class for radial basis function approximation/interpolation of + n-dimensional scattered data. + """ + + def _euclidean_norm(self, x1, x2): + return sqrt( ((x1 - x2)**2).sum(axis=0) ) + + def _function(self, r): + if self.function.lower() == 'multiquadric': + return sqrt((1.0/self.epsilon*r)**2 + 1) + elif self.function.lower() == 'inverse multiquadric': + return 1.0/sqrt((1.0/self.epsilon*r)**2 + 1) + elif self.function.lower() == 'gausian': + return exp(-(self.epsilon*r)**2) + elif self.function.lower() == 'cubic': + return r**3 + elif self.function.lower() == 'quintic': + return r**5 + elif self.function.lower() == 'thin-plate': + return r**2 * log(r) + else: + raise ValueError, 'Invalid basis function name' + + def __init__(self, *args, **kwargs): + """ Constructor for Rbf class. + + Parameters + ---------- + *args : arrays + x, y, z, ..., d, where x, y, z, ... are the coordinates of the nodes + and d is the array of values at the nodes + function : str, optional + The radial basis function, based on the radius, r, given by the norm + (defult is Euclidean distance); the default is 'multiquadratic'. + + :: + 'multiquadric': sqrt((self.epsilon*r)**2 + 1) + 'inverse multiquadric': 1.0/sqrt((self.epsilon*r)**2 + 1) + 'gausian': exp(-(self.epsilon*r)**2) + 'cubic': r**3 + 'quintic': r**5 + 'thin-plate': r**2 * log(r) + epsilon : float, optional + Adjustable constant for gaussian or multiquadrics functions + - defaults to approximate average distance between nodes (which is + a good start). + smooth : float, optional + Values greater than zero increase the smoothness of the + approximation. 0 is for interpolation (default), the function will + always go through the nodal points in this case. + norm : callable, optional + A function that returns the 'distance' between two points, with + inputs as arrays of positions (x, y, z, ...), and an output as an + array of distance. E.g, the default:: + + def euclidean_norm(x1, x2): + return sqrt( ((x1 - x2)**2).sum(axis=0) ) + + which is called with x1=x1[ndims,newaxis,:] and + x2=x2[ndims,:,newaxis] such that the result is a symetric, square + matrix of the distances between each point to each other point. + + Returns + ------- + rbf : Rbf + Interpolator object that returns interpolated values at new positions. + + Examples + -------- + >>> rbfi = Rbf(x, y, z, d) # radial basis function interpolator instance + >>> di = rbfi(xi, yi, zi) # interpolated values + """ + self.xi = asarray([asarray(a, dtype=float64).flatten() for a in args[:-1]]) + self.N = self.xi.shape[-1] + self.di = asarray(args[-1], dtype=float64).flatten() + + assert [x.size==self.di.size for x in self.xi], \ + 'All arrays must be equal length' + + self.norm = kwargs.pop('norm', self._euclidean_norm) + r = self._call_norm(self.xi, self.xi) + self.epsilon = kwargs.pop('epsilon', r.mean()) + self.function = kwargs.pop('function', 'multiquadric') + self.smooth = kwargs.pop('smooth', 0.0) + + self.A = self._function(r) - eye(self.N)*self.smooth + self.nodes = linalg.solve(self.A, self.di) + + def _call_norm(self, x1, x2): + if len(x1.shape) == 1: + x1 = x1[newaxis, :] + if len(x2.shape) == 1: + x2 = x2[newaxis, :] + x1 = x1[..., :, newaxis] + x2 = x2[..., newaxis, :] + return self.norm(x1, x2) + + def __call__(self, *args): + assert all([x.shape == y.shape \ + for x in args \ + for y in args]), 'Array lengths must be equal' + shp = args[0].shape + self.xa = asarray([a.flatten() for a in args], dtype=float64) + r = self._call_norm(self.xa, self.xi) + return dot(self._function(r), self.nodes).reshape(shp) Property changes on: trunk/scipy/interpolate/rbf.py ___________________________________________________________________ Name: svn:eol-style + native Added: trunk/scipy/interpolate/tests/test_rbf.py =================================================================== --- trunk/scipy/interpolate/tests/test_rbf.py 2008-04-08 01:11:40 UTC (rev 4105) +++ trunk/scipy/interpolate/tests/test_rbf.py 2008-04-08 03:04:42 UTC (rev 4106) @@ -0,0 +1,40 @@ +#!/usr/bin/env python +# Created by John Travers, Robert Hetland, 2007 +""" Test functions for rbf module """ + +from numpy.testing import assert_array_almost_equal +from numpy import linspace, sin, random, exp + + +from scipy.interpolate.rbf import Rbf + + +def test_rbf1d(): + x = linspace(0,10,9) + y = sin(x) + rbf = Rbf(x, y) + yi = rbf(x) + assert_array_almost_equal(y, yi) + +def test_rbf2d(): + x = random.rand(50,1)*4-2 + y = random.rand(50,1)*4-2 + z = x*exp(-x**2-y**2) + rbf = Rbf(x, y, z ,epsilon=2) + zi = rbf(x, y) + zi.shape = x.shape + assert_array_almost_equal(z, zi) + +def test_rbf3d(): + x = random.rand(50,1)*4-2 + y = random.rand(50,1)*4-2 + z = random.rand(50,1)*4-2 + d = x*exp(-x**2-y**2) + rbf = Rbf(x, y, z, d ,epsilon=2) + di = rbf(x, y, z) + di.shape = x.shape + assert_array_almost_equal(di, d) + +if __name__ == "__main__": + import nose + nose.run(argv=['', __file__]) Property changes on: trunk/scipy/interpolate/tests/test_rbf.py ___________________________________________________________________ Name: svn:eol-style + native From scipy-svn at scipy.org Mon Apr 7 23:07:30 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 22:07:30 -0500 (CDT) Subject: [Scipy-svn] r4107 - trunk/scipy/sandbox/constants Message-ID: <20080408030730.E653539C04B@new.scipy.org> Author: rkern Date: 2008-04-07 22:07:28 -0500 (Mon, 07 Apr 2008) New Revision: 4107 Modified: trunk/scipy/sandbox/constants/constants.py Log: Typo. Modified: trunk/scipy/sandbox/constants/constants.py =================================================================== --- trunk/scipy/sandbox/constants/constants.py 2008-04-08 03:04:42 UTC (rev 4106) +++ trunk/scipy/sandbox/constants/constants.py 2008-04-08 03:07:28 UTC (rev 4107) @@ -190,7 +190,7 @@ """Convert Fahrenheit to Kelvin""" return C2K(F2C(F)) -def K2F(k): +def K2F(K): """Convert Kelvin to Fahrenheit""" return C2F(K2C(K)) From scipy-svn at scipy.org Mon Apr 7 23:08:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 22:08:46 -0500 (CDT) Subject: [Scipy-svn] r4108 - in trunk/scipy: . constants sandbox Message-ID: <20080408030846.5A37039C04B@new.scipy.org> Author: rkern Date: 2008-04-07 22:08:38 -0500 (Mon, 07 Apr 2008) New Revision: 4108 Added: trunk/scipy/constants/ trunk/scipy/constants/__init__.py trunk/scipy/constants/codata.py trunk/scipy/constants/constants.py trunk/scipy/constants/setup.py Removed: trunk/scipy/constants/__init__.py trunk/scipy/constants/codata.py trunk/scipy/constants/constants.py trunk/scipy/constants/setup.py trunk/scipy/sandbox/constants/ Modified: trunk/scipy/setup.py Log: Move the constants package from the sandbox. Copied: trunk/scipy/constants (from rev 4101, trunk/scipy/sandbox/constants) Deleted: trunk/scipy/constants/__init__.py =================================================================== --- trunk/scipy/sandbox/constants/__init__.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/constants/__init__.py 2008-04-08 03:08:38 UTC (rev 4108) @@ -1,4 +0,0 @@ - -# Modules contributed by BasSw (wegwerp at gmail.com) -from codata import * -from constants import * Copied: trunk/scipy/constants/__init__.py (from rev 4107, trunk/scipy/sandbox/constants/__init__.py) Deleted: trunk/scipy/constants/codata.py =================================================================== --- trunk/scipy/sandbox/constants/codata.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/constants/codata.py 2008-04-08 03:08:38 UTC (rev 4108) @@ -1,409 +0,0 @@ -# Compiled by Charles Harris -# Taken from his email message to scipy-dev -# dated October 3, 2002 - -# updated to 2002 values by BasSw, 2006 -""" Fundamental Physical Constants - - These constants are taken from CODATA Recommended Values of the - Fundamental Physical Constants: 2002. They may be found at - physics.nist.gov/constants. The values are stored in the dictionary - physical_constants as a tuple containing the value, the units, and - the relative precision, in that order. All constants are in SI units - unless otherwise stated. - - Several helper functions are provided: - - value(key) returns the value of the physical constant. - unit(key) returns the units of the physical constant. - precision(key) returns the relative precision of the physical constant. - find(sub) prints out a list of keys containing the string sub. -""" - -import string -from math import pi, sqrt -__all__ = ['physical_constants', 'value', 'unit', 'precision', 'find'] - - -""" -From: http://physics.nist.gov/constants - -Source: Peter J. Mohr and Barry N. Taylor, CODATA Recommended Values of the - Fundamental Physical Constants: 2002, published in Rev. Mod. Phys. - vol. 77(1) 1-107 (2005). - - -Quantity Value Uncertainty Unit -""" -txt = """speed of light in vacuum 299 792 458 0 m s^-1 -magn. constant 12.566 370 614...e-7 0 N A^-2 -electric constant 8.854 187 817...e-12 0 F m^-1 -characteristic impedance of vacuum 376.730 313 461... 0 ohm -Newtonian constant of gravitation 6.6742e-11 0.0010e-11 m^3 kg^-1 s^-2 -Newtonian constant of gravitation over h-bar c 6.7087e-39 0.0010e-39 (GeV/c^2)^-2 -Planck constant 6.626 0693e-34 0.000 0011e-34 J s -Planck constant in eV s 4.135 667 43e-15 0.000 000 35e-15 eV s -Planck constant over 2 pi times c in MeV fm 197.326 968 0.000 017 MeV fm -Planck constant over 2 pi 1.054 571 68e-34 0.000 000 18e-34 J s -Planck constant over 2 pi in eV s 6.582 119 15e-16 0.000 000 56e-16 eV s -Planck mass 2.176 45e-8 0.000 16e-8 kg -Planck temperature 1.416 79e32 0.000 11e32 K -Planck length 1.616 24e-35 0.000 12e-35 m -Planck time 5.391 21e-44 0.000 40e-44 s -elementary charge 1.602 176 53e-19 0.000 000 14e-19 C -elementary charge over h 2.417 989 40e14 0.000 000 21e14 A J^-1 -magn. flux quantum 2.067 833 72e-15 0.000 000 18e-15 Wb -conductance quantum 7.748 091 733e-5 0.000 000 026e-5 S -inverse of conductance quantum 12 906.403 725 0.000 043 ohm -Josephson constant 483 597.879e9 0.041e9 Hz V^-1 -von Klitzing constant 25 812.807 449 0.000 086 ohm -Bohr magneton 927.400 949e-26 0.000 080e-26 J T^-1 -Bohr magneton in eV/T 5.788 381 804e-5 0.000 000 039e-5 eV T^-1 -Bohr magneton in Hz/T 13.996 2458e9 0.000 0012e9 Hz T^-1 -Bohr magneton in inverse meters per tesla 46.686 4507 0.000 0040 m^-1 T^-1 -Bohr magneton in K/T 0.671 7131 0.000 0012 K T^-1 -nuclear magneton 5.050 783 43e-27 0.000 000 43e-27 J T^-1 -nuclear magneton in eV/T 3.152 451 259e-8 0.000 000 021e-8 eV T^-1 -nuclear magneton in MHz/T 7.622 593 71 0.000 000 65 MHz T^-1 -nuclear magneton in inverse meters per tesla 2.542 623 58e-2 0.000 000 22e-2 m^-1 T^-1 -nuclear magneton in K/T 3.658 2637e-4 0.000 0064e-4 K T^-1 -fine-structure constant 7.297 352 568e-3 0.000 000 024e-3 -inverse fine-structure constant 137.035 999 11 0.000 000 46 -Rydberg constant 10 973 731.568 525 0.000 073 m^-1 -Rydberg constant times c in Hz 3.289 841 960 360e15 0.000 000 000 022e15 Hz -Rydberg constant times hc in J 2.179 872 09e-18 0.000 000 37e-18 J -Rydberg constant times hc in eV 13.605 6923 0.000 0012 eV -Bohr radius 0.529 177 2108e-10 0.000 000 0018e-10 m -Hartree energy 4.359 744 17e-18 0.000 000 75e-18 J -Hartree energy in eV 27.211 3845 0.000 0023 eV -quantum of circulation 3.636 947 550e-4 0.000 000 024e-4 m^2 s^-1 -quantum of circulation times 2 7.273 895 101e-4 0.000 000 048e-4 m^2 s^-1 -Fermi coupling constant 1.166 39e-5 0.000 01e-5 GeV^-2 -weak mixing angle 0.222 15 0.000 76 -electron mass 9.109 3826e-31 0.000 0016e-31 kg -electron mass in u 5.485 799 0945e-4 0.000 000 0024e-4 u -electron mass energy equivalent 8.187 1047e-14 0.000 0014e-14 J -electron mass energy equivalent in MeV 0.510 998 918 0.000 000 044 MeV -electron-muon mass ratio 4.836 331 67e-3 0.000 000 13e-3 -electron-tau mass ratio 2.875 64e-4 0.000 47e-4 -electron-proton mass ratio 5.446 170 2173e-4 0.000 000 0025e-4 -electron-neutron mass ratio 5.438 673 4481e-4 0.000 000 0038e-4 -electron-deuteron mass ratio 2.724 437 1095e-4 0.000 000 0013e-4 -electron to alpha particle mass ratio 1.370 933 555 75e-4 0.000 000 000 61e-4 -electron charge to mass quotient -1.758 820 12e11 0.000 000 15e11 C kg^-1 -electron molar mass 5.485 799 0945e-7 0.000 000 0024e-7 kg mol^-1 -Compton wavelength 2.426 310 238e-12 0.000 000 016e-12 m -Compton wavelength over 2 pi 386.159 2678e-15 0.000 0026e-15 m -classical electron radius 2.817 940 325e-15 0.000 000 028e-15 m -Thomson cross section 0.665 245 873e-28 0.000 000 013e-28 m^2 -electron magn. moment -928.476 412e-26 0.000 080e-26 J T^-1 -electron magn. moment to Bohr magneton ratio -1.001 159 652 1859 0.000 000 000 0038 -electron magn. moment to nuclear magneton ratio -1838.281 971 07 0.000 000 85 -electron magn. moment anomaly 1.159 652 1859e-3 0.000 000 0038e-3 -electron g factor -2.002 319 304 3718 0.000 000 000 0075 -electron-muon magn. moment ratio 206.766 9894 0.000 0054 -electron-proton magn. moment ratio -658.210 6862 0.000 0066 -electron to shielded proton magn. moment ratio -658.227 5956 0.000 0071 -electron-neutron magn. moment ratio 960.920 50 0.000 23 -electron-deuteron magn. moment ratio -2143.923 493 0.000 023 -electron to shielded helion magn. moment ratio 864.058 255 0.000 010 -electron gyromagn. ratio 1.760 859 74e11 0.000 000 15e11 s^-1 T^-1 -electron gyromagn. ratio over 2 pi 28 024.9532 0.0024 MHz T^-1 -muon mass 1.883 531 40e-28 0.000 000 33e-28 kg -muon mass in u 0.113 428 9264 0.000 000 0030 u -muon mass energy equivalent 1.692 833 60e-11 0.000 000 29e-11 J -muon mass energy equivalent in MeV 105.658 3692 0.000 0094 MeV -muon-electron mass ratio 206.768 2838 0.000 0054 -muon-tau mass ratio 5.945 92e-2 0.000 97e-2 -muon-proton mass ratio 0.112 609 5269 0.000 000 0029 -muon-neutron mass ratio 0.112 454 5175 0.000 000 0029 -muon molar mass 0.113 428 9264e-3 0.000 000 0030e-3 kg mol^-1 -muon Compton wavelength 11.734 441 05e-15 0.000 000 30e-15 m -muon Compton wavelength over 2 pi 1.867 594 298e-15 0.000 000 047e-15 m -muon magn. moment -4.490 447 99e-26 0.000 000 40e-26 J T^-1 -muon magn. moment to Bohr magneton ratio -4.841 970 45e-3 0.000 000 13e-3 -muon magn. moment to nuclear magneton ratio -8.890 596 98 0.000 000 23 -muon magn. moment anomaly 1.165 919 81e-3 0.000 000 62e-3 -muon g factor -2.002 331 8396 0.000 000 0012 -muon-proton magn. moment ratio -3.183 345 118 0.000 000 089 -tau mass 3.167 77e-27 0.000 52e-27 kg -tau mass in u 1.907 68 0.000 31 u -tau mass energy equivalent 2.847 05e-10 0.000 46e-10 J -tau mass energy equivalent in MeV 1776.99 0.29 MeV -tau-electron mass ratio 3477.48 0.57 -tau-muon mass ratio 16.8183 0.0027 -tau-proton mass ratio 1.893 90 0.000 31 -tau-neutron mass ratio 1.891 29 0.000 31 -tau molar mass 1.907 68e-3 0.000 31e-3 kg mol^-1 -tau Compton wavelength 0.697 72e-15 0.000 11e-15 m -tau Compton wavelength over 2 pi 0.111 046e-15 0.000 018e-15 m -proton mass 1.672 621 71e-27 0.000 000 29e-27 kg -proton mass in u 1.007 276 466 88 0.000 000 000 13 u -proton mass energy equivalent 1.503 277 43e-10 0.000 000 26e-10 J -proton mass energy equivalent in MeV 938.272 029 0.000 080 MeV -proton-electron mass ratio 1836.152 672 61 0.000 000 85 -proton-muon mass ratio 8.880 243 33 0.000 000 23 -proton-tau mass ratio 0.528 012 0.000 086 -proton-neutron mass ratio 0.998 623 478 72 0.000 000 000 58 -proton charge to mass quotient 9.578 833 76e7 0.000 000 82e7 C kg^-1 -proton molar mass 1.007 276 466 88e-3 0.000 000 000 13e-3 kg mol^-1 -proton Compton wavelength 1.321 409 8555e-15 0.000 000 0088e-15 m -proton Compton wavelength over 2 pi 0.210 308 9104e-15 0.000 000 0014e-15 m -proton magn. moment 1.410 606 71e-26 0.000 000 12e-26 J T^-1 -proton magn. moment to Bohr magneton ratio 1.521 032 206e-3 0.000 000 015e-3 -proton magn. moment to nuclear magneton ratio 2.792 847 351 0.000 000 028 -proton g factor 5.585 694 701 0.000 000 056 -proton-neutron magn. moment ratio -1.459 898 05 0.000 000 34 -shielded proton magn. moment 1.410 570 47e-26 0.000 000 12e-26 J T^-1 -shielded proton magn. moment to Bohr magneton ratio 1.520 993 132e-3 0.000 000 016e-3 -shielded proton magn. moment to nuclear magneton ratio 2.792 775 604 0.000 000 030 -proton magn. shielding correction 25.689e-6 0.015e-6 -proton gyromagn. ratio 2.675 222 05e8 0.000 000 23e8 s^-1 T^-1 -proton gyromagn. ratio over 2 pi 42.577 4813 0.000 0037 MHz T^-1 -shielded proton gyromagn. ratio 2.675 153 33e8 0.000 000 23e8 s^-1 T^-1 -shielded proton gyromagn. ratio over 2 pi 42.576 3875 0.000 0037 MHz T^-1 -proton rms charge radius 0.8750e-15 0.0068e-15 m -neutron mass 1.674 927 28e-27 0.000 000 29e-27 kg -neutron mass in u 1.008 664 915 60 0.000 000 000 55 u -neutron mass energy equivalent 1.505 349 57e-10 0.000 000 26e-10 J -neutron mass energy equivalent in MeV 939.565 360 0.000 081 MeV -neutron-electron mass ratio 1838.683 6598 0.000 0013 -neutron-muon mass ratio 8.892 484 02 0.000 000 23 -neutron-tau mass ratio 0.528 740 0.000 086 -neutron-proton mass ratio 1.001 378 418 70 0.000 000 000 58 -neutron molar mass 1.008 664 915 60e-3 0.000 000 000 55e-3 kg mol^-1 -neutron Compton wavelength 1.319 590 9067e-15 0.000 000 0088e-15 m -neutron Compton wavelength over 2 pi 0.210 019 4157e-15 0.000 000 0014e-15 m -neutron magn. moment -0.966 236 45e-26 0.000 000 24e-26 J T^-1 -neutron magn. moment to Bohr magneton ratio -1.041 875 63e-3 0.000 000 25e-3 -neutron magn. moment to nuclear magneton ratio -1.913 042 73 0.000 000 45 -neutron g factor -3.826 085 46 0.000 000 90 -neutron-electron magn. moment ratio 1.040 668 82e-3 0.000 000 25e-3 -neutron-proton magn. moment ratio -0.684 979 34 0.000 000 16 -neutron to shielded proton magn. moment ratio -0.684 996 94 0.000 000 16 -neutron gyromagn. ratio 1.832 471 83e8 0.000 000 46e8 s^-1 T^-1 -neutron gyromagn. ratio over 2 pi 29.164 6950 0.000 0073 MHz T^-1 -deuteron mass 3.343 583 35e-27 0.000 000 57e-27 kg -deuteron mass in u 2.013 553 212 70 0.000 000 000 35 u -deuteron mass energy equivalent 3.005 062 85e-10 0.000 000 51e-10 J -deuteron mass energy equivalent in MeV 1875.612 82 0.000 16 MeV -deuteron-electron mass ratio 3670.482 9652 0.000 0018 -deuteron-proton mass ratio 1.999 007 500 82 0.000 000 000 41 -deuteron molar mass 2.013 553 212 70e-3 0.000 000 000 35e-3 kg mol^-1 -deuteron magn. moment 0.433 073 482e-26 0.000 000 038e-26 J T^-1 -deuteron magn. moment to Bohr magneton ratio 0.466 975 4567e-3 0.000 000 0050e-3 -deuteron magn. moment to nuclear magneton ratio 0.857 438 2329 0.000 000 0092 -deuteron-electron magn. moment ratio -4.664 345 548e-4 0.000 000 050e-4 -deuteron-proton magn. moment ratio 0.307 012 2084 0.000 000 0045 -deuteron-neutron magn. moment ratio -0.448 206 52 0.000 000 11 -deuteron rms charge radius 2.1394e-15 0.0028e-15 m -helion mass 5.006 412 14e-27 0.000 000 86e-27 kg -helion mass in u 3.014 932 2434 0.000 000 0058 u -helion mass energy equivalent 4.499 538 84e-10 0.000 000 77e-10 J -helion mass energy equivalent in MeV 2808.391 42 0.000 24 MeV -helion-electron mass ratio 5495.885 269 0.000 011 -helion-proton mass ratio 2.993 152 6671 0.000 000 0058 -helion molar mass 3.014 932 2434e-3 0.000 000 0058e-3 kg mol^-1 -shielded helion magn. moment -1.074 553 024e-26 0.000 000 093e-26 J T^-1 -shielded helion magn. moment to Bohr magneton ratio -1.158 671 474e-3 0.000 000 014e-3 -shielded helion magn. moment to nuclear magneton ratio -2.127 497 723 0.000 000 025 -shielded helion to proton magn. moment ratio -0.761 766 562 0.000 000 012 -shielded helion to shielded proton magn. moment ratio -0.761 786 1313 0.000 000 0033 -shielded helion gyromagn. ratio 2.037 894 70e8 0.000 000 18e8 s^-1 T^-1 -shielded helion gyromagn. ratio over 2 pi 32.434 1015 0.000 0028 MHz T^-1 -alpha particle mass 6.644 6565e-27 0.000 0011e-27 kg -alpha particle mass in u 4.001 506 179 149 0.000 000 000 056 u -alpha particle mass energy equivalent 5.971 9194e-10 0.000 0010e-10 J -alpha particle mass energy equivalent in MeV 3727.379 17 0.000 32 MeV -alpha particle-electron mass ratio 7294.299 5363 0.000 0032 -alpha particle-proton mass ratio 3.972 599 689 07 0.000 000 000 52 -alpha particle molar mass 4.001 506 179 149e-3 0.000 000 000 056e-3 kg mol^-1 -Avogadro constant 6.022 1415e23 0.000 0010e23 mol^-1 -atomic mass constant 1.660 538 86e-27 0.000 000 28e-27 kg -atomic mass constant energy equivalent 1.492 417 90e-10 0.000 000 26e-10 J -atomic mass constant energy equivalent in MeV 931.494 043 0.000 080 MeV -Faraday constant 96 485.3383 0.0083 C mol^-1 -Faraday constant for conventional electric current 96 485.336 0.016 C_90 mol^-1 -molar Planck constant 3.990 312 716e-10 0.000 000 027e-10 J s mol^-1 -molar Planck constant times c 0.119 626 565 72 0.000 000 000 80 J m mol^-1 -molar gas constant 8.314 472 0.000 015 J mol^-1 K^-1 -Boltzmann constant 1.380 6505e-23 0.000 0024e-23 J K^-1 -Boltzmann constant in eV/K 8.617 343e-5 0.000 015e-5 eV K^-1 -Boltzmann constant in Hz/K 2.083 6644e10 0.000 0036e10 Hz K^-1 -Boltzmann constant in inverse meters per kelvin 69.503 56 0.000 12 m^-1 K^-1 -molar volume of ideal gas (273.15 K, 101.325 kPa) 22.413 996e-3 0.000 039e-3 m^3 mol^-1 -Loschmidt constant (273.15 K, 101.325 kPa) 2.686 7773e25 0.000 0047e25 m^-3 -molar volume of ideal gas (273.15 K, 100 kPa) 22.710 981e-3 0.000 040e-3 m^3 mol^-1 -Sackur-Tetrode constant (1 K, 100 kPa) -1.151 7047 0.000 0044 -Sackur-Tetrode constant (1 K, 101.325 kPa) -1.164 8677 0.000 0044 -Stefan-Boltzmann constant 5.670 400e-8 0.000 040e-8 W m^-2 K^-4 -first radiation constant 3.741 771 38e-16 0.000 000 64e-16 W m^2 -first radiation constant for spectral radiance 1.191 042 82e-16 0.000 000 20e-16 W m^2 sr^-1 -second radiation constant 1.438 7752e-2 0.000 0025e-2 m K -Wien displacement law constant 2.897 7685e-3 0.000 0051e-3 m K -molar mass of carbon-12 12e-3 0 kg mol^-1 -molar mass constant 1e-3 0 kg mol^-1 -conventional value of Josephson constant 483 597.9e9 0 Hz V^-1 -conventional value of von Klitzing constant 25 812.807 0 ohm -standard atmosphere 101 325 0 Pa -standard acceleration of gravity 9.806 65 0 m s^-2 -Cu x unit 1.002 077 10e-13 0.000 000 29e-13 m -Mo x unit 1.002 099 66e-13 0.000 000 53e-13 m -Angstrom star 1.000 015 09e-10 0.000 000 90e-10 m -lattice parameter of silicon 543.102 122e-12 0.000 020e-12 m -{220} lattice spacing of silicon 192.015 5965e-12 0.000 0070e-12 m -molar volume of silicon 12.058 8382e-6 0.000 0024e-6 m^3 mol^-1 -electron volt 1.602 176 53e-19 0.000 000 14e-19 J -unified atomic mass unit 1.660 538 86e-27 0.000 000 28e-27 kg -natural unit of velocity 299 792 458 0 m s^-1 -natural unit of action 1.054 571 68e-34 0.000 000 18e-34 J s -natural unit of action in eV s 6.582 119 15e-16 0.000 000 56e-16 eV s -natural unit of mass 9.109 3826e-31 0.000 0016e-31 kg -natural unit of energy 8.187 1047e-14 0.000 0014e-14 J -natural unit of energy in MeV 0.510 998 918 0.000 000 044 MeV -natural unit of momentum 2.730 924 19e-22 0.000 000 47e-22 kg m s^-1 -natural unit of momentum in MeV/c 0.510 998 918 0.000 000 044 MeV/c -natural unit of length 386.159 2678e-15 0.000 0026e-15 m -natural unit of time 1.288 088 6677e-21 0.000 000 0086e-21 s -atomic unit of charge 1.602 176 53e-19 0.000 000 14e-19 C -atomic unit of mass 9.109 3826e-31 0.000 0016e-31 kg -atomic unit of action 1.054 571 68e-34 0.000 000 18e-34 J s -atomic unit of length 0.529 177 2108e-10 0.000 000 0018e-10 m -atomic unit of energy 4.359 744 17e-18 0.000 000 75e-18 J -atomic unit of time 2.418 884 326 505e-17 0.000 000 000 016e-17 s -atomic unit of force 8.238 7225e-8 0.000 0014e-8 N -atomic unit of velocity 2.187 691 2633e6 0.000 000 0073e6 m s^-1 -atomic unit of momentum 1.992 851 66e-24 0.000 000 34e-24 kg m s^-1 -atomic unit of current 6.623 617 82e-3 0.000 000 57e-3 A -atomic unit of charge density 1.081 202 317e12 0.000 000 093e12 C m^-3 -atomic unit of electric potential 27.211 3845 0.000 0023 V -atomic unit of electric field 5.142 206 42e11 0.000 000 44e11 V m^-1 -atomic unit of electric field gradient 9.717 361 82e21 0.000 000 83e21 V m^-2 -atomic unit of electric dipole moment 8.478 353 09e-30 0.000 000 73e-30 C m -atomic unit of electric quadrupole moment 4.486 551 24e-40 0.000 000 39e-40 C m^2 -atomic unit of electric polarizablity 1.648 777 274e-41 0.000 000 016e-41 C^2 m^2 J^-1 -atomic unit of 1st hyperpolarizablity 3.206 361 51e-53 0.000 000 28e-53 C^3 m^3 J^-2 -atomic unit of 2nd hyperpolarizablity 6.235 3808e-65 0.000 0011e-65 C^4 m^4 J^-3 -atomic unit of magn. flux density 2.350 517 42e5 0.000 000 20e5 T -atomic unit of magn. dipole moment 1.854 801 90e-23 0.000 000 16e-23 J T^-1 -atomic unit of magnetizability 7.891 036 60e-29 0.000 000 13e-29 J T^-2 -atomic unit of permittivity 1.112 650 056...e-10 0 F m^-1 -joule-kilogram relationship 1.112 650 056...e-17 0 kg -joule-inverse meter relationship 5.034 117 20e24 0.000 000 86e24 m^-1 -joule-hertz relationship 1.509 190 37e33 0.000 000 26e33 Hz -joule-kelvin relationship 7.242 963e22 0.000 013e22 K -joule-electron volt relationship 6.241 509 47e18 0.000 000 53e18 eV -joule-atomic mass unit relationship 6.700 5361e9 0.000 0011e9 u -joule-hartree relationship 2.293 712 57e17 0.000 000 39e17 E_h -kilogram-joule relationship 8.987 551 787...e16 0 J -kilogram-inverse meter relationship 4.524 438 91e41 0.000 000 77e41 m^-1 -kilogram-hertz relationship 1.356 392 66e50 0.000 000 23e50 Hz -kilogram-kelvin relationship 6.509 650e39 0.000 011e39 K -kilogram-electron volt relationship 5.609 588 96e35 0.000 000 48e35 eV -kilogram-atomic mass unit relationship 6.022 1415e26 0.000 0010e26 u -kilogram-hartree relationship 2.061 486 05e34 0.000 000 35e34 E_h -inverse meter-joule relationship 1.986 445 61e-25 0.000 000 34e-25 J -inverse meter-kilogram relationship 2.210 218 81e-42 0.000 000 38e-42 kg -inverse meter-hertz relationship 299 792 458 0 Hz -inverse meter-kelvin relationship 1.438 7752e-2 0.000 0025e-2 K -inverse meter-electron volt relationship 1.239 841 91e-6 0.000 000 11e-6 eV -inverse meter-atomic mass unit relationship 1.331 025 0506e-15 0.000 000 0089e-15 u -inverse meter-hartree relationship 4.556 335 252 760e-8 0.000 000 000 030e-8 E_h -hertz-joule relationship 6.626 0693e-34 0.000 0011e-34 J -hertz-kilogram relationship 7.372 4964e-51 0.000 0013e-51 kg -hertz-inverse meter relationship 3.335 640 951...e-9 0 m^-1 -hertz-kelvin relationship 4.799 2374e-11 0.000 0084e-11 K -hertz-electron volt relationship 4.135 667 43e-15 0.000 000 35e-15 eV -hertz-atomic mass unit relationship 4.439 821 667e-24 0.000 000 030e-24 u -hertz-hartree relationship 1.519 829 846 006e-16 0.000 000 000 010e-16 E_h -kelvin-joule relationship 1.380 6505e-23 0.000 0024e-23 J -kelvin-kilogram relationship 1.536 1808e-40 0.000 0027e-40 kg -kelvin-inverse meter relationship 69.503 56 0.000 12 m^-1 -kelvin-hertz relationship 2.083 6644e10 0.000 0036e10 Hz -kelvin-electron volt relationship 8.617 343e-5 0.000 015e-5 eV -kelvin-atomic mass unit relationship 9.251 098e-14 0.000 016e-14 u -kelvin-hartree relationship 3.166 8153e-6 0.000 0055e-6 E_h -electron volt-joule relationship 1.602 176 53e-19 0.000 000 14e-19 J -electron volt-kilogram relationship 1.782 661 81e-36 0.000 000 15e-36 kg -electron volt-inverse meter relationship 8.065 544 45e5 0.000 000 69e5 m^-1 -electron volt-hertz relationship 2.417 989 40e14 0.000 000 21e14 Hz -electron volt-kelvin relationship 1.160 4505e4 0.000 0020e4 K -electron volt-atomic mass unit relationship 1.073 544 171e-9 0.000 000 092e-9 u -electron volt-hartree relationship 3.674 932 45e-2 0.000 000 31e-2 E_h -atomic mass unit-joule relationship 1.492 417 90e-10 0.000 000 26e-10 J -atomic mass unit-kilogram relationship 1.660 538 86e-27 0.000 000 28e-27 kg -atomic mass unit-inverse meter relationship 7.513 006 608e14 0.000 000 050e14 m^-1 -atomic mass unit-hertz relationship 2.252 342 718e23 0.000 000 015e23 Hz -atomic mass unit-kelvin relationship 1.080 9527e13 0.000 0019e13 K -atomic mass unit-electron volt relationship 931.494 043e6 0.000 080e6 eV -atomic mass unit-hartree relationship 3.423 177 686e7 0.000 000 023e7 E_h -hartree-joule relationship 4.359 744 17e-18 0.000 000 75e-18 J -hartree-kilogram relationship 4.850 869 60e-35 0.000 000 83e-35 kg -hartree-inverse meter relationship 2.194 746 313 705e7 0.000 000 000 015e7 m^-1 -hartree-hertz relationship 6.579 683 920 721e15 0.000 000 000 044e15 Hz -hartree-kelvin relationship 3.157 7465e5 0.000 0055e5 K -hartree-electron volt relationship 27.211 3845 0.000 0023 eV -hartree-atomic mass unit relationship 2.921 262 323e-8 0.000 000 019e-8 u""" - - - -#parse into a dict -physical_constants = {} -for line in txt.split('\n'): - name = line[:55].rstrip().replace('magn.','magnetic') - val = line[55:77].replace(' ','').replace('...','') - val = float(val) - uncert = line[77:99].replace(' ','') - uncert = float(uncert) - units = line[99:].rstrip() - physical_constants[name] = (val, units, uncert) - -def value(key) : - """value indexed by key""" - return physical_constants[key][0] - -def unit(key) : - """unit indexed by key""" - return physical_constants[key][1] - -def precision(key) : - """relative precision indexed by key""" - return physical_constants[key][2] / physical_constants[key][0] - -def find(sub) : - """list all keys containing the string sub""" - l_sub = string.lower(sub) - result = [] - for key in physical_constants : - l_key = string.lower(key) - if l_sub in l_key: - result.append(key) - result.sort() - for key in result : - print key - -#table is lacking some digits for exact values: calculate from definition - -c = value('speed of light in vacuum') -mu0 = 4e-7*pi -epsilon0 = 1/(mu0*c*c) - -exact_values = { -'magnetic constant': (mu0, 'N A^-2', 0.0), -'electric constant': (epsilon0, 'F m^-1', 0.0), -'characteristic impedance of vacuum': (sqrt(mu0/epsilon0), 'ohm', 0.0), -'atomic unit of permittivity': (4*epsilon0*pi, 'F m^-1', 0.0), #is that the definition? -'joule-kilogram relationship': (1/(c*c), 'kg', 0.0), -'kilogram-joule relationship': (c*c, 'J', 0.0), -'hertz-inverse meter relationship': (1/c, 'm^-1', 0.0) -} - -#sanity check -for key in exact_values: - assert (exact_values[key][0]-value(key)) / value(key) < 1e-9 - -physical_constants.update(exact_values) - -#check update -for key in exact_values: - assert (exact_values[key][0]-value(key)) / value(key) == 0 Copied: trunk/scipy/constants/codata.py (from rev 4107, trunk/scipy/sandbox/constants/codata.py) Deleted: trunk/scipy/constants/constants.py =================================================================== --- trunk/scipy/sandbox/constants/constants.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/constants/constants.py 2008-04-08 03:08:38 UTC (rev 4108) @@ -1,205 +0,0 @@ -""" -Collection of physical constants and conversion factors. - -Most constants are in SI units, so you can do -print '10 mile per minute is', 10*mile/minute, 'm/s or', 10*mile/(minute*knot), 'knots' - -The list is not meant to be comprehensive, but just a convenient list for everyday use. -""" - -""" -BasSw 2006 -physical constants: imported from CODATA -unit conversion: see e.g. NIST special publication 811 -Use at own risk: double-check values before calculating your Mars orbit-insertion burn. -Some constants exist in a few variants, which are marked with suffixes. -The ones without any suffix should be the most common one. -""" - -import math as _math -from codata import value as _cd - -#mathematical constants -pi = _math.pi -golden = golden_ratio = (1 + _math.sqrt(5)) / 2 - -#SI prefixes -yotta = 1e24 -zetta = 1e21 -exa = 1e18 -peta = 1e15 -tera = 1e12 -giga = 1e9 -mega = 1e6 -kilo = 1e3 -hecto = 1e2 -deka = 1e1 -deci = 1e-1 -centi = 1e-2 -milli = 1e-3 -micro = 1e-6 -nano = 1e-9 -pico = 1e-12 -femto = 1e-15 -atto = 1e-18 -zepto = 1e-21 - -#binary prefixes -kibi = 2**10 -mebi = 2**20 -gibi = 2**30 -tebi = 2**40 -pebi = 2**50 -exbi = 2**60 -zebi = 2**70 -yobi = 2**80 - -#physical constants -c = speed_of_light = _cd('speed of light in vacuum') -mu_0 = 4e-7*pi -epsilon_0 = 1 / (mu_0*c*c) -h = Planck = _cd('Planck constant') -hbar = h / (2 * pi) -G = gravitational_constant = _cd('Newtonian constant of gravitation') -g = _cd('standard acceleration of gravity') -e = elementary_charge = _cd('elementary charge') -R = gas_constant = _cd('molar gas constant') -alpha = fine_structure = _cd('fine-structure constant') -N_A = Avogadro = _cd('Avogadro constant') -k = Bolzmann = _cd('Boltzmann constant') -sigma = Stefan_Bolzmann = _cd('Stefan-Boltzmann constant') -Wien = _cd('Wien displacement law constant') -Rydberg = _cd('Rydberg constant') - -#weight in kg -gram = 1e-3 -metric_ton = 1e3 -grain = 64.79891e-6 -lb = pound = 7000 * grain #avoirdupois -oz = ounce = pound / 16 -stone = 14 * pound -long_ton = 2240 * pound -short_ton = 2000 * pound - -troy_ounce = 480 * grain #only for metals / gems -troy_pound = 12 * troy_ounce -carat = 200e-6 - -m_e = electron_mass = _cd('electron mass') -m_p = proton_mass = _cd('proton mass') -m_n = neutron_mass = _cd('neutron mass') -m_u = u = atomic_mass = _cd('atomic mass constant') - -#angle in rad -degree = pi / 180 -arcmin = arcminute = degree / 60 -arcsec = arcsecond = arcmin / 60 - -#time in second -minute = 60.0 -hour = 60 * minute -day = 24 * hour -week = 7 * day -year = 365 * day -Julian_year = 365.25 * day - -#length in meter -inch = 0.0254 -foot = 12 * inch -yard = 3 * foot -mile = 1760 * yard -mil = inch / 1000 -pt = point = inch / 72 #typography -survey_foot = 1200.0 / 3937 -survey_mile = 5280 * survey_foot -nautical_mile = 1852.0 -fermi = 1e-15 -angstrom = 1e-10 -micron = 1e-6 -au = astronomical_unit = 149597870691.0 -light_year = Julian_year * c -parsec = au / arcsec - -#pressure in pascal -atm = atmosphere = _cd('standard atmosphere') -bar = 1e5 -torr = mmHg = atm / 760 -psi = pound * g / (inch * inch) - -#area in meter**2 -hectare = 1e4 -acre = 43560 * foot**2 - -#volume in meter**3 -litre = liter = 1e-3 -gallon = gallon_US = 231 * inch**3 #US -#pint = gallon_US / 8 -fluid_ounce = fluid_ounce_US = gallon_US / 128 -bbl = barrel = 42 * gallon_US #for oil - -gallon_imp = 4.54609e-3 #uk -fluid_ounce_imp = gallon_imp / 160 - -#speed in meter per second -kmh = 1e3 / hour -mph = mile / hour -mach = speed_of_sound = 340.5 #approx value at 15 degrees in 1 atm. is this a common value? -knot = nautical_mile / hour - -#temperature in kelvin -zero_Celsius = 273.15 -degree_Fahrenheit = 1/1.8 #only for differences - -#energy in joule -eV = electron_volt = elementary_charge # * 1 Volt -calorie = calorie_th = 4.184 -calorie_IT = 4.1868 -erg = 1e-7 -Btu_th = pound * degree_Fahrenheit * calorie_th / gram -Btu = Btu_IT = pound * degree_Fahrenheit * calorie_IT / gram -ton_TNT = 1e9 * calorie_th -#Wh = watt_hour - -#power in watt -hp = horsepower = 550 * foot * pound * g - -#force in newton -dyn = dyne = 1e-5 -lbf = pound_force = pound * g -kgf = kilogram_force = g # * 1 kg - -#functions for conversions that are not linear - -def C2K(C): - """Convert Celcius to Kelvin""" - return C + zero_Celsius - -def K2C(K): - """Convert Kelvin to Celcius""" - return K - zero_Celsius - -def F2C(F): - """Convert Fahrenheit to Celcius""" - return (F - 32) / 1.8 - -def C2F(C): - """Convert Celcius to Fahrenheit""" - return 1.8 * C + 32 - -def F2K(F): - """Convert Fahrenheit to Kelvin""" - return C2K(F2C(F)) - -def K2F(k): - """Convert Kelvin to Fahrenheit""" - return C2F(K2C(K)) - -#optics - -def lambda2nu(lambda_): - """Convert wavelength to optical frequency""" - return c / lambda_ - -def nu2lambda(nu): - """Convert optical frequency to wavelength""" - return c / nu Copied: trunk/scipy/constants/constants.py (from rev 4107, trunk/scipy/sandbox/constants/constants.py) Deleted: trunk/scipy/constants/setup.py =================================================================== --- trunk/scipy/sandbox/constants/setup.py 2008-04-07 22:08:16 UTC (rev 4101) +++ trunk/scipy/constants/setup.py 2008-04-08 03:08:38 UTC (rev 4108) @@ -1,11 +0,0 @@ -def configuration(parent_package='',top_path=None): - from numpy.distutils.misc_util import Configuration - config = Configuration('constants',parent_package,top_path) - - config.add_subpackage('*') - - return config - -if __name__ == '__main__': - from numpy.distutils.core import setup - setup(**configuration(top_path='').todict()) Copied: trunk/scipy/constants/setup.py (from rev 4107, trunk/scipy/sandbox/constants/setup.py) Modified: trunk/scipy/setup.py =================================================================== --- trunk/scipy/setup.py 2008-04-08 03:07:28 UTC (rev 4107) +++ trunk/scipy/setup.py 2008-04-08 03:08:38 UTC (rev 4108) @@ -3,6 +3,7 @@ from numpy.distutils.misc_util import Configuration config = Configuration('scipy',parent_package,top_path) config.add_subpackage('cluster') + config.add_subpackage('constants') config.add_subpackage('fftpack') config.add_subpackage('integrate') config.add_subpackage('interpolate') From scipy-svn at scipy.org Mon Apr 7 23:18:30 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 22:18:30 -0500 (CDT) Subject: [Scipy-svn] r4109 - trunk/scipy/sparse/linalg/eigen/arpack Message-ID: <20080408031830.CB19739C04B@new.scipy.org> Author: cdavid Date: 2008-04-07 22:18:19 -0500 (Mon, 07 Apr 2008) New Revision: 4109 Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct Log: Add path to find header for F77 source files in scons for arpack. Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-08 03:08:38 UTC (rev 4108) +++ trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-08 03:18:19 UTC (rev 4109) @@ -33,6 +33,7 @@ src = [str(s) for s in arpack_src] env.AppendUnique(CPPPATH = pjoin('ARPACK', 'SRC')) +env.AppendUnique(F77PATH = pjoin('ARPACK', 'SRC')) env.AppendUnique(LIBPATH = env['build_dir']) arpack_lib = env.NumpyStaticExtLibrary('arpack', source = src) From scipy-svn at scipy.org Tue Apr 8 00:01:22 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 23:01:22 -0500 (CDT) Subject: [Scipy-svn] r4110 - trunk/scipy/sparse/linalg/dsolve Message-ID: <20080408040122.08E5739C091@new.scipy.org> Author: cdavid Date: 2008-04-07 23:01:14 -0500 (Mon, 07 Apr 2008) New Revision: 4110 Modified: trunk/scipy/sparse/linalg/dsolve/SConstruct Log: Fix link order issue. Modified: trunk/scipy/sparse/linalg/dsolve/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/dsolve/SConstruct 2008-04-08 03:18:19 UTC (rev 4109) +++ trunk/scipy/sparse/linalg/dsolve/SConstruct 2008-04-08 04:01:14 UTC (rev 4110) @@ -38,10 +38,10 @@ # Build python extensions pyenv = env.Clone() pyenv.Append(CPPPATH = [get_numpy_include_dirs(), env['src_dir']]) +pyenv.Prepend(LIBS = superlu) common_src = ['_superlu_utils.c', '_superluobject.c'] for prec in ['z', 'd', 'c', 's']: pyenv.NumpyPythonExtension('_%ssuperlu' % prec, source = common_src + \ - ['_%ssuperlumodule.c' % prec], - LIBS = superlu) + ['_%ssuperlumodule.c' % prec]) From scipy-svn at scipy.org Tue Apr 8 00:01:49 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 23:01:49 -0500 (CDT) Subject: [Scipy-svn] r4111 - trunk/scipy/sparse/linalg/eigen/arpack Message-ID: <20080408040149.2358839C091@new.scipy.org> Author: cdavid Date: 2008-04-07 23:01:45 -0500 (Mon, 07 Apr 2008) New Revision: 4111 Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct Log: Fix F77PATH for include. Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-08 04:01:14 UTC (rev 4110) +++ trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-08 04:01:45 UTC (rev 4111) @@ -33,7 +33,7 @@ src = [str(s) for s in arpack_src] env.AppendUnique(CPPPATH = pjoin('ARPACK', 'SRC')) -env.AppendUnique(F77PATH = pjoin('ARPACK', 'SRC')) +env.AppendUnique(F77PATH = pjoin(env['src_dir'], 'ARPACK', 'SRC')) env.AppendUnique(LIBPATH = env['build_dir']) arpack_lib = env.NumpyStaticExtLibrary('arpack', source = src) From scipy-svn at scipy.org Tue Apr 8 00:11:27 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 23:11:27 -0500 (CDT) Subject: [Scipy-svn] r4112 - trunk/scipy/special Message-ID: <20080408041127.3456A39C097@new.scipy.org> Author: cdavid Date: 2008-04-07 23:11:23 -0500 (Mon, 07 Apr 2008) New Revision: 4112 Modified: trunk/scipy/special/SConstruct Log: Change name of static specfunc lib to avoid clash names on windows between the imp lib and the pyton wrapper. Modified: trunk/scipy/special/SConstruct =================================================================== --- trunk/scipy/special/SConstruct 2008-04-08 04:01:45 UTC (rev 4111) +++ trunk/scipy/special/SConstruct 2008-04-08 04:11:23 UTC (rev 4112) @@ -41,9 +41,9 @@ build_lib('toms', '.f') build_lib('amos', '.f') build_lib('cdflib', '.f', 'cdf') -build_lib('specfun', '.f') +build_lib('specfunlib', '.f') -env.AppendUnique(LIBPATH = env['build_dir']) +env.AppendUnique(LIBPATH = [env['build_dir']]) # Cephes extension src = ['_cephesmodule.c', 'amos_wrappers.c', 'specfun_wrappers.c', \ @@ -52,10 +52,10 @@ env.NumpyPythonExtension('_cephes', source = src, LIBS = ['amos', 'toms', 'c_misc', 'cephes', 'mach',\ - 'cdf', 'specfun'], + 'cdf', 'specfunlib'], LINKFLAGSEND = env['F77_LDFLAGS']) # Specfun extension -env.NumpyPythonExtension('specfun', source = 'specfun.pyf', LIBS = 'specfun', \ +env.NumpyPythonExtension('specfun', source = 'specfun.pyf', LIBS = 'specfunlib', \ F2PYOPTIONS = ["--no-wrap-functions"], LINKFLAGSEND = env['F77_LDFLAGS']) From scipy-svn at scipy.org Tue Apr 8 00:31:28 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 7 Apr 2008 23:31:28 -0500 (CDT) Subject: [Scipy-svn] r4113 - trunk/scipy/stats Message-ID: <20080408043128.60D7139C091@new.scipy.org> Author: cdavid Date: 2008-04-07 23:31:24 -0500 (Mon, 07 Apr 2008) New Revision: 4113 Modified: trunk/scipy/stats/SConstruct Log: use a list for libpath arg in scons script of stats module Modified: trunk/scipy/stats/SConstruct =================================================================== --- trunk/scipy/stats/SConstruct 2008-04-08 04:11:23 UTC (rev 4112) +++ trunk/scipy/stats/SConstruct 2008-04-08 04:31:24 UTC (rev 4113) @@ -19,7 +19,7 @@ src = env.NumpyGlob(pjoin('statlib', '*.f' )) env.NumpyStaticExtLibrary('statlib', source = src) -env.AppendUnique(LIBPATH = env['build_dir']) +env.AppendUnique(LIBPATH = [env['build_dir']]) # Statlib extension env.NumpyPythonExtension('statlib', source = 'statlib.pyf', From scipy-svn at scipy.org Tue Apr 8 09:55:41 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 08:55:41 -0500 (CDT) Subject: [Scipy-svn] r4114 - trunk/scipy/sparse/linalg/eigen/lobpcg Message-ID: <20080408135541.00C0D39C238@new.scipy.org> Author: rc Date: 2008-04-08 08:55:37 -0500 (Tue, 08 Apr 2008) New Revision: 4114 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py Log: removed symeig dependence, added symeig() function, some fixes Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 04:31:24 UTC (rev 4113) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 13:55:37 UTC (rev 4114) @@ -5,9 +5,6 @@ License: BSD -Depends upon symeig (http://mdp-toolkit.sourceforge.net/symeig.html) for the -moment, as the symmetric eigenvalue solvers were not available in scipy. - (c) Robert Cimrman, Andrew Knyazev Examples in tests directory contributed by Nils Wagner. @@ -21,12 +18,48 @@ import scipy.sparse as sp import scipy.io as io from scipy.sparse.linalg import aslinearoperator, LinearOperator +import scipy.linalg as sla -try: - from symeig import symeig -except: - raise ImportError('lobpcg requires symeig') +## try: +## from symeig import symeig +## except: +## raise ImportError('lobpcg requires symeig') +def symeig( mtxA, mtxB = None, eigenvectors = True, select = None ): + import scipy.lib.lapack as ll + if select is None: + if nm.iscomplexobj( mtxA ): + if mtxB is None: + fun = ll.get_lapack_funcs( ['heev'], arrays = (mtxA,) )[0] + else: + fun = ll.get_lapack_funcs( ['hegv'], arrays = (mtxA,) )[0] + else: + if mtxB is None: + fun = ll.get_lapack_funcs( ['syev'], arrays = (mtxA,) )[0] + else: + fun = ll.get_lapack_funcs( ['sygv'], arrays = (mtxA,) )[0] +## print fun + w, v, info = fun( mtxA, mtxB ) +## print w +## print v +## print info +## from symeig import symeig +## print symeig( mtxA, mtxB ) + else: + out = sla.eig( mtxA, mtxB, right = eigenvectors ) + w = out[0] + ii = nm.argsort( w ) + w = w[slice( *select )] + if eigenvectors: + v = out[1][:,ii] + v = v[:,slice( *select )] + + if eigenvectors: + out = w, v + else: + out = w + return out + def pause(): raw_input() @@ -77,7 +110,7 @@ def applyConstraints( blockVectorV, factYBY, blockVectorBY, blockVectorY ): """Internal. Changes blockVectorV in place.""" gramYBV = sc.dot( blockVectorBY.T, blockVectorV ) - tmp = sc.linalg.cho_solve( factYBY, gramYBV ) + tmp = sla.cho_solve( factYBY, gramYBV ) blockVectorV -= sc.dot( blockVectorY, tmp ) @@ -90,8 +123,8 @@ else: blockVectorBV = blockVectorV # Shared data!!! gramVBV = sc.dot( blockVectorV.T, blockVectorBV ) - gramVBV = sc.linalg.cholesky( gramVBV ) - sc.linalg.inv( gramVBV, overwrite_a = True ) + gramVBV = sla.cholesky( gramVBV ) + sla.inv( gramVBV, overwrite_a = True ) # gramVBV is now R^{-1}. blockVectorV = sc.dot( blockVectorV, gramVBV ) if B is not None: @@ -202,9 +235,9 @@ if B is not None: B_dense = B(nm.eye(n)) - _lambda, eigBlockVector = symeig(A_dense, B_dense, range=lohi ) + _lambda, eigBlockVector = symeig(A_dense, B_dense, select=lohi ) else: - _lambda, eigBlockVector = symeig(A_dense, range=lohi ) + _lambda, eigBlockVector = symeig(A_dense, select=lohi ) return _lambda, eigBlockVector @@ -248,7 +281,7 @@ gramYBY = sc.dot( blockVectorY.T, blockVectorBY ) try: # gramYBY is a Cholesky factor from now on... - gramYBY = sc.linalg.cho_factor( gramYBY ) + gramYBY = sla.cho_factor( gramYBY ) except: raise ValueError('cannot handle linearly dependent constraints') @@ -513,14 +546,14 @@ return as2d( y ) -# precond = spdiags( ivals, 0, n, n ) - + precond = spdiags( ivals, 0, n, n ) +# precond = None tt = time.clock() eigs, vecs = lobpcg( X, A, B, blockVectorY = Y, M = precond, residualTolerance = 1e-4, maxIterations = 40, largest = False, verbosityLevel = 1 ) print 'solution time:', time.clock() - tt - print eigs print vecs + print eigs From scipy-svn at scipy.org Tue Apr 8 10:46:59 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 09:46:59 -0500 (CDT) Subject: [Scipy-svn] r4115 - trunk/scipy/sparse/linalg/eigen/lobpcg Message-ID: <20080408144659.E286339C048@new.scipy.org> Author: rc Date: 2008-04-08 09:46:52 -0500 (Tue, 08 Apr 2008) New Revision: 4115 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/info.py trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py Log: lobpcg fixes Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/info.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-08 13:55:37 UTC (rev 4114) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-08 14:46:52 UTC (rev 4115) @@ -63,10 +63,10 @@ The LOBPCG code internally solves eigenproblems of the size 3``m`` on every iteration by calling the "standard" dense eigensolver, so if ``m`` is not small enough compared to ``n``, it does not make sense to call the LOBPCG -code, but rather one should use the "standard" eigensolver, e.g. symeig +code, but rather one should use the "standard" eigensolver, e.g. scipy or symeig function in this case. If one calls the LOBPCG algorithm for 5``m``>``n``, -it will most likely break internally, so the code tries to call symeig -instead. +it will most likely break internally, so the code tries to call the standard +function instead. It is not that n should be large for the LOBPCG to work, but rather the ratio ``n``/``m`` should be large. It you call the LOBPCG code with ``m``=1 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 13:55:37 UTC (rev 4114) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 14:46:52 UTC (rev 4115) @@ -39,7 +39,10 @@ else: fun = ll.get_lapack_funcs( ['sygv'], arrays = (mtxA,) )[0] ## print fun - w, v, info = fun( mtxA, mtxB ) + if mtxB is None: + out = fun( mtxA ) + else: + out = fun( mtxA, mtxB ) ## print w ## print v ## print info @@ -51,14 +54,13 @@ ii = nm.argsort( w ) w = w[slice( *select )] if eigenvectors: - v = out[1][:,ii] - v = v[:,slice( *select )] + v = out[1][:,ii] + v = v[:,slice( *select )] + out = w, v, 0 + else: + out = w, 0 - if eigenvectors: - out = w, v - else: - out = w - return out + return out[:-1] def pause(): raw_input() @@ -549,6 +551,7 @@ precond = spdiags( ivals, 0, n, n ) # precond = None tt = time.clock() +# B = None eigs, vecs = lobpcg( X, A, B, blockVectorY = Y, M = precond, residualTolerance = 1e-4, maxIterations = 40, From scipy-svn at scipy.org Tue Apr 8 15:42:12 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 14:42:12 -0500 (CDT) Subject: [Scipy-svn] r4116 - trunk/scipy/sparse/linalg/eigen Message-ID: <20080408194212.C8F0739C2AA@new.scipy.org> Author: wnbell Date: 2008-04-08 14:42:08 -0500 (Tue, 08 Apr 2008) New Revision: 4116 Modified: trunk/scipy/sparse/linalg/eigen/__init__.py trunk/scipy/sparse/linalg/eigen/setup.py Log: reenabled lobpcg support Modified: trunk/scipy/sparse/linalg/eigen/__init__.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/__init__.py 2008-04-08 14:46:52 UTC (rev 4115) +++ trunk/scipy/sparse/linalg/eigen/__init__.py 2008-04-08 19:42:08 UTC (rev 4116) @@ -3,6 +3,7 @@ from info import __doc__ from arpack import * +from lobpcg import * __all__ = filter(lambda s:not s.startswith('_'),dir()) from scipy.testing.pkgtester import Tester Modified: trunk/scipy/sparse/linalg/eigen/setup.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-08 14:46:52 UTC (rev 4115) +++ trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-08 19:42:08 UTC (rev 4116) @@ -6,7 +6,7 @@ config = Configuration('eigen',parent_package,top_path) config.add_subpackage(('arpack')) - #config.add_subpackage(('lobpcg')) + config.add_subpackage(('lobpcg')) return config From scipy-svn at scipy.org Tue Apr 8 15:53:56 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 14:53:56 -0500 (CDT) Subject: [Scipy-svn] r4117 - trunk/scipy/sparse/linalg Message-ID: <20080408195356.BB03D39C35F@new.scipy.org> Author: stefan Date: 2008-04-08 14:53:27 -0500 (Tue, 08 Apr 2008) New Revision: 4117 Modified: trunk/scipy/sparse/linalg/interface.py Log: Clean up interface. Modified: trunk/scipy/sparse/linalg/interface.py =================================================================== --- trunk/scipy/sparse/linalg/interface.py 2008-04-08 19:42:08 UTC (rev 4116) +++ trunk/scipy/sparse/linalg/interface.py 2008-04-08 19:53:27 UTC (rev 4117) @@ -9,44 +9,46 @@ """Common interface for performing matrix vector products Many iterative methods (e.g. cg, gmres) do not need to know the - individual entries of a matrix to solve a linear system A*x=b. - Such solvers only require the computation of matrix vector + individual entries of a matrix to solve a linear system A*x=b. + Such solvers only require the computation of matrix vector products, A*v where v is a dense vector. This class serves as an abstract interface between iterative solvers and matrix-like objects. - Required Parameters - ------------------- - shape : tuple of matrix dimensions (M,N) - matvec(x) : function that returns A * v + Parameters + ---------- + shape : tuple + Matrix dimensions (M,N) + matvec : callable f(v) + Returns returns A * v Optional Parameters ------------------- - rmatvec(v) : function that returns A^H * v where A^H represents - the Hermitian (conjugate) transpose of A - matmat(V) : function that returns A * V where V is a dense - matrix with dimensions (N,K) - dtype : data type of the matrix - + rmatvec : callable f(v) + Returns A^H * v, where A^H represents the Hermitian + (conjugate) transpose of A. + matmat : callable f(V) + Returns A * V, where V is a dense matrix with dimensions (N,K). + dtype : dtype + Data type of the matrix. See Also -------- - aslinearoperator() : Construct LinearOperators for SciPy classes + aslinearoperator : Construct LinearOperators Examples -------- - >>> from scipy.sparse.linalg import LinearOperator >>> from scipy import * >>> def mv(v): ... return array([ 2*v[0], 3*v[1]]) - ... + ... >>> A = LinearOperator( (2,2), matvec=mv ) >>> A <2x2 LinearOperator with unspecified dtype> >>> A.matvec( ones(2) ) array([ 2., 3.]) - + """ def __init__( self, shape, matvec, rmatvec=None, matmat=None, dtype=None ): @@ -87,27 +89,25 @@ return '<%dx%d LinearOperator with %s>' % (M,N,dt) def aslinearoperator(A): - """Return A as a LinearOperator + """Return A as a LinearOperator. - 'A' may be any of the following types - - ndarray - - matrix - - sparse matrix (e.g. csr_matrix, lil_matrix, etc.) - - LinearOperator - - An object with .shape and .matvec attributes + 'A' may be any of the following types: + - ndarray + - matrix + - sparse matrix (e.g. csr_matrix, lil_matrix, etc.) + - LinearOperator + - An object with .shape and .matvec attributes See the LinearOperator documentation for additonal information. Examples - ======== - + -------- >>> from scipy import matrix >>> M = matrix( [[1,2,3],[4,5,6]], dtype='int32' ) >>> aslinearoperator( M ) <2x3 LinearOperator with dtype=int32> """ - if isinstance(A, LinearOperator): return A @@ -123,12 +123,12 @@ return dot(A.conj().transpose(), v) def matmat(V): return dot(A, V) - return LinearOperator( A.shape, matvec, rmatvec=rmatvec, \ - matmat=matmat, dtype=A.dtype ) + return LinearOperator(A.shape, matvec, rmatvec=rmatvec, + matmat=matmat, dtype=A.dtype) elif isspmatrix(A): - return LinearOperator( A.shape, A.matvec, rmatvec=A.rmatvec, \ - matmat=A.dot, dtype=A.dtype ) + return LinearOperator(A.shape, A.matvec, rmatvec=A.rmatvec, + matmat=A.dot, dtype=A.dtype) else: if hasattr(A,'shape') and hasattr(A,'matvec'): @@ -139,9 +139,8 @@ rmatvec = A.rmatvec if hasattr(A,'dtype'): dtype = A.dtype - return LinearOperator(A.shape, A.matvec, rmatvec=rmatvec, dtype=dtype) + return LinearOperator(A.shape, A.matvec, + rmatvec=rmatvec, dtype=dtype) else: raise TypeError('type not understood') - - From scipy-svn at scipy.org Tue Apr 8 16:08:56 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 15:08:56 -0500 (CDT) Subject: [Scipy-svn] r4118 - in trunk/scipy/sparse/linalg: . eigen Message-ID: <20080408200856.E526839C0DA@new.scipy.org> Author: wnbell Date: 2008-04-08 15:08:51 -0500 (Tue, 08 Apr 2008) New Revision: 4118 Modified: trunk/scipy/sparse/linalg/eigen/info.py trunk/scipy/sparse/linalg/info.py Log: added lobpcg to list of eigensolvers Modified: trunk/scipy/sparse/linalg/eigen/info.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/info.py 2008-04-08 19:53:27 UTC (rev 4117) +++ trunk/scipy/sparse/linalg/eigen/info.py 2008-04-08 20:08:51 UTC (rev 4118) @@ -1,18 +1,21 @@ """ Sparse Eigenvalue Solvers -========================= +------------------------- -The submodules of sparse.linalg: +The submodules of sparse.linalg.eigen: 1. arpack: spare eigenvalue solver using iterative methods + 2. lobpcg: Locally Optimal Block Preconditioned Conjugate Gradient Method Examples -======== +-------- """ +__docformat__ = "restructuredtext en" + #TODO show examples postpone_import = 1 Modified: trunk/scipy/sparse/linalg/info.py =================================================================== --- trunk/scipy/sparse/linalg/info.py 2008-04-08 19:53:27 UTC (rev 4117) +++ trunk/scipy/sparse/linalg/info.py 2008-04-08 20:08:51 UTC (rev 4118) @@ -1,6 +1,6 @@ """ Sparse Linear Algebra -===================== +--------------------- The submodules of sparse.linalg: 1. eigen: sparse eigenvalue problem solvers @@ -8,12 +8,13 @@ 3. dsolve: direct factorization methods for solving linear systems Examples -======== +-------- """ - #TODO show examples +__docformat__ = "restructuredtext en" + postpone_import = 1 From scipy-svn at scipy.org Tue Apr 8 17:09:55 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 16:09:55 -0500 (CDT) Subject: [Scipy-svn] r4119 - trunk/scipy/io/arff Message-ID: <20080408210955.B3CE639C035@new.scipy.org> Author: rkern Date: 2008-04-08 16:09:51 -0500 (Tue, 08 Apr 2008) New Revision: 4119 Modified: trunk/scipy/io/arff/arffread.py Log: Avoid the 2.5 syntax of try: except: finally: Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-08 20:08:51 UTC (rev 4118) +++ trunk/scipy/io/arff/arffread.py 2008-04-08 21:09:51 UTC (rev 4119) @@ -446,10 +446,11 @@ return raw try: - dtline = next_data_line(ofile) - delim = get_delim(dtline) - except ValueError, e: - raise ParseArffError("Error while parsing delimiter: " + str(e)) + try: + dtline = next_data_line(ofile) + delim = get_delim(dtline) + except ValueError, e: + raise ParseArffError("Error while parsing delimiter: " + str(e)) finally: ofile.seek(0, 0) ofile = go_data(ofile) From scipy-svn at scipy.org Tue Apr 8 17:19:45 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 8 Apr 2008 16:19:45 -0500 (CDT) Subject: [Scipy-svn] r4120 - trunk/scipy/sparse/linalg/eigen/lobpcg Message-ID: <20080408211945.8A15139C035@new.scipy.org> Author: wnbell Date: 2008-04-08 16:19:42 -0500 (Tue, 08 Apr 2008) New Revision: 4120 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py Log: fix recursive import Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 21:09:51 UTC (rev 4119) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-08 21:19:42 UTC (rev 4120) @@ -18,7 +18,6 @@ import scipy.sparse as sp import scipy.io as io from scipy.sparse.linalg import aslinearoperator, LinearOperator -import scipy.linalg as sla ## try: ## from symeig import symeig @@ -26,6 +25,7 @@ ## raise ImportError('lobpcg requires symeig') def symeig( mtxA, mtxB = None, eigenvectors = True, select = None ): + import scipy.linalg as sla import scipy.lib.lapack as ll if select is None: if nm.iscomplexobj( mtxA ): @@ -112,6 +112,7 @@ def applyConstraints( blockVectorV, factYBY, blockVectorBY, blockVectorY ): """Internal. Changes blockVectorV in place.""" gramYBV = sc.dot( blockVectorBY.T, blockVectorV ) + import scipy.linalg as sla tmp = sla.cho_solve( factYBY, gramYBV ) blockVectorV -= sc.dot( blockVectorY, tmp ) @@ -119,6 +120,7 @@ def b_orthonormalize( B, blockVectorV, blockVectorBV = None, retInvR = False ): """Internal.""" + import scipy.linalg as sla if blockVectorBV is None: if B is not None: blockVectorBV = B( blockVectorV ) @@ -203,6 +205,7 @@ """ failureFlag = True + import scipy.linalg as sla if blockVectorY is not None: sizeY = blockVectorY.shape[1] From scipy-svn at scipy.org Wed Apr 9 18:56:39 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 9 Apr 2008 17:56:39 -0500 (CDT) Subject: [Scipy-svn] r4121 - trunk/scipy/stats Message-ID: <20080409225639.84DCB39C017@new.scipy.org> Author: christoph.weidemann Date: 2008-04-09 17:56:01 -0500 (Wed, 09 Apr 2008) New Revision: 4121 Modified: trunk/scipy/stats/stats.py Log: Temporary fix for ttest_1samp (cf. ticket #631) Modified: trunk/scipy/stats/stats.py =================================================================== --- trunk/scipy/stats/stats.py 2008-04-08 21:19:42 UTC (rev 4120) +++ trunk/scipy/stats/stats.py 2008-04-09 22:56:01 UTC (rev 4121) @@ -1678,7 +1678,7 @@ """ a = asarray(a) x = mean(a,None) - v = var(a) + v = var(a,None) n = len(a) df = n-1 svar = ((n-1)*v) / float(df) From scipy-svn at scipy.org Wed Apr 9 21:00:32 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 9 Apr 2008 20:00:32 -0500 (CDT) Subject: [Scipy-svn] r4122 - trunk/scipy/ndimage/src/segment Message-ID: <20080410010032.453EE39C0CD@new.scipy.org> Author: tom.waite Date: 2008-04-09 20:00:22 -0500 (Wed, 09 Apr 2008) New Revision: 4122 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: Begin region grow functions Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-09 22:56:01 UTC (rev 4121) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-10 01:00:22 UTC (rev 4122) @@ -583,8 +583,70 @@ } +static PyObject *Segmenter_GrowRegion(PyObject *self, PyObject *args) +{ + + + int num; + int nd; + int type; + int Label; + int N_connectivity; + double cutoff; + npy_intp *dims; + npy_intp *objNumber; + unsigned short *label; + double *section; + PyObject *sArray = NULL; + PyObject *lArray = NULL; + PyObject *eArray = NULL; + PyObject *nArray = NULL; + objStruct *expanded_ROI; + objStruct *newgrow_ROI; + + if(!PyArg_ParseTuple(args, "OOOOdii", &sArray, &lArray, &eArray, &nArray, &cutoff, + &Label, &N_connectivity)) + goto exit; + + if(!PyArray_ISCONTIGUOUS(sArray) || !PyArray_ISCONTIGUOUS(lArray)) + goto exit; + + // + // PyArray_ContiguousFromObject or PyArray_ContiguousFromAny to be explored + // for non-contiguous + // + + section = (double *)PyArray_DATA(sArray); + nd = PyArray_NDIM(sArray); + dims = PyArray_DIMS(sArray); + type = PyArray_TYPE(sArray); + num = PyArray_SIZE(sArray); + + label = (unsigned short *)PyArray_DATA(lArray); + expanded_ROI = (objStruct*)PyArray_DATA(eArray); + newgrow_ROI = (objStruct*)PyArray_DATA(nArray); + + if(nd == 2){ + if(!NI_GrowRegion2D((int)dims[0], (int)dims[1], section, label, expanded_ROI, + newgrow_ROI, cutoff, Label, N_connectivity)) + goto exit; + } + else if(nd == 3){ + if(!NI_GrowRegion3D((int)dims[0], (int)dims[1], (int)dims[2], section, label, + expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity)) + goto exit; + } + + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + static PyMethodDef SegmenterMethods[] = { + { "grow_region", Segmenter_GrowRegion, METH_VARARGS, NULL }, { "roi_co_occurence", Segmenter_RoiCoOccurence, METH_VARARGS, NULL }, { "binary_edge", Segmenter_BinaryEdge, METH_VARARGS, NULL }, { "laws_texture_metric", Segmenter_LawsTextureMetric, METH_VARARGS, NULL }, From scipy-svn at scipy.org Wed Apr 9 21:00:53 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 9 Apr 2008 20:00:53 -0500 (CDT) Subject: [Scipy-svn] r4123 - trunk/scipy/ndimage/src/segment Message-ID: <20080410010053.454AB39C0A1@new.scipy.org> Author: tom.waite Date: 2008-04-09 20:00:48 -0500 (Wed, 09 Apr 2008) New Revision: 4123 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: Begin region grow functions Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-10 01:00:22 UTC (rev 4122) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-10 01:00:48 UTC (rev 4123) @@ -1469,3 +1469,189 @@ } +int NI_GrowRegion2D(int rows, int cols, double *rawimage, unsigned short *label, + objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label, + int N_connectivity){ + + int i, j, p, m; + int offset; + int offsetM, offsetP; + int status; + int T[8], count; + double value; + bool change; + + while(1){ + change = FALSE; + for(i = 1; i < rows-1; ++i){ + offset = i * cols; + offsetM = offset - cols; + offsetP = offset + cols; + for(j = 1; j < cols-1; ++j){ + m = label[offset+j]; + if(!m){ + /* un-labeled pixel */ + value = rawimage[offset+j]; + if(value > cutoff){ + /* check for N-connectivity */ + T[0] = label[offset+j+1]; + T[1] = label[offsetM+j+1]; + T[2] = label[offsetM+j]; + T[3] = label[offsetM+j-1]; + T[4] = label[offset+j-1]; + T[5] = label[offsetP+j-1]; + T[6] = label[offsetP+j]; + T[7] = label[offsetP+j+1]; + count = 0; + for(p = 0; p < 8; ++p){ + count += T[p]; + } + if(count > N_connectivity){ + label[offset+j] = Label; + change = TRUE; + } + } + } + } + } + if(!change) break; + } + + /* get new bounding box */ + + status = 1; + + return(status); + +} + +int NI_GrowRegion3D(int layers, int rows, int cols, double *rawimage, unsigned short *label, + objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label, + int N_connectivity){ + + int i, j, k, m, p; + int offset; + int ptr; + int lOffset, rOffset; + int lOffsetP, lOffsetN; + int rOffsetP, rOffsetN; + int layerSize; + int status; + int T[26], count; + int LowX; + int LowY; + int LowZ; + int HighX; + int HighY; + int HighZ; + float centerX; + float centerY; + float centerZ; + double value; + bool change; + + layerSize = rows * cols; + while(1){ + change = FALSE; + for(i = 1; i < layers-1; ++i){ + lOffset = i * layerSize; + lOffsetP = lOffset+layerSize; + lOffsetN = lOffset-layerSize; + for(j = 1; j < rows-1; ++j){ + rOffset = j * cols; + rOffsetP = rOffset+cols; + rOffsetN = rOffset-cols; + for(k = 1; k < cols-1; ++k){ + m = label[lOffset+rOffset+k]; + if(!m){ + /* un-labeled voxel */ + value = rawimage[lOffset+rOffset+k]; + if(value > cutoff){ + /* check for N-connectivity */ + T[0] = label[lOffset+rOffset+k+1]; + T[1] = label[lOffset+rOffsetN+k+1]; + T[2] = label[lOffset+rOffsetN+k]; + T[3] = label[lOffset+rOffsetN+k-1]; + T[4] = label[lOffset+rOffset+k-1]; + T[5] = label[lOffset+rOffsetP+k-1]; + T[6] = label[lOffset+rOffsetP+k]; + T[7] = label[lOffset+rOffsetP+k+1]; + + T[8] = label[lOffsetN+rOffset+k]; + T[9] = label[lOffsetN+rOffset+k+1]; + T[10] = label[lOffsetN+rOffsetN+k+1]; + T[11] = label[lOffsetN+rOffsetN+k]; + T[12] = label[lOffsetN+rOffsetN+k-1]; + T[13] = label[lOffsetN+rOffset+k-1]; + T[14] = label[lOffsetN+rOffsetP+k-1]; + T[15] = label[lOffsetN+rOffsetP+k]; + T[16] = label[lOffsetN+rOffsetP+k+1]; + + T[17] = label[lOffsetP+rOffset+k]; + T[18] = label[lOffsetP+rOffset+k+1]; + T[19] = label[lOffsetP+rOffsetN+k+1]; + T[20] = label[lOffsetP+rOffsetN+k]; + T[21] = label[lOffsetP+rOffsetN+k-1]; + T[22] = label[lOffsetP+rOffset+k-1]; + T[23] = label[lOffsetP+rOffsetP+k-1]; + T[24] = label[lOffsetP+rOffsetP+k]; + T[25] = label[lOffsetP+rOffsetP+k+1]; + + count = 0; + for(p = 0; p < 26; ++p){ + count += T[p]; + } + if(count > N_connectivity){ + label[lOffset+rOffset+k]= Label; + change = TRUE; + } + } + } + } + } + } + if(!change) break; + } + + + LowX = 32767; + LowY = 32767; + LowZ = 32767; + HighX = 0; + HighY = 0; + HighZ = 0; + count = 0; + centerX = (float)0.0; + centerY = (float)0.0; + centerZ = (float)0.0; + ptr = 0; + count = 0; + for(i = 0; i < layers; ++i){ + for(j = 0; j < rows; ++j){ + for(k = 0; k < cols; ++k){ + m = label[ptr++]; + if(m == Label){ + if(i < LowZ) LowZ = i; + if(j < LowY) LowY = j; + if(k < LowX) LowX = k; + if(i > HighZ) HighZ = i; + if(j > HighY) HighY = j; + if(k > HighX) HighX = k; + centerX += (float)k; + centerY += (float)j; + centerZ += (float)i; + ++count; + } + } + } + } + + + + status = 1; + + return(status); + +} + + From scipy-svn at scipy.org Wed Apr 9 21:01:13 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 9 Apr 2008 20:01:13 -0500 (CDT) Subject: [Scipy-svn] r4124 - trunk/scipy/ndimage Message-ID: <20080410010113.3E5DD39C0CD@new.scipy.org> Author: tom.waite Date: 2008-04-09 20:01:09 -0500 (Wed, 09 Apr 2008) New Revision: 4124 Modified: trunk/scipy/ndimage/_segmenter.py Log: Begin region grow functions Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-10 01:00:48 UTC (rev 4123) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-10 01:01:09 UTC (rev 4124) @@ -310,9 +310,192 @@ +def region_grow(label_image, raw_image, ROI, roi_index, roi_inflate=[12, 32, 32], + stop_thresh=0.1, N_connectivity=1): + """ + region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, stop_thresh) + + starting from a seed (masks or regions in the label_image) grow the regions based + on (1) connectivity (2D or 3D) and (2) raw voxel values > stop threshold criterion. + + Parameters + ---------- + + label_image : {nd_array} + an image with labeled regions from get_blobs() method + + raw_image : {nd_array} + raw image from which texture features get extracted + + ROI : {dictionary} + Region of Interest structure that has blob bounding boxes. The largest + 2D target bounding box is extracted. + + roi_index : {int} + the single ROI element to apply region growing to. + + roi_inflate : {tuple} + the maximum increase in the ROI bounding box. For 3D the tuple is [layers, rows, cols] + and for 2D it is [rows, cols]. + + stop_thresh : {float} + this is the percent of the voxel mean that the growing region must be greater than. + region growing terminates when the raw_image is below this value. + + N_connectivity : {int} + for growing this indicates how connected in a 3x3 or 3x3x3 window the un-labeled + sample is. Make less than full connected for growing boundaries + + Returns + ---------- + + updated_label : {nd_array} + the label image with the selected ROi after region growing + + """ + + _c_ext_struct = NP.dtype([('Left', 'i'), + ('Right', 'i'), + ('Top', 'i'), + ('Bottom', 'i'), + ('Front', 'i'), + ('Back', 'i'), + ('Label', 'i'), + ('Mass', 'i'), + ('cX', 'f'), + ('cY', 'f'), + ('cZ', 'f')] + ) + + expanded_ROI = NP.zeros(1, dtype=_c_ext_struct) + + dimensions = label_image.ndim + dim_inflate = size(roi_inflate) + if dimensions != dim_inflate: + return + + if dimensions == 3: + z_ext = roi_inflate[0] + y_ext = roi_inflate[1] + x_ext = roi_inflate[2] + [layers, rows, cols] = label_image.shape + updated_label = NP.zeros(layers*rows*cols, dtype=label_image.dtype).reshape(layers, rows, cols) + else: + y_ext = roi_inflate[0] + x_ext = roi_inflate[1] + [rows, cols] = label_image.shape + updated_label = NP.zeros(rows*cols, dtype=label_image.dtype).reshape(rows, cols) + + if dimensions == 2: + left = ROI[roi_index]['Left']-x_ext + right = ROI[roi_index]['Right']+x_ext + bottom = ROI[roi_index]['Bottom']-y_ext + top = ROI[roi_index]['Top']+y_ext + Label = ROI[roi_index]['Label'] + cutoff = stop_thresh * ROI[roi_index]['voxelMean'] + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 + expanded_ROI['Left'] = left + expanded_ROI['Right'] = right + expanded_ROI['Top'] = top + expanded_ROI['Bottom'] = bottom + expanded_ROI['Label'] = Label + rows = top-bottom-1 + cols = right-left-1 + label = NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) + label = label_image[bottom:top, left:right] \ + [label_image[bottom:top, left:right]==Label] + section = NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) + section = raw_image[bottom:top, left:right] \ + [label_image[bottom:top, left:right]==Label] + elif dimensions == 3: + left = ROI[roi_index]['Left']-x_ext + right = ROI[roi_index]['Right']+x_ext + bottom = ROI[roi_index]['Bottom']-y_ext + top = ROI[roi_index]['Top']+y_ext + front = ROI[roi_index]['Front']-z_ext + back = ROI[roi_index]['Back']+z_ext + Label = ROI[roi_index]['Label'] + cutoff = stop_thresh * ROI[roi_index]['voxelMean'] + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 + if front < 0: + front = 0 + if back > layers-1: + back = layers-1 + expanded_ROI['Left'] = left + expanded_ROI['Right'] = right + expanded_ROI['Top'] = top + expanded_ROI['Bottom'] = bottom + expanded_ROI['Back'] = back + expanded_ROI['Front'] = front + expanded_ROI['Label'] = Label + rows = top-bottom-1 + cols = right-left-1 + layers = back-front-1 + label = NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) + label = label_image[front:back, bottom:top, left:right] \ + [label_image[front:back, bottom:top, left:right]==Label] + section = NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) + section = raw_image[front:back, bottom:top, left:right] \ + [label_image[front:back, bottom:top, left:right]==Label] + + # + # this newgrow_ROI gets filled in and the label image is grown + # + + newgrow_ROI = NP.zeros(1, dtype=_c_ext_struct) + S.region_grow(section, label, expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity) + if dimensions == 2: + # adjust for delta window + ROI[roi_index]['Left'] = newgrow_ROI[roi_index]['Left'] + ROI[roi_index]['Right'] = newgrow_ROI[roi_index]['Right'] + ROI[roi_index]['Top'] = newgrow_ROI[roi_index]['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI[roi_index]['Bottom'] + left = ROI[roi_index]['Left'] + right = ROI[roi_index]['Right'] + top = ROI[roi_index]['Top'] + bottom = ROI[roi_index]['Bottom'] + rows = top-bottom-1 + cols = right-left-1 + updated_label[bottom:top,left:right] = label[0:rows,0:cols] + elif dimensions == 3: + ROI[i]['Left'] = newgrow_ROI[roi_index]['Left'] + ROI[i]['Right'] = newgrow_ROI[roi_index]['Right'] + ROI[i]['Top'] = newgrow_ROI[roi_index]['Top'] + ROI[i]['Bottom'] = newgrow_ROI[roi_index]['Bottom'] + ROI[i]['Front'] = newgrow_ROI[roi_index]['Front'] + ROI[i]['Back'] = newgrow_ROI[roi_index]['Back'] + left = ROI[roi_index]['Left'] + right = ROI[roi_index]['Right'] + top = ROI[roi_index]['Top'] + bottom = ROI[roi_index]['Bottom'] + front = ROI[roi_index]['Front'] + back = ROI[roi_index]['Back'] + rows = top-bottom-1 + cols = right-left-1 + layers = back-front-1 + updated_label[front:back, bottom:top,left:right] = label[0:layers,0:rows,0:cols] + + return updated_label + + + def seg_co_occurence(raw_image, window=16, distance=2, orientation=90): """ - seg_co_occurence(raw_image, window=16, distance=2, orientation=90) + cocm_images = seg_co_occurence(raw_image, window=16, distance=2, orientation=90) (N-S, E-W, NW-SE, NE-SW) computes one of 4 directional co-occurence matrices and features. In debug=1 will return the 4 joint histograms for each ROI. From scipy-svn at scipy.org Thu Apr 10 05:03:52 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 04:03:52 -0500 (CDT) Subject: [Scipy-svn] r4125 - trunk/scipy/io Message-ID: <20080410090352.BA2BA39C03B@new.scipy.org> Author: pearu Date: 2008-04-10 04:03:43 -0500 (Thu, 10 Apr 2008) New Revision: 4125 Modified: trunk/scipy/io/mmio.py Log: Add bz2 support to io.mmio [not tested] Modified: trunk/scipy/io/mmio.py =================================================================== --- trunk/scipy/io/mmio.py 2008-04-10 01:01:09 UTC (rev 4124) +++ trunk/scipy/io/mmio.py 2008-04-10 09:03:43 UTC (rev 4125) @@ -206,10 +206,15 @@ filespec = filespec + '.mtx' elif os.path.isfile(filespec+'.mtx.gz'): filespec = filespec + '.mtx.gz' + elif os.path.isfile(filespec+'.mtx.bz2'): + filespec = filespec + '.mtx.bz2' # open filename if filespec[-3:] == '.gz': import gzip stream = gzip.open(filespec, mode) + elif filespec[-4:] == '.bz2': + import bz2 + stream = bz2.BZ2File(filespec, 'r') else: stream = open(filespec, mode) From scipy-svn at scipy.org Thu Apr 10 17:49:45 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 16:49:45 -0500 (CDT) Subject: [Scipy-svn] r4126 - trunk/scipy/stats Message-ID: <20080410214945.73A8839C02A@new.scipy.org> Author: cdavid Date: 2008-04-10 16:49:41 -0500 (Thu, 10 Apr 2008) New Revision: 4126 Modified: trunk/scipy/stats/SConstruct Log: Change name of static lib implementation to avoid lib clash on windows. Modified: trunk/scipy/stats/SConstruct =================================================================== --- trunk/scipy/stats/SConstruct 2008-04-10 09:03:43 UTC (rev 4125) +++ trunk/scipy/stats/SConstruct 2008-04-10 21:49:41 UTC (rev 4126) @@ -17,14 +17,14 @@ # Statlib library src = env.NumpyGlob(pjoin('statlib', '*.f' )) -env.NumpyStaticExtLibrary('statlib', source = src) +env.NumpyStaticExtLibrary('statlibimp', source = src) env.AppendUnique(LIBPATH = [env['build_dir']]) # Statlib extension env.NumpyPythonExtension('statlib', source = 'statlib.pyf', F2PYOPTIONS = ["--no-wrap-functions"], - LIBS = 'statlib', + LIBS = 'statlibimp', LINKFLAGSEND = env['F77_LDFLAGS']) # futil extension From scipy-svn at scipy.org Thu Apr 10 17:50:24 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 16:50:24 -0500 (CDT) Subject: [Scipy-svn] r4127 - trunk/scipy/special Message-ID: <20080410215024.1FDCC39C02A@new.scipy.org> Author: cdavid Date: 2008-04-10 16:50:21 -0500 (Thu, 10 Apr 2008) New Revision: 4127 Modified: trunk/scipy/special/SConstruct Log: prepend special functions library. Modified: trunk/scipy/special/SConstruct =================================================================== --- trunk/scipy/special/SConstruct 2008-04-10 21:49:41 UTC (rev 4126) +++ trunk/scipy/special/SConstruct 2008-04-10 21:50:21 UTC (rev 4127) @@ -29,6 +29,7 @@ if not libname: libname = name src = env.NumpyGlob(pjoin(name, '*%s' % ext)) + assert len(src) > 0 env.NumpyStaticExtLibrary(libname, source = src) # C libraries @@ -41,7 +42,7 @@ build_lib('toms', '.f') build_lib('amos', '.f') build_lib('cdflib', '.f', 'cdf') -build_lib('specfunlib', '.f') +build_lib('specfun', '.f', 'specfunlib') env.AppendUnique(LIBPATH = [env['build_dir']]) @@ -56,6 +57,7 @@ LINKFLAGSEND = env['F77_LDFLAGS']) # Specfun extension -env.NumpyPythonExtension('specfun', source = 'specfun.pyf', LIBS = 'specfunlib', \ +env.Prepend(LIBS = ['specfunlib']) +env.NumpyPythonExtension('specfun', source = 'specfun.pyf', F2PYOPTIONS = ["--no-wrap-functions"], LINKFLAGSEND = env['F77_LDFLAGS']) From scipy-svn at scipy.org Thu Apr 10 18:59:45 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 17:59:45 -0500 (CDT) Subject: [Scipy-svn] r4128 - in trunk/scipy/sparse/linalg/eigen: . lobpcg Message-ID: <20080410225945.C730639C2F8@new.scipy.org> Author: cdavid Date: 2008-04-10 17:59:42 -0500 (Thu, 10 Apr 2008) New Revision: 4128 Added: trunk/scipy/sparse/linalg/eigen/lobpcg/setupscons.py Modified: trunk/scipy/sparse/linalg/eigen/setupscons.py Log: Add logpbc subpackage for scons build. Copied: trunk/scipy/sparse/linalg/eigen/lobpcg/setupscons.py (from rev 4127, trunk/scipy/sparse/linalg/eigen/lobpcg/setup.py) Modified: trunk/scipy/sparse/linalg/eigen/setupscons.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setupscons.py 2008-04-10 21:50:21 UTC (rev 4127) +++ trunk/scipy/sparse/linalg/eigen/setupscons.py 2008-04-10 22:59:42 UTC (rev 4128) @@ -6,6 +6,7 @@ config = Configuration('eigen',parent_package,top_path, setup_name = 'setupscons.py') config.add_subpackage(('arpack')) + config.add_subpackage(('lobpcg')) return config From scipy-svn at scipy.org Thu Apr 10 22:17:03 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 21:17:03 -0500 (CDT) Subject: [Scipy-svn] r4129 - trunk/scipy/ndimage/src/segment Message-ID: <20080411021703.C318A39C0C0@new.scipy.org> Author: tom.waite Date: 2008-04-10 21:16:58 -0500 (Thu, 10 Apr 2008) New Revision: 4129 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: Updates to region growing code Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-10 22:59:42 UTC (rev 4128) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-11 02:16:58 UTC (rev 4129) @@ -153,7 +153,6 @@ int offsetM1; int offsetP1; int values3x3[8]; - int value; int status; offset = cols; @@ -248,14 +247,12 @@ int rOffsetP, rOffsetN; int Classes[4096]; int dwImageSize, ptr; - int HighZ, HighY, HighX, LowZ, LowX, LowY; bool NewLabel; bool Change; bool connected; int T[27]; int *ccompImage; int layerSize; - int TargetArea; int count; int status; @@ -828,7 +825,7 @@ } -void NI_ThinMorphoFilter(int regRows, int regColumns, int spadSize, int masks, unsigned short *J_mask, +int NI_ThinMorphoFilter(int regRows, int regColumns, int spadSize, int masks, unsigned short *J_mask, unsigned short *K_mask, unsigned char *Input, unsigned char *CInput, unsigned char *ErosionStage, unsigned char *DialationStage, unsigned char *HMT, unsigned char *Copy){ @@ -1287,7 +1284,6 @@ int i, j; int lawsLayer; int column, row; - int offset; int maskOffset[7]; int dataOffset[7]; float myImage[49]; @@ -1393,9 +1389,8 @@ int NI_RoiCoOccurence(int samples, int rows, int cols, unsigned short *labelImage, unsigned short *rawImage, int *cocMatrix, int distance, int orientation){ - int i, j, k; + int i, j; int offset; - int sum; int d_row; int d_col; int status; @@ -1470,7 +1465,7 @@ } int NI_GrowRegion2D(int rows, int cols, double *rawimage, unsigned short *label, - objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label, + objStruct *expanded_ROI, objStruct *newgrow_ROI, double cutoff, int Label, int N_connectivity){ int i, j, p, m; @@ -1478,6 +1473,10 @@ int offsetM, offsetP; int status; int T[8], count; + int LowX; + int LowY; + int HighX; + int HighY; double value; bool change; @@ -1504,7 +1503,9 @@ T[7] = label[offsetP+j+1]; count = 0; for(p = 0; p < 8; ++p){ - count += T[p]; + if(T[p] == Label){ + count += T[p]; + } } if(count > N_connectivity){ label[offset+j] = Label; @@ -1518,6 +1519,11 @@ } /* get new bounding box */ + newgrow_ROI->Left = expanded_ROI->Left + LowX; + newgrow_ROI->Right = newgrow_ROI->Left + (HighX-LowX); + newgrow_ROI->Bottom = expanded_ROI->Bottom + LowY; + newgrow_ROI->Top = expanded_ROI->Bottom + (HighY-LowY); + newgrow_ROI->Mass = count; status = 1; @@ -1526,7 +1532,7 @@ } int NI_GrowRegion3D(int layers, int rows, int cols, double *rawimage, unsigned short *label, - objStruct expanded_ROI[], objStruct newgrow_ROI[], double cutoff, int Label, + objStruct *expanded_ROI, objStruct *newgrow_ROI, double cutoff, int Label, int N_connectivity){ int i, j, k, m, p; @@ -1599,7 +1605,9 @@ count = 0; for(p = 0; p < 26; ++p){ - count += T[p]; + if(T[p] == Label){ + count += T[p]; + } } if(count > N_connectivity){ label[lOffset+rOffset+k]= Label; @@ -1613,7 +1621,6 @@ if(!change) break; } - LowX = 32767; LowY = 32767; LowZ = 32767; @@ -1646,8 +1653,14 @@ } } + newgrow_ROI->Left = expanded_ROI->Left + LowX; + newgrow_ROI->Right = newgrow_ROI->Left + (HighX-LowX); + newgrow_ROI->Bottom = expanded_ROI->Bottom + LowY; + newgrow_ROI->Top = newgrow_ROI->Bottom + (HighY-LowY); + newgrow_ROI->Front = expanded_ROI->Front + LowZ; + newgrow_ROI->Back = expanded_ROI->Front + (HighZ-LowZ); + newgrow_ROI->Mass = count; - status = 1; return(status); From scipy-svn at scipy.org Thu Apr 10 22:17:20 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 21:17:20 -0500 (CDT) Subject: [Scipy-svn] r4130 - trunk/scipy/ndimage/src/segment Message-ID: <20080411021720.86D6639C0C0@new.scipy.org> Author: tom.waite Date: 2008-04-10 21:17:16 -0500 (Thu, 10 Apr 2008) New Revision: 4130 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: Updates to region growing code Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-11 02:16:58 UTC (rev 4129) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-11 02:17:16 UTC (rev 4130) @@ -605,17 +605,16 @@ objStruct *newgrow_ROI; if(!PyArg_ParseTuple(args, "OOOOdii", &sArray, &lArray, &eArray, &nArray, &cutoff, - &Label, &N_connectivity)) + &Label, &N_connectivity)){ + printf("PyArg_ParseTuple error\n"); goto exit; + } - if(!PyArray_ISCONTIGUOUS(sArray) || !PyArray_ISCONTIGUOUS(lArray)) + if(!PyArray_ISCONTIGUOUS(sArray) || !PyArray_ISCONTIGUOUS(sArray)){ + printf("PyArray_ISCONTIGUOUS error\n"); goto exit; + } - // - // PyArray_ContiguousFromObject or PyArray_ContiguousFromAny to be explored - // for non-contiguous - // - section = (double *)PyArray_DATA(sArray); nd = PyArray_NDIM(sArray); dims = PyArray_DIMS(sArray); @@ -646,7 +645,7 @@ static PyMethodDef SegmenterMethods[] = { - { "grow_region", Segmenter_GrowRegion, METH_VARARGS, NULL }, + { "region_grow", Segmenter_GrowRegion, METH_VARARGS, NULL }, { "roi_co_occurence", Segmenter_RoiCoOccurence, METH_VARARGS, NULL }, { "binary_edge", Segmenter_BinaryEdge, METH_VARARGS, NULL }, { "laws_texture_metric", Segmenter_LawsTextureMetric, METH_VARARGS, NULL }, From scipy-svn at scipy.org Thu Apr 10 22:17:40 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 21:17:40 -0500 (CDT) Subject: [Scipy-svn] r4131 - trunk/scipy/ndimage Message-ID: <20080411021740.3ED6739C0C0@new.scipy.org> Author: tom.waite Date: 2008-04-10 21:17:38 -0500 (Thu, 10 Apr 2008) New Revision: 4131 Modified: trunk/scipy/ndimage/_segmenter.py Log: Updates to region growing code Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-11 02:17:16 UTC (rev 4130) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-11 02:17:38 UTC (rev 4131) @@ -310,8 +310,8 @@ -def region_grow(label_image, raw_image, ROI, roi_index, roi_inflate=[12, 32, 32], - stop_thresh=0.1, N_connectivity=1): +def region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, + stop_thresh=0.5, N_connectivity=3): """ region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, stop_thresh) @@ -334,7 +334,7 @@ roi_index : {int} the single ROI element to apply region growing to. - roi_inflate : {tuple} + roi_inflate : {list} the maximum increase in the ROI bounding box. For 3D the tuple is [layers, rows, cols] and for 2D it is [rows, cols]. @@ -349,7 +349,7 @@ Returns ---------- - updated_label : {nd_array} + updated_label_image : {nd_array} the label image with the selected ROi after region growing """ @@ -370,21 +370,20 @@ expanded_ROI = NP.zeros(1, dtype=_c_ext_struct) dimensions = label_image.ndim - dim_inflate = size(roi_inflate) - if dimensions != dim_inflate: - return if dimensions == 3: z_ext = roi_inflate[0] y_ext = roi_inflate[1] x_ext = roi_inflate[2] [layers, rows, cols] = label_image.shape - updated_label = NP.zeros(layers*rows*cols, dtype=label_image.dtype).reshape(layers, rows, cols) + updated_label_image = NP.zeros(layers*rows*cols, dtype=NP.int16).reshape(layers, rows, cols) + updated_label_image = label_image.copy() else: y_ext = roi_inflate[0] x_ext = roi_inflate[1] [rows, cols] = label_image.shape - updated_label = NP.zeros(rows*cols, dtype=label_image.dtype).reshape(rows, cols) + updated_label_image = NP.zeros(rows*cols, dtype=NP.int16).reshape(rows, cols) + updated_label_image = label_image.copy() if dimensions == 2: left = ROI[roi_index]['Left']-x_ext @@ -393,6 +392,7 @@ top = ROI[roi_index]['Top']+y_ext Label = ROI[roi_index]['Label'] cutoff = stop_thresh * ROI[roi_index]['voxelMean'] + print 'cutoff = ', cutoff if left < 0: left = 0 if bottom < 0: @@ -406,14 +406,12 @@ expanded_ROI['Top'] = top expanded_ROI['Bottom'] = bottom expanded_ROI['Label'] = Label - rows = top-bottom-1 - cols = right-left-1 - label = NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) - label = label_image[bottom:top, left:right] \ - [label_image[bottom:top, left:right]==Label] - section = NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) - section = raw_image[bottom:top, left:right] \ - [label_image[bottom:top, left:right]==Label] + rows = top-bottom + cols = right-left + label = NP.zeros(rows*cols, dtype=NP.int16).reshape(rows, cols) + section = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) + label = label_image[bottom:top, left:right].copy() + section = (raw_image[bottom:top, left:right].astype(NP.float64)).copy() elif dimensions == 3: left = ROI[roi_index]['Left']-x_ext right = ROI[roi_index]['Right']+x_ext @@ -442,54 +440,57 @@ expanded_ROI['Back'] = back expanded_ROI['Front'] = front expanded_ROI['Label'] = Label - rows = top-bottom-1 - cols = right-left-1 - layers = back-front-1 - label = NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) - label = label_image[front:back, bottom:top, left:right] \ - [label_image[front:back, bottom:top, left:right]==Label] - section = NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) - section = raw_image[front:back, bottom:top, left:right] \ - [label_image[front:back, bottom:top, left:right]==Label] + rows = top-bottom + cols = right-left + layers = back-front + label = NP.zeros(layers*rows*cols, dtype=NP.int16).reshape(layers, rows, cols) + label = label_image[front:back, bottom:top, left:right].copy() + section = NP.zeros(layers*rows*cols, dtype=NP.float64).reshape(layers, rows, cols) + section = (raw_image[front:back, bottom:top, left:right].astype(NP.float64)).copy() # # this newgrow_ROI gets filled in and the label image is grown # + #return label, section + newgrow_ROI = NP.zeros(1, dtype=_c_ext_struct) S.region_grow(section, label, expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity) + if dimensions == 2: # adjust for delta window - ROI[roi_index]['Left'] = newgrow_ROI[roi_index]['Left'] - ROI[roi_index]['Right'] = newgrow_ROI[roi_index]['Right'] - ROI[roi_index]['Top'] = newgrow_ROI[roi_index]['Top'] - ROI[roi_index]['Bottom'] = newgrow_ROI[roi_index]['Bottom'] + ROI[roi_index]['Left'] = newgrow_ROI['Left'] + ROI[roi_index]['Right'] = newgrow_ROI['Right'] + ROI[roi_index]['Top'] = newgrow_ROI['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] left = ROI[roi_index]['Left'] right = ROI[roi_index]['Right'] top = ROI[roi_index]['Top'] bottom = ROI[roi_index]['Bottom'] - rows = top-bottom-1 - cols = right-left-1 - updated_label[bottom:top,left:right] = label[0:rows,0:cols] + rows = top-bottom + cols = right-left + updated_label_image[bottom:top,left:right] = label[0:rows,0:cols] elif dimensions == 3: - ROI[i]['Left'] = newgrow_ROI[roi_index]['Left'] - ROI[i]['Right'] = newgrow_ROI[roi_index]['Right'] - ROI[i]['Top'] = newgrow_ROI[roi_index]['Top'] - ROI[i]['Bottom'] = newgrow_ROI[roi_index]['Bottom'] - ROI[i]['Front'] = newgrow_ROI[roi_index]['Front'] - ROI[i]['Back'] = newgrow_ROI[roi_index]['Back'] + + ROI[roi_index]['Left'] = newgrow_ROI['Left'] + ROI[roi_index]['Right'] = newgrow_ROI['Right'] + ROI[roi_index]['Top'] = newgrow_ROI['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] + ROI[roi_index]['Front'] = newgrow_ROI['Front'] + ROI[roi_index]['Back'] = newgrow_ROI['Back'] left = ROI[roi_index]['Left'] right = ROI[roi_index]['Right'] top = ROI[roi_index]['Top'] bottom = ROI[roi_index]['Bottom'] front = ROI[roi_index]['Front'] back = ROI[roi_index]['Back'] - rows = top-bottom-1 - cols = right-left-1 - layers = back-front-1 - updated_label[front:back, bottom:top,left:right] = label[0:layers,0:rows,0:cols] + rows = top-bottom + cols = right-left + layers = back-front + updated_label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] - return updated_label + #return updated_label_image + return label From scipy-svn at scipy.org Thu Apr 10 22:33:55 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 10 Apr 2008 21:33:55 -0500 (CDT) Subject: [Scipy-svn] r4132 - trunk/scipy/ndimage Message-ID: <20080411023355.D5EC839C480@new.scipy.org> Author: tom.waite Date: 2008-04-10 21:33:53 -0500 (Thu, 10 Apr 2008) New Revision: 4132 Modified: trunk/scipy/ndimage/_segmenter.py Log: fix copy bug in region grow Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-11 02:17:38 UTC (rev 4131) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-11 02:33:53 UTC (rev 4132) @@ -392,7 +392,6 @@ top = ROI[roi_index]['Top']+y_ext Label = ROI[roi_index]['Label'] cutoff = stop_thresh * ROI[roi_index]['voxelMean'] - print 'cutoff = ', cutoff if left < 0: left = 0 if bottom < 0: @@ -452,8 +451,6 @@ # this newgrow_ROI gets filled in and the label image is grown # - #return label, section - newgrow_ROI = NP.zeros(1, dtype=_c_ext_struct) S.region_grow(section, label, expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity) @@ -471,26 +468,24 @@ cols = right-left updated_label_image[bottom:top,left:right] = label[0:rows,0:cols] elif dimensions == 3: - ROI[roi_index]['Left'] = newgrow_ROI['Left'] ROI[roi_index]['Right'] = newgrow_ROI['Right'] ROI[roi_index]['Top'] = newgrow_ROI['Top'] ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] ROI[roi_index]['Front'] = newgrow_ROI['Front'] ROI[roi_index]['Back'] = newgrow_ROI['Back'] - left = ROI[roi_index]['Left'] - right = ROI[roi_index]['Right'] - top = ROI[roi_index]['Top'] - bottom = ROI[roi_index]['Bottom'] - front = ROI[roi_index]['Front'] - back = ROI[roi_index]['Back'] + left = expanded_ROI['Left'] + right = expanded_ROI['Right'] + top = expanded_ROI['Top'] + bottom = expanded_ROI['Bottom'] + front = expanded_ROI['Front'] + back = expanded_ROI['Back'] rows = top-bottom cols = right-left layers = back-front updated_label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] - #return updated_label_image - return label + return updated_label_image From scipy-svn at scipy.org Fri Apr 11 17:56:59 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 11 Apr 2008 16:56:59 -0500 (CDT) Subject: [Scipy-svn] r4133 - in trunk/scipy/io: . tests Message-ID: <20080411215659.8571639C0EE@new.scipy.org> Author: rkern Date: 2008-04-11 16:56:58 -0500 (Fri, 11 Apr 2008) New Revision: 4133 Modified: trunk/scipy/io/array_import.py trunk/scipy/io/tests/test_array_import.py Log: A TypeError is also possible when using a filelike object with os.path.expanduser(). Modified: trunk/scipy/io/array_import.py =================================================================== --- trunk/scipy/io/array_import.py 2008-04-11 02:33:53 UTC (rev 4132) +++ trunk/scipy/io/array_import.py 2008-04-11 21:56:58 UTC (rev 4133) @@ -109,7 +109,7 @@ if type(details) == type(()): details = details + (fileobject,) raise IOError, details - except AttributeError: + except (AttributeError, TypeError): # it is assumed that the fileobject is a python # file object if it can not be used in os.path.expanduser file = fileobject Modified: trunk/scipy/io/tests/test_array_import.py =================================================================== --- trunk/scipy/io/tests/test_array_import.py 2008-04-11 02:33:53 UTC (rev 4132) +++ trunk/scipy/io/tests/test_array_import.py 2008-04-11 21:56:58 UTC (rev 4133) @@ -1,5 +1,3 @@ -## Automatically adapted for scipy Oct 19, 2005 by convertcode.py - #!/usr/bin/env python # This python script tests the numpyio module. @@ -9,6 +7,7 @@ from scipy.testing import * import scipy.io as io from scipy.io import numpyio +from scipy.io import array_import import numpy.oldnumeric as N import tempfile @@ -57,5 +56,12 @@ assert_array_equal(a,b) os.remove(fname) +class TestRegression(TestCase): + def test_get_open_file_works_with_filelike_objects(self): + f = tempfile.TemporaryFile() + f2 = array_import.get_open_file(f) + assert f2 is f + f.close() + if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Fri Apr 11 18:43:01 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 11 Apr 2008 17:43:01 -0500 (CDT) Subject: [Scipy-svn] r4134 - trunk/scipy/ndimage/src/segment Message-ID: <20080411224301.1A3D639C5E9@new.scipy.org> Author: tom.waite Date: 2008-04-11 17:42:59 -0500 (Fri, 11 Apr 2008) New Revision: 4134 Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: fixed connectivity bug. added high threshold. Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-11 21:56:58 UTC (rev 4133) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-11 22:42:59 UTC (rev 4134) @@ -529,8 +529,10 @@ lawsFilter.lawsKernel[5][i] = O7[i]; } - if(!PyArray_ISCONTIGUOUS(mArray)) + if(!PyArray_ISCONTIGUOUS(sArray)){ + printf("PyArray_ISCONTIGUOUS error\n"); goto exit; + } if(!NI_LawsTexture(num, (int)dims[0], (int)dims[1], src_image, mask, lawsImage, lawsFilter)){ @@ -571,6 +573,11 @@ coc_matrix = (int *)PyArray_DATA(cArray); dims_cocm = PyArray_DIMS(cArray); + if(!PyArray_ISCONTIGUOUS(mArray) || !PyArray_ISCONTIGUOUS(rArray)){ + printf("PyArray_ISCONTIGUOUS error\n"); + goto exit; + } + if(!NI_RoiCoOccurence(num, (int)dims[0], (int)dims[1], mask_image, raw_image, coc_matrix, distance, orientation)) goto exit; @@ -592,7 +599,8 @@ int type; int Label; int N_connectivity; - double cutoff; + double low_threshold; + double high_threshold; npy_intp *dims; npy_intp *objNumber; unsigned short *label; @@ -604,13 +612,13 @@ objStruct *expanded_ROI; objStruct *newgrow_ROI; - if(!PyArg_ParseTuple(args, "OOOOdii", &sArray, &lArray, &eArray, &nArray, &cutoff, - &Label, &N_connectivity)){ + if(!PyArg_ParseTuple(args, "OOOOddii", &sArray, &lArray, &eArray, &nArray, &low_threshold, + &high_threshold, &Label, &N_connectivity)){ printf("PyArg_ParseTuple error\n"); goto exit; } - if(!PyArray_ISCONTIGUOUS(sArray) || !PyArray_ISCONTIGUOUS(sArray)){ + if(!PyArray_ISCONTIGUOUS(sArray) || !PyArray_ISCONTIGUOUS(lArray)){ printf("PyArray_ISCONTIGUOUS error\n"); goto exit; } @@ -627,12 +635,13 @@ if(nd == 2){ if(!NI_GrowRegion2D((int)dims[0], (int)dims[1], section, label, expanded_ROI, - newgrow_ROI, cutoff, Label, N_connectivity)) + newgrow_ROI, low_threshold, high_threshold, Label, N_connectivity)) goto exit; } else if(nd == 3){ if(!NI_GrowRegion3D((int)dims[0], (int)dims[1], (int)dims[2], section, label, - expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity)) + expanded_ROI, newgrow_ROI, low_threshold, high_threshold, + Label, N_connectivity)) goto exit; } From scipy-svn at scipy.org Fri Apr 11 18:43:19 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 11 Apr 2008 17:43:19 -0500 (CDT) Subject: [Scipy-svn] r4135 - trunk/scipy/ndimage/src/segment Message-ID: <20080411224319.B662339C59D@new.scipy.org> Author: tom.waite Date: 2008-04-11 17:43:16 -0500 (Fri, 11 Apr 2008) New Revision: 4135 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: fixed connectivity bug. added high threshold. Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-11 22:42:59 UTC (rev 4134) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-11 22:43:16 UTC (rev 4135) @@ -1465,8 +1465,8 @@ } int NI_GrowRegion2D(int rows, int cols, double *rawimage, unsigned short *label, - objStruct *expanded_ROI, objStruct *newgrow_ROI, double cutoff, int Label, - int N_connectivity){ + objStruct *expanded_ROI, objStruct *newgrow_ROI, double low_threshold, + double high_threshold, int Label, int N_connectivity){ int i, j, p, m; int offset; @@ -1491,7 +1491,7 @@ if(!m){ /* un-labeled pixel */ value = rawimage[offset+j]; - if(value > cutoff){ + if((value > low_threshold) && (value < high_threshold)){ /* check for N-connectivity */ T[0] = label[offset+j+1]; T[1] = label[offsetM+j+1]; @@ -1504,7 +1504,7 @@ count = 0; for(p = 0; p < 8; ++p){ if(T[p] == Label){ - count += T[p]; + ++count; } } if(count > N_connectivity){ @@ -1532,8 +1532,8 @@ } int NI_GrowRegion3D(int layers, int rows, int cols, double *rawimage, unsigned short *label, - objStruct *expanded_ROI, objStruct *newgrow_ROI, double cutoff, int Label, - int N_connectivity){ + objStruct *expanded_ROI, objStruct *newgrow_ROI, double low_threshold, + double high_threshold, int Label, int N_connectivity){ int i, j, k, m, p; int offset; @@ -1572,7 +1572,7 @@ if(!m){ /* un-labeled voxel */ value = rawimage[lOffset+rOffset+k]; - if(value > cutoff){ + if((value > low_threshold) && (value < high_threshold)){ /* check for N-connectivity */ T[0] = label[lOffset+rOffset+k+1]; T[1] = label[lOffset+rOffsetN+k+1]; @@ -1606,7 +1606,7 @@ count = 0; for(p = 0; p < 26; ++p){ if(T[p] == Label){ - count += T[p]; + ++count; } } if(count > N_connectivity){ From scipy-svn at scipy.org Fri Apr 11 18:43:37 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 11 Apr 2008 17:43:37 -0500 (CDT) Subject: [Scipy-svn] r4136 - trunk/scipy/ndimage Message-ID: <20080411224337.A944B39C59D@new.scipy.org> Author: tom.waite Date: 2008-04-11 17:43:35 -0500 (Fri, 11 Apr 2008) New Revision: 4136 Modified: trunk/scipy/ndimage/_segmenter.py Log: fixed connectivity bug. added high threshold. Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-11 22:43:16 UTC (rev 4135) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-11 22:43:35 UTC (rev 4136) @@ -311,7 +311,7 @@ def region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, - stop_thresh=0.5, N_connectivity=3): + low_thresh=0.5, high_thresh=1.5, N_connectivity=3, debug=0): """ region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, stop_thresh) @@ -338,10 +338,14 @@ the maximum increase in the ROI bounding box. For 3D the tuple is [layers, rows, cols] and for 2D it is [rows, cols]. - stop_thresh : {float} - this is the percent of the voxel mean that the growing region must be greater than. - region growing terminates when the raw_image is below this value. + low_thresh : {float} + this is the percent of the voxel mean that the growing region must be GREATER than. + region growing terminates when the raw_image is BELOW this value. + high_thresh : {float} + this is the percent of the voxel mean that the growing region must be LESS than. + region growing terminates when the raw_image is ABOVE this value. + N_connectivity : {int} for growing this indicates how connected in a 3x3 or 3x3x3 window the un-labeled sample is. Make less than full connected for growing boundaries @@ -349,8 +353,9 @@ Returns ---------- - updated_label_image : {nd_array} - the label image with the selected ROi after region growing + label : {nd_array} + the label image with the selected ROI after region growing. only returned + in debug mode. """ @@ -376,22 +381,19 @@ y_ext = roi_inflate[1] x_ext = roi_inflate[2] [layers, rows, cols] = label_image.shape - updated_label_image = NP.zeros(layers*rows*cols, dtype=NP.int16).reshape(layers, rows, cols) - updated_label_image = label_image.copy() else: y_ext = roi_inflate[0] x_ext = roi_inflate[1] [rows, cols] = label_image.shape - updated_label_image = NP.zeros(rows*cols, dtype=NP.int16).reshape(rows, cols) - updated_label_image = label_image.copy() if dimensions == 2: - left = ROI[roi_index]['Left']-x_ext - right = ROI[roi_index]['Right']+x_ext - bottom = ROI[roi_index]['Bottom']-y_ext - top = ROI[roi_index]['Top']+y_ext - Label = ROI[roi_index]['Label'] - cutoff = stop_thresh * ROI[roi_index]['voxelMean'] + left = ROI[roi_index]['Left']-x_ext + right = ROI[roi_index]['Right']+x_ext + bottom = ROI[roi_index]['Bottom']-y_ext + top = ROI[roi_index]['Top']+y_ext + Label = ROI[roi_index]['Label'] + lcutoff = low_thresh * ROI[roi_index]['voxelMean'] + hcutoff = high_thresh * ROI[roi_index]['voxelMean'] if left < 0: left = 0 if bottom < 0: @@ -412,14 +414,15 @@ label = label_image[bottom:top, left:right].copy() section = (raw_image[bottom:top, left:right].astype(NP.float64)).copy() elif dimensions == 3: - left = ROI[roi_index]['Left']-x_ext - right = ROI[roi_index]['Right']+x_ext - bottom = ROI[roi_index]['Bottom']-y_ext - top = ROI[roi_index]['Top']+y_ext - front = ROI[roi_index]['Front']-z_ext - back = ROI[roi_index]['Back']+z_ext - Label = ROI[roi_index]['Label'] - cutoff = stop_thresh * ROI[roi_index]['voxelMean'] + left = ROI[roi_index]['Left']-x_ext + right = ROI[roi_index]['Right']+x_ext + bottom = ROI[roi_index]['Bottom']-y_ext + top = ROI[roi_index]['Top']+y_ext + front = ROI[roi_index]['Front']-z_ext + back = ROI[roi_index]['Back']+z_ext + Label = ROI[roi_index]['Label'] + lcutoff = low_thresh * ROI[roi_index]['voxelMean'] + hcutoff = high_thresh * ROI[roi_index]['voxelMean'] if left < 0: left = 0 if bottom < 0: @@ -452,43 +455,52 @@ # newgrow_ROI = NP.zeros(1, dtype=_c_ext_struct) - S.region_grow(section, label, expanded_ROI, newgrow_ROI, cutoff, Label, N_connectivity) + S.region_grow(section, label, expanded_ROI, newgrow_ROI, lcutoff, hcutoff, Label, N_connectivity) - if dimensions == 2: - # adjust for delta window - ROI[roi_index]['Left'] = newgrow_ROI['Left'] - ROI[roi_index]['Right'] = newgrow_ROI['Right'] - ROI[roi_index]['Top'] = newgrow_ROI['Top'] - ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] - left = ROI[roi_index]['Left'] - right = ROI[roi_index]['Right'] - top = ROI[roi_index]['Top'] - bottom = ROI[roi_index]['Bottom'] - rows = top-bottom - cols = right-left - updated_label_image[bottom:top,left:right] = label[0:rows,0:cols] - elif dimensions == 3: - ROI[roi_index]['Left'] = newgrow_ROI['Left'] - ROI[roi_index]['Right'] = newgrow_ROI['Right'] - ROI[roi_index]['Top'] = newgrow_ROI['Top'] - ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] - ROI[roi_index]['Front'] = newgrow_ROI['Front'] - ROI[roi_index]['Back'] = newgrow_ROI['Back'] - left = expanded_ROI['Left'] - right = expanded_ROI['Right'] - top = expanded_ROI['Top'] - bottom = expanded_ROI['Bottom'] - front = expanded_ROI['Front'] - back = expanded_ROI['Back'] - rows = top-bottom - cols = right-left - layers = back-front - updated_label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] - - return updated_label_image + if debug==1: + # + # do not update ROI for index and the label_image + # + return label + else: + # + # update (overwrite) ROI for index and the label_image + # + if dimensions == 2: + ROI[roi_index]['Left'] = newgrow_ROI['Left'] + ROI[roi_index]['Right'] = newgrow_ROI['Right'] + ROI[roi_index]['Top'] = newgrow_ROI['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] + left = ROI[roi_index]['Left'] + right = ROI[roi_index]['Right'] + top = ROI[roi_index]['Top'] + bottom = ROI[roi_index]['Bottom'] + rows = top-bottom + cols = right-left + label_image[bottom:top,left:right] = label[0:rows,0:cols] + elif dimensions == 3: + ROI[roi_index]['Left'] = newgrow_ROI['Left'] + ROI[roi_index]['Right'] = newgrow_ROI['Right'] + ROI[roi_index]['Top'] = newgrow_ROI['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] + ROI[roi_index]['Front'] = newgrow_ROI['Front'] + ROI[roi_index]['Back'] = newgrow_ROI['Back'] + left = expanded_ROI['Left'] + right = expanded_ROI['Right'] + top = expanded_ROI['Top'] + bottom = expanded_ROI['Bottom'] + front = expanded_ROI['Front'] + back = expanded_ROI['Back'] + rows = top-bottom + cols = right-left + layers = back-front + label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] + + return + def seg_co_occurence(raw_image, window=16, distance=2, orientation=90): """ cocm_images = seg_co_occurence(raw_image, window=16, distance=2, orientation=90) From scipy-svn at scipy.org Sun Apr 13 14:39:03 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 13 Apr 2008 13:39:03 -0500 (CDT) Subject: [Scipy-svn] r4137 - in trunk/scipy/optimize: . tests Message-ID: <20080413183903.3646139C0A7@new.scipy.org> Author: stefan Date: 2008-04-13 13:38:35 -0500 (Sun, 13 Apr 2008) New Revision: 4137 Modified: trunk/scipy/optimize/minpack.py trunk/scipy/optimize/tests/test_optimize.py Log: Add tests for leastsq [provided by Andrew Straw]. Fix: input parameters are no longer modified. Closes #637. Modified: trunk/scipy/optimize/minpack.py =================================================================== --- trunk/scipy/optimize/minpack.py 2008-04-11 22:43:35 UTC (rev 4136) +++ trunk/scipy/optimize/minpack.py 2008-04-13 18:38:35 UTC (rev 4137) @@ -1,7 +1,7 @@ import _minpack from numpy import atleast_1d, dot, take, triu, shape, eye, \ - transpose, zeros, product, greater + transpose, zeros, product, greater, array error = _minpack.error @@ -108,7 +108,7 @@ fixed_point -- scalar fixed-point finder """ - x0 = atleast_1d(x0) + x0 = array(x0,ndmin=1) n = len(x0) if type(args) != type(()): args = (args,) check_func(func,x0,args,n,(n,)) @@ -262,7 +262,7 @@ fixed_point -- scalar fixed-point finder """ - x0 = atleast_1d(x0) + x0 = array(x0,ndmin=1) n = len(x0) if type(args) != type(()): args = (args,) m = check_func(func,x0,args,n)[0] Modified: trunk/scipy/optimize/tests/test_optimize.py =================================================================== --- trunk/scipy/optimize/tests/test_optimize.py 2008-04-11 22:43:35 UTC (rev 4136) +++ trunk/scipy/optimize/tests/test_optimize.py 2008-04-13 18:38:35 UTC (rev 4137) @@ -1,17 +1,25 @@ """ Unit tests for optimization routines -Author: Ed Schofield -Nov 2005 +Authors: + Ed Schofield, Nov 2005 + Andrew Straw, April 2008 + +To run it in its simplest form:: + nosetests test_optimize.py + + """ from scipy.testing import * from scipy import optimize -from numpy import array, zeros, float64, dot, log, exp, inf +from scipy.optimize import leastsq +from numpy import array, zeros, float64, dot, log, exp, inf, \ + pi, sin, cos +import numpy as np from scipy.optimize.tnc import RCSTRINGS, MSG_NONE +import numpy.random +from math import pow - -from math import sin, cos, pow - class TestOptimize(TestCase): """ Test case for a simple constrained entropy maximization problem (the machine translation example of Berger et al in @@ -192,11 +200,11 @@ def test5fg(x): f = sin(x[0]+x[1])+pow(x[0]-x[1],2)-1.5*x[0]+2.5*x[1]+1.0 dif = [0,0] - v1 = cos(x[0]+x[1]); - v2 = 2.0*(x[0]-x[1]); + v1 = cos(x[0]+x[1]) + v2 = 2.0*(x[0]-x[1]) - dif[0] = v1+v2-1.5; - dif[1] = v1-v2+2.5; + dif[0] = v1+v2-1.5 + dif[1] = v1-v2+2.5 return f, dif self.tests.append((test5fg, [0,0], [(-1.5, 4),(-3,3)], [-0.54719755119659763, -1.5471975511965976])) @@ -241,6 +249,44 @@ if ef > 1e-8: raise err +class TestLeastSq(TestCase): + def setUp(self): + x = np.linspace(0, 10, 40) + a,b,c = 3.1, 42, -304.2 + self.x = x + self.abc = a,b,c + y_true = a*x**2 + b*x + c + self.y_meas = y_true + 0.01*np.random.standard_normal( y_true.shape ) + def residuals(self, p, y, x): + a,b,c = p + err = y-(a*x**2 + b*x + c) + return err + + def test_basic(self): + p0 = numpy.array([0,0,0]) + params_fit, ier = leastsq(self.residuals, p0, + args=(self.y_meas, self.x)) + assert ier in (1,2,3,4), 'solution not found (ier=%d)'%ier + assert_array_almost_equal( params_fit, self.abc, decimal=2) # low precision due to random + + def test_full_output(self): + p0 = numpy.array([0,0,0]) + full_output = leastsq(self.residuals, p0, + args=(self.y_meas, self.x), + full_output=True) + params_fit, cov_x, infodict, mesg, ier = full_output + assert ier in (1,2,3,4), 'solution not found: %s'%mesg + + def test_input_untouched(self): + p0 = numpy.array([0,0,0],dtype=numpy.float64) + p0_copy = numpy.array(p0, copy=True) + full_output = leastsq(self.residuals, p0, + args=(self.y_meas, self.x), + full_output=True) + params_fit, cov_x, infodict, mesg, ier = full_output + assert ier in (1,2,3,4), 'solution not found: %s'%mesg + assert_array_equal(p0, p0_copy) + if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Sun Apr 13 14:42:11 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 13 Apr 2008 13:42:11 -0500 (CDT) Subject: [Scipy-svn] r4138 - trunk/scipy/optimize Message-ID: <20080413184211.0E4A739C046@new.scipy.org> Author: stefan Date: 2008-04-13 13:41:56 -0500 (Sun, 13 Apr 2008) New Revision: 4138 Modified: trunk/scipy/optimize/minpack.py Log: Leastsq docstring update [by Andrew Straw]. Closes #636. Modified: trunk/scipy/optimize/minpack.py =================================================================== --- trunk/scipy/optimize/minpack.py 2008-04-13 18:38:35 UTC (rev 4137) +++ trunk/scipy/optimize/minpack.py 2008-04-13 18:41:56 UTC (rev 4138) @@ -101,8 +101,6 @@ fminbound, brent, golden, bracket -- local scalar minimizers - fsolve -- n-dimenstional root-finding - brentq, brenth, ridder, bisect, newton -- one-dimensional root-finding fixed_point -- scalar fixed-point finder @@ -197,7 +195,6 @@ infinite covariance in some direction). infodict -- a dictionary of optional outputs with the keys: 'nfev' : the number of function calls - 'njev' : the number of jacobian calls 'fvec' : the function evaluated at the output 'fjac' : A permutation of the R matrix of a QR factorization of the final approximate @@ -212,9 +209,10 @@ of the identity matrix. 'qtf' : the vector (transpose(q) * fvec). mesg -- a string message giving information about the cause of failure. - ier -- an integer flag. If it is equal to 1 the solution was - found. If it is not equal to 1, the solution was not - found and the following message gives more information. + ier -- an integer flag. If it is equal to 1, 2, 3 or 4, the + solution was found. Otherwise, the solution was not + found. In either case, the optional output variable 'mesg' + gives more information. Extended Inputs: @@ -246,7 +244,6 @@ fmin, fmin_powell, fmin_cg, fmin_bfgs, fmin_ncg -- multivariate local optimizers - leastsq -- nonlinear least squares minimizer fmin_l_bfgs_b, fmin_tnc, fmin_cobyla -- constrained multivariate optimizers From scipy-svn at scipy.org Sun Apr 13 18:16:09 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 13 Apr 2008 17:16:09 -0500 (CDT) Subject: [Scipy-svn] r4139 - trunk/scipy/linalg Message-ID: <20080413221609.BEE6739C130@new.scipy.org> Author: cdavid Date: 2008-04-13 17:16:00 -0500 (Sun, 13 Apr 2008) New Revision: 4139 Modified: trunk/scipy/linalg/generic_cblas.pyf trunk/scipy/linalg/generic_clapack.pyf trunk/scipy/linalg/generic_fblas.pyf trunk/scipy/linalg/generic_flapack.pyf Log: Rename generic_ from the modules name in linalg pyf files (otherwise, the module name cannot be infered correctly by scons). As the final module's name - after inclusion of all other .pyf files - is the same, this should not change anything for distutils builds. Modified: trunk/scipy/linalg/generic_cblas.pyf =================================================================== --- trunk/scipy/linalg/generic_cblas.pyf 2008-04-13 18:41:56 UTC (rev 4138) +++ trunk/scipy/linalg/generic_cblas.pyf 2008-04-13 22:16:00 UTC (rev 4139) @@ -8,10 +8,10 @@ ! Usage: ! f2py -c cblas.pyf -L/usr/local/lib/atlas -lf77blas -lcblas -latlas -lg2c -python module generic_cblas +python module cblas interface end interface -end python module generic_cblas +end python module cblas Modified: trunk/scipy/linalg/generic_clapack.pyf =================================================================== --- trunk/scipy/linalg/generic_clapack.pyf 2008-04-13 18:41:56 UTC (rev 4138) +++ trunk/scipy/linalg/generic_clapack.pyf 2008-04-13 22:16:00 UTC (rev 4139) @@ -8,7 +8,7 @@ ! Usage: ! f2py -c clapack.pyf -L/usr/local/lib/atlas -llapack -lf77blas -lcblas -latlas -lg2c -python module generic_clapack +python module clapack interface @@ -285,7 +285,7 @@ end interface -end python module generic_clapack +end python module clapack ! This file was auto-generated with f2py (version:2.10.173). ! See http://cens.ioc.ee/projects/f2py2e/ Modified: trunk/scipy/linalg/generic_fblas.pyf =================================================================== --- trunk/scipy/linalg/generic_fblas.pyf 2008-04-13 18:41:56 UTC (rev 4138) +++ trunk/scipy/linalg/generic_fblas.pyf 2008-04-13 22:16:00 UTC (rev 4139) @@ -8,7 +8,7 @@ ! Usage: ! f2py -c fblas.pyf -L/usr/local/lib/atlas -lf77blas -lcblas -latlas -lg2c -python module generic_fblas +python module fblas interface @@ -16,4 +16,4 @@ end interface -end python module generic_fblas +end python module fblas Modified: trunk/scipy/linalg/generic_flapack.pyf =================================================================== --- trunk/scipy/linalg/generic_flapack.pyf 2008-04-13 18:41:56 UTC (rev 4138) +++ trunk/scipy/linalg/generic_flapack.pyf 2008-04-13 22:16:00 UTC (rev 4139) @@ -10,7 +10,7 @@ ! Usage: ! f2py -c flapack.pyf -L/usr/local/lib/atlas -llapack -lf77blas -lcblas -latlas -lg2c -python module generic_flapack +python module flapack interface subroutine pbtrf(lower,n,kd,ab,ldab,info) @@ -1381,7 +1381,7 @@ end interface -end python module generic_flapack +end python module flapack ! This file was auto-generated with f2py (version:2.10.173). ! See http://cens.ioc.ee/projects/f2py2e/ From scipy-svn at scipy.org Sun Apr 13 18:17:09 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 13 Apr 2008 17:17:09 -0500 (CDT) Subject: [Scipy-svn] r4140 - trunk/scipy/fftpack Message-ID: <20080413221709.CB52539C130@new.scipy.org> Author: cdavid Date: 2008-04-13 17:17:05 -0500 (Sun, 13 Apr 2008) New Revision: 4140 Modified: trunk/scipy/fftpack/SConstruct Log: Remove explicit target name for _fftpack; recent versions of numscons (>= 0.6) can infer the name of the module from sources. Modified: trunk/scipy/fftpack/SConstruct =================================================================== --- trunk/scipy/fftpack/SConstruct 2008-04-13 22:16:00 UTC (rev 4139) +++ trunk/scipy/fftpack/SConstruct 2008-04-13 22:17:05 UTC (rev 4140) @@ -36,8 +36,7 @@ # Build _fftpack src = ['src/zfft.c','src/drfft.c','src/zrfft.c', 'src/zfftnd.c'] -wsrc = env.F2py(pjoin(env['build_dir'], '_fftpackmodule.c'), - pjoin(env['build_dir'], 'fftpack.pyf')) +wsrc = env.F2py(pjoin(env['build_dir'], 'fftpack.pyf')) env.NumpyPythonExtension('_fftpack', source = src + wsrc) # Build convolve From scipy-svn at scipy.org Mon Apr 14 15:01:09 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 14 Apr 2008 14:01:09 -0500 (CDT) Subject: [Scipy-svn] r4141 - in trunk/scipy/stats: . tests Message-ID: <20080414190109.65FF539C229@new.scipy.org> Author: pierregm Date: 2008-04-14 14:01:01 -0500 (Mon, 14 Apr 2008) New Revision: 4141 Added: trunk/scipy/stats/mmorestats.py trunk/scipy/stats/mstats.py trunk/scipy/stats/tests/test_mmorestats.py trunk/scipy/stats/tests/test_mstats.py Log: mstats/mmorestats : collection of statistical functions with support of missing values. Added: trunk/scipy/stats/mmorestats.py =================================================================== --- trunk/scipy/stats/mmorestats.py 2008-04-13 22:17:05 UTC (rev 4140) +++ trunk/scipy/stats/mmorestats.py 2008-04-14 19:01:01 UTC (rev 4141) @@ -0,0 +1,390 @@ +""" +Additional statistics functions, with support to MA. + +:author: Pierre GF Gerard-Marchant +:contact: pierregm_at_uga_edu +:date: $Date: 2007-10-29 17:18:13 +0200 (Mon, 29 Oct 2007) $ +:version: $Id: morestats.py 3473 2007-10-29 15:18:13Z jarrod.millman $ +""" +__author__ = "Pierre GF Gerard-Marchant" +__docformat__ = "restructuredtext en" + + +__all__ = ['compare_median_ms', + 'hdquantiles', 'hdmedian', 'hdquantiles_sd', + 'idealfourths', + 'median_cihs','mjci','mquantiles_cimj', + 'rsh', + 'trimmed_mean_ci',] + +import numpy as np +from numpy import bool_, float_, int_, ndarray, array as narray + +import numpy.ma as ma +from numpy.ma import masked, nomask, MaskedArray +#from numpy.ma.extras import apply_along_axis, dot, median + +import scipy.stats.mstats as mstats +#from numpy.ma.mstats import trim_both, trimmed_stde, mquantiles, stde_median + +from scipy.stats.distributions import norm, beta, t, binom +from scipy.stats.morestats import find_repeats + + + +#####-------------------------------------------------------------------------- +#---- --- Quantiles --- +#####-------------------------------------------------------------------------- +def hdquantiles(data, prob=list([.25,.5,.75]), axis=None, var=False,): + """Computes quantile estimates with the Harrell-Davis method, where the estimates +are calculated as a weighted linear combination of order statistics. + +Parameters +---------- + data: ndarray + Data array. + prob: sequence + Sequence of quantiles to compute. + axis : int + Axis along which to compute the quantiles. If None, use a flattened array. + var : boolean + Whether to return the variance of the estimate. + +Returns +------- + A (p,) array of quantiles (if ``var`` is False), or a (2,p) array of quantiles + and variances (if ``var`` is True), where ``p`` is the number of quantiles. + +Notes +----- + The function is restricted to 2D arrays. + + """ + def _hd_1D(data,prob,var): + "Computes the HD quantiles for a 1D array. Returns nan for invalid data." + xsorted = np.squeeze(np.sort(data.compressed().view(ndarray))) + # Don't use length here, in case we have a numpy scalar + n = xsorted.size + #......... + hd = np.empty((2,len(prob)), float_) + if n < 2: + hd.flat = np.nan + if var: + return hd + return hd[0] + #......... + v = np.arange(n+1) / float(n) + betacdf = beta.cdf + for (i,p) in enumerate(prob): + _w = betacdf(v, (n+1)*p, (n+1)*(1-p)) + w = _w[1:] - _w[:-1] + hd_mean = np.dot(w, xsorted) + hd[0,i] = hd_mean + # + hd[1,i] = np.dot(w, (xsorted-hd_mean)**2) + # + hd[0, prob == 0] = xsorted[0] + hd[0, prob == 1] = xsorted[-1] + if var: + hd[1, prob == 0] = hd[1, prob == 1] = np.nan + return hd + return hd[0] + # Initialization & checks --------- + data = ma.array(data, copy=False, dtype=float_) + p = np.array(prob, copy=False, ndmin=1) + # Computes quantiles along axis (or globally) + if (axis is None) or (data.ndim == 1): + result = _hd_1D(data, p, var) + else: + assert data.ndim <= 2, "Array should be 2D at most !" + result = ma.apply_along_axis(_hd_1D, axis, data, p, var) + # + return ma.fix_invalid(result, copy=False) + +#.............................................................................. +def hdmedian(data, axis=-1, var=False): + """Returns the Harrell-Davis estimate of the median along the given axis. + +Parameters +---------- + data: ndarray + Data array. + axis : int + Axis along which to compute the quantiles. If None, use a flattened array. + var : boolean + Whether to return the variance of the estimate. + + """ + result = hdquantiles(data,[0.5], axis=axis, var=var) + return result.squeeze() + + +#.............................................................................. +def hdquantiles_sd(data, prob=list([.25,.5,.75]), axis=None): + """Computes the standard error of the Harrell-Davis quantile estimates by jackknife. + + +Parameters +---------- + data: ndarray + Data array. + prob: sequence + Sequence of quantiles to compute. + axis : int + Axis along which to compute the quantiles. If None, use a flattened array. + +Notes +----- + The function is restricted to 2D arrays. + + """ + def _hdsd_1D(data,prob): + "Computes the std error for 1D arrays." + xsorted = np.sort(data.compressed()) + n = len(xsorted) + #......... + hdsd = np.empty(len(prob), float_) + if n < 2: + hdsd.flat = np.nan + #......... + vv = np.arange(n) / float(n-1) + betacdf = beta.cdf + # + for (i,p) in enumerate(prob): + _w = betacdf(vv, (n+1)*p, (n+1)*(1-p)) + w = _w[1:] - _w[:-1] + mx_ = np.fromiter([np.dot(w,xsorted[np.r_[range(0,k), + range(k+1,n)].astype(int_)]) + for k in range(n)], dtype=float_) + mx_var = np.array(mx_.var(), copy=False, ndmin=1) * n / float(n-1) + hdsd[i] = float(n-1) * np.sqrt(np.diag(mx_var).diagonal() / float(n)) + return hdsd + # Initialization & checks --------- + data = ma.array(data, copy=False, dtype=float_) + p = np.array(prob, copy=False, ndmin=1) + # Computes quantiles along axis (or globally) + if (axis is None): + result = _hdsd_1D(data.compressed(), p) + else: + assert data.ndim <= 2, "Array should be 2D at most !" + result = ma.apply_along_axis(_hdsd_1D, axis, data, p) + # + return ma.fix_invalid(result, copy=False).ravel() + + +#####-------------------------------------------------------------------------- +#---- --- Confidence intervals --- +#####-------------------------------------------------------------------------- + +def trimmed_mean_ci(data, limits=(0.2,0.2), inclusive=(True,True), + alpha=0.05, axis=None): + """Returns the selected confidence interval of the trimmed mean along the +given axis. + +Parameters +---------- + data : sequence + Input data. The data is transformed to a masked array + proportiontocut : float + Proportion of the data to cut from each side of the data . + As a result, (2*proportiontocut*n) values are actually trimmed. + alpha : float + Confidence level of the intervals. + inclusive : tuple of boolean + If relative==False, tuple indicating whether values exactly equal to the + absolute limits are allowed. + If relative==True, tuple indicating whether the number of data being masked + on each side should be rounded (True) or truncated (False). + axis : int + Axis along which to cut. If None, uses a flattened version of the input. + + """ + data = ma.array(data, copy=False) + trimmed = mstats.trimr(data, limits=limits, inclusive=inclusive, axis=axis) + tmean = trimmed.mean(axis) + tstde = mstats.trimmed_stde(data,limits=limits,inclusive=inclusive,axis=axis) + df = trimmed.count(axis) - 1 + tppf = t.ppf(1-alpha/2.,df) + return np.array((tmean - tppf*tstde, tmean+tppf*tstde)) + +#.............................................................................. +def mjci(data, prob=[0.25,0.5,0.75], axis=None): + """Returns the Maritz-Jarrett estimators of the standard error of selected +experimental quantiles of the data. + +Parameters +----------- + data: ndarray + Data array. + prob: sequence + Sequence of quantiles to compute. + axis : int + Axis along which to compute the quantiles. If None, use a flattened array. + + """ + def _mjci_1D(data, p): + data = np.sort(data.compressed()) + n = data.size + prob = (np.array(p) * n + 0.5).astype(int_) + betacdf = beta.cdf + # + mj = np.empty(len(prob), float_) + x = np.arange(1,n+1, dtype=float_) / n + y = x - 1./n + for (i,m) in enumerate(prob): + (m1,m2) = (m-1, n-m) + W = betacdf(x,m-1,n-m) - betacdf(y,m-1,n-m) + C1 = np.dot(W,data) + C2 = np.dot(W,data**2) + mj[i] = np.sqrt(C2 - C1**2) + return mj + # + data = ma.array(data, copy=False) + assert data.ndim <= 2, "Array should be 2D at most !" + p = np.array(prob, copy=False, ndmin=1) + # Computes quantiles along axis (or globally) + if (axis is None): + return _mjci_1D(data, p) + else: + return ma.apply_along_axis(_mjci_1D, axis, data, p) + +#.............................................................................. +def mquantiles_cimj(data, prob=[0.25,0.50,0.75], alpha=0.05, axis=None): + """Computes the alpha confidence interval for the selected quantiles of the +data, with Maritz-Jarrett estimators. + +Parameters +---------- + data: ndarray + Data array. + prob: sequence + Sequence of quantiles to compute. + alpha : float + Confidence level of the intervals. + axis : integer + Axis along which to compute the quantiles. If None, use a flattened array. + """ + alpha = min(alpha, 1-alpha) + z = norm.ppf(1-alpha/2.) + xq = mstats.mquantiles(data, prob, alphap=0, betap=0, axis=axis) + smj = mjci(data, prob, axis=axis) + return (xq - z * smj, xq + z * smj) + + +#............................................................................. +def median_cihs(data, alpha=0.05, axis=None): + """Computes the alpha-level confidence interval for the median of the data, +following the Hettmasperger-Sheather method. + +Parameters +---------- + data : sequence + Input data. Masked values are discarded. The input should be 1D only, or + axis should be set to None. + alpha : float + Confidence level of the intervals. + axis : integer + Axis along which to compute the quantiles. If None, use a flattened array. + """ + def _cihs_1D(data, alpha): + data = np.sort(data.compressed()) + n = len(data) + alpha = min(alpha, 1-alpha) + k = int(binom._ppf(alpha/2., n, 0.5)) + gk = binom.cdf(n-k,n,0.5) - binom.cdf(k-1,n,0.5) + if gk < 1-alpha: + k -= 1 + gk = binom.cdf(n-k,n,0.5) - binom.cdf(k-1,n,0.5) + gkk = binom.cdf(n-k-1,n,0.5) - binom.cdf(k,n,0.5) + I = (gk - 1 + alpha)/(gk - gkk) + lambd = (n-k) * I / float(k + (n-2*k)*I) + lims = (lambd*data[k] + (1-lambd)*data[k-1], + lambd*data[n-k-1] + (1-lambd)*data[n-k]) + return lims + data = ma.rray(data, copy=False) + # Computes quantiles along axis (or globally) + if (axis is None): + result = _cihs_1D(data.compressed(), alpha) + else: + assert data.ndim <= 2, "Array should be 2D at most !" + result = ma.apply_along_axis(_cihs_1D, axis, data, alpha) + # + return result + +#.............................................................................. +def compare_medians_ms(group_1, group_2, axis=None): + """Compares the medians from two independent groups along the given axis. + +The comparison is performed using the McKean-Schrader estimate of the standard +error of the medians. + +Parameters +---------- + group_1 : {sequence} + First dataset. + group_2 : {sequence} + Second dataset. + axis : {integer} + Axis along which the medians are estimated. If None, the arrays are flattened. + +Returns +------- + A (p,) array of comparison values. + + """ + (med_1, med_2) = (ma.median(group_1,axis=axis), ma.median(group_2,axis=axis)) + (std_1, std_2) = (mstats.stde_median(group_1, axis=axis), + mstats.stde_median(group_2, axis=axis)) + W = np.abs(med_1 - med_2) / ma.sqrt(std_1**2 + std_2**2) + return 1 - norm.cdf(W) + + +def idealfourths(data, axis=None): + """Returns an estimate of the lower and upper quartiles of the data along + the given axis, as computed with the ideal fourths. + """ + def _idf(data): + x = data.compressed() + n = len(x) + if n < 3: + return [np.nan,np.nan] + (j,h) = divmod(n/4. + 5/12.,1) + qlo = (1-h)*x[j-1] + h*x[j] + k = n - j + qup = (1-h)*x[k] + h*x[k-1] + return [qlo, qup] + data = ma.sort(data, axis=axis).view(MaskedArray) + if (axis is None): + return _idf(data) + else: + return ma.apply_along_axis(_idf, axis, data) + + +def rsh(data, points=None): + """Evaluates Rosenblatt's shifted histogram estimators for each point +on the dataset 'data'. + +Parameters + data : sequence + Input data. Masked values are ignored. + points : sequence + Sequence of points where to evaluate Rosenblatt shifted histogram. + If None, use the data. + """ + data = ma.array(data, copy=False) + if points is None: + points = data + else: + points = np.array(points, copy=False, ndmin=1) + if data.ndim != 1: + raise AttributeError("The input array should be 1D only !") + n = data.count() + r = idealfourths(data, axis=None) + h = 1.2 * (r[-1]-r[0]) / n**(1./5) + nhi = (data[:,None] <= points[None,:] + h).sum(0) + nlo = (data[:,None] < points[None,:] - h).sum(0) + return (nhi-nlo) / (2.*n*h) + + +############################################################################### + Added: trunk/scipy/stats/mstats.py =================================================================== --- trunk/scipy/stats/mstats.py 2008-04-13 22:17:05 UTC (rev 4140) +++ trunk/scipy/stats/mstats.py 2008-04-14 19:01:01 UTC (rev 4141) @@ -0,0 +1,1961 @@ +""" +An extension of scipy.stats.stats to support masked arrays + +:author: Pierre GF Gerard-Marchant +:contact: pierregm_at_uga_edu +""" +#TODO : f_value_wilks_lambda looks botched... what are dfnum & dfden for ? +#TODO : ttest_reel looks botched: what are x1,x2,v1,v2 for ? +#TODO : reimplement ksonesamp + +__author__ = "Pierre GF Gerard-Marchant" +__docformat__ = "restructuredtext en" + +__all__ = ['argstoarray', + 'betai', + 'chisquare','corrcoef','count_tied_groups','cov', + 'describe', + 'f_oneway','f_value_wilks_lambda','find_repeats','friedmanchisquare', + 'gmean', + 'hmean', + 'kendalltau','kendalltau_seasonal','kruskal','kruskalwallis', + 'ks_twosamp','ks_2samp','kurtosis','kurtosistest', + 'linregress', + 'mannwhitneyu', 'meppf','mode','moment','mquantiles','msign', + 'normaltest', + 'obrientransform', + 'pearsonr','plotting_positions','pointbiserialr', + 'rankdata', + 'samplestd','samplevar','scoreatpercentile','sem','std', + 'sen_seasonal_slopes','signaltonoise','skew','skewtest','spearmanr', + 'stderr', + 'theilslopes','threshold','tmax','tmean','tmin','trim','trimboth', + 'trimtail','trima','trimr','trimmed_mean','trimmed_std', + 'trimmed_stde','trimmed_var','tsem','ttest_1samp','ttest_onesamp', + 'ttest_ind','ttest_rel','tvar', + 'var','variation', + 'winsorize', + 'z','zmap','zs' + ] + +import numpy as np +from numpy import ndarray +import numpy.ma as ma +from numpy.ma import MaskedArray, masked, nomask + +import itertools +import warnings + + +import scipy.stats as stats +import scipy.special as special +import scipy.misc as misc +import scipy.stats.futil as futil + + +genmissingvaldoc = """ +Notes +----- + Missing values are considered pair-wise: if a value is missing in x, + the corresponding value in y is masked. +""" +#------------------------------------------------------------------------------ +def _chk_asarray(a, axis): + if axis is None: + a = ma.ravel(a) + outaxis = 0 + else: + a = ma.asanyarray(a) + outaxis = axis + return a, outaxis + +def _chk2_asarray(a, b, axis): + if axis is None: + a = ma.ravel(a) + b = ma.ravel(b) + outaxis = 0 + else: + a = ma.asanyarray(a) + b = ma.asanyarray(b) + outaxis = axis + return a, b, outaxis + +def _chk_size(a,b): + a = ma.asanyarray(a) + b = ma.asanyarray(b) + (na, nb) = (a.size, b.size) + if na != nb: + raise ValueError("The size of the input array should match!"\ + " (%s <> %s)" % (na,nb)) + return (a,b,na) + +def argstoarray(*args): + """Constructs a 2D array from a sequence of sequences. Sequences are filled + with missing values to match the length of the longest sequence. + + Returns + ------- + output : MaskedArray + a (mxn) masked array, where m is the number of arguments and n the + length of the longest argument. + """ + if len(args) == 1 and not isinstance(args[0], ndarray): + output = ma.asarray(args[0]) + assert(output.ndim == 2, "The input should be 2D!") + else: + n = len(args) + m = max([len(k) for k in args]) + output = ma.array(np.empty((n,m), dtype=float), mask=True) + for (k,v) in enumerate(args): + output[k,:len(v)] = v + output[np.logical_not(np.isfinite(output._data))] = masked + return output + + + +#####-------------------------------------------------------------------------- +#---- --- Ranking --- +#####-------------------------------------------------------------------------- + +def find_repeats(arr): + """Find repeats in arr and return a tuple (repeats, repeat_count). + Masked values are discarded. + +Parameters +---------- + arr : sequence + Input array. The array is flattened if it is not 1D. + +Returns +------- + repeats : ndarray + Array of repeated values. + counts : ndarray + Array of counts. + + """ + marr = ma.compressed(arr) + if not marr.size: + return (np.array(0), np.array(0)) + (v1, v2, n) = futil.dfreps(ma.array(ma.compressed(arr), copy=True)) + return (v1[:n], v2[:n]) + + +def count_tied_groups(x, use_missing=False): + """Counts the number of tied values in x, and returns a dictionary + (nb of ties: nb of groups). + +Parameters +---------- + x : sequence + Sequence of data on which to counts the ties + use_missing : boolean + Whether to consider missing values as tied. + +Example +------- + >>>z = [0, 0, 0, 2, 2, 2, 3, 3, 4, 5, 6] + >>>count_tied_groups(z) + >>>{2:1, 3:2} + >>># The ties were 0 (3x), 2 (3x) and 3 (2x) + >>>z = ma.array([0, 0, 1, 2, 2, 2, 3, 3, 4, 5, 6]) + >>>count_tied_groups(z) + >>>{2:2, 3:1} + >>># The ties were 0 (2x), 2 (3x) and 3 (2x) + >>>z[[1,-1]] = masked + >>>count_tied_groups(z) + >>>{2:2, 3:1} + >>># The ties were 2 (3x), 3 (2x) and masked (2x) + """ + nmasked = ma.getmask(x).sum() + # We need the copy as find_repeats will overwrite the initial data + data = ma.compressed(x).copy() + (ties, counts) = find_repeats(data) + nties = {} + if len(ties): + nties = dict(zip(np.unique(counts), itertools.repeat(1))) + nties.update(dict(zip(*find_repeats(counts)))) + if nmasked and use_missing: + try: + nties[nmasked] += 1 + except KeyError: + nties[nmasked] = 1 + return nties + + +def rankdata(data, axis=None, use_missing=False): + """Returns the rank (also known as order statistics) of each data point + along the given axis. + + If some values are tied, their rank is averaged. + If some values are masked, their rank is set to 0 if use_missing is False, + or set to the average rank of the unmasked values if use_missing is True. + + Parameters + ---------- + data : sequence + Input data. The data is transformed to a masked array + axis : {None,int} optional + Axis along which to perform the ranking. + If None, the array is first flattened. An exception is raised if + the axis is specified for arrays with a dimension larger than 2 + use_missing : {boolean} optional + Whether the masked values have a rank of 0 (False) or equal to the + average rank of the unmasked values (True). + """ + # + def _rank1d(data, use_missing=False): + n = data.count() + rk = np.empty(data.size, dtype=float) + idx = data.argsort() + rk[idx[:n]] = np.arange(1,n+1) + # + if use_missing: + rk[idx[n:]] = (n+1)/2. + else: + rk[idx[n:]] = 0 + # + repeats = find_repeats(data.copy()) + for r in repeats[0]: + condition = (data==r).filled(False) + rk[condition] = rk[condition].mean() + return rk + # + data = ma.array(data, copy=False) + if axis is None: + if data.ndim > 1: + return _rank1d(data.ravel(), use_missing).reshape(data.shape) + else: + return _rank1d(data, use_missing) + else: + return ma.apply_along_axis(_rank1d,axis,data,use_missing).view(ndarray) + + +#####-------------------------------------------------------------------------- +#---- --- Central tendency --- +#####-------------------------------------------------------------------------- + +def gmean(a, axis=0): + a, axis = _chk_asarray(a, axis) + log_a = ma.log(a) + return ma.exp(log_a.mean(axis=axis)) +gmean.__doc__ = stats.gmean.__doc__ + + +def hmean(a, axis=0): + a, axis = _chk_asarray(a, axis) + if isinstance(a, MaskedArray): + size = a.count(axis) + else: + size = a.shape[axis] + return size / (1.0/a).sum(axis) +hmean.__doc__ = stats.hmean.__doc__ + + +def mode(a, axis=0): + def _mode1D(a): + (rep,cnt) = find_repeats(a) + if not cnt.ndim: + return (0,0) + elif cnt.size: + return (rep[cnt.argmax()], cnt.max()) + return (a[0], 1) + # + if axis is None: + output = _mode1D(ma.ravel(a)) + else: + output = ma.apply_along_axis(_mode1D, axis, a) + return output +mode.__doc__ = stats.mode.__doc__ + + +#####-------------------------------------------------------------------------- +#---- --- Probabilities --- +#####-------------------------------------------------------------------------- + +def betai(a, b, x): + x = np.asanyarray(x) + x = ma.where(x < 1.0, x, 1.0) # if x > 1 then return 1.0 + return special.betainc(a, b, x) +betai.__doc__ = stats.betai.__doc__ + + +#####-------------------------------------------------------------------------- +#---- --- Correlation --- +#####-------------------------------------------------------------------------- + +def msign(x): + """Returns the sign of x, or 0 if x is masked.""" + return ma.filled(np.sign(x), 0) + + +def cov(x, y=None, rowvar=False, bias=False, allow_masked=True): + """Estimates the covariance matrix. + +Normalization is by (N-1) where N is the number of observations (unbiased +estimate). If bias is True then normalization is by N. + + + +Parameters +---------- + x : ndarray + Input data. If x is a 1D array, returns the variance. If x is a 2D array, + returns the covariance matrix. + y : {None, ndarray} optional + Optional set of variables. + rowvar : {False, True} optional + If rowvar is true, then each row is a variable with obersvations in columns. + If rowvar is False, each column is a variable and the observations are in + the rows. + bias : {False, True} optional + Whether to use a biased (True) or unbiased (False) estimate of the covariance. + If bias is True, then the normalization is by N, the number of observations. + Otherwise, the normalization is by (N-1). + allow_masked : {True, False} optional + If True, masked values are propagated pair-wise: if a value is masked in x, + the corresponding value is masked in y. + If False, raises an exception. + """ + x = ma.asarray(x) + if y is None: + y = x + else: + y = ma.asarray(y) + common_mask = ma.mask_or(ma.getmask(x), ma.getmask(y)) + if allow_masked: + x.unshare_mask() + y.unshare_mask() + x._mask = y._mask = common_mask + elif common_mask is not nomask: + raise ValueError("Cannot process masked data...") + n = x.count() + # + if rowvar: + (x, y) = (x.T, y.T) + # + x -= x.mean(0) + y -= y.mean(0) + result = np.dot(x.filled(0).T, y.filled(0).conj()).squeeze() + if bias: + result /= float(n) + else: + result /= (n-1.) + return result + + +def corrcoef(x, y=None, rowvar=False, bias=False, allow_masked=True): + """The correlation coefficients formed from 2-d array x, where the + rows are the observations, and the columns are variables. + + corrcoef(x,y) where x and y are 1d arrays is the same as + corrcoef(transpose([x,y])) + +Parameters +---------- + x : ndarray + Input data. If x is a 1D array, returns the variance. If x is a 2D array, + returns the covariance matrix. + y : {None, ndarray} optional + Optional set of variables. + rowvar : {False, True} optional + If True, then each row is a variable with obersvations in columns. + If False, each column is a variable and the observations are in the rows. + bias : {False, True} optional + Whether to use a biased (True) or unbiased (False) estimate of the + covariance. + If True, then the normalization is by N, the number of observations. + Otherwise, the normalization is by (N-1). + allow_masked : {True, False} optional + If True, masked values are propagated pair-wise: if a value is masked in x, + the corresponding value is masked in y. + If False, raises an exception. + """ + if y is not None: + x = ma.column_stack([x,y]) + y = None + c = cov(x, y, rowvar=rowvar, bias=bias, allow_masked=allow_masked) + d = ma.diagonal(c) + return c/ma.sqrt(ma.multiply.outer(d,d)) + + +def pearsonr(x,y): + """Calculates a Pearson correlation coefficient and the p-value for testing + non-correlation. + + The Pearson correlation coefficient measures the linear relationship + between two datasets. Strictly speaking, Pearson's correlation requires + that each dataset be normally distributed. Like other correlation + coefficients, this one varies between -1 and +1 with 0 implying no + correlation. Correlations of -1 or +1 imply an exact linear + relationship. Positive correlations imply that as x increases, so does + y. Negative correlations imply that as x increases, y decreases. + + The p-value roughly indicates the probability of an uncorrelated system + producing datasets that have a Pearson correlation at least as extreme + as the one computed from these datasets. The p-values are not entirely + reliable but are probably reasonable for datasets larger than 500 or so. + + Parameters + ---------- + x : 1D array + y : 1D array the same length as x + + Returns + ------- + (Pearson's correlation coefficient, + 2-tailed p-value) + + References + ---------- + http://www.statsoft.com/textbook/glosp.html#Pearson%20Correlation + """ + (x, y, n) = _chk_size(x, y) + (x, y) = (x.ravel(), y.ravel()) + # Get the common mask and the total nb of unmasked elements + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + n -= m.sum() + df = n-2 + if df < 0: + return (masked, masked) + # + (mx, my) = (x.mean(), y.mean()) + (xm, ym) = (x-mx, y-my) + # + r_num = n*(ma.add.reduce(xm*ym)) + r_den = n*ma.sqrt(ma.dot(xm,xm)*ma.dot(ym,ym)) + r = (r_num / r_den) + # Presumably, if r > 1, then it is only some small artifact of floating + # point arithmetic. + r = min(r, 1.0) + r = max(r, -1.0) + df = n-2 + # + t = ma.sqrt(df/((1.0-r)*(1.0+r))) * r + if t is masked: + prob = 0. + else: + prob = betai(0.5*df,0.5,df/(df+t*t)) + return (r,prob) + + +def spearmanr(x, y, use_ties=True): + """Calculates a Spearman rank-order correlation coefficient and the p-value + to test for non-correlation. + + The Spearman correlation is a nonparametric measure of the linear + relationship between two datasets. Unlike the Pearson correlation, the + Spearman correlation does not assume that both datasets are normally + distributed. Like other correlation coefficients, this one varies + between -1 and +1 with 0 implying no correlation. Correlations of -1 or + +1 imply an exact linear relationship. Positive correlations imply that + as x increases, so does y. Negative correlations imply that as x + increases, y decreases. + + Missing values are discarded pair-wise: if a value is missing in x, the + corresponding value in y is masked. + + The p-value roughly indicates the probability of an uncorrelated system + producing datasets that have a Spearman correlation at least as extreme + as the one computed from these datasets. The p-values are not entirely + reliable but are probably reasonable for datasets larger than 500 or so. + +Parameters +---------- + x : 1D array + y : 1D array the same length as x + The lengths of both arrays must be > 2. + use_ties : {True, False} optional + Whether the correction for ties should be computed. + +Returns +------- + (Spearman correlation coefficient, + 2-tailed p-value) + + References + ---------- + [CRCProbStat2000] section 14.7 + """ + (x, y, n) = _chk_size(x, y) + (x, y) = (x.ravel(), y.ravel()) + # + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + n -= m.sum() + if m is not nomask: + x = ma.array(x, mask=m, copy=True) + y = ma.array(y, mask=m, copy=True) + df = n-2 + if df < 0: + raise ValueError("The input must have at least 3 entries!") + # Gets the ranks and rank differences + rankx = rankdata(x) + ranky = rankdata(y) + dsq = np.add.reduce((rankx-ranky)**2) + # Tie correction + if use_ties: + xties = count_tied_groups(x) + yties = count_tied_groups(y) + corr_x = np.sum(v*k*(k**2-1) for (k,v) in xties.iteritems())/12. + corr_y = np.sum(v*k*(k**2-1) for (k,v) in yties.iteritems())/12. + else: + corr_x = corr_y = 0 + denom = n*(n**2 - 1)/6. + if corr_x != 0 or corr_y != 0: + rho = denom - dsq - corr_x - corr_y + rho /= ma.sqrt((denom-2*corr_x)*(denom-2*corr_y)) + else: + rho = 1. - dsq/denom + # + t = ma.sqrt(ma.divide(df,(rho+1.0)*(1.0-rho))) * rho + if t is masked: + prob = 0. + else: + prob = betai(0.5*df,0.5,df/(df+t*t)) + return rho, prob + + +def kendalltau(x, y, use_ties=True, use_missing=False): + """Computes Kendall's rank correlation tau on two variables *x* and *y*. + +Parameters +---------- + xdata: sequence + First data list (for example, time). + ydata: sequence + Second data list. + use_ties: {True, False} optional + Whether ties correction should be performed. + use_missing: {False, True} optional + Whether missing data should be allocated a rank of 0 (False) or the + average rank (True) + """ + (x, y, n) = _chk_size(x, y) + (x, y) = (x.flatten(), y.flatten()) + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + if m is not nomask: + x = ma.array(x, mask=m, copy=True) + y = ma.array(y, mask=m, copy=True) + n -= m.sum() + # + rx = ma.masked_equal(rankdata(x, use_missing=use_missing),0) + ry = ma.masked_equal(rankdata(y, use_missing=use_missing),0) + idx = rx.argsort() + (rx, ry) = (rx[idx], ry[idx]) + C = np.sum((((ry[i+1:]>ry[i])*(rx[i+1:]>rx[i])).filled(0).sum() + for i in range(len(ry)-1))) + D = np.sum((((ry[i+1:]rx[i])).filled(0).sum() + for i in range(len(ry)-1))) + if use_ties: + xties = count_tied_groups(x) + yties = count_tied_groups(y) + corr_x = np.sum(v*k*(k-1) for (k,v) in xties.iteritems()) + corr_y = np.sum(v*k*(k-1) for (k,v) in yties.iteritems()) + denom = ma.sqrt((n*(n-1)-corr_x) * (n*(n-1)-corr_y)) / 2. + else: + denom = n*(n-1)/2. + tau = (C-D) / denom + # + var_s = n*(n-1)*(2*n+5) + if use_ties: + var_s -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in xties.iteritems()) + var_s -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in yties.iteritems()) + v1 = np.sum(v*k*(k-1) for (k,v) in xties.iteritems()) * \ + np.sum(v*k*(k-1) for (k,v) in yties.iteritems()) + v1 /= 2.*n*(n-1) + v2 = np.sum(v*k*(k-1)*(k-2) for (k,v) in xties.iteritems()) * \ + np.sum(v*k*(k-1)*(k-2) for (k,v) in yties.iteritems()) + v2 /= 9.*n*(n-1)*(n-2) + else: + v1 = v2 = 0 + var_s /= 18. + var_s += (v1 + v2) + z = (C-D)/np.sqrt(var_s) + prob = special.erfc(abs(z)/np.sqrt(2)) + return (tau,prob) + + +def kendalltau_seasonal(x): + """Computes a multivariate extension Kendall's rank correlation tau, designed + for seasonal data. + +Parameters +---------- + x: 2D array + Array of seasonal data, with seasons in columns. + """ + x = ma.array(x, subok=True, copy=False, ndmin=2) + (n,m) = x.shape + n_p = x.count(0) + # + S_szn = np.sum(msign(x[i:]-x[i]).sum(0) for i in range(n)) + S_tot = S_szn.sum() + # + n_tot = x.count() + ties = count_tied_groups(x.compressed()) + corr_ties = np.sum(v*k*(k-1) for (k,v) in ties.iteritems()) + denom_tot = ma.sqrt(n_tot*(n_tot-1)*(n_tot*(n_tot-1)-corr_ties))/2. + # + R = rankdata(x, axis=0, use_missing=True) + K = ma.empty((m,m), dtype=int) + covmat = ma.empty((m,m), dtype=float) +# cov_jj = ma.empty(m, dtype=float) + denom_szn = ma.empty(m, dtype=float) + for j in range(m): + ties_j = count_tied_groups(x[:,j].compressed()) + corr_j = np.sum(v*k*(k-1) for (k,v) in ties_j.iteritems()) + cmb = n_p[j]*(n_p[j]-1) + for k in range(j,m,1): + K[j,k] = np.sum(msign((x[i:,j]-x[i,j])*(x[i:,k]-x[i,k])).sum() + for i in range(n)) + covmat[j,k] = (K[j,k] +4*(R[:,j]*R[:,k]).sum() - \ + n*(n_p[j]+1)*(n_p[k]+1))/3. + K[k,j] = K[j,k] + covmat[k,j] = covmat[j,k] +# cov_jj[j] = (nn_p*(2*n_p[j]+5)) +# cov_jj[j] -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in ties_j.iteritems()) +# cov_jj[j] /= 18. + denom_szn[j] = ma.sqrt(cmb*(cmb-corr_j)) / 2. + var_szn = covmat.diagonal() + # + z_szn = msign(S_szn) * (abs(S_szn)-1) / ma.sqrt(var_szn) + z_tot_ind = msign(S_tot) * (abs(S_tot)-1) / ma.sqrt(var_szn.sum()) + z_tot_dep = msign(S_tot) * (abs(S_tot)-1) / ma.sqrt(covmat.sum()) + # + prob_szn = special.erfc(abs(z_szn)/np.sqrt(2)) + prob_tot_ind = special.erfc(abs(z_tot_ind)/np.sqrt(2)) + prob_tot_dep = special.erfc(abs(z_tot_dep)/np.sqrt(2)) + # + chi2_tot = (z_szn*z_szn).sum() + chi2_trd = m * z_szn.mean()**2 + output = {'seasonal tau': S_szn/denom_szn, + 'global tau': S_tot/denom_tot, + 'global tau (alt)': S_tot/denom_szn.sum(), + 'seasonal p-value': prob_szn, + 'global p-value (indep)': prob_tot_ind, + 'global p-value (dep)': prob_tot_dep, + 'chi2 total': chi2_tot, + 'chi2 trend': chi2_trd, + } + return output + + +def pointbiserialr(x, y): + x = ma.fix_invalid(x, copy=True).astype(bool) + y = ma.fix_invalid(y, copy=True).astype(float) + # Get rid of the missing data .......... + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + if m is not nomask: + unmask = np.logical_not(m) + x = x[unmask] + y = y[unmask] + # + n = len(x) + # phat is the fraction of x values that are True + phat = x.sum() / float(n) + y0 = y[~x] # y-values where x is False + y1 = y[x] # y-values where x is True + y0m = y0.mean() + y1m = y1.mean() + # + rpb = (y1m - y0m)*np.sqrt(phat * (1-phat)) / y.std() + # + df = n-2 + t = rpb*ma.sqrt(df/(1.0-rpb**2)) + prob = betai(0.5*df, 0.5, df/(df+t*t)) + return rpb, prob +pointbiserialr.__doc__ = stats.pointbiserialr.__doc__ + genmissingvaldoc + + +def linregress(*args): + if len(args) == 1: # more than 1D array? + args = ma.array(args[0], copy=True) + if len(args) == 2: + x = args[0] + y = args[1] + else: + x = args[:,0] + y = args[:,1] + else: + x = ma.array(args[0]).flatten() + y = ma.array(args[1]).flatten() + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + if m is not nomask: + x = ma.array(x,mask=m) + y = ma.array(y,mask=m) + n = len(x) + (xmean, ymean) = (x.mean(), y.mean()) + (xm, ym) = (x-xmean, y-ymean) + (Sxx, Syy) = (ma.add.reduce(xm*xm), ma.add.reduce(ym*ym)) + Sxy = ma.add.reduce(xm*ym) + r_den = ma.sqrt(Sxx*Syy) + if r_den == 0.0: + r = 0.0 + else: + r = Sxy / r_den + if (r > 1.0): + r = 1.0 # from numerical error + #z = 0.5*log((1.0+r+TINY)/(1.0-r+TINY)) + df = n-2 + t = r * ma.sqrt(df/(1.0-r*r)) + prob = betai(0.5*df,0.5,df/(df+t*t)) + slope = Sxy / Sxx + intercept = ymean - slope*xmean + sterrest = ma.sqrt(1.-r*r) * y.std() + return slope, intercept, r, prob, sterrest, Syy/Sxx +linregress.__doc__ = stats.linregress.__doc__ + genmissingvaldoc + + +def theilslopes(y, x=None, alpha=0.05): + """Computes the Theil slope over the dataset (x,y), as the median of all slopes + between paired values. + + Parameters + ---------- + y : sequence + Dependent variable. + x : {None, sequence} optional + Independent variable. If None, use arange(len(y)) instead. + alpha : float + Confidence degree. + + """ + y = ma.asarray(y).flatten() + y[-1] = masked + n = len(y) + if x is None: + x = ma.arange(len(y), dtype=float) + else: + x = ma.asarray(x).flatten() + if len(x) != n: + raise ValueError, "Incompatible lengths ! (%s<>%s)" % (n,len(x)) + m = ma.mask_or(ma.getmask(x), ma.getmask(y)) + y._mask = x._mask = m + ny = y.count() + # + slopes = ma.hstack([(y[i+1:]-y[i])/(x[i+1:]-x[i]) for i in range(n-1)]) + slopes.sort() + medslope = ma.median(slopes) + medinter = ma.median(y) - medslope*ma.median(x) + # + if alpha > 0.5: + alpha = 1.-alpha + z = stats.distributions.norm.ppf(alpha/2.) + # + (xties, yties) = (count_tied_groups(x), count_tied_groups(y)) + nt = ny*(ny-1)/2. + sigsq = (ny*(ny-1)*(2*ny+5)/18.) + sigsq -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in xties.iteritems()) + sigsq -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in yties.iteritems()) + sigma = np.sqrt(sigsq) + + Ru = np.round((nt - z*sigma)/2. + 1) + Rl = np.round((nt + z*sigma)/2.) + delta = slopes[[Rl,Ru]] + return medslope, medinter, delta + + +def sen_seasonal_slopes(x): + x = ma.array(x, subok=True, copy=False, ndmin=2) + (n,_) = x.shape + # Get list of slopes per season + szn_slopes = ma.vstack([(x[i+1:]-x[i])/np.arange(1,n-i)[:,None] + for i in range(n)]) + szn_medslopes = ma.median(szn_slopes, axis=0) + medslope = ma.median(szn_slopes, axis=None) + return szn_medslopes, medslope + + +#####-------------------------------------------------------------------------- +#---- --- Inferential statistics --- +#####-------------------------------------------------------------------------- + +def ttest_onesamp(a, popmean): + a = ma.asarray(a) + x = a.mean(axis=None) + v = a.var(axis=None,ddof=1) + n = a.count(axis=None) + df = n-1 + svar = ((n-1)*v) / float(df) + t = (x-popmean)/ma.sqrt(svar*(1.0/n)) + prob = betai(0.5*df,0.5,df/(df+t*t)) + return t,prob +ttest_onesamp.__doc__ = stats.ttest_1samp.__doc__ +ttest_1samp = ttest_onesamp + + +def ttest_ind(a, b, axis=0): + a, b, axis = _chk2_asarray(a, b, axis) + (x1, x2) = (a.mean(axis), b.mean(axis)) + (v1, v2) = (a.var(axis=axis, ddof=1), b.var(axis=axis, ddof=1)) + (n1, n2) = (a.count(axis), b.count(axis)) + df = n1+n2-2 + svar = ((n1-1)*v1+(n2-1)*v2) / float(df) + svar == 0 + t = (x1-x2)/ma.sqrt(svar*(1.0/n1 + 1.0/n2)) # N-D COMPUTATION HERE!!!!!! + t = ma.filled(t, 1) # replace NaN t-values with 1.0 + probs = betai(0.5*df,0.5,float(df)/(df+t*t)).reshape(t.shape) + return t, probs.squeeze() +ttest_ind.__doc__ = stats.ttest_ind.__doc__ + + +def ttest_rel(a,b,axis=None): + a, b, axis = _chk2_asarray(a, b, axis) + if len(a)!=len(b): + raise ValueError, 'unequal length arrays' + (x1, x2) = (a.mean(axis), b.mean(axis)) + (v1, v2) = (a.var(axis=axis, ddof=1), b.var(axis=axis, ddof=1)) + n = a.count(axis) + df = (n-1.0) + d = (a-b).astype('d') + denom = ma.sqrt((n*ma.add.reduce(d*d,axis) - ma.add.reduce(d,axis)**2) /df) + #zerodivproblem = denom == 0 + t = ma.add.reduce(d, axis) / denom + t = ma.filled(t, 1) + probs = betai(0.5*df,0.5,df/(df+t*t)).reshape(t.shape).squeeze() + return t, probs +ttest_rel.__doc__ = stats.ttest_rel.__doc__ + + +def chisquare(f_obs, f_exp=None): + f_obs = ma.asarray(f_obs) + if f_exp is None: + f_exp = ma.array([f_obs.mean(axis=0)] * len(f_obs)) + f_exp = f_exp.astype(float) + chisq = ma.add.reduce((f_obs-f_exp)**2 / f_exp) + return chisq, stats.chisqprob(chisq, f_obs.count(0)-1) +chisquare.__doc__ = stats.chisquare.__doc__ + + +def mannwhitneyu(x,y, use_continuity=True): + """Computes the Mann-Whitney on samples x and y. + Missing values in x and/or y are discarded. + + Parameters + ---------- + x : sequence + y : sequence + use_continuity : {True, False} optional + Whether a continuity correction (1/2.) should be taken into account. + + Returns + ------- + u : float + The Mann-Whitney statistics + prob : float + Approximate p-value assuming a normal distribution. + + """ + x = ma.asarray(x).compressed().view(ndarray) + y = ma.asarray(y).compressed().view(ndarray) + ranks = rankdata(np.concatenate([x,y])) + (nx, ny) = (len(x), len(y)) + nt = nx + ny + U = ranks[:nx].sum() - nx*(nx+1)/2. + U = max(U, nx*ny - U) + u = nx*ny - U + # + mu = (nx*ny)/2. + sigsq = (nt**3 - nt)/12. + ties = count_tied_groups(ranks) + sigsq -= np.sum(v*(k**3-k) for (k,v) in ties.iteritems())/12. + sigsq *= nx*ny/float(nt*(nt-1)) + # + if use_continuity: + z = (U - 1/2. - mu) / ma.sqrt(sigsq) + else: + z = (U - mu) / ma.sqrt(sigsq) + prob = special.erfc(abs(z)/np.sqrt(2)) + return (u, prob) + + +def kruskalwallis(*args): + output = argstoarray(*args) + ranks = ma.masked_equal(rankdata(output, use_missing=False), 0) + sumrk = ranks.sum(-1) + ngrp = ranks.count(-1) + ntot = ranks.count() +# ssbg = (sumrk**2/ranks.count(-1)).sum() - ranks.sum()**2/ntotal +# H = ssbg / (ntotal*(ntotal+1)/12.) + H = 12./(ntot*(ntot+1)) * (sumrk**2/ngrp).sum() - 3*(ntot+1) + # Tie correction + ties = count_tied_groups(ranks) + T = 1. - np.sum(v*(k**3-k) for (k,v) in ties.iteritems())/float(ntot**3-ntot) + if T == 0: + raise ValueError, 'All numbers are identical in kruskal' + H /= T + # + df = len(output) - 1 + prob = stats.chisqprob(H,df) + return (H, prob) +kruskal = kruskalwallis +kruskalwallis.__doc__ = stats.kruskal.__doc__ + + +_kolmog2 = special.kolmogorov +def _kolmog1(x,n): + if x <= 0: + return 0 + if x >= 1: + return 1 + j = np.arange(np.floor(n*(1-x))+1) + return 1 - x * np.sum(np.exp(np.log(misc.comb(n,j)) + + (n-j) * np.log(1-x-j/float(n)) + + (j-1) * np.log(x+j/float(n)))) + + +def ks_twosamp(data1, data2, alternative="two_sided"): + """Computes the Kolmogorov-Smirnov test on two samples. + Missing values are discarded. + + Parameters + ---------- + data1 : sequence + First data set + data2 : sequence + Second data set + alternative : {'two_sided', 'less', 'greater'} optional + Indicates the alternative hypothesis. + + Returns + ------- + d : float + Value of the Kolmogorov Smirnov test + p : float + Corresponding p-value. + + """ + (data1, data2) = (ma.asarray(data1), ma.asarray(data2)) + (n1, n2) = (data1.count(), data2.count()) + n = (n1*n2/float(n1+n2)) + mix = ma.concatenate((data1.compressed(), data2.compressed())) + mixsort = mix.argsort(kind='mergesort') + csum = np.where(mixsort threshmax).filled(False) + a[mask] = newval + return a + + +def trima(a, limits=None, inclusive=(True,True)): + """Trims an array by masking the data outside some given limits. + Returns a masked version of the input array. + + Parameters + ---------- + a : sequence + Input array. + limits : {None, tuple} optional + Tuple of (lower limit, upper limit) in absolute values. + Values of the input array lower (greater) than the lower (upper) limit + will be masked. A limit is None indicates an open interval. + inclusive : {(True,True) tuple} optional + Tuple of (lower flag, upper flag), indicating whether values exactly + equal to the lower (upper) limit are allowed. + + """ + a = ma.asarray(a) + a.unshare_mask() + if limits is None: + return a + (lower_lim, upper_lim) = limits + (lower_in, upper_in) = inclusive + condition = False + if lower_lim is not None: + if lower_in: + condition |= (a < lower_lim) + else: + condition |= (a <= lower_lim) + if upper_lim is not None: + if upper_in: + condition |= (a > upper_lim) + else: + condition |= (a >= upper_lim) + a[condition.filled(True)] = masked + return a + + +def trimr(a, limits=None, inclusive=(True, True), axis=None): + """Trims an array by masking some proportion of the data on each end. + Returns a masked version of the input array. + + Parameters + ---------- + a : sequence + Input array. + limits : {None, tuple} optional + Tuple of the percentages to cut on each side of the array, with respect + to the number of unmasked data, as floats between 0. and 1. + Noting n the number of unmasked data before trimming, the (n*limits[0])th + smallest data and the (n*limits[1])th largest data are masked, and the + total number of unmasked data after trimming is n*(1.-sum(limits)) + The value of one limit can be set to None to indicate an open interval. + inclusive : {(True,True) tuple} optional + Tuple of flags indicating whether the number of data being masked on the + left (right) end should be truncated (True) or rounded (False) to integers. + axis : {None,int} optional + Axis along which to trim. If None, the whole array is trimmed, but its + shape is maintained. + + """ + def _trimr1D(a, low_limit, up_limit, low_inclusive, up_inclusive): + n = a.count() + idx = a.argsort() + if low_limit: + if low_inclusive: + lowidx = int(low_limit*n) + else: + lowidx = np.round(low_limit*n) + a[idx[:lowidx]] = masked + if up_limit is not None: + if up_inclusive: + upidx = n - int(n*up_limit) + else: + upidx = n- np.round(n*up_limit) + a[idx[upidx:]] = masked + return a + # + a = ma.asarray(a) + a.unshare_mask() + if limits is None: + return a + # Check the limits + (lolim, uplim) = limits + errmsg = "The proportion to cut from the %s should be between 0. and 1." + if lolim is not None: + if lolim > 1. or lolim < 0: + raise ValueError(errmsg % 'beginning' + "(got %s)" % lolim) + if uplim is not None: + if uplim > 1. or uplim < 0: + raise ValueError(errmsg % 'end' + "(got %s)" % uplim) + # + (loinc, upinc) = inclusive + # + if axis is None: + shp = a.shape + return _trimr1D(a.ravel(),lolim,uplim,loinc,upinc).reshape(shp) + else: + return ma.apply_along_axis(_trimr1D, axis, a, lolim,uplim,loinc,upinc) + +trimdoc = """ + Parameters + ---------- + a : sequence + Input array + limits : {None, tuple} optional + If relative == False, tuple (lower limit, upper limit) in absolute values. + Values of the input array lower (greater) than the lower (upper) limit are + masked. + If relative == True, tuple (lower percentage, upper percentage) to cut + on each side of the array, with respect to the number of unmasked data. + Noting n the number of unmasked data before trimming, the (n*limits[0])th + smallest data and the (n*limits[1])th largest data are masked, and the + total number of unmasked data after trimming is n*(1.-sum(limits)) + In each case, the value of one limit can be set to None to indicate an + open interval. + If limits is None, no trimming is performed + inclusive : {(True, True) tuple} optional + If relative==False, tuple indicating whether values exactly equal to the + absolute limits are allowed. + If relative==True, tuple indicating whether the number of data being masked + on each side should be rounded (True) or truncated (False). + relative : {False, True} optional + Whether to consider the limits as absolute values (False) or proportions + to cut (True). + axis : {None, integer}, optional + Axis along which to trim. +""" + + +def trim(a, limits=None, inclusive=(True,True), relative=False, axis=None): + """Trims an array by masking the data outside some given limits. + Returns a masked version of the input array. + %s + + Examples + -------- + >>>z = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10] + >>>trim(z,(3,8)) + [--,--, 3, 4, 5, 6, 7, 8,--,--] + >>>trim(z,(0.1,0.2),relative=True) + [--, 2, 3, 4, 5, 6, 7, 8,--,--] + + + """ + if relative: + return trimr(a, limits=limits, inclusive=inclusive, axis=axis) + else: + return trima(a, limits=limits, inclusive=inclusive) +trim.__doc__ = trim.__doc__ % trimdoc + + +def trimboth(data, proportiontocut=0.2, inclusive=(True,True), axis=None): + """Trims the data by masking the int(proportiontocut*n) smallest and + int(proportiontocut*n) largest values of data along the given axis, where n + is the number of unmasked values before trimming. + +Parameters +---------- + data : ndarray + Data to trim. + proportiontocut : {0.2, float} optional + Percentage of trimming (as a float between 0 and 1). + If n is the number of unmasked values before trimming, the number of + values after trimming is: + (1-2*proportiontocut)*n. + inclusive : {(True, True) tuple} optional + Tuple indicating whether the number of data being masked on each side + should be rounded (True) or truncated (False). + axis : {None, integer}, optional + Axis along which to perform the trimming. + If None, the input array is first flattened. + + """ + return trimr(data, limits=(proportiontocut,proportiontocut), + inclusive=inclusive, axis=axis) + +#.............................................................................. +def trimtail(data, proportiontocut=0.2, tail='left', inclusive=(True,True), + axis=None): + """Trims the data by masking int(trim*n) values from ONE tail of the + data along the given axis, where n is the number of unmasked values. + +Parameters +---------- + data : {ndarray} + Data to trim. + proportiontocut : {0.2, float} optional + Percentage of trimming. If n is the number of unmasked values + before trimming, the number of values after trimming is + (1-proportiontocut)*n. + tail : {'left','right'} optional + If left (right), the ``proportiontocut`` lowest (greatest) values will + be masked. + inclusive : {(True, True) tuple} optional + Tuple indicating whether the number of data being masked on each side + should be rounded (True) or truncated (False). + axis : {None, integer}, optional + Axis along which to perform the trimming. + If None, the input array is first flattened. + + """ + tail = str(tail).lower()[0] + if tail == 'l': + limits = (proportiontocut,None) + elif tail == 'r': + limits = (None, proportiontocut) + else: + raise TypeError("The tail argument should be in ('left','right')") + return trimr(data, limits=limits, axis=axis, inclusive=inclusive) + +trim1 = trimtail + +def trimmed_mean(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, + axis=None): + """Returns the trimmed mean of the data along the given axis. + + %s + + """ % trimdoc + if (not isinstance(limits,tuple)) and isinstance(limits,float): + limits = (limits, limits) + if relative: + return trimr(a,limits=limits,inclusive=inclusive,axis=axis).mean(axis=axis) + else: + return trima(a,limits=limits,inclusive=inclusive).mean(axis=axis) + + +def trimmed_var(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, + axis=None, ddof=0): + """Returns the trimmed variance of the data along the given axis. + + %s + ddof : {0,integer}, optional + Means Delta Degrees of Freedom. The denominator used during computations + is (n-ddof). DDOF=0 corresponds to a biased estimate, DDOF=1 to an un- + biased estimate of the variance. + + """ % trimdoc + if (not isinstance(limits,tuple)) and isinstance(limits,float): + limits = (limits, limits) + if relative: + out = trimr(a,limits=limits, inclusive=inclusive,axis=axis) + else: + out = trima(a,limits=limits,inclusive=inclusive) + return out.var(axis=axis, ddof=ddof) + + +def trimmed_std(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, + axis=None, ddof=0): + """Returns the trimmed standard deviation of the data along the given axis. + + %s + ddof : {0,integer}, optional + Means Delta Degrees of Freedom. The denominator used during computations + is (n-ddof). DDOF=0 corresponds to a biased estimate, DDOF=1 to an un- + biased estimate of the variance. + + """ % trimdoc + if (not isinstance(limits,tuple)) and isinstance(limits,float): + limits = (limits, limits) + if relative: + out = trimr(a,limits=limits,inclusive=inclusive,axis=axis) + else: + out = trima(a,limits=limits,inclusive=inclusive) + return out.std(axis=axis,ddof=ddof) + + +def trimmed_stde(a, limits=(0.1,0.1), inclusive=(1,1), axis=None): + """Returns the standard error of the trimmed mean of the data along the given + axis. + Parameters + ---------- + a : sequence + Input array + limits : {(0.1,0.1), tuple of float} optional + tuple (lower percentage, upper percentage) to cut on each side of the + array, with respect to the number of unmasked data. + Noting n the number of unmasked data before trimming, the (n*limits[0])th + smallest data and the (n*limits[1])th largest data are masked, and the + total number of unmasked data after trimming is n*(1.-sum(limits)) + In each case, the value of one limit can be set to None to indicate an + open interval. + If limits is None, no trimming is performed + inclusive : {(True, True) tuple} optional + Tuple indicating whether the number of data being masked on each side + should be rounded (True) or truncated (False). + axis : {None, integer}, optional + Axis along which to trim. + """ + #........................ + def _trimmed_stde_1D(a, low_limit, up_limit, low_inclusive, up_inclusive): + "Returns the standard error of the trimmed mean for a 1D input data." + n = a.count() + idx = a.argsort() + if low_limit: + if low_inclusive: + lowidx = int(low_limit*n) + else: + lowidx = np.round(low_limit*n) + a[idx[:lowidx]] = masked + if up_limit is not None: + if up_inclusive: + upidx = n - int(n*up_limit) + else: + upidx = n- np.round(n*up_limit) + a[idx[upidx:]] = masked + nsize = a.count() + a[idx[:lowidx]] = a[idx[lowidx]] + a[idx[upidx:]] = a[idx[upidx-1]] + winstd = a.std(ddof=1) + return winstd / ((1-low_limit-up_limit)*np.sqrt(len(a))) + #........................ + a = ma.array(a, copy=True, subok=True) + a.unshare_mask() + if limits is None: + return a.std(axis=axis,ddof=1)/ma.sqrt(a.count(axis)) + if (not isinstance(limits,tuple)) and isinstance(limits,float): + limits = (limits, limits) + # Check the limits + (lolim, uplim) = limits + errmsg = "The proportion to cut from the %s should be between 0. and 1." + if lolim is not None: + if lolim > 1. or lolim < 0: + raise ValueError(errmsg % 'beginning' + "(got %s)" % lolim) + if uplim is not None: + if uplim > 1. or uplim < 0: + raise ValueError(errmsg % 'end' + "(got %s)" % uplim) + # + (loinc, upinc) = inclusive + if (axis is None): + shp = a.shape + return _trimmed_stde_1D(a.ravel(),lolim,uplim,loinc,upinc) + else: + assert a.ndim <= 2, "Array should be 2D at most !" + return ma.apply_along_axis(_trimmed_stde_1D, axis, a, + lolim,uplim,loinc,upinc) + + +def tmean(a, limits=None, inclusive=(True,True)): + return trima(a, limits=limits, inclusive=inclusive).mean() +tmean.__doc__ = stats.tmean.__doc__ + +def tvar(a, limits=None, inclusive=(True,True)): + return trima(a, limits=limits, inclusive=inclusive).var() +tvar.__doc__ = stats.tvar.__doc__ + +def tmin(a, lowerlimit=None, axis=0, inclusive=True): + a, axis = _chk_asarray(a, axis) + am = trima(a, (lowerlimit, None), (inclusive, False)) + return ma.minimum.reduce(am, axis) +tmin.__doc__ = stats.tmin.__doc__ + +def tmax(a, upperlimit, axis=0, inclusive=True): + a, axis = _chk_asarray(a, axis) + am = trima(a, (None, upperlimit), (False, inclusive)) + return ma.maximum.reduce(am, axis) +tmax.__doc__ = stats.tmax.__doc__ + +def tsem(a, limits=None, inclusive=(True,True)): + a = ma.asarray(a).ravel() + if limits is None: + n = float(a.count()) + return a.std()/ma.sqrt(n) + am = trima(a.ravel(), limits, inclusive) + sd = np.sqrt(am.var()) + return sd / am.count() +tsem.__doc__ = stats.tsem.__doc__ + + +def winsorize(a, limits=None, inclusive=(True,True), inplace=False, axis=None): + """Returns a Winsorized version of the input array. + + The (limits[0])th lowest values are set to the (limits[0])th percentile, + and the (limits[1])th highest values are set to the (limits[1])th + percentile. + Masked values are skipped. + + + Parameters + ---------- + a : sequence + Input array. + limits : {None, tuple of float} optional + Tuple of the percentages to cut on each side of the array, with respect + to the number of unmasked data, as floats between 0. and 1. + Noting n the number of unmasked data before trimming, the (n*limits[0])th + smallest data and the (n*limits[1])th largest data are masked, and the + total number of unmasked data after trimming is n*(1.-sum(limits)) + The value of one limit can be set to None to indicate an open interval. + inclusive : {(True, True) tuple} optional + Tuple indicating whether the number of data being masked on each side + should be rounded (True) or truncated (False). + inplace : {False, True} optional + Whether to winsorize in place (True) or to use a copy (False) + axis : {None, int} optional + Axis along which to trim. If None, the whole array is trimmed, but its + shape is maintained. + + """ + def _winsorize1D(a, low_limit, up_limit, low_include, up_include): + n = a.count() + idx = a.argsort() + if low_limit: + if low_include: + lowidx = int(low_limit*n) + else: + lowidx = np.round(low_limit*n) + a[idx[:lowidx]] = a[idx[lowidx]] + if up_limit is not None: + if up_include: + upidx = n - int(n*up_limit) + else: + upidx = n- np.round(n*up_limit) + a[idx[upidx:]] = a[idx[upidx-1]] + return a + # We gonna modify a: better make a copy + a = ma.array(a, copy=np.logical_not(inplace)) + # + if limits is None: + return a + if (not isinstance(limits,tuple)) and isinstance(limits,float): + limits = (limits, limits) + # Check the limits + (lolim, uplim) = limits + errmsg = "The proportion to cut from the %s should be between 0. and 1." + if lolim is not None: + if lolim > 1. or lolim < 0: + raise ValueError(errmsg % 'beginning' + "(got %s)" % lolim) + if uplim is not None: + if uplim > 1. or uplim < 0: + raise ValueError(errmsg % 'end' + "(got %s)" % uplim) + # + (loinc, upinc) = inclusive + # + if axis is None: + shp = a.shape + return _winsorize1D(a.ravel(),lolim,uplim,loinc,upinc).reshape(shp) + else: + return ma.apply_along_axis(_winsorize1D, axis,a,lolim,uplim,loinc,upinc) + + +#####-------------------------------------------------------------------------- +#---- --- Moments --- +#####-------------------------------------------------------------------------- + +def moment(a, moment=1, axis=0): + a, axis = _chk_asarray(a, axis) + if moment == 1: + # By definition the first moment about the mean is 0. + shape = list(a.shape) + del shape[axis] + if shape: + # return an actual array of the appropriate shape + return np.zeros(shape, dtype=float) + else: + # the input was 1D, so return a scalar instead of a rank-0 array + return np.float64(0.0) + else: + mn = ma.expand_dims(a.mean(axis=axis), axis) + s = ma.power((a-mn), moment) + return s.mean(axis=axis) +moment.__doc__ = stats.moment.__doc__ + + +def variation(a, axis=0): + a, axis = _chk_asarray(a, axis) + return a.std(axis)/a.mean(axis) +variation.__doc__ = stats.variation.__doc__ + + +def skew(a, axis=0, bias=True): + a, axis = _chk_asarray(a,axis) + n = a.count(axis) + m2 = moment(a, 2, axis) + m3 = moment(a, 3, axis) + vals = ma.where(m2 == 0, 0, m3 / m2**1.5) + if not bias: + can_correct = (n > 2) & (m2 > 0) + if can_correct.any(): + m2 = np.extract(can_correct, m2) + m3 = np.extract(can_correct, m3) + nval = ma.sqrt((n-1.0)*n)/(n-2.0)*m3/m2**1.5 + np.place(vals, can_correct, nval) + return vals +skew.__doc__ = stats.skew.__doc__ + + +def kurtosis(a, axis=0, fisher=True, bias=True): + a, axis = _chk_asarray(a, axis) + n = a.count(axis) + m2 = moment(a,2,axis) + m4 = moment(a,4,axis) + vals = ma.where(m2 == 0, 0, m4/ m2**2.0) + if not bias: + can_correct = (n > 3) & (m2 > 0) + if can_correct.any(): + m2 = np.extract(can_correct, m2) + m4 = np.extract(can_correct, m4) + nval = 1.0/(n-2)/(n-3)*((n*n-1.0)*m4/m2**2.0-3*(n-1)**2.0) + np.place(vals, can_correct, nval+3.0) + if fisher: + return vals - 3 + else: + return vals +kurtosis.__doc__ = stats.kurtosis.__doc__ + +def describe(a, axis=0): + """Computes several descriptive statistics of the passed array. + + Parameters + ---------- + a : array + axis : int or None + + Returns + ------- + (size of the data (discarding missing values), + (min, max), + arithmetic mean, + unbiased variance, + biased skewness, + biased kurtosis) + """ + a, axis = _chk_asarray(a, axis) + n = a.count(axis) + mm = (ma.minimum.reduce(a), ma.maximum.reduce(a)) + m = a.mean(axis) + v = a.var(axis) + sk = skew(a, axis) + kurt = kurtosis(a, axis) + return n, mm, m, v, sk, kurt + +#............................................................................. +def stde_median(data, axis=None): + """Returns the McKean-Schrader estimate of the standard error of the sample +median along the given axis. masked values are discarded. + + Parameters + ---------- + data : ndarray + Data to trim. + axis : {None,int} optional + Axis along which to perform the trimming. + If None, the input array is first flattened. + + """ + def _stdemed_1D(data): + data = np.sort(data.compressed()) + n = len(sorted) + z = 2.5758293035489004 + k = int(np.round((n+1)/2. - z * np.sqrt(n/4.),0)) + return ((data[n-k] - data[k-1])/(2.*z)) + # + data = ma.array(data, copy=False, subok=True) + if (axis is None): + return _stdemed_1D(data) + else: + assert data.ndim <= 2, "Array should be 2D at most !" + return ma.apply_along_axis(_stdemed_1D, axis, data) + +#####-------------------------------------------------------------------------- +#---- --- Normality Tests --- +#####-------------------------------------------------------------------------- + +def skewtest(a, axis=0): + a, axis = _chk_asarray(a, axis) + if axis is None: + a = a.ravel() + axis = 0 + b2 = skew(a,axis) + n = a.count(axis) + if np.min(n) < 8: + warnings.warn( + "skewtest only valid for n>=8 ... continuing anyway, n=%i" % + np.min(n)) + y = b2 * ma.sqrt(((n+1)*(n+3)) / (6.0*(n-2)) ) + beta2 = ( 3.0*(n*n+27*n-70)*(n+1)*(n+3) ) / ( (n-2.0)*(n+5)*(n+7)*(n+9) ) + W2 = -1 + ma.sqrt(2*(beta2-1)) + delta = 1/ma.sqrt(0.5*ma.log(W2)) + alpha = ma.sqrt(2.0/(W2-1)) + y = ma.where(y==0, 1, y) + Z = delta*ma.log(y/alpha + ma.sqrt((y/alpha)**2+1)) + return Z, (1.0 - stats.zprob(Z))*2 +skewtest.__doc__ = stats.skewtest.__doc__ + +def kurtosistest(a, axis=0): + a, axis = _chk_asarray(a, axis) + n = a.count(axis=axis).astype(float) + if np.min(n) < 20: + warnings.warn( + "kurtosistest only valid for n>=20 ... continuing anyway, n=%i" % + np.min(n)) + b2 = kurtosis(a, axis, fisher=False) + E = 3.0*(n-1) /(n+1) + varb2 = 24.0*n*(n-2)*(n-3) / ((n+1)*(n+1)*(n+3)*(n+5)) + x = (b2-E)/ma.sqrt(varb2) + sqrtbeta1 = 6.0*(n*n-5*n+2)/((n+7)*(n+9)) * np.sqrt((6.0*(n+3)*(n+5))/ + (n*(n-2)*(n-3))) + A = 6.0 + 8.0/sqrtbeta1 *(2.0/sqrtbeta1 + np.sqrt(1+4.0/(sqrtbeta1**2))) + term1 = 1 - 2./(9.0*A) + denom = 1 + x*ma.sqrt(2/(A-4.0)) + denom[denom < 0] = masked + term2 = ma.power((1-2.0/A)/denom,1/3.0) + Z = ( term1 - term2 ) / np.sqrt(2/(9.0*A)) + return Z, (1.0-stats.zprob(Z))*2 +kurtosistest.__doc__ = stats.kurtosistest.__doc__ + + +def normaltest(a, axis=0): + a, axis = _chk_asarray(a, axis) + s,_ = skewtest(a,axis) + k,_ = kurtosistest(a,axis) + k2 = s*s + k*k + return k2, stats.chisqprob(k2,2) +normaltest.__doc__ = stats.normaltest.__doc__ + +# Martinez-Iglewicz test +# K-S test + + +#####-------------------------------------------------------------------------- +#---- --- Percentiles --- +#####-------------------------------------------------------------------------- + + +def mquantiles(data, prob=list([.25,.5,.75]), alphap=.4, betap=.4, axis=None, + limit=()): + """Computes empirical quantiles for a *1xN* data array. +Samples quantile are defined by: +*Q(p) = (1-g).x[i] +g.x[i+1]* +where *x[j]* is the jth order statistic, +with *i = (floor(n*p+m))*, *m=alpha+p*(1-alpha-beta)* and *g = n*p + m - i)*. + +Typical values of (alpha,beta) are: + + - (0,1) : *p(k) = k/n* : linear interpolation of cdf (R, type 4) + - (.5,.5) : *p(k) = (k+1/2.)/n* : piecewise linear function (R, type 5) + - (0,0) : *p(k) = k/(n+1)* : (R type 6) + - (1,1) : *p(k) = (k-1)/(n-1)*. In this case, p(k) = mode[F(x[k])]. + That's R default (R type 7) + - (1/3,1/3): *p(k) = (k-1/3)/(n+1/3)*. Then p(k) ~ median[F(x[k])]. + The resulting quantile estimates are approximately median-unbiased + regardless of the distribution of x. (R type 8) + - (3/8,3/8): *p(k) = (k-3/8)/(n+1/4)*. Blom. + The resulting quantile estimates are approximately unbiased + if x is normally distributed (R type 9) + - (.4,.4) : approximately quantile unbiased (Cunnane) + - (.35,.35): APL, used with PWM + +Parameters +---------- + x : sequence + Input data, as a sequence or array of dimension at most 2. + prob : sequence + List of quantiles to compute. + alpha : {0.4, float} optional + Plotting positions parameter. + beta : {0.4, float} optional + Plotting positions parameter. + axis : {None, int} optional + Axis along which to perform the trimming. + If None, the input array is first flattened. + limit : tuple + Tuple of (lower, upper) values. Values of a outside this closed interval + are ignored. + """ + def _quantiles1D(data,m,p): + x = np.sort(data.compressed()) + n = len(x) + if n == 0: + return ma.array(np.empty(len(p), dtype=float), mask=True) + elif n == 1: + return ma.array(np.resize(x, p.shape), mask=nomask) + aleph = (n*p + m) + k = np.floor(aleph.clip(1, n-1)).astype(int) + gamma = (aleph-k).clip(0,1) + return (1.-gamma)*x[(k-1).tolist()] + gamma*x[k.tolist()] + + # Initialization & checks --------- + data = ma.array(data, copy=False) + if limit: + condition = (limit[0] 100.): + raise ValueError("The percentile should be between 0. and 100. !"\ + " (got %s)" % per) + return mquantiles(data, prob=[per/100.], alphap=alphap, betap=betap, + limit=limit, axis=0).squeeze() + + +def plotting_positions(data, alpha=0.4, beta=0.4): + """Returns the plotting positions (or empirical percentile points) for the + data. + Plotting positions are defined as (i-alpha)/(n-alpha-beta), where: + - i is the rank order statistics + - n is the number of unmasked values along the given axis + - alpha and beta are two parameters. + + Typical values for alpha and beta are: + - (0,1) : *p(k) = k/n* : linear interpolation of cdf (R, type 4) + - (.5,.5) : *p(k) = (k-1/2.)/n* : piecewise linear function (R, type 5) + - (0,0) : *p(k) = k/(n+1)* : Weibull (R type 6) + - (1,1) : *p(k) = (k-1)/(n-1)*. In this case, p(k) = mode[F(x[k])]. + That's R default (R type 7) + - (1/3,1/3): *p(k) = (k-1/3)/(n+1/3)*. Then p(k) ~ median[F(x[k])]. + The resulting quantile estimates are approximately median-unbiased + regardless of the distribution of x. (R type 8) + - (3/8,3/8): *p(k) = (k-3/8)/(n+1/4)*. Blom. + The resulting quantile estimates are approximately unbiased + if x is normally distributed (R type 9) + - (.4,.4) : approximately quantile unbiased (Cunnane) + - (.35,.35): APL, used with PWM + +Parameters +---------- + x : sequence + Input data, as a sequence or array of dimension at most 2. + prob : sequence + List of quantiles to compute. + alpha : {0.4, float} optional + Plotting positions parameter. + beta : {0.4, float} optional + Plotting positions parameter. + + """ + data = ma.array(data, copy=False).reshape(1,-1) + n = data.count() + plpos = np.empty(data.size, dtype=float) + plpos[n:] = 0 + plpos[data.argsort()[:n]] = (np.arange(1,n+1) - alpha)/(n+1-alpha-beta) + return ma.array(plpos, mask=data._mask) + +meppf = plotting_positions + +#####-------------------------------------------------------------------------- +#---- --- Variability --- +#####-------------------------------------------------------------------------- + +def obrientransform(*args): + """ +Computes a transform on input data (any number of columns). Used to +test for homogeneity of variance prior to running one-way stats. Each +array in *args is one level of a factor. If an F_oneway() run on the +transformed data and found significant, variances are unequal. From +Maxwell and Delaney, p.112. + +Returns: transformed data for use in an ANOVA + """ + data = argstoarray(*args).T + v = data.var(axis=0,ddof=1) + m = data.mean(0) + n = data.count(0).astype(float) + # result = ((N-1.5)*N*(a-m)**2 - 0.5*v*(n-1))/((n-1)*(n-2)) + data -= m + data **= 2 + data *= (n-1.5)*n + data -= 0.5*v*(n-1) + data /= (n-1.)*(n-2.) + if not ma.allclose(v,data.mean(0)): + raise ValueError("Lack of convergence in obrientransform.") + return data + + +def signaltonoise(data, axis=0): + """Calculates the signal-to-noise ratio, as the ratio of the mean over + standard deviation along the given axis. + + Parameters + ---------- + data : sequence + Input data + axis : {0, int} optional + Axis along which to compute. If None, the computation is performed + on a flat version of the array. +""" + data = ma.array(data, copy=False) + m = data.mean(axis) + sd = data.std(axis, ddof=0) + return m/sd + + +def samplevar(data, axis=0): + """Returns a biased estimate of the variance of the data, as the average + of the squared deviations from the mean. + + Parameters + ---------- + data : sequence + Input data + axis : {0, int} optional + Axis along which to compute. If None, the computation is performed + on a flat version of the array. + """ + return ma.asarray(data).var(axis=axis,ddof=0) + + +def samplestd(data, axis=0): + """Returns a biased estimate of the standard deviation of the data, as the + square root of the average squared deviations from the mean. + + Parameters + ---------- + data : sequence + Input data + axis : {0,int} optional + Axis along which to compute. If None, the computation is performed + on a flat version of the array. + + Notes + ----- + samplestd(a) is equivalent to a.std(ddof=0) + + """ + return ma.asarray(data).std(axis=axis,ddof=0) + + +def var(a,axis=None): + return ma.asarray(a).var(axis=axis,ddof=1) +var.__doc__ = stats.var.__doc__ + +def std(a,axis=None): + return ma.asarray(a).std(axis=axis,ddof=1) +std.__doc__ = stats.std.__doc__ + +def stderr(a, axis=0): + a, axis = _chk_asarray(a, axis) + return a.std(axis=axis, ddof=1) / ma.sqrt(a.count(axis=axis)) +stderr.__doc__ = stats.stderr.__doc__ + +def sem(a, axis=0): + a, axis = _chk_asarray(a, axis) + n = a.count(axis=axis) + s = a.std(axis=axis,ddof=0) / ma.sqrt(n-1) + return s +sem.__doc__ = stats.sem.__doc__ + +def z(a, score): + a = ma.asarray(a) + z = (score-a.mean(None)) / a.std(axis=None, ddof=1) + return z +z.__doc__ = stats.z.__doc__ + +def zs(a): + a = ma.asarray(a) + mu = a.mean(axis=0) + sigma = a.std(axis=0,ddof=0) + return (a-mu)/sigma +zs.__doc__ = stats.zs.__doc__ + +def zmap(scores, compare, axis=0): + (scores, compare) = (ma.asarray(scores), ma.asarray(compare)) + mns = compare.mean(axis=axis) + sstd = compare.std(axis=0, ddof=0) + return (scores - mns) / sstd +zmap.__doc__ = stats.zmap.__doc__ + + +#####-------------------------------------------------------------------------- +#---- --- ANOVA --- +#####-------------------------------------------------------------------------- + + +def f_oneway(*args): + """ +Performs a 1-way ANOVA, returning an F-value and probability given +any number of groups. From Heiman, pp.394-7. + +Usage: f_oneway (*args) where *args is 2 or more arrays, one per + treatment group +Returns: f-value, probability +""" + # Construct a single array of arguments: each row is a group + data = argstoarray(*args) + ngroups = len(data) + ntot = data.count() + sstot = (data**2).sum() - (data.sum())**2/float(ntot) + ssbg = (data.count(-1) * (data.mean(-1)-data.mean())**2).sum() + sswg = sstot-ssbg + dfbg = ngroups-1 + dfwg = ntot - ngroups + msb = ssbg/float(dfbg) + msw = sswg/float(dfwg) + f = msb/msw + prob = stats.fprob(dfbg,dfwg,f) + return f, prob + + +def f_value_wilks_lambda(ER, EF, dfnum, dfden, a, b): + """Calculation of Wilks lambda F-statistic for multivarite data, per + Maxwell & Delaney p.657. + """ + ER = ma.array(ER, copy=False, ndmin=2) + EF = ma.array(EF, copy=False, ndmin=2) + if ma.getmask(ER).any() or ma.getmask(EF).any(): + raise NotImplementedError("Not implemented when the inputs "\ + "have missing data") + lmbda = np.linalg.det(EF) / np.linalg.det(ER) + q = ma.sqrt( ((a-1)**2*(b-1)**2 - 2) / ((a-1)**2 + (b-1)**2 -5) ) + q = ma.filled(q, 1) + n_um = (1 - lmbda**(1.0/q))*(a-1)*(b-1) + d_en = lmbda**(1.0/q) / (n_um*q - 0.5*(a-1)*(b-1) + 1) + return n_um / d_en + + + +def friedmanchisquare(*args): + """Friedman Chi-Square is a non-parametric, one-way within-subjects ANOVA. + This function calculates the Friedman Chi-square test for repeated measures + and returns the result, along with the associated probability value. + + Each input is considered a given group. Ideally, the number of treatments + among each group should be equal. If this is not the case, only the first + n treatments are taken into account, where n is the number of treatments + of the smallest group. + If a group has some missing values, the corresponding treatments are masked + in the other groups. + The test statistic is corrected for ties. + + Masked values in one group are propagated to the other groups. + + Returns: chi-square statistic, associated p-value + """ + data = argstoarray(*args).astype(float) + k = len(data) + if k < 3: + raise ValueError("Less than 3 groups (%i): " % k +\ + "the Friedman test is NOT appropriate.") + ranked = ma.masked_values(rankdata(data, axis=0), 0) + if ranked._mask is not nomask: + ranked = ma.mask_cols(ranked) + ranked = ranked.compressed().reshape(k,-1).view(ndarray) + else: + ranked = ranked._data + (k,n) = ranked.shape + # Ties correction + repeats = np.array([find_repeats(_) for _ in ranked.T], dtype=object) + ties = repeats[repeats.nonzero()].reshape(-1,2)[:,-1].astype(int) + tie_correction = 1 - (ties**3-ties).sum()/float(n*(k**3-k)) + # + ssbg = np.sum((ranked.sum(-1) - n*(k+1)/2.)**2) + chisq = ssbg * 12./(n*k*(k+1)) * 1./tie_correction + return chisq, stats.chisqprob(chisq,k-1) + +#-############################################################################-# Added: trunk/scipy/stats/tests/test_mmorestats.py =================================================================== --- trunk/scipy/stats/tests/test_mmorestats.py 2008-04-13 22:17:05 UTC (rev 4140) +++ trunk/scipy/stats/tests/test_mmorestats.py 2008-04-14 19:01:01 UTC (rev 4141) @@ -0,0 +1,103 @@ +# pylint: disable-msg=W0611, W0612, W0511,R0201 +"""Tests suite for maskedArray statistics. + +:author: Pierre Gerard-Marchant +:contact: pierregm_at_uga_dot_edu +""" +__author__ = "Pierre GF Gerard-Marchant ($Author: backtopop $)" + +import numpy as np + +import numpy.ma as ma +from numpy.ma import masked + +import scipy.stats.mstats as ms +import scipy.stats.mmorestats as mms + +from scipy.testing import * + + +class TestMisc(TestCase): + # + def __init__(self, *args, **kwargs): + TestCase.__init__(self, *args, **kwargs) + # + def test_mjci(self): + "Tests the Marits-Jarrett estimator" + data = ma.array([ 77, 87, 88,114,151,210,219,246,253,262, + 296,299,306,376,428,515,666,1310,2611]) + assert_almost_equal(mms.mjci(data),[55.76819,45.84028,198.87875],5) + # + def test_trimmedmeanci(self): + "Tests the confidence intervals of the trimmed mean." + data = ma.array([545,555,558,572,575,576,578,580, + 594,605,635,651,653,661,666]) + assert_almost_equal(ms.trimmed_mean(data,0.2), 596.2, 1) + assert_equal(np.round(mms.trimmed_mean_ci(data,(0.2,0.2)),1), + [561.8, 630.6]) + # + def test_idealfourths(self): + "Tests ideal-fourths" + test = np.arange(100) + assert_almost_equal(np.asarray(mms.idealfourths(test)), + [24.416667,74.583333],6) + test_2D = test.repeat(3).reshape(-1,3) + assert_almost_equal(mms.idealfourths(test_2D, axis=0), + [[24.416667,24.416667,24.416667], + [74.583333,74.583333,74.583333]],6) + assert_almost_equal(mms.idealfourths(test_2D, axis=1), + test.repeat(2).reshape(-1,2)) + test = [0,0] + _result = mms.idealfourths(test) + assert(np.isnan(_result).all()) + +#.............................................................................. +class TestQuantiles(TestCase): + # + def __init__(self, *args, **kwargs): + TestCase.__init__(self, *args, **kwargs) + # + def test_hdquantiles(self): + data = [0.706560797,0.727229578,0.990399276,0.927065621,0.158953014, + 0.887764025,0.239407086,0.349638551,0.972791145,0.149789972, + 0.936947700,0.132359948,0.046041972,0.641675031,0.945530547, + 0.224218684,0.771450991,0.820257774,0.336458052,0.589113496, + 0.509736129,0.696838829,0.491323573,0.622767425,0.775189248, + 0.641461450,0.118455200,0.773029450,0.319280007,0.752229111, + 0.047841438,0.466295911,0.583850781,0.840581845,0.550086491, + 0.466470062,0.504765074,0.226855960,0.362641207,0.891620942, + 0.127898691,0.490094097,0.044882048,0.041441695,0.317976349, + 0.504135618,0.567353033,0.434617473,0.636243375,0.231803616, + 0.230154113,0.160011327,0.819464108,0.854706985,0.438809221, + 0.487427267,0.786907310,0.408367937,0.405534192,0.250444460, + 0.995309248,0.144389588,0.739947527,0.953543606,0.680051621, + 0.388382017,0.863530727,0.006514031,0.118007779,0.924024803, + 0.384236354,0.893687694,0.626534881,0.473051932,0.750134705, + 0.241843555,0.432947602,0.689538104,0.136934797,0.150206859, + 0.474335206,0.907775349,0.525869295,0.189184225,0.854284286, + 0.831089744,0.251637345,0.587038213,0.254475554,0.237781276, + 0.827928620,0.480283781,0.594514455,0.213641488,0.024194386, + 0.536668589,0.699497811,0.892804071,0.093835427,0.731107772] + # + assert_almost_equal(mms.hdquantiles(data,[0., 1.]), + [0.006514031, 0.995309248]) + hdq = mms.hdquantiles(data,[0.25, 0.5, 0.75]) + assert_almost_equal(hdq, [0.253210762, 0.512847491, 0.762232442,]) + hdq = mms.hdquantiles_sd(data,[0.25, 0.5, 0.75]) + assert_almost_equal(hdq, [0.03786954, 0.03805389, 0.03800152,], 4) + # + data = np.array(data).reshape(10,10) + hdq = mms.hdquantiles(data,[0.25,0.5,0.75],axis=0) + assert_almost_equal(hdq[:,0], mms.hdquantiles(data[:,0],[0.25,0.5,0.75])) + assert_almost_equal(hdq[:,-1], mms.hdquantiles(data[:,-1],[0.25,0.5,0.75])) + hdq = mms.hdquantiles(data,[0.25,0.5,0.75],axis=0,var=True) + assert_almost_equal(hdq[...,0], + mms.hdquantiles(data[:,0],[0.25,0.5,0.75],var=True)) + assert_almost_equal(hdq[...,-1], + mms.hdquantiles(data[:,-1],[0.25,0.5,0.75], var=True)) + + +############################################################################### + +if __name__ == "__main__": + nose.run(argv=['', __file__]) Added: trunk/scipy/stats/tests/test_mstats.py =================================================================== --- trunk/scipy/stats/tests/test_mstats.py 2008-04-13 22:17:05 UTC (rev 4140) +++ trunk/scipy/stats/tests/test_mstats.py 2008-04-14 19:01:01 UTC (rev 4141) @@ -0,0 +1,506 @@ +""" +Tests for the stats.mstats module (support for maskd arrays) +""" + + +import numpy as np +from numpy import nan +import numpy.ma as ma +from numpy.ma import masked, nomask + +import scipy.stats.mstats as mstats +from scipy.testing import * +from numpy.ma.testutils import assert_equal, assert_almost_equal, \ + assert_array_almost_equal + + +class TestGMean(TestCase): + def test_1D(self): + a = (1,2,3,4) + actual= mstats.gmean(a) + desired = np.power(1*2*3*4,1./4.) + assert_almost_equal(actual, desired,decimal=14) + + desired1 = mstats.gmean(a,axis=-1) + assert_almost_equal(actual, desired1, decimal=14) + assert not isinstance(desired1, ma.MaskedArray) + # + a = ma.array((1,2,3,4),mask=(0,0,0,1)) + actual= mstats.gmean(a) + desired = np.power(1*2*3,1./3.) + assert_almost_equal(actual, desired,decimal=14) + + desired1 = mstats.gmean(a,axis=-1) + assert_almost_equal(actual, desired1, decimal=14) + # + def test_2D(self): + a = ma.array(((1,2,3,4),(1,2,3,4),(1,2,3,4)), + mask=((0,0,0,0),(1,0,0,1),(0,1,1,0))) + actual= mstats.gmean(a) + desired = np.array((1,2,3,4)) + assert_array_almost_equal(actual, desired, decimal=14) + # + desired1 = mstats.gmean(a,axis=0) + assert_array_almost_equal(actual, desired1, decimal=14) + # + actual= mstats.gmean(a, -1) + desired = ma.array((np.power(1*2*3*4,1./4.), + np.power(2*3,1./2.), + np.power(1*4,1./2.))) + assert_array_almost_equal(actual, desired, decimal=14) + +class TestHMean(TestCase): + def test_1D(self): + a = (1,2,3,4) + actual= mstats.hmean(a) + desired = 4. / (1./1 + 1./2 + 1./3 + 1./4) + assert_almost_equal(actual, desired, decimal=14) + desired1 = mstats.hmean(ma.array(a),axis=-1) + assert_almost_equal(actual, desired1, decimal=14) + # + a = ma.array((1,2,3,4),mask=(0,0,0,1)) + actual= mstats.hmean(a) + desired = 3. / (1./1 + 1./2 + 1./3) + assert_almost_equal(actual, desired,decimal=14) + desired1 = mstats.hmean(a,axis=-1) + assert_almost_equal(actual, desired1, decimal=14) + + def test_2D(self): + a = ma.array(((1,2,3,4),(1,2,3,4),(1,2,3,4)), + mask=((0,0,0,0),(1,0,0,1),(0,1,1,0))) + actual= mstats.hmean(a) + desired = ma.array((1,2,3,4)) + assert_array_almost_equal(actual, desired, decimal=14) + # + actual1 = mstats.hmean(a,axis=-1) + desired = (4./(1/1.+1/2.+1/3.+1/4.), + 2./(1/2.+1/3.), + 2./(1/1.+1/4.) + ) + assert_array_almost_equal(actual1, desired, decimal=14) + + +class TestRanking(TestCase): + # + def __init__(self, *args, **kwargs): + TestCase.__init__(self, *args, **kwargs) + # + def test_ranking(self): + x = ma.array([0,1,1,1,2,3,4,5,5,6,]) + assert_almost_equal(mstats.rankdata(x),[1,3,3,3,5,6,7,8.5,8.5,10]) + x[[3,4]] = masked + assert_almost_equal(mstats.rankdata(x),[1,2.5,2.5,0,0,4,5,6.5,6.5,8]) + assert_almost_equal(mstats.rankdata(x,use_missing=True), + [1,2.5,2.5,4.5,4.5,4,5,6.5,6.5,8]) + x = ma.array([0,1,5,1,2,4,3,5,1,6,]) + assert_almost_equal(mstats.rankdata(x),[1,3,8.5,3,5,7,6,8.5,3,10]) + x = ma.array([[0,1,1,1,2], [3,4,5,5,6,]]) + assert_almost_equal(mstats.rankdata(x),[[1,3,3,3,5],[6,7,8.5,8.5,10]]) + assert_almost_equal(mstats.rankdata(x,axis=1),[[1,3,3,3,5],[1,2,3.5,3.5,5]]) + assert_almost_equal(mstats.rankdata(x,axis=0),[[1,1,1,1,1],[2,2,2,2,2,]]) + + +class TestCorr(TestCase): + # + def test_pearsonr(self): + "Tests some computations of Pearson's r" + x = ma.arange(10) + assert_almost_equal(mstats.pearsonr(x,x)[0], 1.0) + assert_almost_equal(mstats.pearsonr(x,x[::-1])[0], -1.0) + # + x = ma.array(x, mask=True) + pr = mstats.pearsonr(x,x) + assert(pr[0] is masked) + assert(pr[1] is masked) + # + def test_spearmanr(self): + "Tests some computations of Spearman's rho" + (x, y) = ([5.05,6.75,3.21,2.66],[1.65,2.64,2.64,6.95]) + assert_almost_equal(mstats.spearmanr(x,y)[0], -0.6324555) + (x, y) = ([5.05,6.75,3.21,2.66,np.nan],[1.65,2.64,2.64,6.95,np.nan]) + (x, y) = (ma.fix_invalid(x), ma.fix_invalid(y)) + assert_almost_equal(mstats.spearmanr(x,y)[0], -0.6324555) + # + x = [ 2.0, 47.4, 42.0, 10.8, 60.1, 1.7, 64.0, 63.1, + 1.0, 1.4, 7.9, 0.3, 3.9, 0.3, 6.7] + y = [22.6, 08.3, 44.4, 11.9, 24.6, 0.6, 5.7, 41.6, + 0.0, 0.6, 6.7, 3.8, 1.0, 1.2, 1.4] + assert_almost_equal(mstats.spearmanr(x,y)[0], 0.6887299) + x = [ 2.0, 47.4, 42.0, 10.8, 60.1, 1.7, 64.0, 63.1, + 1.0, 1.4, 7.9, 0.3, 3.9, 0.3, 6.7, np.nan] + y = [22.6, 08.3, 44.4, 11.9, 24.6, 0.6, 5.7, 41.6, + 0.0, 0.6, 6.7, 3.8, 1.0, 1.2, 1.4, np.nan] + (x, y) = (ma.fix_invalid(x), ma.fix_invalid(y)) + assert_almost_equal(mstats.spearmanr(x,y)[0], 0.6887299) + # + def test_kendalltau(self): + "Tests some computations of Kendall's tau" + x = ma.fix_invalid([5.05, 6.75, 3.21, 2.66,np.nan]) + y = ma.fix_invalid([1.65, 26.5, -5.93, 7.96, np.nan]) + z = ma.fix_invalid([1.65, 2.64, 2.64, 6.95, np.nan]) + assert_almost_equal(np.asarray(mstats.kendalltau(x,y)), + [+0.3333333,0.4969059]) + assert_almost_equal(np.asarray(mstats.kendalltau(x,z)), + [-0.5477226,0.2785987]) + # + x = ma.fix_invalid([ 0, 0, 0, 0,20,20, 0,60, 0,20, + 10,10, 0,40, 0,20, 0, 0, 0, 0, 0, np.nan]) + y = ma.fix_invalid([ 0,80,80,80,10,33,60, 0,67,27, + 25,80,80,80,80,80,80, 0,10,45, np.nan, 0]) + result = mstats.kendalltau(x,y) + assert_almost_equal(np.asarray(result), [-0.1585188, 0.4128009]) + # + def test_kendalltau_seasonal(self): + "Tests the seasonal Kendall tau." + x = [[nan,nan, 4, 2, 16, 26, 5, 1, 5, 1, 2, 3, 1], + [ 4, 3, 5, 3, 2, 7, 3, 1, 1, 2, 3, 5, 3], + [ 3, 2, 5, 6, 18, 4, 9, 1, 1,nan, 1, 1,nan], + [nan, 6, 11, 4, 17,nan, 6, 1, 1, 2, 5, 1, 1]] + x = ma.fix_invalid(x).T + output = mstats.kendalltau_seasonal(x) + assert_almost_equal(output['global p-value (indep)'], 0.008, 3) + assert_almost_equal(output['seasonal p-value'].round(2), + [0.18,0.53,0.20,0.04]) + # + def test_pointbiserial(self): + "Tests point biserial" + x = [1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0, + 0,0,0,0,1,-1] + y = [14.8,13.8,12.4,10.1,7.1,6.1,5.8,4.6,4.3,3.5,3.3,3.2,3.0, + 2.8,2.8,2.5,2.4,2.3,2.1,1.7,1.7,1.5,1.3,1.3,1.2,1.2,1.1, + 0.8,0.7,0.6,0.5,0.2,0.2,0.1,np.nan] + assert_almost_equal(mstats.pointbiserialr(x, y)[0], 0.36149, 5) + # + def test_cov(self): + "Tests the cov function." + x = ma.array([[1,2,3],[4,5,6]], mask=[[1,0,0],[0,0,0]]) + c = mstats.cov(x[0]) + assert_equal(c, x[0].var(ddof=1)) + c = mstats.cov(x[1]) + assert_equal(c, x[1].var(ddof=1)) + c = mstats.cov(x) + assert_equal(c[1,0], (x[0].anom()*x[1].anom()).sum()) + # + x = [[nan,nan, 4, 2, 16, 26, 5, 1, 5, 1, 2, 3, 1], + [ 4, 3, 5, 3, 2, 7, 3, 1, 1, 2, 3, 5, 3], + [ 3, 2, 5, 6, 18, 4, 9, 1, 1,nan, 1, 1,nan], + [nan, 6, 11, 4, 17,nan, 6, 1, 1, 2, 5, 1, 1]] + x = ma.fix_invalid(x).T + (winter,spring,summer,fall) = x.T + # + assert_almost_equal(mstats.cov(winter,winter,bias=True), + winter.var(ddof=0)) + assert_almost_equal(mstats.cov(winter,winter,bias=False), + winter.var(ddof=1)) + assert_almost_equal(mstats.cov(winter,spring), 7.7) + assert_almost_equal(mstats.cov(winter,summer), 19.1111111, 7) + assert_almost_equal(mstats.cov(winter,fall), 20) + + +class TestTrimming(TestCase): + # + def test_trim(self): + "Tests trimming" + a = ma.arange(10) + assert_equal(mstats.trim(a), [0,1,2,3,4,5,6,7,8,9]) + a = ma.arange(10) + assert_equal(mstats.trim(a,(2,8)), [None,None,2,3,4,5,6,7,8,None]) + a = ma.arange(10) + assert_equal(mstats.trim(a,limits=(2,8),inclusive=(False,False)), + [None,None,None,3,4,5,6,7,None,None]) + a = ma.arange(10) + assert_equal(mstats.trim(a,limits=(0.1,0.2),relative=True), + [None,1,2,3,4,5,6,7,None,None]) + # + a = ma.arange(12) + a[[0,-1]] = a[5] = masked + assert_equal(mstats.trim(a,(2,8)), + [None,None,2,3,4,None,6,7,8,None,None,None]) + # + x = ma.arange(100).reshape(10,10) + trimx = mstats.trim(x,(0.1,0.2),relative=True,axis=None) + assert_equal(trimx._mask.ravel(),[1]*10+[0]*70+[1]*20) + trimx = mstats.trim(x,(0.1,0.2),relative=True,axis=0) + assert_equal(trimx._mask.ravel(),[1]*10+[0]*70+[1]*20) + trimx = mstats.trim(x,(0.1,0.2),relative=True,axis=-1) + assert_equal(trimx._mask.T.ravel(),[1]*10+[0]*70+[1]*20) + # + x = ma.arange(110).reshape(11,10) + x[1] = masked + trimx = mstats.trim(x,(0.1,0.2),relative=True,axis=None) + assert_equal(trimx._mask.ravel(),[1]*20+[0]*70+[1]*20) + trimx = mstats.trim(x,(0.1,0.2),relative=True,axis=0) + assert_equal(trimx._mask.ravel(),[1]*20+[0]*70+[1]*20) + trimx = mstats.trim(x.T,(0.1,0.2),relative=True,axis=-1) + assert_equal(trimx.T._mask.ravel(),[1]*20+[0]*70+[1]*20) + # + def test_trim_old(self): + "Tests trimming." + x = ma.arange(100) + assert_equal(mstats.trimboth(x).count(), 60) + assert_equal(mstats.trimtail(x,tail='r').count(), 80) + x[50:70] = masked + trimx = mstats.trimboth(x) + assert_equal(trimx.count(), 48) + assert_equal(trimx._mask, [1]*16 + [0]*34 + [1]*20 + [0]*14 + [1]*16) + x._mask = nomask + x.shape = (10,10) + assert_equal(mstats.trimboth(x).count(), 60) + assert_equal(mstats.trimtail(x).count(), 80) + # + def test_trimmedmean(self): + "Tests the trimmed mean." + data = ma.array([ 77, 87, 88,114,151,210,219,246,253,262, + 296,299,306,376,428,515,666,1310,2611]) + assert_almost_equal(mstats.trimmed_mean(data,0.1), 343, 0) + assert_almost_equal(mstats.trimmed_mean(data,(0.1,0.1)), 343, 0) + assert_almost_equal(mstats.trimmed_mean(data,(0.2,0.2)), 283, 0) + # + def test_trimmed_stde(self): + "Tests the trimmed mean standard error." + data = ma.array([ 77, 87, 88,114,151,210,219,246,253,262, + 296,299,306,376,428,515,666,1310,2611]) + assert_almost_equal(mstats.trimmed_stde(data,(0.2,0.2)), 56.13193, 5) + assert_almost_equal(mstats.trimmed_stde(data,0.2), 56.13193, 5) + # + def test_winsorization(self): + "Tests the Winsorization of the data." + data = ma.array([ 77, 87, 88,114,151,210,219,246,253,262, + 296,299,306,376,428,515,666,1310,2611]) + assert_almost_equal(mstats.winsorize(data,(0.2,0.2)).var(ddof=1), + 21551.4, 1) + data[5] = masked + winsorized = mstats.winsorize(data) + assert_equal(winsorized.mask, data.mask) + + +class TestMoments(TestCase): + """ + Comparison numbers are found using R v.1.5.1 + note that length(testcase) = 4 + testmathworks comes from documentation for the + Statistics Toolbox for Matlab and can be found at both + http://www.mathworks.com/access/helpdesk/help/toolbox/stats/kurtosis.shtml + http://www.mathworks.com/access/helpdesk/help/toolbox/stats/skewness.shtml + Note that both test cases came from here. + """ + testcase = [1,2,3,4] + testmathworks = ma.fix_invalid([1.165 , 0.6268, 0.0751, 0.3516, -0.6965, + np.nan]) + def test_moment(self): + """ + mean((testcase-mean(testcase))**power,axis=0),axis=0))**power))""" + y = mstats.moment(self.testcase,1) + assert_almost_equal(y,0.0,10) + y = mstats.moment(self.testcase,2) + assert_almost_equal(y,1.25) + y = mstats.moment(self.testcase,3) + assert_almost_equal(y,0.0) + y = mstats.moment(self.testcase,4) + assert_almost_equal(y,2.5625) + def test_variation(self): + """variation = samplestd/mean """ +## y = stats.variation(self.shoes[0]) +## assert_almost_equal(y,21.8770668) + y = mstats.variation(self.testcase) + assert_almost_equal(y,0.44721359549996, 10) + + def test_skewness(self): + """ + sum((testmathworks-mean(testmathworks,axis=0))**3,axis=0)/((sqrt(var(testmathworks)*4/5))**3)/5 + """ + y = mstats.skew(self.testmathworks) + assert_almost_equal(y,-0.29322304336607,10) + y = mstats.skew(self.testmathworks,bias=0) + assert_almost_equal(y,-0.437111105023940,10) + y = mstats.skew(self.testcase) + assert_almost_equal(y,0.0,10) + + def test_kurtosis(self): + """ + sum((testcase-mean(testcase,axis=0))**4,axis=0)/((sqrt(var(testcase)*3/4))**4)/4 + sum((test2-mean(testmathworks,axis=0))**4,axis=0)/((sqrt(var(testmathworks)*4/5))**4)/5 + Set flags for axis = 0 and + fisher=0 (Pearson's definition of kurtosis for compatibility with Matlab) + """ + y = mstats.kurtosis(self.testmathworks,0,fisher=0,bias=1) + assert_almost_equal(y, 2.1658856802973,10) + # Note that MATLAB has confusing docs for the following case + # kurtosis(x,0) gives an unbiased estimate of Pearson's skewness + # kurtosis(x) gives a biased estimate of Fisher's skewness (Pearson-3) + # The MATLAB docs imply that both should give Fisher's + y = mstats.kurtosis(self.testmathworks,fisher=0,bias=0) + assert_almost_equal(y, 3.663542721189047,10) + y = mstats.kurtosis(self.testcase,0,0) + assert_almost_equal(y,1.64) + # + def test_mode(self): + "Tests the mode" + # + a1 = [0,0,0,1,1,1,2,3,3,3,3,4,5,6,7] + a2 = np.reshape(a1, (3,5)) + ma1 = ma.masked_where(ma.array(a1)>2,a1) + ma2 = ma.masked_where(a2>2, a2) + assert_equal(mstats.mode(a1, axis=None), (3,4)) + assert_equal(mstats.mode(ma1, axis=None), (0,3)) + assert_equal(mstats.mode(a2, axis=None), (3,4)) + assert_equal(mstats.mode(ma2, axis=None), (0,3)) + assert_equal(mstats.mode(a2, axis=0), [[0,0,0,1,1],[1,1,1,1,1]]) + assert_equal(mstats.mode(ma2, axis=0), [[0,0,0,1,1],[1,1,1,1,1]]) + assert_equal(mstats.mode(a2, axis=-1), [[0,3],[3,3],[3,1]]) + assert_equal(mstats.mode(ma2, axis=-1), [[0,3],[1,1],[0,0]]) + + +class TestPercentile(TestCase): + def setUp(self): + self.a1 = [3,4,5,10,-3,-5,6] + self.a2 = [3,-6,-2,8,7,4,2,1] + self.a3 = [3.,4,5,10,-3,-5,-6,7.0] + + def test_percentile(self): + x = np.arange(8) * 0.5 + assert_equal(mstats.scoreatpercentile(x, 0), 0.) + assert_equal(mstats.scoreatpercentile(x, 100), 3.5) + assert_equal(mstats.scoreatpercentile(x, 50), 1.75) + + def test_2D(self): + x = ma.array([[1, 1, 1], + [1, 1, 1], + [4, 4, 3], + [1, 1, 1], + [1, 1, 1]]) + assert_equal(mstats.scoreatpercentile(x,50), [1,1,1]) + + +class TestVariability(TestCase): + """ Comparison numbers are found using R v.1.5.1 + note that length(testcase) = 4 + """ + testcase = ma.fix_invalid([1,2,3,4,np.nan]) + # + def test_std(self): + y = mstats.std(self.testcase) + assert_almost_equal(y,1.290994449) + + def test_var(self): + """ + var(testcase) = 1.666666667 """ + #y = stats.var(self.shoes[0]) + #assert_approx_equal(y,6.009) + y = mstats.var(self.testcase) + assert_almost_equal(y,1.666666667) + + def test_samplevar(self): + """ + R does not have 'samplevar' so the following was used + var(testcase)*(4-1)/4 where 4 = length(testcase) + """ + #y = stats.samplevar(self.shoes[0]) + #assert_approx_equal(y,5.4081) + y = mstats.samplevar(self.testcase) + assert_almost_equal(y,1.25) + + def test_samplestd(self): + #y = stats.samplestd(self.shoes[0]) + #assert_approx_equal(y,2.325532197) + y = mstats.samplestd(self.testcase) + assert_almost_equal(y,1.118033989) + + def test_signaltonoise(self): + """ + this is not in R, so used + mean(testcase,axis=0)/(sqrt(var(testcase)*3/4)) """ + #y = stats.signaltonoise(self.shoes[0]) + #assert_approx_equal(y,4.5709967) + y = mstats.signaltonoise(self.testcase) + assert_almost_equal(y,2.236067977) + + def test_stderr(self): + """ + this is not in R, so used + sqrt(var(testcase))/sqrt(4) + """ +## y = stats.stderr(self.shoes[0]) +## assert_approx_equal(y,0.775177399) + y = mstats.stderr(self.testcase) + assert_almost_equal(y,0.6454972244) + + def test_sem(self): + """ + this is not in R, so used + sqrt(var(testcase)*3/4)/sqrt(3) + """ + #y = stats.sem(self.shoes[0]) + #assert_approx_equal(y,0.775177399) + y = mstats.sem(self.testcase) + assert_almost_equal(y,0.6454972244) + + def test_z(self): + """ + not in R, so used + (10-mean(testcase,axis=0))/sqrt(var(testcase)*3/4) + """ + y = mstats.z(self.testcase, ma.array(self.testcase).mean()) + assert_almost_equal(y,0.0) + + def test_zs(self): + """ + not in R, so tested by using + (testcase[i]-mean(testcase,axis=0))/sqrt(var(testcase)*3/4) + """ + y = mstats.zs(self.testcase) + desired = ma.fix_invalid([-1.3416407864999, -0.44721359549996 , + 0.44721359549996 , 1.3416407864999, np.nan]) + assert_almost_equal(desired,y,decimal=12) + + + +class TestMisc(TestCase): + # + def test_obrientransform(self): + "Tests Obrien transform" + args = [[5]*5+[6]*11+[7]*9+[8]*3+[9]*2+[10]*2, + [6]+[7]*2+[8]*4+[9]*9+[10]*16] + result = [5*[3.1828]+11*[0.5591]+9*[0.0344]+3*[1.6086]+2*[5.2817]+2*[11.0538], + [10.4352]+2*[4.8599]+4*[1.3836]+9*[0.0061]+16*[0.7277]] + assert_almost_equal(np.round(mstats.obrientransform(*args).T,4), + result,4) + # + def test_kstwosamp(self): + "Tests the Kolmogorov-Smirnov 2 samples test" + x = [[nan,nan, 4, 2, 16, 26, 5, 1, 5, 1, 2, 3, 1], + [ 4, 3, 5, 3, 2, 7, 3, 1, 1, 2, 3, 5, 3], + [ 3, 2, 5, 6, 18, 4, 9, 1, 1,nan, 1, 1,nan], + [nan, 6, 11, 4, 17,nan, 6, 1, 1, 2, 5, 1, 1]] + x = ma.fix_invalid(x).T + (winter,spring,summer,fall) = x.T + # + assert_almost_equal(np.round(mstats.ks_twosamp(winter,spring),4), + (0.1818,0.9892)) + assert_almost_equal(np.round(mstats.ks_twosamp(winter,spring,'g'),4), + (0.1469,0.7734)) + assert_almost_equal(np.round(mstats.ks_twosamp(winter,spring,'l'),4), + (0.1818,0.6744)) + # + def test_friedmanchisq(self): + "Tests the Friedman Chi-square test" + # No missing values + args = ([9.0,9.5,5.0,7.5,9.5,7.5,8.0,7.0,8.5,6.0], + [7.0,6.5,7.0,7.5,5.0,8.0,6.0,6.5,7.0,7.0], + [6.0,8.0,4.0,6.0,7.0,6.5,6.0,4.0,6.5,3.0]) + result = mstats.friedmanchisquare(*args) + assert_almost_equal(result[0], 10.4737, 4) + assert_almost_equal(result[1], 0.005317, 6) + # Missing values + x = [[nan,nan, 4, 2, 16, 26, 5, 1, 5, 1, 2, 3, 1], + [ 4, 3, 5, 3, 2, 7, 3, 1, 1, 2, 3, 5, 3], + [ 3, 2, 5, 6, 18, 4, 9, 1, 1,nan, 1, 1,nan], + [nan, 6, 11, 4, 17,nan, 6, 1, 1, 2, 5, 1, 1]] + x = ma.fix_invalid(x) + result = mstats.friedmanchisquare(*x) + assert_almost_equal(result[0], 2.0156, 4) + assert_almost_equal(result[1], 0.5692, 4) + + +if __name__ == "__main__": + nose.run(argv=['', __file__]) \ No newline at end of file From scipy-svn at scipy.org Tue Apr 15 00:25:54 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 14 Apr 2008 23:25:54 -0500 (CDT) Subject: [Scipy-svn] r4142 - in trunk/scipy/cluster: . src Message-ID: <20080415042554.C06F139C0C3@new.scipy.org> Author: chris.burns Date: 2008-04-14 23:25:47 -0500 (Mon, 14 Apr 2008) New Revision: 4142 Added: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/src/hierarchy.c trunk/scipy/cluster/src/hierarchy.h trunk/scipy/cluster/src/hierarchy_wrap.c Modified: trunk/scipy/cluster/setup.py Log: Add hierarchical clustering code from Damian Eads. Added: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-14 19:01:01 UTC (rev 4141) +++ trunk/scipy/cluster/hierarchy.py 2008-04-15 04:25:47 UTC (rev 4142) @@ -0,0 +1,3010 @@ +""" +----------------------------------------- +Hierarchical Clustering Library for Scipy + Copyright (C) Damian Eads, 2007-2008. + All Rights Reserved. + New BSD License +----------------------------------------- + +Flat cluster formation + + fcluster forms flat clusters from hierarchical clusters. + fclusterdata forms flat clusters directly from data. + leaders singleton root nodes for flat cluster. + +Agglomerative cluster formation + + linkage agglomeratively clusters original observations. + single the single/min/nearest algorithm. (alias) + complete the complete/max/farthest algorithm. (alias) + average the average/UPGMA algorithm. (alias) + weighted the weighted/WPGMA algorithm. (alias) + centroid the centroid/UPGMC algorithm. (alias) + median the median/WPGMC algorithm. (alias) + ward the Ward/incremental algorithm. (alias) + +Distance matrix computation from a collection of raw observation vectors + + pdist computes distances between each observation pair. + squareform converts a sq. D.M. to a condensed one and vice versa. + +Statistic computations on hierarchies + + cophenet computes the cophenetic distance between leaves. + from_mlab_linkage converts a linkage produced by MATLAB(TM). + inconsistent the inconsistency coefficients for cluster. + maxinconsts the maximum inconsistency coefficient for each cluster. + maxdists the maximum distance for each cluster. + maxRstat the maximum specific statistic for each cluster. + to_mlab_linkage converts a linkage to one MATLAB(TM) can understand. + +Visualization + + dendrogram visualizes linkages (requires matplotlib). + +Tree representations of hierarchies + + cnode represents cluster nodes in a cluster hierarchy. + lvlist a left-to-right traversal of the leaves. + totree represents a linkage matrix as a tree object. + +Distance functions between two vectors u and v + + braycurtis the Bray-Curtis distance. + canberra the Canberra distance. + chebyshev the Chebyshev distance. + cityblock the Manhattan distance. + correlation the Correlation distance. + cosine the Cosine distance. + dice the Dice dissimilarity (boolean). + euclidean the Euclidean distance. + hamming the Hamming distance (boolean). + jaccard the Jaccard distance (boolean). + kulsinski the Kulsinski distance (boolean). + mahalanobis the Mahalanobis distance. + matching the matching dissimilarity (boolean). + minkowski the Minkowski distance. + rogerstanimoto the Rogers-Tanimoto dissimilarity (boolean). + russellrao the Russell-Rao dissimilarity (boolean). + seuclidean the normalized Euclidean distance. + sokalmichener the Sokal-Michener dissimilarity (boolean). + sokalsneath the Sokal-Sneath dissimilarity (boolean). + sqeuclidean the squared Euclidean distance. + yule the Yule dissimilarity (boolean). + +Predicates + + is_valid_dm checks for a valid distance matrix. + is_valid_im checks for a valid inconsistency matrix. + is_valid_linkage checks for a valid hierarchical clustering. + is_valid_y checks for a valid condensed distance matrix. + is_isomorphic checks if two flat clusterings are isomorphic. + is_monotonic checks if a linkage is monotonic. + Z_y_correspond checks for validity of distance matrix given a linkage. + +Utility Functions + + numobs_dm # of observations in a distance matrix. + numobs_linkage # of observations in a linkage. + numobs_y # of observations in a condensed distance matrix. + +Legal stuff + + copying Displays the license for this package. + + + MATLAB and MathWorks are registered trademarks of The MathWorks, Inc. + Mathematica is a registered trademark of The Wolfram Research, Inc. + +References: + + [1] "Statistics toolbox." API Reference Documentation. The MathWorks. + http://www.mathworks.com/access/helpdesk/help/toolbox/stats/. + Accessed October 1, 2007. + + [2] "Hierarchical clustering." API Reference Documentation. + The Wolfram Research, Inc. http://reference.wolfram.com/... + ...mathematica/HierarchicalClustering/tutorial/... + HierarchicalClustering.html. Accessed October 1, 2007. + + [3] Gower, JC and Ross, GJS. "Minimum Spanning Trees and Single Linkage + Cluster Analysis." Applied Statistics. 18(1): pp. 54--64. 1969. + + [4] Ward Jr, JH. "Hierarchical grouping to optimize an objective + function." Journal of the American Statistical Association. 58(301): + pp. 236--44. 1963. + + [5] Johnson, SC. "Hierarchical clustering schemes." Psychometrika. + 32(2): pp. 241--54. 1966. + + [6] Sneath, PH and Sokal, RR. "Numerical taxonomy." Nature. 193: pp. + 855--60. 1962. + + [7] Batagelj, V. "Comparing resemblance measures." Journal of + Classification. 12: pp. 73--90. 1995. + + [8] Sokal, RR and Michener, CD. "A statistical method for evaluating + systematic relationships." Scientific Bulletins. 38(22): + pp. 1409--38. 1958. + + [9] Edelbrock, C. "Mixture model tests of hierarchical clustering + algorithms: the problem of classifying everybody." Multivariate + Behavioral Research. 14: pp. 367--84. 1979. + +[10] Jain, A., and Dubes, R., "Algorithms for Clustering Data." + Prentice-Hall. Englewood Cliffs, NJ. 1988. + +[11] Fisher, RA "The use of multiple measurements in taxonomic + problems." Annals of Eugenics, 7(2): 179-188. 1936 +""" + +_copyingtxt=""" +cluster.py + +Author: Damian Eads +Date: September 22, 2007 + +Copyright (c) 2007, 2008, Damian Eads + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + - Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + - Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +import _hierarchy_wrap, scipy, scipy.stats, numpy, types, math, sys + +_cpy_non_euclid_methods = {'single': 0, 'complete': 1, 'average': 2, 'weighted': 6} +_cpy_euclid_methods = {'centroid': 3, 'median': 4, 'ward': 5} +_cpy_linkage_methods = set(_cpy_non_euclid_methods.keys()).union(set(_cpy_euclid_methods.keys())) +_array_type = type(numpy.array([])) + +try: + import warnings + def _warning(s): + warnings.warn('scipy-cluster: %s' % s, stacklevel=3) +except: + def _warning(s): + print ('[WARNING] scipy-cluster: %s' % s) + +def _copy_array_if_base_present(a): + """ + Copies the array if its base points to a parent array. + """ + if a.base is not None: + return a.copy() + elif (a.dtype == 'float32'): + return numpy.float64(a) + else: + return a + +def _copy_arrays_if_base_present(T): + """ + Accepts a tuple of arrays T. Copies the array T[i] if its base array + points to an actual array. Otherwise, the reference is just copied. + This is useful if the arrays are being passed to a C function that + does not do proper striding. + """ + l = [_copy_array_if_base_present(a) for a in T] + return l + + +def copying(): + """ Displays the license for this package.""" + print _copyingtxt + return None + +def _randdm(pnts): + """ Generates a random distance matrix stored in condensed form. A + pnts * (pnts - 1) / 2 sized vector is returned. + """ + if pnts >= 2: + D = numpy.random.rand(pnts * (pnts - 1) / 2) + else: + raise ValueError("The number of points in the distance matrix must be at least 2.") + return D + +def single(y): + """ + Z = single(y) + + Performs single/min/nearest linkage on the condensed distance + matrix Z. See linkage for more information on the return structure + and algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='single', metric='euclidean') + +def complete(y): + """ + Z = complete(y) + + Performs complete complete/max/farthest point linkage on the + condensed distance matrix Z. See linkage for more information + on the return structure and algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='complete', metric='euclidean') + +def average(y): + """ + Z = average(y) + + Performs average/UPGMA linkage on the condensed distance matrix Z. See + linkage for more information on the return structure and algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='average', metric='euclidean') + +def weighted(y): + """ + Z = weighted(y) + + Performs weighted/WPGMA linkage on the condensed distance matrix Z. + See linkage for more information on the return structure and + algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='weighted', metric='euclidean') + +def centroid(y): + """ + Z = centroid(y) + + Performs centroid/UPGMC linkage on the condensed distance matrix Z. + See linkage for more information on the return structure and + algorithm. + + (a condensed alias for linkage) + + Z = centroid(X) + + Performs centroid/UPGMC linkage on the observation matrix X using + Euclidean distance as the distance metric. See linkage for more + information on the return structure and algorithm. + + """ + return linkage(y, method='centroid', metric='euclidean') + +def median(y): + """ + Z = median(y) + + Performs median/WPGMC linkage on the condensed distance matrix Z. + See linkage for more information on the return structure and + algorithm. + + Z = median(X) + + Performs median/WPGMC linkage on the observation matrix X using + Euclidean distance as the distance metric. See linkage for more + information on the return structure and algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='median', metric='euclidean') + +def ward(y): + """ + Z = ward(y) + + Performs Ward's linkage on the condensed distance matrix Z. See + linkage for more information on the return structure and algorithm. + + Z = ward(X) + + Performs Ward's linkage on the observation matrix X using Euclidean + distance as the distance metric. See linkage for more information + on the return structure and algorithm. + + (a condensed alias for linkage) + """ + return linkage(y, method='ward', metric='euclidean') + + +def linkage(y, method='single', metric='euclidean'): + """ Z = linkage(y, method) + + Performs hierarchical/agglomerative clustering on the + condensed distance matrix y. y must be a {n \choose 2} sized + vector where n is the number of original observations paired + in the distance matrix. The behavior of this function is very + similar to the MATLAB(TM) linkage function. + + A (n - 1) * 4 matrix Z is returned. At the i'th iteration, + clusters with indices Z[i, 0] and Z[i, 1] are combined to + form cluster n + i. A cluster with an index less than n + corresponds to one of the n original observations. The + distance between clusters Z[i, 0] and Z[i, 1] is given by + Z[i, 2]. The fourth value Z[i, 3] represents the number of + original observations in the newly formed cluster. + + The following linkage methods are used to compute the + distance dist(s, t) between two clusters s and t. The + algorithm begins with a forest of clusters that have yet + to be used in the hierarchy being formed. When two clusters + s and t from this forest are combined into a single cluster u, + s and t are removed from the forest, and u is added to + the forest. When only one cluster remains in the forest, + the algorithm stops, and this cluster becomes the root. + + A distance matrix is maintained at each iteration. The + d[i,j] entry corresponds to the distance between cluster + i and j in the original forest. + + At each iteration, the algorithm must update the distance + matrix to reflect the distance of the newly formed cluster + u with the remaining clusters in the forest. + + Suppose there are |u| original observations u[0], ..., u[|u|-1] + in cluster u and |v| original objects v[0], ..., v[|v|-1] + in cluster v. Recall s and t are combined to form cluster + u. Let v be any remaining cluster in the forest that is not + u. + + The following are methods for calculating the distance between + the newly formed cluster u and each v. + + * method='single' assigns dist(u,v) = MIN(dist(u[i],v[j]) + for all points i in cluster u and j in cluster v. + + (also called Nearest Point Algorithm) + + * method='complete' assigns dist(u,v) = MAX(dist(u[i],v[j]) + for all points i in cluster u and j in cluster v. + + (also called Farthest Point Algorithm + or the Voor Hees Algorithm) + + * method='average' assigns dist(u,v) = + \sum_{ij} { dist(u[i], v[j]) } / (|u|*|v|) + for all points i and j where |u| and |v| are the + cardinalities of clusters u and v, respectively. + + (also called UPGMA) + + * method='weighted' assigns + + dist(u,v) = (dist(s,v) + dist(t,v))/2 + + where cluster u was formed with cluster s and t and v + is a remaining cluster in the forest. (also called WPGMA) + + Z = linkage(X, method, metric='euclidean') + + Performs hierarchical clustering on the objects defined by the + n by m observation matrix X. + + If the metric is 'euclidean' then the following methods may be + used: + + * method='centroid' assigns dist(s,t) = euclid(c_s, c_t) where + c_s and c_t are the centroids of clusters s and t, + respectively. When two clusters s and t are combined into a new + cluster u, the new centroid is computed over all the original + objects in clusters s and t. The distance then becomes + the Euclidean distance between the centroid of u and the + centroid of a remaining cluster v in the forest. + (also called UPGMC) + + * method='median' assigns dist(s,t) as above. When two clusters + s and t are combined into a new cluster u, the average of + centroids s and t give the new centroid u. (also called WPGMC) + + * method='ward' uses the Ward variance minimization algorithm. + The new entry dist(u, v) is computed as follows, + + dist(u,v) = + + ---------------------------------------------------- + | |v|+|s| |v|+|t| |v| + | ------- d(v,s)^2 + ------- d(v,t)^2 - --- d(s,t)^2 + \| T T T + + where u is the newly joined cluster consisting of clusters + s and t, v is an unused cluster in the forest, T=|v|+|s|+|t|, + and |*| is the cardinality of its argument. + (also called incremental) + + Warning to MATLAB(TM) users: when the minimum distance pair in + the forest is chosen, there may be two or more pairs with the + same minimum distance. This implementation may chose a + different minimum than the MATLAB(TM) version. + """ + if type(method) != types.StringType: + raise TypeError("Argument 'method' must be a string.") + + if type(y) != _array_type: + raise TypeError("Argument 'y' must be a numpy array.") + + s = y.shape + if len(s) == 1: + is_valid_y(y, throw=True, name='y') + d = numpy.ceil(numpy.sqrt(s[0] * 2)) + if method not in _cpy_non_euclid_methods.keys(): + raise ValueError("Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average'.") + # Since the C code does not support striding using strides. + [y] = _copy_arrays_if_base_present([y]) + + Z = numpy.zeros((d - 1, 4)) + _hierarchy_wrap.linkage_wrap(y, Z, int(d), \ + int(_cpy_non_euclid_methods[method])) + elif len(s) == 2: + X = y + n = s[0] + m = s[1] + if method not in _cpy_linkage_methods: + raise ValueError('Invalid method: %s' % method) + if method in _cpy_non_euclid_methods.keys(): + dm = pdist(X, metric) + Z = numpy.zeros((n - 1, 4)) + _hierarchy_wrap.linkage_wrap(dm, Z, n, \ + int(_cpy_non_euclid_methods[method])) + elif method in _cpy_euclid_methods.keys(): + if metric != 'euclidean': + raise ValueError('Method %s requires the distance metric to be euclidean' % s) + dm = pdist(X, metric) + Z = numpy.zeros((n - 1, 4)) + _hierarchy_wrap.linkage_euclid_wrap(dm, Z, X, m, n, + int(_cpy_euclid_methods[method])) + return Z + +class cnode: + """ + A tree node class for representing a cluster. Leaf nodes correspond + to original observations, while non-leaf nodes correspond to + non-singleton clusters. + + The totree function converts a matrix returned by the linkage + function into an easy-to-use tree representation. + """ + + def __init__(self, id, left=None, right=None, dist=0, count=1): + if id < 0: + raise ValueError('The id must be non-negative.') + if dist < 0: + raise ValueError('The distance must be non-negative.') + if (left is None and right is not None) or \ + (left is not None and right is None): + raise ValueError('Only full or proper binary trees are permitted. This node has one child.') + if count < 1: + raise ValueError('A cluster must contain at least one original observation.') + self.id = id + self.left = left + self.right = right + self.dist = dist + if self.left is None: + self.count = count + else: + self.count = left.count + right.count + + def getId(self): + """ + i = nd.getId() + + Returns the id number of the node nd. For 0 <= i < n, i + corresponds to original observation i. For n <= i < 2n - 1, + i corresponds to non-singleton cluster formed at iteration i-n. + """ + return self.id + + def getCount(self): + """ + c = nd.getCount() + + Returns the number of leaf nodes (original observations) + belonging to the cluster node nd. If the nd is a leaf, c=1. + """ + return self.count + + def getLeft(self): + """ + left = nd.getLeft() + + Returns a reference to the left child. If the node is a + leaf, None is returned. + """ + return self.left + + def getRight(self): + """ + left = nd.getLeft() + + Returns a reference to the right child. If the node is a + leaf, None is returned. + """ + return self.right + + def isLeaf(self): + """ + Returns True if the node is a leaf. + """ + return self.left is None + + def preOrder(self, func=(lambda x: x.id)): + """ + vlst = preOrder(func) + + Performs preorder traversal without recursive function calls. + When a leaf node is first encountered, func is called with the + leaf node as its argument, and its result is appended to the + list vlst. + + For example, the statement + + ids = root.preOrder(lambda x: x.id) + + returns a list of the node ids corresponding to the leaf + nodes of the tree as they appear from left to right. + """ + + # Do a preorder traversal, caching the result. To avoid having to do + # recursion, we'll store the previous index we've visited in a vector. + n = self.count + + curNode = [None] * (2 * n) + lvisited = numpy.zeros((2 * n,), dtype='bool') + rvisited = numpy.zeros((2 * n,), dtype='bool') + curNode[0] = self + k = 0 + preorder = [] + while k >= 0: + nd = curNode[k] + ndid = nd.id + if nd.isLeaf(): + preorder.append(func(nd)) + k = k - 1 + else: + if not lvisited[ndid]: + curNode[k + 1] = nd.left + lvisited[ndid] = True + k = k + 1 + elif not rvisited[ndid]: + curNode[k + 1] = nd.right + rvisited[ndid] = True + k = k + 1 + # If we've visited the left and right of this non-leaf + # node already, go up in the tree. + else: + k = k - 1 + + return preorder + +_cnode_bare = cnode(0) +_cnode_type = type(cnode) + +def totree(Z, rd=False): + """ + r = totree(Z) + + Converts a hierarchical clustering encoded in the matrix Z + (by linkage) into an easy-to-use tree object. The reference r + to the root cnode object is returned. + + Each cnode object has a left, right, dist, id, and count + attribute. The left and right attributes point to cnode + objects that were combined to generate the cluster. If + both are None then the cnode object is a leaf node, its + count must be 1, and its distance is meaningless but set + to 0. + + (r, d) = totree(Z, rd=True) + + Same as totree(Z) except a tuple is returned where r is + the reference to the root cnode and d is a reference to a + dictionary mapping cluster ids to cnodes. If a cluster id + is less than n, then it corresponds to a singleton cluster + (leaf node). + + Note: This function is provided for the convenience of the + library user. cnodes are not used as input to any of the + functions in this library. + """ + + is_valid_linkage(Z, throw=True, name='Z') + + # The number of original objects is equal to the number of rows minus + # 1. + n = Z.shape[0] + 1 + + # Create a list full of None's to store the node objects + d = [None] * (n*2-1) + + # If we encounter a cluster being combined more than once, the matrix + # must be corrupt. + if len(numpy.unique(Z[:, 0:2].reshape((2 * (n - 1),)))) != 2 * (n - 1): + raise ValueError('Corrupt matrix Z. Some clusters are more than once.') + # If a cluster index is out of bounds, report an error. + if (Z[:, 0:2] >= 2 * n - 1).any(): + raise ValueError('Corrupt matrix Z. Some cluster indices (first and second) are out of bounds.') + if (Z[:, 0:2] < 0).any(): + raise ValueError('Corrupt matrix Z. Some cluster indices (first and second columns) are negative.') + if (Z[:, 2] < 0).any(): + raise ValueError('Corrupt matrix Z. Some distances (third column) are negative.') + + if (Z[:, 3] < 0).any(): + raise ValueError('Some counts (fourth column) are negative.') + + # Create the nodes corresponding to the n original objects. + for i in xrange(0, n): + d[i] = cnode(i) + + nd = None + + for i in xrange(0, n - 1): + fi = int(Z[i, 0]) + fj = int(Z[i, 1]) + if fi > i + n: + raise ValueError('Corrupt matrix Z. Index to derivative cluster is used before it is formed. See row %d, column 0' % fi) + if fj > i + n: + raise ValueError('Corrupt matrix Z. Index to derivative cluster is used before it is formed. See row %d, column 1' % fj) + nd = cnode(i + n, d[fi], d[fj], Z[i, 2]) + # ^ id ^ left ^ right ^ dist + if Z[i,3] != nd.count: + raise ValueError('Corrupt matrix Z. The count Z[%d,3] is incorrect.' % i) + d[n + i] = nd + + if rd: + return (nd, d) + else: + return nd + +def squareform(X, force="no", checks=True): + """ + ... = squareform(...) + + Converts a vector-form distance vector to a square-form distance + matrix, and vice-versa. + + v = squareform(X) + + Given a square d by d symmetric distance matrix X, v=squareform(X) + returns a d*(d-1)/2 (or {n \choose 2}) sized vector v. + + v[{n \choose 2}-{n-i \choose 2} + (j-i-1)] is the distance + between points i and j. If X is non-square or asymmetric, an error + is returned. + + X = squareform(v) + + Given a d*d(-1)/2 sized v for some integer d>=2 encoding distances + as described, X=squareform(v) returns a d by d distance matrix X. The + X[i, j] and X[j, i] values are set to + v[{n \choose 2}-{n-i \choose 2} + (j-u-1)] and all + diagonal elements are zero. + + As with MATLAB(TM), if force is equal to 'tovector' or 'tomatrix', + the input will be treated as a distance matrix or distance vector + respectively. + + If checks is set to False, no checks will be made for matrix + symmetry nor zero diagonals. This is useful if it is known that + X - X.T is small and diag(X) is close to zero. These values are + ignored any way so they do not disrupt the squareform + transformation. + """ + + if type(X) is not _array_type: + raise TypeError('The parameter passed must be an array.') + + if X.dtype != 'double': + raise TypeError('A double array must be passed.') + + s = X.shape + + # X = squareform(v) + if len(s) == 1 and force != 'tomatrix': + # Grab the closest value to the square root of the number + # of elements times 2 to see if the number of elements + # is indeed a binomial coefficient. + d = int(numpy.ceil(numpy.sqrt(X.shape[0] * 2))) + + print d, s[0] + # Check that v is of valid dimensions. + if d * (d - 1) / 2 != int(s[0]): + raise ValueError('Incompatible vector size. It must be a binomial coefficient n choose 2 for some integer n >= 2.') + + # Allocate memory for the distance matrix. + M = numpy.zeros((d, d), 'double') + + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [X] = _copy_arrays_if_base_present([X]) + + # Fill in the values of the distance matrix. + _hierarchy_wrap.to_squareform_from_vector_wrap(M, X) + + # Return the distance matrix. + M = M + M.transpose() + return M + elif len(s) != 1 and force.lower() == 'tomatrix': + raise ValueError("Forcing 'tomatrix' but input X is not a distance vector.") + elif len(s) == 2 and force.lower() != 'tovector': + if s[0] != s[1]: + raise ValueError('The matrix argument must be square.') + if checks: + if numpy.sum(numpy.sum(X == X.transpose())) != numpy.product(X.shape): + raise ValueError('The distance matrix must be symmetrical.') + if (X.diagonal() != 0).any(): + raise ValueError('The distance matrix must have zeros along the diagonal.') + + # One-side of the dimensions is set here. + d = s[0] + + # Create a vector. + v = numpy.zeros(((d * (d - 1) / 2),), 'double') + + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [X] = _copy_arrays_if_base_present([X]) + + # Convert the vector to squareform. + _hierarchy_wrap.to_vector_from_squareform_wrap(X, v) + return v + elif len(s) != 2 and force.lower() == 'tomatrix': + raise ValueError("Forcing 'tomatrix' but input X is not a distance vector.") + else: + raise ValueError('The first argument must be a vector or matrix. A %d-dimensional array is not permitted' % len(s)) + +def minkowski(u, v, p): + """ + d = minkowski(u, v, p) + + Returns the Minkowski distance between two vectors u and v, + + ||u-v||_p = (\sum {|u_i - v_i|^p})^(1/p). + """ + if p < 1: + raise ValueError("p must be at least 1") + return math.pow((abs(u-v)**p).sum(), 1.0/p) + +def euclidean(u, v): + """ + d = euclidean(u, v) + + Computes the Euclidean distance between two n-vectors u and v, ||u-v||_2 + """ + q=numpy.matrix(u-v) + return numpy.sqrt((q*q.T).sum()) + +def sqeuclidean(u, v): + """ + d = sqeuclidean(u, v) + + Computes the squared Euclidean distance between two n-vectors u and v, + (||u-v||_2)^2. + """ + return ((u-v)*(u-v).T).sum() + +def cosine(u, v): + """ + d = cosine(u, v) + + Computes the Cosine distance between two n-vectors u and v, + (1-uv^T)/(||u||_2 * ||v||_2). + """ + return (1.0 - (scipy.dot(u, v.T) / \ + (numpy.sqrt(scipy.dot(u, u.T)) * numpy.sqrt(scipy.dot(v, v.T))))) + +def correlation(u, v): + """ + d = correlation(u, v) + + Computes the correlation distance between two n-vectors u and v, + + 1 - (u - n|u|_1)(v - n|v|_1)^T + --------------------------------- , + |(u - n|u|_1)|_2 |(v - n|v|_1)|^T + + where |*|_1 is the Manhattan norm and n is the common dimensionality + of the vectors. + """ + umu = u.mean() + vmu = v.mean() + um = u - umu + vm = v - vmu + return 1.0 - (scipy.dot(um, vm) / + (numpy.sqrt(scipy.dot(um, um)) \ + * numpy.sqrt(scipy.dot(vm, vm)))) + +def hamming(u, v): + """ + d = hamming(u, v) + + Computes the Hamming distance between two n-vectors u and v, + which is simply the proportion of disagreeing components in u + and v. If u and v are boolean vectors, the hamming distance is + + (c_{01} + c_{10}) / n + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n. + """ + return (u != v).mean() + +def jaccard(u, v): + """ + d = jaccard(u, v) + + Computes the Jaccard-Needham dissimilarity between two boolean + n-vectors u and v, which is + + c_{TF} + c_{FT} + ------------------------ + c_{TT} + c_{FT} + c_{TF} + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n. + """ + return ((scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0))).sum()) / scipy.bitwise_or(u != 0, v != 0).sum() + +def kulsinski(u, v): + """ + d = kulsinski(u, v) + + Computes the Kulsinski dissimilarity between two boolean n-vectors + u and v, which is + + c_{TF} + c_{FT} - c_{TT} + n + ---------------------------- + c_{FT} + c_{TF} + n + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n. + """ + (nff, nft, ntf, ntt) = _nbool_correspond_all(u, v) + + return (ntf + nft - ntt + n) / (ntf + nft + n) + +def seuclidean(u, v, V): + """ + d = seuclidean(u, v, V) + + Returns the standardized Euclidean distance between two + n-vectors u and v. V is a m-dimensional vector of component + variances. It is usually computed among a larger collection vectors. + """ + if type(V) is not _array_type or len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]: + raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') + return numpy.sqrt(((u-v)**2 / V).sum()) + +def cityblock(u, v): + """ + d = cityblock(u, v) + + Computes the Manhattan distance between two n-vectors u and v, + \sum {u_i-v_i}. + """ + return abs(u-v).sum() + +def mahalanobis(u, v, VI): + """ + d = mahalanobis(u, v, VI) + + Computes the Mahalanobis distance between two n-vectors u and v, + (u-v)VI(u-v)^T + where VI is the inverse covariance matrix. + """ + if type(V) is not _array_type: + raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') + return numpy.sqrt(scipy.dot(scipy.dot((u-v),VI),(u-v).T).sum()) + +def chebyshev(u, v): + """ + d = chebyshev(u, v) + + Computes the Chebyshev distance between two n-vectors u and v, + \max {|u_i-v_i|}. + """ + return max(abs(u-v)) + +def braycurtis(u, v): + """ + d = braycurtis(u, v) + + Computes the Bray-Curtis distance between two n-vectors u and v, + \sum{|u_i-v_i|} / \sum{|u_i+v_i|}. + """ + return abs(u-v).sum() / abs(u+v).sum() + +def canberra(u, v): + """ + d = canberra(u, v) + + Computes the Canberra distance between two n-vectors u and v, + \sum{|u_i-v_i|} / \sum{|u_i|+|v_i}. + """ + return abs(u-v).sum() / (abs(u).sum() + abs(v).sum()) + +def _nbool_correspond_all(u, v): + not_u = scipy.bitwise_not(u) + not_v = scipy.bitwise_not(v) + nff = scipy.bitwise_and(not_u, not_v).sum() + nft = scipy.bitwise_and(not_u, v).sum() + ntf = scipy.bitwise_and(u, not_v).sum() + ntt = scipy.bitwise_and(u, v).sum() + return (nff, nft, ntf, ntt) + +def _nbool_correspond_ft_tf(u, v): + not_u = scipy.bitwise_not(u) + not_v = scipy.bitwise_not(v) + nft = scipy.bitwise_and(not_u, v).sum() + ntf = scipy.bitwise_and(u, not_v).sum() + return (nft, ntf) + +def yule(u, v): + """ + d = yule(u, v) + Computes the Yule dissimilarity between two boolean n-vectors u and v, + + R + --------------------- + c_{TT} + c_{FF} + R/2 + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n, and + + R = 2.0 * (c_{TF} + c_{FT}). + """ + (nff, nft, ntf, ntt) = _nbool_correspond_all(u, v) + return float(2.0 * ntf * nft) / float(ntt * nff + ntf * nft) + +def matching(u, v): + """ + d = matching(u, v) + + Computes the Matching dissimilarity between two boolean n-vectors + u and v, which is + + (c_{TF} + c_{FT}) / n + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n. + """ + (nft, ntf) = _nbool_correspond_ft_tf(u, v) + return float(nft + ntf) / float(len(u)) + +def dice(u, v): + """ + d = dice(u, v) + + Computes the Dice dissimilarity between two boolean n-vectors + u and v, which is + + c_{TF} + c_{FT} + ---------------------------- + 2 * c_{TT} + c_{FT} + c_{TF} + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n. + """ + ntt = scipy.bitwise_and(u, v).sum() + (nft, ntf) = _nbool_correspond_ft_tf(u, v) + return float(ntf + nft)/float(2.0 * ntt + ntf + nft) + +def rogerstanimoto(u, v): + """ + d = rogerstanimoto(u, v) + + Computes the Rogers-Tanimoto dissimilarity between two boolean + n-vectors u and v, + + R + ------------------- + c_{TT} + c_{FF} + R + + where c_{ij} is the number of occurrences of + + u[k] == i and v[k] == j + + for k < n, and + + R = 2.0 * (c_{TF} + c_{FT}). + + """ + (nff, nft, ntf, ntt) = _nbool_correspond_all(u, v) + return float(2.0 * (ntf + nft)) / float(ntt + nff + (2.0 * (ntf + nft))) + +def russellrao(u, v): + """ + d = russellrao(u, v) + + Computes the Russell-Rao dissimilarity between two boolean n-vectors + u and v, (n - c_{TT}) / n where c_{ij} is the number of occurrences + of u[k] == i and v[k] == j for k < n. + """ + ntt = scipy.bitwise_and(u, v).sum() + return float(len(u) - ntt) / float(len(u)) + +def sokalmichener(u, v): + """ + d = sokalmichener(u, v) + + Computes the Sokal-Michener dissimilarity between two boolean vectors + u and v, 2R / (S + 2R) where c_{ij} is the number of occurrences of + u[k] == i and v[k] == j for k < n and R = 2 * (c_{TF} + c{FT}) and + S = c_{FF} + c_{TT}. + """ + ntt = scipy.bitwise_and(u, v).sum() + nff = scipy.bitwise_and(scipy.bitwise_not(u), scipy.bitwise_not(v)).sum() + (nft, ntf) = _nbool_correspond_ft_tf(u, v) + return float(2.0 * (ntf + nft))/float(ntt + nff + 2.0 * (ntf + nft)) + +def sokalsneath(u, v): + """ + d = sokalsneath(u, v) + + Computes the Sokal-Sneath dissimilarity between two boolean vectors + u and v, 2R / (c_{TT} + 2R) where c_{ij} is the number of occurrences + of u[k] == i and v[k] == j for k < n and R = 2 * (c_{TF} + c{FT}). + """ + ntt = scipy.bitwise_and(u, v).sum() + (nft, ntf) = _nbool_correspond_ft_tf(u, v) + return float(2.0 * (ntf + nft))/float(ntt + 2.0 * (ntf + nft)) + +# V means pass covariance +_pdist_metric_info = {'euclidean': ['double'], + 'seuclidean': ['double'], + 'sqeuclidean': ['double'], + 'minkowski': ['double'], + 'cityblock': ['double'], + 'cosine': ['double'], + 'correlation': ['double'], + 'hamming': ['double','bool'], + 'jaccard': ['double', 'bool'], + 'chebyshev': ['double'], + 'canberra': ['double'], + 'braycurtis': ['double'], + 'mahalanobis': ['bool'], + 'yule': ['bool'], + 'matching': ['bool'], + 'dice': ['bool'], + 'kulsinski': ['bool'], + 'rogerstanimoto': ['bool'], + 'russellrao': ['bool'], + 'sokalmichener': ['bool'], + 'sokalsneath': ['bool']} + +def pdist(X, metric='euclidean', p=2, V=None, VI=None): + """ Y = pdist(X, method='euclidean', p=2) + + Computes the distance between m original observations in + n-dimensional space. Returns a condensed distance matrix Y. + For each i and j (i=1. + + 3. Y = pdist(X, 'cityblock') + + Computes the city block or Manhattan distance between the + points. + + 4. Y = pdist(X, 'seuclidean', V=None) + + Computes the standardized Euclidean distance. The standardized + Euclidean distance between two n-vectors u and v is + + sqrt(\sum {(u_i-v_i)^2 / V[x_i]}). + + V is the variance vector; V[i] is the variance computed over all + the i'th components of the points. If not passed, it is + automatically computed. + + 5. Y = pdist(X, 'sqeuclidean') + + Computes the squared Euclidean distance ||u-v||_2^2 between + the vectors. + + 6. Y = pdist(X, 'cosine') + + Computes the cosine distance between vectors u and v, + + 1 - uv^T + ----------- + |u|_2 |v|_2 + + where |*|_2 is the 2 norm of its argument *. + + 7. Y = pdist(X, 'correlation') + + Computes the correlation distance between vectors u and v. This is + + 1 - (u - n|u|_1)(v - n|v|_1)^T + --------------------------------- , + |(u - n|u|_1)|_2 |(v - n|v|_1)|^T + + where |*|_1 is the Manhattan (or 1-norm) of its argument *, + and n is the common dimensionality of the vectors. + + 8. Y = pdist(X, 'hamming') + + Computes the normalized Hamming distance, or the proportion + of those vector elements between two n-vectors u and v which + disagree. To save memory, the matrix X can be of type boolean. + + 9. Y = pdist(X, 'jaccard') + + Computes the Jaccard distance between the points. Given two + vectors, u and v, the Jaccard distance is the proportion of + those elements u_i and v_i that disagree where at least one + of them is non-zero. + + 10. Y = pdist(X, 'chebyshev') + + Computes the Chebyshev distance between the points. The + Chebyshev distance between two n-vectors u and v is the maximum + norm-1 distance between their respective elements. More + precisely, the distance is given by + + d(u,v) = max {|u_i-v_i|}. + + 11. Y = pdist(X, 'canberra') + + Computes the Canberra distance between the points. The + Canberra distance between two points u and v is + + |u_1-v_1| |u_2-v_2| |u_n-v_n| + d(u,v) = ----------- + ----------- + ... + ----------- + |u_1|+|v_1| |u_2|+|v_2| |u_n|+|v_n| + + 12. Y = pdist(X, 'braycurtis') + + Computes the Bray-Curtis distance between the points. The + Bray-Curtis distance between two points u and v is + + |u_1-v_1| + |u_2-v_2| + ... + |u_n-v_n| + d(u,v) = --------------------------------------- + |u_1+v_1| + |u_2+v_2| + ... + |u_n+v_n| + + 13. Y = pdist(X, 'mahalanobis', VI=None) + + Computes the Mahalanobis distance between the points. The + Mahalanobis distance between two points u and v is + (u-v)(1/V)(u-v)^T + where (1/V) is the inverse covariance. If VI is not None, + VI will be used as the inverse covariance matrix. + + 14. Y = pdist(X, 'yule') + + Computes the Yule distance between each pair of boolean + vectors. (see yule function documentation) + + 15. Y = pdist(X, 'matching') + + Computes the matching distance between each pair of boolean + vectors. (see matching function documentation) + + 16. Y = pdist(X, 'dice') + + Computes the Dice distance between each pair of boolean + vectors. (see dice function documentation) + + 17. Y = pdist(X, 'kulsinski') + + Computes the Kulsinski distance between each pair of + boolean vectors. (see kulsinski function documentation) + + 17. Y = pdist(X, 'rogerstanimoto') + + Computes the Rogers-Tanimoto distance between each pair of + boolean vectors. (see rogerstanimoto function documentation) + + 18. Y = pdist(X, 'russellrao') + + Computes the Russell-Rao distance between each pair of + boolean vectors. (see russellrao function documentation) + + 19. Y = pdist(X, 'sokalmichener') + + Computes the Sokal-Michener distance between each pair of + boolean vectors. (see sokalmichener function documentation) + + 20. Y = pdist(X, 'sokalsneath') + + Computes the Sokal-Sneath distance between each pair of + boolean vectors. (see sokalsneath function documentation) + + 21. Y = pdist(X, f) + + Computes the distance between all pairs of vectors in X + using the user supplied 2-arity function f. For example, + Euclidean distance between the vectors could be computed + as follows, + + dm = pdist(X, (lambda u, v: numpy.sqrt(((u-v)*(u-v).T).sum()))) + + Note that you should avoid passing a reference to one of + the distance functions defined in this library. For example, + + dm = pdist(X, sokalsneath) + + would calculate the pair-wise distances between the vectors + in X using the Python function sokalsneath. This would result + in sokalsneath being called {n \choose 2} times, which is + inefficient. Instead, the optimized C version is more + efficient, and we call it using the following syntax. + + dm = pdist(X, 'sokalsneath') + """ +# 21. Y = pdist(X, 'test_Y') +# +# Computes the distance between all pairs of vectors in X +# using the distance metric Y but with a more succint, +# verifiable, but less efficient implementation. + + + if type(X) is not _array_type: + raise TypeError('The parameter passed must be an array.') + + if X.dtype != 'double': + raise TypeError('X must be a float64 array') + + # The C code doesn't do striding. + [X] = _copy_arrays_if_base_present([X]) + + s = X.shape + + if len(s) != 2: + raise ValueError('A matrix must be passed.'); + + m = s[0] + n = s[1] + dm = numpy.zeros((m * (m - 1) / 2,), dtype='double') + + mtype = type(metric) + if mtype is types.FunctionType: + k = 0 + for i in xrange(0, m - 1): + for j in xrange(i+1, m): + dm[k] = metric(X[i, :], X[j, :]) + k = k + 1 + elif mtype is types.StringType: + mstr = metric.lower() + + if X.dtype != 'double' and (mstr != 'hamming' and mstr != 'jaccard'): + TypeError('A double array must be passed.') + if mstr in set(['euclidean', 'euclid', 'eu', 'e']): + _hierarchy_wrap.pdist_euclidean_wrap(X, dm) + elif mstr in set(['sqeuclidean']): + _hierarchy_wrap.pdist_euclidean_wrap(X, dm) + dm = dm ** 2.0 + elif mstr in set(['cityblock', 'cblock', 'cb', 'c']): + _hierarchy_wrap.pdist_city_block_wrap(X, dm) + elif mstr in set(['hamming', 'hamm', 'ha', 'h']): + if X.dtype == 'double': + _hierarchy_wrap.pdist_hamming_wrap(X, dm) + elif X.dtype == 'bool': + _hierarchy_wrap.pdist_hamming_bool_wrap(X, dm) + else: + raise TypeError('Invalid input matrix type %s for hamming.' % str(X.dtype)) + elif mstr in set(['jaccard', 'jacc', 'ja', 'j']): + if X.dtype == 'double': + _hierarchy_wrap.pdist_hamming_wrap(X, dm) + elif X.dtype == 'bool': + _hierarchy_wrap.pdist_hamming_bool_wrap(X, dm) + else: + raise TypeError('Invalid input matrix type %s for jaccard.' % str(X.dtype)) + elif mstr in set(['chebyshev', 'cheby', 'cheb', 'ch']): + _hierarchy_wrap.pdist_chebyshev_wrap(X, dm) + elif mstr in set(['minkowski', 'mi', 'm']): + _hierarchy_wrap.pdist_minkowski_wrap(X, dm, p) + elif mstr in set(['seuclidean', 'se', 's']): + if V: + if type(V) is not _array_type: + raise TypeError('Variance vector V must be a numpy array') + if V.dtype != 'double': + raise TypeError('Variance vector V must contain doubles.') + if len(V.shape) != 1: + raise ValueError('Variance vector V must be one-dimensional.') + if V.shape[0] != n: + raise ValueError('Variance vector V must be of the same dimension as the vectors on which the distances are computed.') + # The C code doesn't do striding. + [VV] = _copy_arrays_if_base_present([V]) + else: + VV = scipy.stats.var(X, axis=0) + _hierarchy_wrap.pdist_seuclidean_wrap(X, VV, dm) + # Need to test whether vectorized cosine works better. + # Find out: Is there a dot subtraction operator so I can + # subtract matrices in a similar way to multiplying them? + # Need to get rid of as much unnecessary C code as possible. + elif mstr in set(['cosine_old', 'cos_old']): + norms = numpy.sqrt(numpy.sum(X * X, axis=1)) + _hierarchy_wrap.pdist_cosine_wrap(X, dm, norms) + elif mstr in set(['cosine', 'cos']): + norms = numpy.sqrt(numpy.sum(X * X, axis=1)) + nV = norms.reshape(m, 1) + # The numerator u * v + nm = numpy.dot(X, X.T) + # The denom. ||u||*||v|| + de = numpy.dot(nV, nV.T); + dm = 1 - (nm / de) + dm[xrange(0,m),xrange(0,m)] = 0 + dm = squareform(dm) + elif mstr in set(['correlation', 'co']): + X2 = X - X.mean(1)[:,numpy.newaxis] + #X2 = X - numpy.matlib.repmat(numpy.mean(X, axis=1).reshape(m, 1), 1, n) + norms = numpy.sqrt(numpy.sum(X2 * X2, axis=1)) + _hierarchy_wrap.pdist_cosine_wrap(X2, dm, norms) + elif mstr in set(['mahalanobis', 'mahal', 'mah']): + if VI: + if type(VI) != _array_type: + raise TypeError('VI must be a numpy array.') + if VI.dtype != 'double': + raise TypeError('The array must contain doubles.') + [VI] = _copy_arrays_if_base_present([VI]) + else: + V = numpy.cov(X.T) + VI = numpy.linalg.inv(V).T.copy() + # (u-v)V^(-1)(u-v)^T + _hierarchy_wrap.pdist_mahalanobis_wrap(X, VI, dm) + elif mstr == 'canberra': + _hierarchy_wrap.pdist_canberra_wrap(X, dm) + elif mstr == 'braycurtis': + _hierarchy_wrap.pdist_bray_curtis_wrap(X, dm) + elif mstr == 'yule': + _hierarchy_wrap.pdist_yule_bool_wrap(X, dm) + elif mstr == 'matching': + _hierarchy_wrap.pdist_matching_bool_wrap(X, dm) + elif mstr == 'kulsinski': + _hierarchy_wrap.pdist_kulsinski_bool_wrap(X, dm) + elif mstr == 'dice': + _hierarchy_wrap.pdist_dice_bool_wrap(X, dm) + elif mstr == 'rogerstanimoto': + _hierarchy_wrap.pdist_rogerstanimoto_bool_wrap(X, dm) + elif mstr == 'russellrao': + _hierarchy_wrap.pdist_russellrao_bool_wrap(X, dm) + elif mstr == 'sokalmichener': + _hierarchy_wrap.pdist_sokalmichener_bool_wrap(X, dm) + elif mstr == 'sokalsneath': + _hierarchy_wrap.pdist_sokalsneath_bool_wrap(X, dm) + elif metric == 'test_euclidean': + dm = pdist(X, euclidean) + elif metric == 'test_sqeuclidean': + if V is None: + V = scipy.stats.var(X, axis=0) + dm = pdist(X, lambda u, v: seuclidean(u, v, V)) + elif metric == 'test_braycurtis': + dm = pdist(X, braycurtis) + elif metric == 'test_mahalanobis': + if VI is None: + V = numpy.cov(X.T) + VI = numpy.linalg.inv(V) + [VI] = _copy_arrays_if_base_present([VI]) + # (u-v)V^(-1)(u-v)^T + dm = pdist(X, (lambda u, v: mahalanobis(u, v, VI))) + elif metric == 'test_cityblock': + dm = pdist(X, cityblock) + elif metric == 'test_minkowski': + dm = pdist(X, minkowski) + elif metric == 'test_cosine': + dm = pdist(X, cosine) + elif metric == 'test_correlation': + dm = pdist(X, correlation) + elif metric == 'test_hamming': + dm = pdist(X, hamming) + elif metric == 'test_jaccard': + dm = pdist(X, jaccard) + elif metric == 'test_chebyshev': + dm = pdist(X, chebyshev) + elif metric == 'test_yule': + dm = pdist(X, yule) + elif metric == 'test_matching': + dm = pdist(X, matching) + elif metric == 'test_dice': + dm = pdist(X, dice) + elif metric == 'test_rogerstanimoto': + dm = pdist(X, rogerstanimoto) + elif metric == 'test_russellrao': + dm = pdist(X, russellrao) + elif metric == 'test_sokalsneath': + dm = pdist(X, sokalsneath) + else: + raise ValueError('Unknown Distance Metric: %s' % mstr) + else: + raise TypeError('2nd argument metric must be a string identifier or a function.') + return dm + +def cophenet(*args, **kwargs): + """ + d = cophenet(Z) + + Calculates the cophenetic distances between each observation in the + hierarchical clustering defined by the linkage Z. + + Suppose p and q are original observations in disjoint clusters + s and t, respectively and s and t are joined by a direct parent + cluster u. The cophenetic distance between observations i and j + is simply the distance between clusters s and t. + + d is cophenetic distance matrix in condensed form. The ij'th + entry is the cophenetic distance between original observations + i and j. + + c = cophenet(Z, Y) + + Calculates the cophenetic correlation coefficient c of a hierarchical + clustering Z of a set of n observations in m dimensions. Y is the + condensed distance matrix from which Z was generated. + + (c, d) = cophenet(Z, Y, []) + + Also returns the cophenetic distance matrix in condensed form. + + """ + nargs = len(args) + + if nargs < 1: + raise ValueError('At least one argument must be passed to cophenet.') + + Z = args[0] + is_valid_linkage(Z, throw=True, name='Z') + Zs = Z.shape + n = Zs[0] + 1 + + zz = numpy.zeros((n*(n-1)/2,), dtype='double') + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [Z] = _copy_arrays_if_base_present([Z]) + + _hierarchy_wrap.cophenetic_distances_wrap(Z, zz, int(n)) + if nargs == 1: + return zz + + Y = args[1] + Ys = Y.shape + is_valid_y(Y, throw=True, name='Y') + + z = zz.mean() + y = Y.mean() + Yy = Y - y + Zz = zz - z + #print Yy.shape, Zz.shape + numerator = (Yy * Zz) + denomA = Yy ** 2 + denomB = Zz ** 2 + c = numerator.sum() / numpy.sqrt((denomA.sum() * denomB.sum())) + #print c, numerator.sum() + if nargs == 2: + return c + + if nargs == 3: + return (c, zz) + +def inconsistent(Z, d=2): + """ + R = inconsistent(Z, d=2) + + Calculates statistics on links up to d levels below each + non-singleton cluster defined in the (n-1)x4 linkage matrix Z. + + R is a (n-1)x5 matrix where the i'th row contains the link + statistics for the non-singleton cluster i. The link statistics + are computed over the link heights for links d levels below the + cluster i. R[i,0] and R[i,1] are the mean and standard deviation of + the link heights, respectively; R[i,2] is the number of links + included in the calculation; and R[i,3] is the inconsistency + coefficient, (Z[i, 2]-R[i,0])/R[i,2]. + + This function behaves similarly to the MATLAB(TM) inconsistent + function. + """ + + Zs = Z.shape + is_valid_linkage(Z, throw=True, name='Z') + if (not d == numpy.floor(d)) or d < 0: + raise ValueError('The second argument d must be a nonnegative integer value.') +# if d == 0: +# d = 1 + + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [Z] = _copy_arrays_if_base_present([Z]) + + n = Zs[0] + 1 + R = numpy.zeros((n - 1, 4), dtype='double') + + _hierarchy_wrap.inconsistent_wrap(Z, R, int(n), int(d)); + return R + +def from_mlab_linkage(Z): + """ + Z2 = from_mlab_linkage(Z) + + Converts a linkage matrix Z generated by MATLAB(TM) to a new linkage + matrix Z2 compatible with this module. The conversion does two + things: + + * the indices are converted from 1..N to 0..(N-1) form, and + + * a fourth column Z[:,3] is added where Z[i,3] is equal to + the number of original observations (leaves) in the non-singleton + cluster i. + """ + is_valid_linkage(Z, throw=True, name='Z') + Zs = Z.shape + Zpart = Z[:,0:2] + Zd = Z[:,2].reshape(Zs[0], 1) + if Zpart.min() != 1.0 and Zpart.max() != 2 * Zs[0]: + raise ValueError('The format of the indices is not 1..N'); + CS = numpy.zeros((Zs[0], 1), dtype='double') + Zpart = Zpart - 1 + _hierarchy_wrap.calculate_cluster_sizes_wrap(numpy.hstack([Zpart, \ + Zd]).copy(), \ + CS, int(Zs[0]) + 1) + return numpy.hstack([Zpart, Zd, CS]).copy() + +def to_mlab_linkage(Z): + """ + Z2 = to_mlab_linkage(Z) + + Converts a linkage matrix Z generated by the linkage function of this + module to one compatible with MATLAB(TM). Z2 is the same as Z with the + last column removed and the cluster indices converted to use + 1..N indexing. + """ + is_valid_linkage(Z, throw=True, name='Z') + + return numpy.hstack([Z[:,0:2] + 1, Z[:,2]]) + +def is_monotonic(Z): + """ + is_monotonic(Z) + + Returns True if the linkage Z is monotonic. The linkage is monotonic + if for every cluster s and t joined, the distance between them is + no less than the distance between any previously joined clusters. + """ + is_valid_linkage(Z, throw=True, name='Z') + + # We expect the i'th value to be greater than its successor. + return (Z[:-1,2]>=Z[1:,2]).all() + +def is_valid_im(R, warning=False, throw=False, name=None): + """ + is_valid_im(R) + + Returns True if the inconsistency matrix passed is valid. It must + be a n by 4 numpy array of doubles. The standard deviations R[:,1] + must be nonnegative. The link counts R[:,2] must be positive and + no greater than n-1. + """ + valid = True + try: + if type(R) is not _array_type: + if name: + raise TypeError('Variable \'%s\' passed as inconsistency matrix is not a numpy array.' % name) + else: + raise TypeError('Variable passed as inconsistency matrix is not a numpy array.') + if R.dtype != 'double': + if name: + raise TypeError('Inconsistency matrix \'%s\' must contain doubles (float64).' % name) + else: + raise TypeError('Inconsistency matrix must contain doubles (float64).') + if len(R.shape) != 2: + if name: + raise ValueError('Inconsistency matrix \'%s\' must have shape=2 (i.e. be two-dimensional).' % name) + else: + raise ValueError('Inconsistency matrix must have shape=2 (i.e. be two-dimensional).') + if R.shape[1] != 4: + if name: + raise ValueError('Inconsistency matrix \'%s\' must have 4 columns.' % name) + else: + raise ValueError('Inconsistency matrix must have 4 columns.') + if R.shape[0] < 1: + if name: + raise ValueError('Inconsistency matrix \'%s\' must have at least one row.' % name) + else: + raise ValueError('Inconsistency matrix must have at least one row.') + except Exception, e: + if throw: + raise + if warning: + _warning(str(e)) + valid = False + return valid + +def is_valid_linkage(Z, warning=False, throw=False, name=None): + """ + is_valid_linkage(Z, t) + + Returns True if Z is a valid linkage matrix. The variable must + be a 2-dimensional double numpy array with n rows and 4 columns. + The first two columns must contain indices between 0 and 2n-1. For a + given row i, 0 <= Z[i,0] <= i+n-1 and 0 <= Z[i,1] <= i+n-1 (i.e. + a cluster cannot join another cluster unless the cluster being joined + has been generated.) + + is_valid_linkage(..., warning=True, name='V') + + Invokes a warning if the variable passed is not a valid linkage. The message + explains why the distance matrix is not valid. 'name' is used when referencing + the offending variable. + + is_valid_linkage(..., throw=True, name='V') + + Throws an exception if the variable passed is not a valid linkage. The message + explains why variable is not valid. 'name' is used when referencing the offending + variable. + + """ + valid = True + try: + if type(Z) is not _array_type: + if name: + raise TypeError('\'%s\' passed as a linkage is not a valid array.' % name) + else: + raise TypeError('Variable is not a valid array.') + if Z.dtype != 'double': + if name: + raise TypeError('Linkage matrix \'%s\' must contain doubles (float64).' % name) + else: + raise TypeError('Linkage matrix must contain doubles (float64).') + if len(Z.shape) != 2: + if name: + raise ValueError('Linkage matrix \'%s\' must have shape=2 (i.e. be two-dimensional).' % name) + else: + raise ValueError('Linkage matrix must have shape=2 (i.e. be two-dimensional).') + if Z.shape[1] != 4: + if name: + raise ValueError('Linkage matrix \'%s\' must have 4 columns.' % name) + else: + raise ValueError('Linkage matrix must have 4 columns.') + n = Z.shape[0] + if not ((Z[:,0]-xrange(n-1, n*2-1) < 0).any()) or \ + not (Z[:,1]-xrange(n-1, n*2-1) < 0).any(): + if name: + raise ValueError('Linkage \'%s\' contains negative indices.' % name) + else: + raise ValueError('Linkage contains negative indices.') + except Exception, e: + if throw: + raise + if warning: + _warning(str(e)) + valid = False + return valid + +def is_valid_y(y, warning=False, throw=False, name=None): + """ + is_valid_y(y) + + Returns True if the variable y passed is a valid condensed + distance matrix. Condensed distance matrices must be + 1-dimensional numpy arrays containing doubles. Their length + must be a binomial coefficient {n \choose 2} for some positive + integer n. + + is_valid_y(..., warning=True, name='V') + + Invokes a warning if the variable passed is not a valid condensed distance + matrix. The warning message explains why the distance matrix is not valid. + 'name' is used when referencing the offending variable. + + is_valid_y(..., throw=True, name='V') + + Throws an exception if the variable passed is not a valid condensed distance + matrix. The message explains why variable is not valid. 'name' is used when + referencing the offending variable. + + """ + valid = True + try: + if type(y) is not _array_type: + if name: + raise TypeError('\'%s\' passed as a condensed distance matrix is not a numpy array.' % name) + else: + raise TypeError('Variable is not a numpy array.') + if y.dtype != 'double': + if name: + raise TypeError('Condensed distance matrix \'%s\' must contain doubles (float64).' % name) + else: + raise TypeError('Condensed distance matrix must contain doubles (float64).') + if len(y.shape) != 1: + if name: + raise ValueError('Condensed distance matrix \'%s\' must have shape=1 (i.e. be one-dimensional).' % name) + else: + raise ValueError('Condensed distance matrix must have shape=1 (i.e. be one-dimensional).') + n = y.shape[0] + d = int(numpy.ceil(numpy.sqrt(n * 2))) + if (d*(d-1)/2) != n: + if name: + raise ValueError('Length n of condensed distance matrix \'%s\' must be a binomial coefficient, i.e. there must be a k such that (k \choose 2)=n)!' % name) + else: + raise ValueError('Length n of condensed distance matrix must be a binomial coefficient, i.e. there must be a k such that (k \choose 2)=n)!') + except Exception, e: + if throw: + raise + if warning: + _warning(str(e)) + valid = False + return valid + + +def is_valid_dm(D, t=0.0): + """ + is_valid_dm(D) + + Returns True if the variable D passed is a valid distance matrix. + Distance matrices must be 2-dimensional numpy arrays containing + doubles. They must have a zero-diagonal, and they must be symmetric. + + is_valid_dm(D, t) + + Returns True if the variable D passed is a valid distance matrix. + Small numerical differences in D and D.T and non-zeroness of the + diagonal are ignored if they are within the tolerance specified + by t. + + is_valid_dm(..., warning=True, name='V') + + Invokes a warning if the variable passed is not a valid distance matrix. + The warning message explains why the distance matrix is not valid. 'name' + is used when referencing the offending variable. + + is_valid_dm(..., throw=True, name='V') + + Throws an exception if the varible passed is not valid. The message + explains why the variable is not valid. 'name' is used when referencing + the offending variable. + + """ + + valid = True + try: + if type(D) is not _array_type: + if name: + raise TypeError('\'%s\' passed as a distance matrix is not a numpy array.' % name) + else: + raise TypeError('Variable is not a numpy array.') + if D.dtype != 'double': + if name: + raise TypeError('Distance matrix \'%s\' must contain doubles (float64).' % name) + else: + raise TypeError('Distance matrix must contain doubles (float64).') + if len(D.shape) != 2: + if name: + raise ValueError('Distance matrix \'%s\' must have shape=2 (i.e. be two-dimensional).' % name) + else: + raise ValueError('Distance matrix must have shape=2 (i.e. be two-dimensional).') + if t == 0.0: + if not (D == D.T).all(): + if name: + raise ValueError('Distance matrix \'%s\' must be symmetric.' % name) + else: + raise ValueError('Distance matrix must be symmetric.') + if not (D[xrange(0, s[0]), xrange(0, s[0])] == 0).all(): + if name: + raise ValueError('Distance matrix \'%s\' diagonal must be zero.' % name) + else: + raise ValueError('Distance matrix diagonal must be zero.') + else: + if not (D - D.T <= t).all(): + if name: + raise ValueError('Distance matrix \'%s\' must be symmetric within tolerance %d.' % (name, t)) + else: + raise ValueError('Distance matrix must be symmetric within tolerance %d.' % t) + if not (D[xrange(0, s[0]), xrange(0, s[0])] <= t).all(): + if name: + raise ValueError('Distance matrix \'%s\' diagonal must be close to zero within tolerance %d.' % (name, t)) + else: + raise ValueError('Distance matrix \'%s\' diagonal must be close to zero within tolerance %d.' % t) + except Exception, e: + if throw: + raise + if warning: + _warning(str(e)) + valid = False + return valid + +def numobs_linkage(Z): + """ + Returns the number of original observations that correspond to a + linkage matrix Z. + """ + is_valid_linkage(Z, throw=True, name='Z') + return (Z.shape[0] - 1) + +def numobs_dm(D): + """ + numobs_dm(D) + + Returns the number of original observations that correspond to a + square, non-condensed distance matrix D. + """ + is_valid_dm(D, tol=Inf, throw=True, name='D') + return D.shape[0] + +def numobs_y(Y): + """ + numobs_y(Y) + + Returns the number of original observations that correspond to a + condensed distance matrix Y. + """ + is_valid_y(y, throw=True, name='Y') + d = int(numpy.ceil(numpy.sqrt(y.shape[0] * 2))) + return d + +def Z_y_correspond(Z, Y): + """ + yesno = Z_y_correspond(Z, Y) + + Returns True if a linkage matrix Z and condensed distance matrix + Y could possibly correspond to one another. They must have the same + number of original observations. This function is useful as a sanity + check in algorithms that make extensive use of linkage and distance + matrices that must correspond to the same set of original observations. + """ + return numobs_y(Y) == numobs_Z(Z) + +def fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None): + """ + + T = fcluster(Z, t, criterion, depth=2, R=None, monocrit=None): + + Forms flat clusters from the hierarchical clustering defined by + the linkage matrix Z. The threshold t is a required parameter. + + T is a vector of length n; T[i] is the flat cluster number to which + original observation i belongs. + + The criterion parameter can be any of the following values, + + * 'inconsistent': If a cluster node and all its decendents have an + inconsistent value less than or equal to c then all its leaf + descendents belong to the same flat cluster. When no non-singleton + cluster meets this criterion, every node is assigned to its + own cluster. The depth parameter is the maximum depth to perform + the inconsistency calculation; it has no meaning for the other + criteria. + + * 'distance': Forms flat clusters so that the original + observations in each flat cluster have no greater a cophenetic + distance than t. + + * 'maxclust': Finds a minimum threshold r so that the cophenetic + distance between any two original observations in the same flat + cluster is no more than r and no more than t flat clusters are + formed. + + * 'monocrit': Forms a flat cluster from a cluster node c with + index i when monocrit[j] <= t. monocrit must be monotonic. + + monocrit is a (n-1) numpy vector of doubles; monocrit[i] is + the criterion upon which non-singleton i is thresholded. The + monocrit vector must be monotonic, i.e. given a node c with + index i, for all node indices j corresponding to nodes below c, + monocrit[i] >= monocrit[j]. + + For example, to threshold on the maximum mean distance as computed + in the inconsistency matrix R with a threshold of 0.8 do + + MR = maxRstat(Z, R, 3) + cluster(Z, t=0.8, criterion='monocrit', monocrit=MR) + + * 'maxclust_monocrit': Forms a flat cluster from a non-singleton + cluster node c when monocrit[i] <= r for all cluster indices i below + and including c. r is minimized such that no more than t flat clusters + are formed. monocrit must be monotonic. + + For example, to minimize the threshold t on maximum inconsistency + values so that no more than 3 flat clusters are formed, do: + + MI = maxinconsts(Z, R) + cluster(Z, t=3, criterion='maxclust_monocrit', monocrit=MI) + + """ + is_valid_linkage(Z, throw=True, name='Z') + + n = Z.shape[0] + 1 + T = numpy.zeros((n,), dtype='int32') + + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [Z] = _copy_arrays_if_base_present([Z]) + + if criterion == 'inconsistent': + if R is None: + R = inconsistent(Z, depth) + else: + is_valid_im(R, throw=True, name='R') + # Since the C code does not support striding using strides. + # The dimensions are used instead. + [R] = _copy_arrays_if_base_present([R]) + _hierarchy_wrap.cluster_in_wrap(Z, R, T, float(t), int(n)) + elif criterion == 'distance': + _hierarchy_wrap.cluster_dist_wrap(Z, T, float(t), int(n)) + elif criterion == 'maxclust': + _hierarchy_wrap.cluster_maxclust_dist_wrap(Z, T, int(n), int(t)) + elif criterion == 'monocrit': + [monocrit] = _copy_arrays_if_base_present([monocrit]) + _hierarchy_wrap.cluster_monocrit_wrap(Z, monocrit, T, float(t), int(n)) + elif criterion == 'maxclust_monocrit': + [monocrit] = _copy_arrays_if_base_present([monocrit]) + _hierarchy_wrap.cluster_maxclust_monocrit_wrap(Z, monocrit, T, + int(n), int(t)) + else: + raise ValueError('Invalid cluster formation criterion: %s' % str(criterion)) + return T + +def fclusterdata(X, t, criterion='inconsistent', \ + distance='euclid', depth=2, method='single', R=None): + """ + T = fclusterdata(X, t) + + Clusters the original observations in the n by m data matrix X + (n observations in m dimensions), using the euclidean distance + metric to calculate distances between original observations, + performs hierarchical clustering using the single linkage + algorithm, and forms flat clusters using the inconsistency + method with t as the cut-off threshold. + + A one-dimensional numpy array T of length n is returned. T[i] + is the index of the flat cluster to which the original + observation i belongs. + + T = fclusterdata(X, t, criterion='inconsistent', method='single', + distance='euclid', depth=2, R=None) + + Clusters the original observations in the n by m data matrix X using + the thresholding criterion, linkage method, and distance metric + specified. + + Named parameters are described below. + + criterion: specifies the criterion for forming flat clusters. + Valid values are 'inconsistent', 'distance', or + 'maxclust' cluster formation algorithms. See + cluster for descriptions. + + method: the linkage method to use. See linkage for + descriptions. + + distance: the distance metric for calculating pairwise + distances. See pdist for descriptions and + linkage to verify compatibility with the linkage + method. + + t: the cut-off threshold for the cluster function or + the maximum number of clusters (criterion='maxclust'). + + depth: the maximum depth for the inconsistency calculation. + See inconsistent for more information. + + R: the inconsistency matrix. It will be computed if + necessary if it is not passed. + + This function is similar to MATLAB(TM) clusterdata function. + """ + + if type(X) is not _array_type or len(X.shape) != 2: + raise TypeError('X must be an n by m numpy array.') + + Y = pdist(X, metric=distance) + Z = linkage(Y, method=method) + if R is None: + R = inconsistent(Z, d=depth) + T = fcluster(Z, criterion=criterion, depth=depth, R=R, t=t) + return T + +def lvlist(Z): + """ + L = lvlist(Z): + + Returns a list of leaf node ids as they appear in the tree from + left to right. Z is a linkage matrix. + """ + is_valid_linkage(Z, throw=True, name='Z') + n = Z.shape[0] + 1 + ML = numpy.zeros((n,), dtype='int32') + [Z] = _copy_arrays_if_base_present([Z]) + _hierarchy_wrap.prelist_wrap(Z, ML, int(n)) + return ML + +# Let's do a conditional import. If matplotlib is not available, +try: + + import matplotlib + import matplotlib.pylab + import matplotlib.patches + #import matplotlib.collections + _mpl = True + + # Maps number of leaves to text size. + # + # p <= 20, size="12" + # 20 < p <= 30, size="10" + # 30 < p <= 50, size="8" + # 50 < p <= scipy.inf, size="6" + + _dtextsizes = {20: 12, 30: 10, 50: 8, 85: 6, scipy.inf: 5} + _drotation = {20: 0, 40: 45, scipy.inf: 90} + _dtextsortedkeys = list(_dtextsizes.keys()) + _dtextsortedkeys.sort() + _drotationsortedkeys = list(_drotation.keys()) + _drotationsortedkeys.sort() + + def _remove_dups(L): + """ + Removes duplicates AND preserves the original order of the elements. The + set class is not guaranteed to do this. + """ + seen_before = set([]) + L2 = [] + for i in L: + if i not in seen_before: + seen_before.add(i) + L2.append(i) + return L2 + + def _get_tick_text_size(p): + for k in _dtextsortedkeys: + if p <= k: + return _dtextsizes[k] + + def _get_tick_rotation(p): + for k in _drotationsortedkeys: + if p <= k: + return _drotation[k] + + + def _plot_dendrogram(icoords, dcoords, ivl, p, n, mh, orientation, no_labels, color_list, leaf_font_size=None, leaf_rotation=None, contraction_marks=None): + axis = matplotlib.pylab.gca() + # Independent variable plot width + ivw = len(ivl) * 10 + # Depenendent variable plot height + dvw = mh + mh * 0.05 + ivticks = scipy.arange(5, len(ivl)*10+5, 10) + if orientation == 'top': + axis.set_ylim([0, dvw]) + axis.set_xlim([0, ivw]) + xlines = icoords + ylines = dcoords + if no_labels: + axis.set_xticks([]) + axis.set_xticklabels([]) + else: + axis.set_xticks(ivticks) + axis.set_xticklabels(ivl) + axis.xaxis.set_ticks_position('bottom') + lbls=axis.get_xticklabels() + if leaf_rotation: + matplotlib.pylab.setp(lbls, 'rotation', leaf_rotation) + else: + matplotlib.pylab.setp(lbls, 'rotation', float(_get_tick_rotation(len(ivl)))) + if leaf_font_size: + matplotlib.pylab.setp(lbls, 'size', leaf_font_size) + else: + matplotlib.pylab.setp(lbls, 'size', float(_get_tick_text_size(len(ivl)))) +# txt.set_fontsize() +# txt.set_rotation(45) + # Make the tick marks invisible because they cover up the links + for line in axis.get_xticklines(): + line.set_visible(False) + elif orientation == 'bottom': + axis.set_ylim([dvw, 0]) + axis.set_xlim([0, ivw]) + xlines = icoords + ylines = dcoords + if no_labels: + axis.set_xticks([]) + axis.set_xticklabels([]) + else: + axis.set_xticks(ivticks) + axis.set_xticklabels(ivl) + lbls=axis.get_xticklabels() + if leaf_rotation: + matplotlib.pylab.setp(lbls, 'rotation', leaf_rotation) + else: + matplotlib.pylab.setp(lbls, 'rotation', float(_get_tick_rotation(p))) + if leaf_font_size: + matplotlib.pylab.setp(lbls, 'size', leaf_font_size) + else: + matplotlib.pylab.setp(lbls, 'size', float(_get_tick_text_size(p))) + axis.xaxis.set_ticks_position('top') + # Make the tick marks invisible because they cover up the links + for line in axis.get_xticklines(): + line.set_visible(False) + elif orientation == 'left': + axis.set_xlim([0, dvw]) + axis.set_ylim([0, ivw]) + xlines = dcoords + ylines = icoords + if no_labels: + axis.set_yticks([]) + axis.set_yticklabels([]) + else: + axis.set_yticks(ivticks) + axis.set_yticklabels(ivl) + + lbls=axis.get_yticklabels() + if leaf_rotation: + matplotlib.pylab.setp(lbls, 'rotation', leaf_rotation) + if leaf_font_size: + matplotlib.pylab.setp(lbls, 'size', leaf_font_size) + axis.yaxis.set_ticks_position('left') + # Make the tick marks invisible because they cover up the + # links + for line in axis.get_yticklines(): + line.set_visible(False) + elif orientation == 'right': + axis.set_xlim([dvw, 0]) + axis.set_ylim([0, ivw]) + xlines = dcoords + ylines = icoords + if no_labels: + axis.set_yticks([]) + axis.set_yticklabels([]) + else: + axis.set_yticks(ivticks) + axis.set_yticklabels(ivl) + lbls=axis.get_yticklabels() + if leaf_rotation: + matplotlib.pylab.setp(lbls, 'rotation', leaf_rotation) + if leaf_font_size: + matplotlib.pylab.setp(lbls, 'size', leaf_font_size) + axis.yaxis.set_ticks_position('right') + # Make the tick marks invisible because they cover up the links + for line in axis.get_yticklines(): + line.set_visible(False) + + # Let's use collections instead. This way there is a separate legend item for each + # tree grouping, rather than stupidly one for each line segment. + colors_used = _remove_dups(color_list) + color_to_lines = {} + for color in colors_used: + color_to_lines[color] = [] + for (xline,yline,color) in zip(xlines, ylines, color_list): + color_to_lines[color].append(zip(xline, yline)) + + colors_to_collections = {} + # Construct the collections. + for color in colors_used: + coll = matplotlib.collections.LineCollection(color_to_lines[color], colors=(color,)) + colors_to_collections[color] = coll + + # Add all the non-blue link groupings, i.e. those groupings below the color threshold. + + for color in colors_used: + if color != 'b': + axis.add_collection(colors_to_collections[color]) + # If there is a blue grouping (i.e., links above the color threshold), + # it should go last. + if colors_to_collections.has_key('b'): + axis.add_collection(colors_to_collections['b']) + + if contraction_marks is not None: + #xs=[x for (x, y) in contraction_marks] + #ys=[y for (x, y) in contraction_marks] + if orientation in ('left', 'right'): + for (x,y) in contraction_marks: + e=matplotlib.patches.Ellipse((y, x), width=dvw/100, height=1.0) + axis.add_artist(e) + e.set_clip_box(axis.bbox) + e.set_alpha(0.5) + e.set_facecolor('k') + if orientation in ('top', 'bottom'): + for (x,y) in contraction_marks: + e=matplotlib.patches.Ellipse((x, y), width=1.0, height=dvw/100) + axis.add_artist(e) + e.set_clip_box(axis.bbox) + e.set_alpha(0.5) + e.set_facecolor('k') + + #matplotlib.pylab.plot(xs, ys, 'go', markeredgecolor='k', markersize=3) + + #matplotlib.pylab.plot(ys, xs, 'go', markeredgecolor='k', markersize=3) + matplotlib.pylab.draw_if_interactive() +except ImportError: + _mpl = False + def _plot_dendrogram(*args, **kwargs): + raise ImportError('matplotlib not available. Plot request denied.') + +_link_line_colors=['g', 'r', 'c', 'm', 'y', 'k'] + + +def set_link_color_palette(palette): + """ + set_link_color_palette(palette): + + Changes the list of matplotlib color codes to use when coloring + links with the dendrogram colorthreshold feature. + """ + + if type(palette) not in (types.ListType, types.TupleType): + raise TypeError("palette must be a list or tuple") + _ptypes = [type(p) == types.StringType for p in palette] + + if False in _ptypes: + raise TypeError("all palette list elements must be color strings") + + for i in list(_link_line_colors): + _link_line_colors.remove(i) + _link_line_colors.extend(list(palette)) + +def dendrogram(Z, p=30, truncate_mode=None, colorthreshold=None, + get_leaves=True, orientation='top', labels=None, + count_sort=False, distance_sort=False, show_leaf_counts=True, + no_plot=False, no_labels=False, color_list=None, + leaf_font_size=None, leaf_rotation=None, leaf_label_func=None, + no_leaves=False, show_contracted=False, + link_color_func=None): + """ + R = dendrogram(Z) + + Plots the hiearchical clustering defined by the linkage Z as a + dendrogram. The dendrogram illustrates how each cluster is + composed by drawing a U-shaped link between a non-singleton + cluster and its children. The height of the top of the U-link + is the distance between its children clusters. It is also the + cophenetic distance between original observations in the + two children clusters. It is expected that the distances in + Z[:,2] be monotonic, otherwise crossings appear in the + dendrogram. + + R is a dictionary of the data structures computed to render the + dendrogram. Its keys are: + + 'icoords': a list of lists [I1, I2, ..., Ip] where Ik is a + list of 4 independent variable coordinates corresponding to + the line that represents the k'th link painted. + + 'dcoords': a list of lists [I2, I2, ..., Ip] where Ik is a + list of 4 independent variable coordinates corresponding to + the line that represents the k'th link painted. + + 'ivl': a list of labels corresponding to the leaf nodes + + R = dendrogram(..., truncate_mode, p) + + The dendrogram can be hard to read when the original observation + matrix from which the linkage is derived is large. Truncation + is used to condense the dendrogram. There are several modes: + + * None/'none': no truncation is performed + + * 'lastp': the last p non-singleton formed in the linkage are + the only non-leaf nodes in the linkage; they correspond to + to rows Z[n-p-2:end] in Z. All other non-singleton clusters + are contracted into leaf nodes. + + * 'mlab': This corresponds to MATLAB(TM) behavior. (not implemented yet) + + * 'level'/'mtica': no more than p levels of the dendrogram tree + are displayed. This corresponds to Mathematica(TM) behavior. + + R = dendrogram(..., colorthreshold=t) + + Colors all the descendent links below a cluster node k the same color + if k is the first node below the cut threshold t. All links connecting + nodes with distances greater than or equal to the threshold are + colored blue. If t is less than or equal to zero, all nodes + are colored blue. If t is None or 'default', corresponding with + MATLAB(TM) behavior, the threshold is set to 0.7*max(Z[:,2]). + + R = dendrogram(..., get_leaves=True) + + Includes a list R['leaves']=H in the result dictionary. For each i, + H[i] == j, cluster node j appears in the i'th position in the + left-to-right traversal of the leaves, where j < 2n-1 and i < n. + + R = dendrogram(..., orientation) + + Plots the dendrogram in a particular direction. The orientation + parameter can be any of: + + * 'top': plots the root at the top, and plot descendent + links going downwards. (default). + + * 'bottom': plots the root at the bottom, and plot descendent + links going upwards. + + * 'left': plots the root at the left, and plot descendent + links going right. + + * 'right': plots the root at the right, and plot descendent + links going left. + + R = dendrogram(..., labels=None) + + The labels parameter is a n-sized list (or tuple). The labels[i] + value is the text to put under the i'th leaf node only if it + corresponds to an original observation and not a non-singleton + cluster. + + When labels=None, the index of the original observation is used + used. + + R = dendrogram(..., count_sort) + + When plotting a cluster node and its directly descendent links, + the order the two descendent links and their descendents are + plotted is determined by the count_sort parameter. Valid values + of count_sort are: + + * False: nothing is done. + + * 'ascending'/True: the child with the minimum number of + original objects in its cluster is plotted first. + + * 'descendent': the child with the maximum number of + original objects in its cluster is plotted first. + + R = dendrogram(..., distance_sort) + + When plotting a cluster node and its directly descendent links, + the order the two descendent links and their descendents are + plotted is determined by the distance_sort parameter. Valid + values of count_sort are: + + * False: nothing is done. + + * 'ascending'/True: the child with the minimum distance + between its direct descendents is plotted first. + + * 'descending': the child with the maximum distance + between its direct descendents is plotted first. + + Note that either count_sort or distance_sort must be False. + + R = dendrogram(..., show_leaf_counts) + + When show_leaf_counts=True, leaf nodes representing k>1 + original observation are labeled with the number of observations + they contain in parentheses. + + R = dendrogram(..., no_plot) + + When no_plot=True, the final rendering is not performed. This is + useful if only the data structures computed for the rendering + are needed or if matplotlib is not available. + + R = dendrogram(..., no_labels) + + When no_labels=True, no labels appear next to the leaf nodes in + the rendering of the dendrogram. + + R = dendrogram(..., leaf_label_rotation): + + Specifies the angle to which the leaf labels are rotated. When + unspecified, the rotation based on the number of nodes in the + dendrogram. + + R = dendrogram(..., leaf_font_size): + + Specifies the font size in points of the leaf labels. When + unspecified, the size based on the number of nodes + in the dendrogram. + + + R = dendrogram(..., leaf_label_func) + + When a callable function is passed, leaf_label_func is passed + cluster index k, and returns a string with the label for the + leaf. + + Indices k < n correspond to original observations while indices + k >= n correspond to non-singleton clusters. + + For example, to label singletons with their node id and + non-singletons with their id, count, and inconsistency coefficient, + we simply do + + # First define the leaf label function. + llf = lambda id: + if id < n: + return str(id) + else: + return '[%d %d %1.2f]' % (id, count, R[n-id,3]) + + # The text for the leaf nodes is going to be big so force + # a rotation of 90 degrees. + dendrogram(Z, leaf_label_func=llf, leaf_rotation=90) + + R = dendrogram(..., show_contracted=True) + + The heights of non-singleton nodes contracted into a leaf node + are plotted as crosses along the link connecting that leaf node. + This feature is only useful when truncation is used. + + R = dendrogram(..., link_color_func) + + When a link is painted, the function link_color_function is + called with the non-singleton id. This function is + expected to return a matplotlib color string, which represents + the color to paint the link. + + For example: + + dendrogram(Z, link_color_func=lambda k: colors[k]) + + colors the direct links below each untruncated non-singleton node + k using colors[k]. + + """ + + # Features under consideration. + # + # ... = dendrogram(..., leaves_order=None) + # + # Plots the leaves in the order specified by a vector of + # original observation indices. If the vector contains duplicates + # or results in a crossing, an exception will be thrown. Passing + # None orders leaf nodes based on the order they appear in the + # pre-order traversal. + + is_valid_linkage(Z, throw=True, name='Z') + Zs = Z.shape + n = Zs[0] + 1 + if type(p) in (types.IntType, types.FloatType): + p = int(p) + else: + raise TypeError('The second argument must be a number') + + if truncate_mode not in ('lastp', 'mlab', 'mtica', 'level', 'none', None): + raise ValueError('Invalid truncation mode.') + + if truncate_mode == 'lastp' or truncate_mode == 'mlab': + if p > n or p == 0: + p = n + + if truncate_mode == 'mtica' or truncate_mode == 'level': + if p <= 0: + p = scipy.inf + if get_leaves: + lvs = [] + else: + lvs = None + icoord_list=[] + dcoord_list=[] + color_list=[] + current_color=[0] + currently_below_threshold=[False] + if no_leaves: + ivl=None + else: + ivl=[] + if colorthreshold is None or \ + (type(colorthreshold) == types.StringType and colorthreshold=='default'): + colorthreshold = max(Z[:,2])*0.7 + R={'icoord':icoord_list, 'dcoord':dcoord_list, 'ivl':ivl, 'leaves':lvs, + 'color_list':color_list} + props = {'cbt': False, 'cc':0} + if show_contracted: + contraction_marks = [] + else: + contraction_marks = None + _dendrogram_calculate_info(Z=Z, p=p, + truncate_mode=truncate_mode, \ + colorthreshold=colorthreshold, \ + get_leaves=get_leaves, \ + orientation=orientation, \ + labels=labels, \ + count_sort=count_sort, \ + distance_sort=distance_sort, \ + show_leaf_counts=show_leaf_counts, \ + i=2*n-2, iv=0.0, ivl=ivl, n=n, \ + icoord_list=icoord_list, \ + dcoord_list=dcoord_list, lvs=lvs, \ + current_color=current_color, \ + color_list=color_list, \ + currently_below_threshold=currently_below_threshold, \ + leaf_label_func=leaf_label_func, \ + contraction_marks=contraction_marks, \ + link_color_func=link_color_func) + if not no_plot: + mh = max(Z[:,2]) + _plot_dendrogram(icoord_list, dcoord_list, ivl, p, n, mh, orientation, no_labels, color_list, leaf_font_size=leaf_font_size, leaf_rotation=leaf_rotation, contraction_marks=contraction_marks) + + return R + +def _append_singleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels): + # If the leaf id structure is not None and is a list then the caller + # to dendrogram has indicated that cluster id's corresponding to the + # leaf nodes should be recorded. + + if lvs is not None: + lvs.append(int(i)) + + # If leaf node labels are to be displayed... + if ivl is not None: + # If a leaf_label_func has been provided, the label comes from the + # string returned from the leaf_label_func, which is a function + # passed to dendrogram. + if leaf_label_func: + ivl.append(leaf_label_func(int(i))) + else: + # Otherwise, if the dendrogram caller has passed a labels list + # for the leaf nodes, use it. + if labels is not None: + ivl.append(labels[int(i-n)]) + else: + # Otherwise, use the id as the label for the leaf.x + ivl.append(str(int(i))) + +def _append_nonsingleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels, show_leaf_counts): + # If the leaf id structure is not None and is a list then the caller + # to dendrogram has indicated that cluster id's corresponding to the + # leaf nodes should be recorded. + + if lvs is not None: + lvs.append(int(i)) + if ivl is not None: + if leaf_label_func: + ivl.append(leaf_label_func(int(i))) + else: + if show_leaf_counts: + ivl.append("(" + str(int(Z[i-n, 3])) + ")") + else: + ivl.append("") + +def _append_contraction_marks(Z, iv, i, n, contraction_marks): + _append_contraction_marks_sub(Z, iv, Z[i-n, 0], n, contraction_marks) + _append_contraction_marks_sub(Z, iv, Z[i-n, 1], n, contraction_marks) + +def _append_contraction_marks_sub(Z, iv, i, n, contraction_marks): + if (i >= n): + contraction_marks.append((iv, Z[i-n, 2])) + _append_contraction_marks_sub(Z, iv, Z[i-n, 0], n, contraction_marks) + _append_contraction_marks_sub(Z, iv, Z[i-n, 1], n, contraction_marks) + + +def _dendrogram_calculate_info(Z, p, truncate_mode, \ + colorthreshold=scipy.inf, get_leaves=True, \ + orientation='top', labels=None, \ + count_sort=False, distance_sort=False, \ + show_leaf_counts=False, i=-1, iv=0.0, \ + ivl=[], n=0, icoord_list=[], dcoord_list=[], \ + lvs=None, mhr=False, \ + current_color=[], color_list=[], \ + currently_below_threshold=[], \ + leaf_label_func=None, level=0, + contraction_marks=None, + link_color_func=None): + """ + Calculates the endpoints of the links as well as the labels for the + the dendrogram rooted at the node with index i. iv is the independent + variable value to plot the left-most leaf node below the root node i + (if orientation='top', this would be the left-most x value where the + plotting of this root node i and its descendents should begin). + + ivl is a list to store the labels of the leaf nodes. The leaf_label_func + is called whenever ivl != None, labels == None, and + leaf_label_func != None. When ivl != None and labels != None, the + labels list is used only for labeling the the leaf nodes. When + ivl == None, no labels are generated for leaf nodes. + + When get_leaves==True, a list of leaves is built as they are visited + in the dendrogram. + + Returns a tuple with l being the independent variable coordinate that + corresponds to the midpoint of cluster to the left of cluster i if + i is non-singleton, otherwise the independent coordinate of the leaf + node if i is a leaf node. + + Returns a tuple (left, w, h, md) + + * left is the independent variable coordinate of the center of the + the U of the subtree + + * w is the amount of space used for the subtree (in independent + variable units) + + * h is the height of the subtree in dependent variable units + + * md is the max(Z[*,2]) for all nodes * below and including + the target node. + + """ + if n == 0: + raise ValueError("Invalid singleton cluster count n.") + + if i == -1: + raise ValueError("Invalid root cluster index i.") + + if truncate_mode == 'lastp': + # If the node is a leaf node but corresponds to a non-single cluster, + # it's label is either the empty string or the number of original + # observations belonging to cluster i. + if i < 2*n-p and i >= n: + d = Z[i-n, 2] + _append_nonsingleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, + i, labels, show_leaf_counts) + if contraction_marks is not None: + _append_contraction_marks(Z, iv + 5.0, i, n, contraction_marks) + return (iv + 5.0, 10.0, 0.0, d) + elif i < n: + _append_singleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels) + return (iv + 5.0, 10.0, 0.0, 0.0) + elif truncate_mode in ('mtica', 'level'): + if i > n and level > p: + d = Z[i-n, 2] + _append_nonsingleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, + i, labels, show_leaf_counts) + if contraction_marks is not None: + _append_contraction_marks(Z, iv + 5.0, i, n, contraction_marks) + return (iv + 5.0, 10.0, 0.0, d) + elif i < n: + _append_singleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels) + return (iv + 5.0, 10.0, 0.0, 0.0) + elif truncate_mode in ('mlab',): + pass + + + # Otherwise, only truncate if we have a leaf node. + # + # If the truncate_mode is mlab, the linkage has been modified + # with the truncated tree. + # + # Only place leaves if they correspond to original observations. + if i < n: + _append_singleton_leaf_node(Z, p, n, level, lvs, ivl, leaf_label_func, i, labels) + return (iv + 5.0, 10.0, 0.0, 0.0) + + # !!! Otherwise, we don't have a leaf node, so work on plotting a + # non-leaf node. + # Actual indices of a and b + aa = Z[i-n, 0] + ab = Z[i-n, 1] + if aa > n: + # The number of singletons below cluster a + na = Z[aa-n, 3] + # The distance between a's two direct children. + da = Z[aa-n, 2] + else: + na = 1 + da = 0.0 + if ab > n: + nb = Z[ab-n, 3] + db = Z[ab-n, 2] + else: + nb = 1 + db = 0.0 + + if count_sort == 'ascending' or count_sort == True: + # If a has a count greater than b, it and its descendents should + # be drawn to the right. Otherwise, to the left. + if na > nb: + # The cluster index to draw to the left (ua) will be ab + # and the one to draw to the right (ub) will be aa + ua = ab + ub = aa + else: + ua = aa + ub = ab + elif count_sort == 'descending': + # If a has a count less than or equal to b, it and its + # descendents should be drawn to the left. Otherwise, to + # the right. + if na > nb: + ua = aa + ub = ab + else: + ua = ab + ub = aa + elif distance_sort == 'ascending' or distance_sort == True: + # If a has a distance greater than b, it and its descendents should + # be drawn to the right. Otherwise, to the left. + if da > db: + ua = ab + ub = aa + else: + ua = aa + ub = ab + elif distance_sort == 'descending': + # If a has a distance less than or equal to b, it and its + # descendents should be drawn to the left. Otherwise, to + # the right. + if da > db: + ua = aa + ub = ab + else: + ua = ab + ub = aa + else: + ua = aa + ub = ab + + # The distance of the cluster to draw to the left (ua) is uad + # and its count is uan. Likewise, the cluster to draw to the + # right has distance ubd and count ubn. + if ua < n: + uad = 0.0 + uan = 1 + else: + uad = Z[ua-n, 2] + uan = Z[ua-n, 3] + if ub < n: + ubd = 0.0 + ubn = 1 + else: + ubd = Z[ub-n, 2] + ubn = Z[ub-n, 3] + + # Updated iv variable and the amount of space used. + (uiva, uwa, uah, uamd) = \ + _dendrogram_calculate_info(Z=Z, p=p, \ + truncate_mode=truncate_mode, \ + colorthreshold=colorthreshold, \ + get_leaves=get_leaves, \ + orientation=orientation, \ + labels=labels, \ + count_sort=count_sort, \ + distance_sort=distance_sort, \ + show_leaf_counts=show_leaf_counts, \ + i=ua, iv=iv, ivl=ivl, n=n, \ + icoord_list=icoord_list, \ + dcoord_list=dcoord_list, lvs=lvs, \ + current_color=current_color, \ + color_list=color_list, \ + currently_below_threshold=currently_below_threshold, \ + leaf_label_func=leaf_label_func, \ + level=level+1, contraction_marks=contraction_marks, \ + link_color_func=link_color_func) + + h = Z[i-n, 2] + if h >= colorthreshold or colorthreshold <= 0: + c = 'b' + + if currently_below_threshold[0]: + current_color[0] = (current_color[0] + 1) % len(_link_line_colors) + currently_below_threshold[0] = False + else: + currently_below_threshold[0] = True + c = _link_line_colors[current_color[0]] + + (uivb, uwb, ubh, ubmd) = \ + _dendrogram_calculate_info(Z=Z, p=p, \ + truncate_mode=truncate_mode, \ + colorthreshold=colorthreshold, \ + get_leaves=get_leaves, \ + orientation=orientation, \ + labels=labels, \ + count_sort=count_sort, \ + distance_sort=distance_sort, \ + show_leaf_counts=show_leaf_counts, \ + i=ub, iv=iv+uwa, ivl=ivl, n=n, \ + icoord_list=icoord_list, \ + dcoord_list=dcoord_list, lvs=lvs, \ + current_color=current_color, \ + color_list=color_list, \ + currently_below_threshold=currently_below_threshold, + leaf_label_func=leaf_label_func, \ + level=level+1, contraction_marks=contraction_marks, \ + link_color_func=link_color_func) + + # The height of clusters a and b + ah = uad + bh = ubd + + max_dist = max(uamd, ubmd, h) + + icoord_list.append([uiva, uiva, uivb, uivb]) + dcoord_list.append([uah, h, h, ubh]) + if link_color_func is not None: + v = link_color_func(int(i)) + if type(v) != types.StringType: + raise TypeError("link_color_func must return a matplotlib color string!") + color_list.append(v) + else: + color_list.append(c) + return ( ((uiva + uivb) / 2), uwa+uwb, h, max_dist) + +def is_isomorphic(T1, T2): + """ + Returns True iff two different cluster assignments T1 and T2 are + equivalent. T1 and T2 must be arrays of the same size. + """ + if type(T1) is not _array_type: + raise TypeError('T1 must be a numpy array.') + if type(T2) is not _array_type: + raise TypeError('T2 must be a numpy array.') + + T1S = T1.shape + T2S = T2.shape + + if len(T1S) != 1: + raise ValueError('T1 must be one-dimensional.') + if len(T2S) != 1: + raise ValueError('T2 must be one-dimensional.') + if T1S[0] != T2S[0]: + raise ValueError('T1 and T2 must have the same number of elements.') + n = T1S[0] + d = {} + for i in xrange(0,n): + if T1[i] in d.keys(): + if d[T1[i]] != T2[i]: + return False + else: + d[T1[i]] = T2[i] + return True + +def maxdists(Z): + """ + MD = maxdists(Z) + + MD is a (n-1)-sized numpy array of doubles; MD[i] represents the + maximum distance between any cluster (including singletons) below + and including the node with index i. More specifically, + MD[i] = Z[Q(i)-n, 2].max() where Q(i) is the set of all node indices + below and including node i. + + Note that when Z[:,2] is monotonic, Z[:,2] and MD should not differ. + See linkage for more information on this issue. + """ + is_valid_linkage(Z, throw=True, name='Z') + + n = Z.shape[0] + 1 + MD = numpy.zeros((n-1,)) + [Z] = _copy_arrays_if_base_present([Z]) + _hierarchy_wrap.get_max_dist_for_each_hierarchy_wrap(Z, MD, int(n)) + return MD + +def maxinconsts(Z, R): + """ + MI = maxinconsts(Z, R) + + Calculates the maximum inconsistency coefficient for each node + and its descendents. Z is a valid linkage matrix and R is a valid + inconsistency matrix. MI is a monotonic (n-1)-sized numpy array of + doubles. + """ + is_valid_linkage(Z, throw=True, name='Z') + is_valid_im(R, throw=True, name='R') + + n = Z.shape[0] + 1 + MI = numpy.zeros((n-1,)) + [Z, R] = _copy_arrays_if_base_present([Z, R]) + _hierarchy_wrap.get_max_Rfield_for_each_hierarchy_wrap(Z, R, MI, int(n), 3) + return MI + +def maxRstat(Z, R, i): + """ + MR = maxRstat(Z, R, i) + + Calculates the maximum statistic for the i'th column of the + inconsistency matrix R for each non-singleton cluster node. MR[j] + is the maximum over R[Q(j)-n, i] where Q(j) the set of all node ids + corresponding to nodes below and including j. + """ + is_valid_linkage(Z, throw=True, name='Z') + is_valid_im(R, throw=True, name='R') + if type(i) is not types.IntType: + raise TypeError('The third argument must be an integer.') + if i < 0 or i > 3: + return ValueError('i must be an integer between 0 and 3 inclusive.') + + n = Z.shape[0] + 1 + MR = numpy.zeros((n-1,)) + [Z, R] = _copy_arrays_if_base_present([Z, R]) + _hierarchy_wrap.get_max_Rfield_for_each_hierarchy_wrap(Z, R, MR, int(n), i) + return MR + +def leaders(Z, T): + """ + (L, M) = leaders(Z, T): + + For each flat cluster j of the k flat clusters represented in the + n-sized flat cluster assignment vector T, this function finds the + lowest cluster node i in the linkage tree Z such that: + + * leaf descendents belong only to flat cluster j (i.e. T[p]==j + for all p in S(i) where S(i) is the set of leaf ids of leaf + nodes descendent with cluster node i) + + * there does not exist a leaf that is not descendent with i + that also belongs to cluster j (i.e. T[q]!=j for all q not in S(i)). + If this condition is violated, T is not a valid cluster assignment + vector, and an exception will be thrown. + + Two k-sized numpy vectors are returned, L and M. L[j]=i is the linkage + cluster node id that is the leader of flat cluster with id M[j]. If + i < n, i corresponds to an original observation, otherwise it + corresponds to a non-singleton cluster. + """ + if type(T) != _array_type or T.dtype != 'int': + raise TypeError('T must be a one-dimensional numpy array of integers.') + is_valid_linkage(Z, throw=True, name='Z') + if len(T) != Z.shape[0] + 1: + raise ValueError('Mismatch: len(T)!=Z.shape[0] + 1.') + + Cl = numpy.unique(T) + kk = len(Cl) + L = numpy.zeros((kk,), dtype='int32') + M = numpy.zeros((kk,), dtype='int32') + n = Z.shape[0] + 1 + [Z, T] = _copy_arrays_if_base_present([Z, T]) + s = _hierarchy_wrap.leaders_wrap(Z, T, L, M, int(kk), int(n)) + if s >= 0: + raise ValueError('T is not a valid assignment vector. Error found when examining linkage node %d (< 2n-1).' % s) + return (L, M) + +# These are test functions to help me test the leaders function. + +def _leaders_test(Z, T): + tr = totree(Z) + _leaders_test_recurs_mark(tr, T) + return tr + +def _leader_identify(tr, T): + if tr.isLeaf(): + return T[tr.id] + else: + left = tr.getLeft() + right = tr.getRight() + lfid = _leader_identify(left, T) + rfid = _leader_identify(right, T) + print 'ndid: %d lid: %d lfid: %d rid: %d rfid: %d' % (tr.getId(), + left.getId(), lfid, right.getId(), rfid) + if lfid != rfid: + if lfid != -1: + print 'leader: %d with tag %d' % (left.id, lfid) + if rfid != -1: + print 'leader: %d with tag %d' % (right.id, rfid) + return -1 + else: + return lfid + +def _leaders_test_recurs_mark(tr, T): + if tr.isLeaf(): + tr.asgn = T[tr.id] + else: + tr.asgn = -1 + _leaders_test_recurs_mark(tr.left, T) + _leaders_test_recurs_mark(tr.right, T) Modified: trunk/scipy/cluster/setup.py =================================================================== --- trunk/scipy/cluster/setup.py 2008-04-14 19:01:01 UTC (rev 4141) +++ trunk/scipy/cluster/setup.py 2008-04-15 04:25:47 UTC (rev 4142) @@ -12,6 +12,10 @@ sources=[join('src', 'vq_module.c'), join('src', 'vq.c')], include_dirs = [get_numpy_include_dirs()]) + config.add_extension('_hierarchy_wrap', + sources=[join('src', 'hierarchy_wrap.c'), join('src', 'hierarchy.c')], + include_dirs = [get_numpy_include_dirs()]) + return config if __name__ == '__main__': Added: trunk/scipy/cluster/src/hierarchy.c =================================================================== --- trunk/scipy/cluster/src/hierarchy.c 2008-04-14 19:01:01 UTC (rev 4141) +++ trunk/scipy/cluster/src/hierarchy.c 2008-04-15 04:25:47 UTC (rev 4142) @@ -0,0 +1,2184 @@ +/** + * hierarchy.c + * + * Author: Damian Eads + * Date: September 22, 2007 + * + * Copyright (c) 2007, 2008, Damian Eads. All rights reserved. + * Adapted for incorporation into Scipy, April 9, 2008. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * - Neither the name of the author nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define NCHOOSE2(_n) ((_n)*(_n-1)/2) +#define ISCLUSTER(_nd) ((_nd)->id >= n) +#define GETCLUSTER(_id) ((lists + _id - n)) + +#define CPY_MAX(_x, _y) ((_x > _y) ? (_x) : (_y)) +#define CPY_MIN(_x, _y) ((_x < _y) ? (_x) : (_y)) +/** The number of link stats (for the inconsistency computation) for each + cluster. */ + +#define CPY_NIS 4 + +/** The column offsets for the different link stats for the inconsistency + computation. */ +#define CPY_INS_MEAN 0 +#define CPY_INS_STD 1 +#define CPY_INS_N 2 +#define CPY_INS_INS 3 + +/** The number of linkage stats for each cluster. */ +#define CPY_LIS 4 + +/** The column offsets for the different link stats for the linkage matrix. */ +#define CPY_LIN_LEFT 0 +#define CPY_LIN_RIGHT 1 +#define CPY_LIN_DIST 2 +#define CPY_LIN_CNT 3 + +#define CPY_BITS_PER_CHAR (sizeof(unsigned char) * 8) +#define CPY_FLAG_ARRAY_SIZE_BYTES(num_bits) (CPY_CEIL_DIV((num_bits), \ + CPY_BITS_PER_CHAR)) +#define CPY_GET_BIT(_xx, i) (((_xx)[(i) / CPY_BITS_PER_CHAR] >> \ + ((CPY_BITS_PER_CHAR-1) - \ + ((i) % CPY_BITS_PER_CHAR))) & 0x1) +#define CPY_SET_BIT(_xx, i) ((_xx)[(i) / CPY_BITS_PER_CHAR] |= \ + ((0x1) << ((CPY_BITS_PER_CHAR-1) \ + -((i) % CPY_BITS_PER_CHAR)))) +#define CPY_CLEAR_BIT(_xx, i) ((_xx)[(i) / CPY_BITS_PER_CHAR] &= \ + ~((0x1) << ((CPY_BITS_PER_CHAR-1) \ + -((i) % CPY_BITS_PER_CHAR)))) + +#ifndef CPY_CEIL_DIV +#define CPY_CEIL_DIV(x, y) ((((double)x)/(double)y) == \ + ((double)((x)/(y))) ? ((x)/(y)) : ((x)/(y) + 1)) +#endif + + +#ifdef CPY_DEBUG +#define CPY_DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__) +#else +#define CPY_DEBUG_MSG(...) +#endif + +#include +#include +#include +#include + +#include "hierarchy.h" + +double euclidean_distance(const double *u, const double *v, int n) { + int i = 0; + double s = 0.0, d; + for (i = 0; i < n; i++) { + d = u[i] - v[i]; + s = s + d * d; + } + return sqrt(s); +} + +double ess_distance(const double *u, const double *v, int n) { + int i = 0; + double s = 0.0, d; + for (i = 0; i < n; i++) { + d = fabs(u[i] - v[i]); + s = s + d * d; + } + return s; +} + +double chebyshev_distance(const double *u, const double *v, int n) { + int i = 0; + double d, maxv = 0.0; + for (i = 0; i < n; i++) { + d = fabs(u[i] - v[i]); + if (d > maxv) { + maxv = d; + } + } + return maxv; +} + +double canberra_distance(const double *u, const double *v, int n) { + int i; + double s = 0.0; + for (i = 0; i < n; i++) { + s += (fabs(u[i] - v[i]) / (fabs(u[i]) + fabs(v[i]))); + } + return s; +} + +double bray_curtis_distance(const double *u, const double *v, int n) { + int i; + double s1 = 0.0, s2 = 0.0; + for (i = 0; i < n; i++) { + s1 += fabs(u[i] - v[i]); + s2 += fabs(u[i] + v[i]); + } + return s1 / s2; +} + +double mahalanobis_distance(const double *u, const double *v, + const double *covinv, double *dimbuf1, + double *dimbuf2, int n) { + int i, j; + double s; + const double *covrow = covinv; + for (i = 0; i < n; i++) { + dimbuf1[i] = u[i] - v[i]; + } + for (i = 0; i < n; i++) { + covrow = covinv + (i * n); + s = 0.0; + for (j = 0; j < n; j++) { + s += dimbuf1[j] * covrow[j]; + } + dimbuf2[i] = s; + } + s = 0.0; + for (i = 0; i < n; i++) { + s += dimbuf1[i] * dimbuf2[i]; + } + return sqrt(s); +} + +double hamming_distance(const double *u, const double *v, int n) { + int i = 0; + double s = 0.0; + for (i = 0; i < n; i++) { + s = s + (u[i] != v[i]); + } + return s / (double)n; +} + +double hamming_distance_bool(const char *u, const char *v, int n) { + int i = 0; + double s = 0.0; + for (i = 0; i < n; i++) { + s = s + (u[i] != v[i]); + } + return s / (double)n; +} + +double yule_distance_bool(const char *u, const char *v, int n) { + int i = 0; + int ntt = 0, nff = 0, nft = 0, ntf = 0; + for (i = 0; i < n; i++) { + ntt += (u[i] && v[i]); + ntf += (u[i] && !v[i]); + nft += (!u[i] && v[i]); + nff += (!u[i] && !v[i]); + } + return (2.0 * ntf * nft) / (double)(ntt * nff + ntf * nft); +} + +double matching_distance_bool(const char *u, const char *v, int n) { + int i = 0; + int nft = 0, ntf = 0; + for (i = 0; i < n; i++) { + ntf += (u[i] && !v[i]); + nft += (!u[i] && v[i]); + } + return (double)(ntf + nft) / (double)(n); +} + +double dice_distance_bool(const char *u, const char *v, int n) { + int i = 0; + int ntt = 0, nft = 0, ntf = 0; + for (i = 0; i < n; i++) { + ntt += (u[i] && v[i]); + ntf += (u[i] && !v[i]); + nft += (!u[i] && v[i]); + } + return (double)(nft + ntf) / (double)(2.0 * ntt + ntf + nft); +} + + +double rogerstanimoto_distance_bool(const char *u, const char *v, int n) { + int i = 0; + int ntt = 0, nff = 0, nft = 0, ntf = 0; + for (i = 0; i < n; i++) { + ntt += (u[i] && v[i]); + ntf += (u[i] && !v[i]); + nft += (!u[i] && v[i]); + nff += (!u[i] && !v[i]); + } + return (2.0 * (ntf + nft)) / ((double)ntt + nff + (2.0 * (ntf + nft))); +} + +double russellrao_distance_bool(const char *u, const char *v, int n) { + int i = 0; + /** int nff = 0, nft = 0, ntf = 0;**/ + int ntt = 0; + for (i = 0; i < n; i++) { + /** nff += (!u[i] && !v[i]); + ntf += (u[i] && !v[i]); + nft += (!u[i] && v[i]);**/ + ntt += (u[i] && v[i]); + } + /** return (double)(ntf + nft + nff) / (double)n;**/ + return (double) (n - ntt) / (double) n; +} + +static inline double kulsinski_distance_bool(const char *u, const char *v, int n) { + int _i = 0; + int ntt = 0, nft = 0, ntf = 0, nff = 0; + for (_i = 0; _i < n; _i++) { + ntt += (u[_i] && v[_i]); + ntf += (u[_i] && !v[_i]); + nft += (!u[_i] && v[_i]); + nff += (!u[_i] && !v[_i]); + } + return ((double)(ntf + nft - ntt + n)) / ((double)(ntf + nft + n)); +} + +static inline double sokalsneath_distance_bool(const char *u, const char *v, int n) { + int _i = 0; + int ntt = 0, nft = 0, ntf = 0; + for (_i = 0; _i < n; _i++) { + ntt += (u[_i] && v[_i]); + ntf += (u[_i] && !v[_i]); + nft += (!u[_i] && v[_i]); + } + return (2.0 * (ntf + nft))/(2.0 * (ntf + nft) + ntt); +} + +static inline double sokalmichener_distance_bool(const char *u, const char *v, int n) { + int _i = 0; + int ntt = 0, nft = 0, ntf = 0, nff = 0; + for (_i = 0; _i < n; _i++) { + ntt += (u[_i] && v[_i]); + nff += (!u[_i] && !v[_i]); + ntf += (u[_i] && !v[_i]); + nft += (!u[_i] && v[_i]); + } + return (2.0 * (ntf + nft))/(2.0 * (ntf + nft) + ntt + nff); +} + +double jaccard_distance(const double *u, const double *v, int n) { + int i = 0; + double denom = 0.0, num = 0.0; + for (i = 0; i < n; i++) { + num += (u[i] != v[i]) && ((u[i] != 0) || (v[i] != 0)); + denom += (u[i] != 0) || (v[i] != 0); + } + return num / denom; +} + +double jaccard_distance_bool(const char *u, const char *v, int n) { + int i = 0; + double s = 0.0; + for (i = 0; i < n; i++) { + s = s + (u[i] != v[i]); + } + return s / (double)n; +} + +double dot_product(const double *u, const double *v, int n) { + int i; + double s = 0.0; + for (i = 0; i < n; i++) { + s += u[i] * v[i]; + } + return s; +} + +double cosine_distance(const double *u, const double *v, int n, + const double nu, const double nv) { + return 1.0 - (dot_product(u, v, n) / (nu * nv)); +} + +double seuclidean_distance(const double *var, + const double *u, const double *v, int n) { + int i = 0; + double s = 0.0, d; + for (i = 0; i < n; i++) { + d = u[i] - v[i]; + s = s + (d * d) / var[i]; + } + return sqrt(s); +} + +double city_block_distance(const double *u, const double *v, int n) { + int i = 0; + double s = 0.0, d; + for (i = 0; i < n; i++) { + d = fabs(u[i] - v[i]); + s = s + d; + } + return s; +} + +double minkowski_distance(const double *u, const double *v, int n, double p) { + int i = 0; + double s = 0.0, d; + for (i = 0; i < n; i++) { + d = fabs(u[i] - v[i]); + s = s + pow(d, p); + } + return pow(s, 1.0 / p); +} + +void compute_mean_vector(double *res, const double *X, int m, int n) { + int i, j; + const double *v; + for (i = 0; i < n; i++) { + res[i] = 0.0; + } + for (j = 0; j < m; j++) { + + v = X + (j * n); + for (i = 0; i < n; i++) { + res[i] += v[i]; + } + } + for (i = 0; i < n; i++) { + res[i] /= (double)m; + } +} + +void pdist_euclidean(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = euclidean_distance(u, v, n); + } + } +} + +void pdist_mahalanobis(const double *X, const double *covinv, + double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + double *dimbuf1, *dimbuf2; + dimbuf1 = (double*)malloc(sizeof(double) * 2 * n); + dimbuf2 = dimbuf1 + n; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = mahalanobis_distance(u, v, covinv, dimbuf1, dimbuf2, n); + } + } + dimbuf2 = 0; + free(dimbuf1); +} + +void pdist_bray_curtis(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = bray_curtis_distance(u, v, n); + } + } +} + +void pdist_canberra(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = canberra_distance(u, v, n); + } + } +} + +void pdist_hamming(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = hamming_distance(u, v, n); + } + } +} + +void pdist_hamming_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = hamming_distance_bool(u, v, n); + } + } +} + +void pdist_jaccard(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = jaccard_distance(u, v, n); + } + } +} + +void pdist_jaccard_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = jaccard_distance_bool(u, v, n); + } + } +} + + +void pdist_chebyshev(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = chebyshev_distance(u, v, n); + } + } +} + +void pdist_cosine(const double *X, double *dm, int m, int n, const double *norms) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = cosine_distance(u, v, n, norms[i], norms[j]); + } + } +} + +void pdist_seuclidean(const double *X, const double *var, + double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = seuclidean_distance(var, u, v, n); + } + } +} + +void pdist_city_block(const double *X, double *dm, int m, int n) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = city_block_distance(u, v, n); + } + } +} + +void pdist_minkowski(const double *X, double *dm, int m, int n, double p) { + int i, j; + const double *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = minkowski_distance(u, v, n, p); + } + } +} + +void pdist_yule_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = yule_distance_bool(u, v, n); + } + } +} + +void pdist_matching_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = matching_distance_bool(u, v, n); + } + } +} + +void pdist_dice_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = dice_distance_bool(u, v, n); + } + } +} + +void pdist_rogerstanimoto_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = rogerstanimoto_distance_bool(u, v, n); + } + } +} + +void pdist_russellrao_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = russellrao_distance_bool(u, v, n); + } + } +} + +void pdist_kulsinski_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = kulsinski_distance_bool(u, v, n); + } + } +} + +void pdist_sokalsneath_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = sokalsneath_distance_bool(u, v, n); + } + } +} + +void pdist_sokalmichener_bool(const char *X, double *dm, int m, int n) { + int i, j; + const char *u, *v; + double *it = dm; + for (i = 0; i < m; i++) { + for (j = i + 1; j < m; j++, it++) { + u = X + (n * i); + v = X + (n * j); + *it = sokalmichener_distance_bool(u, v, n); + } + } +} + +void chopmins(int *ind, int mini, int minj, int np) { + int i; + for (i = mini; i < minj - 1; i++) { + ind[i] = ind[i + 1]; + } + for (i = minj - 1; i < np - 2; i++) { + ind[i] = ind[i + 2]; + } + /** CPY_DEBUG_MSG("[Remove mini=%d minj=%d]\n", mini, minj);**/ +} + +void chopmin(int *ind, int minj, int np) { + int i; + for (i = minj; i < np - 1; i++) { + ind[i] = ind[i + 1]; + } + /** CPY_DEBUG_MSG("[Remove mini=%d minj=%d]\n", mini, minj);**/ +} + +void chopmins_ns_ij(double *ind, int mini, int minj, int np) { + int i; + for (i = mini; i < minj - 1; i++) { + ind[i] = ind[i + 1]; + } + for (i = minj - 1; i < np - 2; i++) { + ind[i] = ind[i + 2]; + } +} + +void chopmins_ns_i(double *ind, int mini, int np) { + int i; + for (i = mini; i < np - 1; i++) { + ind[i] = ind[i + 1]; + } +} + +void dist_single(cinfo *info, int mini, int minj, int np, int n) { + double **rows = info->rows; + double *buf = info->buf; + double *bit; + int i; + bit = buf; + for (i = 0; i < mini; i++, bit++) { + *bit = CPY_MIN(*(rows[i] + mini - i - 1), *(rows[i] + minj - i - 1)); + } + for (i = mini + 1; i < minj; i++, bit++) { + *bit = CPY_MIN(*(rows[mini] + i - mini - 1), *(rows[i] + minj - i - 1)); + } + for (i = minj + 1; i < np; i++, bit++) { + *bit = CPY_MIN(*(rows[mini] + i - mini - 1), *(rows[minj] + i - minj - 1)); + } +} + +void dist_complete(cinfo *info, int mini, int minj, int np, int n) { + double **rows = info->rows; + double *buf = info->buf; + double *bit; + int i; + bit = buf; + for (i = 0; i < mini; i++, bit++) { + *bit = CPY_MAX(*(rows[i] + mini - i - 1), *(rows[i] + minj - i - 1)); + } + for (i = mini + 1; i < minj; i++, bit++) { + *bit = CPY_MAX(*(rows[mini] + i - mini - 1), *(rows[i] + minj - i - 1)); + } + for (i = minj + 1; i < np; i++, bit++) { + *bit = CPY_MAX(*(rows[mini] + i - mini - 1), *(rows[minj] + i - minj - 1)); + } +} + +void dist_average(cinfo *info, int mini, int minj, int np, int n) { + double **rows = info->rows, *buf = info->buf, *bit; + int *inds = info->ind; + double drx, dsx, mply, rscnt, rc, sc; + int i, xi, xn; + cnode *rn = info->nodes + inds[mini]; + cnode *sn = info->nodes + inds[minj]; + bit = buf; + rc = (double)rn->n; + sc = (double)sn->n; + rscnt = rc + sc; + + for (i = 0; i < mini; i++, bit++) { + /** d(r,x) **/ + drx = *(rows[i] + mini - i - 1); + dsx = *(rows[i] + minj - i - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + mply = 1.0 / (((double)xn) * rscnt); + *bit = mply * ((drx * (rc * xn)) + (dsx * (sc * xn))); + } + for (i = mini + 1; i < minj; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[i] + minj - i - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + mply = 1.0 / (((double)xn) * rscnt); + *bit = mply * ((drx * (rc * xn)) + (dsx * (sc * xn))); + } + for (i = minj + 1; i < np; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[minj] + i - minj - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + mply = 1.0 / (((double)xn) * rscnt); + *bit = mply * ((drx * (rc * xn)) + (dsx * (sc * xn))); + } +} + +void dist_centroid(cinfo *info, int mini, int minj, int np, int n) { + double *buf = info->buf, *bit; + int *inds = info->ind; + const double *centroid_tq; + int i, m, xi; + centroid_tq = info->centroids[info->nid]; + bit = buf; + m = info->m; + for (i = 0; i < np; i++, bit++) { + /** d(r,x) **/ + if (i == mini || i == minj) { + bit--; + continue; + } + xi = inds[i]; + *bit = euclidean_distance(info->centroids[xi], centroid_tq, m); + /** CPY_DEBUG_MSG("%5.5f ", *bit);**/ + } + /** CPY_DEBUG_MSG("\n");**/ +} + +void combine_centroids(double *centroidResult, + const double *centroidA, const double *centroidB, + double na, double nb, int n) { + int i; + double nr = (double)na + (double)nb; + for (i = 0; i < n; i++) { + centroidResult[i] = ((centroidA[i] * na) + (centroidB[i] * nb)) / nr; + } +} + +void dist_weighted(cinfo *info, int mini, int minj, int np, int n) { + double **rows = info->rows, *buf = info->buf, *bit; + int i; + double drx, dsx; + + bit = buf; + + for (i = 0; i < mini; i++, bit++) { + /** d(r,x) **/ + drx = *(rows[i] + mini - i - 1); + dsx = *(rows[i] + minj - i - 1); + *bit = (drx + dsx) / 2; + } + for (i = mini + 1; i < minj; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[i] + minj - i - 1); + *bit = (drx + dsx) / 2; + } + for (i = minj + 1; i < np; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[minj] + i - minj - 1); + *bit = (drx + dsx) / 2; + } + /** CPY_DEBUG_MSG("\n");**/ +} + +void dist_ward(cinfo *info, int mini, int minj, int np, int n) { + double **rows = info->rows, *buf = info->buf, *bit; + int *inds = info->ind; + const double *centroid_tq; + int i, m, xi, rind, sind; + double drx, dsx, rf, sf, xf, xn, rn, sn, drsSq; + cnode *newNode; + + rind = inds[mini]; + sind = inds[minj]; + rn = (double)info->nodes[rind].n; + sn = (double)info->nodes[sind].n; + newNode = info->nodes + info->nid; + drsSq = newNode->d; + drsSq = drsSq * drsSq; + centroid_tq = info->centroids[info->nid]; + bit = buf; + m = info->m; + + for (i = 0; i < mini; i++, bit++) { + /** d(r,x) **/ + drx = *(rows[i] + mini - i - 1); + dsx = *(rows[i] + minj - i - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + rf = (rn + xn) / (rn + sn + xn); + sf = (sn + xn) / (rn + sn + xn); + xf = -xn / (rn + sn + xn); + *bit = sqrt(rf * (drx * drx) + + sf * (dsx * dsx) + + xf * drsSq); + + } + for (i = mini + 1; i < minj; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[i] + minj - i - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + rf = (rn + xn) / (rn + sn + xn); + sf = (sn + xn) / (rn + sn + xn); + xf = -xn / (rn + sn + xn); + *bit = sqrt(rf * (drx * drx) + + sf * (dsx * dsx) + + xf * drsSq); + } + for (i = minj + 1; i < np; i++, bit++) { + drx = *(rows[mini] + i - mini - 1); + dsx = *(rows[minj] + i - minj - 1); + xi = inds[i]; + cnode *xnd = info->nodes + xi; + xn = xnd->n; + rf = (rn + xn) / (rn + sn + xn); + sf = (sn + xn) / (rn + sn + xn); + xf = -xn / (rn + sn + xn); + *bit = sqrt(rf * (drx * drx) + + sf * (dsx * dsx) + + xf * drsSq); + } + /** CPY_DEBUG_MSG("\n");**/ +} + + +void print_dm(const double **rows, int np) { + int i, j, k; + const double *row; + CPY_DEBUG_MSG("[DM, np=%d\n", np); + for (i = 0; i < np - 1; i++) { + row = rows[i]; + for (j = 0; j <= i; j++) { + CPY_DEBUG_MSG("%5.5f ", 0.0); + } + + for (k = 0, j = i + 1; j < np; j++, k++) { + CPY_DEBUG_MSG("%5.5f ", *(row + k)); + } + CPY_DEBUG_MSG("|j=%d|\n", i + 1); + } +} + +void print_ind(const int *inds, int np) { + int i; + CPY_DEBUG_MSG("[IND, np=%d || ", np); + for (i = 0; i < np; i++) { + CPY_DEBUG_MSG("%d ", inds[i]); + } + CPY_DEBUG_MSG("]\n"); +} + +void print_vec(const double *d, int n) { + int i; + CPY_DEBUG_MSG("["); + for (i = 0; i < n; i++) { + CPY_DEBUG_MSG("%5.5f ", d[i]); + } + CPY_DEBUG_MSG("]"); +} + +/** + * notes to self: + * dm: The distance matrix. + * Z: The result of the linkage, a (n-1) x 3 matrix. + * X: The original observations as row vectors (=NULL if not needed). + * n: The number of objects. + * ml: A boolean indicating whether a list of objects in the forest + * clusters should be maintained. + * kc: Keep track of the centroids. + */ +void linkage(double *dm, double *Z, double *X, + int m, int n, int ml, int kc, distfunc dfunc, + int method) { + int i, j, k, t, np, nid, mini, minj, npc2; + double min, ln, rn, qn; + int *ind; + /** An iterator through the distance matrix. */ + double *dmit, *buf; + + int *rowsize; + + /** Temporary array to store modified distance matrix. */ + double *dmt, **rows, *Zrow; + double *centroidsData; + double **centroids; + const double *centroidL, *centroidR; + double *centroid; + clist *lists, *listL, *listR, *listC; + clnode *lnodes; + cnode *nodes, *node; + + cinfo info; + + /** The next two are only necessary for euclidean distance methods. */ + if (ml) { + lists = (clist*)malloc(sizeof(clist) * (n-1)); + lnodes = (clnode*)malloc(sizeof(clnode) * n); + } + else { + lists = 0; + lnodes = 0; + } + if (kc) { + centroids = (double**)malloc(sizeof(double*) * (2 * n)); + centroidsData = (double*)malloc(sizeof(double) * n * m); + for (i = 0; i < n; i++) { + centroids[i] = X + i * m; + } + for (i = 0; i < n; i++) { + centroids[i+n] = centroidsData + i * m; + } + } + else { + centroids = 0; + centroidsData = 0; + } + + nodes = (cnode*)malloc(sizeof(cnode) * (n * 2) - 1); + ind = (int*)malloc(sizeof(int) * n); + dmt = (double*)malloc(sizeof(double) * NCHOOSE2(n)); + buf = (double*)malloc(sizeof(double) * n); + rows = (double**)malloc(sizeof(double*) * n); + rowsize = (int*)malloc(sizeof(int) * n); + memcpy(dmt, dm, sizeof(double) * NCHOOSE2(n)); + + info.X = X; + info.m = m; + info.n = n; + info.nodes = nodes; + info.ind = ind; + info.dmt = dmt; + info.buf = buf; + info.rows = rows; + info.rowsize = rowsize; + info.dm = dm; + info.centroids = centroids; + if (kc) { + info.centroidBuffer = centroids[2*n - 1]; + } + else { + info.centroidBuffer = 0; + } + info.lists = lists; + for (i = 0; i < n; i++) { + ind[i] = i; + node = nodes + i; + node->left = 0; + node->right = 0; + node->id = i; + node->n = 1; + node->d = 0.0; + rowsize[i] = n - 1 - i; + } + rows[0] = dmt; + for (i = 1; i < n; i++) { + rows[i] = rows[i-1] + n - i; + } + + if (ml) { + for (i = 0; i < n; i++) { + (lnodes + i)->val = nodes + i; + (lnodes + i)->next = 0; + } + } + + for (k = 0, nid = n; k < n - 1; k++, nid++) { + info.nid = nid; + np = n - k; + npc2 = NCHOOSE2(np); + /** CPY_DEBUG_MSG("k=%d, nid=%d, n=%d np=%d\n", k, nid, n, np);**/ + min = dmt[0]; + mini = 0; + minj = 1; + /** Note that mini < minj since j > i is always true. */ + for (i = 0; i < np - 1; i++) { + dmit = rows[i]; + for (j = i + 1; j < np; j++, dmit++) { + if (*dmit <= min) { + min = *dmit; + mini = i; + minj = j; + } + } + } + + node = nodes + nid; + node->left = nodes + ind[mini]; + node->right = nodes + ind[minj]; + ln = (double)node->left->n; + rn = (double)node->right->n; + qn = ln + rn; + node->n = node->left->n + node->right->n; + node->d = min; + node->id = nid; + + Zrow = Z + (k * CPY_LIS); + Zrow[CPY_LIN_LEFT] = node->left->id; + Zrow[CPY_LIN_RIGHT] = node->right->id; + Zrow[CPY_LIN_DIST] = min; + Zrow[CPY_LIN_CNT] = node->n; + + /** fCPY_DEBUG_MSG(stderr, + "[lid=%d, rid=%d, llid=%d, rrid=%d m=%5.8f]", + node->left->id, node->right->id, ind[mini], ind[minj], min);**/ + + if (ml) { + listC = GETCLUSTER(nid); + if (ISCLUSTER(node->left) != 0) { + listL = GETCLUSTER(node->left->id); + if (ISCLUSTER(node->right) != 0) { + listR = GETCLUSTER(node->right->id); + listL->tail->next = listR->head; + listC->tail = listR->tail; + listR->tail->next = 0; + } + else { + listC->tail = lnodes + node->right->id; + listL->tail->next = listC->tail; + listC->tail->next = 0; + } + listC->head = listL->head; + } + else { + listC->head = lnodes + node->left->id; + if (ISCLUSTER(node->right)) { + listR = GETCLUSTER(node->right->id); + listC->head->next = listR->head; + listC->tail = listR->tail; + listC->tail->next = 0; + } + else { + listC->tail = lnodes + node->right->id; + listC->tail->next = 0; + listC->head->next = listC->tail; + } + } + } + if (kc) { + centroidL = centroids[ind[mini]]; + centroidR = centroids[ind[minj]]; + centroid = centroids[nid]; + switch(method) { + case CPY_LINKAGE_MEDIAN: + for (t = 0; t < m; t++) { + centroid[t] = (centroidL[t] * 0.5 + centroidR[t] * 0.5); + } + break; + case CPY_LINKAGE_CENTROID: + case CPY_LINKAGE_WARD: + default: + for (t = 0; t < m; t++) { + centroid[t] = (centroidL[t] * ln + centroidR[t] * rn) / qn; + } + break; + } + /** CPY_DEBUG_MSG("L: "); + print_vec(centroidL, m); + CPY_DEBUG_MSG("\nR: "); + print_vec(centroidR, m); + CPY_DEBUG_MSG("\nT: "); + print_vec(centroid, m);**/ + } + + /** print_dm(rows, np);**/ + /** dfunc(buf, rows, mini, minj, np, dm, n, ind, nodes);**/ + dfunc(&info, mini, minj, np, n); + + /** For these rows, we must remove, i and j but leave all unused space + at the end. This reduces their size by two.*/ + for (i = 0; i < mini; i++) { + chopmins_ns_ij(rows[i], mini - i - 1, minj - i - 1, rowsize[i]); + } + + /** We skip the i'th row. For rows i+1 up to j-1, we just remove j. */ + for (i = mini + 1; i < minj; i++) { + chopmins_ns_i(rows[i], minj - i - 1, rowsize[i]); + } + + /** For rows 0 to mini - 1, we move them down the matrix, leaving the + first row free. */ + /** for (i = mini; i > 0; i--) { + memcpy(rows[i], rows[i-1], sizeof(double) * rowsize[i]-k); + }**/ + + for (i = mini; i < minj - 1; i++) { + memcpy(rows[i], rows[i+1], sizeof(double) * (rowsize[i+1])); + } + + /** For rows mini+1 to minj-1, we do nothing since they are in the + right place for the next iteration. For rows minj+1 onward, + we move them to the right. */ + + for (i = minj - 1; i < np - 2; i++) { + memcpy(rows[i], rows[i+2], sizeof(double) * (rowsize[i+2])); + } + + /** Rows i+1 to j-1 lose one unit of space, so we move them up. */ + /** Rows j to np-1 lose no space. We do nothing to them. */ + + /** memcpy(rows[0], buf, sizeof(double) * rowsize[0] - k);*/ + + for (i = 0; i < np - 2; i++) { + *(rows[i] + np - 3 - i) = buf[i]; + } + + /** print_dm(rows, np - 1); + print_ind(ind, np);**/ + chopmins(ind, mini, minj, np); + ind[np - 2] = nid; + /** print_ind(ind, np - 1);**/ + } + free(lists); + free(lnodes); + free(nodes); + free(ind); + free(dmt); + free(buf); + free(rows); + free(rowsize); + free(centroidsData); + free(centroids); +} + +/** Trying to reimplement so that output is consistent with MATLAB's in + cases where there are is than one correct choice to make at each + iteration of the algorithm. This implementation is not active. */ + +void linkage_alt(double *dm, double *Z, double *X, + int m, int n, int ml, int kc, distfunc dfunc, + int method) { + int i, j, k, t, np, nid, mini, minj, npc2; + double min, ln, rn, qn; + int *ind; + /** An iterator through the distance matrix. */ + double *dmit, *buf; + + int *rowsize; + + /** Temporary array to store modified distance matrix. */ + double *dmt, **rows, *Zrow; + double *centroidsData; + double **centroids; + const double *centroidL, *centroidR; + double *centroid; + clist *lists, *listL, *listR, *listC; + clnode *lnodes; + cnode *nodes, *node; + + cinfo info; + + /** The next two are only necessary for euclidean distance methods. */ + if (ml) { + lists = (clist*)malloc(sizeof(clist) * (n-1)); + lnodes = (clnode*)malloc(sizeof(clnode) * n); + } + else { + lists = 0; + lnodes = 0; + } + if (kc) { + centroids = (double**)malloc(sizeof(double*) * (2 * n)); + centroidsData = (double*)malloc(sizeof(double) * n * m); + for (i = 0; i < n; i++) { + centroids[i] = X + i * m; + } + for (i = 0; i < n; i++) { + centroids[i+n] = centroidsData + i * m; + } + } + else { + centroids = 0; + centroidsData = 0; + } + + nodes = (cnode*)malloc(sizeof(cnode) * (n * 2) - 1); + ind = (int*)malloc(sizeof(int) * n); + dmt = (double*)malloc(sizeof(double) * NCHOOSE2(n)); + buf = (double*)malloc(sizeof(double) * n); + rows = (double**)malloc(sizeof(double*) * n); + rowsize = (int*)malloc(sizeof(int) * n); + memcpy(dmt, dm, sizeof(double) * NCHOOSE2(n)); + + info.X = X; + info.m = m; + info.n = n; + info.nodes = nodes; + info.ind = ind; + info.dmt = dmt; + info.buf = buf; + info.rows = rows; + info.rowsize = rowsize; + info.dm = dm; + info.centroids = centroids; + if (kc) { + info.centroidBuffer = centroids[2*n - 1]; + } + else { + info.centroidBuffer = 0; + } + info.lists = lists; + for (i = 0; i < n; i++) { + ind[i] = i; + node = nodes + i; + node->left = 0; + node->right = 0; + node->id = i; + node->n = 1; + node->d = 0.0; + rowsize[i] = n - 1 - i; + } + rows[0] = dmt; + for (i = 1; i < n; i++) { + rows[i] = rows[i-1] + n - i; + } + + if (ml) { + for (i = 0; i < n; i++) { + (lnodes + i)->val = nodes + i; + (lnodes + i)->next = 0; + } + } + + for (k = 0, nid = n; k < n - 1; k++, nid++) { + info.nid = nid; + np = n - k; + npc2 = NCHOOSE2(np); + /** CPY_DEBUG_MSG("k=%d, nid=%d, n=%d np=%d\n", k, nid, n, np);**/ + min = dmt[0]; + mini = 0; + minj = 1; + /** Note that mini < minj since j > i is always true. */ + /** BEGIN NEW CODE **/ + for (i = 0; i < np - 1; i++) { + dmit = rows[i]; + for (j = i + 1; j < np; j++, dmit++) { + if (*dmit < min) { + min = *dmit; + mini = i; + minj = j; + } + } + } + + node = nodes + nid; + node->left = nodes + ind[mini]; + node->right = nodes + ind[minj]; + ln = (double)node->left->n; + rn = (double)node->right->n; + qn = ln + rn; + node->n = node->left->n + node->right->n; + node->d = min; + node->id = nid; + + Zrow = Z + (k * CPY_LIS); + Zrow[CPY_LIN_LEFT] = node->left->id; + Zrow[CPY_LIN_RIGHT] = node->right->id; + Zrow[CPY_LIN_DIST] = min; + Zrow[CPY_LIN_CNT] = node->n; + + /** fprintf(stderr, + "[lid=%d, rid=%d, llid=%d, rrid=%d m=%5.8f]", + node->left->id, node->right->id, ind[mini], ind[minj], min);**/ + + if (ml) { + listC = GETCLUSTER(nid); + if (ISCLUSTER(node->left) != 0) { + listL = GETCLUSTER(node->left->id); + if (ISCLUSTER(node->right) != 0) { + listR = GETCLUSTER(node->right->id); + listL->tail->next = listR->head; + listC->tail = listR->tail; + listR->tail->next = 0; + } + else { + listC->tail = lnodes + node->right->id; + listL->tail->next = listC->tail; + listC->tail->next = 0; + } + listC->head = listL->head; + } + else { + listC->head = lnodes + node->left->id; + if (ISCLUSTER(node->right)) { + listR = GETCLUSTER(node->right->id); + listC->head->next = listR->head; + listC->tail = listR->tail; + listC->tail->next = 0; + } + else { + listC->tail = lnodes + node->right->id; + listC->tail->next = 0; + listC->head->next = listC->tail; + } + } + } + if (kc) { + centroidL = centroids[ind[mini]]; + centroidR = centroids[ind[minj]]; + centroid = centroids[nid]; + switch(method) { + case CPY_LINKAGE_MEDIAN: + for (t = 0; t < m; t++) { + centroid[t] = (centroidL[t] * 0.5 + centroidR[t] * 0.5); + } + break; + case CPY_LINKAGE_CENTROID: + case CPY_LINKAGE_WARD: + default: + for (t = 0; t < m; t++) { + centroid[t] = (centroidL[t] * ln + centroidR[t] * rn) / qn; + } + break; + } + /** CPY_DEBUG_MSG("L: "); + print_vec(centroidL, m); + CPY_DEBUG_MSG("\nR: "); + print_vec(centroidR, m); + CPY_DEBUG_MSG("\nT: "); + print_vec(centroid, m);**/ + } + + /** print_dm(rows, np);**/ + /** dfunc(buf, rows, mini, minj, np, dm, n, ind, nodes);**/ + dfunc(&info, mini, minj, np, n); + + /** For these rows, we must remove, i and j but leave all unused space + at the end. This reduces their size by two.*/ + for (i = 0; i < minj; i++) { + chopmins_ns_i(rows[i], minj - i - 1, rowsize[i]); + } + + /** We skip the i'th row. For rows i+1 up to j-1, we just remove j. */ + /**for (i = mini + 1; i < minj; i++) { + chopmins_ns_i(rows[i], minj - i - 1, rowsize[i]); + }**/ + + /** For rows 0 to mini - 1, we move them down the matrix, leaving the + first row free. */ + /**for (i = mini; i > 0; i--) { + memcpy(rows[i], rows[i-1], sizeof(double) * rowsize[i]-k); + } + + for (i = mini; i < minj - 1; i++) { + memcpy(rows[i], rows[i+1], sizeof(double) * (rowsize[i+1])); + }**/ + + /** For rows mini+1 to minj-1, we do nothing since they are in the + right place for the next iteration. For rows minj+1 onward, + we move them to the right. */ + + for (i = minj; i < np - 1; i++) { + memcpy(rows[i], rows[i+1], sizeof(double) * (rowsize[i+1])); + } + + /** Rows i+1 to j-1 lose one unit of space, so we move them up. */ + /** Rows j to np-1 lose no space. We do nothing to them. */ + + /** memcpy(rows[0], buf, sizeof(double) * rowsize[0] - k);*/ + + for (i = 0; i < mini; i++) { + *(rows[i] + mini - i - 1) = buf[i]; + } + + for (i = mini + 1; i < np - 2; i++) { + *(rows[mini] + i - mini - 1) = buf[i-1]; + } + + /** print_dm(rows, np - 1); + print_ind(ind, np);**/ + chopmin(ind, minj, np); + ind[mini] = nid; + /** print_ind(ind, np - 1);**/ + } + free(lists); + free(lnodes); + free(nodes); + free(ind); + free(dmt); + free(buf); + free(rows); + free(rowsize); + free(centroidsData); + free(centroids); +} + +void dist_to_squareform_from_vector(double *M, const double *v, int n) { + double *it; + const double *cit; + int i, j; + cit = v; + for (i = 0; i < n - 1; i++) { + it = M + (i * n) + i + 1; + for (j = i + 1; j < n; j++, it++, cit++) { + *it = *cit; + } + } +} + +void dist_to_vector_from_squareform(const double *M, double *v, int n) { + double *it; + const double *cit; + int i, j; + it = v; + for (i = 0; i < n - 1; i++) { + cit = M + (i * n) + i + 1; + for (j = i + 1; j < n; j++, it++, cit++) { + *it = *cit; + } + } +} + +void cpy_to_tree(const double *Z, cnode **tnodes, int n) { + const double *row; + cnode *node; + cnode *nodes; + int i; + nodes = (cnode*)malloc(sizeof(cnode) * (n * 2) - 1); + *tnodes = nodes; + for (i = 0; i < n; i++) { + node = nodes + i; + node->left = 0; + node->right = 0; + node->id = i; + node->n = 1; + node->d = 0.0; + } + for (i = 0; i < n - 1; i++) { + node = nodes + i + n; + row = Z + (i * CPY_LIS); + node->id = i + n; + node->left = nodes + (int)row[CPY_LIN_LEFT]; + node->right = nodes + (int)row[CPY_LIN_RIGHT]; + node->d = row[CPY_LIN_DIST]; + node->n = (int)row[CPY_LIN_CNT]; + /** CPY_DEBUG_MSG("l: %d r: %d d: %5.5f n: %d\n", (int)row[0], + (int)row[1], row[2], (int)row[3]);**/ + } +} + +inline void set_dist_entry(double *d, double val, int i, int j, int n) { + if (i < j) { + *(d + (NCHOOSE2(n)-NCHOOSE2(n - i)) + j) = val; + } + if (j < i) { + *(d + (NCHOOSE2(n)-NCHOOSE2(n - j)) + i) = val; + } +} + +void cophenetic_distances(const double *Z, double *d, int n) { + int *curNode, *left; + int ndid, lid, rid, i, j, k, t = 0, ln, rn, ii, jj, nc2; + unsigned char *lvisited, *rvisited; + const double *Zrow; + int *members = (int*)malloc(n * sizeof(int)); + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + k = 0; + curNode = (int*)malloc(n * sizeof(int)); + left = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + curNode[k] = (n * 2) - 2; + left[k] = 0; + nc2 = NCHOOSE2(n); + bzero(lvisited, bff); + bzero(rvisited, bff); + + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + if (lid >= n) { + ln = (int)*(Z + (CPY_LIS * (lid-n)) + CPY_LIN_CNT); + } + else { + ln = 1; + } + if (rid >= n) { + rn = (int)*(Z + (CPY_LIS * (rid-n)) + CPY_LIN_CNT); + } + else { + rn = 1; + } + + /** CPY_DEBUG_MSG("[fp] ndid=%d, ndid-n=%d, k=%d, lid=%d, rid=%d\n", + ndid, ndid-n, k, lid, rid);**/ + + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + left[k+1] = left[k]; + k++; + continue; + } + else if (lid < n) { + members[left[k]] = lid; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + left[k+1] = left[k] + ln; + k++; + continue; + } + else if (rid < n) { + members[left[k]+ln] = rid; + } + + /** If it's not a leaf node, and we've visited both children, + record the final mean in the table. */ + if (ndid >= n) { + for (ii = 0; ii < ln; ii++) { + i = *(members + left[k] + ii); + for (jj = 0; jj < rn; jj++) { + j = *(members + left[k] + ln + jj); + if (i < j) { + t = nc2 - NCHOOSE2(n - i) + (j - i - 1); + } + if (j < i) { + t = nc2 - NCHOOSE2(n - j) + (i - j - 1); + } + d[t] = Zrow[CPY_LIN_DIST]; + /** CPY_DEBUG_MSG("i=%d j=%d k=%d d=%5.5f \n", i, j, k, dist);**/ + } + } + } + k--; + } + free(members); + free(left); + free(curNode); + free(lvisited); + free(rvisited); +} + +void inconsistency_calculation_alt(const double *Z, double *R, int n, int d) { + int *curNode; + int ndid, lid, rid, i, k; + unsigned char *lvisited, *rvisited; + const double *Zrow; + double *Rrow; + double levelSum, levelStdSum; + int levelCnt; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + k = 0; + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + /** for each node in the original linkage matrix. */ + for (i = 0; i < n - 1; i++) { + /** the current depth j */ + k = 0; + levelSum = 0.0; + levelCnt = 0; + levelStdSum = 0.0; + bzero(lvisited, bff); + bzero(rvisited, bff); + curNode[0] = i; + for (k = 0; k >= 0;) { + ndid = curNode[k]; + Zrow = Z + ((ndid) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + /** CPY_DEBUG_MSG("[fp] ndid=%d, ndid-n=%d, k=%d, lid=%d, rid=%d\n", + ndid, ndid, k, lid, rid);**/ + if (k < d - 1) { + if (lid >= n && !CPY_GET_BIT(lvisited, ndid)) { + CPY_SET_BIT(lvisited, ndid); + k++; + curNode[k] = lid-n; + continue; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid)) { + CPY_SET_BIT(rvisited, ndid); + k++; + curNode[k] = rid-n; + continue; + } + } + levelCnt++; + levelSum += Zrow[CPY_LIN_DIST]; + levelStdSum += Zrow[CPY_LIN_DIST] * Zrow[CPY_LIN_DIST]; + /**CPY_DEBUG_MSG(" Using range %d to %d, levelCnt[k]=%d\n", lb, ub, levelCnt[k]);**/ + /** Let the count and sum slots be used for the next newly visited + node. */ + k--; + } + Rrow = R + (CPY_NIS * i); + Rrow[CPY_INS_N] = (double)levelCnt; + Rrow[CPY_INS_MEAN] = levelSum / levelCnt; + if (levelCnt < 2) { + Rrow[CPY_INS_STD] = (levelStdSum - (levelSum * levelSum)) / levelCnt; + } + else { + Rrow[CPY_INS_STD] = (levelStdSum - ((levelSum * levelSum) / levelCnt)) / (levelCnt - 1); + } + Rrow[CPY_INS_STD] = sqrt(CPY_MAX(0, Rrow[CPY_INS_STD])); + if (Rrow[CPY_INS_STD] > 0) { + Rrow[CPY_INS_INS] = (Zrow[CPY_LIN_DIST] - Rrow[CPY_INS_MEAN]) / Rrow[CPY_INS_STD]; + } + } + + free(curNode); + free(lvisited); + free(rvisited); +} + +void calculate_cluster_sizes(const double *Z, double *CS, int n) { + int i, j, k; + const double *row; + for (k = 0; k < n - 1; k++) { + row = Z + (k * 3); + i = (int)row[CPY_LIN_LEFT]; + j = (int)row[CPY_LIN_RIGHT]; + /** If the left node is a non-singleton, add its count. */ + if (i >= n) { + CS[k] = CS[i - n]; + } + /** Otherwise just add 1 for the leaf. */ + else { + CS[k] = 1.0; + } + /** If the right node is a non-singleton, add its count. */ + if (j >= n) { + CS[k] = CS[k] + CS[j - n]; + } + /** Otherwise just add 1 for the leaf. */ + else { + CS[k] = CS[k] + 1.0; + } + /** CPY_DEBUG_MSG("i=%d, j=%d, CS[%d]=%d\n", i, j, n+k, (int)CS[k]);**/ + } +} + +/** Returns an array of original observation indices (pre-order traversal). */ +void form_member_list(const double *Z, int *members, int n) { + int *curNode, *left; + int ndid, lid, rid, k, ln, rn; + unsigned char *lvisited, *rvisited; + const double *Zrow; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + + k = 0; + curNode = (int*)malloc(n * sizeof(int)); + left = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + curNode[k] = (n * 2) - 2; + left[k] = 0; + bzero(lvisited, bff); + bzero(rvisited, bff); + + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + if (lid >= n) { + ln = (int)*(Z + (CPY_LIS * (lid-n)) + CPY_LIN_CNT); + } + else { + ln = 1; + } + if (rid >= n) { + rn = (int)*(Z + (CPY_LIS * (rid-n)) + CPY_LIN_CNT); + } + else { + rn = 1; + } + + /** CPY_DEBUG_MSG("[fp] ndid=%d, ndid-n=%d, k=%d, lid=%d, rid=%d\n", + ndid, ndid-n, k, lid, rid);**/ + + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + left[k+1] = left[k]; + k++; + continue; + } + else if (lid < n) { + members[left[k]] = lid; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + left[k+1] = left[k] + ln; + k++; + continue; + } + else if (rid < n) { + members[left[k]+ln] = rid; + } + k--; + } + free(curNode); + free(left); + free(lvisited); + free(rvisited); +} + +void form_flat_clusters_from_in(const double *Z, const double *R, int *T, + double cutoff, int n) { + double *max_inconsists = (double*)malloc(sizeof(double) * n); + get_max_Rfield_for_each_cluster(Z, R, max_inconsists, n, 3); + form_flat_clusters_from_monotonic_criterion(Z, max_inconsists, T, cutoff, n); + free(max_inconsists); +} + +void form_flat_clusters_from_dist(const double *Z, int *T, + double cutoff, int n) { + double *max_dists = (double*)malloc(sizeof(double) * n); + get_max_dist_for_each_cluster(Z, max_dists, n); + CPY_DEBUG_MSG("cupid: n=%d cutoff=%5.5f MD[0]=%5.5f MD[n-1]=%5.5f\n", n, cutoff, max_dists[0], max_dists[n-2]); + form_flat_clusters_from_monotonic_criterion(Z, max_dists, T, cutoff, n); + free(max_dists); +} + +void form_flat_clusters_maxclust_dist(const double *Z, int *T, int n, int mc) { + + double *MD = (double*)malloc(sizeof(double) * n); + get_max_dist_for_each_cluster(Z, MD, n); + CPY_DEBUG_MSG("fumble: n=%d mc=%d MD[0]=%5.5f MD[n-1]=%5.5f\n", n, mc, MD[0], MD[n-2]); + form_flat_clusters_maxclust_monocrit(Z, MD, T, n, mc); + free(MD); +} + +/** form flat clusters by thresholding a monotonic criterion. */ +void form_flat_clusters_from_monotonic_criterion(const double *Z, + const double *mono_crit, + int *T, double cutoff, int n) { + int *curNode; + int ndid, lid, rid, k, ms, nc; + unsigned char *lvisited, *rvisited; + double max_crit; + const double *Zrow; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + + /** number of clusters formed so far. */ + nc = 0; + /** are we in part of a tree below the cutoff? .*/ + ms = -1; + k = 0; + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + ms = -1; + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + max_crit = mono_crit[ndid-n]; + CPY_DEBUG_MSG("cutoff: %5.5f maxc: %5.5f nc: %d\n", cutoff, max_crit, nc); + if (ms == -1 && max_crit <= cutoff) { + CPY_DEBUG_MSG("leader: i=%d\n", ndid); + ms = k; + nc++; + } + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + k++; + continue; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + k++; + continue; + } + if (ndid >= n) { + if (lid < n) { + if (ms == -1) { + nc++; + T[lid] = nc; + } + else { + T[lid] = nc; + } + } + if (rid < n) { + if (ms == -1) { + nc++; + T[rid] = nc; + } + else { + T[rid] = nc; + } + } + if (ms == k) { + ms = -1; + } + } + k--; + } + + free(curNode); + free(lvisited); + free(rvisited); +} + +void form_flat_clusters_maxclust_monocrit(const double *Z, + const double *mono_crit, + int *T, int n, int mc) { + int *curNode; + int ndid, lid, rid, k, nc, g, ms; + unsigned char *lvisited, *rvisited; + const double *Zrow; + double thresh, maxmono_crit; + /** The maximum unsuccessful distance is initially -1.0 (hack). */ + double max_illegal = -1.0; + double min_legal = 0.0; + int min_legal_nc = 1; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + k = 0; + + min_legal = mono_crit[n-2]; + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + + /** number of clusters formed so far. */ + nc = 0; + + CPY_DEBUG_MSG("[BEGIN] min legal: %5.5f nc: %d mc: %d\n", min_legal, min_legal_nc, mc); + + for (g = n - 2; g >= 0; g--) { + thresh = mono_crit[g]; + /** 1. If the threshold is <= the minimum threshold we've tried + unsuccessfully, skip the threshold. (or) + + 2. If the threshold is > the minimum legal threshold, it is + less optimal so skip it. */ + if (thresh > min_legal) { /** commented out : && thresh <= max_illegal **/ + continue; + } + k = 0; + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + nc = 0; + ms = -1; + /** See if the threshold MD[g] works. **/ + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + maxmono_crit = mono_crit[ndid-n]; + /** CPY_DEBUG_MSG("cutoff: %5.5f maxi: %5.5f nc: %d\n", cutoff, max_mono_crit, nc);**/ + + /** If the current nodes maxmono_crit is <= the threshold, stop exploring + deeper in the tree. The node and its descendent leaves will be their + own cluster. */ + if (maxmono_crit <= thresh) { + nc++; + k--; + CPY_SET_BIT(lvisited, ndid-n); + CPY_SET_BIT(rvisited, ndid-n); + continue; + } + /** Otherwise, the node is above the threshold, so we need to explore + it's children. */ + if (!CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + if (lid >= n) { + curNode[k+1] = lid; + k++; + continue; + } + else if (lid < n) { + nc++; + } + } + if (!CPY_GET_BIT(rvisited, ndid-n)) { + if (rid >= n) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + k++; + continue; + } + else if (rid < n) { + nc++; + } + } + k--; + } + + if (thresh > max_illegal && nc > mc) { + CPY_DEBUG_MSG("max illegal: %5.5f mc: %d", max_illegal, mc); + max_illegal = thresh; + continue; + } + /** If the threshold is less than the current minimum legal threshold + but has a legal number of clusters, set the new legal minimum. */ + if (thresh < min_legal && nc <= mc) { + min_legal = thresh; + min_legal_nc = nc; + CPY_DEBUG_MSG("min legal: %5.5f nc: %d mc: %d\n", min_legal, min_legal_nc, mc); + } + } + + form_flat_clusters_from_monotonic_criterion(Z, mono_crit, T, min_legal, n); + + free(curNode); + free(lvisited); + free(rvisited); +} + +void get_max_dist_for_each_cluster(const double *Z, double *max_dists, int n) { + int *curNode; + int ndid, lid, rid, k; + unsigned char *lvisited, *rvisited; + const double *Zrow; + double max_dist; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + + k = 0; + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + k++; + continue; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + k++; + continue; + } + max_dist = Zrow[CPY_LIN_DIST]; + if (lid >= n) { + max_dist = CPY_MAX(max_dist, max_dists[lid-n]); + } + if (rid >= n) { + max_dist = CPY_MAX(max_dist, max_dists[rid-n]); + } + max_dists[ndid-n] = max_dist; + CPY_DEBUG_MSG("i=%d maxdist[i]=%5.5f verif=%5.5f\n", ndid-n, max_dist, max_dists[ndid-n]); + k--; + } + free(curNode); + free(lvisited); + free(rvisited); +} + +/** + Returns the maximum Rrow[rf] field for each cluster node where + 0 <= rf < 3. */ + +void get_max_Rfield_for_each_cluster(const double *Z, const double *R, + double *max_rfs, int n, int rf) { + int *curNode; + int ndid, lid, rid, k; + unsigned char *lvisited, *rvisited; + const double *Zrow, *Rrow; + double max_rf; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + k = 0; + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + Rrow = R + ((ndid-n) * CPY_NIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + k++; + continue; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + k++; + continue; + } + max_rf = Rrow[rf]; + if (lid >= n) { + max_rf = CPY_MAX(max_rf, max_rfs[lid-n]); + } + if (rid >= n) { + max_rf = CPY_MAX(max_rf, max_rfs[rid-n]); + } + max_rfs[ndid-n] = max_rf; + k--; + } + free(curNode); + free(lvisited); + free(rvisited); +} + +/** find the leaders. report an error if found. */ +int leaders(const double *Z, const int *T, int *L, int *M, int kk, int n) { + int *curNode; + int ndid, lid, rid, k, nc; + unsigned char *lvisited, *rvisited; + const double *Zrow; + const int bff = CPY_FLAG_ARRAY_SIZE_BYTES(n); + int *fid; /** done vector, flat cluster ids **/ + int lfid = 0, rfid = 0, errid = -1; + + curNode = (int*)malloc(n * sizeof(int)); + lvisited = (unsigned char*)malloc(bff); + rvisited = (unsigned char*)malloc(bff); + fid = (int*)malloc((2 * n - 1) * sizeof(int)); + + for (k = 0; k < n; k++) { + fid[k] = T[k]; + } + for (k = n; k < 2 * n - 1; k++) { + fid[k] = -1; + } + + /** number of clusters formed so far. */ + nc = 0; + k = 0; + curNode[k] = (n * 2) - 2; + bzero(lvisited, bff); + bzero(rvisited, bff); + while (k >= 0) { + ndid = curNode[k]; + Zrow = Z + ((ndid-n) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + CPY_DEBUG_MSG("ndid=%d lid=%d rid=%d\n", ndid, lid, rid); + if (lid >= n && !CPY_GET_BIT(lvisited, ndid-n)) { + CPY_SET_BIT(lvisited, ndid-n); + curNode[k+1] = lid; + k++; + continue; + } + if (rid >= n && !CPY_GET_BIT(rvisited, ndid-n)) { + CPY_SET_BIT(rvisited, ndid-n); + curNode[k+1] = rid; + k++; + continue; + } + lfid = fid[lid]; + rfid = fid[rid]; + CPY_DEBUG_MSG("[Q] ndid=%d lid=%d lfid=%d rid=%d rfid=%d\n", ndid, lid, lfid, rid, rfid); + + /** If the left and right have the same id, neither can be a leader, + and their parent takes on their flat cluster id. **/ + if (lfid == rfid) { + fid[ndid] = lfid; + } + /** Otherwise, they are both leaders. */ + else { + if (lfid != -1) { + /** If there isn't more room in the result vectors, + something is wrong. Condition (2) in help(hcluster.leader) + is violated. */ + if (nc >= kk) { + errid = ndid; + break; + } + CPY_DEBUG_MSG("[L] new leader i=%d nc=%d, M[nc]=%d kk=%d n=%d\n", lid, nc, lfid, kk, n); + L[nc] = lid; + M[nc] = lfid; + nc++; + } + if (rfid != -1) { + if (nc >= kk) { + errid = ndid; + break; + } + CPY_DEBUG_MSG("[R] new leader i=%d nc=%d, M[nc]=%d kk=%d n=%d\n", rid, nc, rfid, kk, n); + L[nc] = rid; + M[nc] = rfid; + nc++; + } + /** Want to make sure this guy doesn't become a leader since + it's children are both leaders. **/ + fid[ndid] = -1; + + } + k--; + } + /** For the root node, if its too children have the same flat cluster id, + neither is negative, the root becomes the leader. */ + Zrow = Z + ((n-2) * CPY_LIS); + lid = (int)Zrow[CPY_LIN_LEFT]; + rid = (int)Zrow[CPY_LIN_RIGHT]; + lfid = fid[lid]; + rfid = fid[rid]; + if (lfid == rfid && lfid != -1 && errid == -1) { + if (nc >= kk) { + errid = (n * 2) - 2; + /** I know, I know, this looks bad! First time in a good 10 years that I've used one of + these. Don't want to copy the free statements. I don't think this detracts from + the code's readability.*/ + goto leaders_free; + } + L[nc] = (n * 2) - 2; + M[nc] = lfid; + nc++; + } + leaders_free: + free(curNode); + free(lvisited); + free(rvisited); + free(fid); + return errid; +} Added: trunk/scipy/cluster/src/hierarchy.h =================================================================== --- trunk/scipy/cluster/src/hierarchy.h 2008-04-14 19:01:01 UTC (rev 4141) +++ trunk/scipy/cluster/src/hierarchy.h 2008-04-15 04:25:47 UTC (rev 4142) @@ -0,0 +1,159 @@ +/** + * hierarchy.h + * + * Author: Damian Eads + * Date: September 22, 2007 + * Adapted for incorporation into Scipy, April 9, 2008. + * + * Copyright (c) 2007, 2008, Damian Eads. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * - Neither the name of the author nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _CPY_CLUSTER_H +#define _CPY_CLUSTER_H + +#define CPY_LINKAGE_SINGLE 0 +#define CPY_LINKAGE_COMPLETE 1 +#define CPY_LINKAGE_AVERAGE 2 +#define CPY_LINKAGE_CENTROID 3 +#define CPY_LINKAGE_MEDIAN 4 +#define CPY_LINKAGE_WARD 5 +#define CPY_LINKAGE_WEIGHTED 6 + +#define CPY_CRIT_INCONSISTENT 0 +#define CPY_CRIT_DISTANCE 1 +#define CPY_CRIT_MAXCLUST 2 + +typedef struct cnode { + int n; + int id; + double d; + struct cnode *left; + struct cnode *right; +} cnode; + +typedef struct clnode { + struct clnode *next; + struct cnode *val; +} clnode; + +typedef struct clist { + struct clnode *head; + struct clnode *tail; +} clist; + +typedef struct cinfo { + struct cnode *nodes; + struct clist *lists; + int *ind; + double *dmt; + double *dm; + double *buf; + double **rows; + double **centroids; + double *centroidBuffer; + const double *X; + int *rowsize; + int m; + int n; + int nid; +} cinfo; + +typedef void (distfunc) (cinfo *info, int mini, int minj, int np, int n); + +void dist_to_squareform_from_vector(double *M, const double *v, int n); +void dist_to_vector_from_squareform(const double *M, double *v, int n); + +void pdist_euclidean(const double *X, double *dm, int m, int n); +void pdist_seuclidean(const double *X, + const double *var, double *dm, int m, int n); +void pdist_mahalanobis(const double *X, const double *covinv, + double *dm, int m, int n); +void pdist_bray_curtis(const double *X, double *dm, int m, int n); +void pdist_canberra(const double *X, double *dm, int m, int n); +void pdist_hamming(const double *X, double *dm, int m, int n); +void pdist_hamming_bool(const char *X, double *dm, int m, int n); +void pdist_city_block(const double *X, double *dm, int m, int n); +void pdist_cosine(const double *X, double *dm, int m, int n, const double *norms); +void pdist_chebyshev(const double *X, double *dm, int m, int n); +void pdist_jaccard(const double *X, double *dm, int m, int n); +void pdist_jaccard_bool(const char *X, double *dm, int m, int n); +void pdist_kulsinski_bool(const char *X, double *dm, int m, int n); +void pdist_minkowski(const double *X, double *dm, int m, int n, double p); +void pdist_yule_bool(const char *X, double *dm, int m, int n); +void pdist_matching_bool(const char *X, double *dm, int m, int n); +void pdist_dice_bool(const char *X, double *dm, int m, int n); +void pdist_rogerstanimoto_bool(const char *X, double *dm, int m, int n); +void pdist_russellrao_bool(const char *X, double *dm, int m, int n); +void pdist_sokalmichener_bool(const char *X, double *dm, int m, int n); +void pdist_sokalsneath_bool(const char *X, double *dm, int m, int n); + +void inconsistency_calculation(const double *Z, double *R, int n, int d); +void inconsistency_calculation_alt(const double *Z, double *R, int n, int d); + +double dot_product(const double *u, const double *v, int n); + +void chopmins(int *ind, int mini, int minj, int np); +void chopmins_ns_i(double *ind, int mini, int np); +void chopmins_ns_ij(double *ind, int mini, int minj, int np); + +void dist_single(cinfo *info, int mini, int minj, int np, int n); +void dist_average(cinfo *info, int mini, int minj, int np, int n); +void dist_complete(cinfo *info, int mini, int minj, int np, int n); +void dist_centroid(cinfo *info, int mini, int minj, int np, int n); +void dist_ward(cinfo *info, int mini, int minj, int np, int n); +void dist_weighted(cinfo *info, int mini, int minj, int np, int n); + +int leaders(const double *Z, const int *T, int *L, int *M, int kk, int n); + +void linkage(double *dm, double *Z, double *X, int m, int n, int ml, int kc, distfunc dfunc, int method); +void linkage_alt(double *dm, double *Z, double *X, int m, int n, int ml, int kc, distfunc dfunc, int method); + +void cophenetic_distances(const double *Z, double *d, int n); +void cpy_to_tree(const double *Z, cnode **tnodes, int n); +void calculate_cluster_sizes(const double *Z, double *CS, int n); + +void form_member_list(const double *Z, int *members, int n); +void form_flat_clusters_from_in(const double *Z, const double *R, int *T, + double cutoff, int n); +void form_flat_clusters_from_dist(const double *Z, int *T, + double cutoff, int n); +void form_flat_clusters_from_monotonic_criterion(const double *Z, + const double *mono_crit, + int *T, double cutoff, int n); + +void form_flat_clusters_maxclust_dist(const double *Z, int *T, int n, int mc); + +void form_flat_clusters_maxclust_monocrit(const double *Z, + const double *mono_crit, + int *T, int n, int mc); + +void get_max_dist_for_each_cluster(const double *Z, double *max_dists, int n); +void get_max_Rfield_for_each_cluster(const double *Z, const double *R, + double *max_rfs, int n, int rf); +#endif Added: trunk/scipy/cluster/src/hierarchy_wrap.c =================================================================== --- trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-14 19:01:01 UTC (rev 4141) +++ trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-15 04:25:47 UTC (rev 4142) @@ -0,0 +1,910 @@ +/** + * hierarchy_wrap.c + * + * Author: Damian Eads + * Date: September 22, 2007 + * Adapted for incorporation into Scipy, April 9, 2008. + * + * Copyright (c) 2007, Damian Eads. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * - Neither the name of the author nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "hierarchy.h" +#include "Python.h" +#include +#include + +extern PyObject *linkage_wrap(PyObject *self, PyObject *args) { + int method, n; + PyArrayObject *dm, *Z; + distfunc *df; + if (!PyArg_ParseTuple(args, "O!O!ii", + &PyArray_Type, &dm, + &PyArray_Type, &Z, + &n, + &method)) { + return 0; + } + else { + switch (method) { + case CPY_LINKAGE_SINGLE: + df = dist_single; + break; + case CPY_LINKAGE_COMPLETE: + df = dist_complete; + break; + case CPY_LINKAGE_AVERAGE: + df = dist_average; + break; + case CPY_LINKAGE_WEIGHTED: + df = dist_weighted; + break; + default: + /** Report an error. */ + df = 0; + break; + } + linkage((double*)dm->data, (double*)Z->data, 0, 0, n, 0, 0, df, method); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *linkage_euclid_wrap(PyObject *self, PyObject *args) { + int method, m, n, ml; + PyArrayObject *dm, *Z, *X; + distfunc *df; + if (!PyArg_ParseTuple(args, "O!O!O!iii", + &PyArray_Type, &dm, + &PyArray_Type, &Z, + &PyArray_Type, &X, + &m, + &n, + &method)) { + return 0; + } + else { + ml = 0; + /** fprintf(stderr, "m: %d, n: %d\n", m, n);**/ + switch (method) { + case CPY_LINKAGE_CENTROID: + df = dist_centroid; + break; + case CPY_LINKAGE_MEDIAN: + df = dist_centroid; + break; + case CPY_LINKAGE_WARD: + df = dist_ward; + // ml = 1; + break; + default: + /** Report an error. */ + df = 0; + break; + } + linkage((double*)dm->data, (double*)Z->data, (double*)X->data, + m, n, 1, 1, df, method); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *calculate_cluster_sizes_wrap(PyObject *self, PyObject *args) { + int n; + PyArrayObject *Z, *CS; + if (!PyArg_ParseTuple(args, "O!O!i", + &PyArray_Type, &Z, + &PyArray_Type, &CS, + &n)) { + return 0; + } + calculate_cluster_sizes((const double*)Z->data, (double*)CS->data, n); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *get_max_dist_for_each_cluster_wrap(PyObject *self, + PyObject *args) { + int n; + PyArrayObject *Z, *md; + if (!PyArg_ParseTuple(args, "O!O!i", + &PyArray_Type, &Z, + &PyArray_Type, &md, + &n)) { + return 0; + } + get_max_dist_for_each_cluster((const double*)Z->data, (double*)md->data, n); + return Py_BuildValue(""); +} + +extern PyObject *get_max_Rfield_for_each_cluster_wrap(PyObject *self, + PyObject *args) { + int n, rf; + PyArrayObject *Z, *R, *max_rfs; + if (!PyArg_ParseTuple(args, "O!O!O!ii", + &PyArray_Type, &Z, + &PyArray_Type, &R, + &PyArray_Type, &max_rfs, + &n, &rf)) { + return 0; + } + get_max_Rfield_for_each_cluster((const double *)Z->data, + (const double *)R->data, + (double *)max_rfs->data, n, rf); + return Py_BuildValue(""); +} + +extern PyObject *prelist_wrap(PyObject *self, PyObject *args) { + int n; + PyArrayObject *Z, *ML; + if (!PyArg_ParseTuple(args, "O!O!i", + &PyArray_Type, &Z, + &PyArray_Type, &ML, + &n)) { + return 0; + } + form_member_list((const double *)Z->data, (int *)ML->data, n); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *cluster_in_wrap(PyObject *self, PyObject *args) { + int n; + double cutoff; + PyArrayObject *Z, *R, *T; + if (!PyArg_ParseTuple(args, "O!O!O!di", + &PyArray_Type, &Z, + &PyArray_Type, &R, + &PyArray_Type, &T, + &cutoff, + &n)) { + return 0; + } + form_flat_clusters_from_in((const double *)Z->data, (const double *)R->data, + (int *)T->data, cutoff, n); + + return Py_BuildValue("d", 0.0); +} + +extern PyObject *cluster_dist_wrap(PyObject *self, PyObject *args) { + int n; + double cutoff; + PyArrayObject *Z, *T; + if (!PyArg_ParseTuple(args, "O!O!di", + &PyArray_Type, &Z, + &PyArray_Type, &T, + &cutoff, + &n)) { + return 0; + } + form_flat_clusters_from_dist((const double *)Z->data, + (int *)T->data, cutoff, n); + + return Py_BuildValue("d", 0.0); +} + +extern PyObject *cluster_monocrit_wrap(PyObject *self, PyObject *args) { + int n; + double cutoff; + PyArrayObject *Z, *MV, *T; + if (!PyArg_ParseTuple(args, "O!O!O!di", + &PyArray_Type, &Z, + &PyArray_Type, &MV, + &PyArray_Type, &T, + &cutoff, + &n)) { + return 0; + } + form_flat_clusters_from_monotonic_criterion((const double *)Z->data, + (const double *)MV->data, + (int *)T->data, + cutoff, + n); + + form_flat_clusters_from_dist((const double *)Z->data, + (int *)T->data, cutoff, n); + + return Py_BuildValue("d", 0.0); +} + + + +extern PyObject *cluster_maxclust_dist_wrap(PyObject *self, PyObject *args) { + int n, mc; + PyArrayObject *Z, *T; + if (!PyArg_ParseTuple(args, "O!O!ii", + &PyArray_Type, &Z, + &PyArray_Type, &T, + &n, &mc)) { + return 0; + } + form_flat_clusters_maxclust_dist((const double*)Z->data, (int *)T->data, + n, mc); + + return Py_BuildValue(""); +} + + +extern PyObject *cluster_maxclust_monocrit_wrap(PyObject *self, PyObject *args) { + int n, mc; + double cutoff; + PyArrayObject *Z, *MC, *T; + if (!PyArg_ParseTuple(args, "O!O!O!ii", + &PyArray_Type, &Z, + &PyArray_Type, &MC, + &PyArray_Type, &T, + &n, &mc)) { + return 0; + } + form_flat_clusters_maxclust_monocrit((const double *)Z->data, + (const double *)MC->data, + (int *)T->data, n, mc); + + return Py_BuildValue(""); +} + + +extern PyObject *inconsistent_wrap(PyObject *self, PyObject *args) { + int n, d; + PyArrayObject *Z, *R; + if (!PyArg_ParseTuple(args, "O!O!ii", + &PyArray_Type, &Z, + &PyArray_Type, &R, + &n, &d)) { + return 0; + } + inconsistency_calculation_alt((const double*)Z->data, (double*)R->data, n, d); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *cophenetic_distances_wrap(PyObject *self, PyObject *args) { + int n; + PyArrayObject *Z, *d; + if (!PyArg_ParseTuple(args, "O!O!i", + &PyArray_Type, &Z, + &PyArray_Type, &d, + &n)) { + return 0; + } + cophenetic_distances((const double*)Z->data, (double*)d->data, n); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *chopmin_ns_ij_wrap(PyObject *self, PyObject *args) { + int mini, minj, n; + PyArrayObject *row; + if (!PyArg_ParseTuple(args, "O!iii", + &PyArray_Type, &row, + &mini, + &minj, + &n)) { + return 0; + } + chopmins_ns_ij((double*)row->data, mini, minj, n); + return Py_BuildValue("d", 0.0); +} + + +extern PyObject *chopmin_ns_i_wrap(PyObject *self, PyObject *args) { + int mini, n; + PyArrayObject *row; + if (!PyArg_ParseTuple(args, "O!ii", + &PyArray_Type, &row, + &mini, + &n)) { + return 0; + } + chopmins_ns_i((double*)row->data, mini, n); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *chopmins_wrap(PyObject *self, PyObject *args) { + int mini, minj, n; + PyArrayObject *row; + if (!PyArg_ParseTuple(args, "O!iii", + &PyArray_Type, &row, + &mini, + &minj, + &n)) { + return 0; + } + chopmins((int*)row->data, mini, minj, n); + return Py_BuildValue("d", 0.0); +} + +extern PyObject *dot_product_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_d1, *_d2; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_d1, + &PyArray_Type, &_d2)) { + return 0; + } + return Py_BuildValue("d", dot_product((const double*)_d1->data, + (const double*)_d2->data, + _d1->dimensions[0])); +} + +extern PyObject *to_squareform_from_vector_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_M, *_v; + int n; + const double *v; + double *M; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_M, + &PyArray_Type, &_v)) { + return 0; + } + else { + M = (double*)_M->data; + v = (const double*)_v->data; + n = _M->dimensions[0]; + dist_to_squareform_from_vector(M, v, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *to_vector_from_squareform_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_M, *_v; + int n; + double *v; + const double *M; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_M, + &PyArray_Type, &_v)) { + return 0; + } + else { + M = (const double*)_M->data; + v = (double*)_v->data; + n = _M->dimensions[0]; + dist_to_vector_from_squareform(M, v, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_euclidean_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_euclidean(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_canberra_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_canberra(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_bray_curtis_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_bray_curtis(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + + +extern PyObject *pdist_mahalanobis_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_covinv, *_dm; + int m, n; + double *dm; + const double *X; + const double *covinv; + if (!PyArg_ParseTuple(args, "O!O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_covinv, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + covinv = (const double*)_covinv->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_mahalanobis(X, covinv, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + + +extern PyObject *pdist_chebyshev_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_chebyshev(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + + +extern PyObject *pdist_cosine_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm, *_norms; + int m, n; + double *dm; + const double *X, *norms; + if (!PyArg_ParseTuple(args, "O!O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm, + &PyArray_Type, &_norms)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + norms = (const double*)_norms->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_cosine(X, dm, m, n, norms); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_seuclidean_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm, *_var; + int m, n; + double *dm; + const double *X, *var; + if (!PyArg_ParseTuple(args, "O!O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_var, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (double*)_X->data; + dm = (double*)_dm->data; + var = (double*)_var->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_seuclidean(X, var, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_city_block_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_city_block(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_hamming_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_hamming(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_hamming_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_hamming_bool(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_jaccard_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const double *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_jaccard(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_jaccard_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_jaccard_bool(X, dm, m, n); + } + return Py_BuildValue("d", 0.0); +} + +extern PyObject *pdist_minkowski_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm, *X; + double p; + if (!PyArg_ParseTuple(args, "O!O!d", + &PyArray_Type, &_X, + &PyArray_Type, &_dm, + &p)) { + return 0; + } + else { + X = (double*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_minkowski(X, dm, m, n, p); + } + return Py_BuildValue("d", 0.0); +} + + +extern PyObject *pdist_yule_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_yule_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_matching_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_matching_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_dice_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_dice_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_rogerstanimoto_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_rogerstanimoto_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_russellrao_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_russellrao_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_kulsinski_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_kulsinski_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_sokalmichener_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_sokalmichener_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *pdist_sokalsneath_bool_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_X, *_dm; + int m, n; + double *dm; + const char *X; + if (!PyArg_ParseTuple(args, "O!O!", + &PyArray_Type, &_X, + &PyArray_Type, &_dm)) { + return 0; + } + else { + X = (const char*)_X->data; + dm = (double*)_dm->data; + m = _X->dimensions[0]; + n = _X->dimensions[1]; + + pdist_sokalsneath_bool(X, dm, m, n); + } + return Py_BuildValue(""); +} + +extern PyObject *leaders_wrap(PyObject *self, PyObject *args) { + PyArrayObject *_Z, *_T, *_L, *_M; + int kk, n, res; + if (!PyArg_ParseTuple(args, "O!O!O!O!ii", + &PyArray_Type, &_Z, + &PyArray_Type, &_T, + &PyArray_Type, &_L, + &PyArray_Type, &_M, + &kk, &n)) { + return 0; + } + else { + res = leaders((double*)_Z->data, (int*)_T->data, + (int*)_L->data, (int*)_M->data, kk, n); + } + return Py_BuildValue("i", res); +} + +static PyMethodDef _hierarchyWrapMethods[] = { + {"calculate_cluster_sizes_wrap", calculate_cluster_sizes_wrap, METH_VARARGS}, + {"chopmins", chopmins_wrap, METH_VARARGS}, + {"chopmins_ns_i", chopmin_ns_i_wrap, METH_VARARGS}, + {"chopmins_ns_ij", chopmin_ns_ij_wrap, METH_VARARGS}, + {"cluster_in_wrap", cluster_in_wrap, METH_VARARGS}, + {"cluster_dist_wrap", cluster_dist_wrap, METH_VARARGS}, + {"cluster_maxclust_dist_wrap", cluster_maxclust_dist_wrap, METH_VARARGS}, + {"cluster_maxclust_monocrit_wrap", cluster_maxclust_monocrit_wrap, METH_VARARGS}, + {"cluster_monocrit_wrap", cluster_monocrit_wrap, METH_VARARGS}, + {"cophenetic_distances_wrap", cophenetic_distances_wrap, METH_VARARGS}, + {"dot_product_wrap", dot_product_wrap, METH_VARARGS}, + {"get_max_dist_for_each_cluster_wrap", + get_max_dist_for_each_cluster_wrap, METH_VARARGS}, + {"get_max_Rfield_for_each_cluster_wrap", + get_max_Rfield_for_each_cluster_wrap, METH_VARARGS}, + {"inconsistent_wrap", inconsistent_wrap, METH_VARARGS}, + {"leaders_wrap", leaders_wrap, METH_VARARGS}, + {"linkage_euclid_wrap", linkage_euclid_wrap, METH_VARARGS}, + {"linkage_wrap", linkage_wrap, METH_VARARGS}, + {"pdist_bray_curtis_wrap", pdist_bray_curtis_wrap, METH_VARARGS}, + {"pdist_canberra_wrap", pdist_canberra_wrap, METH_VARARGS}, + {"pdist_chebyshev_wrap", pdist_chebyshev_wrap, METH_VARARGS}, + {"pdist_city_block_wrap", pdist_city_block_wrap, METH_VARARGS}, + {"pdist_cosine_wrap", pdist_cosine_wrap, METH_VARARGS}, + {"pdist_dice_bool_wrap", pdist_dice_bool_wrap, METH_VARARGS}, + {"pdist_euclidean_wrap", pdist_euclidean_wrap, METH_VARARGS}, + {"pdist_hamming_wrap", pdist_hamming_wrap, METH_VARARGS}, + {"pdist_hamming_bool_wrap", pdist_hamming_bool_wrap, METH_VARARGS}, + {"pdist_jaccard_wrap", pdist_jaccard_wrap, METH_VARARGS}, + {"pdist_jaccard_bool_wrap", pdist_jaccard_bool_wrap, METH_VARARGS}, + {"pdist_kulsinski_bool_wrap", pdist_kulsinski_bool_wrap, METH_VARARGS}, + {"pdist_mahalanobis_wrap", pdist_mahalanobis_wrap, METH_VARARGS}, + {"pdist_matching_bool_wrap", pdist_matching_bool_wrap, METH_VARARGS}, + {"pdist_minkowski_wrap", pdist_minkowski_wrap, METH_VARARGS}, + {"pdist_rogerstanimoto_bool_wrap", pdist_rogerstanimoto_bool_wrap, METH_VARARGS}, + {"pdist_russellrao_bool_wrap", pdist_russellrao_bool_wrap, METH_VARARGS}, + {"pdist_seuclidean_wrap", pdist_seuclidean_wrap, METH_VARARGS}, + {"pdist_sokalmichener_bool_wrap", pdist_sokalmichener_bool_wrap, METH_VARARGS}, + {"pdist_sokalsneath_bool_wrap", pdist_sokalsneath_bool_wrap, METH_VARARGS}, + {"pdist_yule_bool_wrap", pdist_yule_bool_wrap, METH_VARARGS}, + {"prelist_wrap", prelist_wrap, METH_VARARGS}, + {"to_squareform_from_vector_wrap", + to_squareform_from_vector_wrap, METH_VARARGS}, + {"to_vector_from_squareform_wrap", + to_vector_from_squareform_wrap, METH_VARARGS}, + {NULL, NULL} /* Sentinel - marks the end of this structure */ +}; + +void init_hierarchy_wrap() { + (void) Py_InitModule("_hierarchy_wrap", _hierarchyWrapMethods); + import_array(); // Must be present for NumPy. Called first after above line. +} + From scipy-svn at scipy.org Tue Apr 15 09:27:45 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 15 Apr 2008 08:27:45 -0500 (CDT) Subject: [Scipy-svn] r4143 - trunk/scipy/special Message-ID: <20080415132745.1523B39C017@new.scipy.org> Author: stefan Date: 2008-04-15 08:27:25 -0500 (Tue, 15 Apr 2008) New Revision: 4143 Modified: trunk/scipy/special/basic.py Log: Remove extraneous print statement. Modified: trunk/scipy/special/basic.py =================================================================== --- trunk/scipy/special/basic.py 2008-04-15 04:25:47 UTC (rev 4142) +++ trunk/scipy/special/basic.py 2008-04-15 13:27:25 UTC (rev 4143) @@ -232,7 +232,6 @@ raise ValueError, "n must be a non-negative integer." if (n < 1): n1 = 1 else: n1 = n - print z if iscomplex(z) or less(z,0): nm,jn,jnp,yn,ynp = specfun.csphjy(n1,z) else: From scipy-svn at scipy.org Wed Apr 16 02:21:30 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 16 Apr 2008 01:21:30 -0500 (CDT) Subject: [Scipy-svn] r4144 - trunk/scipy/cluster/tests Message-ID: <20080416062130.7BFD739C0E6@new.scipy.org> Author: damian.eads Date: 2008-04-16 01:21:12 -0500 (Wed, 16 Apr 2008) New Revision: 4144 Added: trunk/scipy/cluster/tests/iris.txt trunk/scipy/cluster/tests/pdist-boolean-inp.txt trunk/scipy/cluster/tests/pdist-cityblock-ml.txt trunk/scipy/cluster/tests/pdist-correlation-ml.txt trunk/scipy/cluster/tests/pdist-cosine-ml.txt trunk/scipy/cluster/tests/pdist-double-inp.txt trunk/scipy/cluster/tests/pdist-euclidean-ml.txt trunk/scipy/cluster/tests/pdist-hamming-ml.txt trunk/scipy/cluster/tests/pdist-jaccard-ml.txt trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml.txt trunk/scipy/cluster/tests/pdist-seuclidean-ml.txt trunk/scipy/cluster/tests/pdist-spearman-ml.txt Log: Added output files for testing the hierarchy package. Added: trunk/scipy/cluster/tests/iris.txt =================================================================== --- trunk/scipy/cluster/tests/iris.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/iris.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1,151 @@ +5.1,3.5,1.4,0.2 +4.9,3.0,1.4,0.2 +4.7,3.2,1.3,0.2 +4.6,3.1,1.5,0.2 +5.0,3.6,1.4,0.2 +5.4,3.9,1.7,0.4 +4.6,3.4,1.4,0.3 +5.0,3.4,1.5,0.2 +4.4,2.9,1.4,0.2 +4.9,3.1,1.5,0.1 +5.4,3.7,1.5,0.2 +4.8,3.4,1.6,0.2 +4.8,3.0,1.4,0.1 +4.3,3.0,1.1,0.1 +5.8,4.0,1.2,0.2 +5.7,4.4,1.5,0.4 +5.4,3.9,1.3,0.4 +5.1,3.5,1.4,0.3 +5.7,3.8,1.7,0.3 +5.1,3.8,1.5,0.3 +5.4,3.4,1.7,0.2 +5.1,3.7,1.5,0.4 +4.6,3.6,1.0,0.2 +5.1,3.3,1.7,0.5 +4.8,3.4,1.9,0.2 +5.0,3.0,1.6,0.2 +5.0,3.4,1.6,0.4 +5.2,3.5,1.5,0.2 +5.2,3.4,1.4,0.2 +4.7,3.2,1.6,0.2 +4.8,3.1,1.6,0.2 +5.4,3.4,1.5,0.4 +5.2,4.1,1.5,0.1 +5.5,4.2,1.4,0.2 +4.9,3.1,1.5,0.1 +5.0,3.2,1.2,0.2 +5.5,3.5,1.3,0.2 +4.9,3.1,1.5,0.1 +4.4,3.0,1.3,0.2 +5.1,3.4,1.5,0.2 +5.0,3.5,1.3,0.3 +4.5,2.3,1.3,0.3 +4.4,3.2,1.3,0.2 +5.0,3.5,1.6,0.6 +5.1,3.8,1.9,0.4 +4.8,3.0,1.4,0.3 +5.1,3.8,1.6,0.2 +4.6,3.2,1.4,0.2 +5.3,3.7,1.5,0.2 +5.0,3.3,1.4,0.2 +7.0,3.2,4.7,1.4 +6.4,3.2,4.5,1.5 +6.9,3.1,4.9,1.5 +5.5,2.3,4.0,1.3 +6.5,2.8,4.6,1.5 +5.7,2.8,4.5,1.3 +6.3,3.3,4.7,1.6 +4.9,2.4,3.3,1.0 +6.6,2.9,4.6,1.3 +5.2,2.7,3.9,1.4 +5.0,2.0,3.5,1.0 +5.9,3.0,4.2,1.5 +6.0,2.2,4.0,1.0 +6.1,2.9,4.7,1.4 +5.6,2.9,3.6,1.3 +6.7,3.1,4.4,1.4 +5.6,3.0,4.5,1.5 +5.8,2.7,4.1,1.0 +6.2,2.2,4.5,1.5 +5.6,2.5,3.9,1.1 +5.9,3.2,4.8,1.8 +6.1,2.8,4.0,1.3 +6.3,2.5,4.9,1.5 +6.1,2.8,4.7,1.2 +6.4,2.9,4.3,1.3 +6.6,3.0,4.4,1.4 +6.8,2.8,4.8,1.4 +6.7,3.0,5.0,1.7 +6.0,2.9,4.5,1.5 +5.7,2.6,3.5,1.0 +5.5,2.4,3.8,1.1 +5.5,2.4,3.7,1.0 +5.8,2.7,3.9,1.2 +6.0,2.7,5.1,1.6 +5.4,3.0,4.5,1.5 +6.0,3.4,4.5,1.6 +6.7,3.1,4.7,1.5 +6.3,2.3,4.4,1.3 +5.6,3.0,4.1,1.3 +5.5,2.5,4.0,1.3 +5.5,2.6,4.4,1.2 +6.1,3.0,4.6,1.4 +5.8,2.6,4.0,1.2 +5.0,2.3,3.3,1.0 +5.6,2.7,4.2,1.3 +5.7,3.0,4.2,1.2 +5.7,2.9,4.2,1.3 +6.2,2.9,4.3,1.3 +5.1,2.5,3.0,1.1 +5.7,2.8,4.1,1.3 +6.3,3.3,6.0,2.5 +5.8,2.7,5.1,1.9 +7.1,3.0,5.9,2.1 +6.3,2.9,5.6,1.8 +6.5,3.0,5.8,2.2 +7.6,3.0,6.6,2.1 +4.9,2.5,4.5,1.7 +7.3,2.9,6.3,1.8 +6.7,2.5,5.8,1.8 +7.2,3.6,6.1,2.5 +6.5,3.2,5.1,2.0 +6.4,2.7,5.3,1.9 +6.8,3.0,5.5,2.1 +5.7,2.5,5.0,2.0 +5.8,2.8,5.1,2.4 +6.4,3.2,5.3,2.3 +6.5,3.0,5.5,1.8 +7.7,3.8,6.7,2.2 +7.7,2.6,6.9,2.3 +6.0,2.2,5.0,1.5 +6.9,3.2,5.7,2.3 +5.6,2.8,4.9,2.0 +7.7,2.8,6.7,2.0 +6.3,2.7,4.9,1.8 +6.7,3.3,5.7,2.1 +7.2,3.2,6.0,1.8 +6.2,2.8,4.8,1.8 +6.1,3.0,4.9,1.8 +6.4,2.8,5.6,2.1 +7.2,3.0,5.8,1.6 +7.4,2.8,6.1,1.9 +7.9,3.8,6.4,2.0 +6.4,2.8,5.6,2.2 +6.3,2.8,5.1,1.5 +6.1,2.6,5.6,1.4 +7.7,3.0,6.1,2.3 +6.3,3.4,5.6,2.4 +6.4,3.1,5.5,1.8 +6.0,3.0,4.8,1.8 +6.9,3.1,5.4,2.1 +6.7,3.1,5.6,2.4 +6.9,3.1,5.1,2.3 +5.8,2.7,5.1,1.9 +6.8,3.2,5.9,2.3 +6.7,3.3,5.7,2.5 +6.7,3.0,5.2,2.3 +6.3,2.5,5.0,1.9 +6.5,3.0,5.2,2.0 +6.2,3.4,5.4,2.3 +5.9,3.0,5.1,1.8 + Added: trunk/scipy/cluster/tests/pdist-boolean-inp.txt =================================================================== (Binary files differ) Property changes on: trunk/scipy/cluster/tests/pdist-boolean-inp.txt ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/scipy/cluster/tests/pdist-cityblock-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-cityblock-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-cityblock-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 3.2420590e+01 3.3246607e+01 3.0526910e+01 3.5166573e+01 3.1868301e+01 3.6025002e+01 3.2513623e+01 3.6557796e+01 3.3752212e+01 3.4422130e+01 3.2526018e+01 3.2581161e+01 3.3743555e+01 3.6960777e+01 3.4225270e+01 3.2965308e+01 3.4591031e+01 3.4204203e+01 3.4678123e+01 3.5728720e+01 3.0830047e+01 3.1550681e+01 3.3304790e+01 3.2676753e+01 3.2742330e+01 3.1684556e+01 3.2830915e+01 3.2956614e+01 2.7365639e+01 3.3207307e+01 3.3420925e+01 3.4357941e+01 2.8280126e+01 3.4523458e+01 3.2705274e+01 3.2455891e+01 3.1636060e+01 3.1594957e+01 3.1805202e+01 3.3886574e+01 3.3438829e+01 3.3330030e+01 3.4168514e+01 3.0637353e+01 4.2149167e+01 3.6340559e+01 2.9315308e+01 3.5778314e+01 3.7693050e+01 3.2598714e+01 3.2990836e+01 3.4967659e+01 3.9748920e+01 3.6745043e+01 2.7117550e+01 3.6014760e+01 2.9367558e+01 3.3845350e+01 3.5477339e+01 3.1513372e+01 3.2517953e+01 2.4755097e+01 3.0229897e+01 3.4799343e+01 3.3371710e+01 2.9600910e+01 3.3275088e+01 3.3567110e+01 3.4527016e+01 3.4942320e+01 3.2359383e+01 3.2607100e+01 3.1467914e+01 2.9032039e+01 3.3122878e+01 2.8496709e+01 2.9908448e+01 2.9962886e+01 3.0345299e+01 3.1737613e+01 2.8551485e+01 3.2610551e+01 3.3082660e+01 3.3719298e+01 3.6434018e+01 3.6589278e+01 3.3889586e+01 3.8036774e+01 3.1483497e+01 3.4196794e+01 3.5154035e+01 3.5488608e+01 3.6143183e+01 3.3473491e+01 3.4686446e+01 2.8687495e+01 3.5725742e+01 3.0188298e+01 3.3084534e+01 3.3538519e+01 3.6226849e+01 2.9052099e+01 3.6032733e+01 3.0811503e+01 3.2616190e+01 3.3888566e+01 3.3074570e+01 2.9683515e+01 3.0600771e+01 3.4345247e+01 3.6983843e+01 3.3692824e+01 3.3762461e+01 3.4024582e+01 3.3698854e+01 3.1238613e+01 3.4978833e+01 3.4991078e+01 3.4577741e+01 3.3749227e+01 3.4982272e+01 3.0487868e+01 3.2317632e+01 3.1125588e+01 3.4413791e+01 3.1881871e+01 3.1373821e+01 3.0416864e+01 3.2066187e+01 3.1128313e+01 3.0240249e+01 3.0125198e+01 3.1343454e+01 3.5479092e+01 3.4450767e+01 3.2953507e+01 3.4456795e+01 3.0136375e+01 3.3462150e+01 2.9894274e+01 3.1367432e+01 3.2839320e+01 3.1440398e+01 2.9400374e+01 3.1106338e+01 3.1242624e+01 3.5537892e+01 3.3056459e+01 2.8610281e+01 3.4296217e+01 3.5819772e+01 3.2503922e+01 3.0963029e+01 3.4762112e+01 3.4796284e+01 2.9645345e+01 3.4468088e+01 2.6975590e+01 3.3738555e+01 2.8825009e+01 3.2663999e+01 3.2547878e+01 3.2308091e+01 3.2489966e+01 3.0868597e+01 3.2974220e+01 3.0866111e+01 3.8197342e+01 3.0609568e+01 3.5478978e+01 2.9249184e+01 3.6185622e+01 3.1948258e+01 3.2649719e+01 3.3305650e+01 3.4643955e+01 3.6566241e+01 3.4968484e+01 3.2632218e+01 3.6741383e+01 3.5700008e+01 3.1962468e+01 3.1410623e+01 3.0412061e+01 3.3749077e+01 3.5649661e+01 3.7649263e+01 3.2832574e+01 3.1783914e+01 2.8264292e+01 Added: trunk/scipy/cluster/tests/pdist-correlation-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-correlation-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-correlation-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 9.2507465e-01 9.6528566e-01 8.7255441e-01 1.1287379e+00 8.7318727e-01 1.0767102e+00 9.1419676e-01 1.1503304e+00 9.8074509e-01 1.0135025e+00 1.0495025e+00 9.4794536e-01 9.6829273e-01 1.1345767e+00 1.1048008e+00 9.2407796e-01 1.0228634e+00 9.3853195e-01 9.9377619e-01 1.0407662e+00 9.5048989e-01 9.0465688e-01 9.8056930e-01 8.9777156e-01 9.6357127e-01 9.3864452e-01 9.9754613e-01 9.7271356e-01 8.4383151e-01 9.6981983e-01 9.7510267e-01 1.0112663e+00 7.8730400e-01 1.0299498e+00 9.9307979e-01 9.0239520e-01 8.5428231e-01 8.8972742e-01 8.5933162e-01 9.6625934e-01 9.4175449e-01 9.9120729e-01 1.0503963e+00 8.8223053e-01 1.3261434e+00 1.1063209e+00 8.4058398e-01 1.0844267e+00 1.1153093e+00 1.0092643e+00 8.9585237e-01 1.0599818e+00 1.2321707e+00 1.1359624e+00 8.3503556e-01 1.1792243e+00 7.9159781e-01 1.0830419e+00 1.2181870e+00 9.9888500e-01 1.0227144e+00 6.8557277e-01 9.6836193e-01 1.1061227e+00 1.0883453e+00 9.5681974e-01 9.9436299e-01 1.0304323e+00 1.1273949e+00 1.0735563e+00 1.0582583e+00 9.6040272e-01 1.0032137e+00 8.4900547e-01 1.1035351e+00 8.7867480e-01 9.6433176e-01 9.1850122e-01 8.9337435e-01 1.0449390e+00 8.9639384e-01 9.6704971e-01 1.0084258e+00 1.0528587e+00 1.1764481e+00 1.0913280e+00 1.0136672e+00 1.2737156e+00 9.5130359e-01 1.0367909e+00 1.1983402e+00 1.1319901e+00 1.1117462e+00 1.0343695e+00 1.0838628e+00 7.5266057e-01 1.0763316e+00 8.8067924e-01 9.6734383e-01 9.8800551e-01 1.2265742e+00 7.8833055e-01 1.0338670e+00 8.6666625e-01 9.9039950e-01 9.7142684e-01 9.3138616e-01 8.5849977e-01 8.5486301e-01 1.0516028e+00 1.1105313e+00 9.5943505e-01 9.8845171e-01 1.0566288e+00 9.9712198e-01 9.5545756e-01 1.1817974e+00 9.9128482e-01 1.0117892e+00 1.0979115e+00 1.0493943e+00 9.1318848e-01 9.3157311e-01 8.7073304e-01 1.2459441e+00 9.3412689e-01 1.0482297e+00 9.4224032e-01 9.5134153e-01 9.0857493e-01 9.7264161e-01 8.2900820e-01 9.3140549e-01 1.1330242e+00 1.0333002e+00 1.0117861e+00 1.2053255e+00 8.5291396e-01 1.0148928e+00 8.6641379e-01 9.7080819e-01 9.5457159e-01 9.5207457e-01 9.3539674e-01 9.0769069e-01 9.5322590e-01 1.1181803e+00 9.9765614e-01 7.5370610e-01 1.0807114e+00 1.0804601e+00 9.0214124e-01 8.7101998e-01 1.0167435e+00 1.2045936e+00 8.7300539e-01 1.1054300e+00 7.9145574e-01 1.0279340e+00 8.7623462e-01 1.0034756e+00 1.0386933e+00 9.3910970e-01 1.0028455e+00 9.9868824e-01 9.8752945e-01 9.8319327e-01 1.3110209e+00 8.6180633e-01 1.0993856e+00 8.5912563e-01 1.1303979e+00 9.8690459e-01 9.6910090e-01 9.1456819e-01 1.1525339e+00 1.1064552e+00 1.1062255e+00 9.7226683e-01 1.1091447e+00 1.1072238e+00 9.6544444e-01 9.6681036e-01 9.3247685e-01 9.6854634e-01 1.1035119e+00 1.1317148e+00 9.5557793e-01 9.8908485e-01 7.4873648e-01 Added: trunk/scipy/cluster/tests/pdist-cosine-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-cosine-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-cosine-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 2.5695885e-01 2.6882042e-01 2.3470353e-01 2.9299329e-01 2.2742702e-01 3.1253572e-01 2.4986352e-01 3.0770122e-01 2.5191977e-01 2.7931567e-01 2.8133743e-01 2.6316239e-01 2.6067201e-01 3.2982339e-01 2.8993002e-01 2.5506356e-01 2.8728051e-01 2.4952121e-01 2.8613379e-01 2.6894157e-01 2.3606353e-01 2.1670935e-01 2.3470242e-01 2.4294172e-01 2.4376454e-01 2.3228195e-01 2.3554918e-01 2.4851241e-01 2.0917546e-01 2.4971488e-01 2.4264224e-01 2.7405461e-01 1.9086415e-01 2.6346574e-01 2.5908801e-01 2.2138495e-01 2.2910721e-01 2.2169919e-01 2.0660065e-01 2.3207102e-01 2.5554688e-01 2.5153751e-01 2.6073682e-01 2.0919640e-01 3.3984433e-01 2.7503792e-01 2.1709889e-01 2.7068095e-01 3.0307041e-01 2.4529612e-01 2.2987015e-01 2.7736967e-01 3.0310708e-01 3.0544316e-01 1.9205388e-01 2.7098021e-01 2.0722466e-01 2.6387343e-01 2.8998308e-01 2.2633010e-01 2.5177075e-01 1.6347011e-01 2.4036389e-01 2.6485871e-01 2.8491965e-01 2.2273619e-01 2.4511873e-01 2.5930533e-01 2.6589995e-01 2.7797191e-01 2.3357373e-01 2.4279909e-01 2.3544532e-01 1.9447286e-01 2.3993534e-01 2.0856243e-01 2.2125251e-01 2.1988206e-01 2.0590152e-01 2.6441952e-01 2.0052739e-01 2.2978496e-01 2.4483670e-01 2.3879510e-01 2.9398425e-01 2.7541852e-01 2.3777469e-01 2.9151131e-01 2.0672752e-01 2.4584031e-01 2.7475025e-01 2.7064343e-01 2.5603684e-01 2.6165327e-01 2.4233155e-01 1.7892657e-01 2.6111203e-01 1.9965682e-01 2.4201634e-01 2.6281353e-01 3.1928221e-01 1.9731963e-01 2.7752862e-01 2.2633080e-01 2.6783167e-01 2.5447186e-01 2.6424243e-01 2.1960672e-01 2.2984242e-01 2.8788736e-01 2.8681630e-01 2.6949787e-01 2.3993685e-01 2.4440073e-01 2.5010397e-01 2.3230769e-01 2.9879682e-01 2.4200592e-01 2.6957748e-01 2.6073240e-01 2.6355347e-01 2.3403674e-01 2.2411413e-01 2.2956729e-01 2.8105976e-01 2.2913304e-01 2.4898608e-01 2.3304000e-01 2.2692988e-01 2.3728251e-01 2.2552243e-01 2.0364084e-01 2.3359511e-01 2.6619167e-01 2.6666588e-01 2.3666880e-01 2.7239113e-01 2.0146697e-01 2.3045559e-01 2.1695523e-01 2.1387991e-01 2.2366404e-01 2.2809635e-01 2.0901297e-01 2.2441100e-01 2.3418882e-01 2.8552218e-01 2.4609015e-01 2.0282492e-01 2.5940295e-01 2.7407006e-01 2.3344890e-01 2.1179142e-01 2.7047821e-01 2.9832768e-01 2.0859082e-01 2.8881331e-01 1.8384598e-01 2.5286491e-01 2.2012615e-01 2.3615775e-01 2.6845565e-01 2.3356355e-01 2.7164193e-01 2.4179380e-01 2.5247973e-01 2.5637548e-01 3.2126483e-01 2.3100774e-01 2.8832546e-01 2.0043257e-01 2.7918333e-01 2.4884522e-01 2.2904723e-01 2.3738940e-01 2.9461278e-01 2.9782005e-01 3.0332073e-01 2.5175971e-01 3.1203784e-01 2.6611535e-01 2.3713507e-01 2.2203585e-01 2.3602325e-01 2.5093670e-01 2.6860434e-01 3.0137874e-01 2.3759606e-01 2.6840346e-01 1.9200556e-01 Added: trunk/scipy/cluster/tests/pdist-double-inp.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-double-inp.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-double-inp.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1,20 @@ +8.278938049410748956e-01 9.035293984476246987e-01 1.862188994679486731e-01 8.921151312310462433e-01 2.061859119379583216e-02 3.440636727385729676e-01 1.533779912830328662e-01 5.701372300009802663e-01 5.510020730211558915e-01 1.792362258426003496e-01 8.086175120876580857e-01 6.115487184317183189e-01 1.233471787164852618e-02 1.441643531871039663e-03 4.044309209045688913e-01 3.561398959499905148e-01 1.281985712929750720e-01 8.663300833847481508e-01 8.696027786291581352e-01 3.611727370363766454e-01 5.283537658772616830e-01 1.440241088090119526e-01 3.112457227138950566e-01 6.031280796897889873e-01 9.230324792742518047e-01 2.332121881136874908e-01 3.192652267403439659e-02 3.466206294995559656e-01 2.988687728046366399e-01 5.116749542048093513e-02 2.584975830914494344e-01 4.302023478042227289e-01 8.003972751713522849e-01 9.364931911368097328e-01 9.737098649964673891e-01 4.718038453972229762e-01 4.526591686607864817e-01 1.056485678520797666e-01 5.883019714285405710e-01 3.846092237676981274e-01 6.461500053435473845e-01 1.013239729848824933e-01 1.216151561651189761e-01 5.159668929484659827e-01 8.452074473510227115e-01 9.885170962247968873e-01 7.623883073490128615e-01 2.291163243615434997e-02 5.775530980802381364e-01 7.820699896828091635e-01 8.239186345842965942e-01 3.391800105260227571e-01 9.546318451614538292e-01 3.789677917867695367e-01 4.526533399649290690e-02 8.366786473238587707e-01 3.082636811049858094e-01 1.173936820793450853e-01 7.631994969169442200e-02 2.997416650722183329e-01 5.795208655160232203e-01 3.942350892542011431e-01 1.175126383297261379e-01 4.928232513950027149e-01 9.421293996225950096e-01 8.365391053841342295e-02 6.868059693571844093e-01 3.589527962429440722e-01 7.592939427166059962e-01 5.623849466131448649e-01 2.110746828032050715e-01 9.824683704668600859e-01 2.661230142246236996e-01 6.162272315007123469e-01 5.023254536607497656e-01 5.202854476669782624e-02 5.835090668842095596e-01 7.864642118889143552e-01 2.504012386867506823e-01 6.728308641135989365e-01 4.610793534576096420e-01 4.820508770515909980e-01 9.720403251022265989e-01 3.100069285263498120e-01 7.681017126461753275e-01 7.956539306007082146e-02 2.593389637887737464e-01 1.137852590403054531e-01 3.885303073284454012e-01 8.599094660075957686e-01 5.215167875918280682e-02 1.620908248572288102e-01 1.859236090457663249e-01 6.247716512610480555e-01 3.415128495520775020e-01 7.034903368378029320e-01 6.037564640019568163e-01 2.338969434423310290e-01 1.002104885609900187e-02 7.866058403969036217e-01 +8.033694116033356369e-01 8.653264545544031572e-01 7.468340410754038539e-01 6.362430919910603278e-01 5.120006306625468628e-02 9.503348372633585450e-01 4.697732609626817935e-01 4.221305288459429317e-01 3.153452119838391354e-01 2.991014843442657556e-01 1.190667967280257811e-01 3.486567714509342109e-01 8.289493649885054660e-01 8.454811050800014049e-01 9.149673018211901265e-01 7.708707837193897738e-01 2.640157732122547785e-01 2.107897022189605396e-01 4.207633055054439408e-01 6.719500284654699174e-01 1.458031684893063007e-01 1.800412735886125493e-02 8.402733435220011149e-02 4.206760156883160295e-02 1.376933515041314227e-01 1.716717341022133692e-01 1.788220727652158892e-01 8.224310433402118869e-01 7.729093666867475898e-01 2.064223621025984556e-01 9.592092036227207741e-01 8.312490243754996344e-01 6.673289360369902834e-01 4.632847903690773261e-02 7.643954098358983762e-01 9.359341525615098023e-01 1.914966319163026176e-01 4.536590469402868031e-01 8.640836016538007147e-01 3.941529178175462444e-02 5.602101995205478469e-01 9.263806161941660067e-01 1.555995325944817820e-01 6.172208102950116348e-01 6.335576752812099866e-01 9.766975460368043649e-02 4.475795689539874278e-02 3.248842796104995934e-01 5.700377122149502540e-01 9.066962967256807504e-01 5.458460621505676347e-01 6.833401285581487405e-01 2.887244409544044155e-01 1.316338647016834784e-01 2.325673305245992140e-01 4.150121963188406760e-01 3.834845466366055833e-01 8.149365773968725302e-01 1.867003849450201702e-01 3.170322173543018707e-01 6.832093662682684476e-01 1.729728518929105618e-01 9.236557359702636250e-01 9.152941252150086360e-01 7.224879983096620384e-01 8.557920626598064517e-01 5.344883059251644974e-01 4.876873274449112783e-01 8.308277804506420949e-01 3.916624489322212410e-01 3.459695122273966916e-01 4.033512499027409604e-01 6.555726444913008155e-01 7.138452409380238173e-01 1.683937314599968094e-01 1.769382143486440961e-01 7.588683655178136700e-01 3.750589892880819010e-01 7.525176245126207197e-01 6.083961152538303052e-01 1.145972309907993258e-01 6.239614485809552580e-01 1.307655482065895880e-01 8.530458750670916190e-01 4.801602070124768584e-01 8.168122189863546989e-02 3.793139622744635675e-01 1.496986997776840189e-01 7.129023878302899186e-01 6.830979237438047358e-01 7.635375943876505644e-01 1.824004963251233402e-01 5.764695848992339444e-01 8.865113248731604223e-01 5.784337085544002388e-01 9.700026628755119562e-01 7.318207347905059112e-01 3.851401393936705331e-01 1.774291851193399161e-01 9.763423229242296220e-01 +9.287178470949695175e-01 1.748282433617460718e-01 9.238531711586964734e-01 8.291274445125006443e-01 9.513259272578692416e-01 7.486316801165745494e-01 6.257378457524477300e-01 2.062711693536473101e-01 3.970721244184766130e-01 2.738325225026445597e-01 8.735038948299954642e-01 5.415282140033768066e-01 5.176317904298315398e-01 5.347036264518250093e-01 7.482056965410627258e-01 4.140672582824351800e-01 8.709067272363142376e-01 9.499605569181273079e-01 5.380266748336398619e-01 4.369252161707162241e-01 8.235722216228258397e-03 4.308187193646527691e-01 6.030581482859224129e-01 7.316831195156517920e-01 5.540499846834291420e-01 2.044203040111662872e-01 8.645251782981867583e-01 1.816095717570278545e-01 9.639119168018674966e-01 3.572031072322333634e-01 5.580226816834680248e-01 5.586629875016585478e-01 7.213854320902782780e-01 8.513998260042524580e-01 6.308764347277173723e-02 4.299855362100638567e-01 8.789303907444128150e-01 9.178850359236285783e-01 2.275205845091231582e-01 1.899395443939643213e-01 7.103070862773533944e-01 9.450015289553428399e-01 1.691856364522159595e-01 7.368719616877857925e-01 9.600189536623833231e-01 5.128846522932454244e-01 6.209162727118655578e-02 7.992250598838029907e-01 9.141050280518014937e-01 1.471297785256820978e-01 7.466162372930541524e-01 4.656107650642931084e-01 6.399324135161845728e-01 2.023617619481610230e-01 1.019104648900100996e-01 4.390693688536728700e-02 9.822620353006089600e-01 2.881951852926285529e-01 6.191575015960482098e-02 8.989580763251467932e-01 4.635958631890454429e-01 1.781973138114967270e-02 7.906911683818984571e-02 6.525270776225711167e-02 3.620583622807886925e-01 2.651673718940715796e-01 5.829372395929610651e-01 2.118159824373908595e-01 5.900287159143694504e-01 9.405929925178391215e-01 9.262415619063500971e-01 5.639581506302312475e-01 4.529556154689695635e-02 2.873819210518682166e-01 5.718545934306838996e-01 9.877670791317306742e-01 4.120364488714320927e-01 9.896078045634184583e-01 3.796586997026456523e-01 1.178183652203194098e-01 6.641068305236120795e-01 4.045960610587706618e-03 2.262690437428437340e-01 7.839938005832693957e-01 7.695391333937223743e-01 3.713918392552509884e-01 4.245533341514018399e-01 1.475072494020331915e-01 6.011975181419888514e-01 5.158174017998343741e-01 1.788706151398071764e-01 8.880707130134481986e-01 6.463351030474082659e-01 6.499920635615744624e-01 8.570273676455353318e-01 6.055019270899113515e-01 2.123561211054603159e-02 2.027688787664126968e-01 1.930834215328548487e-01 5.131906052747271518e-01 +2.599990881903107010e-01 6.767857524909899336e-01 7.188217446352963558e-01 3.037178903357997672e-01 4.252381412838680541e-01 4.070924411439535984e-02 8.426710493038247485e-02 8.301517457289483426e-01 8.254603255702420705e-01 7.258533909453509514e-01 9.958706809470796451e-01 1.323408451651194584e-01 8.523995455245143571e-01 2.572405385832454705e-02 4.715363690065482727e-01 7.920130365690022378e-01 7.613745641534582775e-01 5.108305991695683002e-01 7.908714335912382376e-01 4.641131983754837043e-01 3.112627109831845873e-01 4.218013908715474436e-01 3.291577909008427394e-01 2.538715054071232213e-01 1.362470842487485401e-01 2.716429790290709745e-01 1.485325814161112534e-01 4.514539027544387517e-01 6.900835128673067365e-01 7.793407072946112457e-02 5.938024345270752624e-01 1.497853829906865553e-01 5.399567982652856424e-01 1.419209916759478496e-03 7.719776132867679497e-01 3.130795105576239523e-01 6.670071611167494030e-01 8.900596881158256979e-01 8.011158503301568645e-01 7.089295605187424520e-01 4.671116382997058114e-01 6.682965170673403899e-01 6.524835265739736823e-02 5.454288420771494783e-01 7.751910790556310049e-01 8.192595541387335256e-01 3.098855848167891835e-01 3.689971355659119601e-01 8.666507475054133769e-01 2.749042684253171220e-01 3.566565602478318775e-01 4.838173174723044978e-01 1.032975933616413489e-01 5.063065339610417492e-02 5.791168455729079900e-01 3.573337411289496668e-01 6.714098909652352898e-01 2.917057662433912846e-01 2.654964332620638467e-01 7.171804039048814694e-01 3.314488637898249657e-01 5.230399837442840649e-01 6.866534136026025692e-02 1.252966394621071178e-01 5.349397882659551184e-01 2.841423847455760709e-01 4.158473635710734362e-01 7.197062989831272128e-01 5.123869045047864113e-01 8.675622821594339840e-01 8.097441845042540054e-01 7.317178252133832439e-01 3.300847596465853462e-01 5.922311859141077273e-01 8.852619511417836318e-02 2.673412917259408994e-01 6.878259052441990651e-01 3.223000927116328462e-01 8.859387123976615319e-01 5.722722388300067742e-01 8.254877606669521750e-01 5.705299682290687624e-01 7.046478734972855262e-01 1.316324413616759559e-01 3.056358395675535800e-01 2.396516834600909140e-01 2.041201422493257311e-01 1.610755140653103989e-01 1.617012564641111538e-01 4.449920510036902144e-01 2.731012972755201274e-01 7.826874666257994662e-01 5.193612375350010746e-01 8.688804522977213729e-01 3.742157602758655610e-02 6.649628920608219307e-01 5.978149424619171315e-01 5.345645500553952711e-01 9.443202650415919441e-01 6.105837075491723498e-01 +6.387761328141735584e-01 4.210087412162694109e-01 3.777306694964789324e-01 3.576349403292201634e-01 7.272699618880260619e-01 9.173392803607671731e-02 1.212535698300880593e-01 3.871229381194544183e-01 7.735150198351389284e-01 4.687200483013695962e-01 5.161778571874678923e-01 9.839646447226980674e-01 8.626932748911960713e-01 9.618485576577924245e-01 2.997996427525421170e-01 3.955404657388794654e-01 8.480126027102616870e-01 8.194992325050480808e-01 2.800213436873294492e-01 7.188391466620779324e-01 2.289766105875049584e-01 3.838547514028287644e-01 1.363553401061209369e-01 2.131328253542326134e-01 2.666779468144075960e-02 3.252883844200405994e-01 4.207860197469600605e-01 2.991365385037647595e-01 9.180779845534067229e-01 8.787338732192649937e-01 5.404510999105649471e-01 1.735493827761729335e-01 7.405224640747264386e-01 3.927355563629583157e-01 3.957109873399460298e-01 1.313029813325972128e-01 6.434498219738993274e-01 7.162213694578050127e-01 6.454998257494671821e-01 3.808124530008022424e-01 2.027201015737234435e-01 6.667632842770417900e-01 1.609491052365198405e-01 1.192413785409307536e-02 4.546773323526854815e-01 7.733541911050207940e-01 3.902525737195561284e-01 4.006023779897505133e-01 5.156517815815246930e-01 6.135685498584592112e-01 7.062153114980724844e-01 5.505858882117883324e-01 3.541308807182554919e-01 5.237151122342533771e-01 5.230649229131387745e-01 1.973541027697351957e-01 7.940327858595511712e-01 9.998588700623055603e-01 3.878271015153827994e-01 4.455006584967207139e-01 8.376414508056347907e-01 3.310833863524501597e-01 8.020469097392601832e-01 1.890327633084128989e-01 3.830289472395409511e-01 8.605040171046141051e-02 9.978185524023941433e-01 8.333890591892906263e-01 4.509013468741837061e-01 6.355778557686052599e-01 1.422515991097305088e-01 9.549891485963732940e-01 7.535776302868563148e-01 9.306005301880662106e-01 2.444330347211679522e-01 5.828218427569508142e-01 1.261938242968304591e-01 2.829188731405173352e-01 8.100246952078660190e-01 2.032739130996042975e-01 3.997268448390065565e-01 3.882777703107541667e-01 1.102505652624736765e-01 5.826634725328041498e-01 6.508734477956333864e-01 1.777287661702166011e-01 4.857051012052149286e-02 6.850537712379254351e-01 5.012281307761055071e-01 3.329154880061502286e-01 5.006261767216675374e-01 4.542081454976160115e-01 6.777801995399822532e-01 4.271303586474960445e-01 7.820470659692947413e-01 5.143462618485082904e-01 4.071273891563575997e-02 8.503383643856671226e-01 6.877485768345151795e-01 6.498843855014626580e-01 +5.539512747016193117e-01 6.329206647391879548e-01 2.798533500321682688e-01 4.825977295850051307e-01 7.625297023172977751e-01 9.081309101427640362e-01 4.124792086535029600e-01 3.647019658319609059e-01 7.529595202332928228e-02 3.072404010876803593e-01 7.890673660964639957e-01 4.079781478915127657e-01 1.440519120695739064e-01 2.538968953804546791e-01 1.595028243568367143e-01 9.066545851872198636e-02 6.367601114674349416e-01 7.622263643880089479e-02 3.015728236404162654e-01 2.424070469873378375e-01 5.711440390241000475e-01 5.717001375511508998e-01 2.237853674032181939e-01 7.112101625753678436e-01 4.321054197012103026e-01 2.505322169010260058e-02 5.877307077139551916e-01 4.415771174397812304e-01 3.766022855145171322e-01 9.803490652619811785e-01 1.229258314111529860e-01 8.108351868714478439e-01 8.558595456964329662e-01 2.168217533833206589e-01 2.034022719386595623e-01 8.687457137579783772e-01 9.013327195854559104e-01 8.156766512673154779e-01 2.717576187546973943e-01 1.756417893371479133e-01 7.555856977566548505e-01 6.708809351312817748e-01 8.998789237886926085e-01 1.936367585946979775e-01 7.949724635465026390e-01 3.164799312763589834e-01 5.493048513173155456e-01 1.608917269168268493e-01 3.048667492191803330e-01 5.599401537727016764e-01 5.779501360842279611e-01 1.296714605309662316e-01 9.160752328055997706e-01 8.058674476110374574e-01 4.385508937505578908e-01 9.212419718012100356e-01 2.249887451242467140e-01 6.283927745352599903e-01 3.778992451536005159e-01 3.571958698867505611e-03 7.276526470528231760e-01 9.051678673805297892e-01 8.465837072484881931e-01 4.548317505393462135e-02 3.189318261926020748e-01 4.446388607398673587e-01 4.292356336344156365e-01 4.203980977718795309e-01 4.698059253071955599e-01 6.151991200848159203e-01 8.479986139404802614e-01 9.870993262459623052e-01 3.164206525899861955e-01 6.464672171639846976e-01 8.508781429592480183e-01 4.733667503354813677e-01 8.076014176740163863e-01 6.671443255679101458e-01 6.639213267047979761e-01 3.681688930741919830e-01 4.679870252651611162e-01 1.790041740686979521e-01 8.446070273663058847e-01 3.350737544979878191e-01 6.600272349677447359e-01 4.356083218487936115e-01 7.995134167346013010e-01 9.083660261041469619e-01 9.743975306734570241e-01 8.144839650654719376e-01 6.865011984586443239e-01 1.709747281999153268e-01 8.534933687161740945e-01 9.494753729726415070e-01 8.140124992294850426e-01 8.936241255316055287e-01 9.087976860818796077e-01 9.030687493451383663e-02 4.025785149840914734e-01 9.592005611533803711e-01 +5.714058727476275523e-01 7.913573761505965365e-02 9.301773447377043036e-01 4.302822433307075256e-01 4.618892554175407783e-01 1.882471300213742760e-01 6.231472878215863487e-01 2.350437450940777717e-01 8.483410480771292894e-01 8.580803842040533036e-01 4.246398783388435350e-01 5.667321565946502604e-01 7.247417018955526480e-02 5.373984417482219333e-01 8.794242091541510931e-01 9.699025554453030162e-01 8.254197752548814160e-01 7.739723972867470492e-01 6.365819416181199841e-01 3.451230687021222820e-02 1.829102490094791644e-02 9.179618383026147965e-01 4.481667270072077214e-01 4.771270250445739380e-01 1.588469404953456454e-01 3.766332499200618633e-01 5.057026248713025751e-02 9.125900914275182352e-01 8.438133644246305076e-01 3.282972411719701222e-01 6.042003956122835584e-01 7.423456085393266290e-01 1.389012737541106546e-02 3.674754266702850991e-02 2.126646727703802586e-01 3.085666164246750887e-01 4.303440338750976757e-01 1.749037978865556342e-01 2.177699993322510519e-01 6.675614739991906355e-01 1.926533336347433512e-01 8.032010572660308600e-01 4.611412981769049679e-01 9.907201268457492827e-01 8.973785930837320235e-01 6.286342392657409128e-01 8.111266245859546364e-01 1.154230969025437092e-01 8.382880466301794176e-01 1.053753927827069115e-01 9.921712862234919328e-01 9.041662667920956631e-01 3.626267376021269362e-01 2.262225368932846425e-02 8.669003741626111204e-01 7.597054897704164089e-01 4.700318514995387442e-01 4.338185014241978665e-01 1.205425463362067573e-01 2.413879270602589111e-01 5.483334840461459025e-01 2.042653841254596925e-01 5.452588940366013270e-01 3.164646091706100339e-01 1.878958248945691301e-01 2.188622304737641855e-01 2.970982599823450698e-01 5.952148400199362976e-01 9.614251220149501176e-01 5.446813400697393392e-01 5.900748097930779146e-01 2.653062526715309621e-01 5.459933097767216692e-01 3.174185404661935550e-01 1.412133354129242457e-01 1.487441669790685594e-01 3.953776242211952674e-01 5.274261039692862418e-01 1.756132307607755072e-01 4.481942852746899630e-01 6.390660088765629521e-01 2.860380430081067571e-01 5.866902519902850166e-03 3.026687645174785946e-02 1.952533570196290924e-01 2.154769096186736066e-01 8.920573593276575064e-01 5.644513191915436767e-01 5.551464696654353492e-01 4.378199413349500579e-01 8.685737643974280608e-01 7.493934764293597173e-02 9.556749726352036234e-01 6.386433482536227890e-01 8.714694524097754691e-02 1.722786161701279628e-01 6.526867532768643176e-01 8.950304705281527662e-01 6.158198776753203152e-01 9.587176904005377809e-01 +7.705718397401561948e-01 3.165816092999733655e-01 4.334200859975760878e-01 8.639807015515663657e-01 5.576514209532534849e-03 2.456745447057938625e-01 1.664686313299922338e-01 9.637084729617834133e-01 1.083448720752323569e-01 1.865218070380464388e-01 3.730358890475884426e-01 5.015351872138350542e-01 7.420710795841709562e-01 4.919420674769692248e-01 3.426558201886464872e-02 8.669984854934246199e-01 2.204243734202966376e-01 4.109792246853891662e-01 4.361732572946559472e-01 6.819306998053020763e-02 9.986304248057148447e-01 4.119289455392274313e-01 8.533050041845835487e-01 3.416914861912183632e-01 6.522191951039880697e-01 4.162803668786793088e-01 9.051674379917418189e-02 4.552378661306888397e-02 2.122677193466918633e-01 7.461518531655018105e-01 4.654688019259497489e-01 7.877564083548750373e-01 4.518328005682387127e-01 7.173857464237374248e-01 6.940056370290903498e-02 2.804574410412373764e-01 6.095681113112718652e-01 3.680596478602831123e-01 1.814569150719304025e-01 6.505055517979729807e-01 2.759585245701871026e-01 1.429501104786028431e-01 7.813891153083207808e-02 8.925314279991185540e-01 6.692056941902108091e-01 1.915141341107173822e-01 5.750233129581091562e-01 2.051961006251528108e-01 3.849013692629975614e-01 9.503788222043518807e-01 7.690419386411734282e-01 9.978147530014782607e-01 1.719584162437415298e-01 4.890758882401113894e-01 7.195660736040896399e-01 2.485818040997200828e-01 9.706486601870933928e-01 5.182604282071262558e-01 8.082072245463804983e-01 4.889961284821118248e-01 8.042893959057633158e-01 3.200685313413229593e-01 8.983245016887355661e-01 2.811495336955205371e-01 3.986095833814048417e-01 8.607229214132059436e-01 4.827620119717191960e-01 6.715610252037491623e-01 9.330824374137768329e-01 7.537710530085762750e-01 9.840804224010484269e-01 2.319352541177217564e-01 9.569114943157627229e-01 5.821928104654411351e-01 6.700479524814679788e-01 5.663434680086896211e-01 8.851091082101365526e-01 6.800562815862243315e-01 3.578475213752868589e-01 2.900164669281133367e-01 8.379170683569914235e-02 9.929972839740475177e-02 5.946248553621906741e-01 1.991332889320840405e-01 8.115065723822508792e-01 2.023388190440008616e-01 4.056545651129230823e-01 2.966825350250481552e-01 7.457176343507545546e-01 9.856015771246517954e-01 2.264338016147812160e-01 8.366528670045663141e-01 6.116829813603242849e-01 2.605933184296719274e-01 5.765962146558850643e-01 5.064075092266390188e-01 5.499615769589756287e-01 9.240234698632640020e-01 7.169900155229913530e-02 3.544181364560751168e-01 +8.154844535553099627e-01 4.797965609394789777e-01 7.476703385713100447e-01 9.086708404761600910e-01 3.191752505450355937e-01 7.611128630021511965e-01 6.246790343299296611e-01 1.942001426217137006e-01 2.789860414631386565e-01 3.236359785042408621e-02 3.178191288741717413e-01 8.372264298357038337e-01 8.872692914664047636e-01 9.589758852077276963e-01 3.123722260380168425e-01 8.980164015338999439e-01 7.260784140459818348e-01 6.567013512265649222e-01 1.028743505926521529e-01 6.821705410750319443e-01 6.889838995316139858e-01 5.587525493094736007e-02 6.921487028366646310e-01 3.616312929861494885e-01 1.673758008792780583e-01 6.626504595920326146e-01 9.125680913222075086e-01 1.424077784972291871e-01 6.508496429060767197e-01 6.615417385775157477e-01 9.654167310675311198e-01 5.536662974550183858e-01 7.092622144968085962e-03 6.694595400455760625e-01 1.828533619119211417e-01 3.421514408394116247e-01 1.242580151818144518e-01 9.888774797458224075e-01 9.777955172739735135e-01 4.271370765628749178e-01 1.211608384809655936e-01 1.580132417172936954e-01 3.242705395708289640e-01 3.268994391754735940e-01 5.213767653645562383e-03 4.475169480357120699e-01 9.593245219293577986e-01 6.994304536782350867e-01 7.063863152769014331e-01 8.381620829497931080e-01 2.760441799736219615e-01 3.755200946645842475e-01 3.627729621737311172e-01 9.518310606719182498e-01 3.577273025276901386e-01 3.991159901003488164e-01 4.187060513068554535e-01 7.422605403637314581e-01 6.697944269780702342e-01 6.020599837037767799e-01 1.571185850817550245e-01 7.519860911185742847e-01 6.635775704496444938e-01 9.487848173531471252e-01 7.900030232338028924e-01 4.143783957270819052e-01 5.618429740858444932e-01 3.737804619062014000e-01 6.179941187802344693e-01 6.553638605616040058e-01 1.009709416658691739e-01 4.935037098582963910e-01 5.485489972455533936e-01 1.024147956480448984e-01 1.195764707555347917e-01 4.910516327810896531e-01 3.551185778630389089e-01 3.857601645798814927e-01 2.074975219600547760e-01 2.084038664460790002e-01 5.268616653491025037e-01 6.948014877618717833e-01 6.179744044618615817e-01 7.063658085955483168e-01 7.925757227686872630e-01 6.199016959584816577e-01 1.163676037434490107e-01 7.425752264755586252e-01 5.403115665133301215e-01 2.546191951391015840e-01 6.961300925345208501e-01 4.003013072125547467e-01 5.906120962720950995e-02 5.879915846330325824e-01 1.213602408288709800e-01 3.801780679842765576e-01 1.731477742402802722e-01 4.624568816669496485e-01 3.304453744619206823e-01 8.810445876116090869e-02 +5.140190515373614932e-01 1.419225260054487459e-01 7.777845802285945354e-01 3.327562899409282071e-01 8.916875699762913943e-01 7.212852862736146564e-01 5.727327199433507321e-01 5.897820225918504189e-01 7.318614954542906892e-01 7.393985144455500480e-01 4.531340740296823100e-01 9.903061584426188224e-01 4.213350938331624773e-01 4.542342471963995987e-01 9.788786426453045530e-01 1.881707000343846303e-02 8.005433413647761176e-01 1.523502822273363755e-01 5.630164732287495921e-01 5.946603842470724599e-01 1.225547698678740582e-01 1.531136594724622491e-01 8.157973612638946825e-02 2.752046015644330490e-01 6.809045821946161370e-01 6.455289724528190387e-01 3.830356726830793646e-01 4.446144649678575034e-01 4.969038423960672191e-01 5.497873820641221432e-01 9.471879627821714331e-01 5.933046675329255448e-01 4.099233758501530378e-02 5.790409810134594659e-01 9.546095885251496549e-01 2.608616052375664074e-01 6.910160339170060562e-01 1.293709850476291168e-01 6.407264616302255078e-03 6.186037089828009261e-01 5.537861302543241049e-01 3.527421038298221845e-01 8.033232052121624944e-01 8.128114152830284711e-01 8.319982582278713235e-01 5.939566376046836460e-01 2.291090283499520597e-01 5.438101817725821130e-01 6.881146379117278888e-01 2.421968586304659166e-01 5.874047918543783275e-01 6.210102709484541794e-01 7.041387566450251212e-01 6.959223476278774134e-01 9.133877300988062498e-01 9.230647706207778525e-01 6.856884219815310155e-01 6.997988808693775820e-01 6.177944932528769417e-01 5.512902545683161515e-01 5.818280341729102911e-01 6.538267999985679646e-01 6.946673485935980219e-01 4.817938258357623571e-02 9.352008817207906333e-01 4.774162142215661042e-01 5.768063588692976529e-01 4.589648891483899540e-02 7.998946815651652997e-01 4.434260476954369201e-01 9.850053510925722566e-01 6.648626681529369309e-01 4.606293826856903140e-01 3.309042418210563774e-01 1.438901922508034614e-01 7.986559119276418484e-01 7.037818421334554042e-01 3.605119534240813772e-01 3.785959549258922641e-01 9.562491516841659100e-01 4.997955143590974147e-01 1.029540300938682762e-01 1.819017177001992502e-01 3.665425750262368831e-01 1.688063588370778412e-01 7.030735208313992901e-01 8.922375654244527610e-01 1.055706412056253152e-01 2.664739907746691561e-01 9.906029568647586325e-01 6.043845090140997911e-03 3.495786295043534775e-01 5.989441999519146131e-01 6.776147193866479679e-01 7.012991789852640601e-01 1.825838783477321536e-01 7.612293578749116385e-01 1.564769891240175292e-01 2.762157292905387251e-01 7.641900040015234818e-01 +4.746013333880729768e-01 7.609202966712714788e-01 2.537820854162747830e-01 1.709362234877408460e-01 1.886635378734374813e-01 2.439567014093724229e-02 7.640304718272151741e-01 3.483216170435471382e-01 7.744289278738043514e-01 4.190437573644867353e-01 5.319091476394965934e-02 8.580130976087452233e-01 6.259446446786639529e-01 8.793213970773006150e-01 2.441023074890465994e-01 7.753405549489799098e-01 8.760187573193888300e-01 5.946480724009295393e-02 2.873093046571124631e-01 8.710837851946537924e-01 9.103181731924696596e-01 6.534637257615111272e-01 4.128420398577182793e-01 4.905858108576378607e-01 6.178275806701372108e-02 6.368043900016381320e-01 2.865296941219959148e-01 6.371773028539067241e-01 4.924322796636745325e-01 1.709313290387282080e-01 1.856892551689268700e-01 9.592782603102242289e-01 5.402593764193130976e-02 7.287312244390512506e-01 5.679467572000697073e-01 6.255587794305905724e-02 3.069660218141317953e-01 1.089960430557104232e-01 5.550748245336984965e-01 2.555948886689661803e-01 4.140925514039996980e-01 1.180376445052062628e-01 8.832322629884041820e-01 7.784546946701487169e-02 3.177678935473182698e-01 6.681804863429485764e-02 7.047099396645268854e-01 4.133897376851528582e-01 5.600656990480865627e-01 3.883995683475501837e-01 4.459430113152932362e-01 4.214077227574740681e-01 4.763369230200156235e-01 2.701480661168440545e-01 4.296286564389811824e-01 9.601402258758658936e-01 6.326999441846863359e-01 2.442086919688498670e-01 8.407708423957936938e-01 3.626867985638081437e-01 3.641441713291436733e-01 7.932397565989488530e-01 8.902073520619256941e-01 1.929173010337000838e-01 7.309376779324568973e-01 7.305852858337777977e-01 6.510197444582447313e-01 9.512661608643838695e-01 8.461467164366111016e-01 9.245490147941206605e-01 2.658844813385705663e-01 9.538758859344749208e-01 8.215517204998477041e-01 8.217795540390903097e-01 7.569662091300560780e-01 6.262685322871274218e-01 5.597770510574888725e-01 8.155720175123675197e-01 8.545688745180864965e-01 8.986051518529034610e-01 2.477911506572628708e-01 8.462580108996445860e-01 6.065941220995090255e-01 6.500490804973033665e-01 1.120463882674053169e-01 9.299049132942927010e-02 1.388364074229719858e-02 5.901199124540731367e-01 2.795110110544174464e-02 1.644097083463245124e-01 5.341029647603202646e-01 5.276816677181681570e-01 5.439849107754858304e-01 5.371677986392331405e-02 4.515163125788429488e-01 5.036243367087100964e-01 5.721818679625961801e-01 5.271368612400184617e-03 7.720961020546839304e-01 9.015383457479009266e-01 +8.301526916287945701e-01 8.704609696144033348e-01 2.955689129581380303e-01 1.762209253489944727e-01 2.698172933050072553e-01 1.138095349991521399e-01 4.092588531860634760e-01 8.202978121681584467e-01 2.822241377079557356e-01 6.117376205659387223e-01 7.169923068016897938e-01 9.310256256264415331e-02 3.989664052931106708e-01 1.651874953308862803e-02 7.890202597932294282e-02 9.068686774810821305e-01 5.203866694486933842e-01 4.297748572844445336e-01 5.208786995443430712e-01 2.163224881365530816e-01 7.274307306357226111e-01 1.675784956180090823e-01 5.969822786565782691e-01 8.959750832846602453e-02 1.253794151891943764e-01 5.352628522116801291e-01 2.562706125890066300e-01 6.030433202137867044e-01 8.330717547440393833e-01 9.603613683422040914e-02 7.569714244468559450e-01 3.184801677796517128e-01 1.667069341164499896e-01 3.132470247801235619e-01 6.417752836394801097e-01 6.433909425912354152e-02 4.056860213146201710e-01 3.166772891331335327e-01 9.574059746098845247e-01 1.492907964460536974e-01 8.311513764927496162e-01 6.652928354977717396e-01 2.396804722185036374e-01 5.812361618600220270e-01 9.724228681350225445e-01 2.853983236378453414e-01 5.337719354896472979e-01 6.779446197712412081e-01 5.485102006140557540e-01 9.010109155962182648e-01 5.724439967467525037e-01 5.965540527411405947e-01 1.598667990086183321e-01 1.363934512727023041e-01 5.327536522697270405e-01 4.123866715061276222e-01 4.617251396918636841e-01 6.935944951381239898e-01 4.300337419593377453e-01 1.892407993760835128e-01 1.666936825594794724e-01 4.625634184864588772e-01 4.805197636774838355e-02 7.003542850133466224e-01 2.130226006716084974e-03 8.678863343041013367e-01 4.874478520451258623e-01 7.043560228741558848e-01 6.317719270475393722e-01 5.372392256296196766e-01 2.982649812986511995e-01 1.272558612133412037e-01 2.467337555730741983e-01 6.546893200021091097e-01 6.291921159383098150e-01 8.505920470407707379e-01 4.046520490181828578e-01 3.875732096593392795e-01 8.551517214319142024e-01 4.152602284179877090e-01 9.587779137989138611e-01 6.977437468944928112e-01 3.240620775541913634e-02 4.025873770391376061e-01 5.485549335619134270e-01 7.146066156157020455e-01 3.012702534568838519e-01 3.526414480395153594e-01 3.309707144485515284e-01 4.315687014460974913e-01 6.641934530697197747e-01 2.172886798352815507e-01 4.807480925564590057e-01 5.006795397998469177e-01 5.818100901154411586e-01 2.107716091585690732e-01 6.606606051140029301e-01 9.317629042790995797e-01 9.840326342340242061e-01 5.752000964817773898e-01 +9.843444595454536872e-01 1.339523968066913540e-02 6.082172659959028671e-03 7.828244785439336662e-01 5.069653703872761819e-01 2.804896494365415327e-01 2.112385836660957139e-02 6.016479440778699228e-02 7.457477935084961818e-01 3.445503949245375397e-01 4.063494277166557200e-01 8.630275274433116817e-01 5.948396018456146850e-01 1.400867933474212457e-01 6.997522422654076646e-01 5.766519767930851081e-01 5.419976500582250889e-01 7.474121304089603735e-01 2.951600193008566686e-01 7.980170422334191827e-01 1.829036799578199757e-01 6.317636496261300749e-01 2.812612231140887431e-02 5.464747656105657381e-01 3.909873503320924204e-01 4.940850205957293406e-01 8.157850130814222611e-01 5.111092739445756150e-01 9.336823640685747439e-01 7.157105167170837445e-01 7.778989455994214097e-01 1.398722535910470466e-01 5.642653936300449091e-01 3.218717164845980028e-01 9.717427501967056402e-01 3.665791984428700134e-01 3.874321311211759156e-02 9.437600858738082188e-02 5.679526822961932231e-01 5.141385991358327079e-01 7.497840799582222715e-02 5.736515309094968318e-01 1.928132849879083954e-01 6.924244068001785823e-01 1.748389677952593146e-01 4.469577663506929532e-01 1.738527450963387455e-01 7.195287763517190793e-01 8.861150811892871682e-01 1.058443750714600506e-01 1.941789362229970894e-01 9.188374820700584422e-02 7.706736301449305104e-01 6.718642548609364828e-01 5.981029087121966237e-01 4.832880127232569434e-01 3.073688779938709148e-01 5.156312334804930009e-01 1.777418420119527553e-01 8.885462205165685079e-01 4.486254681289014723e-02 1.345398129556140132e-01 7.467627984379916484e-01 4.384565546058830643e-01 7.217750080760946263e-01 3.949550352625393890e-01 4.307950907642028593e-01 6.087680934849041270e-01 3.294516167246774874e-01 1.316682090209408962e-01 1.824857738754404046e-01 5.332379826483617524e-01 3.567136182864261151e-02 1.976220743086236631e-01 5.849349042822560296e-01 1.133174406357483344e-01 7.711522754393199675e-01 8.557306786807005183e-01 3.038353471344266143e-01 4.422747047768413875e-01 2.537160404215925702e-01 2.372714099723788328e-01 5.906462765375103396e-01 4.849909323133470007e-01 2.692576210504484813e-01 4.540849506602829821e-01 9.664935719107857759e-01 2.044371576459835804e-01 4.505417469690352616e-01 7.110722322201217249e-01 3.051357995214963870e-01 8.978937034341526457e-01 6.090501112506481185e-01 6.595415779178889215e-01 6.565426836745864581e-01 6.565608489824376059e-01 2.679102664248229626e-01 3.819533138204529443e-01 6.609794961162380744e-01 2.289558446859882856e-01 +9.274935298374649140e-01 1.174096651033715855e-01 3.030761852629033637e-01 1.605508209527917174e-01 9.601854834873225775e-01 4.341959513718630648e-01 6.320768160802121560e-01 4.213429090614078110e-01 3.695553969042019160e-01 5.965457437116089556e-01 3.520335041155040479e-01 7.702703502247409961e-01 8.571112772962534709e-01 7.904077282532658844e-01 2.247339318352784554e-01 6.823720204503556097e-01 5.883435710582129996e-02 6.786037033312407596e-01 9.721137137641507886e-01 2.042576970668320557e-01 8.394085754806240862e-01 7.433082729552867862e-01 4.072614159870893147e-01 7.451483066617257123e-01 1.699472962789440045e-01 1.753052015584344314e-01 2.255269204788400428e-01 7.794755643807432799e-01 8.407732260470973662e-01 9.301182862857163558e-01 3.701995309382508648e-01 4.481909027604019657e-01 1.261889085033987001e-01 5.600591735875248833e-01 8.244692493969552061e-01 8.969188061645969601e-01 4.802217973423368313e-01 3.556164122713412201e-02 3.393317823164623270e-01 2.491242957582864292e-01 9.863253789366602797e-01 5.585415885291432625e-01 3.702350606362231344e-01 6.766101432620400535e-01 6.999259389475386284e-01 6.676108316872160220e-01 7.870681827507105544e-01 8.746765411259082024e-01 9.125268371282718727e-01 6.638849997061806452e-01 3.253268113800632522e-01 7.968625619248901337e-01 7.584122525443606211e-01 9.028886850768532701e-01 5.381622293189292083e-02 8.097562873320752752e-01 7.092942088208666895e-01 9.915538877968065323e-01 4.319294903327922652e-01 4.307127933969153721e-01 2.768507739641907772e-01 8.076253078288621046e-01 2.569233696442670967e-01 7.595893829724666979e-01 5.768081727897018673e-01 2.537536777625452045e-01 8.874419624636734616e-01 5.091705681832693342e-01 4.811826624992353585e-01 2.794462461940371290e-01 3.846927898276129021e-01 5.129562951959991679e-01 8.515004062224775794e-01 7.103144978683579858e-01 9.526388607201888847e-01 2.367905569592337889e-01 9.137336039323161740e-01 5.722969943101696710e-02 2.019723935481291255e-01 3.098764675203513619e-02 1.121146613918624357e-01 9.937693067724532314e-01 8.476717958861412772e-02 2.059652110343795917e-01 2.139791918759540446e-01 9.137860316709250919e-01 9.530862653366889425e-03 2.027843281683039400e-03 2.506229951837134484e-01 6.244523528392044165e-01 5.523937894075592325e-01 3.712168074031840792e-01 4.218847794299319665e-01 4.827576239387890711e-01 5.244634168840578425e-01 5.182241092381567604e-01 3.308639956263292881e-03 9.370528021570383448e-01 4.694554875029453012e-01 4.950447554541728135e-01 +1.525818111800841814e-01 4.708012184002630107e-02 3.899035965341954846e-01 3.928304521031263929e-01 5.602286661727436945e-01 9.738256658043862313e-01 9.404465779766183475e-01 5.750862754958349088e-01 9.547546956257608741e-01 2.750275291553152535e-01 1.682773435862793265e-01 5.865928471016079726e-04 8.543378154943809255e-01 3.547649971465383079e-01 5.058056647397523031e-01 9.116332486700751137e-02 7.534666421106954726e-01 3.082429494433007733e-01 4.527145111847344916e-01 5.456680635225539255e-01 2.504131242494785914e-01 2.509240770568589296e-01 3.949236999582302898e-01 8.782959620323271821e-03 2.474641132111736752e-01 8.229417958971670943e-01 3.444225768479134420e-01 4.000027489436257522e-01 4.247741954177396417e-01 2.497745404169693373e-02 4.325768602588443423e-01 7.336592463477830117e-01 7.667663267650381975e-02 4.179022553581047683e-01 8.745172741480690126e-01 9.417705509525042817e-02 2.807522782799587446e-01 8.212710101351362590e-01 2.211181944001613386e-01 4.319929503523877168e-01 1.858636923768219873e-02 6.737037795085246694e-01 7.997187114913413275e-01 2.976552505976116647e-01 3.272347030789168887e-01 5.550935453236346406e-01 9.224109746648162522e-01 3.192827922106745708e-01 3.500098324549234530e-01 7.821988386980260888e-01 4.478417135239194380e-01 1.580956175222456572e-01 5.300807813550156844e-01 5.806154798468634581e-01 9.456842911054151868e-01 7.688127895655872956e-01 8.456527833650537840e-01 1.784229089865225770e-01 8.114517450321339087e-01 8.062506298824222428e-01 2.113482500442499523e-01 2.629226789210241666e-01 6.478686221690072022e-01 6.006672861605766300e-02 7.013679843242253131e-01 8.784753961212666828e-01 3.487138165323044880e-02 4.928426758517070461e-01 5.976224683315064512e-01 7.629063997052759616e-01 2.761721278953045422e-01 7.240740503283805696e-01 6.131065729985127888e-01 1.630885615792579957e-01 8.473783868551159060e-01 8.347614542399306448e-02 8.137265626844719657e-01 8.512508664918938539e-01 2.777097816703766320e-01 1.729154355214796990e-01 2.203382750835449766e-01 6.134780912629795857e-01 3.524352564238901753e-01 5.370314860129862256e-01 8.013986113284543578e-02 2.555842138998117852e-01 6.553915758947851389e-01 9.679125599178584061e-01 2.549566319678178150e-01 4.008180804370896633e-01 9.145789951670967310e-01 2.787926039163850511e-01 8.599455912576436933e-02 9.637558000691170967e-02 8.274101203974880692e-01 1.803747268179315411e-01 2.175735407836230095e-01 7.825994939720237742e-01 7.928519890958951599e-02 8.707949373106749213e-01 +6.398420210047787160e-01 5.739624494012524059e-01 3.359672805578653998e-01 1.130399363175038641e-02 3.349439685346782269e-01 2.315484030880912147e-01 4.575228302577399875e-01 1.149494135594463229e-01 2.888244352925943836e-01 3.625470995156252485e-01 3.795973190611611203e-01 6.567047810450010736e-01 1.484039742710284715e-01 9.273251916560719676e-01 4.334256728976307871e-01 6.734771102219323513e-01 9.125080197222198430e-01 4.974393931097168542e-01 8.301481563280355136e-01 4.526450714147856047e-01 2.414236092573898151e-01 8.070129698367667359e-02 7.260400697427102923e-01 1.396509691839398215e-02 2.496450588391967429e-01 4.335741205447194435e-01 3.089314419194891803e-01 9.543503534526003307e-01 5.457977547458532364e-01 3.139663643587058406e-01 5.034762326753475792e-01 4.756788330475764104e-01 6.849334942793482428e-01 3.880666613022351052e-01 6.483446580176778218e-01 5.217503801099343530e-01 5.371145824070304720e-01 3.121260159429154468e-01 8.314121854062171968e-01 4.538695969561833410e-01 8.598896961203845724e-01 9.961993522734106099e-01 8.865717795946430613e-01 7.828987966783660379e-01 3.412415531643435695e-01 7.421170530151157685e-01 4.484104178639959359e-01 6.793217012099640462e-01 3.756179958191659951e-01 7.821287098222597933e-01 6.227726265188193722e-02 8.552983413221663112e-01 4.824668768009222619e-01 2.241531065858231031e-01 4.939536577599041856e-01 5.129566641128722182e-01 1.057984177672518511e-01 9.541452507300716146e-01 3.396646181755047511e-01 7.452588103611947901e-01 5.315559265659929311e-01 5.493475179850665358e-01 5.214824278139198466e-01 5.150075718147916204e-01 1.196075368500321146e-01 9.035665331176232495e-01 7.522653903639873185e-01 6.638708679914825384e-01 5.584174553800479446e-01 5.015819402508836511e-01 5.507698483308445248e-01 5.978677577011723976e-01 8.450418028759657529e-01 3.266677322748618995e-01 1.321610045897971819e-01 2.394354042746985600e-01 2.723972163557076831e-01 5.523301747352814539e-01 5.518043850608547185e-01 5.283968096837132755e-02 8.192733312104071297e-01 2.277106024970321219e-02 1.414998099027269252e-01 6.517281615256080851e-01 1.811694734825117781e-01 9.472370614713256920e-01 5.454497319021770485e-01 1.364119913158231556e-01 8.446142008509562871e-01 7.671725984742419069e-01 2.461161648406858804e-01 1.421724627107351369e-01 6.290652581179481118e-01 7.094144689448004248e-01 4.419656923472803367e-02 6.614741876652251440e-01 8.712193265403500586e-02 4.734931280852430202e-01 5.382037050480286133e-01 1.396459758005891283e-01 +9.709329844415439670e-01 8.998575745276288229e-01 9.151313462895852568e-01 6.920489275523904471e-01 2.892231405199537919e-01 6.750679746268205550e-01 5.515642485826798280e-01 1.065253097812824956e-01 2.957026803465776510e-01 8.937347659632134400e-01 9.800016515925590310e-01 7.745900896182087436e-01 1.570977683146633774e-01 1.482028765821026273e-01 2.111147779712029271e-01 9.683759902485811200e-01 6.550951580826911425e-01 8.728324682592377703e-01 5.044803166579884257e-01 8.285704754811143991e-01 1.693574499337324735e-02 6.032669995180495182e-02 1.687026879086964692e-01 7.701554026145973619e-01 1.429888016593102718e-01 5.881172815379975827e-02 9.704206919487038396e-01 4.450807650730836951e-01 1.597445784258376689e-01 9.849229394397314152e-01 4.220083573536804744e-01 9.357693600374825671e-01 2.313199262338369033e-01 4.556443403861323294e-01 2.590791012828855822e-01 8.438664994487065085e-01 5.519045677502344427e-01 4.702170125676508050e-01 6.814723205638187897e-01 7.418295483665861001e-01 3.684921032028853904e-01 1.501895844844561845e-01 4.214513377519605308e-01 8.600279963652578408e-01 6.625616611189292238e-01 5.200151456470966105e-01 7.881072743086801058e-01 2.771703241081423519e-01 9.034135930616548071e-01 5.848441705791300738e-01 8.341698181274771473e-01 1.966638677318299777e-01 7.059747894371543042e-01 7.013854316067694716e-01 1.828430942760242983e-01 4.745548949934464966e-01 6.306422394641082452e-01 7.760751707194470939e-01 9.813187212598396547e-01 2.293595795266353266e-01 7.749261876107090830e-01 2.384106107787011819e-01 9.721209688979495223e-01 2.715569353686980714e-01 2.915573577694993146e-01 3.579601509630966349e-01 3.085697512342830962e-01 4.070219981627976047e-01 1.989632411372218579e-01 7.330003339460906542e-01 5.397259604481572381e-01 6.931009942216573849e-01 1.385457419653816080e-01 1.140339999976658358e-01 3.980752590866034613e-01 9.471822621683767540e-01 5.476643721405823895e-01 6.824131903515884279e-02 5.844099130744569992e-01 2.346881692012994236e-01 9.436439228519653000e-01 4.855518260479008141e-02 8.157036123302675579e-01 1.169761256455048581e-01 5.532962903488753970e-01 1.100965596251435308e-01 9.789490602992410029e-01 8.433487462016989733e-01 1.272410782852178013e-01 2.885715258680641160e-01 7.990943955388217779e-01 1.565305358979097727e-01 9.160846960406943129e-02 8.521842244411678147e-01 4.474243106736998099e-01 3.843945818845087015e-01 4.710645906071458944e-01 2.398348154123419729e-01 6.435351435258193087e-01 7.656897921129046658e-01 +4.894328120406804539e-01 7.881019629214267574e-01 6.974585354155089512e-01 2.023858939857701156e-01 1.660984914264745926e-01 4.854517801734643534e-01 2.789848572630315715e-01 2.311636522410289718e-01 9.821076233980715608e-01 1.220641257408076052e-01 2.614036146663852866e-01 7.657560715165320220e-01 3.968360577545695378e-01 4.566023622802184434e-02 1.049701948619241598e-02 9.281162949127452766e-01 4.490137965769909201e-01 2.095846458383606725e-01 9.195504656719085679e-01 9.683515436855471004e-01 9.800174878114910060e-01 5.517610861380117804e-01 6.711570559348770670e-01 5.125258050287277989e-01 2.105581493613526423e-01 8.281813206544574868e-01 4.964783994807770995e-01 7.284974208756571645e-01 1.320629592816270348e-01 6.652194518096135045e-01 9.430156297917950958e-01 7.477263137894260003e-01 2.054087806450300979e-01 4.248209124837907247e-01 7.657518666018259257e-02 1.031614100713345028e-01 4.122242287567021712e-01 4.919658859336810686e-01 3.752650167259050651e-01 4.175771429986683270e-01 6.131376293448997927e-01 5.463797405837259591e-01 3.119918548921774004e-01 6.331762507678504459e-01 5.484632429281035559e-01 6.815448032785871302e-01 8.065695507425107991e-02 8.720129122297424207e-01 8.318188557125294480e-03 2.199323537180564170e-02 8.933872719887463454e-01 1.953120287872067706e-02 2.478721941404590234e-01 5.994061179859005994e-01 6.588362611693047155e-01 6.332808851020984564e-01 3.823849348043323326e-01 5.111091324899629251e-01 7.034808459110406531e-01 4.347681568463539481e-01 4.316973576672314961e-01 9.620411080123215664e-01 6.247837467655984467e-01 8.196961678222113301e-01 5.574601810887074294e-01 8.800635018469276094e-01 8.772255241161972528e-01 5.075275933138404527e-01 8.022583187266906224e-01 2.320670802521890286e-01 1.165626629103270195e-01 4.623759662685936744e-01 7.938327000737943617e-02 7.986374689793115378e-01 6.728842751465858862e-01 8.133909095059230765e-01 1.202639390769081329e-01 1.052937257108800262e-01 8.717600467040409473e-02 2.163819956545051104e-01 6.596483385763984852e-01 1.202843170392309258e-02 1.538789195854695091e-01 3.120247727263308901e-01 3.408168327248596308e-01 3.241861797851740556e-01 3.637074533655986208e-01 1.533669345890729119e-01 4.455921334699539660e-01 5.619140093874478437e-01 1.881731359879111887e-01 9.416670800570559052e-01 1.740018593664415247e-01 7.030242331869680505e-01 5.922055553954849172e-01 9.326211623391688077e-01 6.608322881013140027e-01 7.009721551241574478e-01 1.079126054675583202e-01 6.158176671761947940e-01 +5.185079639625639336e-01 9.613742991518259284e-01 5.555312825626229634e-01 2.647628827924735084e-01 6.003697207460141350e-01 5.392112376769145898e-01 6.781186965667050925e-01 9.908971748181496508e-01 4.124155872095397468e-01 9.814941401724619485e-02 2.684237785531295994e-02 1.774652505962848181e-01 1.707589529595294753e-01 4.640932098465534450e-01 2.882179883914587348e-01 7.276822905806898945e-01 6.145789546745269449e-01 1.100959863917608805e-01 6.798859723042820491e-01 9.096984032948918220e-01 3.971368455178179158e-01 2.959494950971321980e-01 3.742088799298171065e-02 1.960739526210202310e-01 7.536102695342027369e-01 6.680915510628401277e-01 4.136507204312135366e-01 3.613996339406737590e-01 3.605422038261204554e-01 7.098503555159476619e-01 8.093719147087541366e-01 6.344097009128880638e-01 3.990082448083617228e-01 2.805918009906902544e-01 7.078488167363675698e-01 9.969917259866583059e-01 9.442054998992396309e-01 1.329075240769165278e-01 6.810681350588387861e-02 8.503491437913293094e-01 8.347117439165431252e-01 2.381858201903953587e-01 7.884260706938626129e-01 7.109907917419661105e-01 6.390916681983604963e-02 6.174365227062991179e-01 5.085733343630816083e-01 1.716846139694149231e-01 9.065664924270055991e-02 5.625330757196970177e-01 3.539663480209681579e-01 8.937139525947165319e-01 3.981380511900556307e-02 7.403597927449541150e-01 3.803872284089604427e-02 6.729519695709765825e-01 5.306080908840085097e-01 2.091237680402112664e-01 5.902903662907804661e-01 2.094778612095482551e-01 7.323447855684165342e-01 3.644574495843493356e-01 2.006215478057034041e-01 3.737617545555030896e-01 5.253471759602216240e-01 4.287889547869583318e-01 7.086098806190446187e-01 4.510792335515292351e-01 6.383187180169215269e-01 8.779355722397681472e-01 4.221338898667141848e-01 6.375840144651815367e-01 8.683057298299173832e-01 6.093730356952498095e-01 9.297141161056151626e-01 7.770838342807246946e-01 6.549661287008456956e-02 2.835060738158660110e-01 4.474138867374952699e-01 8.530336387421445510e-01 3.160209657891883683e-01 8.301538680518486535e-01 6.646903097549101691e-01 7.187130118106234145e-01 1.651862041735395747e-01 9.578252676762609719e-01 6.490273812885494209e-02 9.777273484666341163e-01 8.930729829254262508e-01 9.851054752118463265e-01 4.094323402286751401e-01 1.139176240124337713e-01 7.612865863899589414e-01 2.266379302491570158e-01 6.998882496157835531e-01 9.945043379099228753e-01 7.111578056749194854e-01 7.806190603886183910e-01 3.410170920712443099e-01 9.446084168886822452e-01 +5.015172758330755931e-01 5.569527971282052237e-01 1.122406928736449094e-01 8.960352822124777461e-01 6.049568585854003810e-02 1.202196001338627918e-01 1.870314295763603196e-01 9.017590029396971296e-01 3.597904628087450485e-01 2.130941062746317671e-01 2.556281834629479111e-01 5.123669364829196438e-01 4.754061129282013409e-01 9.764470380372083369e-01 8.038663983900646848e-01 6.960491266420890666e-01 2.940135977911654264e-01 2.857282759910040326e-03 4.599343225832352999e-02 5.597554495210212977e-01 7.445266674304001908e-01 3.387528030535971180e-01 6.429542922125383031e-01 2.123331785532429627e-01 5.302332654117811739e-01 7.262555377662539557e-01 3.982425859900724507e-01 3.243388301740235402e-01 6.191064123738921898e-01 8.988047781373914580e-01 7.819700328765150088e-01 7.664269102804815992e-01 6.734095355422575757e-03 2.904762329148526945e-01 5.097537644843168625e-01 9.524734606001823423e-01 4.812869576591960463e-01 6.236868013640477493e-01 1.459170943214320726e-01 9.874505139403206844e-01 7.561708982837871407e-01 3.798591332432484924e-01 6.056633451375117438e-01 7.935708170258731764e-01 1.458141583518740569e-01 7.082511296391911237e-01 1.098798009731616343e-02 3.655618484905173160e-01 9.551862303858617009e-01 8.148959351152762487e-02 4.739306219219985294e-02 7.963357515359494876e-01 6.208332695202813944e-01 3.884182264923189409e-01 4.589167647950288531e-01 6.496652974138312775e-01 2.467528128074852889e-01 5.309593064844935206e-01 5.364606369543487574e-01 2.421352989851309756e-01 3.776834556696828660e-02 1.564861233558080267e-01 5.197231021782636740e-01 8.725375120634637494e-01 2.441225493455024820e-01 2.320363366041028330e-01 5.026358683423555185e-01 7.035766000474735771e-01 8.347805591467084563e-01 2.303229841813967393e-01 6.908373419683054850e-01 2.646662377366995056e-01 1.259467197942290007e-01 9.372770922994989595e-01 6.674216272867254940e-01 1.027944489143072238e-01 5.686267290346079806e-01 3.948222804451942958e-01 4.689706944496729868e-01 4.446117700449114807e-02 6.817992275557515081e-01 9.084821829413957106e-01 9.184021015315092518e-01 3.045815734169987632e-01 2.204958624923980537e-03 7.542672057172502553e-01 9.460844786545006269e-01 3.373139094575949848e-02 9.059565314915285494e-01 9.938525461318854504e-01 2.542072661725306437e-01 9.685734112479216229e-02 8.223629541824816203e-01 1.057429056898460118e-01 8.080679390260248063e-01 5.823014244609205914e-01 6.413551528031806725e-01 1.787341975438894170e-01 1.250471413912357388e-01 8.390281297596062782e-01 Added: trunk/scipy/cluster/tests/pdist-euclidean-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-euclidean-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-euclidean-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 4.0515260e+00 4.2121458e+00 3.7357405e+00 4.2313317e+00 3.9136009e+00 4.3843298e+00 3.9811426e+00 4.3624182e+00 4.0642508e+00 4.2105933e+00 4.0747226e+00 3.9068586e+00 4.1637004e+00 4.4303203e+00 4.1841564e+00 4.1063279e+00 4.1862390e+00 4.0719925e+00 4.2227579e+00 4.3173531e+00 3.8811067e+00 3.7577567e+00 4.0623722e+00 3.9882453e+00 4.0432671e+00 3.9085109e+00 4.0283414e+00 4.0846110e+00 3.6459235e+00 3.9544001e+00 4.1134244e+00 4.1805752e+00 3.5121011e+00 4.2747789e+00 4.1048323e+00 3.9269426e+00 3.8932032e+00 3.8281172e+00 3.7288430e+00 4.0863477e+00 4.1527428e+00 4.1646409e+00 4.2027433e+00 3.8441594e+00 4.8419117e+00 4.2455384e+00 3.7622220e+00 4.3967923e+00 4.4663183e+00 4.0435853e+00 4.0421692e+00 4.3124625e+00 4.6499961e+00 4.5595743e+00 3.4230430e+00 4.2612266e+00 3.5676603e+00 4.0866580e+00 4.2307103e+00 3.8521940e+00 3.9951183e+00 3.1022409e+00 3.7290193e+00 4.1931517e+00 4.1127027e+00 3.6633651e+00 4.0235815e+00 3.9729858e+00 4.1980132e+00 4.1579993e+00 3.9948955e+00 3.9081966e+00 3.9031152e+00 3.5069036e+00 4.0015727e+00 3.6763496e+00 3.6614339e+00 3.6227109e+00 3.7357992e+00 4.0170026e+00 3.5216829e+00 3.9322227e+00 3.9094621e+00 4.0170286e+00 4.3264246e+00 4.3435483e+00 4.0788635e+00 4.4761765e+00 3.8468186e+00 4.1490333e+00 4.2800007e+00 4.2260191e+00 4.3031858e+00 4.1897413e+00 4.0530244e+00 3.5893641e+00 4.2186615e+00 3.7979503e+00 4.0915473e+00 4.1343073e+00 4.5063851e+00 3.6394889e+00 4.2508448e+00 3.7160826e+00 4.0105262e+00 4.1578269e+00 4.0290590e+00 3.6971819e+00 3.9414087e+00 4.2522313e+00 4.4091714e+00 4.1542292e+00 3.9594691e+00 4.0923600e+00 4.0855497e+00 3.8253075e+00 4.3034717e+00 4.0976731e+00 4.1316523e+00 4.0872717e+00 4.2643353e+00 3.8887280e+00 3.9411273e+00 3.8848001e+00 4.3481996e+00 3.8716733e+00 3.9084684e+00 3.7546361e+00 3.9354816e+00 3.8293694e+00 3.7568515e+00 3.7184961e+00 3.8404278e+00 4.2570811e+00 4.1423777e+00 4.0291411e+00 4.2094682e+00 3.6127418e+00 4.0459839e+00 3.7737985e+00 3.7647653e+00 3.9762006e+00 3.8999512e+00 3.8509090e+00 3.8975941e+00 3.8432839e+00 4.2109046e+00 4.1339124e+00 3.5898873e+00 4.0794519e+00 4.3504966e+00 3.8862612e+00 3.8332931e+00 4.2190310e+00 4.1366595e+00 3.7220268e+00 4.1250795e+00 3.3169452e+00 4.0757181e+00 3.6487114e+00 3.9513724e+00 4.0735549e+00 3.9137880e+00 3.9656942e+00 3.7724953e+00 4.0505153e+00 3.9062302e+00 4.5671852e+00 3.7542175e+00 4.3731708e+00 3.6733907e+00 4.4667545e+00 4.1004635e+00 4.0530038e+00 4.0346958e+00 4.2145752e+00 4.4298637e+00 4.2982360e+00 4.0878239e+00 4.4061563e+00 4.2115971e+00 3.8263277e+00 3.8603258e+00 3.8572375e+00 4.1051910e+00 4.3787786e+00 4.5309659e+00 4.0047055e+00 4.1308854e+00 3.6283561e+00 Added: trunk/scipy/cluster/tests/pdist-hamming-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-hamming-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-hamming-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 4.6000000e-01 4.3000000e-01 4.3000000e-01 5.4000000e-01 4.1000000e-01 5.3000000e-01 4.3000000e-01 5.9000000e-01 4.8000000e-01 4.7000000e-01 4.6000000e-01 4.9000000e-01 4.5000000e-01 5.5000000e-01 5.3000000e-01 4.5000000e-01 4.8000000e-01 4.7000000e-01 4.8000000e-01 5.1000000e-01 4.9000000e-01 4.4000000e-01 4.9000000e-01 4.7000000e-01 4.9000000e-01 4.7000000e-01 5.2000000e-01 4.7000000e-01 4.2000000e-01 4.9000000e-01 4.7000000e-01 5.5000000e-01 3.9000000e-01 5.5000000e-01 4.6000000e-01 4.5000000e-01 4.0000000e-01 4.8000000e-01 4.5000000e-01 4.8000000e-01 4.8000000e-01 5.0000000e-01 4.8000000e-01 4.5000000e-01 6.4000000e-01 5.7000000e-01 4.6000000e-01 5.4000000e-01 5.6000000e-01 4.8000000e-01 4.8000000e-01 5.3000000e-01 5.4000000e-01 5.3000000e-01 4.5000000e-01 5.8000000e-01 4.2000000e-01 5.4000000e-01 6.0000000e-01 5.1000000e-01 4.6000000e-01 4.1000000e-01 4.4000000e-01 5.6000000e-01 5.4000000e-01 4.8000000e-01 4.8000000e-01 5.1000000e-01 5.2000000e-01 5.5000000e-01 4.5000000e-01 4.3000000e-01 4.7000000e-01 4.7000000e-01 5.6000000e-01 4.9000000e-01 4.8000000e-01 4.5000000e-01 4.9000000e-01 4.7000000e-01 4.5000000e-01 4.5000000e-01 5.6000000e-01 4.9000000e-01 5.8000000e-01 5.4000000e-01 4.6000000e-01 5.8000000e-01 5.3000000e-01 5.4000000e-01 5.5000000e-01 5.0000000e-01 5.2000000e-01 4.8000000e-01 5.0000000e-01 3.8000000e-01 5.3000000e-01 4.8000000e-01 5.1000000e-01 4.8000000e-01 5.2000000e-01 4.7000000e-01 5.0000000e-01 4.3000000e-01 4.8000000e-01 5.2000000e-01 5.0000000e-01 4.2000000e-01 4.2000000e-01 4.7000000e-01 5.4000000e-01 5.1000000e-01 5.4000000e-01 5.1000000e-01 4.8000000e-01 4.7000000e-01 5.2000000e-01 5.2000000e-01 5.4000000e-01 5.4000000e-01 5.0000000e-01 4.5000000e-01 4.4000000e-01 4.1000000e-01 5.7000000e-01 4.6000000e-01 5.1000000e-01 5.2000000e-01 5.0000000e-01 4.8000000e-01 5.0000000e-01 4.4000000e-01 5.3000000e-01 5.2000000e-01 4.9000000e-01 5.7000000e-01 5.8000000e-01 4.9000000e-01 5.1000000e-01 4.5000000e-01 5.3000000e-01 4.5000000e-01 4.4000000e-01 3.5000000e-01 4.2000000e-01 5.3000000e-01 5.2000000e-01 5.0000000e-01 3.8000000e-01 5.2000000e-01 5.6000000e-01 4.7000000e-01 4.4000000e-01 5.1000000e-01 5.7000000e-01 4.5000000e-01 5.7000000e-01 4.3000000e-01 5.1000000e-01 3.8000000e-01 5.3000000e-01 4.8000000e-01 4.4000000e-01 5.0000000e-01 4.8000000e-01 5.0000000e-01 4.7000000e-01 6.4000000e-01 4.9000000e-01 5.2000000e-01 4.8000000e-01 5.6000000e-01 4.3000000e-01 4.8000000e-01 4.7000000e-01 6.0000000e-01 5.4000000e-01 5.5000000e-01 4.0000000e-01 5.5000000e-01 5.6000000e-01 4.9000000e-01 5.0000000e-01 4.3000000e-01 5.7000000e-01 5.0000000e-01 5.7000000e-01 4.9000000e-01 4.2000000e-01 3.9000000e-01 Added: trunk/scipy/cluster/tests/pdist-jaccard-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-jaccard-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-jaccard-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 6.5714286e-01 6.0563380e-01 6.3235294e-01 7.3972603e-01 6.0294118e-01 7.3611111e-01 6.4179104e-01 7.7631579e-01 6.4000000e-01 6.6197183e-01 6.6666667e-01 7.0000000e-01 6.4285714e-01 7.7464789e-01 7.1621622e-01 6.4285714e-01 6.8571429e-01 6.4383562e-01 6.6666667e-01 6.5384615e-01 6.6216216e-01 6.1971831e-01 6.5333333e-01 6.5277778e-01 6.7123288e-01 6.4383562e-01 6.5000000e-01 6.3513514e-01 6.0000000e-01 6.7123288e-01 6.3513514e-01 7.4324324e-01 5.5714286e-01 7.0512821e-01 6.3888889e-01 6.0000000e-01 5.6338028e-01 6.3157895e-01 6.0810811e-01 6.2337662e-01 6.4000000e-01 6.5789474e-01 6.3157895e-01 5.6962025e-01 7.5294118e-01 7.1250000e-01 6.2162162e-01 6.7500000e-01 7.2727273e-01 6.2337662e-01 6.2337662e-01 6.7948718e-01 6.5853659e-01 6.6250000e-01 6.3380282e-01 7.3417722e-01 6.0869565e-01 7.2000000e-01 7.5949367e-01 6.4556962e-01 6.3013699e-01 5.9420290e-01 6.2857143e-01 7.1794872e-01 7.3972603e-01 6.4864865e-01 6.4864865e-01 6.8918919e-01 6.6666667e-01 7.0512821e-01 6.2500000e-01 6.2318841e-01 6.6197183e-01 6.5277778e-01 6.9135802e-01 6.6216216e-01 6.6666667e-01 6.4285714e-01 6.6216216e-01 6.8115942e-01 6.2500000e-01 6.2500000e-01 7.3684211e-01 6.4473684e-01 7.3417722e-01 7.1052632e-01 6.3888889e-01 7.3417722e-01 6.5432099e-01 6.9230769e-01 7.1428571e-01 6.7567568e-01 6.7532468e-01 6.7605634e-01 6.5789474e-01 5.4285714e-01 6.9736842e-01 6.2337662e-01 6.6233766e-01 6.7605634e-01 7.0270270e-01 6.1842105e-01 6.7567568e-01 6.2318841e-01 6.7605634e-01 6.9333333e-01 7.1428571e-01 6.0000000e-01 6.0000000e-01 6.6197183e-01 6.9230769e-01 6.8000000e-01 7.2000000e-01 6.5384615e-01 6.5753425e-01 6.6197183e-01 7.1232877e-01 6.9333333e-01 7.5000000e-01 7.1052632e-01 6.7567568e-01 6.4285714e-01 6.0273973e-01 5.8571429e-01 6.9512195e-01 6.3013699e-01 6.8918919e-01 7.0270270e-01 6.6666667e-01 6.8571429e-01 6.6666667e-01 6.1111111e-01 7.0666667e-01 6.6666667e-01 6.5333333e-01 6.8674699e-01 7.0731707e-01 6.3636364e-01 6.3750000e-01 6.1643836e-01 6.5432099e-01 5.8441558e-01 5.8666667e-01 4.7297297e-01 5.5263158e-01 6.9736842e-01 6.9333333e-01 6.5789474e-01 5.7575758e-01 6.7532468e-01 7.0886076e-01 6.4383562e-01 5.8666667e-01 6.6233766e-01 7.5000000e-01 6.2500000e-01 7.7027027e-01 6.0563380e-01 6.8000000e-01 5.6716418e-01 6.7948718e-01 6.4864865e-01 6.1971831e-01 7.1428571e-01 6.5753425e-01 6.7567568e-01 6.6197183e-01 7.7108434e-01 6.6216216e-01 7.1232877e-01 6.4000000e-01 7.0886076e-01 6.0563380e-01 6.2337662e-01 6.2666667e-01 7.7922078e-01 7.2972973e-01 7.5342466e-01 5.7971014e-01 7.3333333e-01 7.0886076e-01 6.6216216e-01 6.4102564e-01 5.8904110e-01 7.3076923e-01 6.4102564e-01 7.1250000e-01 6.4473684e-01 5.9154930e-01 5.3424658e-01 Added: trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 6.1585489e+02 6.2321817e+02 5.8818412e+02 6.7863863e+02 6.0771510e+02 6.9131089e+02 6.2439260e+02 7.1004702e+02 6.4565616e+02 6.5614478e+02 6.1511455e+02 6.2860242e+02 6.4943432e+02 7.1272806e+02 6.5685389e+02 6.2442150e+02 6.6505781e+02 6.6563043e+02 6.5960729e+02 6.8610088e+02 5.7808638e+02 6.1778875e+02 6.3862183e+02 6.2928553e+02 6.1812973e+02 5.9637134e+02 6.2055904e+02 6.2265891e+02 4.9440236e+02 6.4015022e+02 6.2838510e+02 6.5307398e+02 5.3986370e+02 6.4941961e+02 6.0463616e+02 6.3148720e+02 6.0308734e+02 6.0506766e+02 6.2190656e+02 6.5950715e+02 6.2248928e+02 6.2725172e+02 6.4807454e+02 5.7578035e+02 8.3827038e+02 7.1063040e+02 5.4478600e+02 6.7440334e+02 7.3220343e+02 6.1389081e+02 6.3014002e+02 6.5931791e+02 7.8153691e+02 6.8695874e+02 5.1250688e+02 7.0378289e+02 5.6254491e+02 6.4842853e+02 6.9060029e+02 6.0045029e+02 6.2365908e+02 4.6473547e+02 5.7836117e+02 6.6987139e+02 6.3212657e+02 5.5707081e+02 6.4115762e+02 6.5663457e+02 6.6269023e+02 6.8210531e+02 6.1382960e+02 6.3382190e+02 5.9540062e+02 5.5933269e+02 6.4209430e+02 5.2358429e+02 5.7886008e+02 5.8103514e+02 5.7774802e+02 5.9722361e+02 5.4489073e+02 6.3528629e+02 6.4604143e+02 6.5393880e+02 7.0267325e+02 7.1504213e+02 6.5799742e+02 7.4683271e+02 6.0347074e+02 6.5778541e+02 6.6513775e+02 6.8814952e+02 7.0301623e+02 6.2527972e+02 6.8267156e+02 5.4010932e+02 7.0611774e+02 5.6459584e+02 6.3041182e+02 6.3605235e+02 6.7600054e+02 5.4577351e+02 7.0929347e+02 5.9178309e+02 6.1850390e+02 6.4481363e+02 6.3110933e+02 5.5940455e+02 5.6734092e+02 6.5381272e+02 7.1624576e+02 6.3193705e+02 6.6240603e+02 6.5731415e+02 6.5015656e+02 5.9508845e+02 6.6741407e+02 6.8757498e+02 6.6762533e+02 6.5036333e+02 6.6798992e+02 5.7082376e+02 6.2171263e+02 5.8471396e+02 6.3814192e+02 6.1738265e+02 5.8671693e+02 5.8080905e+02 6.1314083e+02 5.9496681e+02 5.7419618e+02 5.6938212e+02 5.9554798e+02 6.8401851e+02 6.6784590e+02 6.3260832e+02 6.5948824e+02 5.8215353e+02 6.5090954e+02 5.6125819e+02 6.0728529e+02 6.3023598e+02 6.0123106e+02 5.3359706e+02 5.8579452e+02 5.9743445e+02 6.8559330e+02 6.1808386e+02 5.4070268e+02 6.6481624e+02 6.8773735e+02 6.3323647e+02 5.8871137e+02 6.6999350e+02 6.7738537e+02 5.5644352e+02 6.6779435e+02 5.1484535e+02 6.5022821e+02 5.3865596e+02 6.3170314e+02 6.1494903e+02 6.2657009e+02 6.2255510e+02 5.9046375e+02 6.2911230e+02 5.8085299e+02 7.3934668e+02 5.8435174e+02 6.7690574e+02 5.5336944e+02 6.7962701e+02 5.8526484e+02 6.1967171e+02 6.3942520e+02 6.5540238e+02 7.0212254e+02 6.5926444e+02 6.1750355e+02 7.0941803e+02 6.9104083e+02 6.2177029e+02 6.0252775e+02 5.6810664e+02 6.4965351e+02 6.8120808e+02 7.2772619e+02 6.3309152e+02 5.8067697e+02 5.2359879e+02 Added: trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 2.0215050e+00 2.0988154e+00 1.8614681e+00 2.0510161e+00 1.9210911e+00 2.1323516e+00 1.9565454e+00 2.1029889e+00 1.9617871e+00 2.0544792e+00 2.0357408e+00 1.8811414e+00 2.0694693e+00 2.1245977e+00 2.0632165e+00 2.0452823e+00 2.0249330e+00 1.9635489e+00 2.0508580e+00 2.0838578e+00 1.9324052e+00 1.8224609e+00 1.9795343e+00 1.9536534e+00 1.9694910e+00 1.9075569e+00 1.9590397e+00 2.0022087e+00 1.8814000e+00 1.8884208e+00 1.9961121e+00 2.0215351e+00 1.7515769e+00 2.0756437e+00 2.0109476e+00 1.9234849e+00 1.9160076e+00 1.8550862e+00 1.7733640e+00 2.0071906e+00 2.0209542e+00 2.0616569e+00 2.0565503e+00 1.9083573e+00 2.2732431e+00 1.9975503e+00 1.9080072e+00 2.1437809e+00 2.1296295e+00 1.9739085e+00 1.9834166e+00 2.1078664e+00 2.2016840e+00 2.2080962e+00 1.7340579e+00 2.0549287e+00 1.7331748e+00 1.9559688e+00 2.0343364e+00 1.8736929e+00 1.9730416e+00 1.5308944e+00 1.8421831e+00 2.0174240e+00 2.0137378e+00 1.7956151e+00 1.9606596e+00 1.9074857e+00 2.0413879e+00 2.0070305e+00 1.9584677e+00 1.8977851e+00 1.9176239e+00 1.7067419e+00 1.9461927e+00 1.8431700e+00 1.8284576e+00 1.7778704e+00 1.8350329e+00 2.0175415e+00 1.7459063e+00 1.9242505e+00 1.8757370e+00 1.9312506e+00 2.0574808e+00 2.0894636e+00 1.9780203e+00 2.1374036e+00 1.8900436e+00 2.0273032e+00 2.0681953e+00 2.0234699e+00 2.0666449e+00 2.0663485e+00 1.9281402e+00 1.7846314e+00 2.0372479e+00 1.8831230e+00 2.0186015e+00 2.0193231e+00 2.2022665e+00 1.8145737e+00 2.0466545e+00 1.8092421e+00 1.9600687e+00 2.0322961e+00 1.9556364e+00 1.8266422e+00 1.9950345e+00 2.1038429e+00 2.1164145e+00 2.0188062e+00 1.8863331e+00 2.0006971e+00 1.9971068e+00 1.8771862e+00 2.1148855e+00 1.9570638e+00 1.9859615e+00 2.0030854e+00 2.0737344e+00 1.9739259e+00 1.9266524e+00 1.9200535e+00 2.1376689e+00 1.8944425e+00 1.9330553e+00 1.8561590e+00 1.9422954e+00 1.8874178e+00 1.8624808e+00 1.8265563e+00 1.8840519e+00 2.0515092e+00 2.0174226e+00 1.9771196e+00 2.0635988e+00 1.7334466e+00 1.9912604e+00 1.8915711e+00 1.8262636e+00 1.9369173e+00 1.9560446e+00 1.9549934e+00 1.9279230e+00 1.9021073e+00 2.0113391e+00 2.0305786e+00 1.8066806e+00 1.9656739e+00 2.1219217e+00 1.8820250e+00 1.8936826e+00 2.0565131e+00 1.9839441e+00 1.8553479e+00 1.9923760e+00 1.6393276e+00 1.9786440e+00 1.8274394e+00 1.9322611e+00 2.0404318e+00 1.9216532e+00 1.9361171e+00 1.8401373e+00 1.9908059e+00 1.9495117e+00 2.1975655e+00 1.8413913e+00 2.1528773e+00 1.8434374e+00 2.1668863e+00 2.0429273e+00 1.9980016e+00 1.9790129e+00 2.0264829e+00 2.1478843e+00 2.0899600e+00 2.0280670e+00 2.1210881e+00 1.9993891e+00 1.8646871e+00 1.9099983e+00 1.9263353e+00 2.0042495e+00 2.1365919e+00 2.1830279e+00 1.9631961e+00 2.0880004e+00 1.8348369e+00 Added: trunk/scipy/cluster/tests/pdist-seuclidean-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-seuclidean-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-seuclidean-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 1.4330520e+01 1.4635426e+01 1.3450855e+01 1.4761140e+01 1.3508642e+01 1.5434417e+01 1.3887693e+01 1.5166776e+01 1.3966038e+01 1.4950451e+01 1.4564587e+01 1.3834201e+01 1.4347008e+01 1.5641962e+01 1.4689053e+01 1.4418720e+01 1.4545856e+01 1.4151822e+01 1.4669017e+01 1.5150750e+01 1.3770166e+01 1.3288969e+01 1.4048191e+01 1.4049959e+01 1.4164158e+01 1.3727834e+01 1.4074687e+01 1.4321303e+01 1.2497330e+01 1.3820273e+01 1.4441030e+01 1.4780222e+01 1.2504339e+01 1.5022245e+01 1.4263650e+01 1.3704507e+01 1.3694385e+01 1.3667517e+01 1.3177468e+01 1.4391931e+01 1.4893903e+01 1.4475753e+01 1.4440707e+01 1.3603096e+01 1.6889651e+01 1.4731174e+01 1.3337775e+01 1.5187532e+01 1.5667271e+01 1.4226037e+01 1.4203554e+01 1.5272898e+01 1.6031460e+01 1.5991549e+01 1.1855060e+01 1.4844776e+01 1.2475182e+01 1.4408126e+01 1.4836870e+01 1.3472986e+01 1.4089281e+01 1.1018298e+01 1.3183296e+01 1.4590802e+01 1.4404230e+01 1.2717623e+01 1.3983283e+01 1.4017133e+01 1.4608005e+01 1.4402553e+01 1.3977803e+01 1.4091040e+01 1.3977459e+01 1.2630449e+01 1.4160109e+01 1.3029417e+01 1.2654432e+01 1.2794946e+01 1.3194978e+01 1.4378745e+01 1.2431908e+01 1.3852651e+01 1.3748358e+01 1.4003568e+01 1.5066681e+01 1.5192826e+01 1.4370013e+01 1.5792545e+01 1.3547546e+01 1.4411543e+01 1.4794215e+01 1.4924312e+01 1.4789153e+01 1.4875055e+01 1.4208537e+01 1.2786148e+01 1.4882476e+01 1.3302010e+01 1.4354774e+01 1.4542129e+01 1.5889633e+01 1.2928185e+01 1.4877868e+01 1.2890902e+01 1.4406165e+01 1.4498123e+01 1.4303273e+01 1.3207002e+01 1.3954732e+01 1.4841248e+01 1.5427799e+01 1.4363463e+01 1.3976277e+01 1.4284878e+01 1.4457991e+01 1.3369469e+01 1.5246610e+01 1.4487573e+01 1.4525176e+01 1.4505865e+01 1.5037347e+01 1.3834927e+01 1.3758988e+01 1.3424987e+01 1.4914766e+01 1.3783923e+01 1.3434291e+01 1.2895927e+01 1.3870360e+01 1.3342977e+01 1.3094322e+01 1.3057847e+01 1.3322375e+01 1.4940650e+01 1.4476829e+01 1.4197503e+01 1.4597035e+01 1.2963234e+01 1.4011414e+01 1.3181409e+01 1.3339615e+01 1.3928735e+01 1.3508015e+01 1.3170749e+01 1.3529133e+01 1.3454724e+01 1.4883437e+01 1.4564565e+01 1.2474313e+01 1.4435790e+01 1.5285703e+01 1.3701736e+01 1.3578312e+01 1.4807311e+01 1.4281072e+01 1.2920213e+01 1.4427803e+01 1.1408611e+01 1.4097334e+01 1.2868115e+01 1.3903683e+01 1.3800332e+01 1.3439339e+01 1.4062651e+01 1.3242107e+01 1.4400424e+01 1.3826132e+01 1.5991146e+01 1.3118258e+01 1.5377390e+01 1.2858378e+01 1.5249567e+01 1.4081585e+01 1.4458052e+01 1.4175623e+01 1.4850069e+01 1.5506668e+01 1.5014770e+01 1.4337030e+01 1.5214705e+01 1.4803729e+01 1.3188675e+01 1.3437739e+01 1.3409394e+01 1.4607386e+01 1.5394271e+01 1.5946451e+01 1.3769364e+01 1.4181208e+01 1.2551765e+01 Added: trunk/scipy/cluster/tests/pdist-spearman-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-spearman-ml.txt 2008-04-15 13:27:25 UTC (rev 4143) +++ trunk/scipy/cluster/tests/pdist-spearman-ml.txt 2008-04-16 06:21:12 UTC (rev 4144) @@ -0,0 +1 @@ + 9.3540954e-01 9.7904590e-01 8.6703870e-01 1.1569997e+00 8.7174317e-01 1.0627183e+00 9.1272727e-01 1.1593999e+00 9.7573357e-01 1.0072127e+00 1.0536814e+00 9.6276028e-01 9.7700570e-01 1.1513951e+00 1.0719592e+00 9.2178818e-01 1.0004680e+00 9.3689769e-01 9.8205821e-01 1.0332673e+00 9.4517852e-01 8.9437744e-01 9.7556556e-01 9.0460246e-01 9.7210921e-01 9.2230423e-01 9.9605161e-01 9.6852085e-01 8.4162016e-01 9.6667267e-01 9.7759376e-01 9.9757576e-01 7.6992499e-01 1.0151695e+00 9.8691869e-01 9.0325833e-01 8.6665467e-01 8.8844884e-01 8.4553255e-01 9.7700570e-01 9.5159916e-01 9.8906691e-01 1.0551935e+00 9.1973597e-01 1.3266247e+00 1.0982778e+00 8.4531653e-01 1.0887369e+00 1.0984938e+00 9.9851185e-01 9.0701470e-01 1.0639304e+00 1.2392919e+00 1.1422502e+00 8.1725773e-01 1.1844944e+00 7.8219022e-01 1.0817162e+00 1.2196100e+00 1.0003120e+00 1.0164536e+00 7.0724272e-01 9.7981398e-01 1.1134953e+00 1.0671107e+00 9.3600960e-01 9.9984398e-01 1.0356916e+00 1.1248005e+00 1.0696310e+00 1.0634263e+00 9.6472847e-01 9.9365137e-01 8.5724572e-01 1.1257846e+00 8.9930993e-01 9.4903090e-01 9.0667867e-01 9.1231923e-01 1.0573777e+00 9.0105011e-01 9.5255926e-01 1.0177978e+00 1.0606901e+00 1.1966997e+00 1.0891929e+00 1.0085089e+00 1.2640264e+00 9.3246925e-01 1.0198020e+00 1.2055806e+00 1.1237924e+00 1.1060666e+00 1.0517252e+00 1.0684668e+00 7.6844884e-01 1.0572697e+00 8.7373537e-01 9.6283228e-01 9.9350735e-01 1.2412601e+00 7.6322832e-01 1.0298950e+00 8.6148215e-01 1.0042724e+00 9.7012901e-01 9.3712571e-01 8.5845785e-01 8.5862586e-01 1.0336634e+00 1.0955536e+00 9.5302730e-01 9.8696670e-01 1.0633063e+00 1.0026643e+00 9.6380438e-01 1.1711251e+00 9.9273927e-01 1.0260906e+00 1.0863966e+00 1.0482808e+00 9.0361836e-01 9.2358836e-01 8.7794779e-01 1.2461206e+00 9.2985299e-01 1.0418962e+00 9.4660666e-01 9.5636364e-01 9.0646265e-01 9.9113111e-01 8.3027903e-01 9.3341734e-01 1.1378938e+00 1.0548215e+00 1.0086889e+00 1.1998920e+00 8.6063006e-01 1.0255506e+00 8.4786079e-01 1.0090729e+00 9.2542454e-01 9.5176718e-01 9.3477348e-01 9.0091809e-01 9.6404440e-01 1.1158716e+00 9.9614761e-01 7.7682568e-01 1.0605461e+00 1.0895650e+00 9.0065407e-01 8.7173117e-01 9.9821182e-01 1.2165617e+00 8.6127813e-01 1.1111071e+00 7.9015902e-01 1.0433843e+00 8.6510651e-01 1.0019202e+00 1.0154815e+00 9.4381038e-01 9.8646265e-01 1.0062526e+00 9.7426943e-01 9.8191419e-01 1.3038944e+00 8.6277828e-01 1.0830243e+00 8.6851485e-01 1.1192559e+00 9.9120312e-01 9.6540054e-01 9.1072307e-01 1.1775698e+00 1.1139154e+00 1.1083468e+00 9.9593159e-01 1.0825923e+00 1.1115032e+00 9.7430543e-01 9.5605161e-01 9.2800480e-01 9.4369037e-01 1.1136034e+00 1.1382898e+00 9.5937594e-01 9.8843084e-01 7.4563456e-01 From scipy-svn at scipy.org Thu Apr 17 17:05:47 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 16:05:47 -0500 (CDT) Subject: [Scipy-svn] r4145 - trunk/scipy/cluster/tests Message-ID: <20080417210547.24CBF39C2F3@new.scipy.org> Author: damian.eads Date: 2008-04-17 16:05:42 -0500 (Thu, 17 Apr 2008) New Revision: 4145 Modified: trunk/scipy/cluster/tests/pdist-boolean-inp.txt Log: Changed pdist-boolean-inp.txt so it is stored as text, not in MAT format. Modified: trunk/scipy/cluster/tests/pdist-boolean-inp.txt =================================================================== (Binary files differ) From scipy-svn at scipy.org Thu Apr 17 17:11:40 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 16:11:40 -0500 (CDT) Subject: [Scipy-svn] r4146 - trunk/scipy/special/tests Message-ID: <20080417211140.F26C539C42F@new.scipy.org> Author: cookedm Date: 2008-04-17 16:11:39 -0500 (Thu, 17 Apr 2008) New Revision: 4146 Modified: trunk/scipy/special/tests/test_basic.py Log: Add test case for #299: gammaincinv gives incorrect answers Modified: trunk/scipy/special/tests/test_basic.py =================================================================== --- trunk/scipy/special/tests/test_basic.py 2008-04-17 21:05:42 UTC (rev 4145) +++ trunk/scipy/special/tests/test_basic.py 2008-04-17 21:11:39 UTC (rev 4146) @@ -1051,6 +1051,12 @@ y = gammaincinv(.4,.4) x = gammainc(.4,y) assert_almost_equal(x,0.4,1) + y = gammainc(10, 0.05) + x = gammaincinv(10, 2.5715803516000736e-20) + assert_almost_equal(0.05, x, decimal=10) + assert_almost_equal(y, 2.5715803516000736e-20, decimal=10) + x = gammaincinv(50, 8.20754777388471303050299243573393e-18) + assert_almost_equal(11.0, x, decimal=10) def test_rgamma(self): rgam = rgamma(8) From scipy-svn at scipy.org Thu Apr 17 22:13:29 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 21:13:29 -0500 (CDT) Subject: [Scipy-svn] r4148 - in trunk/scipy/cluster: . src tests Message-ID: <20080418021329.3820C39C225@new.scipy.org> Author: damian.eads Date: 2008-04-17 21:13:12 -0500 (Thu, 17 Apr 2008) New Revision: 4148 Added: trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml-iris.txt trunk/scipy/cluster/tests/pdist-minkowski-5.8-ml-iris.txt trunk/scipy/cluster/tests/test_hierarchy.py Removed: trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml-iris.txt trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt trunk/scipy/cluster/tests/pdist-minkowski-0.8-ml-iris.txt Modified: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/src/hierarchy.c trunk/scipy/cluster/tests/iris.txt Log: Wrote tests for about half the distance functions. Fixed Jaccard -- the C implementation was a direct copy of Hamming. It now functions as desired. Fixed check for float64 arrays in pdist so that boolean observation matrices don't generate an exception. Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/hierarchy.py 2008-04-18 02:13:12 UTC (rev 4148) @@ -175,7 +175,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -import _hierarchy_wrap, scipy, scipy.stats, numpy, types, math, sys +import _hierarchy_wrap, scipy, numpy, types, math, sys, scipy.stats _cpy_non_euclid_methods = {'single': 0, 'complete': 1, 'average': 2, 'weighted': 6} _cpy_euclid_methods = {'centroid': 3, 'median': 4, 'ward': 5} @@ -190,6 +190,15 @@ def _warning(s): print ('[WARNING] scipy-cluster: %s' % s) +def _unbiased_variance(X): + """ + Computes the unbiased variance of each dimension of a collection of + observation vectors, represented by a matrix where the rows are the + observations. + """ + #n = numpy.double(X.shape[1]) + return scipy.stats.var(X, axis=0) # * n / (n - 1.0) + def _copy_array_if_base_present(a): """ Copies the array if its base points to a parent array. @@ -235,7 +244,7 @@ matrix Z. See linkage for more information on the return structure and algorithm. - (a condensed alias for linkage) + (a condensed alias for single) """ return linkage(y, method='single', metric='euclidean') @@ -869,7 +878,7 @@ for k < n. """ - return ((scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0))).sum()) / scipy.bitwise_or(u != 0, v != 0).sum() + return numpy.double(scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0)).sum()) / numpy.double(scipy.bitwise_or(u != 0, v != 0).sum()) def kulsinski(u, v): """ @@ -1292,8 +1301,8 @@ if type(X) is not _array_type: raise TypeError('The parameter passed must be an array.') - if X.dtype != 'double': - raise TypeError('X must be a float64 array') + if X.dtype == 'float32': + raise TypeError('Floating point arrays must be 64-bit.') # The C code doesn't do striding. [X] = _copy_arrays_if_base_present([X]) @@ -1301,7 +1310,7 @@ s = X.shape if len(s) != 2: - raise ValueError('A matrix must be passed.'); + raise ValueError('A 2-dimensional array must be passed.'); m = s[0] n = s[1] @@ -1310,10 +1319,27 @@ mtype = type(metric) if mtype is types.FunctionType: k = 0 - for i in xrange(0, m - 1): - for j in xrange(i+1, m): - dm[k] = metric(X[i, :], X[j, :]) - k = k + 1 + if metric == minkowski: + for i in xrange(0, m - 1): + for j in xrange(i+1, m): + dm[k] = minkowski(X[i, :], X[j, :], p) + k = k + 1 + elif metric == seuclidean: + for i in xrange(0, m - 1): + for j in xrange(i+1, m): + dm[k] = seuclidean(X[i, :], X[j, :], V) + k = k + 1 + elif metric == mahalanobis: + for i in xrange(0, m - 1): + for j in xrange(i+1, m): + dm[k] = mahalanobis(X[i, :], X[j, :], V) + k = k + 1 + else: + for i in xrange(0, m - 1): + for j in xrange(i+1, m): + dm[k] = metric(X[i, :], X[j, :]) + k = k + 1 + elif mtype is types.StringType: mstr = metric.lower() @@ -1332,14 +1358,14 @@ elif X.dtype == 'bool': _hierarchy_wrap.pdist_hamming_bool_wrap(X, dm) else: - raise TypeError('Invalid input matrix type %s for hamming.' % str(X.dtype)) + raise TypeError('Invalid input array value type %s for hamming.' % str(X.dtype)) elif mstr in set(['jaccard', 'jacc', 'ja', 'j']): if X.dtype == 'double': - _hierarchy_wrap.pdist_hamming_wrap(X, dm) + _hierarchy_wrap.pdist_jaccard_wrap(X, dm) elif X.dtype == 'bool': - _hierarchy_wrap.pdist_hamming_bool_wrap(X, dm) + _hierarchy_wrap.pdist_jaccard_bool_wrap(X, dm) else: - raise TypeError('Invalid input matrix type %s for jaccard.' % str(X.dtype)) + raise TypeError('Invalid input array value type %s for jaccard.' % str(X.dtype)) elif mstr in set(['chebyshev', 'cheby', 'cheb', 'ch']): _hierarchy_wrap.pdist_chebyshev_wrap(X, dm) elif mstr in set(['minkowski', 'mi', 'm']): @@ -1357,7 +1383,7 @@ # The C code doesn't do striding. [VV] = _copy_arrays_if_base_present([V]) else: - VV = scipy.stats.var(X, axis=0) + VV = _unbiased_variance(X) _hierarchy_wrap.pdist_seuclidean_wrap(X, VV, dm) # Need to test whether vectorized cosine works better. # Find out: Is there a dot subtraction operator so I can @@ -1417,7 +1443,7 @@ dm = pdist(X, euclidean) elif metric == 'test_sqeuclidean': if V is None: - V = scipy.stats.var(X, axis=0) + V = _unbiased_variance(X) dm = pdist(X, lambda u, v: seuclidean(u, v, V)) elif metric == 'test_braycurtis': dm = pdist(X, braycurtis) @@ -1431,7 +1457,7 @@ elif metric == 'test_cityblock': dm = pdist(X, cityblock) elif metric == 'test_minkowski': - dm = pdist(X, minkowski) + dm = pdist(X, minkowski, p) elif metric == 'test_cosine': dm = pdist(X, cosine) elif metric == 'test_correlation': Modified: trunk/scipy/cluster/src/hierarchy.c =================================================================== --- trunk/scipy/cluster/src/hierarchy.c 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/src/hierarchy.c 2008-04-18 02:13:12 UTC (rev 4148) @@ -285,19 +285,20 @@ int i = 0; double denom = 0.0, num = 0.0; for (i = 0; i < n; i++) { - num += (u[i] != v[i]) && ((u[i] != 0) || (v[i] != 0)); - denom += (u[i] != 0) || (v[i] != 0); + num += (u[i] != v[i]) && ((u[i] != 0.0) || (v[i] != 0.0)); + denom += (u[i] != 0.0) || (v[i] != 0.0); } return num / denom; } double jaccard_distance_bool(const char *u, const char *v, int n) { int i = 0; - double s = 0.0; + double s = 0.0, num = 0.0, denom = 0.0; for (i = 0; i < n; i++) { - s = s + (u[i] != v[i]); + num += (u[i] != v[i]) && ((u[i] != 0) || (v[i] != 0)); + denom += (u[i] != 0) || (v[i] != 0); } - return s / (double)n; + return num / denom; } double dot_product(const double *u, const double *v, int n) { Modified: trunk/scipy/cluster/tests/iris.txt =================================================================== --- trunk/scipy/cluster/tests/iris.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/iris.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -1,151 +1,150 @@ -5.1,3.5,1.4,0.2 -4.9,3.0,1.4,0.2 -4.7,3.2,1.3,0.2 -4.6,3.1,1.5,0.2 -5.0,3.6,1.4,0.2 -5.4,3.9,1.7,0.4 -4.6,3.4,1.4,0.3 -5.0,3.4,1.5,0.2 -4.4,2.9,1.4,0.2 -4.9,3.1,1.5,0.1 -5.4,3.7,1.5,0.2 -4.8,3.4,1.6,0.2 -4.8,3.0,1.4,0.1 -4.3,3.0,1.1,0.1 -5.8,4.0,1.2,0.2 -5.7,4.4,1.5,0.4 -5.4,3.9,1.3,0.4 -5.1,3.5,1.4,0.3 -5.7,3.8,1.7,0.3 -5.1,3.8,1.5,0.3 -5.4,3.4,1.7,0.2 -5.1,3.7,1.5,0.4 -4.6,3.6,1.0,0.2 -5.1,3.3,1.7,0.5 -4.8,3.4,1.9,0.2 -5.0,3.0,1.6,0.2 -5.0,3.4,1.6,0.4 -5.2,3.5,1.5,0.2 -5.2,3.4,1.4,0.2 -4.7,3.2,1.6,0.2 -4.8,3.1,1.6,0.2 -5.4,3.4,1.5,0.4 -5.2,4.1,1.5,0.1 -5.5,4.2,1.4,0.2 -4.9,3.1,1.5,0.1 -5.0,3.2,1.2,0.2 -5.5,3.5,1.3,0.2 -4.9,3.1,1.5,0.1 -4.4,3.0,1.3,0.2 -5.1,3.4,1.5,0.2 -5.0,3.5,1.3,0.3 -4.5,2.3,1.3,0.3 -4.4,3.2,1.3,0.2 -5.0,3.5,1.6,0.6 -5.1,3.8,1.9,0.4 -4.8,3.0,1.4,0.3 -5.1,3.8,1.6,0.2 -4.6,3.2,1.4,0.2 -5.3,3.7,1.5,0.2 -5.0,3.3,1.4,0.2 -7.0,3.2,4.7,1.4 -6.4,3.2,4.5,1.5 -6.9,3.1,4.9,1.5 -5.5,2.3,4.0,1.3 -6.5,2.8,4.6,1.5 -5.7,2.8,4.5,1.3 -6.3,3.3,4.7,1.6 -4.9,2.4,3.3,1.0 -6.6,2.9,4.6,1.3 -5.2,2.7,3.9,1.4 -5.0,2.0,3.5,1.0 -5.9,3.0,4.2,1.5 -6.0,2.2,4.0,1.0 -6.1,2.9,4.7,1.4 -5.6,2.9,3.6,1.3 -6.7,3.1,4.4,1.4 -5.6,3.0,4.5,1.5 -5.8,2.7,4.1,1.0 -6.2,2.2,4.5,1.5 -5.6,2.5,3.9,1.1 -5.9,3.2,4.8,1.8 -6.1,2.8,4.0,1.3 -6.3,2.5,4.9,1.5 -6.1,2.8,4.7,1.2 -6.4,2.9,4.3,1.3 -6.6,3.0,4.4,1.4 -6.8,2.8,4.8,1.4 -6.7,3.0,5.0,1.7 -6.0,2.9,4.5,1.5 -5.7,2.6,3.5,1.0 -5.5,2.4,3.8,1.1 -5.5,2.4,3.7,1.0 -5.8,2.7,3.9,1.2 -6.0,2.7,5.1,1.6 -5.4,3.0,4.5,1.5 -6.0,3.4,4.5,1.6 -6.7,3.1,4.7,1.5 -6.3,2.3,4.4,1.3 -5.6,3.0,4.1,1.3 -5.5,2.5,4.0,1.3 -5.5,2.6,4.4,1.2 -6.1,3.0,4.6,1.4 -5.8,2.6,4.0,1.2 -5.0,2.3,3.3,1.0 -5.6,2.7,4.2,1.3 -5.7,3.0,4.2,1.2 -5.7,2.9,4.2,1.3 -6.2,2.9,4.3,1.3 -5.1,2.5,3.0,1.1 -5.7,2.8,4.1,1.3 -6.3,3.3,6.0,2.5 -5.8,2.7,5.1,1.9 -7.1,3.0,5.9,2.1 -6.3,2.9,5.6,1.8 -6.5,3.0,5.8,2.2 -7.6,3.0,6.6,2.1 -4.9,2.5,4.5,1.7 -7.3,2.9,6.3,1.8 -6.7,2.5,5.8,1.8 -7.2,3.6,6.1,2.5 -6.5,3.2,5.1,2.0 -6.4,2.7,5.3,1.9 -6.8,3.0,5.5,2.1 -5.7,2.5,5.0,2.0 -5.8,2.8,5.1,2.4 -6.4,3.2,5.3,2.3 -6.5,3.0,5.5,1.8 -7.7,3.8,6.7,2.2 -7.7,2.6,6.9,2.3 -6.0,2.2,5.0,1.5 -6.9,3.2,5.7,2.3 -5.6,2.8,4.9,2.0 -7.7,2.8,6.7,2.0 -6.3,2.7,4.9,1.8 -6.7,3.3,5.7,2.1 -7.2,3.2,6.0,1.8 -6.2,2.8,4.8,1.8 -6.1,3.0,4.9,1.8 -6.4,2.8,5.6,2.1 -7.2,3.0,5.8,1.6 -7.4,2.8,6.1,1.9 -7.9,3.8,6.4,2.0 -6.4,2.8,5.6,2.2 -6.3,2.8,5.1,1.5 -6.1,2.6,5.6,1.4 -7.7,3.0,6.1,2.3 -6.3,3.4,5.6,2.4 -6.4,3.1,5.5,1.8 -6.0,3.0,4.8,1.8 -6.9,3.1,5.4,2.1 -6.7,3.1,5.6,2.4 -6.9,3.1,5.1,2.3 -5.8,2.7,5.1,1.9 -6.8,3.2,5.9,2.3 -6.7,3.3,5.7,2.5 -6.7,3.0,5.2,2.3 -6.3,2.5,5.0,1.9 -6.5,3.0,5.2,2.0 -6.2,3.4,5.4,2.3 -5.9,3.0,5.1,1.8 - +5.099999999999999645e+00 3.500000000000000000e+00 1.399999999999999911e+00 2.000000000000000111e-01 +4.900000000000000355e+00 3.000000000000000000e+00 1.399999999999999911e+00 2.000000000000000111e-01 +4.700000000000000178e+00 3.200000000000000178e+00 1.300000000000000044e+00 2.000000000000000111e-01 +4.599999999999999645e+00 3.100000000000000089e+00 1.500000000000000000e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.600000000000000089e+00 1.399999999999999911e+00 2.000000000000000111e-01 +5.400000000000000355e+00 3.899999999999999911e+00 1.699999999999999956e+00 4.000000000000000222e-01 +4.599999999999999645e+00 3.399999999999999911e+00 1.399999999999999911e+00 2.999999999999999889e-01 +5.000000000000000000e+00 3.399999999999999911e+00 1.500000000000000000e+00 2.000000000000000111e-01 +4.400000000000000355e+00 2.899999999999999911e+00 1.399999999999999911e+00 2.000000000000000111e-01 +4.900000000000000355e+00 3.100000000000000089e+00 1.500000000000000000e+00 1.000000000000000056e-01 +5.400000000000000355e+00 3.700000000000000178e+00 1.500000000000000000e+00 2.000000000000000111e-01 +4.799999999999999822e+00 3.399999999999999911e+00 1.600000000000000089e+00 2.000000000000000111e-01 +4.799999999999999822e+00 3.000000000000000000e+00 1.399999999999999911e+00 1.000000000000000056e-01 +4.299999999999999822e+00 3.000000000000000000e+00 1.100000000000000089e+00 1.000000000000000056e-01 +5.799999999999999822e+00 4.000000000000000000e+00 1.199999999999999956e+00 2.000000000000000111e-01 +5.700000000000000178e+00 4.400000000000000355e+00 1.500000000000000000e+00 4.000000000000000222e-01 +5.400000000000000355e+00 3.899999999999999911e+00 1.300000000000000044e+00 4.000000000000000222e-01 +5.099999999999999645e+00 3.500000000000000000e+00 1.399999999999999911e+00 2.999999999999999889e-01 +5.700000000000000178e+00 3.799999999999999822e+00 1.699999999999999956e+00 2.999999999999999889e-01 +5.099999999999999645e+00 3.799999999999999822e+00 1.500000000000000000e+00 2.999999999999999889e-01 +5.400000000000000355e+00 3.399999999999999911e+00 1.699999999999999956e+00 2.000000000000000111e-01 +5.099999999999999645e+00 3.700000000000000178e+00 1.500000000000000000e+00 4.000000000000000222e-01 +4.599999999999999645e+00 3.600000000000000089e+00 1.000000000000000000e+00 2.000000000000000111e-01 +5.099999999999999645e+00 3.299999999999999822e+00 1.699999999999999956e+00 5.000000000000000000e-01 +4.799999999999999822e+00 3.399999999999999911e+00 1.899999999999999911e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.000000000000000000e+00 1.600000000000000089e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.399999999999999911e+00 1.600000000000000089e+00 4.000000000000000222e-01 +5.200000000000000178e+00 3.500000000000000000e+00 1.500000000000000000e+00 2.000000000000000111e-01 +5.200000000000000178e+00 3.399999999999999911e+00 1.399999999999999911e+00 2.000000000000000111e-01 +4.700000000000000178e+00 3.200000000000000178e+00 1.600000000000000089e+00 2.000000000000000111e-01 +4.799999999999999822e+00 3.100000000000000089e+00 1.600000000000000089e+00 2.000000000000000111e-01 +5.400000000000000355e+00 3.399999999999999911e+00 1.500000000000000000e+00 4.000000000000000222e-01 +5.200000000000000178e+00 4.099999999999999645e+00 1.500000000000000000e+00 1.000000000000000056e-01 +5.500000000000000000e+00 4.200000000000000178e+00 1.399999999999999911e+00 2.000000000000000111e-01 +4.900000000000000355e+00 3.100000000000000089e+00 1.500000000000000000e+00 1.000000000000000056e-01 +5.000000000000000000e+00 3.200000000000000178e+00 1.199999999999999956e+00 2.000000000000000111e-01 +5.500000000000000000e+00 3.500000000000000000e+00 1.300000000000000044e+00 2.000000000000000111e-01 +4.900000000000000355e+00 3.100000000000000089e+00 1.500000000000000000e+00 1.000000000000000056e-01 +4.400000000000000355e+00 3.000000000000000000e+00 1.300000000000000044e+00 2.000000000000000111e-01 +5.099999999999999645e+00 3.399999999999999911e+00 1.500000000000000000e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.500000000000000000e+00 1.300000000000000044e+00 2.999999999999999889e-01 +4.500000000000000000e+00 2.299999999999999822e+00 1.300000000000000044e+00 2.999999999999999889e-01 +4.400000000000000355e+00 3.200000000000000178e+00 1.300000000000000044e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.500000000000000000e+00 1.600000000000000089e+00 5.999999999999999778e-01 +5.099999999999999645e+00 3.799999999999999822e+00 1.899999999999999911e+00 4.000000000000000222e-01 +4.799999999999999822e+00 3.000000000000000000e+00 1.399999999999999911e+00 2.999999999999999889e-01 +5.099999999999999645e+00 3.799999999999999822e+00 1.600000000000000089e+00 2.000000000000000111e-01 +4.599999999999999645e+00 3.200000000000000178e+00 1.399999999999999911e+00 2.000000000000000111e-01 +5.299999999999999822e+00 3.700000000000000178e+00 1.500000000000000000e+00 2.000000000000000111e-01 +5.000000000000000000e+00 3.299999999999999822e+00 1.399999999999999911e+00 2.000000000000000111e-01 +7.000000000000000000e+00 3.200000000000000178e+00 4.700000000000000178e+00 1.399999999999999911e+00 +6.400000000000000355e+00 3.200000000000000178e+00 4.500000000000000000e+00 1.500000000000000000e+00 +6.900000000000000355e+00 3.100000000000000089e+00 4.900000000000000355e+00 1.500000000000000000e+00 +5.500000000000000000e+00 2.299999999999999822e+00 4.000000000000000000e+00 1.300000000000000044e+00 +6.500000000000000000e+00 2.799999999999999822e+00 4.599999999999999645e+00 1.500000000000000000e+00 +5.700000000000000178e+00 2.799999999999999822e+00 4.500000000000000000e+00 1.300000000000000044e+00 +6.299999999999999822e+00 3.299999999999999822e+00 4.700000000000000178e+00 1.600000000000000089e+00 +4.900000000000000355e+00 2.399999999999999911e+00 3.299999999999999822e+00 1.000000000000000000e+00 +6.599999999999999645e+00 2.899999999999999911e+00 4.599999999999999645e+00 1.300000000000000044e+00 +5.200000000000000178e+00 2.700000000000000178e+00 3.899999999999999911e+00 1.399999999999999911e+00 +5.000000000000000000e+00 2.000000000000000000e+00 3.500000000000000000e+00 1.000000000000000000e+00 +5.900000000000000355e+00 3.000000000000000000e+00 4.200000000000000178e+00 1.500000000000000000e+00 +6.000000000000000000e+00 2.200000000000000178e+00 4.000000000000000000e+00 1.000000000000000000e+00 +6.099999999999999645e+00 2.899999999999999911e+00 4.700000000000000178e+00 1.399999999999999911e+00 +5.599999999999999645e+00 2.899999999999999911e+00 3.600000000000000089e+00 1.300000000000000044e+00 +6.700000000000000178e+00 3.100000000000000089e+00 4.400000000000000355e+00 1.399999999999999911e+00 +5.599999999999999645e+00 3.000000000000000000e+00 4.500000000000000000e+00 1.500000000000000000e+00 +5.799999999999999822e+00 2.700000000000000178e+00 4.099999999999999645e+00 1.000000000000000000e+00 +6.200000000000000178e+00 2.200000000000000178e+00 4.500000000000000000e+00 1.500000000000000000e+00 +5.599999999999999645e+00 2.500000000000000000e+00 3.899999999999999911e+00 1.100000000000000089e+00 +5.900000000000000355e+00 3.200000000000000178e+00 4.799999999999999822e+00 1.800000000000000044e+00 +6.099999999999999645e+00 2.799999999999999822e+00 4.000000000000000000e+00 1.300000000000000044e+00 +6.299999999999999822e+00 2.500000000000000000e+00 4.900000000000000355e+00 1.500000000000000000e+00 +6.099999999999999645e+00 2.799999999999999822e+00 4.700000000000000178e+00 1.199999999999999956e+00 +6.400000000000000355e+00 2.899999999999999911e+00 4.299999999999999822e+00 1.300000000000000044e+00 +6.599999999999999645e+00 3.000000000000000000e+00 4.400000000000000355e+00 1.399999999999999911e+00 +6.799999999999999822e+00 2.799999999999999822e+00 4.799999999999999822e+00 1.399999999999999911e+00 +6.700000000000000178e+00 3.000000000000000000e+00 5.000000000000000000e+00 1.699999999999999956e+00 +6.000000000000000000e+00 2.899999999999999911e+00 4.500000000000000000e+00 1.500000000000000000e+00 +5.700000000000000178e+00 2.600000000000000089e+00 3.500000000000000000e+00 1.000000000000000000e+00 +5.500000000000000000e+00 2.399999999999999911e+00 3.799999999999999822e+00 1.100000000000000089e+00 +5.500000000000000000e+00 2.399999999999999911e+00 3.700000000000000178e+00 1.000000000000000000e+00 +5.799999999999999822e+00 2.700000000000000178e+00 3.899999999999999911e+00 1.199999999999999956e+00 +6.000000000000000000e+00 2.700000000000000178e+00 5.099999999999999645e+00 1.600000000000000089e+00 +5.400000000000000355e+00 3.000000000000000000e+00 4.500000000000000000e+00 1.500000000000000000e+00 +6.000000000000000000e+00 3.399999999999999911e+00 4.500000000000000000e+00 1.600000000000000089e+00 +6.700000000000000178e+00 3.100000000000000089e+00 4.700000000000000178e+00 1.500000000000000000e+00 +6.299999999999999822e+00 2.299999999999999822e+00 4.400000000000000355e+00 1.300000000000000044e+00 +5.599999999999999645e+00 3.000000000000000000e+00 4.099999999999999645e+00 1.300000000000000044e+00 +5.500000000000000000e+00 2.500000000000000000e+00 4.000000000000000000e+00 1.300000000000000044e+00 +5.500000000000000000e+00 2.600000000000000089e+00 4.400000000000000355e+00 1.199999999999999956e+00 +6.099999999999999645e+00 3.000000000000000000e+00 4.599999999999999645e+00 1.399999999999999911e+00 +5.799999999999999822e+00 2.600000000000000089e+00 4.000000000000000000e+00 1.199999999999999956e+00 +5.000000000000000000e+00 2.299999999999999822e+00 3.299999999999999822e+00 1.000000000000000000e+00 +5.599999999999999645e+00 2.700000000000000178e+00 4.200000000000000178e+00 1.300000000000000044e+00 +5.700000000000000178e+00 3.000000000000000000e+00 4.200000000000000178e+00 1.199999999999999956e+00 +5.700000000000000178e+00 2.899999999999999911e+00 4.200000000000000178e+00 1.300000000000000044e+00 +6.200000000000000178e+00 2.899999999999999911e+00 4.299999999999999822e+00 1.300000000000000044e+00 +5.099999999999999645e+00 2.500000000000000000e+00 3.000000000000000000e+00 1.100000000000000089e+00 +5.700000000000000178e+00 2.799999999999999822e+00 4.099999999999999645e+00 1.300000000000000044e+00 +6.299999999999999822e+00 3.299999999999999822e+00 6.000000000000000000e+00 2.500000000000000000e+00 +5.799999999999999822e+00 2.700000000000000178e+00 5.099999999999999645e+00 1.899999999999999911e+00 +7.099999999999999645e+00 3.000000000000000000e+00 5.900000000000000355e+00 2.100000000000000089e+00 +6.299999999999999822e+00 2.899999999999999911e+00 5.599999999999999645e+00 1.800000000000000044e+00 +6.500000000000000000e+00 3.000000000000000000e+00 5.799999999999999822e+00 2.200000000000000178e+00 +7.599999999999999645e+00 3.000000000000000000e+00 6.599999999999999645e+00 2.100000000000000089e+00 +4.900000000000000355e+00 2.500000000000000000e+00 4.500000000000000000e+00 1.699999999999999956e+00 +7.299999999999999822e+00 2.899999999999999911e+00 6.299999999999999822e+00 1.800000000000000044e+00 +6.700000000000000178e+00 2.500000000000000000e+00 5.799999999999999822e+00 1.800000000000000044e+00 +7.200000000000000178e+00 3.600000000000000089e+00 6.099999999999999645e+00 2.500000000000000000e+00 +6.500000000000000000e+00 3.200000000000000178e+00 5.099999999999999645e+00 2.000000000000000000e+00 +6.400000000000000355e+00 2.700000000000000178e+00 5.299999999999999822e+00 1.899999999999999911e+00 +6.799999999999999822e+00 3.000000000000000000e+00 5.500000000000000000e+00 2.100000000000000089e+00 +5.700000000000000178e+00 2.500000000000000000e+00 5.000000000000000000e+00 2.000000000000000000e+00 +5.799999999999999822e+00 2.799999999999999822e+00 5.099999999999999645e+00 2.399999999999999911e+00 +6.400000000000000355e+00 3.200000000000000178e+00 5.299999999999999822e+00 2.299999999999999822e+00 +6.500000000000000000e+00 3.000000000000000000e+00 5.500000000000000000e+00 1.800000000000000044e+00 +7.700000000000000178e+00 3.799999999999999822e+00 6.700000000000000178e+00 2.200000000000000178e+00 +7.700000000000000178e+00 2.600000000000000089e+00 6.900000000000000355e+00 2.299999999999999822e+00 +6.000000000000000000e+00 2.200000000000000178e+00 5.000000000000000000e+00 1.500000000000000000e+00 +6.900000000000000355e+00 3.200000000000000178e+00 5.700000000000000178e+00 2.299999999999999822e+00 +5.599999999999999645e+00 2.799999999999999822e+00 4.900000000000000355e+00 2.000000000000000000e+00 +7.700000000000000178e+00 2.799999999999999822e+00 6.700000000000000178e+00 2.000000000000000000e+00 +6.299999999999999822e+00 2.700000000000000178e+00 4.900000000000000355e+00 1.800000000000000044e+00 +6.700000000000000178e+00 3.299999999999999822e+00 5.700000000000000178e+00 2.100000000000000089e+00 +7.200000000000000178e+00 3.200000000000000178e+00 6.000000000000000000e+00 1.800000000000000044e+00 +6.200000000000000178e+00 2.799999999999999822e+00 4.799999999999999822e+00 1.800000000000000044e+00 +6.099999999999999645e+00 3.000000000000000000e+00 4.900000000000000355e+00 1.800000000000000044e+00 +6.400000000000000355e+00 2.799999999999999822e+00 5.599999999999999645e+00 2.100000000000000089e+00 +7.200000000000000178e+00 3.000000000000000000e+00 5.799999999999999822e+00 1.600000000000000089e+00 +7.400000000000000355e+00 2.799999999999999822e+00 6.099999999999999645e+00 1.899999999999999911e+00 +7.900000000000000355e+00 3.799999999999999822e+00 6.400000000000000355e+00 2.000000000000000000e+00 +6.400000000000000355e+00 2.799999999999999822e+00 5.599999999999999645e+00 2.200000000000000178e+00 +6.299999999999999822e+00 2.799999999999999822e+00 5.099999999999999645e+00 1.500000000000000000e+00 +6.099999999999999645e+00 2.600000000000000089e+00 5.599999999999999645e+00 1.399999999999999911e+00 +7.700000000000000178e+00 3.000000000000000000e+00 6.099999999999999645e+00 2.299999999999999822e+00 +6.299999999999999822e+00 3.399999999999999911e+00 5.599999999999999645e+00 2.399999999999999911e+00 +6.400000000000000355e+00 3.100000000000000089e+00 5.500000000000000000e+00 1.800000000000000044e+00 +6.000000000000000000e+00 3.000000000000000000e+00 4.799999999999999822e+00 1.800000000000000044e+00 +6.900000000000000355e+00 3.100000000000000089e+00 5.400000000000000355e+00 2.100000000000000089e+00 +6.700000000000000178e+00 3.100000000000000089e+00 5.599999999999999645e+00 2.399999999999999911e+00 +6.900000000000000355e+00 3.100000000000000089e+00 5.099999999999999645e+00 2.299999999999999822e+00 +5.799999999999999822e+00 2.700000000000000178e+00 5.099999999999999645e+00 1.899999999999999911e+00 +6.799999999999999822e+00 3.200000000000000178e+00 5.900000000000000355e+00 2.299999999999999822e+00 +6.700000000000000178e+00 3.299999999999999822e+00 5.700000000000000178e+00 2.500000000000000000e+00 +6.700000000000000178e+00 3.000000000000000000e+00 5.200000000000000178e+00 2.299999999999999822e+00 +6.299999999999999822e+00 2.500000000000000000e+00 5.000000000000000000e+00 1.899999999999999911e+00 +6.500000000000000000e+00 3.000000000000000000e+00 5.200000000000000178e+00 2.000000000000000000e+00 +6.200000000000000178e+00 3.399999999999999911e+00 5.400000000000000355e+00 2.299999999999999822e+00 +5.900000000000000355e+00 3.000000000000000000e+00 5.099999999999999645e+00 1.800000000000000044e+00 Deleted: trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml-iris.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml-iris.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml-iris.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -1 +0,0 @@ - 1.0683811e+00 1.5760969e+00 1.9394676e+00 3.1748021e-01 2.9891849e+00 1.2845725e+00 6.2402515e-01 2.0611757e+00 1.8793802e+00 1.2034300e+00 1.2034300e+00 1.7448317e+00 3.9243446e+00 2.7825075e+00 4.0269799e+00 2.4086604e+00 1.0000000e-01 3.0655002e+00 9.8003160e-01 1.3974652e+00 1.0211725e+00 1.9394676e+00 1.6529143e+00 1.7448317e+00 1.5319850e+00 1.4773595e+00 3.1748021e-01 3.1748021e-01 1.8435146e+00 1.8435146e+00 1.6872569e+00 1.9428691e+00 1.7196842e+00 1.8793802e+00 1.2034300e+00 7.3049739e-01 1.8793802e+00 2.4650524e+00 3.1748021e-01 6.2402515e-01 4.1655982e+00 2.0628679e+00 1.3720717e+00 2.0228388e+00 1.7448317e+00 7.8728875e-01 1.2538012e+00 1.0211725e+00 4.6533907e-01 1.5199305e+01 1.3649727e+01 1.6065282e+01 1.2382343e+01 1.5662987e+01 1.2602703e+01 1.3502288e+01 9.1888669e+00 1.5011090e+01 9.9718381e+00 9.9204782e+00 1.2538056e+01 1.3460053e+01 1.4129171e+01 1.0330700e+01 1.4385194e+01 1.2091550e+01 1.1687298e+01 1.6474589e+01 1.1509061e+01 1.3516562e+01 1.2909619e+01 1.6654830e+01 1.3916958e+01 1.3942373e+01 1.4542009e+01 1.6527654e+01 1.6711449e+01 1.3738426e+01 1.0546398e+01 1.1219362e+01 1.0755609e+01 1.1881396e+01 1.5755760e+01 1.1315163e+01 1.1748615e+01 1.5211055e+01 1.5724111e+01 1.0903391e+01 1.1859699e+01 1.2034768e+01 1.3586762e+01 1.2357506e+01 8.8961475e+00 1.2030641e+01 1.1153503e+01 1.1750673e+01 1.3412676e+01 7.1839946e+00 1.1890723e+01 1.7886099e+01 1.5855275e+01 2.0425498e+01 1.7361259e+01 1.8894496e+01 2.2938448e+01 1.2851368e+01 2.1272064e+01 2.0276922e+01 1.9762275e+01 1.6235816e+01 1.8097054e+01 1.8917907e+01 1.6189983e+01 1.6682652e+01 1.7031228e+01 1.7350188e+01 2.2612293e+01 2.5949705e+01 1.6807962e+01 1.9093094e+01 1.4671174e+01 2.3955931e+01 1.6809065e+01 1.7531367e+01 1.9103911e+01 1.5989379e+01 1.5140544e+01 1.8794561e+01 1.9138262e+01 2.1839783e+01 2.2002703e+01 1.9042742e+01 1.6039454e+01 1.6723619e+01 2.2786706e+01 1.6300847e+01 1.6646800e+01 1.4660200e+01 1.8546631e+01 1.9119917e+01 1.8471513e+01 1.5855275e+01 1.9192848e+01 1.8476868e+01 1.8583778e+01 1.7908096e+01 1.7314530e+01 1.5448856e+01 1.4877480e+01 1.0211725e+00 9.8003160e-01 9.7877528e-01 4.4975387e+00 1.5760969e+00 1.1359060e+00 8.5602218e-01 6.2402515e-01 2.4650524e+00 1.3720717e+00 3.1748021e-01 1.9065209e+00 4.0642614e+00 5.3336079e+00 3.8075218e+00 1.5319850e+00 4.5626328e+00 2.5602448e+00 2.4749599e+00 2.7130023e+00 2.6602921e+00 2.7566600e+00 1.9394676e+00 4.6533907e-01 2.1654045e+00 1.7448317e+00 1.1066229e+00 1.2480503e+00 8.1287374e-01 2.8352192e+00 3.2996458e+00 2.7920344e+00 6.2402515e-01 1.0211725e+00 2.2968911e+00 6.2402515e-01 8.5602218e-01 1.3720717e+00 1.7799212e+00 2.8810032e+00 1.5319850e+00 2.8352192e+00 3.9956728e+00 3.1748021e-01 2.2718121e+00 7.8728875e-01 2.2705666e+00 6.0103306e-01 1.5130575e+01 1.3650089e+01 1.4903359e+01 1.1708978e+01 1.4071191e+01 1.1308305e+01 1.4522553e+01 6.5217864e+00 1.3161552e+01 9.3333851e+00 8.7979402e+00 1.0185743e+01 1.2641970e+01 1.2399163e+01 8.9403308e+00 1.3294481e+01 9.8678493e+00 1.0561729e+01 1.5543982e+01 1.0668583e+01 1.3613269e+01 1.1499992e+01 1.5480132e+01 1.2462837e+01 1.2173586e+01 1.1920808e+01 1.4864868e+01 1.3920055e+01 1.2048822e+01 9.6101173e+00 1.0510171e+01 1.0058526e+01 1.0748161e+01 1.4428378e+01 9.2609326e+00 1.3806900e+01 1.4095133e+01 1.4732761e+01 8.7754052e+00 1.1058270e+01 1.1134782e+01 1.1110434e+01 1.1326250e+01 7.6990480e+00 1.0961805e+01 8.9690642e+00 1.0245894e+01 1.1702023e+01 7.3330940e+00 1.0627064e+01 1.9025233e+01 1.4579343e+01 1.7347056e+01 1.5439583e+01 1.5980157e+01 1.9666519e+01 9.6908781e+00 1.9062221e+01 1.8944332e+01 2.3008315e+01 1.6221659e+01 1.6614163e+01 1.5965732e+01 1.5179701e+01 1.5193710e+01 1.7031624e+01 1.4538554e+01 2.5403102e+01 2.4250020e+01 1.5912464e+01 1.9028012e+01 1.3334930e+01 2.1937251e+01 1.5386187e+01 1.8602394e+01 1.9010148e+01 1.4430270e+01 1.2548026e+01 1.7093414e+01 1.6134520e+01 1.9917848e+01 2.4750545e+01 1.7332389e+01 1.4461212e+01 1.5477485e+01 1.9517138e+01 1.8569312e+01 1.5528152e+01 1.2123183e+01 1.7314471e+01 1.7894698e+01 1.7241393e+01 1.4579343e+01 1.9138662e+01 1.9570235e+01 1.5664655e+01 1.6698052e+01 1.4505331e+01 1.7689565e+01 1.2348299e+01 8.1287374e-01 1.5760969e+00 4.8297594e+00 1.2337044e+00 1.4448053e+00 1.3974652e+00 1.4773595e+00 2.7825075e+00 1.2034300e+00 1.2337044e+00 2.1654045e+00 3.6784371e+00 5.8198986e+00 3.1626930e+00 2.1096674e+00 4.8041001e+00 3.0306837e+00 2.5781299e+00 3.1702938e+00 1.5760969e+00 2.8915475e+00 1.6856955e+00 1.6529143e+00 2.4994860e+00 2.0228388e+00 1.5319850e+00 3.0000000e-01 9.8003160e-01 3.0424191e+00 3.8075218e+00 3.5147734e+00 1.4773595e+00 6.0103306e-01 1.6699961e+00 1.4773595e+00 7.8728875e-01 1.6257475e+00 1.3974652e+00 2.1222843e+00 3.0000000e-01 3.2648893e+00 4.3917116e+00 1.2337044e+00 2.6602921e+00 3.1748021e-01 2.6058219e+00 9.8003160e-01 1.3886166e+01 1.2515926e+01 1.5524018e+01 1.3126963e+01 1.5694765e+01 1.2933371e+01 1.4062164e+01 8.6362796e+00 1.4919460e+01 1.0973325e+01 1.0421006e+01 1.2544262e+01 1.3943877e+01 1.4178584e+01 1.0637614e+01 1.3915993e+01 1.2263137e+01 1.2030641e+01 1.6906234e+01 1.2079647e+01 1.2548026e+01 1.3067993e+01 1.6931298e+01 1.4062690e+01 1.3908468e+01 1.4317754e+01 1.6487478e+01 1.6438120e+01 1.3829977e+01 1.1001145e+01 1.1908705e+01 1.1436731e+01 1.2232560e+01 1.6018607e+01 1.1672107e+01 1.3584712e+01 1.4724239e+01 1.6085654e+01 1.1077285e+01 1.2519379e+01 1.2641727e+01 1.3502288e+01 1.2767629e+01 9.3133996e+00 1.2500885e+01 1.1260510e+01 1.1988369e+01 1.3436549e+01 8.8434778e+00 1.2223450e+01 1.8487478e+01 1.6219054e+01 2.0031090e+01 1.7326758e+01 1.8642237e+01 2.2434638e+01 1.2143194e+01 2.0992084e+01 2.0445516e+01 2.2762233e+01 1.4980022e+01 1.8225192e+01 1.8599072e+01 1.6737141e+01 1.6974484e+01 1.5773305e+01 1.7111275e+01 2.5223437e+01 2.5867419e+01 1.7310799e+01 1.7650473e+01 1.5087681e+01 2.3715766e+01 1.6971141e+01 1.8025241e+01 1.7604147e+01 1.6105060e+01 1.5045918e+01 1.8836504e+01 1.8738941e+01 2.1659051e+01 2.4564658e+01 1.9084905e+01 1.6116801e+01 1.7005463e+01 2.2278046e+01 1.8245286e+01 1.6199955e+01 1.4607957e+01 1.7963213e+01 1.8568002e+01 1.7894715e+01 1.6219054e+01 1.7763994e+01 1.8981142e+01 1.8294506e+01 1.8190541e+01 1.7081179e+01 1.7390173e+01 1.4863989e+01 1.9394676e+00 4.6383693e+00 9.8003160e-01 1.1066229e+00 1.0211725e+00 6.0103306e-01 2.2132457e+00 1.2034300e+00 1.2337044e+00 2.1096674e+00 4.7282906e+00 4.9478896e+00 4.6383693e+00 2.5152850e+00 4.5992589e+00 2.4650524e+00 2.5196315e+00 2.6058219e+00 1.5874011e+00 2.9320989e+00 1.8435146e+00 1.1359060e+00 2.4086604e+00 1.5745775e+00 1.9065209e+00 6.2402515e-01 4.6533907e-01 2.5196315e+00 3.1410377e+00 3.8599252e+00 6.0103306e-01 1.5760969e+00 2.9058572e+00 6.0103306e-01 1.0211725e+00 1.2538012e+00 2.6292664e+00 2.5602448e+00 1.0211725e+00 3.1284501e+00 4.3768242e+00 1.2337044e+00 2.4650524e+00 3.1748021e-01 2.0611757e+00 1.3720717e+00 1.4949205e+01 1.3552973e+01 1.4149173e+01 1.2746928e+01 1.5098077e+01 1.2431738e+01 1.4565741e+01 8.4189234e+00 1.4265547e+01 1.0586804e+01 1.0190228e+01 1.1845622e+01 1.3516479e+01 1.3569735e+01 1.0080743e+01 1.2587964e+01 1.1613319e+01 1.1553992e+01 1.6458101e+01 1.1661541e+01 1.3631975e+01 1.2506053e+01 1.6443605e+01 1.3518980e+01 1.3268231e+01 1.3548443e+01 1.5874084e+01 1.5647085e+01 1.3225436e+01 1.0541341e+01 1.1516902e+01 1.1044947e+01 1.1741421e+01 1.5513515e+01 1.1061726e+01 1.3973799e+01 1.3378578e+01 1.5621176e+01 1.0435315e+01 1.2113655e+01 1.2232650e+01 1.2786907e+01 1.2302913e+01 9.0487423e+00 1.2042373e+01 1.0608917e+01 1.1428733e+01 1.2816251e+01 8.4950667e+00 1.1713794e+01 1.9098910e+01 1.5729118e+01 1.9190544e+01 1.6688193e+01 1.7848999e+01 2.1558564e+01 1.1950217e+01 2.0277352e+01 1.9931833e+01 2.3108353e+01 1.6113637e+01 1.7673275e+01 1.7782121e+01 1.6305410e+01 1.6430438e+01 1.6943162e+01 1.6335430e+01 2.5515941e+01 2.5266906e+01 1.6896031e+01 1.8862638e+01 1.4583109e+01 2.3041560e+01 1.6424987e+01 1.8599072e+01 1.8813252e+01 1.5528301e+01 1.4311193e+01 1.8241083e+01 1.7914146e+01 2.1001149e+01 2.4839535e+01 1.8486325e+01 1.5545880e+01 1.6531118e+01 2.1386990e+01 1.8707574e+01 1.4845159e+01 1.3885107e+01 1.6522806e+01 1.7123369e+01 1.6445405e+01 1.5729118e+01 1.8990048e+01 1.9566845e+01 1.7476427e+01 1.7692813e+01 1.6295164e+01 1.7843270e+01 1.4155799e+01 2.9891849e+00 1.3720717e+00 4.6533907e-01 2.0611757e+00 1.7799212e+00 1.1359060e+00 1.2480503e+00 1.6856955e+00 3.9500734e+00 2.7441434e+00 4.0481603e+00 2.4086604e+00 6.2402515e-01 2.9784994e+00 1.2337044e+00 1.8435146e+00 1.2337044e+00 1.2699208e+00 2.4404310e+00 1.7965249e+00 1.2020661e+00 1.2480503e+00 8.1287374e-01 6.3496042e-01 1.8435146e+00 1.7965249e+00 2.1654045e+00 2.0600534e+00 1.7432492e+00 1.7799212e+00 9.3067814e-01 1.2845725e+00 1.7799212e+00 2.4768885e+00 8.1287374e-01 6.2402515e-01 4.1027239e+00 2.1079600e+00 1.3720717e+00 2.3563262e+00 1.6856955e+00 1.0211725e+00 1.2699208e+00 9.8003160e-01 3.0000000e-01 1.5885580e+01 1.4342699e+01 1.6726423e+01 1.3015952e+01 1.6263978e+01 1.3245927e+01 1.4264810e+01 8.8961475e+00 1.5615144e+01 1.0794471e+01 9.0966241e+00 1.3187697e+01 1.4004123e+01 1.4760482e+01 1.0964233e+01 1.5028936e+01 1.2788364e+01 1.2278631e+01 1.7040550e+01 1.2113655e+01 1.4259081e+01 1.3500058e+01 1.7242856e+01 1.4525171e+01 1.4542971e+01 1.5162979e+01 1.7122087e+01 1.7361002e+01 1.4374434e+01 1.1119462e+01 1.1837173e+01 1.1363242e+01 1.2476580e+01 1.6390006e+01 1.2062629e+01 1.2612885e+01 1.5869143e+01 1.6278714e+01 1.1572443e+01 1.2500793e+01 1.2690654e+01 1.4232228e+01 1.2949021e+01 8.1258010e+00 1.2669797e+01 1.1806409e+01 1.2394540e+01 1.4021062e+01 8.3567683e+00 1.2519379e+01 1.8737933e+01 1.6522234e+01 2.1105670e+01 1.8025065e+01 1.9590654e+01 2.3628381e+01 1.2525860e+01 2.1925476e+01 2.0880164e+01 1.8637340e+01 1.6970100e+01 1.8723742e+01 1.9593859e+01 1.6856171e+01 1.7380354e+01 1.7787417e+01 1.8023258e+01 2.2240849e+01 2.6577362e+01 1.7401998e+01 1.9849461e+01 1.5378705e+01 2.4600487e+01 1.7426407e+01 1.8345685e+01 1.9845368e+01 1.6621080e+01 1.5814189e+01 1.9448698e+01 1.9796449e+01 2.2472697e+01 2.1628673e+01 1.9700284e+01 1.6662369e+01 1.7345859e+01 2.3471116e+01 1.7250384e+01 1.7350188e+01 1.5337280e+01 1.9246402e+01 1.9840267e+01 1.9170162e+01 1.6522234e+01 1.9956596e+01 1.9308243e+01 1.9261198e+01 1.8513258e+01 1.7987051e+01 1.6388067e+01 1.5572449e+01 3.9243446e+00 3.1702938e+00 5.7837411e+00 4.3044426e+00 1.2480503e+00 3.2484124e+00 5.0617707e+00 7.0185681e+00 2.8352192e+00 2.0228388e+00 4.0000000e-01 2.6621660e+00 9.8003160e-01 1.6872569e+00 1.0683811e+00 1.4448053e+00 4.7544555e+00 1.9065209e+00 3.6016092e+00 3.5752200e+00 1.9394676e+00 2.4674089e+00 2.9320989e+00 3.8537088e+00 3.8423451e+00 1.0683811e+00 2.2524858e+00 2.1958558e+00 4.3044426e+00 4.3768242e+00 2.6292664e+00 4.3044426e+00 5.8857526e+00 2.9320989e+00 3.1284501e+00 6.5652439e+00 5.4475242e+00 2.6292664e+00 1.2034300e+00 4.3366937e+00 1.6872569e+00 4.7544555e+00 1.7382670e+00 3.6635621e+00 1.4944658e+01 1.3285812e+01 1.5700236e+01 1.0777549e+01 1.4966823e+01 1.1538395e+01 1.3297809e+01 1.0066697e+01 1.4370445e+01 1.0508179e+01 1.0958178e+01 1.1770874e+01 1.2243948e+01 1.3377582e+01 9.2099134e+00 1.3943877e+01 1.1077285e+01 1.0586804e+01 1.5424179e+01 1.0149607e+01 1.3012133e+01 1.2053876e+01 1.5762118e+01 1.3066477e+01 1.3247734e+01 1.3987735e+01 1.5879523e+01 1.6246477e+01 1.2952973e+01 9.3143156e+00 9.6410330e+00 9.1658052e+00 1.0813285e+01 1.4870325e+01 9.4670761e+00 1.1663634e+01 1.4801876e+01 1.4708005e+01 9.8667010e+00 1.0340823e+01 1.0550351e+01 1.2909712e+01 1.1241066e+01 9.9314085e+00 1.0794471e+01 1.0213635e+01 1.0748161e+01 1.2665879e+01 8.7999548e+00 1.0821191e+01 1.7842778e+01 1.4874653e+01 2.0110592e+01 1.6750478e+01 1.8466434e+01 2.2716973e+01 1.4178033e+01 2.0878528e+01 1.9534887e+01 1.9274137e+01 1.5989379e+01 1.7385461e+01 1.8535852e+01 1.5022060e+01 1.5786192e+01 1.6794631e+01 1.6873441e+01 1.9531053e+01 2.5478890e+01 1.5691453e+01 1.8992682e+01 1.3539520e+01 2.3572128e+01 1.6048147e+01 1.7548276e+01 1.9010270e+01 1.5253349e+01 1.4519345e+01 1.8169708e+01 1.8771066e+01 2.1391056e+01 1.8942346e+01 1.8425433e+01 1.5310675e+01 1.5811284e+01 2.2577570e+01 1.6503004e+01 1.6243921e+01 1.3992343e+01 1.8280982e+01 1.8850628e+01 1.8208718e+01 1.4874653e+01 1.9082206e+01 1.8533380e+01 1.8185706e+01 1.7058389e+01 1.6846714e+01 1.5590842e+01 1.4165590e+01 1.1359060e+00 1.5319850e+00 2.1958558e+00 2.8198290e+00 1.0211725e+00 1.6257475e+00 2.9891849e+00 4.5546238e+00 4.7945480e+00 3.2728146e+00 8.5602218e-01 3.5027891e+00 1.9394676e+00 2.2149867e+00 2.2986581e+00 1.3720717e+00 2.6076804e+00 1.5319850e+00 2.6292664e+00 1.3720717e+00 1.9428691e+00 9.7877528e-01 1.4773595e+00 1.9617216e+00 1.7044794e+00 3.6519699e+00 3.3475964e+00 2.1958558e+00 2.1654045e+00 2.4032464e+00 2.1958558e+00 1.8793802e+00 1.2845725e+00 1.1359060e+00 2.1010911e+00 1.4773595e+00 2.4086604e+00 3.5753219e+00 9.3067814e-01 2.8352192e+00 4.6533907e-01 2.6519650e+00 1.1359060e+00 1.5495174e+01 1.4091742e+01 1.6467395e+01 1.3524603e+01 1.6268059e+01 1.3499808e+01 1.3865506e+01 9.1026803e+00 1.5532634e+01 1.1525561e+01 1.0798526e+01 1.3271597e+01 1.4236036e+01 1.4820377e+01 1.1215273e+01 1.4807567e+01 1.3020865e+01 1.2470879e+01 1.7285766e+01 1.2476580e+01 1.4186968e+01 1.3590107e+01 1.7396241e+01 1.4606164e+01 1.4507565e+01 1.5035837e+01 1.7052793e+01 1.7231674e+01 1.4477344e+01 1.1377718e+01 1.2285397e+01 1.1789546e+01 1.2698076e+01 1.6589897e+01 1.2443071e+01 1.1661923e+01 1.5652212e+01 1.6451663e+01 1.1778144e+01 1.2961981e+01 1.3119092e+01 1.4236480e+01 1.3202276e+01 9.7168810e+00 1.3010921e+01 1.1946808e+01 1.2600802e+01 1.4038979e+01 9.2493015e+00 1.2767629e+01 1.8344693e+01 1.6832510e+01 2.0915584e+01 1.8059318e+01 1.9533030e+01 2.3352678e+01 1.2813825e+01 2.1745287e+01 2.0966670e+01 2.1436371e+01 1.6712435e+01 1.8824194e+01 1.9463631e+01 1.7288747e+01 1.7684657e+01 1.7565447e+01 1.7944140e+01 2.4039820e+01 2.6493846e+01 1.7720395e+01 1.9504506e+01 1.5765238e+01 2.4421905e+01 1.7545011e+01 1.7839035e+01 1.9420400e+01 1.6729751e+01 1.5850778e+01 1.9522918e+01 1.9560676e+01 2.2334398e+01 2.3371852e+01 1.9780264e+01 1.6718154e+01 1.7526334e+01 2.3194192e+01 1.6117648e+01 1.7218049e+01 1.5408911e+01 1.9015475e+01 1.9661695e+01 1.8949808e+01 1.6832510e+01 1.9630268e+01 1.8810081e+01 1.9162699e+01 1.8702086e+01 1.7920616e+01 1.5303222e+01 1.5684795e+01 2.2968911e+00 9.8003160e-01 1.1066229e+00 4.6533907e-01 1.8793802e+00 3.7572369e+00 3.4336612e+00 3.6878258e+00 3.1702938e+00 1.0079368e+00 3.2181600e+00 1.1359060e+00 9.3067814e-01 1.2034300e+00 2.2289625e+00 1.6872569e+00 9.3067814e-01 7.3049739e-01 4.6533907e-01 4.6533907e-01 4.6533907e-01 1.2034300e+00 1.2034300e+00 9.3067814e-01 1.8347096e+00 2.6281695e+00 9.8003160e-01 7.8728875e-01 1.5319850e+00 9.8003160e-01 2.4068601e+00 1.0000000e-01 8.1287374e-01 4.1553586e+00 1.9600632e+00 1.1359060e+00 2.6292664e+00 1.8793802e+00 1.1359060e+00 1.3720717e+00 9.5244063e-01 3.1748021e-01 1.4725295e+01 1.3225436e+01 1.5656797e+01 1.2312490e+01 1.5375897e+01 1.2426806e+01 1.2977234e+01 8.2564023e+00 1.4698049e+01 1.0056743e+01 8.5114308e+00 1.2270388e+01 1.3295967e+01 1.3866426e+01 1.0144011e+01 1.3993710e+01 1.1889800e+01 1.1506808e+01 1.6288193e+01 1.1390093e+01 1.3151101e+01 1.2661442e+01 1.6434971e+01 1.3679267e+01 1.3644731e+01 1.4197215e+01 1.6219928e+01 1.6354615e+01 1.3485437e+01 1.0385431e+01 1.1137020e+01 1.0671434e+01 1.1693932e+01 1.5546262e+01 1.1185277e+01 1.0746831e+01 1.4817906e+01 1.5519994e+01 1.0700300e+01 1.1770874e+01 1.1943377e+01 1.3295840e+01 1.2184996e+01 7.5241539e+00 1.1890723e+01 1.0929683e+01 1.1550501e+01 1.3136108e+01 7.7031654e+00 1.1708978e+01 1.7322409e+01 1.5675730e+01 2.0033331e+01 1.7073335e+01 1.8548675e+01 2.2516592e+01 1.1808104e+01 2.0906475e+01 2.0024980e+01 2.0545041e+01 1.5786590e+01 1.7837112e+01 1.8546631e+01 1.6057790e+01 1.6479067e+01 1.6584809e+01 1.7011024e+01 2.3202565e+01 2.5620295e+01 1.6654830e+01 1.8599072e+01 1.4517204e+01 2.3591291e+01 1.6557208e+01 1.6937692e+01 1.8599942e+01 1.5729748e+01 1.4843306e+01 1.8514877e+01 1.8750034e+01 2.1491080e+01 2.2575579e+01 1.8761579e+01 1.5776405e+01 1.6522744e+01 2.2354833e+01 1.5145712e+01 1.6276024e+01 1.4376347e+01 1.8124039e+01 1.8707574e+01 1.8043717e+01 1.5675730e+01 1.8706756e+01 1.7870457e+01 1.8215532e+01 1.7683922e+01 1.6970100e+01 1.4324535e+01 1.4611615e+01 2.0600534e+00 3.5147734e+00 2.2289625e+00 1.1359060e+00 1.4295913e+00 5.1171773e+00 6.5123974e+00 5.0171180e+00 2.6500939e+00 5.7155780e+00 3.8590103e+00 3.5685848e+00 4.0481603e+00 2.5781299e+00 4.1703514e+00 2.9059510e+00 1.6856955e+00 3.6016092e+00 2.8179114e+00 2.0413535e+00 1.6529143e+00 1.6257475e+00 3.9834057e+00 4.5825506e+00 3.8044623e+00 2.0600534e+00 2.1941208e+00 3.2976039e+00 2.0600534e+00 3.1748021e-01 2.4650524e+00 3.1074178e+00 1.9428691e+00 6.0103306e-01 4.3917116e+00 5.5180183e+00 1.1359060e+00 3.5173564e+00 7.8728875e-01 3.3475964e+00 1.5745775e+00 1.6735385e+01 1.5325525e+01 1.6644523e+01 1.2851853e+01 1.4580767e+01 1.2048822e+01 1.6200007e+01 8.7080563e+00 1.3062815e+01 1.0519416e+01 1.0546398e+01 1.2502190e+01 1.3572927e+01 1.2436165e+01 9.1699403e+00 1.5001274e+01 1.2305869e+01 1.1343580e+01 1.6479039e+01 1.1655248e+01 1.5461651e+01 1.2080147e+01 1.6303403e+01 1.3061676e+01 1.2124274e+01 1.4159539e+01 1.5317018e+01 1.6271430e+01 1.2119901e+01 1.0466619e+01 1.1584112e+01 1.1114311e+01 1.1535386e+01 1.5222552e+01 1.1784536e+01 1.5511934e+01 1.5840873e+01 1.5596877e+01 1.1109071e+01 1.2124653e+01 1.2164102e+01 1.3427787e+01 1.2190349e+01 9.3206148e+00 1.1859330e+01 1.1266995e+01 1.0435158e+01 1.1707330e+01 8.6485997e+00 1.1349750e+01 2.0887950e+01 1.5466570e+01 1.9819004e+01 1.5414117e+01 1.8509842e+01 2.2173824e+01 1.2192287e+01 1.8803540e+01 1.9722318e+01 2.4654236e+01 1.7984552e+01 1.7314585e+01 1.8420681e+01 1.6248623e+01 1.5970653e+01 1.8856897e+01 1.6978513e+01 2.6979555e+01 2.4853709e+01 1.6931298e+01 2.0803484e+01 1.4184923e+01 2.2297391e+01 1.6094959e+01 2.0334019e+01 2.0725222e+01 1.5030679e+01 1.4974508e+01 1.7671813e+01 1.8520744e+01 2.0309716e+01 2.6281171e+01 1.7913977e+01 1.5031048e+01 1.6323139e+01 2.2002227e+01 2.0365488e+01 1.7418024e+01 1.4555341e+01 1.9159766e+01 1.9809353e+01 1.9083663e+01 1.5466570e+01 2.0940700e+01 2.1336409e+01 1.8124514e+01 1.7546255e+01 1.6943162e+01 1.9486620e+01 1.4839072e+01 2.2968911e+00 1.4295913e+00 6.2402515e-01 2.1079600e+00 4.9611467e+00 4.6998864e+00 4.3044426e+00 2.1654045e+00 4.4328796e+00 2.1181110e+00 2.6076804e+00 2.1941208e+00 3.3251194e+00 2.4674089e+00 2.1096674e+00 1.0079368e+00 1.9081610e+00 1.5760969e+00 1.9081610e+00 1.2337044e+00 6.2402515e-01 2.2597668e+00 1.9341935e+00 3.9995803e+00 0.0000000e+00 1.4295913e+00 3.0306837e+00 0.0000000e+00 2.0600534e+00 1.2034300e+00 2.1654045e+00 3.7587604e+00 2.0600534e+00 2.5152850e+00 3.8655529e+00 1.2337044e+00 2.3988602e+00 1.4295913e+00 2.1079600e+00 1.2337044e+00 1.4580767e+01 1.3110450e+01 1.3769493e+01 1.2080662e+01 1.4652619e+01 1.1855256e+01 1.4084933e+01 6.8368930e+00 1.3862137e+01 9.7626002e+00 9.1098636e+00 1.1324953e+01 1.3043780e+01 1.3076995e+01 9.5164235e+00 1.2209314e+01 1.1000223e+01 1.1057973e+01 1.5939828e+01 1.1082459e+01 1.3061676e+01 1.2037718e+01 1.5946233e+01 1.3045457e+01 1.2845810e+01 1.3144641e+01 1.5471938e+01 1.5211277e+01 1.2706937e+01 1.0032797e+01 1.0897113e+01 1.0447505e+01 1.1219362e+01 1.4953058e+01 1.0365843e+01 1.3436549e+01 1.2982765e+01 1.5151439e+01 9.8630031e+00 1.1461051e+01 1.1586793e+01 1.2305869e+01 1.1770874e+01 8.0202304e+00 1.1435749e+01 1.0077215e+01 1.0871601e+01 1.2363878e+01 7.6582738e+00 1.1151062e+01 1.8513828e+01 1.5087681e+01 1.8747043e+01 1.6167006e+01 1.7329665e+01 2.1147509e+01 1.0058318e+01 1.9864074e+01 1.9444558e+01 2.2623523e+01 1.5624756e+01 1.7153417e+01 1.7314471e+01 1.5612720e+01 1.5754520e+01 1.6412718e+01 1.5854906e+01 2.5080378e+01 2.4827937e+01 1.6323534e+01 1.8387986e+01 1.3880508e+01 2.2634459e+01 1.5907135e+01 1.8108339e+01 1.8401564e+01 1.5001832e+01 1.3780256e+01 1.7703852e+01 1.7524152e+01 2.0586191e+01 2.4438069e+01 1.7941377e+01 1.5059656e+01 1.5997452e+01 2.0976491e+01 1.8131337e+01 1.4366177e+01 1.3336993e+01 1.6081745e+01 1.6635606e+01 1.5996286e+01 1.5087681e+01 1.8500417e+01 1.9048067e+01 1.6988752e+01 1.7153241e+01 1.5804067e+01 1.7260689e+01 1.3576723e+01 1.9065209e+00 3.2967448e+00 5.2174040e+00 2.0720948e+00 2.3592959e+00 1.2480503e+00 1.6872569e+00 1.6872569e+00 9.8003160e-01 7.8728875e-01 7.8728875e-01 2.6281695e+00 2.9891849e+00 2.6602921e+00 2.2705666e+00 2.4086604e+00 6.3496042e-01 1.2034300e+00 2.4650524e+00 2.4768885e+00 7.8728875e-01 1.3720717e+00 1.2845725e+00 2.2968911e+00 2.4749599e+00 1.0211725e+00 2.2968911e+00 3.6878258e+00 9.5244063e-01 2.1654045e+00 5.5437705e+00 3.2826324e+00 2.6292664e+00 2.4086604e+00 3.2967448e+00 9.8003160e-01 2.6281695e+00 1.0000000e-01 1.7632210e+00 1.5163271e+01 1.3485437e+01 1.5938663e+01 1.1223752e+01 1.5307072e+01 1.1888002e+01 1.3417623e+01 1.0621763e+01 1.4721277e+01 1.0878046e+01 1.1557923e+01 1.2049819e+01 1.2810900e+01 1.3692367e+01 9.5599586e+00 1.4214780e+01 1.1334163e+01 1.1045811e+01 1.5877667e+01 1.0614099e+01 1.3151272e+01 1.2437761e+01 1.6155637e+01 1.3448523e+01 1.3603183e+01 1.4294079e+01 1.6238014e+01 1.6486610e+01 1.3254830e+01 9.8072539e+00 1.0116001e+01 9.6682093e+00 1.1229914e+01 1.5191671e+01 9.7084199e+00 1.1718608e+01 1.5044070e+01 1.5187558e+01 1.0167937e+01 1.0753799e+01 1.0951892e+01 1.3196318e+01 1.1675337e+01 1.0495743e+01 1.1170011e+01 1.0535701e+01 1.1080677e+01 1.3015050e+01 9.3159181e+00 1.1183015e+01 1.7816203e+01 1.5153324e+01 2.0279449e+01 1.6986262e+01 1.8622128e+01 2.2871385e+01 1.4542009e+01 2.1111626e+01 1.9872954e+01 1.8834769e+01 1.6101675e+01 1.7673568e+01 1.8713651e+01 1.5331404e+01 1.5996810e+01 1.6869307e+01 1.7081981e+01 2.0388736e+01 2.5728398e+01 1.6123532e+01 1.9055612e+01 1.3783359e+01 2.3805685e+01 1.6357474e+01 1.7570255e+01 1.9123174e+01 1.5538562e+01 1.4739293e+01 1.8402604e+01 1.9010270e+01 2.1647657e+01 1.9821456e+01 1.8648709e+01 1.5630845e+01 1.6179526e+01 2.2724588e+01 1.6421085e+01 1.6412194e+01 1.4213520e+01 1.8422806e+01 1.8955742e+01 1.8341956e+01 1.5153324e+01 1.9138262e+01 1.8516581e+01 1.8353326e+01 1.7396241e+01 1.7040989e+01 1.5526685e+01 1.4375002e+01 1.3720717e+00 3.5753219e+00 4.0456776e+00 4.8240043e+00 3.8981003e+00 1.6872569e+00 3.2230929e+00 2.1096674e+00 9.7877528e-01 2.1958558e+00 1.9600632e+00 1.9081610e+00 3.0000000e-01 9.3067814e-01 6.3496042e-01 1.1359060e+00 9.3067814e-01 4.6533907e-01 3.0000000e-01 1.6856955e+00 2.8810032e+00 3.3425881e+00 1.4295913e+00 1.6257475e+00 2.0628679e+00 1.4295913e+00 2.2801540e+00 6.0103306e-01 1.6872569e+00 3.9531919e+00 1.8435146e+00 1.3720717e+00 2.9891849e+00 1.3720717e+00 1.1066229e+00 1.2480503e+00 1.7448317e+00 1.0211725e+00 1.4976806e+01 1.3522416e+01 1.5928049e+01 1.2796972e+01 1.5680723e+01 1.2851945e+01 1.3290140e+01 8.0712326e+00 1.4985709e+01 1.0709970e+01 9.8656983e+00 1.2633631e+01 1.3643417e+01 1.4219923e+01 1.0541341e+01 1.4260102e+01 1.2340665e+01 1.1881396e+01 1.6641737e+01 1.1816770e+01 1.3539520e+01 1.2983768e+01 1.6783417e+01 1.4030863e+01 1.3940115e+01 1.4475808e+01 1.6502369e+01 1.6652959e+01 1.3849158e+01 1.0751191e+01 1.1596210e+01 1.1119462e+01 1.2064736e+01 1.5945124e+01 1.1715670e+01 1.1079239e+01 1.5098077e+01 1.5848156e+01 1.1122550e+01 1.2246817e+01 1.2433306e+01 1.3641155e+01 1.2565128e+01 8.8080682e+00 1.2333832e+01 1.1326250e+01 1.1955835e+01 1.3455472e+01 8.4044206e+00 1.2113655e+01 1.7699108e+01 1.6125088e+01 2.0334019e+01 1.7441240e+01 1.8902895e+01 2.2802717e+01 1.1634456e+01 2.1201880e+01 2.0364638e+01 2.0843425e+01 1.6106091e+01 1.8190541e+01 1.8859715e+01 1.6540481e+01 1.6937421e+01 1.6928155e+01 1.7348045e+01 2.3486710e+01 2.5918777e+01 1.7062596e+01 1.8905970e+01 1.5014650e+01 2.3877323e+01 1.6906681e+01 1.7253783e+01 1.8885161e+01 1.6085913e+01 1.5211055e+01 1.8879373e+01 1.9032847e+01 2.1778721e+01 2.2839614e+01 1.9127999e+01 1.6123532e+01 1.6920457e+01 2.2625611e+01 1.5496514e+01 1.6620546e+01 1.4756657e+01 1.8422262e+01 1.9034611e+01 1.8335254e+01 1.6125088e+01 1.9028012e+01 1.8193362e+01 1.8531313e+01 1.8044957e+01 1.7301002e+01 1.4679679e+01 1.5023003e+01 1.2538012e+00 5.0171180e+00 5.8948198e+00 4.3366937e+00 2.0228388e+00 5.1700126e+00 3.1541992e+00 3.3078726e+00 3.2538196e+00 3.0306837e+00 3.2648893e+00 1.9394676e+00 1.0211725e+00 2.7232965e+00 2.5152850e+00 1.7632210e+00 1.4773595e+00 8.1287374e-01 3.3078726e+00 2.8818172e+00 3.6487468e+00 6.2402515e-01 1.7382670e+00 3.0944563e+00 6.2402515e-01 1.1359060e+00 2.1096674e+00 2.3563262e+00 2.9784994e+00 1.8793802e+00 3.3918985e+00 4.6223377e+00 2.0000000e-01 3.1541992e+00 1.0211725e+00 3.0944563e+00 1.2034300e+00 1.5623172e+01 1.4144710e+01 1.5388959e+01 1.2285620e+01 1.4565741e+01 1.1844494e+01 1.5028771e+01 7.6716480e+00 1.3654500e+01 9.9370695e+00 9.5813407e+00 1.0662773e+01 1.3202276e+01 1.2904025e+01 9.4425804e+00 1.3775505e+01 1.0375005e+01 1.1103359e+01 1.6079200e+01 1.1226807e+01 1.4128453e+01 1.1998446e+01 1.6006895e+01 1.2987160e+01 1.2662535e+01 1.2386330e+01 1.5362768e+01 1.4387982e+01 1.2548905e+01 1.0143725e+01 1.1082459e+01 1.0632980e+01 1.1270701e+01 1.4958017e+01 9.7925804e+00 1.4327393e+01 1.4579315e+01 1.5266793e+01 9.2739892e+00 1.1622063e+01 1.1709494e+01 1.1593875e+01 1.1859699e+01 8.4427881e+00 1.1506038e+01 9.4670761e+00 1.0761626e+01 1.2196369e+01 7.9576453e+00 1.1150275e+01 1.9538867e+01 1.5114934e+01 1.7815656e+01 1.5945073e+01 1.6458375e+01 2.0140508e+01 1.0969342e+01 1.9558118e+01 1.9466256e+01 2.3508636e+01 1.6712435e+01 1.7121547e+01 1.6432208e+01 1.5732625e+01 1.5715094e+01 1.7524147e+01 1.5019305e+01 2.5918777e+01 2.4751146e+01 1.6470699e+01 1.9513510e+01 1.3875950e+01 2.2434638e+01 1.5890983e+01 1.9103333e+01 1.9509363e+01 1.4929778e+01 1.3028403e+01 1.7595880e+01 1.6615651e+01 2.0412390e+01 2.5265956e+01 1.7832827e+01 1.4973965e+01 1.6028628e+01 1.9976838e+01 1.9082082e+01 1.6027901e+01 1.2605616e+01 1.7791398e+01 1.8374334e+01 1.7708259e+01 1.5114934e+01 1.9630268e+01 2.0063078e+01 1.6123659e+01 1.7213535e+01 1.4974831e+01 1.8204775e+01 1.2843993e+01 5.4891119e+00 8.1070431e+00 5.7756493e+00 4.3044426e+00 7.0038182e+00 5.2585327e+00 4.9892667e+00 5.3805509e+00 2.4787096e+00 5.1495485e+00 4.1913254e+00 2.4650524e+00 4.6968015e+00 4.3824025e+00 3.8708609e+00 2.8352192e+00 2.7177010e+00 5.2307726e+00 4.8365631e+00 6.1296510e+00 2.1079600e+00 2.3988602e+00 4.3239024e+00 2.1079600e+00 8.1287374e-01 3.9497555e+00 3.8022487e+00 3.0424191e+00 1.4773595e+00 5.5181395e+00 6.6250434e+00 2.0228388e+00 5.1076797e+00 2.1958558e+00 5.0288583e+00 3.2538196e+00 1.7254807e+01 1.5854244e+01 1.7016742e+01 1.4294079e+01 1.6262760e+01 1.3677384e+01 1.6792625e+01 1.0145412e+01 1.5286890e+01 1.2037506e+01 1.1980791e+01 1.2361470e+01 1.5024748e+01 1.4625925e+01 1.1239224e+01 1.5405944e+01 1.2166424e+01 1.2875413e+01 1.7934374e+01 1.3117586e+01 1.5978692e+01 1.3722328e+01 1.7801411e+01 1.4713323e+01 1.4314561e+01 1.3971677e+01 1.7015176e+01 1.6007305e+01 1.4298601e+01 1.1951287e+01 1.3030666e+01 1.2559913e+01 1.3069236e+01 1.6792190e+01 1.1665154e+01 1.6168687e+01 1.6225237e+01 1.7062492e+01 1.1016962e+01 1.3588409e+01 1.3651304e+01 1.3252408e+01 1.3685105e+01 1.0753134e+01 1.3390494e+01 1.1169181e+01 1.2548905e+01 1.3877694e+01 1.0097110e+01 1.2969476e+01 2.1416755e+01 1.7040010e+01 1.9446867e+01 1.7698621e+01 1.8169500e+01 2.1739356e+01 1.3684601e+01 2.1196970e+01 2.1242524e+01 2.5297212e+01 1.8470087e+01 1.8911053e+01 1.8088313e+01 1.7743740e+01 1.7669310e+01 1.9329872e+01 1.6684730e+01 2.7663750e+01 2.6456782e+01 1.8380401e+01 2.1252405e+01 1.5852405e+01 2.4083638e+01 1.7680455e+01 2.0871558e+01 2.1176786e+01 1.6712435e+01 1.4744707e+01 1.9388643e+01 1.8190857e+01 2.2071264e+01 2.6977786e+01 1.9634929e+01 1.6711090e+01 1.7849485e+01 2.1577509e+01 2.0962237e+01 1.7761815e+01 1.4339472e+01 1.9484168e+01 2.0120991e+01 1.9414901e+01 1.7040010e+01 2.1384769e+01 2.1865393e+01 1.7804562e+01 1.9053061e+01 1.6653747e+01 2.0093359e+01 1.4610698e+01 2.4086604e+00 1.8793802e+00 3.4410701e+00 2.0600534e+00 2.9784994e+00 3.1033130e+00 3.6072442e+00 3.3713910e+00 5.4307265e+00 4.7389434e+00 4.4579251e+00 4.8173209e+00 2.8671917e+00 2.7949304e+00 4.6376968e+00 4.6537107e+00 3.6635621e+00 2.4787096e+00 1.4448053e+00 4.9611467e+00 2.5398417e+00 1.7448317e+00 4.9611467e+00 4.5282213e+00 3.2517890e+00 3.2728146e+00 6.4066932e+00 4.1525814e+00 5.1984987e+00 4.2311315e+00 5.0171180e+00 2.5781299e+00 4.2159199e+00 2.2597668e+00 3.3425881e+00 1.5740005e+01 1.3792244e+01 1.6418752e+01 1.3536006e+01 1.5494712e+01 1.2141332e+01 1.3712179e+01 1.3187310e+01 1.4994039e+01 1.3833746e+01 1.4200485e+01 1.1613319e+01 1.2416186e+01 1.3566397e+01 1.0887162e+01 1.4632716e+01 1.2714773e+01 9.8262833e+00 1.5694765e+01 1.1857883e+01 1.2761573e+01 1.2333040e+01 1.6101370e+01 1.3289184e+01 1.3778760e+01 1.4619111e+01 1.6558737e+01 1.6836640e+01 1.2987160e+01 1.0070488e+01 1.2375877e+01 1.1899481e+01 1.0017463e+01 1.4804192e+01 1.3632495e+01 1.1758382e+01 1.5450334e+01 1.5125535e+01 1.1520062e+01 1.3069236e+01 1.3275589e+01 1.3118120e+01 1.0411181e+01 1.3117528e+01 1.2462674e+01 1.0865513e+01 1.1379684e+01 1.3030661e+01 1.2013907e+01 1.1458364e+01 1.8073422e+01 1.3697102e+01 2.0761917e+01 1.7017811e+01 1.8838578e+01 2.3476845e+01 1.7327318e+01 2.1592210e+01 2.0022810e+01 2.0054125e+01 1.6455395e+01 1.7728414e+01 1.9096229e+01 1.5494042e+01 1.4538711e+01 1.7153442e+01 1.7305740e+01 2.0628988e+01 2.6200713e+01 1.5616954e+01 1.9591453e+01 1.5168002e+01 2.4343354e+01 1.6357245e+01 1.8089948e+01 1.9740918e+01 1.5483444e+01 1.4638521e+01 1.8476398e+01 1.9514017e+01 2.2125558e+01 2.0106351e+01 1.8722896e+01 1.5650752e+01 1.5896422e+01 2.3371545e+01 1.6792153e+01 1.6620067e+01 1.3959375e+01 1.8901176e+01 1.9346039e+01 1.8836848e+01 1.3697102e+01 1.9626115e+01 1.9047199e+01 1.8706417e+01 1.7334085e+01 1.7280716e+01 1.5805750e+01 1.3847418e+01 2.0228388e+00 3.6571586e+00 1.6856955e+00 2.4768885e+00 3.8549861e+00 2.0611757e+00 6.1504691e+00 4.3824965e+00 5.8857526e+00 5.1161531e+00 3.3311669e+00 3.1200292e+00 3.9834057e+00 5.3897438e+00 5.3689177e+00 1.9341935e+00 2.2597668e+00 1.7382670e+00 4.6998864e+00 5.5269310e+00 3.3917988e+00 4.6998864e+00 6.7891473e+00 3.4896634e+00 4.2366348e+00 7.3451421e+00 6.4059592e+00 4.2366348e+00 3.3058286e+00 5.1220906e+00 3.4545933e+00 5.5835314e+00 2.5781299e+00 4.5992589e+00 1.6088836e+01 1.4208108e+01 1.6769430e+01 1.2783541e+01 1.5762662e+01 1.0923279e+01 1.4232228e+01 1.2490307e+01 1.5231830e+01 1.3307372e+01 1.3422249e+01 1.2165989e+01 1.2536584e+01 1.3953836e+01 1.0189208e+01 1.4936960e+01 1.2115696e+01 1.0657966e+01 1.5892418e+01 1.1016870e+01 1.3502288e+01 1.2605702e+01 1.6358148e+01 1.3597159e+01 1.4022237e+01 1.4897462e+01 1.6783335e+01 1.7213541e+01 1.3436549e+01 8.7501873e+00 1.1601042e+01 1.1095939e+01 1.0897283e+01 1.5272724e+01 1.3193756e+01 1.2422125e+01 1.5802516e+01 1.5257924e+01 1.0880179e+01 1.2366182e+01 1.2596873e+01 1.3527719e+01 1.1289576e+01 1.2388348e+01 1.1723412e+01 9.7172716e+00 1.0201121e+01 1.3322048e+01 1.1320203e+01 1.0242194e+01 1.8837645e+01 1.4904654e+01 2.1234161e+01 1.7485623e+01 1.9376212e+01 2.3967740e+01 1.6868636e+01 2.1991873e+01 2.0324698e+01 2.0976255e+01 1.6995743e+01 1.8110863e+01 1.9563713e+01 1.4213377e+01 1.5855331e+01 1.7767408e+01 1.7762158e+01 2.1853098e+01 2.6592280e+01 1.5958833e+01 2.0179574e+01 1.4555341e+01 2.4745043e+01 1.6716348e+01 1.8719927e+01 2.0255763e+01 1.5889831e+01 1.5152371e+01 1.8937320e+01 1.9888730e+01 2.2490845e+01 2.1272064e+01 1.9197295e+01 1.5996382e+01 1.6271724e+01 2.3856545e+01 1.7572542e+01 1.7131572e+01 1.4522553e+01 1.9393679e+01 1.9910110e+01 1.9332511e+01 1.4904654e+01 2.0236222e+01 1.9730411e+01 1.9187586e+01 1.7668704e+01 1.7746809e+01 1.6581458e+01 1.4546090e+01 2.1096674e+00 2.1096674e+00 1.6872569e+00 2.2289625e+00 1.4448053e+00 3.7966977e+00 3.3078726e+00 4.6435667e+00 4.2489359e+00 2.4749599e+00 2.4674089e+00 2.3563262e+00 4.5468962e+00 4.5347546e+00 1.0683811e+00 2.2524858e+00 1.6872569e+00 4.3044426e+00 3.2181600e+00 1.3720717e+00 4.3044426e+00 4.0642614e+00 2.9320989e+00 1.7632210e+00 4.6533724e+00 3.6878258e+00 3.2291810e+00 1.9065209e+00 3.6571586e+00 2.1958558e+00 4.0481603e+00 1.7382670e+00 3.0306837e+00 1.5693217e+01 1.4019394e+01 1.6445005e+01 1.1505121e+01 1.5725505e+01 1.2232400e+01 1.4012718e+01 1.0876535e+01 1.5117069e+01 1.1240622e+01 1.1760119e+01 1.2500885e+01 1.3008873e+01 1.4094177e+01 9.9443867e+00 1.4701891e+01 1.1760258e+01 1.1297874e+01 1.6202171e+01 1.0872153e+01 1.3712179e+01 1.2814116e+01 1.6508044e+01 1.3776464e+01 1.4001265e+01 1.4746687e+01 1.6636721e+01 1.6992568e+01 1.3679267e+01 1.0066863e+01 1.0361553e+01 9.8851276e+00 1.1553992e+01 1.5582656e+01 1.0109214e+01 1.2360590e+01 1.5547608e+01 1.5482112e+01 1.0558402e+01 1.1056690e+01 1.1229657e+01 1.3625479e+01 1.1980755e+01 1.0736977e+01 1.1500080e+01 1.0904099e+01 1.1452580e+01 1.3406217e+01 9.6279838e+00 1.1538395e+01 1.8542294e+01 1.5587066e+01 2.0850686e+01 1.7458866e+01 1.9188643e+01 2.3448786e+01 1.4930628e+01 2.1603787e+01 2.0273341e+01 1.9988965e+01 1.6722395e+01 1.8126738e+01 1.9280553e+01 1.5745442e+01 1.6515518e+01 1.7525854e+01 1.7590997e+01 2.0214983e+01 2.6227326e+01 1.6427383e+01 1.9729927e+01 1.4242064e+01 2.4308950e+01 1.6799383e+01 1.8262824e+01 1.9727541e+01 1.5998629e+01 1.5241501e+01 1.8901232e+01 1.9497962e+01 2.2135983e+01 1.9634423e+01 1.9161009e+01 1.6031253e+01 1.6503711e+01 2.3338591e+01 1.7207240e+01 1.6950783e+01 1.4712702e+01 1.9029226e+01 1.9592869e+01 1.8980334e+01 1.5587066e+01 1.9807091e+01 1.9263522e+01 1.8948449e+01 1.7818981e+01 1.7586762e+01 1.6293493e+01 1.4864414e+01 2.4386212e+00 6.0103306e-01 1.9081610e+00 8.1287374e-01 2.5152850e+00 1.4448053e+00 2.2986581e+00 2.0600534e+00 1.2337044e+00 6.2402515e-01 6.2402515e-01 2.4086604e+00 2.4086604e+00 1.4295913e+00 2.2325586e+00 2.2705666e+00 2.1654045e+00 1.6872569e+00 1.1359060e+00 2.1654045e+00 3.0944563e+00 6.2402515e-01 3.1748021e-01 3.4514411e+00 2.6519650e+00 1.2034300e+00 1.7448317e+00 1.2538012e+00 1.2034300e+00 1.7448317e+00 1.4773595e+00 8.1287374e-01 1.4919460e+01 1.3390494e+01 1.5788492e+01 1.2115136e+01 1.5389006e+01 1.2333591e+01 1.3251986e+01 8.9179280e+00 1.4722355e+01 9.7356639e+00 9.6410330e+00 1.2287534e+01 1.3144031e+01 1.3857426e+01 1.0082294e+01 1.4111478e+01 1.1844658e+01 1.1388759e+01 1.6194985e+01 1.1226807e+01 1.3279575e+01 1.2637888e+01 1.6374000e+01 1.3625479e+01 1.3662093e+01 1.4267097e+01 1.6238219e+01 1.6446404e+01 1.3478517e+01 1.0259970e+01 1.0939994e+01 1.0466903e+01 1.1607899e+01 1.5489430e+01 1.1074779e+01 1.1511939e+01 1.4940280e+01 1.5429936e+01 1.0649528e+01 1.1597092e+01 1.1759854e+01 1.3319263e+01 1.2079647e+01 8.6287260e+00 1.1766516e+01 1.0886883e+01 1.1489040e+01 1.3136732e+01 6.9506148e+00 1.1627840e+01 1.7657519e+01 1.5608810e+01 2.0164813e+01 1.7099185e+01 1.8647094e+01 2.2665331e+01 1.2612885e+01 2.0987705e+01 1.9997983e+01 1.9524354e+01 1.5992764e+01 1.7837139e+01 1.8665126e+01 1.5947206e+01 1.6456309e+01 1.6798618e+01 1.7088182e+01 2.2346389e+01 2.5674250e+01 1.6526097e+01 1.8849560e+01 1.4437820e+01 2.3671781e+01 1.6550373e+01 1.7286198e+01 1.8831570e+01 1.5735833e+01 1.4892497e+01 1.8542444e+01 1.8850278e+01 2.1559483e+01 2.1728091e+01 1.8794561e+01 1.5762843e+01 1.6432809e+01 2.2525253e+01 1.6076598e+01 1.6389115e+01 1.4415347e+01 1.8295855e+01 1.8880834e+01 1.8231194e+01 1.5608810e+01 1.8948803e+01 1.8245286e+01 1.8342874e+01 1.7649273e+01 1.7065114e+01 1.5225181e+01 1.4631174e+01 1.2020661e+00 1.5760969e+00 2.2325586e+00 4.5992589e+00 2.6058219e+00 3.5752200e+00 3.6775397e+00 2.8810032e+00 2.6076804e+00 3.1053060e+00 3.8302687e+00 3.8590103e+00 2.4086604e+00 2.9320989e+00 2.4086604e+00 4.4328796e+00 4.4656228e+00 2.4086604e+00 4.4328796e+00 5.8077042e+00 3.0306837e+00 2.8384170e+00 6.1300703e+00 5.3481419e+00 3.2538196e+00 1.6856955e+00 4.0047216e+00 1.4281301e+00 4.7026362e+00 1.8793802e+00 3.7323299e+00 1.4129000e+01 1.2328124e+01 1.4855026e+01 1.1390181e+01 1.4061785e+01 9.4769356e+00 1.2263035e+01 1.1070336e+01 1.3524697e+01 1.1735911e+01 1.2086276e+01 1.0519416e+01 1.1225559e+01 1.2301270e+01 8.6911547e+00 1.3098569e+01 1.0486909e+01 9.2872919e+00 1.4405934e+01 9.6682093e+00 1.1652960e+01 1.1043581e+01 1.4774495e+01 1.2034768e+01 1.2357506e+01 1.3126963e+01 1.5057854e+01 1.5335275e+01 1.1791058e+01 7.4846010e+00 1.0247365e+01 9.7767182e+00 9.4724796e+00 1.3653168e+01 1.1506038e+01 1.0451432e+01 1.3925690e+01 1.3782962e+01 9.3218348e+00 1.0931147e+01 1.1150275e+01 1.1836500e+01 9.8862191e+00 1.1002287e+01 1.0260196e+01 8.2469024e+00 8.7382828e+00 1.1692373e+01 9.8772655e+00 8.8150991e+00 1.6620851e+01 1.3280117e+01 1.9193093e+01 1.5672527e+01 1.7401979e+01 2.1844762e+01 1.5227736e+01 2.0022810e+01 1.8602820e+01 1.8154679e+01 1.4960631e+01 1.6358319e+01 1.7576476e+01 1.2687887e+01 1.4116217e+01 1.5686528e+01 1.5871579e+01 1.7722807e+01 2.4623380e+01 1.4493266e+01 1.8001116e+01 1.2887699e+01 2.2738490e+01 1.5011090e+01 1.6518571e+01 1.8114683e+01 1.4168576e+01 1.3359605e+01 1.7100628e+01 1.7935232e+01 2.0550455e+01 1.7192307e+01 1.7344746e+01 1.4307462e+01 1.4689819e+01 2.1710518e+01 1.5291869e+01 1.5199075e+01 1.2756868e+01 1.7336035e+01 1.7822004e+01 1.7254705e+01 1.3280117e+01 1.8062067e+01 1.7460672e+01 1.7193858e+01 1.6006127e+01 1.5832384e+01 1.4352829e+01 1.2791478e+01 2.4086604e+00 3.1748021e-01 3.0473381e+00 1.7965249e+00 2.8915475e+00 2.2535695e+00 1.6097959e+00 9.8003160e-01 1.6097959e+00 2.7017933e+00 2.6519650e+00 1.5760969e+00 1.2034300e+00 2.3191846e+00 2.1181110e+00 2.4787096e+00 2.4086604e+00 2.1181110e+00 4.0481603e+00 7.3049739e-01 1.2034300e+00 4.2788026e+00 3.6519699e+00 1.9081610e+00 7.3049739e-01 2.2149867e+00 3.1748021e-01 2.9099493e+00 8.1287374e-01 1.7799212e+00 1.5980461e+01 1.4402851e+01 1.6773911e+01 1.2655815e+01 1.6166397e+01 1.3043818e+01 1.4403137e+01 9.3945338e+00 1.5536514e+01 1.0331884e+01 1.0067251e+01 1.3092892e+01 1.3680903e+01 1.4654718e+01 1.0756962e+01 1.5042757e+01 1.2645971e+01 1.2028743e+01 1.6792747e+01 1.1796151e+01 1.4295475e+01 1.3341554e+01 1.7062596e+01 1.4368761e+01 1.4445147e+01 1.5126588e+01 1.7037024e+01 1.7369820e+01 1.4262513e+01 1.0823621e+01 1.1475512e+01 1.0989917e+01 1.2246817e+01 1.6236673e+01 1.1855256e+01 1.2813164e+01 1.5900109e+01 1.6036647e+01 1.1408316e+01 1.2176779e+01 1.2382434e+01 1.4160704e+01 1.2698076e+01 9.0789232e+00 1.2417499e+01 1.1654914e+01 1.2217985e+01 1.3907803e+01 7.3908465e+00 1.2311690e+01 1.8970817e+01 1.6358319e+01 2.1183069e+01 1.7983732e+01 1.9632786e+01 2.3742710e+01 1.3225436e+01 2.1958456e+01 2.0761369e+01 2.0058463e+01 1.7091863e+01 1.8631225e+01 1.9645893e+01 1.6630787e+01 1.7265825e+01 1.7923102e+01 1.8035451e+01 1.9444075e+01 2.6574211e+01 1.7140417e+01 2.0033551e+01 1.5202621e+01 2.4635297e+01 1.7313151e+01 1.8583760e+01 2.0020120e+01 1.6524803e+01 1.5778478e+01 1.9400747e+01 1.9840186e+01 2.2479167e+01 1.8855559e+01 1.9657451e+01 1.6558737e+01 1.7169021e+01 2.3592334e+01 1.7581385e+01 1.7400960e+01 1.5287914e+01 1.9350552e+01 1.9952409e+01 1.9278371e+01 1.6358319e+01 2.0138634e+01 1.9570570e+01 1.9311096e+01 1.8360801e+01 1.8006200e+01 1.6694958e+01 1.5515079e+01 2.4994860e+00 3.3425881e+00 1.3974652e+00 1.2020661e+00 1.7632210e+00 1.3720717e+00 1.0211725e+00 7.8728875e-01 1.8347096e+00 1.9065209e+00 6.3496042e-01 2.7130023e+00 2.2149867e+00 2.6076804e+00 2.2289625e+00 1.1359060e+00 2.6076804e+00 3.5930498e+00 7.8728875e-01 2.3191846e+00 5.6483059e+00 3.0639700e+00 2.3191846e+00 2.7232965e+00 3.3078726e+00 1.5760969e+00 2.5196315e+00 1.2034300e+00 1.5760969e+00 1.3447115e+01 1.1841550e+01 1.4333753e+01 1.0151691e+01 1.3942373e+01 1.0653797e+01 1.1577607e+01 9.4992155e+00 1.3320897e+01 9.6984296e+00 1.0495743e+01 1.0674945e+01 1.1701267e+01 1.2337793e+01 8.3355573e+00 1.2660732e+01 1.0008436e+01 9.8704590e+00 1.4696026e+01 9.5111417e+00 1.1537869e+01 1.1153305e+01 1.4901259e+01 1.2159213e+01 1.2232560e+01 1.2829577e+01 1.4849460e+01 1.4962544e+01 1.1909019e+01 8.6837489e+00 9.0541693e+00 8.6195789e+00 1.0034661e+01 1.3901299e+01 8.4653384e+00 9.3124942e+00 1.3468100e+01 1.3997815e+01 8.8815287e+00 9.6508641e+00 9.8312839e+00 1.1789077e+01 1.0503137e+01 9.4017184e+00 9.9946353e+00 9.2353867e+00 9.8164353e+00 1.1669217e+01 8.1976121e+00 9.9595528e+00 1.5795801e+01 1.3864291e+01 1.8655448e+01 1.5542909e+01 1.7050673e+01 2.1187517e+01 1.3322048e+01 1.9557274e+01 1.8544350e+01 1.9180040e+01 1.4359803e+01 1.6308701e+01 1.7128466e+01 1.4107909e+01 1.4629705e+01 1.5101451e+01 1.5555127e+01 2.1875731e+01 2.4244555e+01 1.4958206e+01 1.7211422e+01 1.2489546e+01 2.2255454e+01 1.5018809e+01 1.5551963e+01 1.7286198e+01 1.4174904e+01 1.3279844e+01 1.6974175e+01 1.7425450e+01 2.0138634e+01 2.1283418e+01 1.7212484e+01 1.4276676e+01 1.4915604e+01 2.1029852e+01 1.3688943e+01 1.4811349e+01 1.2771527e+01 1.6740169e+01 1.7260689e+01 1.6650278e+01 1.3864291e+01 1.7297493e+01 1.6453927e+01 1.6769081e+01 1.6107755e+01 1.5504334e+01 1.2851796e+01 1.2938586e+01 3.0473381e+00 1.3720717e+00 2.9891849e+00 2.3988602e+00 9.8003160e-01 1.0211725e+00 1.6872569e+00 2.8352192e+00 2.7968417e+00 9.5244063e-01 1.5760969e+00 2.8352192e+00 2.1941208e+00 2.6076804e+00 2.4674089e+00 2.1941208e+00 4.2311315e+00 7.8728875e-01 1.4773595e+00 4.8898211e+00 3.8022487e+00 1.4773595e+00 7.3049739e-01 2.6519650e+00 8.1287374e-01 3.0473381e+00 6.3496042e-01 1.8793802e+00 1.5303955e+01 1.3764270e+01 1.6119707e+01 1.2140384e+01 1.5572150e+01 1.2478376e+01 1.3742946e+01 8.8915303e+00 1.4915851e+01 9.8374744e+00 9.5714934e+00 1.2519379e+01 1.3108344e+01 1.4060115e+01 1.0222258e+01 1.4406581e+01 1.2080477e+01 1.1447719e+01 1.6244675e+01 1.1254566e+01 1.3682686e+01 1.2770916e+01 1.6487825e+01 1.3767433e+01 1.3842526e+01 1.4508297e+01 1.6419289e+01 1.6744904e+01 1.3684398e+01 1.0275891e+01 1.0947175e+01 1.0453814e+01 1.1693932e+01 1.5662766e+01 1.1304380e+01 1.2143681e+01 1.5259921e+01 1.5469392e+01 1.0846444e+01 1.1655248e+01 1.1836500e+01 1.3558721e+01 1.2146543e+01 8.5887722e+00 1.1874016e+01 1.1075967e+01 1.1654914e+01 1.3314368e+01 6.9430089e+00 1.1759336e+01 1.8289707e+01 1.5805435e+01 2.0535264e+01 1.7375009e+01 1.9010270e+01 2.3064382e+01 1.2723196e+01 2.1298605e+01 2.0167061e+01 1.9106934e+01 1.6446404e+01 1.8048506e+01 1.9017498e+01 1.6100593e+01 1.6715775e+01 1.7281666e+01 1.7408801e+01 2.0572605e+01 2.5941721e+01 1.6587790e+01 1.9362592e+01 1.4660200e+01 2.3976146e+01 1.6740440e+01 1.7888264e+01 1.9317832e+01 1.5950629e+01 1.5184811e+01 1.8808322e+01 1.9171716e+01 2.1836803e+01 1.9958401e+01 1.9067590e+01 1.5958699e+01 1.6572466e+01 2.2927602e+01 1.6871017e+01 1.6762841e+01 1.4701786e+01 1.8704596e+01 1.9314437e+01 1.8644307e+01 1.5805435e+01 1.9466256e+01 1.8880834e+01 1.8697979e+01 1.7802431e+01 1.7393575e+01 1.5994723e+01 1.4925442e+01 4.4171363e+00 2.4219631e+00 3.3058286e+00 3.3745138e+00 2.2968911e+00 2.4068601e+00 2.1079600e+00 2.6058219e+00 3.9956728e+00 4.0270868e+00 3.8686842e+00 3.3251194e+00 2.0423450e+00 2.3636531e+00 3.3251194e+00 2.1941208e+00 2.4220503e+00 2.1096674e+00 3.6050008e+00 1.8435146e+00 3.5575665e+00 4.1831794e+00 3.0306837e+00 2.6058219e+00 1.2699208e+00 2.4650524e+00 2.2801540e+00 1.7533718e+01 1.6065282e+01 1.8408457e+01 1.5116893e+01 1.8037557e+01 1.5174461e+01 1.5992764e+01 1.0606293e+01 1.7337899e+01 1.3115672e+01 1.2312906e+01 1.5044070e+01 1.5885226e+01 1.6573673e+01 1.2909619e+01 1.6723941e+01 1.4752003e+01 1.4139002e+01 1.8941520e+01 1.4096843e+01 1.6116801e+01 1.5319377e+01 1.9085026e+01 1.6327148e+01 1.6294036e+01 1.6884909e+01 1.8846998e+01 1.9099084e+01 1.6223003e+01 1.3030787e+01 1.3886257e+01 1.3392920e+01 1.4370445e+01 1.8283238e+01 1.4144229e+01 1.4370717e+01 1.7572350e+01 1.8125469e+01 1.3499808e+01 1.4569578e+01 1.4730836e+01 1.6028680e+01 1.4858597e+01 1.1241066e+01 1.4654718e+01 1.3679267e+01 1.4302565e+01 1.5802952e+01 1.0816623e+01 1.4445007e+01 2.0561828e+01 1.8513424e+01 2.2833977e+01 1.9846679e+01 2.1401817e+01 2.5312866e+01 1.4330711e+01 2.3621685e+01 2.2687436e+01 2.0255701e+01 1.8730789e+01 2.0564412e+01 2.1355607e+01 1.8927912e+01 1.9410906e+01 1.9591753e+01 1.9796216e+01 2.3867400e+01 2.8310604e+01 1.9347598e+01 2.1586231e+01 1.7451485e+01 2.6292584e+01 1.9276158e+01 2.0070456e+01 2.1509871e+01 1.8476478e+01 1.7659511e+01 2.1295198e+01 2.1471865e+01 2.4181891e+01 2.3229446e+01 2.1556045e+01 1.8464357e+01 1.9206565e+01 2.5167105e+01 1.9041186e+01 1.9123174e+01 1.7206127e+01 2.0983147e+01 2.1625236e+01 2.0927128e+01 1.8513424e+01 2.1704232e+01 2.1067704e+01 2.1054791e+01 2.0398546e+01 1.9780264e+01 1.8187533e+01 1.7470639e+01 2.1958558e+00 1.9081610e+00 1.0079368e+00 1.9617216e+00 1.9081610e+00 2.1096674e+00 2.1958558e+00 1.6872569e+00 3.3992897e+00 4.5652200e+00 2.4674089e+00 2.2986581e+00 3.2291810e+00 2.4674089e+00 4.1703514e+00 1.2034300e+00 2.1654045e+00 5.2153608e+00 3.5019091e+00 1.2337044e+00 1.5319850e+00 2.7566600e+00 1.7448317e+00 2.8691226e+00 2.7232965e+00 1.3974652e+00 1.2690444e+01 1.1266995e+01 1.3720674e+01 1.0503137e+01 1.3552950e+01 1.0610882e+01 1.0535452e+01 7.3330940e+00 1.2822239e+01 8.1872222e+00 8.0847618e+00 1.0473582e+01 1.1395438e+01 1.2034768e+01 8.3830446e+00 1.2084431e+01 1.0079946e+01 9.6383656e+00 1.4486298e+01 9.5614775e+00 1.1229657e+01 1.0858480e+01 1.4619111e+01 1.1815912e+01 1.1798458e+01 1.2331571e+01 1.4352944e+01 1.4493266e+01 1.1683426e+01 8.5580850e+00 9.3046363e+00 8.8165183e+00 9.8937221e+00 1.3741876e+01 9.3591686e+00 1.0518088e+01 1.2906712e+01 1.3682411e+01 8.8950010e+00 9.9735942e+00 1.0106786e+01 1.1452580e+01 1.0376484e+01 7.0823300e+00 1.0093348e+01 9.0990705e+00 9.7483429e+00 1.1303386e+01 5.5002985e+00 9.9177801e+00 1.4769508e+01 1.3901299e+01 1.8149659e+01 1.5238916e+01 1.6702511e+01 2.0583069e+01 1.1045453e+01 1.8997549e+01 1.8202335e+01 1.9782178e+01 1.3821377e+01 1.6044688e+01 1.6693045e+01 1.4295475e+01 1.4721732e+01 1.4625925e+01 1.5147983e+01 2.2264590e+01 2.3772684e+01 1.4837834e+01 1.6591808e+01 1.2743682e+01 2.1693980e+01 1.4774495e+01 1.4372199e+01 1.6527187e+01 1.3947477e+01 1.3026987e+01 1.6717430e+01 1.6810574e+01 1.9615850e+01 2.1608126e+01 1.6970722e+01 1.3940882e+01 1.4663225e+01 2.0449510e+01 1.5107359e+01 1.4374671e+01 1.2568738e+01 1.6221659e+01 1.6821789e+01 1.6163921e+01 1.3901299e+01 1.6695892e+01 1.5303222e+01 1.6389495e+01 1.5913794e+01 1.5136529e+01 1.4257923e+01 1.2791124e+01 1.8435146e+00 1.4448053e+00 1.7632210e+00 1.4251229e+00 1.2034300e+00 9.5244063e-01 2.4068601e+00 3.7572369e+00 4.1296441e+00 2.1096674e+00 2.1181110e+00 2.6500939e+00 2.1096674e+00 2.8896105e+00 1.1066229e+00 2.2325586e+00 4.7026362e+00 2.4068601e+00 2.4086604e+00 1.8435146e+00 1.9394676e+00 2.0720948e+00 1.7965249e+00 2.4749599e+00 1.5319850e+00 1.4406496e+01 1.2959738e+01 1.5358401e+01 1.2201096e+01 1.5091698e+01 1.2300742e+01 1.2746760e+01 7.4986778e+00 1.4407391e+01 1.0145565e+01 9.2734244e+00 1.2060556e+01 1.3031857e+01 1.3661460e+01 9.9461330e+00 1.3676665e+01 1.1798458e+01 1.1313097e+01 1.6029738e+01 1.1229356e+01 1.2999235e+01 1.2384378e+01 1.6201594e+01 1.3475417e+01 1.3353117e+01 1.3888813e+01 1.5917045e+01 1.6080131e+01 1.3281012e+01 1.0137818e+01 1.1002153e+01 1.0523754e+01 1.1472347e+01 1.5389006e+01 1.1184770e+01 1.0560234e+01 1.4525904e+01 1.5239238e+01 1.0569277e+01 1.1661472e+01 1.1881396e+01 1.3084435e+01 1.1973655e+01 8.2147054e+00 1.1766313e+01 1.0778022e+01 1.1395438e+01 1.2876831e+01 7.7705407e+00 1.1540873e+01 1.7171418e+01 1.5566441e+01 1.9770624e+01 1.6895632e+01 1.8350512e+01 2.2248185e+01 1.1105052e+01 2.0649516e+01 1.9795402e+01 2.0284941e+01 1.5547710e+01 1.7617386e+01 1.8290682e+01 1.5969219e+01 1.6367566e+01 1.6371413e+01 1.6797888e+01 2.2930077e+01 2.5348676e+01 1.6484113e+01 1.8348029e+01 1.4458448e+01 2.3316980e+01 1.6323135e+01 1.6716063e+01 1.8343476e+01 1.5506608e+01 1.4651921e+01 1.8316030e+01 1.8478935e+01 2.1210264e+01 2.2275337e+01 1.8561673e+01 1.5564907e+01 1.6381488e+01 2.2048344e+01 1.4976350e+01 1.6079827e+01 1.4197215e+01 1.7852501e+01 1.8469403e+01 1.7746846e+01 1.5566441e+01 1.8479506e+01 1.7644006e+01 1.7947246e+01 1.7453241e+01 1.6732919e+01 1.4159872e+01 1.4480120e+01 9.3067814e-01 1.5319850e+00 1.6257475e+00 7.8728875e-01 4.6533907e-01 2.6292664e+00 3.0227401e+00 3.5984040e+00 1.0079368e+00 9.3067814e-01 2.6761018e+00 1.0079368e+00 1.3960172e+00 1.1359060e+00 1.7448317e+00 3.7323299e+00 2.1941208e+00 1.4251229e+00 3.1541992e+00 1.0211725e+00 1.2184819e+00 1.6257475e+00 2.0628679e+00 7.8728875e-01 1.4540447e+01 1.3043698e+01 1.4321167e+01 1.1006596e+01 1.3468461e+01 1.0679256e+01 1.3902990e+01 7.0825869e+00 1.2580640e+01 8.5747776e+00 7.4796046e+00 9.5942468e+00 1.1995621e+01 1.1802281e+01 8.3070179e+00 1.2706951e+01 9.2565998e+00 9.9446454e+00 1.4889264e+01 1.0007312e+01 1.2976646e+01 1.0887162e+01 1.4853189e+01 1.1864713e+01 1.1585095e+01 1.1353668e+01 1.4274296e+01 1.3348165e+01 1.1440827e+01 8.9667133e+00 9.8263059e+00 9.3805098e+00 1.0115448e+01 1.3800142e+01 8.6204747e+00 1.3164340e+01 1.3507804e+01 1.4095033e+01 8.1751107e+00 1.0372067e+01 1.0467097e+01 1.0535452e+01 1.0685787e+01 6.4388572e+00 1.0309683e+01 8.3836904e+00 9.6278709e+00 1.1109071e+01 6.4967433e+00 9.9946353e+00 1.8385393e+01 1.3923601e+01 1.6774139e+01 1.4839324e+01 1.5392123e+01 1.9103665e+01 1.0420236e+01 1.8487478e+01 1.8327155e+01 2.2377561e+01 1.5605359e+01 1.5992764e+01 1.5385254e+01 1.4493178e+01 1.4526901e+01 1.6403955e+01 1.3963183e+01 2.4785564e+01 2.3649429e+01 1.5254765e+01 1.8417215e+01 1.2661362e+01 2.1355167e+01 1.4760788e+01 1.7986388e+01 1.8423079e+01 1.3808768e+01 1.1956367e+01 1.6475594e+01 1.5579052e+01 1.9330673e+01 2.4137161e+01 1.6711090e+01 1.3859258e+01 1.4859320e+01 1.8944994e+01 1.7922520e+01 1.4930545e+01 1.1526489e+01 1.6716063e+01 1.7284859e+01 1.6632378e+01 1.3923601e+01 1.8527871e+01 1.8941477e+01 1.5072648e+01 1.6055880e+01 1.3920055e+01 1.7039566e+01 1.1747759e+01 1.4773595e+00 1.2480503e+00 1.4448053e+00 1.4448053e+00 7.3049739e-01 2.9784994e+00 3.9956728e+00 1.9081610e+00 1.6257475e+00 2.6076804e+00 1.9081610e+00 3.6635621e+00 8.1287374e-01 9.8003160e-01 4.4688982e+00 3.1301555e+00 4.6533907e-01 1.5760969e+00 2.1654045e+00 1.3720717e+00 2.4674089e+00 2.1958558e+00 1.0211725e+00 1.3982670e+01 1.2528094e+01 1.4919460e+01 1.1584112e+01 1.4637058e+01 1.1709066e+01 1.2305869e+01 7.5454553e+00 1.3932052e+01 9.4016072e+00 7.7992481e+00 1.1586403e+01 1.2459500e+01 1.3141716e+01 9.4582689e+00 1.3259043e+01 1.1222009e+01 1.0721123e+01 1.5529293e+01 1.0632980e+01 1.2505837e+01 1.1924727e+01 1.5682979e+01 1.2913491e+01 1.2894017e+01 1.3458225e+01 1.5449920e+01 1.5639779e+01 1.2782554e+01 9.6127234e+00 1.0383641e+01 9.8974243e+00 1.0955050e+01 1.4832486e+01 1.0533887e+01 1.0120800e+01 1.4092438e+01 1.4731707e+01 1.0015213e+01 1.1055725e+01 1.1211981e+01 1.2581144e+01 1.1436731e+01 6.8398420e+00 1.1178288e+01 1.0219346e+01 1.0846444e+01 1.2396908e+01 7.0250013e+00 1.0998259e+01 1.6698103e+01 1.5002041e+01 1.9329646e+01 1.6372101e+01 1.7875654e+01 2.1789914e+01 1.1171461e+01 2.0157073e+01 1.9280553e+01 1.9877773e+01 1.5122764e+01 1.7131305e+01 1.7857629e+01 1.5387301e+01 1.5843225e+01 1.5942394e+01 1.6309073e+01 2.2480210e+01 2.4882670e+01 1.5900955e+01 1.7933593e+01 1.3871504e+01 2.2839424e+01 1.5851025e+01 1.6276979e+01 1.7880662e+01 1.5035864e+01 1.4167725e+01 1.7828170e+01 1.7993229e+01 2.0744753e+01 2.1832629e+01 1.8081969e+01 1.5040969e+01 1.5762779e+01 2.1644998e+01 1.4540247e+01 1.5586522e+01 1.3707326e+01 1.7439564e+01 1.8048093e+01 1.7374914e+01 1.5002041e+01 1.8043079e+01 1.7233372e+01 1.7546255e+01 1.6974370e+01 1.6288582e+01 1.3720887e+01 1.3944388e+01 3.1748021e-01 1.7448317e+00 1.7632210e+00 1.0211725e+00 9.7877528e-01 2.0628679e+00 1.5760969e+00 1.6529143e+00 7.8728875e-01 1.5760969e+00 2.9535696e+00 3.1748021e-01 1.0211725e+00 4.7747038e+00 2.5196315e+00 1.3720717e+00 2.4086604e+00 2.5152850e+00 9.8003160e-01 1.9065209e+00 4.6533907e-01 1.0211725e+00 1.4784041e+01 1.3210261e+01 1.5639779e+01 1.1782940e+01 1.5209098e+01 1.2080477e+01 1.3060557e+01 9.4245867e+00 1.4572224e+01 8.7764833e+00 1.0275672e+01 1.2049819e+01 1.2967192e+01 1.3657864e+01 9.7983076e+00 1.3955501e+01 1.1549588e+01 1.1192713e+01 1.5980408e+01 1.0962560e+01 1.3027390e+01 1.2437761e+01 1.6178528e+01 1.3448523e+01 1.3494140e+01 1.4103887e+01 1.6089275e+01 1.6269098e+01 1.3254830e+01 1.0032797e+01 1.0637614e+01 1.0180603e+01 1.1377786e+01 1.5257830e+01 1.0692013e+01 1.1294678e+01 1.4778811e+01 1.5247021e+01 1.0374258e+01 1.1270701e+01 1.1452580e+01 1.3120652e+01 1.1848798e+01 9.2286963e+00 1.1482599e+01 1.0649528e+01 1.1235925e+01 1.2952973e+01 7.9355905e+00 1.1370863e+01 1.7415916e+01 1.5319953e+01 1.9987525e+01 1.6890352e+01 1.8429486e+01 2.2513604e+01 1.3160406e+01 2.0843031e+01 1.9814243e+01 1.9338181e+01 1.5786205e+01 1.7622548e+01 1.8469466e+01 1.5623365e+01 1.6136214e+01 1.6568196e+01 1.6895898e+01 2.2195098e+01 2.5511556e+01 1.6294830e+01 1.8652642e+01 1.4093909e+01 2.3528938e+01 1.6330988e+01 1.7093414e+01 1.8684041e+01 1.5508185e+01 1.4660200e+01 1.8318283e+01 1.8714893e+01 2.1407622e+01 2.1592870e+01 1.8563939e+01 1.5574406e+01 1.6236830e+01 2.2359338e+01 1.5841760e+01 1.6191574e+01 1.4170551e+01 1.8105995e+01 1.8664656e+01 1.8025704e+01 1.5319953e+01 1.8748618e+01 1.8029546e+01 1.8126242e+01 1.7419819e+01 1.6855085e+01 1.4985908e+01 1.4375002e+01 1.7965249e+00 1.8435146e+00 1.0211725e+00 1.5678278e+00 1.6699961e+00 1.9081610e+00 1.2480503e+00 9.8003160e-01 1.9081610e+00 2.4285106e+00 3.1748021e-01 1.2337044e+00 4.2086721e+00 1.9800112e+00 2.1654045e+00 2.8352192e+00 1.7632210e+00 1.3720717e+00 1.2020661e+00 9.8003160e-01 4.6533907e-01 1.4455503e+01 1.2900752e+01 1.5365764e+01 1.1713794e+01 1.5044070e+01 1.1932234e+01 1.2634365e+01 9.3758307e+00 1.4386051e+01 8.6757185e+00 1.0247365e+01 1.1858099e+01 1.2903975e+01 1.3474250e+01 9.6654134e+00 1.3704981e+01 1.1353953e+01 1.1075967e+01 1.5897297e+01 1.0878726e+01 1.2713093e+01 1.2300742e+01 1.6053386e+01 1.3289236e+01 1.3320897e+01 1.3894355e+01 1.5915829e+01 1.6033139e+01 1.3077904e+01 9.9531772e+00 1.0568099e+01 1.0115448e+01 1.1265959e+01 1.5101510e+01 1.0502354e+01 1.0375005e+01 1.4515261e+01 1.5158798e+01 1.0196260e+01 1.1183015e+01 1.1341745e+01 1.2912442e+01 1.1746871e+01 9.1888669e+00 1.1362016e+01 1.0467097e+01 1.1077445e+01 1.2782554e+01 7.8940233e+00 1.1235925e+01 1.6912857e+01 1.5163378e+01 1.9714069e+01 1.6672469e+01 1.8166403e+01 2.2215960e+01 1.3053812e+01 2.0594481e+01 1.9660739e+01 2.0229097e+01 1.5440412e+01 1.7452978e+01 1.8211296e+01 1.5497890e+01 1.5956267e+01 1.6211771e+01 1.6646800e+01 2.2904452e+01 2.5307294e+01 1.6199575e+01 1.8271576e+01 1.3927371e+01 2.3291183e+01 1.6174482e+01 1.6598777e+01 1.8297890e+01 1.5337280e+01 1.4435925e+01 1.8119437e+01 1.8450181e+01 2.1187403e+01 2.2298782e+01 1.8364026e+01 1.5397001e+01 1.6084181e+01 2.2069977e+01 1.4763738e+01 1.5902262e+01 1.3951387e+01 1.7805203e+01 1.8356550e+01 1.7731302e+01 1.5163378e+01 1.8363490e+01 1.7524152e+01 1.7875671e+01 1.7288747e+01 1.6611727e+01 1.3935314e+01 1.4148571e+01 3.1748021e-01 2.7130023e+00 3.4461369e+00 3.8789352e+00 1.2337044e+00 1.1066229e+00 2.7776085e+00 1.2337044e+00 1.6529143e+00 1.3720717e+00 2.4404310e+00 3.3250204e+00 9.5244063e-01 2.0720948e+00 3.6635621e+00 1.4773595e+00 1.5745775e+00 4.6533907e-01 2.2968911e+00 1.2034300e+00 1.3353922e+01 1.1992572e+01 1.4980280e+01 1.2554090e+01 1.5128506e+01 1.2403015e+01 1.3527201e+01 8.0875003e+00 1.4364687e+01 1.0432099e+01 9.8522025e+00 1.1998446e+01 1.3356814e+01 1.3641833e+01 1.0074762e+01 1.3362393e+01 1.1744092e+01 1.1486051e+01 1.6315160e+01 1.1516902e+01 1.2043286e+01 1.2496164e+01 1.6368152e+01 1.3527719e+01 1.3347355e+01 1.3757738e+01 1.5923790e+01 1.5887946e+01 1.3285029e+01 1.0419672e+01 1.1339876e+01 1.0867426e+01 1.1666936e+01 1.5480132e+01 1.1163349e+01 1.3043698e+01 1.4179224e+01 1.5498625e+01 1.0550634e+01 1.1957408e+01 1.2109247e+01 1.2969476e+01 1.2201165e+01 8.7474688e+00 1.1955835e+01 1.0738075e+01 1.1452492e+01 1.2883226e+01 8.2491420e+00 1.1675337e+01 1.7964805e+01 1.5677866e+01 1.9486438e+01 1.6798600e+01 1.8108339e+01 2.1896741e+01 1.1626211e+01 2.0455738e+01 1.9891356e+01 2.2198727e+01 1.4455940e+01 1.7669812e+01 1.8050289e+01 1.6182946e+01 1.6423250e+01 1.5249407e+01 1.6580655e+01 2.4663848e+01 2.5310478e+01 1.6749006e+01 1.7123369e+01 1.4550174e+01 2.3169896e+01 1.6407459e+01 1.7493649e+01 1.7091698e+01 1.5546694e+01 1.4509014e+01 1.8290232e+01 1.8203926e+01 2.1106717e+01 2.3997871e+01 1.8535737e+01 1.5576994e+01 1.6481281e+01 2.1719403e+01 1.7706000e+01 1.5680935e+01 1.4071191e+01 1.7416673e+01 1.8024886e+01 1.7331600e+01 1.5677866e+01 1.7245105e+01 1.8438348e+01 1.7732420e+01 1.7617386e+01 1.6534456e+01 1.6850741e+01 1.4341553e+01 2.7968417e+00 3.3877914e+00 3.8546232e+00 6.2402515e-01 1.3720717e+00 2.8384170e+00 6.2402515e-01 1.5760969e+00 1.3974652e+00 2.4086604e+00 3.4357364e+00 1.5760969e+00 2.0423450e+00 3.6072442e+00 8.1287374e-01 1.5344852e+00 1.0211725e+00 2.2968911e+00 1.2480503e+00 1.4344824e+01 1.2916069e+01 1.3555166e+01 1.1957408e+01 1.4445822e+01 1.1713882e+01 1.3903355e+01 7.3445996e+00 1.3637752e+01 9.7376064e+00 9.1888669e+00 1.1171374e+01 1.2815370e+01 1.2900752e+01 9.3755346e+00 1.1994976e+01 1.0892574e+01 1.0866643e+01 1.5743942e+01 1.0923494e+01 1.2932862e+01 1.1840921e+01 1.5752474e+01 1.2851014e+01 1.2631695e+01 1.2928740e+01 1.5241356e+01 1.5013722e+01 1.2544262e+01 9.8409701e+00 1.0753134e+01 1.0290746e+01 1.1043581e+01 1.4800349e+01 1.0298499e+01 1.3277221e+01 1.2777906e+01 1.4932120e+01 9.7356639e+00 1.1340374e+01 1.1467162e+01 1.2131649e+01 1.1594801e+01 8.0875003e+00 1.1303386e+01 9.9288539e+00 1.0727710e+01 1.2165989e+01 7.6277589e+00 1.1002956e+01 1.8385802e+01 1.4975048e+01 1.8554297e+01 1.6006579e+01 1.7175797e+01 2.0937251e+01 1.0746850e+01 1.9647728e+01 1.9249222e+01 2.2433898e+01 1.5455223e+01 1.6982450e+01 1.7134242e+01 1.5515648e+01 1.5662899e+01 1.6264036e+01 1.5680935e+01 2.4858770e+01 2.4615156e+01 1.6155637e+01 1.8211482e+01 1.3801531e+01 2.2410871e+01 1.5734173e+01 1.7933593e+01 1.8190982e+01 1.4838034e+01 1.3631975e+01 1.7546979e+01 1.7300873e+01 2.0366270e+01 2.4196686e+01 1.7788460e+01 1.4874458e+01 1.5824589e+01 2.0766104e+01 1.7993700e+01 1.4204951e+01 1.3197247e+01 1.5900392e+01 1.6478072e+01 1.5818367e+01 1.4975048e+01 1.8331714e+01 1.8887576e+01 1.6818271e+01 1.6983117e+01 1.5635756e+01 1.7125754e+01 1.3452019e+01 2.3592959e+00 2.5602448e+00 2.2597668e+00 2.7232965e+00 1.4773595e+00 2.2597668e+00 4.1201069e+00 7.8728875e-01 1.8793802e+00 5.0094739e+00 3.5598425e+00 1.8793802e+00 2.2801540e+00 2.7017933e+00 2.4086604e+00 2.8823731e+00 1.2034300e+00 1.8793802e+00 1.3262528e+01 1.1693029e+01 1.4154385e+01 1.0002396e+01 1.3778760e+01 1.0475256e+01 1.1436887e+01 9.3292753e+00 1.3120652e+01 9.5763808e+00 1.0300918e+01 1.0547455e+01 1.1461051e+01 1.2159481e+01 8.2224086e+00 1.2495079e+01 9.8696149e+00 9.6404935e+00 1.4534054e+01 9.3256503e+00 1.1419693e+01 1.0998259e+01 1.4719073e+01 1.1938275e+01 1.2054081e+01 1.2663040e+01 1.4652669e+01 1.4808504e+01 1.1760158e+01 8.5032291e+00 8.8784816e+00 8.4253319e+00 9.8704590e+00 1.3732657e+01 8.3355490e+00 9.1919101e+00 1.3302013e+01 1.3803853e+01 8.7346052e+00 9.5045737e+00 9.6415419e+00 1.1618475e+01 1.0329732e+01 9.2324819e+00 9.8351814e+00 9.0599893e+00 9.6581303e+00 1.1494086e+01 8.0955705e+00 9.8057062e+00 1.5689327e+01 1.3736849e+01 1.8505665e+01 1.5377703e+01 1.6919969e+01 2.1007797e+01 1.3197630e+01 1.9352631e+01 1.8359903e+01 1.9061734e+01 1.4242064e+01 1.6164571e+01 1.6997531e+01 1.3995065e+01 1.4549384e+01 1.5003559e+01 1.5393360e+01 2.1702455e+01 2.4069536e+01 1.4771415e+01 1.7093414e+01 1.2386114e+01 2.2056669e+01 1.4882922e+01 1.5419132e+01 1.7100410e+01 1.4046556e+01 1.3150502e+01 1.6840094e+01 1.7214179e+01 1.9952211e+01 2.1096827e+01 1.7088195e+01 1.4089277e+01 1.4687019e+01 2.0887950e+01 1.3592823e+01 1.4652732e+01 1.2648436e+01 1.6614163e+01 1.7155209e+01 1.6556668e+01 1.3736849e+01 1.7172553e+01 1.6355387e+01 1.6671019e+01 1.5976696e+01 1.5378866e+01 1.2756550e+01 1.2802581e+01 1.4295913e+00 1.9341935e+00 3.3250204e+00 2.7968417e+00 1.9341935e+00 4.8077583e+00 1.5678278e+00 2.8591826e+00 6.2114008e+00 4.4384864e+00 3.2484124e+00 2.6621660e+00 3.9146349e+00 1.4295913e+00 3.6571586e+00 1.1359060e+00 2.5602448e+00 1.7353691e+01 1.5663910e+01 1.8095563e+01 1.3454776e+01 1.7325875e+01 1.4035287e+01 1.5700236e+01 1.1029257e+01 1.6757123e+01 1.0439401e+01 1.1796455e+01 1.4158415e+01 1.4698495e+01 1.5779840e+01 1.1676361e+01 1.6315160e+01 1.3624436e+01 1.3059595e+01 1.7799945e+01 1.2694614e+01 1.5447623e+01 1.4414472e+01 1.8147286e+01 1.5495745e+01 1.5615666e+01 1.6351500e+01 1.8261231e+01 1.8618783e+01 1.5344353e+01 1.1768310e+01 1.2305519e+01 1.1833231e+01 1.3232042e+01 1.7295688e+01 1.2706937e+01 1.4091036e+01 1.7182005e+01 1.7093387e+01 1.2382343e+01 1.3000238e+01 1.3253650e+01 1.5307072e+01 1.3673467e+01 1.0782673e+01 1.3333473e+01 1.2687337e+01 1.3214238e+01 1.5041555e+01 9.4671219e+00 1.3281012e+01 2.0309906e+01 1.7341435e+01 2.2505293e+01 1.9161212e+01 2.0864592e+01 2.5149826e+01 1.4964479e+01 2.3305796e+01 2.1920154e+01 2.1859341e+01 1.8378337e+01 1.9756228e+01 2.0911723e+01 1.7532703e+01 1.8249302e+01 1.9193780e+01 1.9273173e+01 2.2455018e+01 2.7872517e+01 1.8128145e+01 2.1400146e+01 1.6117708e+01 2.5995588e+01 1.8408993e+01 1.9985084e+01 2.1461356e+01 1.7619300e+01 1.6911496e+01 2.0551622e+01 2.1202286e+01 2.3791786e+01 2.1860761e+01 2.0803692e+01 1.7710591e+01 1.8275241e+01 2.4977932e+01 1.8972348e+01 1.8658096e+01 1.6392762e+01 2.0662776e+01 2.1237010e+01 2.0568291e+01 1.7341435e+01 2.1501537e+01 2.0962054e+01 2.0541093e+01 1.9416981e+01 1.9218202e+01 1.8055652e+01 1.6609429e+01 3.9995803e+00 3.2826324e+00 1.0994463e+00 3.9995803e+00 4.3790295e+00 2.4285106e+00 3.0944563e+00 6.1440231e+00 4.0367604e+00 4.3768242e+00 3.7062982e+00 3.6487468e+00 2.0423450e+00 3.0143899e+00 1.5319850e+00 2.1853375e+00 1.6816260e+01 1.5016061e+01 1.7520801e+01 1.1382682e+01 1.6639950e+01 1.2884402e+01 1.5032186e+01 1.2280811e+01 1.6099497e+01 1.2766935e+01 1.3188024e+01 1.3271597e+01 1.3773833e+01 1.4958206e+01 1.0440776e+01 1.5724111e+01 1.2305869e+01 1.2041357e+01 1.6956462e+01 1.1360333e+01 1.4555875e+01 1.3623887e+01 1.7348382e+01 1.4652669e+01 1.4925132e+01 1.5724111e+01 1.7626686e+01 1.7993432e+01 1.4485427e+01 1.0682527e+01 1.0300983e+01 9.8530042e+00 1.2237775e+01 1.6371839e+01 1.2305869e+01 1.3326892e+01 1.6579405e+01 1.6296515e+01 1.1109071e+01 1.0967411e+01 1.1190253e+01 1.4506873e+01 1.2656424e+01 1.2147690e+01 1.1995363e+01 1.1596726e+01 1.2106343e+01 1.4285082e+01 1.1004903e+01 1.2165989e+01 1.9592417e+01 1.6254875e+01 2.1928224e+01 1.8383343e+01 2.0164589e+01 2.4617917e+01 1.6405725e+01 2.2720320e+01 2.1200064e+01 2.1433203e+01 1.7739899e+01 1.9002833e+01 2.0295725e+01 1.6289617e+01 1.7171541e+01 1.8520509e+01 1.8578529e+01 2.2163172e+01 2.7298877e+01 1.7150701e+01 2.0832953e+01 1.4709237e+01 2.5441372e+01 1.7640693e+01 1.9391820e+01 2.0918958e+01 1.6830699e+01 1.6100593e+01 1.9799843e+01 2.0626036e+01 2.3217588e+01 2.1588942e+01 2.0053230e+01 1.6936550e+01 1.7361259e+01 2.4479274e+01 1.8294467e+01 1.7949911e+01 1.5533167e+01 2.0086017e+01 2.0616048e+01 2.0008462e+01 1.6254875e+01 2.0906714e+01 2.0375640e+01 1.9920172e+01 1.8621822e+01 1.8541880e+01 1.7346255e+01 1.5662107e+01 1.4295913e+00 3.0306837e+00 0.0000000e+00 2.0600534e+00 1.2034300e+00 2.1654045e+00 3.7587604e+00 2.0600534e+00 2.5152850e+00 3.8655529e+00 1.2337044e+00 2.3988602e+00 1.4295913e+00 2.1079600e+00 1.2337044e+00 1.4580767e+01 1.3110450e+01 1.3769493e+01 1.2080662e+01 1.4652619e+01 1.1855256e+01 1.4084933e+01 6.8368930e+00 1.3862137e+01 9.7626002e+00 9.1098636e+00 1.1324953e+01 1.3043780e+01 1.3076995e+01 9.5164235e+00 1.2209314e+01 1.1000223e+01 1.1057973e+01 1.5939828e+01 1.1082459e+01 1.3061676e+01 1.2037718e+01 1.5946233e+01 1.3045457e+01 1.2845810e+01 1.3144641e+01 1.5471938e+01 1.5211277e+01 1.2706937e+01 1.0032797e+01 1.0897113e+01 1.0447505e+01 1.1219362e+01 1.4953058e+01 1.0365843e+01 1.3436549e+01 1.2982765e+01 1.5151439e+01 9.8630031e+00 1.1461051e+01 1.1586793e+01 1.2305869e+01 1.1770874e+01 8.0202304e+00 1.1435749e+01 1.0077215e+01 1.0871601e+01 1.2363878e+01 7.6582738e+00 1.1151062e+01 1.8513828e+01 1.5087681e+01 1.8747043e+01 1.6167006e+01 1.7329665e+01 2.1147509e+01 1.0058318e+01 1.9864074e+01 1.9444558e+01 2.2623523e+01 1.5624756e+01 1.7153417e+01 1.7314471e+01 1.5612720e+01 1.5754520e+01 1.6412718e+01 1.5854906e+01 2.5080378e+01 2.4827937e+01 1.6323534e+01 1.8387986e+01 1.3880508e+01 2.2634459e+01 1.5907135e+01 1.8108339e+01 1.8401564e+01 1.5001832e+01 1.3780256e+01 1.7703852e+01 1.7524152e+01 2.0586191e+01 2.4438069e+01 1.7941377e+01 1.5059656e+01 1.5997452e+01 2.0976491e+01 1.8131337e+01 1.4366177e+01 1.3336993e+01 1.6081745e+01 1.6635606e+01 1.5996286e+01 1.5087681e+01 1.8500417e+01 1.9048067e+01 1.6988752e+01 1.7153241e+01 1.5804067e+01 1.7260689e+01 1.3576723e+01 1.7448317e+00 1.4295913e+00 1.6856955e+00 1.2034300e+00 9.8003160e-01 3.4461369e+00 9.7877528e-01 2.2801540e+00 3.6519699e+00 1.7382670e+00 2.1079600e+00 9.3067814e-01 2.2597668e+00 4.6533907e-01 1.3430786e+01 1.1999369e+01 1.5031048e+01 1.2320752e+01 1.5144954e+01 1.2221224e+01 1.3497095e+01 8.3051974e+00 1.4397465e+01 9.9572079e+00 8.6077358e+00 1.1918390e+01 1.3325668e+01 1.3566397e+01 9.9595528e+00 1.3427787e+01 1.1521627e+01 1.1385475e+01 1.6278895e+01 1.1356708e+01 1.1909600e+01 1.2491604e+01 1.6317986e+01 1.3452536e+01 1.3373899e+01 1.3808768e+01 1.5970568e+01 1.5903047e+01 1.3201711e+01 1.0359591e+01 1.1139259e+01 1.0682741e+01 1.1588189e+01 1.5339599e+01 1.0826076e+01 1.2960989e+01 1.4218232e+01 1.5495745e+01 1.0374476e+01 1.1728596e+01 1.1838319e+01 1.2904117e+01 1.2109247e+01 7.5906516e+00 1.1760158e+01 1.0593745e+01 1.1304380e+01 1.2869385e+01 7.7637702e+00 1.1536430e+01 1.7833101e+01 1.5468378e+01 1.9493730e+01 1.6695239e+01 1.8030224e+01 2.1919632e+01 1.1729361e+01 2.0462949e+01 1.9846679e+01 2.2206291e+01 1.4430766e+01 1.7607255e+01 1.8043079e+01 1.5935838e+01 1.6209818e+01 1.5190433e+01 1.6524726e+01 2.4692444e+01 2.5328364e+01 1.6612013e+01 1.7117135e+01 1.4272691e+01 2.3197787e+01 1.6357245e+01 1.7457631e+01 1.7104310e+01 1.5483444e+01 1.4414874e+01 1.8205132e+01 1.8229320e+01 2.1137390e+01 2.4062313e+01 1.8450181e+01 1.5511832e+01 1.6330000e+01 2.1781262e+01 1.7600437e+01 1.5607481e+01 1.3959375e+01 1.7430969e+01 1.7995148e+01 1.7368693e+01 1.5468378e+01 1.7212033e+01 1.8401564e+01 1.7731975e+01 1.7557162e+01 1.6500160e+01 1.6737682e+01 1.4174563e+01 3.0306837e+00 2.4658172e+00 1.3720717e+00 8.5602218e-01 4.2033864e+00 2.0635800e+00 2.4749599e+00 3.6635621e+00 3.0944563e+00 2.0720948e+00 2.3636531e+00 1.2480503e+00 1.5319850e+00 1.4428432e+01 1.2743160e+01 1.5248839e+01 1.0034092e+01 1.4741075e+01 1.1179191e+01 1.2553442e+01 1.0869453e+01 1.4139292e+01 1.1151062e+01 1.1880916e+01 1.1377477e+01 1.2355120e+01 1.3054952e+01 8.8287595e+00 1.3563151e+01 1.0464168e+01 1.0459162e+01 1.5397289e+01 9.9288539e+00 1.2306328e+01 1.1890723e+01 1.5616876e+01 1.2849375e+01 1.3032615e+01 1.3685985e+01 1.5677511e+01 1.5824331e+01 1.2611702e+01 9.2497724e+00 8.9729740e+00 8.5521548e+00 1.0650142e+01 1.4551526e+01 1.0464168e+01 1.0692034e+01 1.4363277e+01 1.4721277e+01 9.3534969e+00 9.5541698e+00 9.7056085e+00 1.2531697e+01 1.1103359e+01 1.0785093e+01 1.0413275e+01 9.8067922e+00 1.0374476e+01 1.2426806e+01 9.6245919e+00 1.0510170e+01 1.6798466e+01 1.4439960e+01 1.9557274e+01 1.6292799e+01 1.7876100e+01 2.2120364e+01 1.4722355e+01 2.0427270e+01 1.9302468e+01 1.8924643e+01 1.5289982e+01 1.7063033e+01 1.8006031e+01 1.4600607e+01 1.5237431e+01 1.6022451e+01 1.6371282e+01 2.1814274e+01 2.5103324e+01 1.5573353e+01 1.8202353e+01 1.2899119e+01 2.3139073e+01 1.5767203e+01 1.6614379e+01 1.8279168e+01 1.4918487e+01 1.4031426e+01 1.7739238e+01 1.8315988e+01 2.1008805e+01 2.1247761e+01 1.7981769e+01 1.5013454e+01 1.5555927e+01 2.1994782e+01 1.5259497e+01 1.5643969e+01 1.3496671e+01 1.7671404e+01 1.8171693e+01 1.7603354e+01 1.4439960e+01 1.8269077e+01 1.7540097e+01 1.7653574e+01 1.6836932e+01 1.6341714e+01 1.4381901e+01 1.3612899e+01 2.0600534e+00 1.2034300e+00 2.1654045e+00 3.7587604e+00 2.0600534e+00 2.5152850e+00 3.8655529e+00 1.2337044e+00 2.3988602e+00 1.4295913e+00 2.1079600e+00 1.2337044e+00 1.4580767e+01 1.3110450e+01 1.3769493e+01 1.2080662e+01 1.4652619e+01 1.1855256e+01 1.4084933e+01 6.8368930e+00 1.3862137e+01 9.7626002e+00 9.1098636e+00 1.1324953e+01 1.3043780e+01 1.3076995e+01 9.5164235e+00 1.2209314e+01 1.1000223e+01 1.1057973e+01 1.5939828e+01 1.1082459e+01 1.3061676e+01 1.2037718e+01 1.5946233e+01 1.3045457e+01 1.2845810e+01 1.3144641e+01 1.5471938e+01 1.5211277e+01 1.2706937e+01 1.0032797e+01 1.0897113e+01 1.0447505e+01 1.1219362e+01 1.4953058e+01 1.0365843e+01 1.3436549e+01 1.2982765e+01 1.5151439e+01 9.8630031e+00 1.1461051e+01 1.1586793e+01 1.2305869e+01 1.1770874e+01 8.0202304e+00 1.1435749e+01 1.0077215e+01 1.0871601e+01 1.2363878e+01 7.6582738e+00 1.1151062e+01 1.8513828e+01 1.5087681e+01 1.8747043e+01 1.6167006e+01 1.7329665e+01 2.1147509e+01 1.0058318e+01 1.9864074e+01 1.9444558e+01 2.2623523e+01 1.5624756e+01 1.7153417e+01 1.7314471e+01 1.5612720e+01 1.5754520e+01 1.6412718e+01 1.5854906e+01 2.5080378e+01 2.4827937e+01 1.6323534e+01 1.8387986e+01 1.3880508e+01 2.2634459e+01 1.5907135e+01 1.8108339e+01 1.8401564e+01 1.5001832e+01 1.3780256e+01 1.7703852e+01 1.7524152e+01 2.0586191e+01 2.4438069e+01 1.7941377e+01 1.5059656e+01 1.5997452e+01 2.0976491e+01 1.8131337e+01 1.4366177e+01 1.3336993e+01 1.6081745e+01 1.6635606e+01 1.5996286e+01 1.5087681e+01 1.8500417e+01 1.9048067e+01 1.6988752e+01 1.7153241e+01 1.5804067e+01 1.7260689e+01 1.3576723e+01 2.5781299e+00 2.2968911e+00 1.5678278e+00 2.0000000e-01 4.4781854e+00 5.5583985e+00 1.1359060e+00 3.6305664e+00 1.0211725e+00 3.5173564e+00 1.9065209e+00 1.6387730e+01 1.4994513e+01 1.6167906e+01 1.3374194e+01 1.5402716e+01 1.2813582e+01 1.5924269e+01 9.1974866e+00 1.4434971e+01 1.1151062e+01 1.1001145e+01 1.1548103e+01 1.4087561e+01 1.3780256e+01 1.0391823e+01 1.4555247e+01 1.1351125e+01 1.1988710e+01 1.7020686e+01 1.2212093e+01 1.5122764e+01 1.2858251e+01 1.6912736e+01 1.3846673e+01 1.3464299e+01 1.3150658e+01 1.6150573e+01 1.5190415e+01 1.3454985e+01 1.1051397e+01 1.2113655e+01 1.1638409e+01 1.2190349e+01 1.5923366e+01 1.0846581e+01 1.5289234e+01 1.5377898e+01 1.6149510e+01 1.0202484e+01 1.2687337e+01 1.2757908e+01 1.2436165e+01 1.2794925e+01 9.8027683e+00 1.2513245e+01 1.0352732e+01 1.1702023e+01 1.3029313e+01 9.1754360e+00 1.2106343e+01 2.0557149e+01 1.6171797e+01 1.8631251e+01 1.6857769e+01 1.7356242e+01 2.0920270e+01 1.2743682e+01 2.0352444e+01 2.0361960e+01 2.4419536e+01 1.7618106e+01 1.8048093e+01 1.7274221e+01 1.6855085e+01 1.6811855e+01 1.8479506e+01 1.5869552e+01 2.6772065e+01 2.5591452e+01 1.7467429e+01 2.0403575e+01 1.4991623e+01 2.3229446e+01 1.6815399e+01 2.0011620e+01 2.0321042e+01 1.5858066e+01 1.3931465e+01 1.8537987e+01 1.7366867e+01 2.1216480e+01 2.6080252e+01 1.8784812e+01 1.5852405e+01 1.6965345e+01 2.0759709e+01 2.0093359e+01 1.6921280e+01 1.3526295e+01 1.8645342e+01 1.9284400e+01 1.8575814e+01 1.6171797e+01 2.0536417e+01 2.1007714e+01 1.6990960e+01 1.8171437e+01 1.5840350e+01 1.9222830e+01 1.3796162e+01 1.2337044e+00 4.3824965e+00 2.1181110e+00 1.6097959e+00 2.0423450e+00 2.1096674e+00 7.3049739e-01 1.5319850e+00 7.8728875e-01 6.2402515e-01 1.4501469e+01 1.2977212e+01 1.5422517e+01 1.1938647e+01 1.5119578e+01 1.2102815e+01 1.2723218e+01 8.7648050e+00 1.4452942e+01 9.5190855e+00 9.5200384e+00 1.1980755e+01 1.3009795e+01 1.3586762e+01 9.8249230e+00 1.3759313e+01 1.1549588e+01 1.1210136e+01 1.6000451e+01 1.1055725e+01 1.2853267e+01 1.2391826e+01 1.6155637e+01 1.3401128e+01 1.3393370e+01 1.3955501e+01 1.5976971e+01 1.6105060e+01 1.3197630e+01 1.0084063e+01 1.0778022e+01 1.0318576e+01 1.1395324e+01 1.5241501e+01 1.0787596e+01 1.0484171e+01 1.4578054e+01 1.5247021e+01 1.0374258e+01 1.1403760e+01 1.1574100e+01 1.3020865e+01 1.1881396e+01 8.4858705e+00 1.1550501e+01 1.0622039e+01 1.1235925e+01 1.2872216e+01 6.7793003e+00 1.1392668e+01 1.7037107e+01 1.5339706e+01 1.9785051e+01 1.6789689e+01 1.8272284e+01 2.2278098e+01 1.2393381e+01 2.0663118e+01 1.9754277e+01 2.0298956e+01 1.5527540e+01 1.7557162e+01 1.8290232e+01 1.5698546e+01 1.6136214e+01 1.6312931e+01 1.6744079e+01 2.2964860e+01 2.5372947e+01 1.6341506e+01 1.8348011e+01 1.4148466e+01 2.3351997e+01 1.6277041e+01 1.6684599e+01 1.8363490e+01 1.5446015e+01 1.4555875e+01 1.8230699e+01 1.8512818e+01 2.1249249e+01 2.2347204e+01 1.8475886e+01 1.5501627e+01 1.6222648e+01 2.2120652e+01 1.4875406e+01 1.6006192e+01 1.4081033e+01 1.7875573e+01 1.8444171e+01 1.7795694e+01 1.5339706e+01 1.8449470e+01 1.7611854e+01 1.7954934e+01 1.7396241e+01 1.6703413e+01 1.4051284e+01 1.4300880e+01 2.6030060e+00 1.9065209e+00 9.5244063e-01 2.4787096e+00 1.5319850e+00 1.9081610e+00 2.1096674e+00 1.9617216e+00 8.1287374e-01 1.5329130e+01 1.3822043e+01 1.6208128e+01 1.2677645e+01 1.5835094e+01 1.2834945e+01 1.3685285e+01 8.5861026e+00 1.5153944e+01 1.0453343e+01 8.8021875e+00 1.2761724e+01 1.3623327e+01 1.4317634e+01 1.0589840e+01 1.4534511e+01 1.2360590e+01 1.1866230e+01 1.6678440e+01 1.1746871e+01 1.3754740e+01 1.3098569e+01 1.6840824e+01 1.4082620e+01 1.4101931e+01 1.4698049e+01 1.6670109e+01 1.6882176e+01 1.3949618e+01 1.0753134e+01 1.1486051e+01 1.1006596e+01 1.2094526e+01 1.5974304e+01 1.1644837e+01 1.1954539e+01 1.5365961e+01 1.5897297e+01 1.1153503e+01 1.2149987e+01 1.2305688e+01 1.3774455e+01 1.2571103e+01 7.8339788e+00 1.2288142e+01 1.1370951e+01 1.1983508e+01 1.3586482e+01 8.0712326e+00 1.2127227e+01 1.8118880e+01 1.6125994e+01 2.0597604e+01 1.7560934e+01 1.9104502e+01 2.3086020e+01 1.2194792e+01 2.1411926e+01 2.0453744e+01 1.9943858e+01 1.6435072e+01 1.8303147e+01 1.9107442e+01 1.6491101e+01 1.6984439e+01 1.7253664e+01 1.7534907e+01 2.2759695e+01 2.6108280e+01 1.7025574e+01 1.9284414e+01 1.4987021e+01 2.4094670e+01 1.7019185e+01 1.7717917e+01 1.9246589e+01 1.6206924e+01 1.5361811e+01 1.9010270e+01 1.9268593e+01 2.1986990e+01 2.2134225e+01 1.9264903e+01 1.6218695e+01 1.6907823e+01 2.2948596e+01 1.6527187e+01 1.6836232e+01 1.4892497e+01 1.8730789e+01 1.9329646e+01 1.8671279e+01 1.6125994e+01 1.9387081e+01 1.8686362e+01 1.8793872e+01 1.8128074e+01 1.7517020e+01 1.5678765e+01 1.5119002e+01 1.8386500e+00 5.3865442e+00 6.2355962e+00 2.0628679e+00 5.3920600e+00 2.4032464e+00 5.3336079e+00 3.6152368e+00 1.8800766e+01 1.7312115e+01 1.8927463e+01 9.3134650e+00 1.6304264e+01 1.3586762e+01 1.8067709e+01 6.7736544e+00 1.6333263e+01 1.1008840e+01 8.2908249e+00 1.4819986e+01 1.0711635e+01 1.5630751e+01 1.2008514e+01 1.7189368e+01 1.4577749e+01 1.1858099e+01 1.3427787e+01 1.0453343e+01 1.7441375e+01 1.3659853e+01 1.4991623e+01 1.4660200e+01 1.5303662e+01 1.6613440e+01 1.7071845e+01 1.8876118e+01 1.5291617e+01 1.0135957e+01 9.4931266e+00 9.0493203e+00 1.2086332e+01 1.5862445e+01 1.3997779e+01 1.7211298e+01 1.8077582e+01 1.1789858e+01 1.3285812e+01 1.0913665e+01 1.1796429e+01 1.5802952e+01 1.1857540e+01 6.1807879e+00 1.2403015e+01 1.3450164e+01 1.3402766e+01 1.4835627e+01 7.5612908e+00 1.2862468e+01 2.2980043e+01 1.6116801e+01 2.2654538e+01 1.8904275e+01 2.1254297e+01 2.5139864e+01 1.0894328e+01 2.2596929e+01 1.8330510e+01 2.6555908e+01 2.0126906e+01 1.8029205e+01 2.1173347e+01 1.4931505e+01 1.7758234e+01 2.1046214e+01 1.9614559e+01 2.8770897e+01 2.4539706e+01 1.3823051e+01 2.3093480e+01 1.5859431e+01 2.4376006e+01 1.6785592e+01 2.2409453e+01 2.2986676e+01 1.6778163e+01 1.7477093e+01 1.9546355e+01 2.1252856e+01 2.2307675e+01 2.8051445e+01 1.9803824e+01 1.6754496e+01 1.5956961e+01 2.4981273e+01 2.2301745e+01 1.9732043e+01 1.7026680e+01 2.1604717e+01 2.2289590e+01 2.1541707e+01 1.6116801e+01 2.3228921e+01 2.3471822e+01 2.0872348e+01 1.6221659e+01 1.9595852e+01 2.1382841e+01 1.7315315e+01 3.9620349e+00 5.1070304e+00 1.8793802e+00 3.2517890e+00 4.6533907e-01 3.1200292e+00 1.4281301e+00 1.4492023e+01 1.3167469e+01 1.6167906e+01 1.3997815e+01 1.6392110e+01 1.3734090e+01 1.4759848e+01 9.7657382e+00 1.5589307e+01 1.1923015e+01 1.1508514e+01 1.3285388e+01 1.4694372e+01 1.4913849e+01 1.1407349e+01 1.4555247e+01 1.3076995e+01 1.2782905e+01 1.7674595e+01 1.2888706e+01 1.3289241e+01 1.3780015e+01 1.7682006e+01 1.4795582e+01 1.4587670e+01 1.4976806e+01 1.7158558e+01 1.7120833e+01 1.4578054e+01 1.1752596e+01 1.2746928e+01 1.2261778e+01 1.2989758e+01 1.6811257e+01 1.2542666e+01 1.4327537e+01 1.5377898e+01 1.6821332e+01 1.1859330e+01 1.3374194e+01 1.3499808e+01 1.4223535e+01 1.3537671e+01 1.0354543e+01 1.3320897e+01 1.2018859e+01 1.2765585e+01 1.4138377e+01 9.7801479e+00 1.3006613e+01 1.9264713e+01 1.7065114e+01 2.0720184e+01 1.8084341e+01 1.9388643e+01 2.3105194e+01 1.3431739e+01 2.1673035e+01 2.1189738e+01 2.3475959e+01 1.5664655e+01 1.8980870e+01 1.9302901e+01 1.7623319e+01 1.7835856e+01 1.6487071e+01 1.7832827e+01 2.5916823e+01 2.6567776e+01 1.8128074e+01 1.8327880e+01 1.5970568e+01 2.4392404e+01 1.7722545e+01 1.8733284e+01 1.8248817e+01 1.6858842e+01 1.5798588e+01 1.9602098e+01 1.9399748e+01 2.2338639e+01 2.5234006e+01 1.9854473e+01 1.6853041e+01 1.7795363e+01 2.2938110e+01 1.9018483e+01 1.6921280e+01 1.5372331e+01 1.8645342e+01 1.9284400e+01 1.8575814e+01 1.7065114e+01 1.8455152e+01 1.9703802e+01 1.9006713e+01 1.8962820e+01 1.7802230e+01 1.8167143e+01 1.5656284e+01 2.1958558e+00 2.9320989e+00 1.5760969e+00 3.2291810e+00 2.4086604e+00 1.6257475e+00 1.3884919e+01 1.2458306e+01 1.4779086e+01 1.1254566e+01 1.4399951e+01 1.1442414e+01 1.2369352e+01 7.1748053e+00 1.3669522e+01 9.1660484e+00 7.3970956e+00 1.1420636e+01 1.1987455e+01 1.2913491e+01 9.2336403e+00 1.3100906e+01 1.1058357e+01 1.0329732e+01 1.5205018e+01 1.0265162e+01 1.2490998e+01 1.1656107e+01 1.5389114e+01 1.2602703e+01 1.2639539e+01 1.3257813e+01 1.5181880e+01 1.5495065e+01 1.2580703e+01 9.2248804e+00 1.0009253e+01 9.4836569e+00 1.0647119e+01 1.4596714e+01 1.0374343e+01 1.0697574e+01 1.3955238e+01 1.4368622e+01 9.8119480e+00 1.0751767e+01 1.0886883e+01 1.2386086e+01 1.1109019e+01 6.4762756e+00 1.0899332e+01 9.9839822e+00 1.0609077e+01 1.2146425e+01 6.7139989e+00 1.0738249e+01 1.6896843e+01 1.4817391e+01 1.9238207e+01 1.6210086e+01 1.7799620e+01 2.1693980e+01 1.0951892e+01 1.9980962e+01 1.9026216e+01 1.8677576e+01 1.5136529e+01 1.6936550e+01 1.7769046e+01 1.5184811e+01 1.5735024e+01 1.5992764e+01 1.6179807e+01 2.1399304e+01 2.4697064e+01 1.5573578e+01 1.7986388e+01 1.3725058e+01 2.2660553e+01 1.5646393e+01 1.6430250e+01 1.7863540e+01 1.4855026e+01 1.4045552e+01 1.7679916e+01 1.7819210e+01 2.0556659e+01 2.0736479e+01 1.7945498e+01 1.4801252e+01 1.5456318e+01 2.1575421e+01 1.5318315e+01 1.5503524e+01 1.3586762e+01 1.7397835e+01 1.8040854e+01 1.7357172e+01 1.4817391e+01 1.8096004e+01 1.7434626e+01 1.7482288e+01 1.6749006e+01 1.6189970e+01 1.4471524e+01 1.3822991e+01 3.9243446e+00 7.8728875e-01 4.4110256e+00 2.1654045e+00 3.0473381e+00 1.4916565e+01 1.3372681e+01 1.5719132e+01 1.1600576e+01 1.5097406e+01 1.2034246e+01 1.3402138e+01 8.3162838e+00 1.4462831e+01 9.3582757e+00 8.9946372e+00 1.2068742e+01 1.2545243e+01 1.3627803e+01 9.7130430e+00 1.3972852e+01 1.1669217e+01 1.0964233e+01 1.5695900e+01 1.0731380e+01 1.3321880e+01 1.2263220e+01 1.6000451e+01 1.3325668e+01 1.3369936e+01 1.4054250e+01 1.5955157e+01 1.6327291e+01 1.3236460e+01 9.7184101e+00 1.0408685e+01 9.9105691e+00 1.1179919e+01 1.5222943e+01 1.0904012e+01 1.1839484e+01 1.4848722e+01 1.4926568e+01 1.0409518e+01 1.1138128e+01 1.1371555e+01 1.3138200e+01 1.1628978e+01 8.0158509e+00 1.1395438e+01 1.0647119e+01 1.1202695e+01 1.2849151e+01 6.3679408e+00 1.1281132e+01 1.8017271e+01 1.5364000e+01 2.0157801e+01 1.6983952e+01 1.8637303e+01 2.2715889e+01 1.2246607e+01 2.0924230e+01 1.9716635e+01 1.9089737e+01 1.6085913e+01 1.7600284e+01 1.8621822e+01 1.5627118e+01 1.6276497e+01 1.6931125e+01 1.7026957e+01 1.8508299e+01 2.5530008e+01 1.6085654e+01 1.9027812e+01 1.4226120e+01 2.3592301e+01 1.6270244e+01 1.7597586e+01 1.9004659e+01 1.5491888e+01 1.4774298e+01 1.8389670e+01 1.8797477e+01 2.1429500e+01 1.7903051e+01 1.8646623e+01 1.5527556e+01 1.6151733e+01 2.2547494e+01 1.6625088e+01 1.6407059e+01 1.4287268e+01 1.8324705e+01 1.8945650e+01 1.8238808e+01 1.5364000e+01 1.9145235e+01 1.8583778e+01 1.8279869e+01 1.7309367e+01 1.6987467e+01 1.5739108e+01 1.4535360e+01 3.1541992e+00 1.0211725e+00 3.0944563e+00 1.2034300e+00 1.5068518e+01 1.3628629e+01 1.4854980e+01 1.1764635e+01 1.4043501e+01 1.1331172e+01 1.4515261e+01 7.1833064e+00 1.3110738e+01 9.4752885e+00 9.0467117e+00 1.0202484e+01 1.2593280e+01 1.2390664e+01 8.9743522e+00 1.3248382e+01 9.9197925e+00 1.0535701e+01 1.5535668e+01 1.0682741e+01 1.3653531e+01 1.1482430e+01 1.5464351e+01 1.2433706e+01 1.2135132e+01 1.1881410e+01 1.4811871e+01 1.3897105e+01 1.2057226e+01 9.5965463e+00 1.0541244e+01 1.0075221e+01 1.0748161e+01 1.4445485e+01 9.3479079e+00 1.3823708e+01 1.4056878e+01 1.4697906e+01 8.8091745e+00 1.1112670e+01 1.1178795e+01 1.1102300e+01 1.1326250e+01 7.9350005e+00 1.0998714e+01 8.9802543e+00 1.0267877e+01 1.1676921e+01 7.4846354e+00 1.0649370e+01 1.9070405e+01 1.4638521e+01 1.7328617e+01 1.5446369e+01 1.5996197e+01 1.9628778e+01 1.0529486e+01 1.9016564e+01 1.8925729e+01 2.3003944e+01 1.6227466e+01 1.6620546e+01 1.5960796e+01 1.5259338e+01 1.5278344e+01 1.7059244e+01 1.4532504e+01 2.5363780e+01 2.4216850e+01 1.5921857e+01 1.9028012e+01 1.3426065e+01 2.1888527e+01 1.5392963e+01 1.8602394e+01 1.8968354e+01 1.4444151e+01 1.2568790e+01 1.7111275e+01 1.6080885e+01 1.9874570e+01 2.4693062e+01 1.7355453e+01 1.4445856e+01 1.5468198e+01 1.9486727e+01 1.8609774e+01 1.5528152e+01 1.2152093e+01 1.7304627e+01 1.7909166e+01 1.7241393e+01 1.4638521e+01 1.9143602e+01 1.9589593e+01 1.5674114e+01 1.6711449e+01 1.4510884e+01 1.7732675e+01 1.2387022e+01 2.6058219e+00 8.1287374e-01 1.5319850e+00 1.6075666e+01 1.4480245e+01 1.6866123e+01 1.2733767e+01 1.6250066e+01 1.3136732e+01 1.4477344e+01 9.4737800e+00 1.5638726e+01 1.0391823e+01 1.0157276e+01 1.3159420e+01 1.3801738e+01 1.4746687e+01 1.0816623e+01 1.5128038e+01 1.2719447e+01 1.2146543e+01 1.6875035e+01 1.1892097e+01 1.4357887e+01 1.3421166e+01 1.7155438e+01 1.4481908e+01 1.4536532e+01 1.5212059e+01 1.7137141e+01 1.7449029e+01 1.4339605e+01 1.0916287e+01 1.1567089e+01 1.1090827e+01 1.2331500e+01 1.6323534e+01 1.1926863e+01 1.2879313e+01 1.5985713e+01 1.6134805e+01 1.1486051e+01 1.2253540e+01 1.2481972e+01 1.4249048e+01 1.2787247e+01 9.1570963e+00 1.2500793e+01 1.1746871e+01 1.2300742e+01 1.3997815e+01 7.4366479e+00 1.2391826e+01 1.9026873e+01 1.6424465e+01 2.1259948e+01 1.8068872e+01 1.9700284e+01 2.3834614e+01 1.3285388e+01 2.2062836e+01 2.0855215e+01 2.0117400e+01 1.7153241e+01 1.8705117e+01 1.9713291e+01 1.6689363e+01 1.7307673e+01 1.7974227e+01 1.8118858e+01 1.9524922e+01 2.6663086e+01 1.7235681e+01 2.0094778e+01 1.5256987e+01 2.4736385e+01 1.7382882e+01 1.8653318e+01 2.0116007e+01 1.6590934e+01 1.5845670e+01 1.9469691e+01 1.9948140e+01 2.2574076e+01 1.8942315e+01 1.9721386e+01 1.6654830e+01 1.7285887e+01 2.3664947e+01 1.7633286e+01 1.7483182e+01 1.5352022e+01 1.9415594e+01 2.0007000e+01 1.9326736e+01 1.6424465e+01 2.0203502e+01 1.9622202e+01 1.9361672e+01 1.8427850e+01 1.8070988e+01 1.6746559e+01 1.5586062e+01 2.4650524e+00 7.3049739e-01 1.3913090e+01 1.2561998e+01 1.5560146e+01 1.3236460e+01 1.5742267e+01 1.3030661e+01 1.4120355e+01 8.8701696e+00 1.4961200e+01 1.1125845e+01 1.0623137e+01 1.2615017e+01 1.4004123e+01 1.4249537e+01 1.0714447e+01 1.3947625e+01 1.2369352e+01 1.2106076e+01 1.6970534e+01 1.2170073e+01 1.2632136e+01 1.3119694e+01 1.6998361e+01 1.4133411e+01 1.3951701e+01 1.4354150e+01 1.6526435e+01 1.6485542e+01 1.3902990e+01 1.1065049e+01 1.2008191e+01 1.1531500e+01 1.2302913e+01 1.6108972e+01 1.1803461e+01 1.3657205e+01 1.4763514e+01 1.6139882e+01 1.1170011e+01 1.2626825e+01 1.2759844e+01 1.3569735e+01 1.2842111e+01 9.4994788e+00 1.2600802e+01 1.1345747e+01 1.2075764e+01 1.3490452e+01 8.9776448e+00 1.2308941e+01 1.8576777e+01 1.6327834e+01 2.0081955e+01 1.7407562e+01 1.8716912e+01 2.2481021e+01 1.2447604e+01 2.1042720e+01 2.0512460e+01 2.2815138e+01 1.5036914e+01 1.8296221e+01 1.8653941e+01 1.6856171e+01 1.7085260e+01 1.5840350e+01 1.7178575e+01 2.5270326e+01 2.5917522e+01 1.7401998e+01 1.7703349e+01 1.5211820e+01 2.3761513e+01 1.7038266e+01 1.8087298e+01 1.7650443e+01 1.6175001e+01 1.5122764e+01 1.8913875e+01 1.8783306e+01 2.1703908e+01 2.4600970e+01 1.9162681e+01 1.6186535e+01 1.7099185e+01 2.2314035e+01 1.8327774e+01 1.6271166e+01 1.4689199e+01 1.8011342e+01 1.8629127e+01 1.7937101e+01 1.6327834e+01 1.7824339e+01 1.9044493e+01 1.8348029e+01 1.8261681e+01 1.7143058e+01 1.7474179e+01 1.4959883e+01 1.5760969e+00 1.5406911e+01 1.3764270e+01 1.6193505e+01 1.1797437e+01 1.5589787e+01 1.2301270e+01 1.3707326e+01 1.0269570e+01 1.4990466e+01 1.0322957e+01 1.1154937e+01 1.2395799e+01 1.3142285e+01 1.4013561e+01 9.9950095e+00 1.4472163e+01 1.1799469e+01 1.1408316e+01 1.6201594e+01 1.1067493e+01 1.3509468e+01 1.2746928e+01 1.6467539e+01 1.3767433e+01 1.3882982e+01 1.4560132e+01 1.6501717e+01 1.6759636e+01 1.3590727e+01 1.0190228e+01 1.0666681e+01 1.0209165e+01 1.1594801e+01 1.5546262e+01 1.0769734e+01 1.2038477e+01 1.5307327e+01 1.5491888e+01 1.0613707e+01 1.1317898e+01 1.1520062e+01 1.3512838e+01 1.2045890e+01 1.0108164e+01 1.1632642e+01 1.0929683e+01 1.1482599e+01 1.3314368e+01 8.8931033e+00 1.1586403e+01 1.8140483e+01 1.5564240e+01 2.0546614e+01 1.7304446e+01 1.8927780e+01 2.3124794e+01 1.4142198e+01 2.1371573e+01 2.0167061e+01 1.9088462e+01 1.6390139e+01 1.7984068e+01 1.8992682e+01 1.5788492e+01 1.6416655e+01 1.7174107e+01 1.7377309e+01 2.0626615e+01 2.5989394e+01 1.6486610e+01 1.9329239e+01 1.4286092e+01 2.4058721e+01 1.6670920e+01 1.7850288e+01 1.9378408e+01 1.5859720e+01 1.5070028e+01 1.8718139e+01 1.9264903e+01 2.1905001e+01 2.0049095e+01 1.8965917e+01 1.5938677e+01 1.6522744e+01 2.2972979e+01 1.6735014e+01 1.6713680e+01 1.4558861e+01 1.8692777e+01 1.9244367e+01 1.8611455e+01 1.5564240e+01 1.9419797e+01 1.8802524e+01 1.8638263e+01 1.7717458e+01 1.7336035e+01 1.5847745e+01 1.4746072e+01 1.4277946e+01 1.2801532e+01 1.5316194e+01 1.2232560e+01 1.5185667e+01 1.2254405e+01 1.1999369e+01 8.2008546e+00 1.4480120e+01 9.9337063e+00 8.4792979e+00 1.2037506e+01 1.3223391e+01 1.3651304e+01 9.9824391e+00 1.3679381e+01 1.1652620e+01 1.1371225e+01 1.6194985e+01 1.1292693e+01 1.2721638e+01 1.2500793e+01 1.6294830e+01 1.3495539e+01 1.3440515e+01 1.3944960e+01 1.6020910e+01 1.6073528e+01 1.3277228e+01 1.0290746e+01 1.1055725e+01 1.0594724e+01 1.1563216e+01 1.5368984e+01 1.0953857e+01 1.2023424e+01 1.4489065e+01 1.5420660e+01 1.0482450e+01 1.1669217e+01 1.1815912e+01 1.3045457e+01 1.2067047e+01 7.4796046e+00 1.1750673e+01 1.0707394e+01 1.1362016e+01 1.2934986e+01 7.6515889e+00 1.1550501e+01 1.6198105e+01 1.5497862e+01 1.9711200e+01 1.6821473e+01 1.8237968e+01 2.2168181e+01 1.1693603e+01 2.0621786e+01 1.9855448e+01 2.1317461e+01 1.5318060e+01 1.7645814e+01 1.8241083e+01 1.5916853e+01 1.6272431e+01 1.6103036e+01 1.6715910e+01 2.3872232e+01 2.5395658e+01 1.6549196e+01 1.8087298e+01 1.4324762e+01 2.3324223e+01 1.6379547e+01 1.5828200e+01 1.8083354e+01 1.5533167e+01 1.4574991e+01 1.8288809e+01 1.8437975e+01 2.1242524e+01 2.3242329e+01 1.8534307e+01 1.5573353e+01 1.6352228e+01 2.2014885e+01 1.6581176e+01 1.5918605e+01 1.4113539e+01 1.7752621e+01 1.8327774e+01 1.7678808e+01 1.5497862e+01 1.8190529e+01 1.6736431e+01 1.7917855e+01 1.7537426e+01 1.6680779e+01 1.5732609e+01 1.4341051e+01 1.6856955e+00 1.2337044e+00 7.2140066e+00 2.5152850e+00 4.2410321e+00 1.8347096e+00 1.1090827e+01 2.1096674e+00 6.0929497e+00 1.1476491e+01 4.1553586e+00 7.6291242e+00 1.8030992e+00 6.3074439e+00 1.3974652e+00 3.8244418e+00 6.5499171e+00 4.6253473e+00 7.6550962e+00 2.8818172e+00 4.8355618e+00 3.8537088e+00 2.9058572e+00 3.3078726e+00 1.8435146e+00 1.3720717e+00 2.7566600e+00 3.4917521e+00 8.4529352e+00 8.3563180e+00 8.9599040e+00 6.3473069e+00 4.9715946e+00 4.1197847e+00 3.5598425e+00 9.8003160e-01 4.5525602e+00 4.8898211e+00 6.7377692e+00 5.8222871e+00 2.1222843e+00 6.3784819e+00 1.1173961e+01 5.5438919e+00 4.8899920e+00 4.8126301e+00 3.6891643e+00 1.0663903e+01 5.3481419e+00 7.2698371e+00 6.2825638e+00 4.7747038e+00 5.5914429e+00 6.1504691e+00 7.6646688e+00 7.0739004e+00 5.8097410e+00 5.9956136e+00 7.0956265e+00 3.1033130e+00 5.5344713e+00 4.4328796e+00 6.9469009e+00 7.2032184e+00 4.3344158e+00 4.5812846e+00 9.8027683e+00 1.0447505e+01 5.3546819e+00 3.6930348e+00 5.9569988e+00 8.5981603e+00 4.3768242e+00 4.7413040e+00 3.5214385e+00 3.9497555e+00 3.9418007e+00 6.4467866e+00 3.7243310e+00 6.3712141e+00 9.1954484e+00 6.6850519e+00 3.7572369e+00 4.9587429e+00 7.5021751e+00 6.6860626e+00 4.4192352e+00 3.7467898e+00 3.4905244e+00 5.1564125e+00 3.2230929e+00 6.2825638e+00 4.4074388e+00 5.5479697e+00 4.4975387e+00 5.4307265e+00 4.4110256e+00 6.2454706e+00 4.8964170e+00 1.9394676e+00 5.9584541e+00 1.1359060e+00 2.5781299e+00 1.2337044e+00 9.7683049e+00 1.9617216e+00 5.4390228e+00 1.0075420e+01 2.0228388e+00 5.8858770e+00 2.1958558e+00 5.1700126e+00 1.4295913e+00 1.4609948e+00 5.0193116e+00 1.7120444e+00 6.2233978e+00 2.2597668e+00 3.4523901e+00 2.2705666e+00 2.9891849e+00 1.4448053e+00 1.4773595e+00 2.8915475e+00 2.9320989e+00 1.1066229e+00 6.9602057e+00 6.9411454e+00 7.4922990e+00 4.9710453e+00 3.7894174e+00 1.7120444e+00 1.3720717e+00 1.2034300e+00 2.7176097e+00 3.7587604e+00 5.5180183e+00 4.3366937e+00 1.6872569e+00 4.9710453e+00 9.8195020e+00 4.3044426e+00 3.6072442e+00 3.6072442e+00 2.2524858e+00 9.3769398e+00 4.1309582e+00 5.4891119e+00 5.2639976e+00 6.7610231e+00 3.9531919e+00 4.9468791e+00 9.2255000e+00 4.4935286e+00 7.4361289e+00 6.0645049e+00 9.1625693e+00 2.2968911e+00 3.4753074e+00 5.2153608e+00 6.0137961e+00 6.1982358e+00 2.5398417e+00 3.4917521e+00 1.1453386e+01 1.2139224e+01 3.8258056e+00 5.0748344e+00 5.1984987e+00 1.0130826e+01 3.1053060e+00 4.8796304e+00 5.0291590e+00 2.9891849e+00 2.9891849e+00 4.2186872e+00 5.1614633e+00 7.9913456e+00 1.0678375e+01 4.4322192e+00 2.1079600e+00 4.7026362e+00 9.0582525e+00 5.0094739e+00 2.5094325e+00 2.9891849e+00 4.8711511e+00 5.3468360e+00 4.6717100e+00 5.2639976e+00 5.1562598e+00 5.7369312e+00 4.7544555e+00 3.9941117e+00 3.4410701e+00 4.8372469e+00 3.8981003e+00 7.7551774e+00 2.0720948e+00 4.7876069e+00 2.5381307e+00 1.1408443e+01 2.4994860e+00 6.9603606e+00 1.1868819e+01 3.3311669e+00 7.9761706e+00 2.8823731e+00 6.5993914e+00 1.5319850e+00 3.1715064e+00 6.8420260e+00 4.0750538e+00 8.0053041e+00 3.1430403e+00 5.1700126e+00 1.9048813e+00 3.7966977e+00 3.6016092e+00 2.2986581e+00 1.4295913e+00 1.4773595e+00 2.9058572e+00 8.6876139e+00 8.7199645e+00 9.2795056e+00 6.6672229e+00 3.5752200e+00 3.4538540e+00 3.8708609e+00 6.3496042e-01 5.0785120e+00 5.1614633e+00 7.2379039e+00 6.3404374e+00 2.8198290e+00 6.7436282e+00 1.1503075e+01 6.0187291e+00 5.1057762e+00 5.1849808e+00 4.0215873e+00 1.0958178e+01 5.7511238e+00 6.8608447e+00 4.8964170e+00 4.2067971e+00 4.3311388e+00 4.8355618e+00 6.8386918e+00 6.9835043e+00 5.1294174e+00 4.7318657e+00 7.1708908e+00 2.8352192e+00 4.2752754e+00 3.1074178e+00 5.4390228e+00 5.7756493e+00 4.1913254e+00 3.3078726e+00 9.7135131e+00 9.7657382e+00 3.5224679e+00 3.1763049e+00 4.0536414e+00 7.8500839e+00 2.6602921e+00 4.2193347e+00 3.9531919e+00 3.2538196e+00 2.2149867e+00 5.1988535e+00 2.9832821e+00 5.6888931e+00 9.0214033e+00 5.4307265e+00 2.1941208e+00 4.8940042e+00 6.6481617e+00 6.1286762e+00 2.8671917e+00 2.9832821e+00 1.7432492e+00 3.5173564e+00 1.4609948e+00 4.8964170e+00 4.2338522e+00 5.0305701e+00 3.1541992e+00 4.0084646e+00 3.1053060e+00 5.6533688e+00 3.4917521e+00 5.4848472e+00 2.4220503e+00 6.8321410e+00 3.9500734e+00 4.7002833e+00 2.1096674e+00 3.9805707e+00 3.5700781e+00 1.7448317e+00 4.6992933e+00 2.1079600e+00 5.6239984e+00 3.4410701e+00 2.6621660e+00 3.4410701e+00 1.4773595e+00 6.4154783e+00 1.7432492e+00 4.8372469e+00 4.4656228e+00 3.6102901e+00 5.2174040e+00 6.0888630e+00 8.0683594e+00 4.4110256e+00 3.2057410e+00 1.0211725e+00 1.3974652e+00 2.1096674e+00 5.5005725e+00 3.4410701e+00 5.7757728e+00 6.8707854e+00 1.8613563e+00 1.5678278e+00 2.0000000e-01 1.5760969e+00 4.6992933e+00 1.3974652e+00 3.0506295e+00 1.3720717e+00 2.7130023e+00 1.9600632e+00 3.2517890e+00 4.1201069e+00 1.5319850e+00 1.2292864e+01 5.7542570e+00 1.2163952e+01 8.4414273e+00 1.0798854e+01 1.4702550e+01 4.1643796e+00 1.2115756e+01 8.3738658e+00 1.5716525e+01 9.2735475e+00 7.7720572e+00 1.0622408e+01 4.8182075e+00 7.1786077e+00 1.0281618e+01 9.0214033e+00 1.7837791e+01 1.4545946e+01 3.9834057e+00 1.2435661e+01 5.0971418e+00 1.4072479e+01 6.4154783e+00 1.1659261e+01 1.2216112e+01 6.2455980e+00 6.7397667e+00 9.2493015e+00 1.0463142e+01 1.1932586e+01 1.6953874e+01 9.5106656e+00 6.1504691e+00 5.5577326e+00 1.4488788e+01 1.1450753e+01 9.0458659e+00 6.2455980e+00 1.0919314e+01 1.1702653e+01 1.0748384e+01 5.7542570e+00 1.2626565e+01 1.2751314e+01 1.0241769e+01 6.2106120e+00 8.9723086e+00 1.0459757e+01 6.6015141e+00 1.9800112e+00 2.0600534e+00 8.9835824e+00 8.1287374e-01 4.5444351e+00 9.5340848e+00 2.4068601e+00 5.5344713e+00 1.6097959e+00 4.8240043e+00 1.9617216e+00 2.1222843e+00 4.2367439e+00 1.9065209e+00 5.5914429e+00 3.6635621e+00 2.4068601e+00 1.6529143e+00 1.5760969e+00 1.6872569e+00 1.4773595e+00 1.2034300e+00 2.4674089e+00 1.2845725e+00 6.1504691e+00 6.3405877e+00 6.8607322e+00 4.1581419e+00 2.7177010e+00 2.3996166e+00 2.9099493e+00 1.2034300e+00 2.6683108e+00 4.1831794e+00 4.9235130e+00 3.8549861e+00 1.3720717e+00 4.3311388e+00 9.1135719e+00 3.5752200e+00 4.0602397e+00 3.3992897e+00 2.1958558e+00 8.5037732e+00 2.9535696e+00 7.1827770e+00 3.9941117e+00 6.3210978e+00 3.4917521e+00 4.0182374e+00 8.8166428e+00 4.4322713e+00 6.1930570e+00 4.5057518e+00 9.9013396e+00 2.9059510e+00 2.8810032e+00 4.7318657e+00 4.9070353e+00 4.3196065e+00 4.6367122e+00 2.6760110e+00 1.2191554e+01 1.0160649e+01 3.1033130e+00 6.5472522e+00 3.4003738e+00 7.4484296e+00 2.1958558e+00 5.6799811e+00 6.5685428e+00 1.6529143e+00 2.9891849e+00 3.1410377e+00 4.7747038e+00 5.5334573e+00 1.1398414e+01 3.3311669e+00 1.0683811e+00 3.7467898e+00 8.6387232e+00 6.4338191e+00 3.6124074e+00 2.9320989e+00 5.1495485e+00 5.5791936e+00 4.9070353e+00 3.9941117e+00 6.6186038e+00 6.5884230e+00 4.2193347e+00 3.2291810e+00 2.6058219e+00 6.1400198e+00 3.8981003e+00 3.8981003e+00 6.4249445e+00 1.8386500e+00 2.9099493e+00 6.8321410e+00 2.2524858e+00 4.2038996e+00 1.8793802e+00 1.8386500e+00 3.1430403e+00 1.0211725e+00 2.1096674e+00 2.6058219e+00 2.7968417e+00 3.4523901e+00 1.4251229e+00 3.6635621e+00 1.3720717e+00 1.8347096e+00 2.7176097e+00 2.6527524e+00 4.9715946e+00 1.2034300e+00 2.8290794e+00 3.5700781e+00 4.0602397e+00 1.9428691e+00 3.0655002e+00 1.4448053e+00 2.4386212e+00 3.8549861e+00 2.2968911e+00 1.3720717e+00 2.0228388e+00 1.4773595e+00 1.8793802e+00 2.0600534e+00 6.4787998e+00 9.8003160e-01 1.2034300e+00 6.0103306e-01 1.5319850e+00 5.8222871e+00 4.0000000e-01 9.1999925e+00 3.1074178e+00 8.8625046e+00 5.2540895e+00 7.5549632e+00 1.1308649e+01 3.0108214e+00 8.6906802e+00 7.3731720e+00 1.2684025e+01 6.2233978e+00 5.1362634e+00 7.3673934e+00 3.0506295e+00 3.2976039e+00 7.1641706e+00 5.9489580e+00 1.4910602e+01 1.2665086e+01 3.8981003e+00 9.2871334e+00 2.2705666e+00 9.7787296e+00 3.7894174e+00 8.6529371e+00 9.2035638e+00 2.6761018e+00 3.7062982e+00 5.3680743e+00 7.3598400e+00 7.8265244e+00 1.4049782e+01 5.5787729e+00 2.7949304e+00 3.9146349e+00 1.1029851e+01 8.4160231e+00 6.0771064e+00 3.2057410e+00 7.7429209e+00 8.4690335e+00 7.4525891e+00 3.1074178e+00 9.4968075e+00 9.6255832e+00 6.9058041e+00 4.9710453e+00 5.7964759e+00 7.4425438e+00 3.6016092e+00 1.0597668e+01 2.6621660e+00 6.4155879e+00 1.0901123e+01 3.1053060e+00 6.5476412e+00 1.6257475e+00 5.9956136e+00 2.7232965e+00 2.9784994e+00 5.7887716e+00 3.0227401e+00 7.0086477e+00 1.8793802e+00 4.1050864e+00 1.9800112e+00 2.2289625e+00 2.8915475e+00 2.7566600e+00 3.0473381e+00 2.6621660e+00 2.4086604e+00 7.6688560e+00 7.7327209e+00 8.2591529e+00 5.7207256e+00 2.6602921e+00 3.3250204e+00 1.2034300e+00 1.3720717e+00 3.0989385e+00 4.6498043e+00 6.3876453e+00 5.3805509e+00 1.9617216e+00 5.7340487e+00 1.0632140e+01 5.1988535e+00 4.4781854e+00 4.4781854e+00 2.8915475e+00 1.0184322e+01 4.9710453e+00 3.4690066e+00 4.4781854e+00 6.7175325e+00 2.9058572e+00 5.1104864e+00 9.1951792e+00 5.3336079e+00 7.2540753e+00 5.8681597e+00 8.4044206e+00 2.6292664e+00 3.7462992e+00 5.1701307e+00 5.1495485e+00 5.4676415e+00 3.2967448e+00 3.5033902e+00 1.0653536e+01 1.2009137e+01 3.9531919e+00 5.5443983e+00 4.3768242e+00 9.9798462e+00 1.9600632e+00 3.8258056e+00 5.3689177e+00 2.0600534e+00 2.2524858e+00 4.6340475e+00 4.5535377e+00 7.7931802e+00 9.8182957e+00 4.8711511e+00 1.9394676e+00 4.6282302e+00 9.0126685e+00 3.3475964e+00 2.8823731e+00 2.1958558e+00 4.8653317e+00 5.4675208e+00 4.6086535e+00 4.4781854e+00 5.6750675e+00 4.6537107e+00 4.6968015e+00 2.7776085e+00 3.4523901e+00 3.4905244e+00 3.2291810e+00 8.8142745e+00 3.9620349e+00 1.3720717e+00 7.4425438e+00 3.8546232e+00 8.3629110e+00 4.4171363e+00 9.5234927e+00 7.3838786e+00 4.0047216e+00 7.4130105e+00 3.2967448e+00 1.0183753e+01 6.1904727e+00 7.9168059e+00 7.3039397e+00 7.7661691e+00 9.0387911e+00 9.6602775e+00 1.1552354e+01 8.0450763e+00 2.2718121e+00 2.2968911e+00 1.5745775e+00 4.7318657e+00 8.8645055e+00 6.8447383e+00 9.7062006e+00 1.0561252e+01 6.3074439e+00 5.9098113e+00 3.9500734e+00 4.7792894e+00 8.4529352e+00 4.6282302e+00 3.1748021e-01 5.2912108e+00 6.0000912e+00 6.0979962e+00 7.3731720e+00 1.6872569e+00 5.6023781e+00 1.5871848e+01 9.1965005e+00 1.5477452e+01 1.1843539e+01 1.4185405e+01 1.7957974e+01 3.6487468e+00 1.5400949e+01 1.1289576e+01 1.9232302e+01 1.2830957e+01 1.1000460e+01 1.3990023e+01 8.0712326e+00 1.0770552e+01 1.3831135e+01 1.2454276e+01 2.1365228e+01 1.7463780e+01 7.9695053e+00 1.5867818e+01 8.8919435e+00 1.7219355e+01 9.7032822e+00 1.5166964e+01 1.5669966e+01 9.6533240e+00 1.0299097e+01 1.2537779e+01 1.3911740e+01 1.5127820e+01 2.0523646e+01 1.2798924e+01 9.5944673e+00 8.9379546e+00 1.7744203e+01 1.5089499e+01 1.2550248e+01 9.8493971e+00 1.4341707e+01 1.5121610e+01 1.4215002e+01 9.1965005e+00 1.6055853e+01 1.6253070e+01 1.3654445e+01 9.2069893e+00 1.2409374e+01 1.4144253e+01 1.0220773e+01 5.1161531e+00 9.2899259e+00 3.2181600e+00 5.4469544e+00 1.2845725e+00 3.1748021e+00 1.4773595e+00 2.8716097e+00 4.3044426e+00 3.2181600e+00 5.4475242e+00 4.1050864e+00 2.2968911e+00 2.9891849e+00 1.7799212e+00 7.8728875e-01 8.1287374e-01 1.4773595e+00 2.3191846e+00 1.6856955e+00 6.1323936e+00 6.1504691e+00 6.7436282e+00 4.0481603e+00 3.8981003e+00 3.1713865e+00 3.5331986e+00 1.4773595e+00 2.1941208e+00 2.9427005e+00 4.2186872e+00 3.6549921e+00 1.2845725e+00 4.1464270e+00 8.9226269e+00 3.0639700e+00 3.2230929e+00 2.0002283e+00 1.1066229e+00 8.2962801e+00 2.7871617e+00 7.6951914e+00 5.0785120e+00 6.0888630e+00 3.5685848e+00 4.7804796e+00 8.6195789e+00 5.4971543e+00 5.7021453e+00 4.9275407e+00 9.8053389e+00 3.7323299e+00 4.0215873e+00 4.4384864e+00 5.8982666e+00 5.7104821e+00 5.1504591e+00 3.4461369e+00 1.2252290e+01 1.0901793e+01 4.6086535e+00 6.3447402e+00 4.7413040e+00 8.7641883e+00 3.2057410e+00 5.4365488e+00 6.6087609e+00 2.8352192e+00 3.3251194e+00 4.6253473e+00 4.8796304e+00 6.7235575e+00 1.1544857e+01 4.8240043e+00 2.6076804e+00 4.2918044e+00 8.3992920e+00 6.9641171e+00 4.1831794e+00 3.2484124e+00 4.9657043e+00 5.2054895e+00 4.6853779e+00 5.0785120e+00 6.3683844e+00 6.2496912e+00 3.8302687e+00 4.2300183e+00 3.2967448e+00 6.6316535e+00 4.2367439e+00 4.1309582e+00 3.2538196e+00 4.1913254e+00 3.7049365e+00 2.4086604e+00 4.6427345e+00 3.3078726e+00 2.4068601e+00 5.0650088e+00 1.8435146e+00 6.1811463e+00 2.4032464e+00 5.2054895e+00 4.4384864e+00 4.0792507e+00 4.2100879e+00 4.6533724e+00 7.3347853e+00 3.8423451e+00 3.3489040e+00 2.4404310e+00 2.9891849e+00 1.2020661e+00 4.2159199e+00 2.7968417e+00 5.5583985e+00 6.1654889e+00 4.7498457e+00 2.4086604e+00 1.6872569e+00 2.6076804e+00 3.8111198e+00 2.2325586e+00 3.9234433e+00 1.5760969e+00 3.2057410e+00 2.6076804e+00 3.7467898e+00 3.3250204e+00 2.0600534e+00 1.1879491e+01 4.6400185e+00 1.1275644e+01 7.6559441e+00 1.0081669e+01 1.3651965e+01 3.4108543e+00 1.0974437e+01 8.8632375e+00 1.5200799e+01 8.7790158e+00 6.2369924e+00 9.8473667e+00 5.6799811e+00 6.6007342e+00 9.8195020e+00 8.2959830e+00 1.7247327e+01 1.3924955e+01 5.7104821e+00 1.1797894e+01 4.8041001e+00 1.2607534e+01 5.0298754e+00 1.1114560e+01 1.1429181e+01 5.4536126e+00 6.2451534e+00 8.2575090e+00 9.4647686e+00 1.0591719e+01 1.6327008e+01 8.5203108e+00 5.1606158e+00 4.8057643e+00 1.3479281e+01 1.1112099e+01 8.4386694e+00 5.8166664e+00 1.0225703e+01 1.1052369e+01 1.0105905e+01 4.6400185e+00 1.1994175e+01 1.2234524e+01 9.5403400e+00 6.7982510e+00 8.3101518e+00 1.0169863e+01 6.1904727e+00 7.7097471e+00 3.2826324e+00 8.8124701e+00 4.3366937e+00 9.8684572e+00 7.6718193e+00 4.3562278e+00 6.7907004e+00 3.7894174e+00 1.0500766e+01 6.5161377e+00 8.9058988e+00 7.8006404e+00 8.1557766e+00 9.4229584e+00 1.0269570e+01 1.2073841e+01 8.4502205e+00 2.0611757e+00 3.1053060e+00 2.2289625e+00 5.0423229e+00 9.5358385e+00 7.0827301e+00 9.9108014e+00 1.0972756e+01 6.5215097e+00 6.0940803e+00 4.4976504e+00 5.2846422e+00 8.8304347e+00 5.0785120e+00 7.8728875e-01 5.6831350e+00 6.2243800e+00 6.3761207e+00 7.7429209e+00 2.7177010e+00 5.9098113e+00 1.6361477e+01 9.8559189e+00 1.6164535e+01 1.2469112e+01 1.4812245e+01 1.8747784e+01 5.2945068e+00 1.6194941e+01 1.2528526e+01 1.9703000e+01 1.3266208e+01 1.1781802e+01 1.4607585e+01 9.0214033e+00 1.1365535e+01 1.4293371e+01 1.3028116e+01 2.1847706e+01 1.8751255e+01 7.3734554e+00 1.6420290e+01 9.3936030e+00 1.8182714e+01 1.0401521e+01 1.5653517e+01 1.6253628e+01 1.0228753e+01 1.0748384e+01 1.3271762e+01 1.4567710e+01 1.6002309e+01 2.0988426e+01 1.3538880e+01 1.0208675e+01 9.7983076e+00 1.8505085e+01 1.5500991e+01 1.3061331e+01 1.0269805e+01 1.4900224e+01 1.5698832e+01 1.4741633e+01 9.8559189e+00 1.6620375e+01 1.6753144e+01 1.4233625e+01 1.0266544e+01 1.2956009e+01 1.4520665e+01 1.0670777e+01 3.6270377e+00 2.0600534e+00 2.7968417e+00 2.5602448e+00 9.5244063e-01 2.2986581e+00 2.7776085e+00 3.7440234e+00 2.1941208e+00 2.0158737e+00 3.2925417e+00 2.9320989e+00 2.0600534e+00 1.8347096e+00 4.0269799e+00 3.5264421e+00 9.8003160e-01 4.3768242e+00 4.5049716e+00 5.0193116e+00 2.4404310e+00 2.9832821e+00 1.2538012e+00 2.1096674e+00 2.6281695e+00 3.5700781e+00 1.2034300e+00 3.1702938e+00 3.2291810e+00 1.3720717e+00 2.4086604e+00 7.4800148e+00 1.6529143e+00 7.8728875e-01 1.0211725e+00 1.6872569e+00 7.0473547e+00 1.7382670e+00 8.0127755e+00 3.8708609e+00 7.0451448e+00 4.7209485e+00 5.7932405e+00 9.2610116e+00 4.6853779e+00 8.1499981e+00 7.4846354e+00 1.1708725e+01 5.2846422e+00 5.5005725e+00 5.7130341e+00 4.8373619e+00 4.6339344e+00 6.1504691e+00 4.2785746e+00 1.3838020e+01 1.3137940e+01 3.1763049e+00 8.1871185e+00 4.1050864e+00 1.0916805e+01 4.1703514e+00 7.5814894e+00 7.9139254e+00 3.4108543e+00 2.3592959e+00 6.2409861e+00 5.3895333e+00 8.8632375e+00 1.2978128e+01 6.4902132e+00 2.9058572e+00 4.4003002e+00 9.1213006e+00 7.3760362e+00 4.8126301e+00 1.9065209e+00 6.6007342e+00 7.2715053e+00 6.4658766e+00 3.8708609e+00 8.3353170e+00 8.5963661e+00 5.3958239e+00 5.1984987e+00 4.2895360e+00 6.4249445e+00 1.8030992e+00 4.4312523e+00 4.4437762e+00 5.8982666e+00 5.4676415e+00 1.5319850e+00 2.4220503e+00 2.1096674e+00 6.2422206e+00 1.9065209e+00 4.8209436e+00 3.6519699e+00 4.1703514e+00 5.4465930e+00 6.4583620e+00 8.0274963e+00 3.5174577e+00 2.4749599e+00 2.3563262e+00 2.0228388e+00 2.3563262e+00 4.4665927e+00 6.0002165e+00 4.6400185e+00 6.9966872e+00 2.6621660e+00 3.6891643e+00 2.2597668e+00 3.7062982e+00 4.4192352e+00 1.6257475e+00 3.3311669e+00 3.4523901e+00 3.5033902e+00 3.6072442e+00 3.6072442e+00 5.1564125e+00 3.0655002e+00 1.1527803e+01 6.3728182e+00 1.2094213e+01 8.0429567e+00 1.0387422e+01 1.4783457e+01 6.2803255e+00 1.2269295e+01 8.4189234e+00 1.5485202e+01 8.9255249e+00 7.4855345e+00 1.0433148e+01 6.1406816e+00 7.6851343e+00 9.7375591e+00 8.7897317e+00 1.7822970e+01 1.4701644e+01 2.3266953e+00 1.2193510e+01 7.1375493e+00 1.4259661e+01 6.0979962e+00 1.1370287e+01 1.2292864e+01 5.7830949e+00 6.0312674e+00 8.8421912e+00 1.0713627e+01 1.2080829e+01 1.7067046e+01 9.0695092e+00 6.0343926e+00 5.3362643e+00 1.4526704e+01 1.0720102e+01 8.7158117e+00 4.9922012e+00 1.0760414e+01 1.1351021e+01 1.0531962e+01 6.3728182e+00 1.2333575e+01 1.2340685e+01 9.9458372e+00 5.9311220e+00 8.6529371e+00 9.6237975e+00 6.4476090e+00 3.0952938e+00 2.1941208e+00 2.0600534e+00 3.6635621e+00 2.3988602e+00 4.9070353e+00 2.4086604e+00 1.5678278e+00 2.1654045e+00 4.6533907e-01 1.5760969e+00 1.7448317e+00 1.5678278e+00 3.0655002e+00 8.1287374e-01 5.4153806e+00 5.6291565e+00 6.1464320e+00 3.5033902e+00 2.1654045e+00 2.3988602e+00 2.3563262e+00 1.6856955e+00 2.7968417e+00 2.9099493e+00 4.2177392e+00 3.4108543e+00 3.1748021e-01 3.6072442e+00 8.4391303e+00 3.0473381e+00 2.8352192e+00 1.9394676e+00 1.1359060e+00 7.8298261e+00 2.7017933e+00 6.9024609e+00 3.4523901e+00 6.8555454e+00 2.9058572e+00 5.4365488e+00 9.2686708e+00 4.7876069e+00 6.3043875e+00 6.0645671e+00 1.0711814e+01 4.2300183e+00 3.8981003e+00 5.3670304e+00 4.2300183e+00 4.0478936e+00 5.0617707e+00 3.9497555e+00 1.2977419e+01 1.1614119e+01 2.6519650e+00 7.3109812e+00 3.2484124e+00 9.3703084e+00 2.4674089e+00 6.6633790e+00 7.2851014e+00 1.6097959e+00 1.3720717e+00 4.5525602e+00 5.3966280e+00 7.3335619e+00 1.2140987e+01 4.7602215e+00 1.8793802e+00 1.8030992e+00 9.0089245e+00 6.1683954e+00 4.0602397e+00 1.6097959e+00 5.7964759e+00 6.4338191e+00 5.4675208e+00 3.4523901e+00 7.4900802e+00 7.5823337e+00 4.8711511e+00 3.4523901e+00 3.7894174e+00 5.0971418e+00 2.6292664e+00 4.8077583e+00 2.1222843e+00 2.9320989e+00 5.7720200e+00 1.8435146e+00 5.3865442e+00 1.9394676e+00 6.0187291e+00 3.7807307e+00 2.3789828e+00 4.2338522e+00 5.3442396e+00 6.6291783e+00 2.9058572e+00 1.9081610e+00 2.3563262e+00 2.2986581e+00 1.9617216e+00 5.2962652e+00 3.0472425e+00 5.1103864e+00 5.8269975e+00 4.3562278e+00 8.5602218e-01 1.7632210e+00 2.8198290e+00 3.6152368e+00 2.4086604e+00 4.4320784e+00 1.2020661e+00 1.9428691e+00 9.7877528e-01 2.0611757e+00 4.1643796e+00 1.2845725e+00 1.0894043e+01 5.4730040e+00 1.0288554e+01 6.1807879e+00 8.9855450e+00 1.2607139e+01 5.8982666e+00 9.4548775e+00 9.6654134e+00 1.4530474e+01 8.0955705e+00 7.5612908e+00 8.8961475e+00 5.7601990e+00 6.1235030e+00 8.9919124e+00 7.3866285e+00 1.6671354e+01 1.5077558e+01 6.2016803e+00 1.1006321e+01 3.8035527e+00 1.2681134e+01 6.3038736e+00 1.0380866e+01 1.0769143e+01 5.4390228e+00 5.3690376e+00 8.1309261e+00 8.7219541e+00 1.0686789e+01 1.5854480e+01 8.3792695e+00 5.2828298e+00 5.9390236e+00 1.2469731e+01 1.0254969e+01 7.6311135e+00 4.9275407e+00 9.4522814e+00 1.0138878e+01 9.3618745e+00 5.4730040e+00 1.1148822e+01 1.1424690e+01 8.5968215e+00 7.4784210e+00 7.3999574e+00 9.3292753e+00 5.1449763e+00 2.6942068e+00 4.8485304e+00 3.4461369e+00 6.0343926e+00 3.9497555e+00 3.3078726e+00 3.7894174e+00 3.4108543e+00 1.6872569e+00 3.1748021e-01 1.5760969e+00 1.9065209e+00 2.3988602e+00 6.8607322e+00 6.7494214e+00 7.3418328e+00 4.7791920e+00 4.8297594e+00 2.9764215e+00 2.9784994e+00 6.0103306e-01 2.4285106e+00 3.2996458e+00 5.1704530e+00 3.5984040e+00 1.6856955e+00 4.7791920e+00 9.6031712e+00 3.9146349e+00 3.2083409e+00 3.2083409e+00 2.0600534e+00 9.1365134e+00 3.7846788e+00 7.4720625e+00 6.1811463e+00 5.9348944e+00 5.0762614e+00 5.3336079e+00 8.4647059e+00 5.8827630e+00 6.8177129e+00 4.7185919e+00 9.0645620e+00 3.6519699e+00 5.1103864e+00 4.2086721e+00 6.9781254e+00 7.0639373e+00 4.9611467e+00 3.9146349e+00 1.1504541e+01 1.1509061e+01 5.3433169e+00 5.3689177e+00 6.0343926e+00 9.5389978e+00 4.2752754e+00 4.1790580e+00 5.6081951e+00 4.0061263e+00 3.7894174e+00 5.8775612e+00 4.6523489e+00 7.4167819e+00 1.0823621e+01 6.1072723e+00 3.5019091e+00 4.6400185e+00 8.3188517e+00 6.8704558e+00 3.5027891e+00 3.7572369e+00 3.6878258e+00 3.4864985e+00 3.5173564e+00 6.1811463e+00 5.2888440e+00 4.9478896e+00 3.3475964e+00 5.2639976e+00 3.8423451e+00 6.5344826e+00 4.6367122e+00 3.4523901e+00 2.2132457e+00 3.1033130e+00 2.7566600e+00 3.3918985e+00 3.2925417e+00 2.9320989e+00 2.8823731e+00 1.9707507e+00 3.8152058e+00 3.4419440e+00 7.3049739e-01 4.5683271e+00 4.2177392e+00 4.6717100e+00 3.4108543e+00 3.3078726e+00 2.0000000e-01 1.7632210e+00 2.3996166e+00 3.8537088e+00 9.3067814e-01 3.0473381e+00 2.1096674e+00 1.2845725e+00 3.4523901e+00 7.3838786e+00 1.6529143e+00 1.3974652e+00 1.6872569e+00 2.5381307e+00 6.8479112e+00 2.1654045e+00 8.3326197e+00 3.6635621e+00 7.0765961e+00 4.9255097e+00 5.9537061e+00 9.3042141e+00 2.7825075e+00 8.2014064e+00 7.5925711e+00 1.1759150e+01 5.2846422e+00 5.6023781e+00 5.7343835e+00 3.8076263e+00 4.4109147e+00 6.2569002e+00 4.3750936e+00 1.3885430e+01 1.3203645e+01 3.4753074e+00 8.2283623e+00 2.2289625e+00 1.0959930e+01 4.1703514e+00 7.6729222e+00 7.9439000e+00 3.4108543e+00 2.4749599e+00 6.4155879e+00 5.3895333e+00 8.8769728e+00 1.2966253e+01 6.6675485e+00 2.9765394e+00 4.7498457e+00 9.0966241e+00 7.6200842e+00 4.9523219e+00 2.0720948e+00 6.5781474e+00 7.3428148e+00 6.3529298e+00 3.6635621e+00 8.4354784e+00 8.6924942e+00 5.3680743e+00 5.2479901e+00 4.3196065e+00 6.6850519e+00 2.4386212e+00 4.5244831e+00 1.7382670e+00 4.8940042e+00 1.9081610e+00 4.8373619e+00 2.7968417e+00 3.1301555e+00 4.3709515e+00 5.0288583e+00 6.8421774e+00 3.1702938e+00 1.4281301e+00 2.4404310e+00 2.0720948e+00 6.3496042e-01 3.4896634e+00 4.0061263e+00 4.6086535e+00 5.9367931e+00 3.7440234e+00 1.6529143e+00 2.1958558e+00 2.1958558e+00 3.7440234e+00 8.1287374e-01 4.0846899e+00 1.2034300e+00 1.6872569e+00 1.6872569e+00 2.7232965e+00 4.5992589e+00 9.8003160e-01 1.0678375e+01 3.0143899e+00 1.0664696e+01 6.9149178e+00 9.1863582e+00 1.3188327e+01 5.2478713e+00 1.0655976e+01 8.3353170e+00 1.4394600e+01 7.9422508e+00 5.5305437e+00 9.1246018e+00 4.8240043e+00 4.5282213e+00 8.7790158e+00 7.6550962e+00 1.6715243e+01 1.3404483e+01 5.0395673e+00 1.0997846e+01 4.6253473e+00 1.2243277e+01 4.3294698e+00 1.0330052e+01 1.1054676e+01 4.6367122e+00 5.3019073e+00 7.3941421e+00 9.3356882e+00 1.0211700e+01 1.5948835e+01 7.6058877e+00 4.8241191e+00 4.8824017e+00 1.2915431e+01 9.9379347e+00 7.7311057e+00 4.7544555e+00 9.5199193e+00 1.0142233e+01 9.2795627e+00 3.0143899e+00 1.1164603e+01 1.1264817e+01 8.6672756e+00 5.9584541e+00 7.5069144e+00 8.9526976e+00 4.9523219e+00 4.7121146e+00 4.4731193e+00 3.2484124e+00 1.5760969e+00 2.7968417e+00 3.0424191e+00 3.0544195e+00 3.7462992e+00 4.8373619e+00 1.3327229e+00 5.8858770e+00 4.8297594e+00 5.3082513e+00 4.4781854e+00 3.2484124e+00 2.5398417e+00 2.5353443e+00 3.1200292e+00 1.2337044e+00 4.8173209e+00 4.1050864e+00 3.5019091e+00 2.2535695e+00 4.0061263e+00 6.7407792e+00 3.8981003e+00 4.6223377e+00 4.1050864e+00 2.1181110e+00 7.6762434e+00 4.1643796e+00 8.3992920e+00 4.7593621e+00 9.1448132e+00 4.9255097e+00 7.4559277e+00 1.1793007e+01 3.2727843e+00 9.1508640e+00 5.5671376e+00 1.2491196e+01 5.8344268e+00 4.5812846e+00 7.4880468e+00 4.4976504e+00 6.1982358e+00 6.6978080e+00 5.7151381e+00 1.4685798e+01 1.1895898e+01 1.0683811e+00 9.2439014e+00 5.2639976e+00 1.1265488e+01 3.1053060e+00 8.3398875e+00 9.0958299e+00 2.4386212e+00 3.6891643e+00 5.9368993e+00 7.3011602e+00 9.0695092e+00 1.3802039e+01 6.1812543e+00 2.4768885e+00 3.5490965e+00 1.1594344e+01 7.5539762e+00 5.5791936e+00 3.7966977e+00 7.7664539e+00 8.4408031e+00 7.5256091e+00 4.7593621e+00 9.3936030e+00 9.3927481e+00 7.0086477e+00 3.1053060e+00 5.6533688e+00 5.9961598e+00 4.8592051e+00 6.3761207e+00 2.6076804e+00 4.2557154e+00 3.9243446e+00 4.3308090e+00 5.5793154e+00 6.3290021e+00 8.1201266e+00 4.5049716e+00 1.6097959e+00 6.2402515e-01 1.2337044e+00 1.0211725e+00 5.3428933e+00 4.1643796e+00 5.9367931e+00 7.1185445e+00 3.8022487e+00 1.7965249e+00 8.1287374e-01 1.7799212e+00 4.9554007e+00 1.2337044e+00 3.4545933e+00 1.4448053e+00 2.2986581e+00 2.4086604e+00 3.9234433e+00 2.1853375e+00 1.9617216e+00 1.2113681e+01 5.4035866e+00 1.2043302e+01 8.3260080e+00 1.0618903e+01 1.4572490e+01 3.9478790e+00 1.2040408e+01 7.4479771e+00 1.5674092e+01 9.2552274e+00 7.5144739e+00 1.0507684e+01 3.8599252e+00 6.7775263e+00 1.0169150e+01 8.9776448e+00 1.7896037e+01 1.3947625e+01 5.2307726e+00 1.2339677e+01 4.3750936e+00 1.3848067e+01 6.2243800e+00 1.1620212e+01 1.2271079e+01 6.1286762e+00 6.6861935e+00 8.9919124e+00 1.0567247e+01 1.1761308e+01 1.7087241e+01 9.2292837e+00 6.1904727e+00 5.4681442e+00 1.4333785e+01 1.1332939e+01 9.0266859e+00 6.1811463e+00 1.0854961e+01 1.1548494e+01 1.0664320e+01 5.4035866e+00 1.2513056e+01 1.2631653e+01 1.0099085e+01 5.3680743e+00 8.8820166e+00 1.0357170e+01 6.4787998e+00 4.5812846e+00 3.5019091e+00 3.0306837e+00 4.4976504e+00 4.1309582e+00 3.4243718e+00 2.8823731e+00 2.4404310e+00 6.8116645e+00 7.1641706e+00 7.6324599e+00 4.8711511e+00 2.6076804e+00 3.2057410e+00 1.9617216e+00 2.8198290e+00 5.4065403e+00 4.1050864e+00 5.9615256e+00 4.9989720e+00 2.4674089e+00 4.9095711e+00 1.0195526e+01 4.7319797e+00 3.8163221e+00 3.8981003e+00 3.9805707e+00 9.7135131e+00 4.3768242e+00 5.4018251e+00 2.2986581e+00 6.3822592e+00 3.0108214e+00 5.2153608e+00 8.7084761e+00 4.7413040e+00 6.1873794e+00 5.1773454e+00 8.9526976e+00 2.1941208e+00 3.8076263e+00 4.9552846e+00 3.0424191e+00 3.3078726e+00 3.1201257e+00 2.9765394e+00 1.0958178e+01 1.1722539e+01 3.4917521e+00 4.9113735e+00 2.4086604e+00 9.4591766e+00 1.9394676e+00 4.7602215e+00 3.9672322e+00 1.1066229e+00 1.0211725e+00 4.9070353e+00 6.0061134e+00 7.2194469e+00 9.9046438e+00 5.1984987e+00 3.5133086e+00 4.8173209e+00 8.5889864e+00 4.8173209e+00 2.4650524e+00 4.6533907e-01 4.5218499e+00 5.3540554e+00 4.2918044e+00 2.2986581e+00 5.0981644e+00 5.8027174e+00 4.5812846e+00 3.2181600e+00 3.3745138e+00 3.8981003e+00 7.8728875e-01 3.6814239e+00 1.0994463e+00 1.3974652e+00 2.8352192e+00 3.0001051e+00 5.2153608e+00 2.0600534e+00 3.4523901e+00 3.3745138e+00 3.9620349e+00 1.4295913e+00 3.2996458e+00 3.8022487e+00 3.5331986e+00 4.3311388e+00 2.2289625e+00 1.5319850e+00 1.3960172e+00 3.0306837e+00 1.6856955e+00 1.2034300e+00 6.2803255e+00 1.5319850e+00 2.1654045e+00 1.3720717e+00 9.8003160e-01 5.7837411e+00 7.3049739e-01 8.7390739e+00 4.7026362e+00 8.9519153e+00 4.9712473e+00 7.3864546e+00 1.1392440e+01 5.6888931e+00 8.7511479e+00 7.3302352e+00 1.2768810e+01 6.3109853e+00 5.0532934e+00 7.4562124e+00 5.7961680e+00 4.9265184e+00 7.0693321e+00 5.8736945e+00 1.5008478e+01 1.2726746e+01 4.2067971e+00 9.3619696e+00 4.3196065e+00 9.8614388e+00 3.8075218e+00 8.6344372e+00 9.2998266e+00 2.6281695e+00 3.1200292e+00 5.1903196e+00 7.4929246e+00 7.9428337e+00 1.4237814e+01 5.3982317e+00 2.7137970e+00 3.0636839e+00 1.1226589e+01 8.0735938e+00 5.9190268e+00 3.6270377e+00 7.9101285e+00 8.4805952e+00 7.7599800e+00 4.7026362e+00 9.4745324e+00 9.6062774e+00 7.0663972e+00 4.9235130e+00 5.8323565e+00 6.9884608e+00 4.5440115e+00 2.4994860e+00 3.0306837e+00 3.3251194e+00 2.2986581e+00 2.8352192e+00 2.2801540e+00 5.7983629e+00 5.4365488e+00 5.9016165e+00 4.6853779e+00 1.9617216e+00 3.6527774e+00 3.8708609e+00 2.4068601e+00 1.7965249e+00 5.3082513e+00 3.7049365e+00 3.9243446e+00 2.6076804e+00 4.1105235e+00 8.2099586e+00 4.2311315e+00 5.1988535e+00 4.6086535e+00 3.0306837e+00 6.8135754e+00 4.5347546e+00 6.0115617e+00 3.1702938e+00 7.2058070e+00 2.8384170e+00 5.5180183e+00 9.8334518e+00 3.6694193e+00 7.2643370e+00 3.1785432e+00 1.0559223e+01 3.8022487e+00 2.6292664e+00 5.5344713e+00 2.2968911e+00 4.4975387e+00 4.6367122e+00 3.8981003e+00 1.2835877e+01 9.5200384e+00 1.3974652e+00 7.2878087e+00 3.0506295e+00 9.2207170e+00 7.8728875e-01 6.4583620e+00 7.2796412e+00 1.9081610e+00 2.0228388e+00 3.9500734e+00 5.5241381e+00 7.0837983e+00 1.1955719e+01 4.1581419e+00 7.8728875e-01 2.3988602e+00 9.5547476e+00 5.1863284e+00 3.7462992e+00 2.8691226e+00 5.7887716e+00 6.4467866e+00 5.3243319e+00 3.1702938e+00 7.4696139e+00 7.4125964e+00 4.9070353e+00 7.3049739e-01 3.6815270e+00 5.3142770e+00 3.4523901e+00 2.1096674e+00 2.9320989e+00 1.8347096e+00 3.8981003e+00 1.6872569e+00 4.4651172e+00 4.6143481e+00 5.2153608e+00 2.2149867e+00 2.3191846e+00 3.3200257e+00 3.0306837e+00 2.4386212e+00 2.6076804e+00 3.2484124e+00 3.9500734e+00 2.1941208e+00 1.0211725e+00 2.3592959e+00 7.3999122e+00 2.7177010e+00 2.2289625e+00 2.5152850e+00 1.6097959e+00 6.6321965e+00 2.1079600e+00 7.6179739e+00 3.5019091e+00 7.8203532e+00 4.0269799e+00 6.2981278e+00 1.0352448e+01 5.0481626e+00 7.7957849e+00 6.2975240e+00 1.1493019e+01 4.9348177e+00 3.9500734e+00 6.2454706e+00 4.3709515e+00 3.6603350e+00 5.7542570e+00 4.8173209e+00 1.3855843e+01 1.1681980e+01 3.0655002e+00 8.1091167e+00 2.9535696e+00 8.9158502e+00 2.5381307e+00 7.4425438e+00 8.2319781e+00 1.4281301e+00 1.9600632e+00 4.1923956e+00 6.5042430e+00 6.9544657e+00 1.3058928e+01 4.3750936e+00 1.8435146e+00 2.4219631e+00 1.0033509e+01 6.8446062e+00 4.8592051e+00 2.2325586e+00 6.6133493e+00 7.2259813e+00 6.2271381e+00 3.5019091e+00 8.2957399e+00 8.3244446e+00 5.6799811e+00 3.6072442e+00 4.5812846e+00 5.7403681e+00 3.3745138e+00 1.2337044e+00 2.5152850e+00 3.5019091e+00 1.6257475e+00 5.0849769e+00 5.0395673e+00 5.6291565e+00 3.0306837e+00 4.0602397e+00 3.2083409e+00 3.4523901e+00 2.7232965e+00 1.4281301e+00 1.9800112e+00 3.1785432e+00 2.9832821e+00 1.9081610e+00 3.0655002e+00 7.8592793e+00 1.9800112e+00 2.1003737e+00 1.0994463e+00 2.0000000e-01 7.3100880e+00 1.8347096e+00 7.3840372e+00 5.3243319e+00 7.1637687e+00 3.3931443e+00 5.2888440e+00 9.6207407e+00 5.5966102e+00 6.6412022e+00 6.2328058e+00 1.1022320e+01 4.3585102e+00 3.4896634e+00 5.6239984e+00 6.2371770e+00 5.9679440e+00 4.5608957e+00 3.9430988e+00 1.3369936e+01 1.1950132e+01 4.8297594e+00 7.5714603e+00 5.1362634e+00 9.7454387e+00 3.2484124e+00 6.8085786e+00 7.6686399e+00 3.0473381e+00 3.5331986e+00 3.9970029e+00 5.8530910e+00 7.7257361e+00 1.2641495e+01 4.1845341e+00 2.5602448e+00 4.2808407e+00 9.4349661e+00 6.7341196e+00 3.5984040e+00 3.5753219e+00 6.1504691e+00 6.5754074e+00 5.9489580e+00 5.3243319e+00 7.6442731e+00 7.6951914e+00 5.1564125e+00 4.2177392e+00 3.8590103e+00 6.5884230e+00 4.4385975e+00 1.6257475e+00 1.9065209e+00 1.9428691e+00 6.3503289e+00 6.2975240e+00 6.8741496e+00 4.3044426e+00 4.3311388e+00 2.2299116e+00 3.0306837e+00 1.4295913e+00 2.0628679e+00 2.5094325e+00 4.7498457e+00 3.2190108e+00 1.0683811e+00 4.3308090e+00 9.1282639e+00 3.4917521e+00 2.4219631e+00 2.7176097e+00 1.6097959e+00 8.6309521e+00 3.3250204e+00 7.5219659e+00 5.6533688e+00 5.3734154e+00 4.3905308e+00 4.1525814e+00 7.7340082e+00 5.4681442e+00 6.6098886e+00 5.2732313e+00 9.6868303e+00 3.6519699e+00 4.4975387e+00 3.8546232e+00 6.4867054e+00 6.4593589e+00 5.0394504e+00 2.8818172e+00 1.2068742e+01 1.1403760e+01 4.9095711e+00 6.1557185e+00 5.4848472e+00 9.3507314e+00 3.7440234e+00 5.2825818e+00 6.3083985e+00 3.4765339e+00 2.9059510e+00 5.1849808e+00 4.1257357e+00 7.2779373e+00 1.1356932e+01 5.4035866e+00 2.9784994e+00 4.1609827e+00 7.5843311e+00 6.8704558e+00 3.9146349e+00 2.8896105e+00 4.7413040e+00 4.9729027e+00 4.5525602e+00 5.6533688e+00 6.1559822e+00 6.1232398e+00 3.3475964e+00 4.7319797e+00 2.8179114e+00 6.5656320e+00 3.6982069e+00 1.9617216e+00 2.8198290e+00 6.9024609e+00 7.0693321e+00 7.6256450e+00 4.8240043e+00 3.1541992e+00 4.1279691e+00 4.5347546e+00 1.4295913e+00 3.5753219e+00 4.7747038e+00 5.5028041e+00 4.6327857e+00 2.1181110e+00 5.0305701e+00 9.8083769e+00 4.1655982e+00 4.7792894e+00 3.9995803e+00 2.9099493e+00 9.1278068e+00 3.4914033e+00 8.0450763e+00 4.2918044e+00 5.3407955e+00 4.1913254e+00 5.3684887e+00 8.0131260e+00 5.9877309e+00 5.4419170e+00 4.0478936e+00 8.7760195e+00 3.9620349e+00 3.5753219e+00 3.1626930e+00 5.1104864e+00 4.5608957e+00 5.4065403e+00 3.8655529e+00 1.1296629e+01 9.3305579e+00 3.8423451e+00 5.2538695e+00 3.4514411e+00 6.7493550e+00 2.5152850e+00 5.0971418e+00 5.7183653e+00 1.5745775e+00 3.2181600e+00 3.8895281e+00 4.1201069e+00 4.8102553e+00 1.0591172e+01 4.0846899e+00 1.7448317e+00 3.3425881e+00 7.7961798e+00 7.2058070e+00 4.4437762e+00 2.7441434e+00 3.9500734e+00 4.9523219e+00 3.6124074e+00 4.2918044e+00 4.8365631e+00 5.9263965e+00 3.5752200e+00 3.6815270e+00 3.6635621e+00 6.7574575e+00 4.2489359e+00 3.4410701e+00 8.6917104e+00 8.8641567e+00 9.3733417e+00 6.7436282e+00 2.6519650e+00 3.7523627e+00 3.9941117e+00 1.2034300e+00 5.2272844e+00 4.8365631e+00 7.5093183e+00 6.5499171e+00 2.6602921e+00 6.8607322e+00 1.1656114e+01 6.2271381e+00 4.7112671e+00 5.2448399e+00 3.9941117e+00 1.1095433e+01 5.8857526e+00 6.0246159e+00 3.3250204e+00 3.4243718e+00 2.7017933e+00 2.9535696e+00 5.7008385e+00 5.3729238e+00 4.3287251e+00 2.6281695e+00 7.4232180e+00 1.9617216e+00 2.7566600e+00 1.9394676e+00 3.5685848e+00 4.2366348e+00 3.4108543e+00 1.5319850e+00 9.7014960e+00 9.1841265e+00 3.3425881e+00 4.0215873e+00 3.6549921e+00 7.0987280e+00 2.1096674e+00 2.8384170e+00 3.9834057e+00 2.3563262e+00 1.4281301e+00 3.6635621e+00 2.6281695e+00 5.0035889e+00 8.8495757e+00 3.8981003e+00 2.1654045e+00 4.7121146e+00 5.5454559e+00 5.2272844e+00 2.2986581e+00 1.8347096e+00 2.6292664e+00 2.6500939e+00 2.2325586e+00 3.3250204e+00 4.0269799e+00 3.6305664e+00 1.2020661e+00 2.2289625e+00 1.4448053e+00 4.7593621e+00 1.7044794e+00 5.0140089e+00 5.2479901e+00 5.7421913e+00 3.1301555e+00 1.6856955e+00 9.7877528e-01 8.5602218e-01 2.1181110e+00 2.7968417e+00 2.6292664e+00 3.9419067e+00 2.8691226e+00 1.0079368e+00 3.2057410e+00 8.1120197e+00 2.7232965e+00 2.4404310e+00 1.6529143e+00 1.2480503e+00 7.5687346e+00 2.4086604e+00 7.4558719e+00 3.3745138e+00 7.2032482e+00 3.2546742e+00 5.8594323e+00 9.5546914e+00 3.2190108e+00 6.5163258e+00 6.3812990e+00 1.1145459e+01 4.7319797e+00 4.3308090e+00 5.7688708e+00 4.2490451e+00 4.0269799e+00 5.6023781e+00 4.2918044e+00 1.3308861e+01 1.1931745e+01 1.8942271e+00 7.7429209e+00 3.3489040e+00 9.6247695e+00 2.9891849e+00 7.0798601e+00 7.5458551e+00 2.1958558e+00 2.1096674e+00 4.9892667e+00 5.5242700e+00 7.6040858e+00 1.2438919e+01 5.2174040e+00 1.9065209e+00 3.2996458e+00 9.3615223e+00 6.7436282e+00 4.4326030e+00 1.3974652e+00 6.2202729e+00 6.8971173e+00 6.0000912e+00 3.3745138e+00 7.9101285e+00 8.0683594e+00 5.3670304e+00 4.0061263e+00 4.2367439e+00 5.7420681e+00 2.4787096e+00 1.9617216e+00 1.2480503e+00 1.8793802e+00 5.5577326e+00 5.3079540e+00 6.5776821e+00 7.8204925e+00 5.0617707e+00 3.3078726e+00 2.6076804e+00 2.4219631e+00 5.5296511e+00 1.5319850e+00 2.3592959e+00 2.6519650e+00 2.5781299e+00 2.6107730e+00 4.6223377e+00 2.9099493e+00 2.1941208e+00 1.2501110e+01 5.4532522e+00 1.2496164e+01 8.6806295e+00 1.1001317e+01 1.4998758e+01 6.0104694e+00 1.2451721e+01 9.1489449e+00 1.6237869e+01 9.8140705e+00 7.7637702e+00 1.0978841e+01 4.6870320e+00 6.8817447e+00 1.0660057e+01 9.4253046e+00 1.8489351e+01 1.3517210e+01 6.2328058e+00 1.2848044e+01 5.7478030e+00 1.4164660e+01 6.5398431e+00 1.2134640e+01 1.2810900e+01 6.5400351e+00 7.1401562e+00 9.2846561e+00 1.1093487e+01 1.2122754e+01 1.7737306e+01 9.5164235e+00 6.5988803e+00 5.2835280e+00 1.4802836e+01 1.1793007e+01 9.4880598e+00 6.6186038e+00 1.1388108e+01 1.2013138e+01 1.1245738e+01 5.4532522e+00 1.2983768e+01 1.3130001e+01 1.0598898e+01 6.9538879e+00 9.3619696e+00 1.0823729e+01 6.7985795e+00 3.1748021e-01 1.9081610e+00 6.1558451e+00 4.2177392e+00 6.6861935e+00 7.8343729e+00 3.8423451e+00 2.7968417e+00 1.0211725e+00 1.6856955e+00 5.6698594e+00 1.9617216e+00 2.7177010e+00 2.4086604e+00 3.0306837e+00 3.1702938e+00 4.6283431e+00 2.4285106e+00 2.7232965e+00 1.2917664e+01 6.2970778e+00 1.2827310e+01 9.1104843e+00 1.1417248e+01 1.5366113e+01 4.6992933e+00 1.2828594e+01 8.8107841e+00 1.6429050e+01 1.0011908e+01 8.3563180e+00 1.1288684e+01 5.1909502e+00 7.7014693e+00 1.0952574e+01 9.7384286e+00 1.8625032e+01 1.4976806e+01 5.3428933e+00 1.3111731e+01 5.6483059e+00 1.4693251e+01 7.0450112e+00 1.2375334e+01 1.3009593e+01 6.9191438e+00 7.4564051e+00 9.8231784e+00 1.1310599e+01 1.2584521e+01 1.7804360e+01 1.0069029e+01 6.9465025e+00 6.3278958e+00 1.5134600e+01 1.2120718e+01 9.7801479e+00 6.9602057e+00 1.1622099e+01 1.2339677e+01 1.1446152e+01 6.2970778e+00 1.3288306e+01 1.3411930e+01 1.0893909e+01 6.6481617e+00 9.6565770e+00 1.1145459e+01 7.2811187e+00 2.4994860e+00 6.6087609e+00 4.6717100e+00 7.2058070e+00 8.3884914e+00 4.3585102e+00 3.3078726e+00 1.3974652e+00 2.1181110e+00 6.1982358e+00 2.4994860e+00 1.9394676e+00 2.8691226e+00 3.6016092e+00 3.6815270e+00 5.1988535e+00 2.8810032e+00 3.2291810e+00 1.3361735e+01 6.7103743e+00 1.3307346e+01 9.5759824e+00 1.1870051e+01 1.5857995e+01 5.1362634e+00 1.3334836e+01 9.2625214e+00 1.6913645e+01 1.0495980e+01 8.8068269e+00 1.1762006e+01 5.5703796e+00 8.1070431e+00 1.1413300e+01 1.0220773e+01 1.9141523e+01 1.5436225e+01 5.7985459e+00 1.3585499e+01 6.0468731e+00 1.5185716e+01 7.5023711e+00 1.2856753e+01 1.3528656e+01 7.3810827e+00 7.9240698e+00 1.0266748e+01 1.1849056e+01 1.3077965e+01 1.8344872e+01 1.0507958e+01 7.4451947e+00 6.8177129e+00 1.5619520e+01 1.2576828e+01 1.0263306e+01 7.4232180e+00 1.2106061e+01 1.2799029e+01 1.1927830e+01 6.7103743e+00 1.3756217e+01 1.3874851e+01 1.1359659e+01 7.0764228e+00 1.0127486e+01 1.1603845e+01 7.7311057e+00 3.3713910e+00 3.9620349e+00 4.6086535e+00 5.8166664e+00 3.5753219e+00 1.9617216e+00 1.6872569e+00 1.7448317e+00 3.6072442e+00 3.1748021e-01 4.8173209e+00 1.2034300e+00 1.3974652e+00 1.6872569e+00 2.6292664e+00 4.2366348e+00 1.2337044e+00 1.0618381e+01 2.9735696e+00 1.0547853e+01 6.7739107e+00 9.1026803e+00 1.3010081e+01 5.2846422e+00 1.0430827e+01 8.1655948e+00 1.4318475e+01 7.9052146e+00 5.4538181e+00 9.0519271e+00 4.8077583e+00 4.5511029e+00 8.7650002e+00 7.5179319e+00 1.6536012e+01 1.3248382e+01 4.8687213e+00 1.0934644e+01 4.6253473e+00 1.2041287e+01 4.2895360e+00 1.0232563e+01 1.0847577e+01 4.6143481e+00 5.2585929e+00 7.3177119e+00 9.0762494e+00 1.0034201e+01 1.5743744e+01 7.5454553e+00 4.6423593e+00 4.5817530e+00 1.2811586e+01 9.9019019e+00 7.5933953e+00 4.7318657e+00 9.4577156e+00 1.0105905e+01 9.2956909e+00 2.9735696e+00 1.1082559e+01 1.1230343e+01 8.6672756e+00 5.9201021e+00 7.4559277e+00 8.9259045e+00 4.8796304e+00 3.7462992e+00 2.0611757e+00 3.7572369e+00 4.1703514e+00 4.7541710e+00 4.8687213e+00 3.9941117e+00 2.6076804e+00 3.9146349e+00 8.9950775e+00 3.1785432e+00 4.5652200e+00 3.9804643e+00 3.5033902e+00 8.2224086e+00 3.7846788e+00 6.5875674e+00 7.8728875e-01 6.5161377e+00 2.9320989e+00 5.1988535e+00 9.0376021e+00 4.3824965e+00 6.4059592e+00 4.2311315e+00 1.0050329e+01 2.9059510e+00 1.8435146e+00 4.9070353e+00 2.4086604e+00 1.9800112e+00 4.3768242e+00 3.4523901e+00 1.2245359e+01 9.4830888e+00 1.2845725e+00 6.7397667e+00 2.6292664e+00 8.1797760e+00 1.4448053e+00 6.0306991e+00 6.5724457e+00 1.9617216e+00 1.9617216e+00 3.5753219e+00 4.3276881e+00 6.1038707e+00 1.1265824e+01 3.7894174e+00 9.8003160e-01 2.0600534e+00 8.7233325e+00 5.6533688e+00 3.4765339e+00 1.6529143e+00 5.1103864e+00 5.9615256e+00 4.0750538e+00 7.8728875e-01 7.0086477e+00 7.0146444e+00 4.1581419e+00 2.1958558e+00 3.1053060e+00 4.5468962e+00 1.2034300e+00 2.1079600e+00 2.6694426e+00 4.2366348e+00 1.6257475e+00 3.0473381e+00 2.1096674e+00 1.5678278e+00 4.0061263e+00 6.8039507e+00 2.4994860e+00 1.8720754e+00 2.1958558e+00 2.8823731e+00 6.2328058e+00 2.7232965e+00 8.8502509e+00 4.2300183e+00 7.4429357e+00 5.3468360e+00 6.3679408e+00 9.6698691e+00 2.4220503e+00 8.5716258e+00 8.0157661e+00 1.2195992e+01 5.6799811e+00 6.0246159e+00 6.1012591e+00 4.4976504e+00 5.0191949e+00 6.6978080e+00 4.7422975e+00 1.4305934e+01 1.3615841e+01 3.9221559e+00 8.6387232e+00 3.1702938e+00 1.1342811e+01 4.5652200e+00 8.0978740e+00 8.3180332e+00 3.7966977e+00 2.8384170e+00 6.8608447e+00 5.7106605e+00 9.2506947e+00 1.3361401e+01 7.1195810e+00 3.3229722e+00 5.2174040e+00 9.4522925e+00 8.1198648e+00 5.3546819e+00 2.4386212e+00 6.9538879e+00 7.7604772e+00 6.7235575e+00 4.2300183e+00 8.8625046e+00 9.1388445e+00 5.7373898e+00 5.6798768e+00 4.6849855e+00 7.1864803e+00 2.8671917e+00 2.9784994e+00 3.9531919e+00 3.7689616e+00 5.3777228e+00 4.1913254e+00 1.8793802e+00 4.5812846e+00 9.7062006e+00 4.1703514e+00 3.5133086e+00 3.4890627e+00 2.9320989e+00 9.3049345e+00 3.9620349e+00 6.0711225e+00 4.3311388e+00 8.1429057e+00 4.8687213e+00 6.7450611e+00 1.0602752e+01 3.8599252e+00 8.5889864e+00 7.3046204e+00 9.0951670e+00 4.1643796e+00 5.3805509e+00 6.6316535e+00 5.1103864e+00 5.3243319e+00 5.0423229e+00 4.9715946e+00 1.1339333e+01 1.3412105e+01 3.2453369e+00 7.1031000e+00 4.5049716e+00 1.1339333e+01 3.8655529e+00 5.6750675e+00 6.7778003e+00 3.1301555e+00 2.6292664e+00 6.3505662e+00 5.7731240e+00 9.1365134e+00 1.0476028e+01 6.6190589e+00 3.7462992e+00 4.8077583e+00 1.0439296e+01 4.3594708e+00 4.4326030e+00 1.8435146e+00 6.3195927e+00 7.0450112e+00 6.1286762e+00 4.3311388e+00 7.2646741e+00 6.6364513e+00 6.2371770e+00 4.8209436e+00 4.9832922e+00 3.5173564e+00 3.0306837e+00 4.0602397e+00 4.3824965e+00 6.3784819e+00 5.3865442e+00 1.9428691e+00 5.8684264e+00 1.0644287e+01 5.1592881e+00 4.2918044e+00 4.3657187e+00 3.1702938e+00 1.0137298e+01 4.9235130e+00 6.6913401e+00 5.1386230e+00 5.1704530e+00 4.2489359e+00 4.5992589e+00 7.6716480e+00 5.9665641e+00 5.9930792e+00 3.9509969e+00 8.2349721e+00 2.8352192e+00 4.2300183e+00 3.4796023e+00 5.8344268e+00 6.0341601e+00 4.1464270e+00 3.1541992e+00 1.0632967e+01 1.0671434e+01 3.8111198e+00 4.6253473e+00 4.8687213e+00 8.6965203e+00 3.2291810e+00 3.4896634e+00 4.8126301e+00 2.8691226e+00 2.7968417e+00 5.0617707e+00 3.7807307e+00 6.5685428e+00 9.9019019e+00 5.2912108e+00 2.2801540e+00 4.8711511e+00 7.4986778e+00 6.0341601e+00 2.7776085e+00 2.6519650e+00 2.9765394e+00 2.8573219e+00 2.7441434e+00 5.1386230e+00 4.5825506e+00 4.2447340e+00 2.6281695e+00 4.2300183e+00 3.0473381e+00 5.6533688e+00 3.6891643e+00 3.4445254e+00 2.7441434e+00 2.2149867e+00 2.7130023e+00 3.1053060e+00 5.2836191e+00 2.5781299e+00 3.6519699e+00 2.7949304e+00 1.4281301e+00 6.5934896e+00 2.8671917e+00 7.8443119e+00 5.4970133e+00 9.3843420e+00 4.6400185e+00 7.5021751e+00 1.2072834e+01 4.4003002e+00 9.5210859e+00 5.6997284e+00 1.2721914e+01 6.0136706e+00 4.6143481e+00 7.6901465e+00 5.1070304e+00 6.8972499e+00 6.6926708e+00 5.9201021e+00 1.5042443e+01 1.2003939e+01 2.7968417e+00 9.4378675e+00 6.0137961e+00 1.1543397e+01 2.9059510e+00 8.5434191e+00 9.5106656e+00 3.5753219e+00 4.6283431e+00 5.9016165e+00 7.8975746e+00 9.3736306e+00 1.4252881e+01 6.1203613e+00 2.7825075e+00 3.8152058e+00 1.1841270e+01 7.0698699e+00 5.7104821e+00 4.6968015e+00 8.0122527e+00 8.5590231e+00 7.7558955e+00 5.4970133e+00 9.5554439e+00 9.5112797e+00 7.1641706e+00 2.7949304e+00 5.7964759e+00 7.3517218e+00 5.7340487e+00 1.2845725e+00 2.1096674e+00 2.1223670e+00 1.8793802e+00 5.9098113e+00 6.0103306e-01 6.2402515e-01 6.2402515e-01 1.6856955e+00 5.4276294e+00 4.6533907e-01 9.5735348e+00 4.9235130e+00 8.3505935e+00 6.2184656e+00 7.1394990e+00 1.0602363e+01 4.9832922e+00 9.6247695e+00 9.0645620e+00 1.3155364e+01 6.6860626e+00 6.9920515e+00 6.9996358e+00 5.0971418e+00 5.6298378e+00 7.5788349e+00 5.6361111e+00 1.5349920e+01 1.4584111e+01 5.4675208e+00 9.5681049e+00 3.3425881e+00 1.2369966e+01 5.6533688e+00 9.0310259e+00 9.4002550e+00 4.8653317e+00 3.7050398e+00 7.7085997e+00 6.8992861e+00 1.0312825e+01 1.4516129e+01 7.9517483e+00 4.8182075e+00 5.4419170e+00 1.0402523e+01 8.9259045e+00 6.2726564e+00 3.2925417e+00 7.9412995e+00 8.6303275e+00 7.7695834e+00 4.9235130e+00 9.7423022e+00 1.0019922e+01 6.6536282e+00 6.7397667e+00 5.5787729e+00 8.0053041e+00 3.5685848e+00 1.1359060e+00 4.2514390e+00 9.8003160e-01 4.1050864e+00 1.0211725e+00 2.3563262e+00 1.6257475e+00 2.8384170e+00 3.0639700e+00 1.2034300e+00 1.1728396e+01 5.1104864e+00 1.1503075e+01 7.8288293e+00 1.0169229e+01 1.3988761e+01 3.1033130e+00 1.1405811e+01 6.9424643e+00 1.5160533e+01 8.7459758e+00 7.0431854e+00 9.9969936e+00 3.6878258e+00 6.5514583e+00 9.7314269e+00 8.4362845e+00 1.7287476e+01 1.3423892e+01 4.6853779e+00 1.1841270e+01 4.5525602e+00 1.3246563e+01 5.7420681e+00 1.1106784e+01 1.1626003e+01 5.6533688e+00 6.2204001e+00 8.5534454e+00 9.8415638e+00 1.1160380e+01 1.6414737e+01 8.8068269e+00 5.5619735e+00 4.8037575e+00 1.3779230e+01 1.0924842e+01 8.4950667e+00 5.7421913e+00 1.0324646e+01 1.1090995e+01 1.0157520e+01 5.1104864e+00 1.2028488e+01 1.2178400e+01 9.6255832e+00 4.9499198e+00 8.3884914e+00 9.9528141e+00 6.0865392e+00 3.3745138e+00 1.1066229e+00 4.8687213e+00 1.2337044e+00 1.6257475e+00 1.9617216e+00 2.6519650e+00 4.0167453e+00 1.9617216e+00 1.0839258e+01 4.1581419e+00 1.0575626e+01 6.9920515e+00 9.2566863e+00 1.3101048e+01 2.9099493e+00 1.0563781e+01 7.4128086e+00 1.4233625e+01 7.7558955e+00 6.0200046e+00 9.0319952e+00 3.8423451e+00 5.5269310e+00 8.7412701e+00 7.5823337e+00 1.6461339e+01 1.1799605e+01 4.4781854e+00 1.0885839e+01 3.6270377e+00 1.2304852e+01 4.6717100e+00 1.0214839e+01 1.0815138e+01 4.6086535e+00 5.2639976e+00 7.5892963e+00 9.0625672e+00 1.0217281e+01 1.5592401e+01 7.8203532e+00 4.7544555e+00 3.8130417e+00 1.2795880e+01 9.9979439e+00 7.6627591e+00 4.7593621e+00 9.3437728e+00 1.0106916e+01 9.0500809e+00 4.1581419e+00 1.1110759e+01 1.1211947e+01 8.5590231e+00 5.1362634e+00 7.4125964e+00 9.0148318e+00 5.2272844e+00 3.6635621e+00 8.5100616e+00 3.1053060e+00 2.0423450e+00 2.3191846e+00 1.4295913e+00 7.9576453e+00 2.8352192e+00 6.7648894e+00 3.9805707e+00 6.1635812e+00 3.7467898e+00 4.8137202e+00 8.4501856e+00 4.6423593e+00 7.3840372e+00 6.5499171e+00 1.0627590e+01 4.1643796e+00 4.4171363e+00 4.7702340e+00 4.7593621e+00 4.6853779e+00 4.9552846e+00 3.4243718e+00 1.2889146e+01 1.2219733e+01 3.0544195e+00 7.1418351e+00 3.8981003e+00 1.0093139e+01 2.9891849e+00 6.5476412e+00 7.0956265e+00 2.1654045e+00 1.1066229e+00 5.1504591e+00 4.7757000e+00 8.0160592e+00 1.2068320e+01 5.3684887e+00 2.3563262e+00 2.1367622e+00 8.2223223e+00 6.0946762e+00 3.8708609e+00 1.3720717e+00 5.5886371e+00 6.1959760e+00 5.3142770e+00 3.9805707e+00 7.3046204e+00 7.4604258e+00 4.3344158e+00 3.9419067e+00 3.3058286e+00 5.0482260e+00 2.2289625e+00 4.7544555e+00 1.4773595e+00 1.3720717e+00 1.6872569e+00 2.6621660e+00 4.0358289e+00 1.2337044e+00 1.0731380e+01 3.4914033e+00 1.0743375e+01 6.9748089e+00 9.2830997e+00 1.3247473e+01 4.6340475e+00 1.0697128e+01 7.4958116e+00 1.4401128e+01 7.9797417e+00 6.1195246e+00 9.2179933e+00 4.2338522e+00 4.7757000e+00 8.8567259e+00 7.6721766e+00 1.6621664e+01 1.1917268e+01 4.4326030e+00 1.1057700e+01 4.8372469e+00 1.2447613e+01 4.8711511e+00 1.0331421e+01 1.0983028e+01 4.8173209e+00 5.3568136e+00 7.6172947e+00 9.2564603e+00 1.0394614e+01 1.5818209e+01 7.8486892e+00 4.8687213e+00 3.6991548e+00 1.3031026e+01 9.9780480e+00 7.7149678e+00 4.8173209e+00 9.5847882e+00 1.0247395e+01 9.4013444e+00 3.4914033e+00 1.1215183e+01 1.1332939e+01 8.8124701e+00 5.2945068e+00 7.5926799e+00 8.9885033e+00 4.9892667e+00 5.3568136e+00 6.0136706e+00 6.1286762e+00 7.4525891e+00 1.6872569e+00 5.6533688e+00 1.5912358e+01 9.3078435e+00 1.5613028e+01 1.1946966e+01 1.4286494e+01 1.8120657e+01 4.7747038e+00 1.5568677e+01 1.1650325e+01 1.9294904e+01 1.2894358e+01 1.1173961e+01 1.4107087e+01 8.3116426e+00 1.0850987e+01 1.3889961e+01 1.2550248e+01 2.1431546e+01 1.7804307e+01 7.2623420e+00 1.5959137e+01 8.9373319e+00 1.7441782e+01 9.8620824e+00 1.5232744e+01 1.5773668e+01 9.7683049e+00 1.0360911e+01 1.2679961e+01 1.4045487e+01 1.5329656e+01 2.0595104e+01 1.2942279e+01 9.7160578e+00 9.1313685e+00 1.7909269e+01 1.5117310e+01 1.2621971e+01 9.9013396e+00 1.4445387e+01 1.5217436e+01 1.4318315e+01 9.3078435e+00 1.6142643e+01 1.6320694e+01 1.3765361e+01 9.5181950e+00 1.2505208e+01 1.4163342e+01 1.0263306e+01 9.8003160e-01 4.6533907e-01 1.6856955e+00 4.7186199e+00 6.2402515e-01 1.0425377e+01 3.3229722e+00 1.0123933e+01 6.4902132e+00 8.8068269e+00 1.2571137e+01 3.8655529e+00 9.9792902e+00 7.7826258e+00 1.3895951e+01 7.4800148e+00 5.1372892e+00 8.6384212e+00 4.0481603e+00 5.0094739e+00 8.4298870e+00 7.1475422e+00 1.6066582e+01 1.2846468e+01 4.5812846e+00 1.0527025e+01 2.8279507e+00 1.1601244e+01 3.9336133e+00 9.8493971e+00 1.0367219e+01 4.2514390e+00 4.9554007e+00 7.0369812e+00 8.5453647e+00 9.5798572e+00 1.5206685e+01 7.2715053e+00 4.2366348e+00 4.2599169e+00 1.2338865e+01 9.6515380e+00 7.2482464e+00 4.4781854e+00 9.0026607e+00 9.7393821e+00 8.7966827e+00 3.3229722e+00 1.0718243e+01 1.0872132e+01 8.2397491e+00 5.5583985e+00 7.0639373e+00 8.6882199e+00 4.8209436e+00 3.1748021e-01 1.7799212e+00 5.4390228e+00 8.1287374e-01 9.3143156e+00 4.5525602e+00 8.2122348e+00 6.0573816e+00 6.9506148e+00 1.0500502e+01 5.1701307e+00 9.5546914e+00 8.9373319e+00 1.2962475e+01 6.4807642e+00 6.8016399e+00 6.8337633e+00 4.3294698e+00 5.1909502e+00 7.3359569e+00 5.5002985e+00 1.5225743e+01 1.4456737e+01 5.3019073e+00 9.3780598e+00 4.0481603e+00 1.2283737e+01 5.4469544e+00 8.8502509e+00 9.3146268e+00 4.6435667e+00 3.4998179e+00 7.5021751e+00 6.8704994e+00 1.0217281e+01 1.4421898e+01 7.7321770e+00 4.7318657e+00 5.4260046e+00 1.0266309e+01 8.6622775e+00 6.1195246e+00 3.0635174e+00 7.7675255e+00 8.4189341e+00 7.5539762e+00 4.5525602e+00 9.5530270e+00 9.7933455e+00 6.4456142e+00 6.5123289e+00 5.3958239e+00 7.7303148e+00 3.3229722e+00 8.5602218e-01 5.5936833e+00 3.1748021e-01 9.4637314e+00 4.0269799e+00 8.9490242e+00 4.9776626e+00 7.6515889e+00 1.1311502e+01 4.6494650e+00 8.2468522e+00 8.3102660e+00 1.3038906e+01 6.6133493e+00 6.1812543e+00 7.5197072e+00 3.8895281e+00 4.6049489e+00 7.5069144e+00 6.0888630e+00 1.5239571e+01 1.3734749e+01 4.7544555e+00 9.5665447e+00 3.4905244e+00 1.1401891e+01 4.8653317e+00 8.9599040e+00 9.4312761e+00 4.0270868e+00 3.9941117e+00 6.7937221e+00 7.4554635e+00 9.3832654e+00 1.4405934e+01 7.0250013e+00 4.0269799e+00 4.7209485e+00 1.1092861e+01 8.7650002e+00 6.3038736e+00 3.5331986e+00 8.0169292e+00 8.7053308e+00 7.8203532e+00 4.0269799e+00 9.7429025e+00 9.9457745e+00 7.1351583e+00 5.9783697e+00 6.0104694e+00 7.8204925e+00 3.8075218e+00 6.9024609e+00 1.5319850e+00 7.3840372e+00 4.8173209e+00 7.6515889e+00 3.3931443e+00 6.0711225e+00 1.0070488e+01 5.2526616e+00 7.0735767e+00 6.8479112e+00 1.1573138e+01 5.0849769e+00 4.5973162e+00 6.1624464e+00 5.7340487e+00 5.4365488e+00 5.7837411e+00 4.6423593e+00 1.3867013e+01 1.2425622e+01 4.2311315e+00 8.1323077e+00 4.6992933e+00 1.0184124e+01 3.2484124e+00 7.4451947e+00 8.1461828e+00 2.1223670e+00 2.9099493e+00 5.1614633e+00 6.2826265e+00 8.1671508e+00 1.3102158e+01 5.3689177e+00 2.5602448e+00 3.6050008e+00 9.8680818e+00 6.7341196e+00 4.7186199e+00 3.0473381e+00 6.6675485e+00 7.2034478e+00 6.4593589e+00 4.8173209e+00 8.2511846e+00 8.3629110e+00 5.7278845e+00 4.2177392e+00 4.5525602e+00 5.2955450e+00 3.9243446e+00 5.1104864e+00 1.5344353e+01 8.5483468e+00 1.4961471e+01 1.1256830e+01 1.3644731e+01 1.7393772e+01 4.2788026e+00 1.4797422e+01 1.0028671e+01 1.8803396e+01 1.2404586e+01 1.0392944e+01 1.3504736e+01 6.9144842e+00 1.0181067e+01 1.3383253e+01 1.1920757e+01 2.0901158e+01 1.6639822e+01 8.1341859e+00 1.5410929e+01 8.2762826e+00 1.6574127e+01 9.1460168e+00 1.4694372e+01 1.5153230e+01 9.1508640e+00 9.8156685e+00 1.1950132e+01 1.3351797e+01 1.4523610e+01 2.0076236e+01 1.2215887e+01 9.0073254e+00 8.1102089e+00 1.7246680e+01 1.4614975e+01 1.2024452e+01 9.3702853e+00 1.3895562e+01 1.4651355e+01 1.3825961e+01 8.5483468e+00 1.5568180e+01 1.5802945e+01 1.3215856e+01 8.0913552e+00 1.1936277e+01 1.3678054e+01 9.6733608e+00 1.0000353e+01 3.8302687e+00 9.6711235e+00 5.9735162e+00 8.3353170e+00 1.2075640e+01 4.6494650e+00 9.4231344e+00 8.1461828e+00 1.3570522e+01 7.1641706e+00 5.9318980e+00 8.2147054e+00 3.8111198e+00 4.0367604e+00 8.0683594e+00 6.7291123e+00 1.5750938e+01 1.3427998e+01 4.7318657e+00 1.0157024e+01 3.0001051e+00 1.0490817e+01 4.6717100e+00 9.4992155e+00 1.0004045e+01 3.5174577e+00 4.5812846e+00 6.0934667e+00 8.1323081e+00 8.5606354e+00 1.4916443e+01 6.3149980e+00 3.4896634e+00 4.5573197e+00 1.1869144e+01 9.2791684e+00 6.8636946e+00 4.1050864e+00 8.6384212e+00 9.3342861e+00 8.4607890e+00 3.8302687e+00 1.0327509e+01 1.0507684e+01 7.8374802e+00 5.8851649e+00 6.6675485e+00 8.3244446e+00 4.3657187e+00 6.4867054e+00 3.6891643e+00 3.0736101e+00 2.4994860e+00 6.1337732e+00 1.1144508e+01 5.7961680e+00 5.0423229e+00 2.3636531e+00 3.8075218e+00 4.6992933e+00 4.2490451e+00 7.2058070e+00 4.6340475e+00 2.3988602e+00 4.1050864e+00 6.8636946e+00 7.5021751e+00 8.2397491e+00 2.7968417e+00 6.8972499e+00 7.5023122e+00 4.9231127e+00 2.2801540e+00 3.1675917e+00 5.6750675e+00 5.3407955e+00 3.3489040e+00 5.3776028e+00 5.2540895e+00 7.0300577e+00 3.1053060e+00 4.9113735e+00 5.6421314e+00 4.1279691e+00 1.1359060e+00 3.4410701e+00 5.8775612e+00 4.3917116e+00 2.6292664e+00 4.4109147e+00 6.4867054e+00 2.0600534e+00 1.1066229e+00 4.0602397e+00 4.9499198e+00 4.3044426e+00 2.2325586e+00 5.5914429e+00 5.9364635e+00 3.0473381e+00 4.8716867e+00 8.3180332e+00 4.4109147e+00 6.3199984e+00 4.2366348e+00 9.6565770e+00 2.4650524e+00 1.2020661e+00 4.4326030e+00 1.2337044e+00 8.5602218e-01 4.1643796e+00 3.5019091e+00 1.1547397e+01 8.9347500e+00 2.8352192e+00 6.3505662e+00 1.4773595e+00 7.3069737e+00 1.5319850e+00 5.5343499e+00 6.4967433e+00 2.1096674e+00 2.1958558e+00 3.2484124e+00 6.2480065e+00 4.8437569e+00 1.0253289e+01 3.5331986e+00 1.9394676e+00 3.3251194e+00 8.1933329e+00 5.5181395e+00 3.5575665e+00 2.1958558e+00 4.6119704e+00 5.6798768e+00 3.7581421e+00 0.0000000e+00 6.6316535e+00 6.7574575e+00 3.8708609e+00 1.5319850e+00 2.6519650e+00 4.4437762e+00 9.8003160e-01 3.4357364e+00 1.4281301e+00 1.8942271e+00 1.0355780e+01 2.4086604e+00 3.1053060e+00 3.0306837e+00 3.8423451e+00 4.3311388e+00 1.1066229e+00 6.4967433e+00 5.9364635e+00 4.0215873e+00 2.6602921e+00 5.3540554e+00 5.2153608e+00 8.4886514e+00 2.0158737e+00 5.9223493e+00 3.8423451e+00 5.7151381e+00 1.8435146e+00 1.6872569e+00 5.7756493e+00 4.5608957e+00 2.3592959e+00 1.2845725e+00 2.2524858e+00 5.1076797e+00 2.9784994e+00 5.7830949e+00 5.7961680e+00 1.9600632e+00 4.3709515e+00 3.5019091e+00 4.9265184e+00 1.5319850e+00 2.6621660e+00 2.8823731e+00 5.9364635e+00 1.4448053e+00 3.2291810e+00 2.5781299e+00 5.7420681e+00 2.6500939e+00 4.7791920e+00 4.5312399e+00 2.1654045e+00 5.9220896e+00 6.6291783e+00 2.6816465e+00 2.0423450e+00 6.9966872e+00 2.9320989e+00 1.6872569e+00 2.2986581e+00 4.3917116e+00 4.0270868e+00 2.8691226e+00 8.1287374e-01 9.2469191e+00 8.2207410e+00 4.6498043e+00 3.5331986e+00 3.8537088e+00 5.9465880e+00 1.3327229e+00 2.8915475e+00 3.1785432e+00 1.7044794e+00 1.8347096e+00 9.8003160e-01 3.0472425e+00 3.7807307e+00 8.1450284e+00 1.1359060e+00 1.7448317e+00 1.8435146e+00 5.5438919e+00 1.7432492e+00 8.1287374e-01 2.2149867e+00 3.1301555e+00 2.4068601e+00 4.4110256e+00 3.0473381e+00 3.9805707e+00 3.7572369e+00 3.3489040e+00 2.1079600e+00 2.1654045e+00 3.0473381e+00 1.9394676e+00 3.6784371e+00 9.3176113e+00 4.1913254e+00 2.2289625e+00 4.6498043e+00 2.1181110e+00 2.8691226e+00 1.3974652e+00 5.5288958e+00 4.2311315e+00 2.0600534e+00 1.1066229e+00 5.9961598e+00 6.2496912e+00 7.0086477e+00 1.8793802e+00 5.0394504e+00 5.6148351e+00 4.2489359e+00 1.6872569e+00 3.5700781e+00 4.4326030e+00 3.4243718e+00 1.4773595e+00 2.0611757e+00 3.9804643e+00 7.0038182e+00 1.0211725e+00 4.2311315e+00 4.3308090e+00 2.7939449e+00 2.4674089e+00 2.1096674e+00 3.8258056e+00 2.3191846e+00 1.7382670e+00 2.8810032e+00 4.8716867e+00 1.6872569e+00 2.1958558e+00 1.6856955e+00 4.3044426e+00 1.2020661e+00 2.8915475e+00 3.4998179e+00 1.2780108e+01 2.4404310e+00 6.0979962e+00 4.7593621e+00 6.1235030e+00 6.7775263e+00 3.0009324e+00 8.8771600e+00 8.3180332e+00 6.4059592e+00 4.9265184e+00 2.2535695e+00 2.4086604e+00 1.1204756e+01 4.6282302e+00 8.1550117e+00 1.2337044e+00 8.1320133e+00 4.1923956e+00 3.6635621e+00 8.1178626e+00 6.7185133e+00 4.5937822e+00 3.4753074e+00 2.6683108e+00 3.1541992e+00 5.3897438e+00 8.3104492e+00 8.6917104e+00 1.5319850e+00 7.0693321e+00 5.9355672e+00 7.0732704e+00 3.6487468e+00 5.1564125e+00 5.2828298e+00 8.3180332e+00 4.4328796e+00 6.0341601e+00 4.7383538e+00 8.2099586e+00 4.7091082e+00 7.3039397e+00 6.7185133e+00 9.8372429e+00 5.7106605e+00 1.4172694e+01 7.5179319e+00 5.9367235e+00 8.8775979e+00 3.2279902e+00 6.1286762e+00 8.8252363e+00 7.0823300e+00 1.6060264e+01 1.2415547e+01 4.8687213e+00 1.0823621e+01 4.1703514e+00 1.1953256e+01 4.4003002e+00 1.0038390e+01 1.0004972e+01 4.2808407e+00 4.9275407e+00 7.6762434e+00 8.9700652e+00 9.7662277e+00 1.4908944e+01 7.9901329e+00 5.6489372e+00 5.9355672e+00 1.2614355e+01 1.0199948e+01 7.1770752e+00 4.4688982e+00 9.1222102e+00 1.0184933e+01 8.9462386e+00 4.4109147e+00 1.1093587e+01 1.1317009e+01 8.5580850e+00 3.9041046e+00 7.2352369e+00 9.1886056e+00 5.0650088e+00 3.1033130e+00 3.8537088e+00 5.7511238e+00 4.8240043e+00 3.9243446e+00 7.8926017e+00 7.6058877e+00 6.5344826e+00 3.1763049e+00 5.1386230e+00 4.4781854e+00 8.5892782e+00 4.4781854e+00 7.0597153e+00 2.6292664e+00 4.9301049e+00 4.7121146e+00 1.3974652e+00 4.8704010e+00 4.8861987e+00 4.5525602e+00 2.0600534e+00 1.2337044e+00 4.0269799e+00 4.8355618e+00 5.7369312e+00 6.1904727e+00 2.8352192e+00 6.9602057e+00 3.7049365e+00 5.2259033e+00 4.2489359e+00 5.1070304e+00 5.3428933e+00 6.3199984e+00 4.2490451e+00 5.7506330e+00 5.2540895e+00 6.2359325e+00 4.8077583e+00 7.3778733e+00 4.8861987e+00 6.2803255e+00 4.2311315e+00 2.6076804e+00 2.8691226e+00 3.8789352e+00 6.1286762e+00 4.9554007e+00 2.0228388e+00 8.7966827e+00 6.1358900e+00 5.0849769e+00 3.4410701e+00 5.7756493e+00 5.5791936e+00 2.9058572e+00 2.2149867e+00 2.7825075e+00 3.5685848e+00 4.1082939e+00 2.7566600e+00 2.4220503e+00 3.2538196e+00 7.6984321e+00 2.9891849e+00 4.1703514e+00 3.0306837e+00 5.5793154e+00 5.0191949e+00 2.4386212e+00 4.5044742e+00 3.6635621e+00 2.7949304e+00 4.8653317e+00 4.2366348e+00 3.0944563e+00 3.0001051e+00 3.3230712e+00 2.4285106e+00 3.6016092e+00 5.6798768e+00 4.1296441e+00 6.3941596e+00 7.7789241e+00 4.9989720e+00 1.0302445e+01 7.4986778e+00 5.2585327e+00 6.5438251e+00 3.8981003e+00 5.9489580e+00 1.1806418e+01 3.2291810e+00 9.9780480e+00 6.0002165e+00 9.2552274e+00 4.0061263e+00 2.2705666e+00 9.4676327e+00 8.9223767e+00 6.1925287e+00 3.6102901e+00 3.1521938e+00 4.1050864e+00 5.8795750e+00 9.3080700e+00 9.1621991e+00 2.6058219e+00 3.8075218e+00 6.5123289e+00 9.3733417e+00 4.6968015e+00 3.8076263e+00 4.6853779e+00 9.6565770e+00 2.9547189e+00 2.4749599e+00 5.2846422e+00 9.2229505e+00 6.7397667e+00 4.8182075e+00 8.9065108e+00 2.0600534e+00 2.4086604e+00 3.0001051e+00 3.0736101e+00 1.2034300e+00 1.6257475e+00 8.2928541e+00 9.0920510e+00 4.8241191e+00 2.6602921e+00 2.9058572e+00 6.3043875e+00 2.6683108e+00 2.2325586e+00 3.5173564e+00 2.9891849e+00 2.4674089e+00 2.5152850e+00 4.8297594e+00 5.4536126e+00 6.6981735e+00 2.8352192e+00 2.2289625e+00 5.2639976e+00 6.1777141e+00 3.1702938e+00 1.8793802e+00 2.9320989e+00 2.1096674e+00 2.8352192e+00 1.5760969e+00 2.4650524e+00 2.7776085e+00 3.2484124e+00 1.9617216e+00 2.3988602e+00 4.6533907e-01 2.7566600e+00 1.9600632e+00 2.7232965e+00 2.9784994e+00 3.2484124e+00 1.4251229e+00 1.6872569e+00 9.8229796e+00 7.4054534e+00 4.0061263e+00 4.5244831e+00 3.0544195e+00 5.8858095e+00 1.1359060e+00 3.6635621e+00 4.8940042e+00 2.0600534e+00 2.6621660e+00 1.2034300e+00 4.6223377e+00 3.5147734e+00 8.6303275e+00 1.3974652e+00 1.8793802e+00 2.8691226e+00 6.6186038e+00 3.7323299e+00 1.3720717e+00 3.1053060e+00 2.8352192e+00 3.7440234e+00 3.7062982e+00 1.2020661e+00 4.7593621e+00 4.7121146e+00 2.6621660e+00 1.2034300e+00 1.4295913e+00 3.2181600e+00 2.6076804e+00 5.0095905e+00 4.4326030e+00 2.4674089e+00 9.5244063e-01 6.8774660e+00 6.6627032e+00 6.7515497e+00 1.7382670e+00 4.5546238e+00 5.1909502e+00 4.2038996e+00 1.2034300e+00 3.4523901e+00 4.3311388e+00 3.2517890e+00 1.3720717e+00 2.4749599e+00 3.8163221e+00 6.6741494e+00 1.8793802e+00 4.1643796e+00 4.4312523e+00 3.3229722e+00 3.1053060e+00 1.5760969e+00 3.6305664e+00 6.2402515e-01 1.4295913e+00 1.8793802e+00 4.4326030e+00 1.6257475e+00 2.4086604e+00 1.2034300e+00 4.1832879e+00 1.3974652e+00 3.0306837e+00 3.1785432e+00 2.1096674e+00 4.8716867e+00 4.8373619e+00 1.2002437e+01 8.9402159e+00 2.2597668e+00 7.0064874e+00 9.8003160e-01 7.5982669e+00 2.5381307e+00 6.0104694e+00 7.9285162e+00 2.9320989e+00 2.8352192e+00 3.9500734e+00 7.6386081e+00 6.8425758e+00 1.0075637e+01 4.3311388e+00 3.5331986e+00 4.0084646e+00 8.9307658e+00 6.1982358e+00 4.8653317e+00 2.9320989e+00 5.1704530e+00 6.4114821e+00 4.8796304e+00 1.2337044e+00 7.2796412e+00 7.4696139e+00 4.6853779e+00 9.7877528e-01 2.9535696e+00 5.1103864e+00 2.3563262e+00 3.0306837e+00 4.6086535e+00 1.0830572e+01 8.1628567e+00 4.0269799e+00 4.9892667e+00 1.6257475e+00 7.5849058e+00 3.2484124e+00 5.6291565e+00 7.9745353e+00 2.6602921e+00 3.1301555e+00 2.8671917e+00 7.2646741e+00 6.1901867e+00 1.1407174e+01 2.6058219e+00 2.1853375e+00 4.6853779e+00 6.5967908e+00 3.3230712e+00 4.7121146e+00 3.1301555e+00 4.6531330e+00 3.4003738e+00 2.6527524e+00 8.5602218e-01 5.2448399e+00 4.8711511e+00 2.7176097e+00 3.3251194e+00 3.2181600e+00 3.3078726e+00 1.6856955e+00 2.3563262e+00 7.6177698e+00 7.0661627e+00 6.0246159e+00 1.4251229e+00 4.6494650e+00 7.9032155e+00 3.5753219e+00 2.4086604e+00 4.1296441e+00 3.9419067e+00 3.4523901e+00 1.8435146e+00 5.3082513e+00 6.3405877e+00 8.2841458e+00 1.5760969e+00 3.3992897e+00 5.0617707e+00 4.3798232e+00 1.6872569e+00 1.5319850e+00 3.9419067e+00 2.0600534e+00 1.9081610e+00 1.5319850e+00 4.1643796e+00 1.5745775e+00 2.4086604e+00 1.2034300e+00 3.5019091e+00 1.6872569e+00 1.0211725e+00 3.3918985e+00 8.7834231e+00 8.3629110e+00 5.1701307e+00 3.1702938e+00 4.4109147e+00 6.2148356e+00 2.1941208e+00 2.4994860e+00 2.7825075e+00 2.3592959e+00 1.5745775e+00 1.6872569e+00 2.3592959e+00 4.0269799e+00 7.7551774e+00 1.8793802e+00 2.7232965e+00 3.1284501e+00 4.6400185e+00 3.0306837e+00 3.1748021e-01 1.8942271e+00 2.1096674e+00 2.2325586e+00 3.3489040e+00 3.5019091e+00 3.4523901e+00 3.3200257e+00 2.0228388e+00 3.0473381e+00 7.8728875e-01 3.1053060e+00 1.5745775e+00 2.5353443e+00 1.4053956e+01 5.7688708e+00 1.1655496e+01 1.7120444e+00 1.1293521e+01 5.9345720e+00 5.4970133e+00 1.1468910e+01 1.0935042e+01 7.9935862e+00 6.9822594e+00 5.2585929e+00 1.4448053e+00 7.0554151e+00 1.1622099e+01 1.1702653e+01 2.8179114e+00 7.0956265e+00 8.7339512e+00 1.1354861e+01 6.6039146e+00 7.1195810e+00 7.1637687e+00 1.1547397e+01 5.5645362e+00 6.7522371e+00 7.6926415e+00 1.1171494e+01 8.6387232e+00 7.2194469e+00 1.0935042e+01 1.1354861e+01 5.3205841e+00 9.8402254e+00 1.4448053e+00 8.6542022e+00 7.3281728e+00 6.2204001e+00 9.5666862e+00 1.0410485e+01 6.5993914e+00 6.6015141e+00 4.0602397e+00 5.0481626e+00 6.1465507e+00 9.6711235e+00 7.8201089e+00 1.8613563e+00 8.1455164e+00 8.9058988e+00 1.0814067e+01 6.9149178e+00 6.5250931e+00 6.0929497e+00 8.9347500e+00 5.1539713e+00 7.3281728e+00 6.0746460e+00 8.1520132e+00 8.2735707e+00 7.7842144e+00 1.0428490e+01 8.5375996e+00 3.7894174e+00 1.0698088e+01 2.8691226e+00 7.7238052e+00 8.4607890e+00 3.1301555e+00 2.8198290e+00 5.5133201e+00 6.6481617e+00 8.4391303e+00 1.3089555e+01 5.7506330e+00 1.9065209e+00 2.7017933e+00 1.0860130e+01 7.2259813e+00 5.1103864e+00 2.5196315e+00 6.9148591e+00 7.7664539e+00 6.2519011e+00 2.8352192e+00 8.8038983e+00 8.7459758e+00 6.0249287e+00 2.0720948e+00 4.8373619e+00 6.0613673e+00 2.8198290e+00 6.6186038e+00 6.0246159e+00 6.0002165e+00 1.0211725e+00 2.2597668e+00 6.1811463e+00 5.5288958e+00 2.8352192e+00 2.9784994e+00 4.2752754e+00 6.3409718e+00 2.5152850e+00 5.9783697e+00 5.5645362e+00 2.7441434e+00 2.2325586e+00 3.0473381e+00 5.9584541e+00 1.2034300e+00 1.2337044e+00 9.7877528e-01 6.3505662e+00 4.6533907e-01 1.0211725e+00 1.7965249e+00 5.9919295e+00 3.4523901e+00 2.3592959e+00 5.4848472e+00 6.1835272e+00 1.8347096e+00 5.7104821e+00 7.4720625e+00 1.6856955e+00 1.7965249e+00 3.0001051e+00 7.0299242e+00 5.5282008e+00 9.7610788e+00 3.3425881e+00 2.7825075e+00 4.8653317e+00 8.2328622e+00 5.9919295e+00 4.5347546e+00 2.1654045e+00 4.8126301e+00 5.9956136e+00 4.6740223e+00 1.4773595e+00 6.8704558e+00 7.1419695e+00 4.3343743e+00 2.6519650e+00 2.6760110e+00 4.9710453e+00 2.2524858e+00 7.2352947e+00 5.9345720e+00 4.3768242e+00 6.6829237e+00 8.1071344e+00 4.5454119e+00 4.7791920e+00 1.9065209e+00 2.8290794e+00 4.9478896e+00 6.9823858e+00 8.0735938e+00 2.1941208e+00 8.4391303e+00 6.7775263e+00 8.4801471e+00 5.5028041e+00 6.6672229e+00 6.8466363e+00 7.3069737e+00 5.8166664e+00 7.3867973e+00 6.7393663e+00 7.4457634e+00 5.4692147e+00 8.7221158e+00 8.1071344e+00 5.1495485e+00 5.0981644e+00 6.2402515e-01 7.8728875e-01 2.6519650e+00 5.3776028e+00 5.1606158e+00 1.0251256e+01 2.8810032e+00 1.2034300e+00 3.2181600e+00 8.0093869e+00 4.1559020e+00 2.1079600e+00 1.3974652e+00 4.4781854e+00 5.2272844e+00 4.1643796e+00 1.5319850e+00 6.1685222e+00 6.2233978e+00 3.7440234e+00 8.1287374e-01 2.4994860e+00 4.2367439e+00 1.8435146e+00 2.8691226e+00 5.3777228e+00 4.8592051e+00 1.7448317e+00 3.3251194e+00 4.3768242e+00 5.6750675e+00 2.2986581e+00 5.2639976e+00 4.9221043e+00 4.4326030e+00 2.1096674e+00 2.4994860e+00 5.2912108e+00 1.4448053e+00 1.2034300e+00 2.8591826e+00 5.5343499e+00 1.4773595e+00 4.0000000e-01 2.0228388e+00 5.0423229e+00 2.6076804e+00 2.6076804e+00 4.8592051e+00 5.2116439e+00 4.6002404e+00 4.6494650e+00 1.2480503e+00 1.8793802e+00 4.6086535e+00 4.9348177e+00 6.0341601e+00 6.0645671e+00 3.0473381e+00 5.0191949e+00 2.6281695e+00 4.9537770e+00 3.0655002e+00 3.7894174e+00 4.1105235e+00 6.4967433e+00 1.9394676e+00 3.7323299e+00 4.8373619e+00 6.2308018e+00 4.4328796e+00 5.4848472e+00 4.5742472e+00 8.1287374e-01 2.5196315e+00 5.4354021e+00 4.7200415e+00 1.0423570e+01 2.7441434e+00 1.3974652e+00 3.3992897e+00 8.0160592e+00 4.9095711e+00 2.3592959e+00 6.3496042e-01 4.6498043e+00 5.4176901e+00 4.4171363e+00 2.1096674e+00 6.3505662e+00 6.4693019e+00 3.9419067e+00 1.6872569e+00 2.7232965e+00 3.5311000e+00 1.6529143e+00 3.6072442e+00 4.2375845e+00 5.9585900e+00 9.8857106e+00 3.8655529e+00 2.2524858e+00 3.0736101e+00 6.5947965e+00 4.6086535e+00 1.9065209e+00 3.1748021e-01 3.9243446e+00 4.6992933e+00 3.6270377e+00 2.1958558e+00 5.7216753e+00 5.9098113e+00 2.8671917e+00 2.0600534e+00 1.8435146e+00 3.5753219e+00 6.3496042e-01 3.9956728e+00 3.2826324e+00 7.6926415e+00 1.0000000e-01 2.2968911e+00 2.3592959e+00 4.8899920e+00 1.9065209e+00 1.3974652e+00 4.0602397e+00 2.0228388e+00 1.8720754e+00 3.6815270e+00 3.2484124e+00 3.2291810e+00 3.1053060e+00 2.7232965e+00 2.7968417e+00 1.8793802e+00 2.8591826e+00 3.6815270e+00 2.4994860e+00 6.2233978e+00 4.2193347e+00 4.2366348e+00 4.2943668e+00 3.0506295e+00 5.4675208e+00 3.1541992e+00 4.5937822e+00 3.1053060e+00 3.6270377e+00 4.1581419e+00 6.2480065e+00 3.2181600e+00 4.1105235e+00 3.7301847e+00 6.0979962e+00 3.4998179e+00 6.1073660e+00 4.1790580e+00 4.2918044e+00 3.5685848e+00 5.0298754e+00 5.7985459e+00 1.8435146e+00 6.6418127e+00 4.5218499e+00 6.3310325e+00 4.1050864e+00 4.9554007e+00 5.3079540e+00 4.8437569e+00 3.9234433e+00 5.4970133e+00 5.2478713e+00 4.9265184e+00 4.6339344e+00 7.0798601e+00 5.9223493e+00 8.1871185e+00 1.0743098e+01 1.0713627e+01 3.7966977e+00 7.5175207e+00 7.6961748e+00 1.0294386e+01 6.4444910e+00 7.5926799e+00 7.9282244e+00 1.0253289e+01 6.0343926e+00 7.1032341e+00 8.4228025e+00 9.9585432e+00 6.9996358e+00 7.8298261e+00 9.8353927e+00 2.4650524e+00 2.5196315e+00 4.4894531e+00 1.6856955e+00 1.5760969e+00 4.3308090e+00 2.6076804e+00 1.6529143e+00 3.3251194e+00 3.5331986e+00 2.8915475e+00 2.8691226e+00 2.4086604e+00 3.0655002e+00 2.1654045e+00 2.5381307e+00 3.9419067e+00 2.3563262e+00 7.9882233e+00 4.1082939e+00 2.6621660e+00 2.7566600e+00 4.4320784e+00 5.1103864e+00 3.4336612e+00 1.9394676e+00 6.1925287e+00 6.1464320e+00 3.3992897e+00 1.5760969e+00 2.3563262e+00 4.1464270e+00 1.8435146e+00 8.0734737e+00 3.8789352e+00 3.1053060e+00 3.9497555e+00 5.3082513e+00 4.2895360e+00 6.7078961e+00 3.3251194e+00 6.1286762e+00 5.7403681e+00 5.6585047e+00 3.2484124e+00 4.5049716e+00 4.4384864e+00 3.7062982e+00 5.2732313e+00 5.6203110e+00 6.9674995e+00 4.0481603e+00 3.6152368e+00 3.5147734e+00 8.1933329e+00 2.4219631e+00 4.4326030e+00 3.0143899e+00 8.1429057e+00 4.7282906e+00 5.1061660e+00 6.5292945e+00 2.4787096e+00 5.1495485e+00 3.4108543e+00 1.1066229e+00 3.5331986e+00 5.5181395e+00 2.6076804e+00 1.6097959e+00 3.1284501e+00 4.1082939e+00 3.4765339e+00 8.1287374e-01 4.7593621e+00 2.2705666e+00 1.7448317e+00 1.9065209e+00 2.9059510e+00 3.5575665e+00 3.3489040e+00 3.3200257e+00 2.8691226e+00 2.9099493e+00 1.6872569e+00 2.6076804e+00 1.9394676e+00 4.3366937e+00 5.1362634e+00 4.1105235e+00 2.1958558e+00 6.1504691e+00 6.3761207e+00 3.2925417e+00 2.6076804e+00 2.2289625e+00 4.1643796e+00 6.0103306e-01 1.4448053e+00 7.8728875e-01 4.6119704e+00 2.0600534e+00 2.7232965e+00 1.7382670e+00 4.3917116e+00 1.8793802e+00 2.3592959e+00 3.7846788e+00 1.5319850e+00 5.6798768e+00 1.4295913e+00 8.1287374e-01 1.1359060e+00 5.2639976e+00 2.6292664e+00 2.6076804e+00 4.6717100e+00 3.7581421e+00 1.7044794e+00 2.8591826e+00 8.1287374e-01 4.0084646e+00 2.1096674e+00 2.6107730e+00 2.9427005e+00 6.6316535e+00 6.7574575e+00 3.8708609e+00 1.5319850e+00 2.6519650e+00 4.4437762e+00 9.8003160e-01 1.4773595e+00 1.8347096e+00 6.1811463e+00 3.6072442e+00 2.6058219e+00 5.7420681e+00 2.0228388e+00 6.2233978e+00 3.6815270e+00 2.6076804e+00 5.9098113e+00 3.7062982e+00 7.8728875e-01 2.2289625e+00 2.6281695e+00 2.3563262e+00 4.1364091e+00 2.5152850e+00 2.9891849e+00 1.6856955e+00 3.7440234e+00 Deleted: trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/pdist-minkowski-0.6-ml.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -1 +0,0 @@ - 6.1585489e+02 6.2321817e+02 5.8818412e+02 6.7863863e+02 6.0771510e+02 6.9131089e+02 6.2439260e+02 7.1004702e+02 6.4565616e+02 6.5614478e+02 6.1511455e+02 6.2860242e+02 6.4943432e+02 7.1272806e+02 6.5685389e+02 6.2442150e+02 6.6505781e+02 6.6563043e+02 6.5960729e+02 6.8610088e+02 5.7808638e+02 6.1778875e+02 6.3862183e+02 6.2928553e+02 6.1812973e+02 5.9637134e+02 6.2055904e+02 6.2265891e+02 4.9440236e+02 6.4015022e+02 6.2838510e+02 6.5307398e+02 5.3986370e+02 6.4941961e+02 6.0463616e+02 6.3148720e+02 6.0308734e+02 6.0506766e+02 6.2190656e+02 6.5950715e+02 6.2248928e+02 6.2725172e+02 6.4807454e+02 5.7578035e+02 8.3827038e+02 7.1063040e+02 5.4478600e+02 6.7440334e+02 7.3220343e+02 6.1389081e+02 6.3014002e+02 6.5931791e+02 7.8153691e+02 6.8695874e+02 5.1250688e+02 7.0378289e+02 5.6254491e+02 6.4842853e+02 6.9060029e+02 6.0045029e+02 6.2365908e+02 4.6473547e+02 5.7836117e+02 6.6987139e+02 6.3212657e+02 5.5707081e+02 6.4115762e+02 6.5663457e+02 6.6269023e+02 6.8210531e+02 6.1382960e+02 6.3382190e+02 5.9540062e+02 5.5933269e+02 6.4209430e+02 5.2358429e+02 5.7886008e+02 5.8103514e+02 5.7774802e+02 5.9722361e+02 5.4489073e+02 6.3528629e+02 6.4604143e+02 6.5393880e+02 7.0267325e+02 7.1504213e+02 6.5799742e+02 7.4683271e+02 6.0347074e+02 6.5778541e+02 6.6513775e+02 6.8814952e+02 7.0301623e+02 6.2527972e+02 6.8267156e+02 5.4010932e+02 7.0611774e+02 5.6459584e+02 6.3041182e+02 6.3605235e+02 6.7600054e+02 5.4577351e+02 7.0929347e+02 5.9178309e+02 6.1850390e+02 6.4481363e+02 6.3110933e+02 5.5940455e+02 5.6734092e+02 6.5381272e+02 7.1624576e+02 6.3193705e+02 6.6240603e+02 6.5731415e+02 6.5015656e+02 5.9508845e+02 6.6741407e+02 6.8757498e+02 6.6762533e+02 6.5036333e+02 6.6798992e+02 5.7082376e+02 6.2171263e+02 5.8471396e+02 6.3814192e+02 6.1738265e+02 5.8671693e+02 5.8080905e+02 6.1314083e+02 5.9496681e+02 5.7419618e+02 5.6938212e+02 5.9554798e+02 6.8401851e+02 6.6784590e+02 6.3260832e+02 6.5948824e+02 5.8215353e+02 6.5090954e+02 5.6125819e+02 6.0728529e+02 6.3023598e+02 6.0123106e+02 5.3359706e+02 5.8579452e+02 5.9743445e+02 6.8559330e+02 6.1808386e+02 5.4070268e+02 6.6481624e+02 6.8773735e+02 6.3323647e+02 5.8871137e+02 6.6999350e+02 6.7738537e+02 5.5644352e+02 6.6779435e+02 5.1484535e+02 6.5022821e+02 5.3865596e+02 6.3170314e+02 6.1494903e+02 6.2657009e+02 6.2255510e+02 5.9046375e+02 6.2911230e+02 5.8085299e+02 7.3934668e+02 5.8435174e+02 6.7690574e+02 5.5336944e+02 6.7962701e+02 5.8526484e+02 6.1967171e+02 6.3942520e+02 6.5540238e+02 7.0212254e+02 6.5926444e+02 6.1750355e+02 7.0941803e+02 6.9104083e+02 6.2177029e+02 6.0252775e+02 5.6810664e+02 6.4965351e+02 6.8120808e+02 7.2772619e+02 6.3309152e+02 5.8067697e+02 5.2359879e+02 Deleted: trunk/scipy/cluster/tests/pdist-minkowski-0.8-ml-iris.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-0.8-ml-iris.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/pdist-minkowski-0.8-ml-iris.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -1 +0,0 @@ - 5.5129254e-01 5.3331654e-01 6.7676105e-01 1.4697345e-01 6.6234335e-01 5.2994606e-01 1.8410575e-01 9.5758668e-01 4.9210778e-01 3.9226391e-01 3.9226391e-01 6.1555822e-01 1.0472948e+00 9.2471857e-01 1.1554378e+00 5.8223100e-01 1.0000000e-01 7.8283081e-01 3.4362433e-01 4.5762068e-01 3.1669465e-01 6.7676105e-01 4.9711212e-01 6.1555822e-01 5.6532807e-01 3.3820388e-01 1.4697345e-01 1.4697345e-01 5.6852959e-01 5.6852959e-01 4.1053944e-01 6.3875221e-01 8.3216069e-01 4.9210778e-01 3.9226391e-01 4.1800334e-01 4.9210778e-01 9.0121124e-01 1.4697345e-01 1.8410575e-01 1.3942248e+00 7.9157919e-01 4.7637957e-01 6.4713428e-01 6.1555822e-01 3.7328014e-01 6.0246555e-01 3.1669465e-01 2.3011223e-01 4.2028240e+00 3.7864855e+00 4.3687291e+00 3.2516340e+00 3.9910490e+00 3.5488716e+00 3.9497402e+00 2.4686636e+00 3.9353547e+00 3.0120410e+00 2.8437807e+00 3.3771153e+00 3.3228842e+00 3.8583830e+00 2.7076091e+00 3.8151170e+00 3.5621318e+00 3.1396480e+00 3.9876247e+00 3.0214409e+00 4.0070659e+00 3.2398535e+00 4.2505660e+00 3.8089106e+00 3.5911117e+00 3.7844533e+00 4.2569996e+00 4.4554428e+00 3.6912889e+00 2.6290857e+00 2.9574795e+00 2.8353827e+00 3.0399789e+00 4.3095815e+00 3.5272753e+00 3.6610865e+00 4.1046817e+00 3.8252109e+00 3.1166359e+00 3.1667287e+00 3.4402623e+00 3.7489248e+00 3.1610131e+00 2.5120231e+00 3.2888007e+00 3.1895102e+00 3.2545924e+00 3.5071271e+00 2.2069874e+00 3.1943137e+00 5.5007833e+00 4.3893707e+00 5.5598539e+00 4.8818802e+00 5.2815006e+00 6.3815794e+00 3.7496174e+00 5.8902292e+00 5.2901263e+00 5.9130990e+00 4.5624277e+00 4.7397536e+00 5.0941293e+00 4.3855941e+00 4.6213063e+00 4.8425645e+00 4.8459103e+00 6.5306910e+00 6.8250035e+00 4.3437366e+00 5.3706477e+00 4.1982887e+00 6.5071546e+00 4.3192392e+00 5.1891851e+00 5.5467589e+00 4.1744139e+00 4.1847734e+00 5.0647032e+00 5.3282372e+00 5.8196826e+00 6.3036270e+00 5.1111321e+00 4.3421792e+00 4.7392931e+00 6.0954634e+00 5.0999989e+00 4.7947913e+00 4.0672273e+00 5.0388436e+00 5.2665596e+00 4.8907043e+00 4.3893707e+00 5.4991600e+00 5.3803089e+00 4.9005057e+00 4.5048536e+00 4.6752767e+00 4.8465083e+00 4.3022912e+00 3.1669465e-01 3.4362433e-01 6.1313486e-01 1.1490418e+00 5.3331654e-01 4.3540658e-01 5.1514715e-01 1.8410575e-01 9.0121124e-01 4.7637957e-01 1.4697345e-01 7.0210005e-01 1.4210936e+00 1.6904140e+00 1.0991292e+00 5.6532807e-01 1.2380901e+00 8.5613620e-01 7.4863144e-01 7.8881249e-01 8.2375853e-01 5.9997944e-01 6.7676105e-01 2.3011223e-01 5.2951637e-01 6.1555822e-01 5.1859441e-01 3.6821151e-01 2.5735380e-01 7.1767732e-01 1.1733140e+00 1.3806734e+00 1.8410575e-01 3.1669465e-01 8.2138146e-01 1.8410575e-01 5.1514715e-01 4.7637957e-01 5.4442148e-01 8.5236302e-01 5.6532807e-01 7.1767732e-01 1.0365569e+00 1.4697345e-01 8.7081316e-01 3.7328014e-01 8.4231031e-01 3.2240315e-01 4.3018495e+00 3.8646985e+00 4.4408734e+00 3.1072453e+00 3.9959738e+00 3.5082379e+00 4.0420572e+00 2.2320748e+00 3.9615374e+00 2.9056643e+00 2.5747645e+00 3.3862579e+00 3.1989053e+00 3.8594320e+00 2.6714011e+00 3.8857792e+00 3.5524459e+00 3.0828043e+00 3.8915406e+00 2.9111534e+00 4.0565041e+00 3.2218947e+00 4.2034289e+00 3.7931414e+00 3.6087096e+00 3.8296571e+00 4.2752830e+00 4.4995094e+00 3.6867975e+00 2.5342418e+00 2.8191041e+00 2.6920389e+00 2.9816234e+00 4.2758422e+00 3.5040082e+00 3.7653861e+00 4.1713871e+00 3.7451085e+00 3.1058542e+00 3.0532495e+00 3.3507292e+00 3.7684299e+00 3.0864016e+00 2.2736616e+00 3.2205784e+00 3.1858426e+00 3.2302278e+00 3.5139583e+00 2.0056520e+00 3.1500673e+00 5.5719036e+00 4.3460372e+00 5.6110006e+00 4.8914252e+00 5.3123455e+00 6.4426373e+00 3.5989696e+00 5.9328717e+00 5.2662710e+00 6.0537639e+00 4.6343194e+00 4.7263671e+00 5.1376155e+00 4.3097575e+00 4.5934789e+00 4.9069922e+00 4.8789411e+00 6.6963510e+00 6.8443180e+00 4.2442590e+00 5.4486992e+00 4.1572272e+00 6.5475102e+00 4.3001266e+00 5.2792843e+00 5.6332870e+00 4.1647367e+00 4.2026423e+00 5.0647174e+00 5.3847112e+00 5.8541071e+00 6.4797765e+00 5.1111462e+00 4.3375374e+00 4.6996962e+00 6.1618577e+00 5.1929274e+00 4.8413460e+00 4.0803625e+00 5.1032995e+00 5.3213333e+00 4.9566991e+00 4.3460372e+00 5.5721877e+00 5.4678761e+00 4.9413657e+00 4.4598774e+00 4.7092623e+00 4.9389747e+00 4.3098267e+00 2.5735380e-01 5.3331654e-01 1.1568326e+00 2.8246002e-01 4.3649025e-01 4.5762068e-01 3.3820388e-01 9.2471857e-01 3.9226391e-01 2.8246002e-01 5.2951637e-01 1.4167992e+00 1.6632727e+00 1.0584452e+00 5.4772047e-01 1.3014160e+00 7.9516176e-01 8.6709114e-01 7.4573804e-01 5.3331654e-01 6.9144557e-01 6.5721874e-01 4.9711212e-01 5.4862269e-01 6.4713428e-01 5.6532807e-01 3.0000000e-01 3.4362433e-01 8.1489157e-01 1.0991292e+00 1.3362791e+00 3.3820388e-01 3.2240315e-01 8.7336999e-01 3.3820388e-01 3.7328014e-01 5.1470760e-01 4.5762068e-01 9.4214918e-01 3.0000000e-01 7.0696256e-01 1.0246555e+00 2.8246002e-01 8.2375853e-01 1.4697345e-01 8.4665275e-01 3.4362433e-01 4.4879194e+00 4.0349800e+00 4.6310750e+00 3.3177939e+00 4.2025427e+00 3.6913835e+00 4.1982534e+00 2.4112831e+00 4.1672463e+00 3.0736068e+00 2.7816980e+00 3.5626027e+00 3.4413623e+00 4.0474118e+00 2.8547253e+00 4.0772328e+00 3.7121907e+00 3.2888007e+00 4.1208303e+00 3.1226067e+00 4.2026423e+00 3.4287266e+00 4.4162883e+00 3.9906761e+00 3.8131615e+00 4.0286737e+00 4.4880060e+00 4.6904093e+00 3.8720229e+00 2.7560637e+00 3.0331770e+00 2.9107597e+00 3.1876597e+00 4.4648991e+00 3.6532540e+00 3.9038047e+00 4.3585517e+00 3.9784960e+00 3.2729208e+00 3.2532226e+00 3.5399536e+00 3.9497402e+00 3.2969398e+00 2.4704208e+00 3.4100653e+00 3.3584501e+00 3.4100818e+00 3.7122636e+00 2.2031803e+00 3.3390340e+00 5.7131258e+00 4.5233540e+00 5.7987551e+00 5.0712227e+00 5.4853201e+00 6.6348309e+00 3.7451693e+00 6.1301278e+00 5.4740242e+00 6.2028904e+00 4.7971164e+00 4.9215426e+00 5.3215846e+00 4.4925998e+00 4.7576771e+00 5.0621014e+00 5.0588177e+00 6.8481067e+00 7.0516198e+00 4.4591549e+00 5.6155451e+00 4.3206313e+00 6.7512342e+00 4.4982459e+00 5.4368723e+00 5.8102090e+00 4.3551876e+00 4.3751269e+00 5.2492783e+00 5.5804709e+00 6.0588419e+00 6.6373472e+00 5.2944068e+00 4.5321122e+00 4.8935720e+00 6.3571870e+00 5.3303386e+00 5.0098792e+00 4.2500552e+00 5.2821996e+00 5.4904646e+00 5.1347493e+00 4.5233540e+00 5.7356537e+00 5.6212098e+00 5.1222594e+00 4.6650926e+00 4.8890240e+00 5.0745406e+00 4.4734057e+00 6.7676105e-01 1.2287078e+00 3.4362433e-01 5.1859441e-01 3.1669465e-01 3.2240315e-01 1.0371888e+00 3.9226391e-01 2.8246002e-01 5.4772047e-01 1.5999496e+00 1.7879216e+00 1.2287078e+00 6.8870991e-01 1.3794976e+00 9.0121124e-01 9.0702094e-01 8.4665275e-01 7.3486725e-01 6.8946124e-01 5.6852959e-01 4.3540658e-01 5.8223100e-01 7.4656027e-01 7.0210005e-01 1.8410575e-01 2.3011223e-01 9.0702094e-01 1.2124972e+00 1.4820439e+00 3.2240315e-01 5.3331654e-01 1.0407910e+00 3.2240315e-01 3.1669465e-01 6.0246555e-01 6.4597730e-01 8.5613620e-01 3.1669465e-01 7.4760192e-01 1.0333206e+00 2.8246002e-01 9.0121124e-01 1.4697345e-01 9.5758668e-01 4.7637957e-01 4.3929745e+00 3.9259708e+00 4.5237694e+00 3.1498255e+00 4.0784447e+00 3.5362396e+00 4.0864085e+00 2.2167088e+00 4.0479205e+00 2.9040685e+00 2.5861730e+00 3.4310660e+00 3.2904904e+00 3.9088718e+00 2.7169193e+00 3.9745602e+00 3.5625847e+00 3.1380135e+00 3.9742989e+00 2.9620013e+00 4.0729291e+00 3.3006542e+00 4.2722625e+00 3.8470411e+00 3.6933262e+00 3.9182809e+00 4.3690994e+00 4.5726069e+00 3.7345514e+00 2.6107570e+00 2.8671432e+00 2.7448756e+00 3.0437521e+00 4.3132148e+00 3.4955727e+00 3.7900121e+00 4.2493482e+00 3.8372865e+00 3.1275795e+00 3.0893478e+00 3.3709167e+00 3.8165133e+00 3.1480500e+00 2.2808133e+00 3.2525176e+00 3.2142058e+00 3.2633507e+00 3.5845404e+00 2.0334992e+00 3.1908411e+00 5.5862784e+00 4.3685852e+00 5.6793306e+00 4.9293674e+00 5.3526918e+00 6.5168932e+00 3.5562497e+00 6.0053194e+00 5.3320097e+00 6.1034287e+00 4.6827153e+00 4.7829230e+00 5.2008422e+00 4.3327616e+00 4.6120520e+00 4.9438180e+00 4.9271399e+00 6.7521994e+00 6.9249248e+00 4.2977101e+00 5.5034300e+00 4.1658074e+00 6.6291493e+00 4.3619477e+00 5.3215846e+00 5.6973190e+00 4.2199033e+00 4.2408005e+00 5.1105659e+00 5.4620158e+00 5.9375871e+00 6.5495040e+00 5.1566638e+00 4.3920170e+00 4.7349236e+00 6.2499851e+00 5.2117777e+00 4.8788195e+00 4.1140985e+00 5.1693208e+00 5.3712293e+00 5.0293089e+00 4.3685852e+00 5.6177589e+00 5.5090131e+00 5.0058492e+00 4.5237076e+00 4.7640788e+00 4.9558030e+00 4.3291877e+00 6.6234335e-01 4.7637957e-01 2.3011223e-01 9.5758668e-01 5.4442148e-01 4.3540658e-01 3.6821151e-01 6.5721874e-01 1.0303583e+00 9.5275914e-01 1.1402466e+00 5.8223100e-01 1.8410575e-01 8.2787992e-01 2.8246002e-01 5.6852959e-01 2.8246002e-01 5.8789380e-01 5.6633242e-01 5.9902047e-01 6.4480630e-01 3.6821151e-01 2.5735380e-01 2.9394690e-01 5.6852959e-01 5.9902047e-01 5.2951637e-01 5.7909019e-01 8.1102313e-01 5.4442148e-01 4.6022445e-01 5.2994606e-01 5.4442148e-01 8.9153488e-01 2.5735380e-01 1.8410575e-01 1.4378083e+00 7.5761919e-01 4.7637957e-01 6.1217218e-01 6.5721874e-01 3.1669465e-01 5.8789380e-01 3.4362433e-01 3.0000000e-01 4.2701746e+00 3.8448194e+00 4.4348385e+00 3.3181771e+00 4.0612898e+00 3.6030912e+00 4.0002964e+00 2.5120231e+00 4.0059759e+00 3.0571591e+00 2.9010411e+00 3.4333127e+00 3.4073937e+00 3.9173759e+00 2.7669527e+00 3.8838444e+00 3.6067680e+00 3.2060472e+00 4.0660304e+00 3.0893478e+00 4.0500196e+00 3.3108456e+00 4.3203420e+00 3.8714186e+00 3.6617456e+00 3.8542691e+00 4.3305281e+00 4.5190053e+00 3.7495993e+00 2.7051863e+00 3.0259796e+00 2.9061820e+00 3.1080803e+00 4.3663948e+00 3.5654593e+00 3.7026198e+00 4.1695590e+00 3.9062613e+00 3.1662406e+00 3.2285788e+00 3.4952683e+00 3.8062303e+00 3.2302595e+00 2.5645822e+00 3.3461837e+00 3.2416801e+00 3.3093425e+00 3.5735644e+00 2.2662198e+00 3.2532226e+00 5.5396592e+00 4.4403493e+00 5.6203137e+00 4.9351954e+00 5.3332188e+00 6.4434134e+00 3.7780578e+00 5.9534097e+00 5.3565914e+00 5.9553671e+00 4.6149682e+00 4.8013343e+00 5.1532396e+00 4.4389082e+00 4.6678083e+00 4.8905817e+00 4.9012792e+00 6.5718423e+00 6.8923004e+00 4.4122047e+00 5.4243086e+00 4.2429735e+00 6.5733781e+00 4.3831823e+00 5.2378148e+00 5.6043298e+00 4.2350355e+00 4.2373092e+00 5.1208712e+00 5.3925609e+00 5.8871913e+00 6.3489329e+00 5.1668956e+00 4.4032999e+00 4.7966056e+00 6.1611307e+00 5.1382880e+00 4.8459103e+00 4.1183822e+00 5.0979005e+00 5.3198288e+00 4.9511726e+00 4.4403493e+00 5.5500186e+00 5.4275627e+00 4.9594589e+00 4.5715033e+00 4.7322393e+00 4.8842112e+00 4.3487002e+00 1.0472948e+00 7.4573804e-01 1.5377576e+00 1.0681908e+00 3.6821151e-01 8.5666462e-01 1.2316183e+00 1.6739009e+00 7.1767732e-01 6.4713428e-01 4.0000000e-01 6.3137460e-01 3.4362433e-01 4.1053944e-01 5.5129254e-01 4.3649025e-01 1.1887682e+00 7.0210005e-01 8.8112111e-01 1.0492910e+00 6.7676105e-01 5.6492004e-01 6.8946124e-01 1.0668324e+00 1.0749691e+00 5.5129254e-01 4.9309055e-01 5.1232775e-01 1.0681908e+00 1.0333206e+00 6.4597730e-01 1.0681908e+00 1.4999501e+00 6.8946124e-01 7.4760192e-01 1.9625130e+00 1.3748432e+00 6.4597730e-01 3.9226391e-01 1.1845013e+00 4.1053944e-01 1.1887682e+00 3.8739477e-01 8.5896323e-01 3.8047541e+00 3.4091818e+00 3.9853220e+00 3.0972501e+00 3.6648193e+00 3.2856635e+00 3.5615701e+00 2.4698277e+00 3.5963432e+00 2.8476035e+00 2.8641876e+00 3.0641292e+00 3.1470860e+00 3.5438016e+00 2.4608040e+00 3.4413623e+00 3.2729208e+00 2.9040685e+00 3.7578040e+00 2.8404378e+00 3.6552417e+00 2.9522257e+00 3.9698106e+00 3.5147046e+00 3.2644787e+00 3.4295372e+00 3.9182889e+00 4.0882034e+00 3.3825438e+00 2.4445294e+00 2.8091867e+00 2.6987222e+00 2.8006819e+00 4.0183198e+00 3.2610286e+00 3.2739414e+00 3.7284933e+00 3.5861062e+00 2.8396511e+00 2.9836164e+00 3.2328634e+00 3.4208587e+00 2.9345087e+00 2.5128099e+00 3.0571591e+00 2.9041299e+00 2.9816234e+00 3.1925203e+00 2.1830588e+00 2.9393097e+00 5.1094076e+00 4.1051726e+00 5.1730773e+00 4.5425185e+00 4.9154789e+00 5.9833939e+00 3.6145623e+00 5.5129365e+00 4.9732434e+00 5.4546061e+00 4.1744139e+00 4.4167995e+00 4.7169338e+00 4.1317459e+00 4.3173101e+00 4.4569699e+00 4.4856084e+00 6.0444513e+00 6.4558021e+00 4.1152226e+00 4.9665375e+00 3.9189969e+00 6.1258069e+00 4.0067854e+00 4.7827510e+00 5.1411960e+00 3.8562642e+00 3.8464128e+00 4.7260314e+00 4.9466809e+00 5.4470371e+00 5.8123634e+00 4.7710275e+00 4.0230574e+00 4.4541200e+00 5.6912565e+00 4.6955562e+00 4.4275870e+00 3.7357951e+00 4.6468174e+00 4.8794221e+00 4.4966609e+00 4.1051726e+00 5.0993308e+00 4.9708688e+00 4.5252362e+00 4.2127500e+00 4.3117812e+00 4.4464160e+00 3.9763791e+00 4.3540658e-01 5.6532807e-01 5.1232775e-01 8.9282147e-01 3.1669465e-01 5.1470760e-01 6.6234335e-01 1.4108983e+00 1.5570173e+00 9.9336112e-01 5.1514715e-01 1.2497843e+00 6.7676105e-01 8.8313857e-01 6.2843180e-01 4.7637957e-01 6.5951158e-01 5.6532807e-01 6.4597730e-01 4.7637957e-01 6.3875221e-01 6.1313486e-01 3.3820388e-01 4.5332153e-01 8.2083495e-01 9.9777193e-01 1.2583461e+00 5.1232775e-01 5.2951637e-01 9.2838064e-01 5.1232775e-01 4.9210778e-01 5.2994606e-01 4.3540658e-01 1.1162215e+00 3.3820388e-01 5.8223100e-01 8.7254337e-01 4.6022445e-01 7.1767732e-01 2.3011223e-01 8.0213820e-01 4.3540658e-01 4.4437820e+00 3.9747309e+00 4.5872053e+00 3.3046341e+00 4.1713880e+00 3.6434140e+00 4.1212347e+00 2.3947580e+00 4.1370941e+00 3.0209096e+00 2.7931100e+00 3.5061384e+00 3.4582316e+00 4.0000246e+00 2.8097732e+00 4.0369647e+00 3.6423751e+00 3.2658094e+00 4.1169124e+00 3.1080803e+00 4.1191867e+00 3.4015173e+00 4.3922906e+00 3.9543009e+00 3.7824955e+00 3.9927516e+00 4.4633086e+00 4.6429790e+00 3.8220331e+00 2.7517653e+00 3.0245125e+00 2.9082305e+00 3.1627405e+00 4.4178515e+00 3.5765598e+00 3.8083283e+00 4.3120954e+00 3.9788993e+00 3.2118425e+00 3.2270596e+00 3.5027202e+00 3.8968551e+00 3.2768892e+00 2.4670488e+00 3.3700251e+00 3.3022916e+00 3.3591012e+00 3.6758204e+00 2.1940945e+00 3.2969398e+00 5.6172414e+00 4.4654979e+00 5.7449465e+00 5.0122889e+00 5.4180971e+00 6.5847967e+00 3.6804524e+00 6.0860493e+00 5.4412716e+00 6.1085454e+00 4.7253431e+00 4.8766364e+00 5.2648479e+00 4.4421749e+00 4.6866770e+00 4.9822053e+00 4.9999023e+00 6.7566712e+00 7.0143962e+00 4.4414845e+00 5.5448293e+00 4.2515592e+00 6.7120284e+00 4.4574225e+00 5.3563494e+00 5.7507915e+00 4.3073449e+00 4.3112532e+00 5.1931494e+00 5.5374502e+00 6.0214274e+00 6.5533800e+00 5.2367937e+00 4.4891402e+00 4.8526862e+00 6.3103065e+00 5.2288692e+00 4.9425912e+00 4.1842626e+00 5.2228750e+00 5.4209045e+00 5.0752185e+00 4.4654979e+00 5.6614671e+00 5.5357834e+00 5.0630054e+00 4.6315995e+00 4.8295124e+00 4.9721541e+00 4.4022996e+00 8.2138146e-01 3.4362433e-01 5.1859441e-01 2.3011223e-01 4.9210778e-01 9.5844041e-01 1.0975698e+00 1.2899766e+00 7.4573804e-01 2.1601195e-01 8.7691570e-01 4.3540658e-01 4.6022445e-01 3.9226391e-01 7.0612170e-01 4.1053944e-01 4.6022445e-01 4.1800334e-01 2.3011223e-01 2.3011223e-01 2.3011223e-01 3.9226391e-01 3.9226391e-01 4.6022445e-01 7.5101750e-01 9.8447732e-01 3.4362433e-01 3.7328014e-01 5.6532807e-01 3.4362433e-01 7.8452781e-01 1.0000000e-01 2.5735380e-01 1.2735542e+00 6.8724866e-01 4.3540658e-01 6.4597730e-01 4.9210778e-01 4.3540658e-01 4.7637957e-01 4.4092035e-01 1.4697345e-01 4.1649287e+00 3.7345514e+00 4.3227672e+00 3.1449122e+00 3.9289863e+00 3.4593815e+00 3.8964477e+00 2.3248419e+00 3.8780758e+00 2.9018224e+00 2.7018182e+00 3.3048811e+00 3.2319572e+00 3.7849110e+00 2.6234069e+00 3.7698540e+00 3.4763102e+00 3.0513378e+00 3.9036670e+00 2.9215194e+00 3.9380061e+00 3.1696150e+00 4.1727767e+00 3.7315721e+00 3.5310232e+00 3.7330046e+00 4.2010229e+00 4.4009964e+00 3.6168064e+00 2.5380430e+00 2.8512473e+00 2.7284127e+00 2.9548786e+00 4.2265251e+00 3.4337524e+00 3.6052030e+00 4.0557760e+00 3.7459582e+00 3.0315798e+00 3.0641292e+00 3.3375726e+00 3.6791936e+00 3.0724764e+00 2.3729048e+00 3.1943137e+00 3.1069819e+00 3.1697649e+00 3.4401793e+00 2.0825248e+00 3.1072453e+00 5.4395694e+00 4.3024005e+00 5.5076110e+00 4.8098319e+00 5.2171795e+00 6.3332200e+00 3.6221782e+00 5.8357307e+00 5.2182844e+00 5.8803030e+00 4.5087074e+00 4.6683842e+00 5.0388436e+00 4.2926604e+00 4.5404679e+00 4.7857243e+00 4.7821002e+00 6.5048894e+00 6.7693190e+00 4.2505660e+00 5.3215846e+00 4.1092525e+00 6.4556788e+00 4.2476599e+00 5.1378752e+00 5.4997364e+00 4.1031329e+00 4.1149094e+00 4.9944183e+00 5.2775644e+00 5.7670211e+00 6.2840711e+00 5.0413648e+00 4.2697100e+00 4.6534063e+00 6.0537465e+00 5.0450411e+00 4.7310485e+00 3.9951532e+00 4.9893730e+00 5.2117777e+00 4.8452301e+00 4.3024005e+00 5.4461193e+00 5.3304749e+00 4.8465987e+00 4.4287591e+00 4.6149682e+00 4.7904900e+00 4.2249602e+00 5.7909019e-01 1.3362791e+00 7.0612170e-01 4.3540658e-01 3.6384497e-01 1.8664151e+00 2.0838521e+00 1.4985114e+00 9.6666785e-01 1.6862187e+00 1.1984345e+00 1.2063442e+00 1.1402466e+00 8.6709114e-01 9.7043733e-01 8.6267904e-01 6.5721874e-01 8.8112111e-01 1.0457123e+00 9.7552891e-01 4.9711212e-01 5.1470760e-01 1.1854166e+00 1.5058557e+00 1.7685758e+00 5.7909019e-01 7.3064040e-01 1.2991526e+00 5.7909019e-01 1.4697345e-01 9.0121124e-01 9.0114546e-01 6.3875221e-01 3.2240315e-01 1.0246555e+00 1.3410243e+00 4.3540658e-01 1.2096835e+00 3.7328014e-01 1.2583461e+00 7.4656027e-01 4.6113924e+00 4.1335616e+00 4.7301338e+00 3.2527716e+00 4.2521148e+00 3.6867975e+00 4.2939320e+00 2.2829391e+00 4.2345917e+00 3.0210765e+00 2.6290857e+00 3.6087901e+00 3.4124141e+00 4.0797290e+00 2.8792029e+00 4.1837185e+00 3.7260055e+00 3.2907240e+00 4.0995637e+00 3.0881623e+00 4.2580263e+00 3.4695208e+00 4.4187856e+00 4.0120669e+00 3.8776569e+00 4.1154347e+00 4.5498227e+00 4.7625098e+00 3.9023017e+00 2.7529334e+00 2.9795796e+00 2.8582355e+00 3.1948343e+00 4.4609589e+00 3.6500403e+00 3.9978239e+00 4.4538648e+00 3.9742605e+00 3.2981295e+00 3.2078614e+00 3.4982238e+00 3.9985735e+00 3.2902059e+00 2.3462742e+00 3.3919437e+00 3.3895752e+00 3.4252659e+00 3.7632876e+00 2.1226520e+00 3.3438903e+00 5.7687971e+00 4.5059047e+00 5.8661901e+00 5.0950508e+00 5.5261423e+00 6.7078697e+00 3.6371338e+00 6.1886854e+00 5.4836818e+00 6.3163023e+00 4.8785718e+00 4.9387541e+00 5.3842465e+00 4.4527855e+00 4.7498173e+00 5.1311723e+00 5.1072165e+00 6.9773059e+00 7.0932999e+00 4.4162883e+00 5.6989467e+00 4.3014527e+00 6.8097718e+00 4.5177020e+00 5.5207789e+00 5.9016003e+00 4.3799253e+00 4.4144348e+00 5.2690201e+00 5.6564259e+00 6.1172067e+00 6.7817024e+00 5.3140143e+00 4.5569738e+00 4.8794526e+00 6.4435912e+00 5.4033465e+00 5.0648272e+00 4.2853124e+00 5.3635347e+00 5.5559602e+00 5.2227949e+00 4.5059047e+00 5.8097995e+00 5.7029368e+00 5.1862233e+00 4.6656771e+00 4.9438180e+00 5.1478650e+00 4.4949429e+00 8.2138146e-01 3.6384497e-01 1.8410575e-01 7.5761919e-01 1.3796817e+00 1.6216247e+00 1.0681908e+00 5.2951637e-01 1.1597901e+00 7.7810927e-01 6.5951158e-01 7.3064040e-01 8.2330060e-01 5.6492004e-01 5.4772047e-01 2.1601195e-01 4.7384703e-01 5.3331654e-01 4.7384703e-01 2.8246002e-01 1.8410575e-01 6.9254136e-01 1.0620778e+00 1.3062786e+00 0.0000000e+00 3.6384497e-01 7.9516176e-01 0.0000000e+00 5.7909019e-01 3.9226391e-01 5.2951637e-01 9.8421557e-01 5.7909019e-01 6.8870991e-01 9.3620005e-01 2.8246002e-01 7.6202456e-01 3.6384497e-01 7.5761919e-01 2.8246002e-01 4.2521148e+00 3.8174186e+00 4.3948730e+00 3.0990800e+00 3.9660646e+00 3.4717229e+00 3.9910662e+00 2.2294738e+00 3.9225799e+00 2.8876826e+00 2.5814179e+00 3.3526972e+00 3.1847352e+00 3.8201151e+00 2.6481754e+00 3.8427556e+00 3.5130640e+00 3.0472458e+00 3.8817194e+00 2.8911687e+00 4.0120669e+00 3.1956559e+00 4.1779378e+00 3.7517193e+00 3.5736643e+00 3.7921910e+00 4.2405916e+00 4.4619308e+00 3.6532104e+00 2.5166057e+00 2.8054288e+00 2.6772106e+00 2.9574795e+00 4.2432288e+00 3.4641869e+00 3.7122636e+00 4.1270439e+00 3.7289647e+00 3.0662986e+00 3.0377972e+00 3.3198830e+00 3.7260055e+00 3.0641292e+00 2.2755545e+00 3.1931595e+00 3.1413298e+00 3.1944732e+00 3.4781522e+00 2.0147789e+00 3.1206893e+00 5.5285177e+00 4.3206313e+00 5.5729738e+00 4.8516769e+00 5.2760209e+00 6.3993457e+00 3.5845641e+00 5.8888128e+00 5.2363047e+00 6.0048639e+00 4.5931187e+00 4.6990570e+00 5.1032995e+00 4.2942009e+00 4.5764832e+00 4.8700756e+00 4.8371227e+00 6.6352567e+00 6.8118435e+00 4.2251579e+00 5.4085001e+00 4.1338961e+00 6.5073164e+00 4.2761367e+00 5.2314103e+00 5.5807571e+00 4.1388577e+00 4.1672519e+00 5.0349772e+00 5.3375359e+00 5.8169114e+00 6.4177915e+00 5.0835203e+00 4.2997959e+00 4.6589923e+00 6.1270701e+00 5.1488606e+00 4.7942425e+00 4.0461671e+00 5.0656455e+00 5.2871960e+00 4.9271585e+00 4.3206313e+00 5.5296723e+00 5.4284389e+00 4.9149559e+00 4.4425854e+00 4.6757294e+00 4.8945670e+00 4.2712615e+00 7.0210005e-01 9.7568128e-01 1.4373651e+00 6.1854995e-01 8.1758743e-01 3.6821151e-01 4.1053944e-01 4.1053944e-01 3.4362433e-01 3.7328014e-01 3.7328014e-01 9.8447732e-01 6.6234335e-01 8.2375853e-01 8.4231031e-01 5.8223100e-01 2.9394690e-01 3.9226391e-01 9.0121124e-01 8.9153488e-01 3.7328014e-01 4.7637957e-01 5.2994606e-01 8.2138146e-01 7.4863144e-01 3.1669465e-01 8.2138146e-01 1.2899766e+00 4.4092035e-01 5.2951637e-01 1.7473389e+00 1.1777118e+00 6.4597730e-01 5.8223100e-01 9.7568128e-01 3.4362433e-01 9.8447732e-01 1.0000000e-01 6.0124032e-01 3.9990569e+00 3.6168064e+00 4.1803204e+00 3.2271290e+00 3.8428858e+00 3.4628378e+00 3.7828240e+00 2.5626807e+00 3.7717338e+00 3.0123842e+00 2.9343531e+00 3.2606576e+00 3.2503961e+00 3.7311847e+00 2.6332798e+00 3.6311451e+00 3.4743653e+00 3.0505957e+00 3.8975108e+00 2.9724514e+00 3.8804978e+00 3.1179740e+00 4.1345148e+00 3.6863285e+00 3.4388553e+00 3.6137534e+00 4.0906639e+00 4.2875400e+00 3.5730442e+00 2.5659310e+00 2.9302115e+00 2.8101356e+00 2.9541172e+00 4.2041173e+00 3.4630296e+00 3.5071937e+00 3.9251915e+00 3.7205745e+00 3.0294096e+00 3.1293217e+00 3.3894905e+00 3.6146933e+00 3.0817254e+00 2.5975151e+00 3.2227849e+00 3.0895187e+00 3.1632046e+00 3.3698866e+00 2.2789986e+00 3.1110112e+00 5.3530283e+00 4.3018368e+00 5.3832119e+00 4.7471492e+00 5.1346353e+00 6.1903026e+00 3.7844533e+00 5.7098538e+00 5.1536342e+00 5.7041388e+00 4.3984511e+00 4.6100029e+00 4.9290790e+00 4.3184846e+00 4.5324302e+00 4.6896164e+00 4.6935041e+00 6.2941518e+00 6.6505356e+00 4.2653889e+00 5.1937058e+00 4.1244736e+00 6.3208663e+00 4.1945421e+00 5.0138115e+00 5.3530935e+00 4.0506627e+00 4.0560099e+00 4.9321301e+00 5.1411960e+00 5.6395109e+00 6.0547331e+00 4.9795463e+00 4.2088596e+00 4.6301441e+00 5.8989931e+00 4.9434831e+00 4.6425400e+00 3.9458895e+00 4.8627570e+00 5.1054408e+00 4.7155364e+00 4.3018368e+00 5.3282372e+00 5.2100866e+00 4.7417433e+00 4.3922906e+00 4.5237689e+00 4.6937720e+00 4.1886957e+00 4.7637957e-01 8.7254337e-01 1.2942686e+00 1.4277283e+00 9.1700166e-01 4.1053944e-01 1.0280890e+00 5.4772047e-01 6.1313486e-01 5.1232775e-01 6.8724866e-01 4.7384703e-01 3.0000000e-01 4.6022445e-01 2.9394690e-01 4.3540658e-01 4.6022445e-01 2.3011223e-01 3.0000000e-01 6.5721874e-01 8.5236302e-01 1.1322971e+00 3.6384497e-01 5.1470760e-01 7.9157919e-01 3.6384497e-01 6.7953514e-01 3.2240315e-01 4.1053944e-01 1.2207776e+00 5.6852959e-01 4.7637957e-01 6.6234335e-01 4.7637957e-01 5.1859441e-01 3.6821151e-01 6.1555822e-01 3.1669465e-01 4.2004676e+00 3.7481218e+00 4.3491013e+00 3.1160197e+00 3.9447671e+00 3.4332289e+00 3.9002648e+00 2.2440440e+00 3.8988987e+00 2.8494266e+00 2.6380223e+00 3.2979110e+00 3.2362582e+00 3.7783406e+00 2.6107570e+00 3.8005067e+00 3.4439573e+00 3.0399789e+00 3.9067155e+00 2.9011827e+00 3.9189969e+00 3.1801568e+00 4.1723605e+00 3.7249265e+00 3.5499259e+00 3.7589394e+00 4.2255317e+00 4.4164796e+00 3.6090029e+00 2.5364364e+00 2.8258555e+00 2.7051863e+00 2.9488586e+00 4.2076344e+00 3.3877135e+00 3.5973794e+00 4.0784447e+00 3.7565856e+00 3.0062986e+00 3.0346236e+00 3.2999105e+00 3.6747253e+00 3.0639009e+00 2.3091998e+00 3.1674489e+00 3.0864016e+00 3.1495132e+00 3.4483750e+00 2.0377636e+00 3.0893478e+00 5.4219049e+00 4.2737676e+00 5.5207789e+00 4.7971726e+00 5.2099883e+00 6.3508810e+00 3.5365113e+00 5.8491456e+00 5.2187748e+00 5.8932202e+00 4.5134183e+00 4.6650926e+00 5.0481853e+00 4.2607418e+00 4.5130493e+00 4.7824975e+00 4.7795698e+00 6.5238047e+00 6.7851604e+00 4.2337245e+00 5.3310272e+00 4.0727132e+00 6.4747091e+00 4.2472496e+00 5.1399925e+00 5.5148733e+00 4.0998750e+00 4.1046817e+00 4.9862459e+00 5.2963508e+00 5.7867386e+00 6.3134266e+00 5.0332534e+00 4.2653889e+00 4.6315014e+00 6.0820415e+00 5.0328573e+00 4.7242645e+00 3.9816140e+00 5.0043323e+00 5.2154807e+00 4.8657562e+00 4.2737676e+00 5.4486992e+00 5.3325308e+00 4.8574292e+00 4.4264573e+00 4.6177715e+00 4.7769555e+00 4.2010383e+00 6.0246555e-01 1.4985114e+00 1.7683237e+00 1.1845013e+00 6.4713428e-01 1.3279285e+00 9.1650126e-01 8.3398998e-01 8.6552490e-01 7.9516176e-01 7.0696256e-01 6.7676105e-01 3.1669465e-01 6.1517707e-01 6.8870991e-01 6.0124032e-01 3.3820388e-01 2.5735380e-01 8.3398998e-01 1.2032352e+00 1.4411447e+00 1.8410575e-01 3.8739477e-01 9.1073996e-01 1.8410575e-01 4.3540658e-01 5.4772047e-01 6.1217218e-01 8.2787992e-01 4.9210778e-01 8.1025366e-01 1.0990923e+00 2.0000000e-01 9.1650126e-01 3.1669465e-01 9.1073996e-01 3.9226391e-01 4.3956505e+00 3.9551079e+00 4.5325687e+00 3.1803067e+00 4.0864085e+00 3.5807766e+00 4.1293739e+00 2.2824407e+00 4.0499392e+00 2.9743224e+00 2.6258168e+00 3.4724842e+00 3.2768892e+00 3.9399176e+00 2.7574367e+00 3.9804424e+00 3.6267508e+00 3.1567619e+00 3.9765391e+00 2.9850138e+00 4.1384504e+00 3.3116381e+00 4.2857678e+00 3.8694594e+00 3.6987272e+00 3.9230216e+00 4.3652787e+00 4.5905177e+00 3.7701832e+00 2.6166267e+00 2.8911687e+00 2.7631251e+00 3.0641471e+00 4.3523651e+00 3.5728183e+00 3.8499485e+00 4.2633114e+00 3.8300297e+00 3.1823471e+00 3.1273208e+00 3.4166554e+00 3.8504372e+00 3.1667287e+00 2.3299448e+00 3.2949289e+00 3.2610286e+00 3.3076190e+00 3.6005401e+00 2.0784777e+00 3.2289959e+00 5.6555880e+00 4.4234126e+00 5.7014904e+00 4.9706369e+00 5.3977228e+00 6.5311966e+00 3.6527784e+00 6.0175957e+00 5.3485769e+00 6.1470021e+00 4.7253431e+00 4.8118990e+00 5.2291030e+00 4.3873208e+00 4.6777013e+00 4.9977718e+00 4.9623838e+00 6.7851604e+00 6.9330712e+00 4.3189097e+00 5.5413405e+00 4.2343844e+00 6.6348309e+00 4.3877926e+00 5.3669979e+00 5.7198843e+00 4.2522835e+00 4.2871996e+00 5.1495290e+00 5.4706826e+00 5.9430606e+00 6.5706766e+00 5.1972136e+00 4.4178673e+00 4.7686163e+00 6.2582886e+00 5.2796031e+00 4.9232644e+00 4.1644402e+00 5.1971347e+00 5.4138609e+00 5.0565026e+00 4.4234126e+00 5.6614671e+00 5.5601610e+00 5.0375731e+00 4.5472079e+00 4.7991450e+00 5.0252093e+00 4.3879606e+00 1.8770657e+00 2.1515762e+00 1.5434204e+00 1.0681908e+00 1.8258579e+00 1.2919546e+00 1.3835659e+00 1.2536313e+00 7.1370782e-01 1.1933491e+00 1.0882435e+00 9.0121124e-01 1.0650316e+00 1.1679748e+00 1.0806255e+00 7.1767732e-01 7.5712953e-01 1.3367012e+00 1.5522286e+00 1.8092071e+00 7.5761919e-01 7.6202456e-01 1.3631976e+00 7.5761919e-01 2.5735380e-01 1.0379897e+00 9.5691303e-01 8.1489157e-01 3.3820388e-01 1.1996723e+00 1.5189383e+00 6.4713428e-01 1.3169515e+00 5.1232775e-01 1.3578169e+00 8.6552490e-01 4.9301505e+00 4.4582185e+00 5.0563461e+00 3.6137534e+00 4.5938256e+00 4.0366321e+00 4.6177075e+00 2.6448346e+00 4.5709789e+00 3.3740440e+00 2.9915994e+00 3.9448914e+00 3.7686083e+00 4.4230474e+00 3.2211290e+00 4.5069558e+00 4.0656545e+00 3.6417096e+00 4.4560783e+00 3.4459681e+00 4.5882552e+00 3.8123848e+00 4.7717902e+00 4.3589041e+00 4.2144298e+00 4.4445761e+00 4.8887655e+00 5.0960268e+00 4.2454136e+00 3.1051135e+00 3.3397748e+00 3.2183265e+00 3.5451000e+00 4.8123690e+00 3.9897531e+00 4.3180682e+00 4.7806924e+00 4.3279631e+00 3.6368767e+00 3.5659822e+00 3.8547240e+00 4.3358088e+00 3.6436635e+00 2.7092764e+00 3.7451023e+00 3.7282750e+00 3.7701832e+00 4.1030886e+00 2.4807278e+00 3.6927038e+00 6.0982221e+00 4.8567234e+00 6.2015012e+00 5.4394744e+00 5.8646531e+00 7.0428424e+00 3.9891332e+00 6.5282736e+00 5.8356175e+00 6.6347789e+00 5.2066835e+00 5.2872031e+00 5.7195415e+00 4.8070337e+00 5.0934974e+00 5.4599866e+00 5.4454366e+00 7.2924042e+00 7.4390155e+00 4.7762551e+00 6.0277257e+00 4.6483004e+00 7.1506558e+00 4.8655674e+00 5.8484780e+00 6.2304357e+00 4.7253431e+00 4.7523179e+00 5.6152265e+00 5.9898832e+00 6.4579724e+00 7.0926884e+00 5.6597437e+00 4.9036060e+00 5.2327309e+00 6.7746418e+00 5.7279656e+00 5.4000077e+00 4.6232083e+00 5.6937434e+00 5.8879304e+00 5.5493919e+00 4.8567234e+00 6.1405364e+00 6.0291723e+00 5.5191428e+00 5.0177695e+00 5.2798739e+00 5.4718367e+00 4.8346272e+00 5.8223100e-01 4.9210778e-01 9.3405478e-01 5.7909019e-01 8.2787992e-01 9.3031410e-01 8.8978585e-01 1.3144375e+00 1.2312232e+00 1.4388364e+00 1.4122434e+00 1.1644620e+00 8.8365404e-01 9.1524136e-01 1.4894468e+00 1.4776497e+00 8.5896323e-01 7.1370782e-01 4.3649025e-01 1.3796817e+00 1.1757876e+00 6.1555822e-01 1.3796817e+00 1.7887389e+00 1.0217326e+00 9.9336112e-01 2.2295279e+00 1.6701710e+00 1.1769219e+00 1.0874269e+00 1.4985114e+00 8.6709114e-01 1.5152384e+00 6.9254136e-01 1.1322971e+00 4.1543857e+00 3.8365243e+00 4.3592685e+00 3.6496906e+00 4.0805068e+00 3.8213221e+00 4.0100978e+00 3.0920610e+00 3.9941439e+00 3.4656744e+00 3.4515746e+00 3.5625847e+00 3.5910147e+00 4.0181836e+00 3.0091337e+00 3.8192980e+00 3.8341089e+00 3.4040725e+00 4.2025427e+00 3.3756171e+00 4.1659764e+00 3.4043286e+00 4.4184004e+00 3.9838920e+00 3.6802242e+00 3.8220946e+00 4.2993609e+00 4.4948220e+00 3.8694594e+00 2.9468162e+00 3.3592899e+00 3.2441946e+00 3.3007308e+00 4.5145647e+00 3.8600098e+00 3.7629724e+00 4.1208557e+00 4.0113970e+00 3.3977136e+00 3.5451000e+00 3.8010086e+00 3.8939521e+00 3.4339054e+00 3.1168969e+00 3.6078921e+00 3.4395219e+00 3.5162413e+00 3.6395831e+00 2.7823879e+00 3.4699988e+00 5.5870757e+00 4.6316924e+00 5.5675434e+00 5.0122925e+00 5.3697924e+00 6.3508556e+00 4.2551810e+00 5.8947800e+00 5.4021320e+00 5.8416516e+00 4.6110340e+00 4.8696627e+00 5.1315589e+00 4.6705794e+00 4.8429399e+00 4.9115501e+00 4.9304169e+00 6.3957505e+00 6.8279431e+00 4.6002503e+00 5.3762880e+00 4.4787875e+00 6.4873444e+00 4.4614879e+00 5.2108365e+00 5.5222907e+00 4.3225021e+00 4.3295593e+00 5.1869791e+00 5.3198617e+00 5.8165499e+00 6.1345806e+00 5.2325373e+00 4.4791832e+00 4.9400770e+00 6.0385346e+00 5.1657387e+00 4.8836902e+00 4.2312293e+00 5.0471634e+00 5.3088222e+00 4.8889868e+00 4.6316924e+00 5.5241322e+00 5.4013450e+00 4.9438437e+00 4.6689095e+00 4.7517808e+00 4.9247441e+00 4.4903801e+00 6.4713428e-01 1.1358345e+00 6.5721874e-01 8.9153488e-01 1.1192863e+00 9.5758668e-01 1.5491559e+00 1.3238340e+00 1.4999501e+00 1.6375596e+00 1.2720490e+00 1.0909410e+00 1.1854166e+00 1.6486737e+00 1.6644111e+00 1.0620778e+00 6.9254136e-01 3.8739477e-01 1.6216247e+00 1.5038592e+00 9.9600309e-01 1.6216247e+00 2.0204103e+00 1.2311164e+00 1.2172259e+00 2.5154073e+00 1.8757166e+00 1.2172259e+00 9.9422425e-01 1.7333088e+00 9.2465413e-01 1.7172339e+00 8.6709114e-01 1.3794976e+00 3.9965104e+00 3.6585349e+00 4.1983563e+00 3.5713448e+00 3.9493220e+00 3.6694948e+00 3.8062303e+00 3.0472507e+00 3.8638888e+00 3.3307110e+00 3.4398225e+00 3.4002323e+00 3.5638838e+00 3.8617051e+00 2.8816314e+00 3.6730961e+00 3.6454516e+00 3.3044592e+00 4.1279668e+00 3.2946946e+00 3.9497402e+00 3.2949551e+00 4.2999439e+00 3.8475072e+00 3.5555482e+00 3.6840869e+00 4.1744643e+00 4.3275196e+00 3.7122636e+00 2.8915969e+00 3.2925320e+00 3.1902104e+00 3.2009277e+00 4.3553029e+00 3.6648837e+00 3.5390966e+00 3.9594588e+00 3.9445432e+00 3.2316361e+00 3.4437521e+00 3.6733789e+00 3.7292494e+00 3.3409172e+00 3.0872896e+00 3.4762142e+00 3.2788834e+00 3.3640161e+00 3.5071448e+00 2.7493789e+00 3.3350906e+00 5.3370456e+00 4.4549994e+00 5.3779441e+00 4.8232276e+00 5.1625965e+00 6.1606933e+00 4.0992356e+00 5.7185174e+00 5.2553582e+00 5.5888350e+00 4.4040520e+00 4.7074949e+00 4.9422207e+00 4.5085186e+00 4.6432885e+00 4.6897356e+00 4.7401472e+00 6.1376896e+00 6.6591553e+00 4.4968742e+00 5.1621322e+00 4.2853124e+00 6.3153587e+00 4.3119010e+00 4.9854922e+00 5.3236305e+00 4.1624892e+00 4.1412519e+00 5.0019789e+00 5.1496311e+00 5.6528107e+00 5.8902292e+00 5.0449936e+00 4.3234080e+00 4.7863389e+00 5.8563463e+00 4.9132831e+00 4.6803586e+00 4.0420572e+00 4.8537361e+00 5.0978332e+00 4.6981312e+00 4.4549994e+00 5.3033075e+00 5.1676641e+00 4.7538629e+00 4.5323067e+00 4.5631498e+00 4.6738568e+00 4.2895266e+00 5.4772047e-01 5.4772047e-01 4.1053944e-01 7.0612170e-01 4.3649025e-01 9.7383980e-01 8.3398998e-01 1.0754096e+00 1.1010130e+00 7.4863144e-01 5.6492004e-01 6.1217218e-01 1.1179012e+00 1.1257411e+00 5.5129254e-01 4.9309055e-01 4.1053944e-01 1.0681908e+00 8.7691570e-01 4.7637957e-01 1.0681908e+00 1.4210936e+00 6.8946124e-01 6.0124032e-01 1.8994439e+00 1.2899766e+00 7.2032458e-01 7.0210005e-01 1.1358345e+00 5.1232775e-01 1.1402466e+00 3.8739477e-01 7.9516176e-01 4.1411606e+00 3.7562100e+00 4.3259744e+00 3.4207677e+00 4.0022947e+00 3.6421817e+00 3.9147800e+00 2.7661717e+00 3.9385490e+00 3.1809070e+00 3.1526722e+00 3.4100653e+00 3.4668438e+00 3.8983112e+00 2.7950648e+00 3.7771123e+00 3.6304501e+00 3.2534553e+00 4.0807720e+00 3.1743497e+00 4.0100978e+00 3.2872503e+00 4.3114512e+00 3.8713651e+00 3.6041686e+00 3.7661382e+00 4.2553736e+00 4.4300558e+00 3.7315721e+00 2.7681157e+00 3.1349789e+00 3.0228750e+00 3.1380135e+00 4.3722185e+00 3.6195071e+00 3.6313894e+00 4.0699796e+00 3.9118055e+00 3.1947324e+00 3.3160758e+00 3.5843374e+00 3.7758724e+00 3.2710001e+00 2.8054787e+00 3.4036679e+00 3.2637485e+00 3.3344722e+00 3.5377863e+00 2.4647631e+00 3.2856635e+00 5.4611034e+00 4.4534974e+00 5.5154505e+00 4.8998212e+00 5.2649682e+00 6.3275057e+00 3.9469648e+00 5.8621602e+00 5.3196738e+00 5.7951434e+00 4.5184301e+00 4.7607636e+00 5.0576849e+00 4.4709120e+00 4.6527915e+00 4.7986121e+00 4.8394417e+00 6.3911445e+00 6.7954165e+00 4.4554026e+00 5.3070188e+00 4.2639191e+00 6.4689895e+00 4.3460806e+00 5.1330268e+00 5.4912516e+00 4.1973629e+00 4.1961434e+00 5.0728923e+00 5.2945106e+00 5.7879328e+00 6.1533060e+00 5.1154290e+00 4.3766470e+00 4.8167023e+00 6.0209917e+00 5.0441047e+00 4.7848762e+00 4.0849958e+00 4.9846983e+00 5.2180528e+00 4.8220622e+00 4.4534974e+00 5.4454337e+00 5.3111265e+00 4.8560740e+00 4.5470393e+00 4.6548069e+00 4.7956421e+00 4.3330396e+00 7.7206140e-01 3.2240315e-01 4.7384703e-01 2.5735380e-01 6.8870991e-01 4.3649025e-01 6.2843180e-01 5.7909019e-01 2.8246002e-01 1.8410575e-01 1.8410575e-01 5.8223100e-01 5.8223100e-01 3.6384497e-01 6.6944640e-01 8.4231031e-01 5.2951637e-01 4.1053944e-01 4.3540658e-01 5.2951637e-01 9.1073996e-01 1.8410575e-01 1.4697345e-01 1.3874623e+00 8.0213820e-01 3.9226391e-01 6.1555822e-01 6.0246555e-01 3.9226391e-01 6.1555822e-01 3.3820388e-01 2.5735380e-01 4.1672463e+00 3.7451023e+00 4.3318572e+00 3.2109499e+00 3.9513874e+00 3.5109651e+00 3.9071928e+00 2.4298691e+00 3.9004824e+00 2.9654668e+00 2.8091867e+00 3.3317195e+00 3.2923783e+00 3.8202647e+00 2.6604138e+00 3.7766501e+00 3.5186539e+00 3.1077132e+00 3.9479356e+00 2.9850138e+00 3.9600726e+00 3.1990497e+00 4.2128699e+00 3.7758724e+00 3.5535657e+00 3.7457350e+00 4.2217873e+00 4.4145576e+00 3.6490452e+00 2.5922221e+00 2.9204164e+00 2.8007058e+00 3.0003399e+00 4.2699258e+00 3.4834502e+00 3.6158471e+00 4.0659086e+00 3.7895309e+00 3.0745311e+00 3.1251640e+00 3.4043957e+00 3.7099105e+00 3.1226067e+00 2.4737728e+00 3.2484890e+00 3.1513816e+00 3.2139382e+00 3.4688565e+00 2.1599789e+00 3.1530398e+00 5.4516977e+00 4.3434640e+00 5.5182648e+00 4.8418108e+00 5.2362833e+00 6.3443573e+00 3.7026198e+00 5.8557811e+00 5.2525672e+00 5.8667914e+00 4.5157784e+00 4.6966059e+00 5.0495022e+00 4.3374313e+00 4.5668326e+00 4.7920807e+00 4.8056013e+00 6.4925784e+00 6.7867131e+00 4.3066938e+00 5.3242090e+00 4.1483963e+00 6.4721081e+00 4.2750098e+00 5.1452183e+00 5.5106049e+00 4.1289492e+00 4.1393996e+00 5.0198672e+00 5.2948118e+00 5.7831104e+00 6.2676736e+00 5.0647032e+00 4.3051258e+00 4.7069969e+00 6.0535273e+00 5.0496944e+00 4.7541363e+00 4.0207968e+00 4.9938220e+00 5.2175429e+00 4.8406222e+00 4.3434640e+00 5.4535981e+00 5.3303386e+00 4.8505045e+00 4.4598994e+00 4.6295385e+00 4.7960577e+00 4.2579212e+00 6.4480630e-01 5.3331654e-01 6.6944640e-01 1.3794976e+00 8.4665275e-01 1.0492910e+00 1.1204314e+00 8.5236302e-01 6.5951158e-01 7.5966619e-01 1.2200256e+00 1.1984345e+00 5.8223100e-01 6.8946124e-01 5.8223100e-01 1.1597901e+00 1.1208575e+00 5.8223100e-01 1.1597901e+00 1.6566168e+00 7.9516176e-01 9.0341870e-01 2.0546553e+00 1.5537042e+00 8.6552490e-01 6.5721874e-01 1.3033091e+00 6.2604837e-01 1.3499561e+00 4.9210778e-01 9.6835294e-01 3.6757568e+00 3.3250472e+00 3.8685207e+00 3.0874581e+00 3.5646958e+00 3.2579193e+00 3.4957442e+00 2.5410357e+00 3.4829279e+00 2.8996215e+00 2.9039743e+00 3.0210765e+00 3.0514721e+00 3.4787846e+00 2.4501514e+00 3.3241258e+00 3.2737606e+00 2.8443594e+00 3.6704029e+00 2.8101356e+00 3.6320999e+00 2.8698810e+00 3.8849935e+00 3.4402623e+00 3.1610131e+00 3.3177939e+00 3.7965449e+00 3.9913270e+00 3.3286147e+00 2.3890867e+00 2.7945722e+00 2.6797246e+00 2.7467481e+00 3.9687126e+00 3.2949289e+00 3.2384992e+00 3.6215487e+00 3.4826391e+00 2.8337089e+00 2.9797346e+00 3.2289959e+00 3.3570489e+00 2.8792756e+00 2.5670963e+00 3.0417046e+00 2.8769177e+00 2.9549831e+00 3.1077647e+00 2.2414467e+00 2.9089566e+00 5.0779884e+00 4.0832204e+00 5.0764322e+00 4.4827808e+00 4.8558950e+00 5.8716488e+00 3.6898609e+00 5.4021320e+00 4.8817086e+00 5.3779360e+00 4.1072515e+00 4.3453220e+00 4.6325351e+00 4.1183979e+00 4.3097466e+00 4.4073070e+00 4.4126150e+00 5.9493489e+00 6.3420203e+00 4.0518386e+00 4.8879417e+00 3.9268510e+00 6.0056857e+00 3.9353547e+00 4.7134855e+00 5.0367299e+00 3.7941769e+00 3.7989437e+00 4.6648882e+00 4.8297956e+00 5.3293833e+00 5.7005037e+00 4.7124098e+00 3.9468840e+00 4.3928984e+00 5.5732064e+00 4.6625980e+00 4.3639528e+00 3.6969283e+00 4.5571007e+00 4.8123105e+00 4.4088310e+00 4.0832204e+00 5.0286620e+00 4.9115807e+00 4.4492534e+00 4.1416268e+00 4.2410232e+00 4.4177288e+00 3.9491027e+00 5.8223100e-01 1.4697345e-01 7.8405165e-01 5.9902047e-01 6.9144557e-01 8.3109521e-01 4.5227024e-01 3.4362433e-01 4.5227024e-01 7.6855044e-01 8.0213820e-01 5.3331654e-01 3.9226391e-01 6.1435392e-01 7.7810927e-01 7.1370782e-01 5.8223100e-01 7.7810927e-01 1.1402466e+00 4.1800334e-01 3.9226391e-01 1.6742782e+00 9.9777193e-01 4.7384703e-01 4.1800334e-01 8.8313857e-01 1.4697345e-01 8.3163633e-01 2.5735380e-01 5.4442148e-01 4.1355943e+00 3.7150581e+00 4.3058816e+00 3.2771900e+00 3.9556490e+00 3.5179817e+00 3.8640224e+00 2.5242106e+00 3.8963282e+00 3.0000694e+00 2.9254972e+00 3.3269876e+00 3.3658385e+00 3.8138687e+00 2.6848228e+00 3.7586483e+00 3.5070209e+00 3.1357406e+00 4.0008895e+00 3.0390458e+00 3.9249833e+00 3.2194084e+00 4.2337245e+00 3.7781031e+00 3.5560785e+00 3.7369087e+00 4.2218372e+00 4.3952278e+00 3.6469300e+00 2.6542592e+00 2.9878521e+00 2.8733008e+00 3.0346236e+00 4.2718094e+00 3.4717229e+00 3.5633045e+00 4.0426856e+00 3.8387653e+00 3.0721579e+00 3.1746356e+00 3.4321394e+00 3.6965198e+00 3.1627405e+00 2.5775181e+00 3.2730084e+00 3.1464341e+00 3.2192174e+00 3.4714182e+00 2.2624597e+00 3.1710101e+00 5.3981406e+00 4.3453220e+00 5.4881358e+00 4.8207846e+00 5.2064457e+00 6.3080505e+00 3.7345514e+00 5.8276161e+00 5.2555256e+00 5.7886507e+00 4.4785846e+00 4.6947876e+00 5.0237340e+00 4.3558890e+00 4.5613338e+00 4.7530959e+00 4.7787869e+00 6.3933570e+00 6.7701682e+00 4.3464085e+00 5.2820076e+00 4.1464398e+00 6.4465658e+00 4.2807734e+00 5.0939531e+00 5.4649723e+00 4.1290000e+00 4.1210503e+00 5.0063748e+00 5.2652398e+00 5.7637431e+00 6.1696147e+00 5.0513067e+00 4.2993609e+00 4.7068718e+00 6.0227492e+00 4.9907661e+00 4.7193898e+00 4.0040788e+00 4.9621081e+00 5.1836854e+00 4.8133332e+00 4.3453220e+00 5.4091161e+00 5.2805151e+00 4.8290793e+00 4.4779520e+00 4.6072955e+00 4.7381066e+00 4.2360716e+00 5.4862269e-01 1.1322971e+00 4.5762068e-01 6.4480630e-01 6.0124032e-01 4.7637957e-01 3.1669465e-01 3.7328014e-01 7.5101750e-01 7.0210005e-01 2.9394690e-01 7.8881249e-01 8.8313857e-01 6.5951158e-01 7.0612170e-01 4.3540658e-01 6.5951158e-01 1.1980409e+00 3.7328014e-01 6.1435392e-01 1.5584126e+00 1.1306561e+00 6.1435392e-01 6.1517707e-01 8.3398998e-01 5.3331654e-01 9.0702094e-01 3.9226391e-01 5.3331654e-01 3.7889710e+00 3.3977981e+00 3.9598455e+00 2.9168937e+00 3.5911117e+00 3.1926901e+00 3.5738467e+00 2.2448113e+00 3.5253587e+00 2.7317645e+00 2.5975151e+00 3.0142171e+00 2.9324827e+00 3.4778132e+00 2.3638736e+00 3.4068559e+00 3.2256077e+00 2.7611453e+00 3.6022295e+00 2.6664500e+00 3.6605247e+00 2.8506909e+00 3.8600430e+00 3.4206847e+00 3.1876597e+00 3.3781086e+00 3.8431874e+00 4.0585939e+00 3.3199691e+00 2.2584129e+00 2.6157051e+00 2.4903234e+00 2.6686605e+00 3.9413677e+00 3.2135757e+00 3.3075403e+00 3.7016134e+00 3.4266074e+00 2.7726885e+00 2.8309655e+00 3.0994932e+00 3.3693244e+00 2.7899223e+00 2.2714959e+00 2.9412569e+00 2.8313572e+00 2.8988864e+00 3.1142884e+00 1.9647826e+00 2.8374067e+00 5.1534845e+00 4.0441498e+00 5.1642712e+00 4.5068251e+00 4.9102678e+00 5.9755569e+00 3.5071448e+00 5.4823933e+00 4.8946384e+00 5.5422852e+00 4.1884377e+00 4.3592888e+00 4.7074517e+00 4.0498684e+00 4.2936861e+00 4.4830797e+00 4.4626212e+00 6.1462271e+00 6.4172673e+00 3.9709288e+00 4.9904911e+00 3.8744384e+00 6.0947154e+00 3.9396572e+00 4.8133636e+00 5.1452183e+00 3.8011188e+00 3.8204002e+00 4.6918780e+00 4.9170669e+00 5.4091161e+00 5.9104607e+00 4.7412092e+00 3.9547354e+00 4.3615415e+00 5.6901071e+00 4.7540293e+00 4.4179770e+00 3.7091642e+00 4.6502912e+00 4.8945670e+00 4.5086719e+00 4.0441498e+00 5.1227862e+00 5.0159180e+00 4.5238554e+00 4.1275014e+00 4.2971362e+00 4.5033073e+00 3.9510529e+00 7.8405165e-01 4.7637957e-01 6.6234335e-01 7.6202456e-01 3.4362433e-01 3.1669465e-01 4.1053944e-01 7.1767732e-01 7.4188906e-01 4.4092035e-01 5.3331654e-01 7.1767732e-01 7.3064040e-01 6.5951158e-01 5.6492004e-01 7.3064040e-01 1.0874269e+00 3.7328014e-01 3.3820388e-01 1.5892459e+00 9.5691303e-01 3.3820388e-01 4.1800334e-01 8.0213820e-01 2.5735380e-01 7.8405165e-01 2.9394690e-01 4.9210778e-01 4.0820153e+00 3.6538311e+00 4.2487719e+00 3.1869821e+00 3.8859962e+00 3.4472436e+00 3.8052271e+00 2.4283679e+00 3.8340198e+00 2.9127021e+00 2.8278870e+00 3.2532226e+00 3.2844472e+00 3.7476888e+00 2.6003611e+00 3.6976418e+00 3.4363590e+00 3.0650375e+00 3.9164638e+00 2.9563733e+00 3.8586971e+00 3.1433608e+00 4.1602826e+00 3.7142161e+00 3.4889667e+00 3.6725794e+00 4.1582839e+00 4.3316669e+00 3.5754650e+00 2.5695195e+00 2.9007822e+00 2.7871736e+00 2.9548786e+00 4.2013904e+00 3.4004761e+00 3.5040410e+00 3.9825815e+00 3.7595002e+00 3.0000153e+00 3.0881623e+00 3.3570489e+00 3.6316199e+00 3.0824614e+00 2.4797040e+00 3.1948217e+00 3.0790108e+00 3.1464341e+00 3.4029769e+00 2.1569407e+00 3.0940148e+00 5.3362802e+00 4.2688464e+00 5.4274465e+00 4.7572574e+00 5.1411960e+00 6.2538121e+00 3.6477780e+00 5.7731167e+00 5.1877858e+00 5.7378304e+00 4.4145576e+00 4.6229677e+00 4.9585462e+00 4.2724189e+00 4.4795062e+00 4.6858800e+00 4.7172277e+00 6.3581950e+00 6.7087883e+00 4.2674900e+00 5.2202935e+00 4.0672273e+00 6.3911501e+00 4.2057000e+00 5.0368108e+00 5.4142626e+00 4.0543018e+00 4.0516383e+00 4.9363946e+00 5.2123458e+00 5.7048966e+00 6.1367831e+00 4.9798623e+00 4.2342645e+00 4.6440385e+00 5.9630574e+00 4.9294637e+00 4.6597140e+00 3.9330234e+00 4.8986770e+00 5.1167395e+00 4.7442488e+00 4.2688464e+00 5.3485769e+00 5.2175429e+00 4.7577101e+00 4.3985652e+00 4.5395186e+00 4.6761996e+00 4.1681939e+00 1.0233448e+00 9.6485354e-01 9.9422425e-01 8.2107889e-01 8.2138146e-01 7.8452781e-01 7.5761919e-01 8.4665275e-01 1.0365569e+00 9.9383032e-01 1.2142012e+00 8.2330060e-01 6.3338930e-01 9.7621887e-01 8.2330060e-01 7.3064040e-01 7.7329583e-01 5.4772047e-01 1.3645666e+00 5.6852959e-01 8.8275255e-01 1.1192461e+00 7.9516176e-01 8.4665275e-01 5.8789380e-01 9.0121124e-01 6.7953514e-01 4.8186198e+00 4.3687291e+00 4.9746688e+00 3.7590319e+00 4.5810705e+00 4.0823100e+00 4.5157784e+00 2.8650903e+00 4.5394321e+00 3.4747130e+00 3.2609917e+00 3.9251915e+00 3.8949908e+00 4.4224416e+00 3.2398535e+00 4.4224771e+00 4.0748788e+00 3.7020864e+00 4.5518104e+00 3.5559970e+00 4.5321122e+00 3.8189538e+00 4.8220542e+00 4.3807721e+00 4.1880062e+00 4.3871711e+00 4.8649153e+00 5.0430154e+00 4.2453677e+00 3.1879690e+00 3.4772713e+00 3.3604158e+00 3.5963432e+00 4.8525394e+00 4.0147946e+00 4.2028740e+00 4.7033826e+00 4.4076273e+00 3.6434140e+00 3.6781233e+00 3.9543042e+00 4.3140495e+00 3.7146048e+00 2.9345087e+00 3.8138687e+00 3.7315721e+00 3.7921409e+00 4.0898677e+00 2.6512518e+00 3.7329101e+00 6.0203105e+00 4.9029782e+00 6.1433084e+00 5.4342268e+00 5.8303442e+00 6.9783367e+00 4.1419813e+00 6.4875364e+00 5.8659541e+00 6.4729627e+00 5.1222567e+00 5.2993134e+00 5.6665211e+00 4.8856923e+00 5.1137750e+00 5.3818843e+00 5.4117699e+00 7.1091123e+00 7.4199188e+00 4.8878058e+00 5.9366989e+00 4.6880123e+00 7.1105545e+00 4.8796665e+00 5.7498231e+00 6.1402379e+00 4.7283510e+00 4.7288573e+00 5.6139143e+00 5.9325594e+00 6.4212745e+00 6.8964881e+00 5.6566988e+00 4.9118683e+00 5.2903706e+00 6.6946484e+00 5.6227340e+00 5.3530935e+00 4.6038613e+00 5.6162129e+00 5.8202138e+00 5.4620410e+00 4.9029782e+00 6.0584126e+00 5.9263120e+00 5.4616259e+00 5.0597202e+00 5.2367937e+00 5.3668660e+00 4.8274458e+00 5.1232775e-01 4.7384703e-01 2.1601195e-01 4.5332153e-01 4.7384703e-01 5.4772047e-01 5.1232775e-01 4.1053944e-01 9.6187679e-01 1.1311934e+00 5.6492004e-01 6.2843180e-01 7.2032458e-01 5.6492004e-01 9.7043733e-01 3.9226391e-01 5.2951637e-01 1.3190232e+00 9.1292896e-01 2.8246002e-01 5.6532807e-01 5.9997944e-01 6.1555822e-01 7.0427522e-01 6.1517707e-01 4.5762068e-01 3.8354875e+00 3.3895752e+00 3.9861921e+00 2.7899223e+00 3.5771321e+00 3.1161737e+00 3.5537565e+00 2.0056520e+00 3.5402089e+00 2.5456495e+00 2.3868613e+00 2.9448033e+00 2.8959348e+00 3.4402623e+00 2.2555408e+00 3.4289308e+00 3.1265814e+00 2.7176081e+00 3.5446776e+00 2.5753145e+00 3.5843374e+00 2.8130704e+00 3.8220946e+00 3.3974528e+00 3.1856085e+00 3.3880498e+00 3.8609097e+00 4.0518386e+00 3.2621131e+00 2.1878130e+00 2.5044126e+00 2.3872837e+00 2.6002610e+00 3.8771056e+00 3.0878512e+00 3.2644473e+00 3.7140359e+00 3.3966539e+00 2.6821580e+00 2.7080866e+00 2.9992100e+00 3.3344722e+00 2.7201071e+00 2.0477716e+00 2.8430382e+00 2.7661895e+00 2.8200870e+00 3.0929613e+00 1.7261951e+00 2.7531209e+00 5.0856807e+00 3.9413677e+00 5.1584041e+00 4.4632580e+00 4.8609845e+00 5.9950857e+00 3.2822150e+00 5.5018912e+00 4.8699441e+00 5.5400889e+00 4.1529973e+00 4.3093673e+00 4.6823202e+00 3.9249833e+00 4.1646267e+00 4.4230474e+00 4.4358434e+00 6.1873976e+00 6.4224940e+00 3.9010582e+00 4.9667043e+00 3.7438031e+00 6.1193221e+00 3.8849935e+00 4.7921638e+00 5.1684218e+00 3.7395717e+00 3.7571208e+00 4.6347045e+00 4.9477891e+00 5.4260741e+00 5.9727650e+00 4.6783087e+00 3.9261777e+00 4.3219983e+00 5.7048754e+00 4.6927752e+00 4.3870139e+00 3.6354057e+00 4.6343194e+00 4.8489538e+00 4.4795198e+00 3.9413677e+00 5.0935548e+00 4.9721541e+00 4.4784726e+00 4.0621357e+00 4.2557385e+00 4.4383569e+00 3.8722541e+00 5.6852959e-01 4.3649025e-01 6.0124032e-01 6.6464098e-01 3.9226391e-01 4.4092035e-01 7.8452781e-01 9.5844041e-01 1.2445598e+00 5.4772047e-01 7.7810927e-01 9.6666785e-01 5.4772047e-01 8.7298051e-01 5.1859441e-01 6.6944640e-01 1.3499561e+00 7.8452781e-01 5.8223100e-01 5.6852959e-01 6.7676105e-01 6.1854995e-01 5.9902047e-01 7.4863144e-01 5.6532807e-01 3.9692523e+00 3.5077759e+00 4.1121669e+00 2.8775067e+00 3.7077628e+00 3.1741873e+00 3.6540995e+00 2.0112380e+00 3.6595367e+00 2.6012841e+00 2.4144009e+00 3.0541756e+00 3.0053615e+00 3.5254407e+00 2.3744448e+00 3.5700900e+00 3.1856085e+00 2.7874010e+00 3.6746613e+00 2.6568829e+00 3.6670211e+00 2.9457777e+00 3.9269926e+00 3.4689396e+00 3.3133750e+00 3.5263669e+00 3.9891053e+00 4.1765300e+00 3.3607951e+00 2.3050522e+00 2.5856089e+00 2.4658165e+00 2.7079780e+00 3.9513874e+00 3.1256844e+00 3.3484876e+00 3.8414113e+00 3.5238896e+00 2.7512731e+00 2.7906127e+00 3.0399789e+00 3.4230111e+00 2.8219012e+00 2.0821863e+00 2.9151092e+00 2.8283494e+00 2.8959348e+00 3.2058971e+00 1.8260606e+00 2.8402603e+00 5.1703353e+00 4.0208784e+00 5.2777358e+00 4.5400557e+00 4.9599270e+00 6.1052831e+00 3.2839650e+00 5.5994883e+00 4.9690655e+00 5.6540291e+00 4.2718940e+00 4.4187729e+00 4.8070702e+00 4.0134223e+00 4.2715084e+00 4.5412614e+00 4.5271503e+00 6.2795951e+00 6.5410309e+00 3.9850729e+00 5.0906675e+00 3.8222766e+00 6.2289670e+00 4.0055384e+00 4.8921951e+00 5.2668471e+00 3.8573488e+00 3.8558974e+00 4.7373356e+00 5.0497013e+00 5.5438960e+00 6.0749263e+00 4.7862912e+00 4.0120799e+00 4.3666616e+00 5.8490265e+00 4.7858788e+00 4.4693637e+00 3.7330046e+00 4.7667508e+00 4.9757513e+00 4.6389720e+00 4.0208784e+00 5.2029793e+00 5.0922276e+00 4.6248038e+00 4.1869627e+00 4.3750717e+00 4.5299399e+00 3.9444507e+00 4.6022445e-01 5.6532807e-01 5.1470760e-01 3.7328014e-01 2.3011223e-01 6.4597730e-01 1.1440240e+00 1.3563117e+00 2.1601195e-01 4.6022445e-01 8.1296182e-01 2.1601195e-01 6.9033668e-01 4.3540658e-01 6.1555822e-01 9.6835294e-01 7.3064040e-01 6.6464098e-01 9.1650126e-01 3.1669465e-01 8.1047104e-01 5.1470760e-01 7.9157919e-01 3.7328014e-01 4.0843281e+00 3.6509962e+00 4.2233089e+00 2.9090888e+00 3.7812309e+00 3.2975975e+00 3.8301037e+00 2.0632076e+00 3.7426926e+00 2.7149728e+00 2.4026142e+00 3.1780950e+00 2.9881153e+00 3.6445123e+00 2.4679310e+00 3.6698852e+00 3.3472942e+00 2.8665168e+00 3.6843925e+00 2.7037145e+00 3.8514850e+00 3.0091337e+00 3.9899934e+00 3.5750595e+00 3.3920140e+00 3.6136748e+00 4.0570726e+00 4.2848372e+00 3.4757478e+00 2.3239946e+00 2.6162482e+00 2.4875631e+00 2.7708795e+00 4.0648684e+00 3.3034138e+00 3.5580544e+00 3.9552027e+00 3.5330924e+00 2.8981859e+00 2.8521193e+00 3.1438797e+00 3.5537565e+00 2.8760330e+00 2.0977292e+00 3.0137681e+00 2.9735252e+00 3.0203940e+00 3.2981295e+00 1.8283107e+00 2.9412569e+00 5.3681725e+00 4.1431082e+00 5.3966489e+00 4.6783375e+00 5.1028276e+00 6.2246571e+00 3.4258997e+00 5.7131258e+00 5.0512720e+00 5.8450260e+00 4.4255003e+00 4.5157784e+00 4.9262536e+00 4.1121138e+00 4.3997014e+00 4.7028755e+00 4.6645938e+00 6.4811468e+00 6.6279044e+00 4.0360403e+00 5.2391124e+00 3.9605572e+00 6.3282810e+00 4.0907185e+00 5.0679966e+00 5.4147974e+00 3.9563516e+00 3.9942310e+00 4.8555981e+00 5.1642813e+00 5.6361214e+00 6.2636704e+00 4.9036060e+00 4.1216247e+00 4.4839930e+00 5.9481494e+00 4.9901711e+00 4.6277789e+00 3.8736410e+00 4.8921951e+00 5.1146945e+00 4.7510168e+00 4.1431082e+00 5.3620548e+00 5.2626475e+00 4.7356717e+00 4.2528331e+00 4.4995094e+00 4.7367791e+00 4.1028333e+00 3.3820388e-01 3.6821151e-01 4.3649025e-01 4.3649025e-01 4.1800334e-01 8.2787992e-01 1.0365569e+00 4.7384703e-01 5.1470760e-01 6.5951158e-01 4.7384703e-01 8.5896323e-01 2.5735380e-01 3.4362433e-01 1.3004831e+00 7.6923870e-01 2.3011223e-01 5.3331654e-01 5.2951637e-01 4.7637957e-01 5.6492004e-01 5.1232775e-01 3.1669465e-01 4.0138321e+00 3.5681387e+00 4.1672463e+00 2.9795796e+00 3.7672316e+00 3.2940950e+00 3.7260055e+00 2.1641917e+00 3.7255410e+00 2.7207874e+00 2.5536711e+00 3.1283784e+00 3.0905635e+00 3.6213318e+00 2.4439493e+00 3.6126320e+00 3.2996253e+00 2.9001506e+00 3.7432754e+00 2.7631251e+00 3.7564985e+00 3.0053648e+00 4.0126428e+00 3.5776139e+00 3.3734514e+00 3.5744931e+00 4.0489298e+00 4.2362310e+00 3.4458846e+00 2.3818647e+00 2.6926398e+00 2.5749835e+00 2.7907193e+00 4.0590252e+00 3.2552324e+00 3.4281128e+00 3.8960802e+00 3.5936035e+00 2.8581888e+00 2.8951391e+00 3.1762416e+00 3.5140419e+00 2.9107597e+00 2.2150315e+00 3.0256609e+00 2.9411805e+00 3.0000153e+00 3.2791431e+00 1.9088530e+00 2.9374184e+00 5.2549600e+00 4.1230165e+00 5.3410529e+00 4.6415930e+00 5.0407813e+00 6.1751072e+00 3.4401772e+00 5.6818396e+00 5.0576849e+00 5.7056952e+00 4.3316830e+00 4.4970297e+00 4.8664052e+00 4.1102756e+00 4.3471161e+00 4.6010829e+00 4.6148397e+00 6.3456556e+00 6.6095643e+00 4.0908341e+00 5.1458891e+00 3.9222090e+00 6.3019809e+00 4.0751871e+00 4.9648277e+00 5.3428022e+00 3.9277334e+00 3.9378234e+00 4.8189916e+00 5.1265509e+00 5.6109006e+00 6.1310270e+00 4.8632976e+00 4.1085610e+00 4.4987915e+00 5.8899403e+00 4.8592198e+00 4.5622980e+00 3.8158141e+00 4.8172567e+00 5.0308844e+00 4.6660722e+00 4.1230165e+00 5.2705724e+00 5.1475865e+00 4.6656771e+00 4.2555907e+00 4.4394495e+00 4.6041956e+00 4.0476382e+00 1.4697345e-01 6.1555822e-01 6.0124032e-01 3.1669465e-01 6.1313486e-01 7.9157919e-01 5.3331654e-01 4.9711212e-01 3.7328014e-01 5.3331654e-01 1.0064130e+00 1.4697345e-01 3.1669465e-01 1.4638897e+00 9.0702094e-01 4.7637957e-01 5.8223100e-01 6.8870991e-01 3.4362433e-01 7.0210005e-01 2.3011223e-01 3.1669465e-01 4.0678090e+00 3.6594651e+00 4.2362310e+00 3.1512633e+00 3.8646808e+00 3.4363590e+00 3.8253509e+00 2.4046011e+00 3.8049476e+00 2.9225616e+00 2.7756361e+00 3.2606576e+00 3.2067487e+00 3.7370968e+00 2.5989186e+00 3.6832388e+00 3.4533779e+00 3.0222083e+00 3.8711797e+00 2.9135477e+00 3.8929468e+00 3.1179740e+00 4.1294197e+00 3.6863285e+00 3.4631815e+00 3.6543101e+00 4.1259786e+00 4.3276245e+00 3.5730442e+00 2.5166057e+00 2.8547253e+00 2.7320152e+00 2.9249840e+00 4.1934861e+00 3.4250476e+00 3.5420387e+00 3.9741755e+00 3.7042135e+00 3.0059745e+00 3.0641471e+00 3.3344722e+00 3.6269905e+00 3.0469420e+00 2.4434425e+00 3.1803433e+00 3.0745311e+00 3.1415166e+00 3.3825438e+00 2.1353569e+00 3.0821438e+00 5.3853086e+00 4.2803110e+00 5.4317402e+00 4.7614213e+00 5.1612039e+00 6.2497591e+00 3.6757101e+00 5.7588001e+00 5.1659970e+00 5.7866561e+00 4.4397050e+00 4.6194258e+00 4.9690836e+00 4.2811639e+00 4.5167418e+00 4.7243314e+00 4.7220420e+00 6.3985167e+00 6.6949901e+00 4.2303436e+00 5.2457837e+00 4.0950571e+00 6.3745909e+00 4.1996761e+00 5.0647174e+00 5.4150627e+00 4.0560614e+00 4.0672273e+00 4.9456641e+00 5.1953157e+00 5.6881695e+00 6.1685539e+00 4.9929774e+00 4.2192104e+00 4.6205364e+00 5.9639988e+00 4.9837682e+00 4.6720546e+00 3.9517090e+00 4.9123595e+00 5.1452081e+00 4.7663623e+00 4.2803110e+00 5.3754528e+00 5.2594658e+00 4.7787482e+00 4.3874364e+00 4.5531554e+00 4.7310863e+00 4.1886957e+00 5.9902047e-01 5.6852959e-01 3.1669465e-01 7.2312018e-01 8.7336999e-01 4.7384703e-01 3.6821151e-01 3.4362433e-01 4.7384703e-01 9.2981943e-01 1.4697345e-01 2.8246002e-01 1.3625178e+00 8.4611933e-01 5.2951637e-01 7.1767732e-01 6.0124032e-01 4.7637957e-01 6.4480630e-01 3.4362433e-01 2.3011223e-01 4.1401335e+00 3.7336301e+00 4.3070151e+00 3.1908411e+00 3.9251915e+00 3.5003944e+00 3.9049910e+00 2.4340002e+00 3.8692106e+00 2.9753392e+00 2.7945722e+00 3.3268796e+00 3.2427747e+00 3.8044546e+00 2.6554857e+00 3.7512583e+00 3.5237642e+00 3.0790108e+00 3.9131529e+00 2.9595171e+00 3.9699072e+00 3.1741873e+00 4.1848641e+00 3.7513378e+00 3.5253587e+00 3.7193902e+00 4.1874644e+00 4.3961894e+00 3.6382992e+00 2.5592246e+00 2.8951579e+00 2.7708795e+00 2.9777272e+00 4.2573557e+00 3.4958908e+00 3.6267508e+00 4.0445036e+00 3.7481274e+00 3.0738896e+00 3.1110112e+00 3.3912473e+00 3.6969562e+00 3.0973242e+00 2.4686636e+00 3.2374735e+00 3.1438797e+00 3.2060829e+00 3.4458846e+00 2.1603205e+00 3.1415166e+00 5.4665215e+00 4.3431557e+00 5.5029953e+00 4.8327982e+00 5.2338123e+00 6.3228898e+00 3.7276738e+00 5.8303337e+00 5.2270581e+00 5.8754272e+00 4.5146955e+00 4.6821694e+00 5.0389620e+00 4.3369743e+00 4.5795179e+00 4.7992391e+00 4.7947913e+00 6.4930956e+00 6.7603763e+00 4.2793231e+00 5.3211018e+00 4.1589122e+00 6.4438130e+00 4.2595770e+00 5.1451469e+00 5.4930835e+00 4.1183822e+00 4.1372299e+00 5.0124918e+00 5.2675472e+00 5.7553317e+00 6.2619120e+00 5.0593040e+00 4.2854563e+00 4.6861233e+00 6.0329793e+00 5.0671502e+00 4.7481849e+00 4.0212611e+00 4.9838590e+00 5.2173658e+00 4.8343777e+00 4.3431557e+00 5.4524028e+00 5.3375359e+00 4.8456445e+00 4.4421749e+00 4.6226555e+00 4.8145169e+00 4.2609896e+00 1.4697345e-01 7.8881249e-01 1.0787133e+00 1.3535221e+00 2.8246002e-01 5.1859441e-01 9.4210748e-01 2.8246002e-01 4.9711212e-01 4.7637957e-01 5.6633242e-01 1.0070860e+00 4.4092035e-01 6.1854995e-01 8.5896323e-01 3.3820388e-01 7.4656027e-01 2.3011223e-01 8.2138146e-01 3.9226391e-01 4.2511845e+00 3.7891589e+00 4.3889608e+00 3.0671665e+00 3.9586638e+00 3.4262248e+00 3.9478275e+00 2.1579040e+00 3.9216240e+00 2.8146250e+00 2.5381462e+00 3.3116381e+00 3.1984623e+00 3.7891016e+00 2.6069827e+00 3.8401399e+00 3.4483035e+00 3.0281130e+00 3.8793465e+00 2.8671432e+00 3.9461376e+00 3.1850618e+00 4.1643032e+00 3.7292494e+00 3.5692437e+00 3.7891689e+00 4.2453323e+00 4.4452066e+00 3.6174516e+00 2.5105438e+00 2.7801092e+00 2.6577892e+00 2.9366991e+00 4.2034289e+00 3.3857280e+00 3.6509962e+00 4.1159205e+00 3.7364385e+00 3.0111433e+00 2.9983245e+00 3.2725639e+00 3.6927038e+00 3.0449514e+00 2.2223980e+00 3.1495132e+00 3.0944573e+00 3.1495308e+00 3.4627201e+00 1.9665599e+00 3.0817254e+00 5.4585285e+00 4.2647386e+00 5.5518035e+00 4.8102965e+00 5.2314103e+00 6.3861337e+00 3.4832685e+00 5.8772125e+00 5.2196770e+00 5.9608735e+00 4.5509721e+00 4.6698924e+00 5.0759119e+00 4.2383457e+00 4.5098218e+00 4.8163175e+00 4.8025153e+00 6.6020213e+00 6.8040167e+00 4.2032935e+00 5.3712293e+00 4.0639438e+00 6.5022316e+00 4.2501351e+00 5.1858809e+00 5.5591601e+00 4.1062957e+00 4.1211430e+00 4.9957865e+00 5.3301780e+00 5.8120599e+00 6.3965996e+00 5.0427228e+00 4.2739184e+00 4.6247091e+00 6.1200469e+00 5.0800731e+00 4.7514787e+00 3.9959738e+00 5.0399879e+00 5.2463040e+00 4.9022165e+00 4.2647386e+00 5.4864431e+00 5.3770990e+00 4.8840611e+00 4.4187729e+00 4.6413551e+00 4.8240715e+00 4.2123555e+00 7.4188906e-01 1.1187766e+00 1.3726772e+00 1.8410575e-01 4.7637957e-01 9.0341870e-01 1.8410575e-01 5.3331654e-01 4.5762068e-01 5.8223100e-01 9.5130679e-01 5.3331654e-01 6.3338930e-01 8.8978585e-01 2.5735380e-01 7.8090629e-01 3.1669465e-01 8.2138146e-01 3.6821151e-01 4.1935299e+00 3.7405208e+00 4.3294400e+00 2.9983245e+00 3.8918122e+00 3.3739591e+00 3.9076161e+00 2.1025924e+00 3.8553091e+00 2.7681950e+00 2.4686636e+00 3.2600260e+00 3.1125176e+00 3.7336301e+00 2.5503876e+00 3.7785951e+00 3.4073759e+00 2.9629461e+00 3.8007579e+00 2.7981746e+00 3.9116628e+00 3.1170773e+00 4.0958715e+00 3.6694529e+00 3.5029017e+00 3.7248529e+00 4.1754426e+00 4.3865449e+00 3.5626027e+00 2.4339786e+00 2.7092764e+00 2.5842954e+00 2.8698810e+00 4.1485109e+00 3.3506423e+00 3.6201649e+00 4.0577417e+00 3.6556893e+00 2.9654668e+00 2.9353686e+00 3.2174206e+00 3.6400099e+00 2.9762373e+00 2.1579040e+00 3.0929613e+00 3.0464300e+00 3.0976972e+00 3.4002323e+00 1.8992773e+00 3.0247613e+00 5.4275551e+00 4.2153864e+00 5.4957614e+00 4.7602971e+00 5.1837786e+00 6.3285246e+00 3.4489782e+00 5.8177081e+00 5.1549808e+00 5.9243366e+00 4.5068687e+00 4.6107070e+00 5.0213025e+00 4.1855455e+00 4.4655551e+00 4.7762448e+00 4.7514787e+00 6.5650945e+00 6.7391599e+00 4.1345148e+00 5.3252952e+00 4.0211091e+00 6.4391983e+00 4.1885733e+00 5.1458891e+00 5.5092949e+00 4.0485476e+00 4.0729291e+00 4.9424236e+00 5.2704851e+00 5.7478695e+00 6.3558069e+00 4.9897615e+00 4.2156786e+00 4.5688963e+00 6.0588954e+00 5.0502951e+00 4.7058671e+00 3.9490730e+00 4.9867661e+00 5.1984874e+00 4.8477895e+00 4.2153864e+00 5.4430666e+00 5.3382566e+00 4.8297008e+00 4.3535564e+00 4.5888915e+00 4.7951342e+00 4.1698736e+00 8.1758743e-01 8.5613620e-01 6.9254136e-01 6.1517707e-01 3.3820388e-01 6.9254136e-01 1.1581804e+00 3.7328014e-01 4.9210778e-01 1.5042921e+00 1.0888430e+00 4.9210778e-01 6.7953514e-01 7.6855044e-01 5.8223100e-01 8.8060445e-01 3.9226391e-01 4.9210778e-01 3.8840072e+00 3.4861064e+00 4.0548526e+00 3.0020838e+00 3.6802242e+00 3.2975100e+00 3.6624094e+00 2.3250796e+00 3.6269905e+00 2.8085955e+00 2.6821183e+00 3.0953218e+00 3.0377972e+00 3.5794271e+00 2.4374492e+00 3.4959314e+00 3.3175760e+00 2.8772286e+00 3.6865907e+00 2.7663306e+00 3.7414563e+00 2.9374184e+00 3.9569674e+00 3.5352957e+00 3.2825559e+00 3.4677760e+00 3.9414205e+00 4.1460779e+00 3.4098908e+00 2.3526947e+00 2.7109601e+00 2.5907771e+00 2.7611453e+00 4.0399146e+00 3.3058124e+00 3.3919684e+00 3.7930447e+00 3.5210759e+00 2.8670728e+00 2.9181632e+00 3.2080106e+00 3.4687474e+00 2.8850526e+00 2.3510321e+00 3.0368687e+00 2.9366767e+00 2.9955823e+00 3.2109211e+00 2.0192383e+00 2.9301146e+00 5.2280742e+00 4.1264029e+00 5.2503762e+00 4.6048273e+00 4.9926474e+00 6.0717786e+00 3.5823598e+00 5.5875016e+00 4.9931564e+00 5.6156935e+00 4.2639191e+00 4.4443434e+00 4.7862910e+00 4.1233549e+00 4.3503622e+00 4.5493619e+00 4.5577729e+00 6.2397394e+00 6.5096606e+00 4.0698174e+00 5.0647174e+00 3.9463420e+00 6.1954688e+00 4.0202048e+00 4.8976399e+00 5.2462938e+00 3.8796913e+00 3.9029155e+00 4.7744053e+00 5.0234652e+00 5.5055787e+00 6.0053773e+00 4.8190393e+00 4.0580154e+00 4.4804418e+00 5.7687971e+00 4.8237864e+00 4.5138825e+00 3.7892619e+00 4.7263671e+00 4.9627373e+00 4.5673133e+00 4.1264029e+00 5.2019186e+00 5.0823364e+00 4.5860146e+00 4.2044885e+00 4.3749246e+00 4.5729961e+00 4.0396246e+00 3.6384497e-01 1.0620778e+00 1.0070860e+00 7.4188906e-01 1.0620778e+00 1.4398518e+00 7.2312018e-01 7.2768994e-01 2.0111613e+00 1.2836546e+00 8.5666462e-01 6.3137460e-01 1.2294495e+00 3.6384497e-01 1.1358345e+00 4.3540658e-01 8.5613620e-01 4.2329184e+00 3.8411582e+00 4.4146911e+00 3.5105932e+00 4.1048026e+00 3.6933191e+00 3.9853220e+00 2.8098536e+00 4.0269601e+00 3.2340792e+00 3.2113402e+00 3.4974290e+00 3.5687888e+00 3.9647280e+00 2.8938119e+00 3.8793465e+00 3.6801259e+00 3.3140210e+00 4.1988379e+00 3.2528160e+00 4.0734191e+00 3.3942505e+00 4.4008651e+00 3.9274370e+00 3.7015855e+00 3.8689783e+00 4.3521134e+00 4.5229557e+00 3.8111468e+00 2.8701012e+00 3.2168621e+00 3.1024150e+00 3.2302258e+00 4.4359330e+00 3.6532104e+00 3.6915537e+00 4.1616198e+00 4.0233110e+00 3.2516340e+00 3.3971689e+00 3.6282990e+00 3.8428858e+00 3.3609580e+00 2.8634913e+00 3.4702539e+00 3.3130810e+00 3.3979910e+00 3.6252120e+00 2.5575142e+00 3.3607951e+00 5.5240928e+00 4.5255407e+00 5.6027774e+00 4.9587706e+00 5.3409904e+00 6.4030591e+00 3.9768715e+00 5.9290883e+00 5.4005612e+00 5.8717922e+00 4.6069967e+00 4.8507921e+00 5.1523574e+00 4.5561416e+00 4.7484254e+00 4.8896299e+00 4.9067096e+00 6.4386445e+00 6.8845645e+00 4.5369789e+00 5.3981566e+00 4.3361292e+00 6.5459183e+00 4.4462967e+00 5.2029772e+00 5.5547813e+00 4.2944344e+00 4.2743609e+00 5.1561988e+00 5.3629841e+00 5.8736752e+00 6.2066177e+00 5.2038344e+00 4.4438244e+00 4.8546532e+00 6.1262655e+00 5.1137897e+00 4.8437725e+00 4.1634537e+00 5.0833420e+00 5.3155899e+00 4.9452505e+00 4.5255407e+00 5.5249508e+00 5.4008384e+00 4.9714867e+00 4.6552776e+00 4.7472058e+00 4.8645718e+00 4.3912132e+00 1.3062786e+00 1.1777118e+00 7.1163521e-01 1.3062786e+00 1.6972470e+00 9.2981943e-01 9.1073996e-01 2.2214647e+00 1.5508288e+00 1.0333206e+00 8.3749635e-01 1.4411447e+00 6.3338930e-01 1.3977943e+00 5.6532807e-01 1.0620358e+00 4.1648390e+00 3.8073382e+00 4.3596301e+00 3.5830856e+00 4.0772857e+00 3.7389625e+00 3.9595113e+00 2.9766279e+00 3.9939183e+00 3.3434511e+00 3.3668651e+00 3.5061384e+00 3.5983378e+00 3.9709288e+00 2.9338637e+00 3.8252109e+00 3.7260055e+00 3.3548418e+00 4.2065452e+00 3.3146739e+00 4.0812691e+00 3.3899961e+00 4.4019970e+00 3.9414205e+00 3.6759211e+00 3.8252109e+00 4.3109189e+00 4.4821729e+00 3.8194352e+00 2.9140956e+00 3.2927093e+00 3.1809986e+00 3.2604596e+00 4.4569949e+00 3.7260055e+00 3.6833176e+00 4.1142031e+00 4.0238405e+00 3.2981295e+00 3.4662648e+00 3.7032909e+00 3.8444600e+00 3.3955375e+00 3.0188454e+00 3.5251418e+00 3.3526261e+00 3.4367012e+00 3.6165128e+00 2.6930040e+00 3.4002323e+00 5.5082832e+00 4.5559346e+00 5.5527221e+00 4.9573048e+00 5.3208277e+00 6.3436091e+00 4.1106908e+00 5.8837214e+00 5.3857309e+00 5.8023501e+00 4.5711726e+00 4.8395825e+00 5.1100975e+00 4.5953473e+00 4.7655545e+00 4.8597053e+00 4.8880200e+00 6.3589502e+00 6.8313233e+00 4.5687379e+00 5.3470491e+00 4.3776886e+00 6.4892589e+00 4.4362556e+00 5.1638631e+00 5.5018397e+00 4.2874805e+00 4.2724189e+00 5.1445968e+00 5.3134212e+00 5.8200949e+00 6.1143182e+00 5.1904526e+00 4.4419994e+00 4.8818802e+00 6.0496758e+00 5.0900521e+00 4.8293488e+00 4.1677196e+00 5.0307278e+00 5.2743623e+00 4.8823922e+00 4.5559346e+00 5.4835282e+00 5.3557121e+00 4.9252848e+00 4.6496053e+00 4.7186015e+00 4.8453197e+00 4.4091544e+00 3.6384497e-01 7.9516176e-01 0.0000000e+00 5.7909019e-01 3.9226391e-01 5.2951637e-01 9.8421557e-01 5.7909019e-01 6.8870991e-01 9.3620005e-01 2.8246002e-01 7.6202456e-01 3.6384497e-01 7.5761919e-01 2.8246002e-01 4.2521148e+00 3.8174186e+00 4.3948730e+00 3.0990800e+00 3.9660646e+00 3.4717229e+00 3.9910662e+00 2.2294738e+00 3.9225799e+00 2.8876826e+00 2.5814179e+00 3.3526972e+00 3.1847352e+00 3.8201151e+00 2.6481754e+00 3.8427556e+00 3.5130640e+00 3.0472458e+00 3.8817194e+00 2.8911687e+00 4.0120669e+00 3.1956559e+00 4.1779378e+00 3.7517193e+00 3.5736643e+00 3.7921910e+00 4.2405916e+00 4.4619308e+00 3.6532104e+00 2.5166057e+00 2.8054288e+00 2.6772106e+00 2.9574795e+00 4.2432288e+00 3.4641869e+00 3.7122636e+00 4.1270439e+00 3.7289647e+00 3.0662986e+00 3.0377972e+00 3.3198830e+00 3.7260055e+00 3.0641292e+00 2.2755545e+00 3.1931595e+00 3.1413298e+00 3.1944732e+00 3.4781522e+00 2.0147789e+00 3.1206893e+00 5.5285177e+00 4.3206313e+00 5.5729738e+00 4.8516769e+00 5.2760209e+00 6.3993457e+00 3.5845641e+00 5.8888128e+00 5.2363047e+00 6.0048639e+00 4.5931187e+00 4.6990570e+00 5.1032995e+00 4.2942009e+00 4.5764832e+00 4.8700756e+00 4.8371227e+00 6.6352567e+00 6.8118435e+00 4.2251579e+00 5.4085001e+00 4.1338961e+00 6.5073164e+00 4.2761367e+00 5.2314103e+00 5.5807571e+00 4.1388577e+00 4.1672519e+00 5.0349772e+00 5.3375359e+00 5.8169114e+00 6.4177915e+00 5.0835203e+00 4.2997959e+00 4.6589923e+00 6.1270701e+00 5.1488606e+00 4.7942425e+00 4.0461671e+00 5.0656455e+00 5.2871960e+00 4.9271585e+00 4.3206313e+00 5.5296723e+00 5.4284389e+00 4.9149559e+00 4.4425854e+00 4.6757294e+00 4.8945670e+00 4.2712615e+00 6.1555822e-01 3.6384497e-01 6.5721874e-01 3.9226391e-01 3.4362433e-01 1.0787133e+00 6.1313486e-01 6.7953514e-01 9.9777193e-01 3.8739477e-01 7.5761919e-01 4.6022445e-01 6.9254136e-01 2.3011223e-01 4.4017953e+00 3.9792690e+00 4.5569738e+00 3.3225363e+00 4.1436513e+00 3.6891110e+00 4.1554195e+00 2.4873379e+00 4.1009741e+00 3.1097601e+00 2.8375792e+00 3.5356806e+00 3.3999719e+00 4.0181836e+00 2.8374067e+00 3.9985735e+00 3.7187263e+00 3.2669025e+00 4.0805581e+00 3.1145549e+00 4.1911404e+00 3.3784781e+00 4.3789815e+00 3.9611138e+00 3.7504217e+00 3.9563516e+00 4.4164757e+00 4.6312199e+00 3.8453406e+00 2.7239648e+00 3.0328552e+00 2.9075924e+00 3.1600011e+00 4.4524010e+00 3.6784256e+00 3.8772974e+00 4.2899468e+00 3.9274370e+00 3.2702354e+00 3.2580400e+00 3.5538143e+00 3.9178311e+00 3.2725639e+00 2.5252151e+00 3.4098908e+00 3.3487261e+00 3.4004761e+00 3.6639483e+00 2.2341061e+00 3.3267937e+00 5.6992447e+00 4.5252271e+00 5.7416871e+00 5.0494815e+00 5.4566455e+00 6.5704807e+00 3.8261448e+00 6.0715155e+00 5.4342268e+00 6.1468288e+00 4.7531091e+00 4.8879995e+00 5.2705724e+00 4.5000148e+00 4.7594761e+00 5.0293099e+00 5.0233105e+00 6.7823895e+00 6.9898345e+00 4.4447870e+00 5.5644251e+00 4.3341551e+00 6.6847569e+00 4.4614879e+00 5.3953186e+00 5.7496668e+00 4.3225021e+00 4.3515054e+00 5.2222333e+00 5.5149217e+00 5.9921320e+00 6.5575516e+00 5.2675472e+00 4.4992652e+00 4.8839320e+00 6.2794512e+00 5.3094502e+00 4.9801460e+00 4.2312293e+00 5.2237164e+00 5.4477055e+00 5.0699504e+00 4.5252271e+00 5.6935403e+00 5.5807571e+00 5.0704734e+00 4.6312046e+00 4.8474092e+00 5.0556751e+00 4.4680467e+00 7.9516176e-01 1.2406903e+00 4.7637957e-01 5.1514715e-01 1.6280171e+00 1.1577350e+00 7.4863144e-01 8.5896323e-01 9.1073996e-01 6.1854995e-01 9.7621887e-01 3.6821151e-01 5.6532807e-01 4.0912108e+00 3.7237158e+00 4.2735861e+00 3.2947388e+00 3.9225941e+00 3.5704383e+00 3.9040345e+00 2.6393910e+00 3.8557168e+00 3.1206893e+00 2.9862164e+00 3.3642998e+00 3.2913987e+00 3.8342175e+00 2.7258488e+00 3.7184658e+00 3.5980611e+00 3.1380018e+00 3.9488577e+00 3.0464300e+00 4.0084802e+00 3.1943137e+00 4.2114472e+00 3.7844929e+00 3.5209059e+00 3.6977695e+00 4.1672053e+00 4.3818631e+00 3.6737956e+00 2.6261426e+00 2.9984278e+00 2.8748334e+00 3.0328734e+00 4.3058029e+00 3.5980611e+00 3.6434774e+00 4.0198947e+00 3.7717338e+00 3.1462837e+00 3.2107443e+00 3.4910450e+00 3.7219919e+00 3.1567619e+00 2.6622461e+00 3.3197043e+00 3.2054070e+00 3.2702354e+00 3.4593815e+00 2.3397209e+00 3.2076294e+00 5.4860359e+00 4.4074557e+00 5.4823933e+00 4.8589514e+00 5.2464552e+00 6.2898226e+00 3.9004824e+00 5.8082599e+00 5.2389842e+00 5.8353734e+00 4.5103528e+00 4.7018455e+00 5.0283256e+00 4.4133740e+00 4.6386639e+00 4.8053062e+00 4.8032433e+00 6.4358452e+00 6.7359637e+00 4.3380784e+00 5.3030312e+00 4.2377463e+00 6.4120308e+00 4.2806229e+00 5.1356350e+00 5.4633909e+00 4.1431191e+00 4.1661254e+00 5.0337365e+00 5.2389648e+00 5.7271628e+00 6.1896229e+00 5.0803919e+00 4.3075685e+00 4.7347303e+00 5.9868676e+00 5.0778612e+00 4.7607066e+00 4.0572141e+00 4.9626452e+00 5.2120506e+00 4.8074350e+00 4.4074557e+00 5.4434562e+00 5.3282997e+00 4.8358767e+00 4.4693948e+00 4.6260190e+00 4.8292232e+00 4.3094041e+00 5.7909019e-01 3.9226391e-01 5.2951637e-01 9.8421557e-01 5.7909019e-01 6.8870991e-01 9.3620005e-01 2.8246002e-01 7.6202456e-01 3.6384497e-01 7.5761919e-01 2.8246002e-01 4.2521148e+00 3.8174186e+00 4.3948730e+00 3.0990800e+00 3.9660646e+00 3.4717229e+00 3.9910662e+00 2.2294738e+00 3.9225799e+00 2.8876826e+00 2.5814179e+00 3.3526972e+00 3.1847352e+00 3.8201151e+00 2.6481754e+00 3.8427556e+00 3.5130640e+00 3.0472458e+00 3.8817194e+00 2.8911687e+00 4.0120669e+00 3.1956559e+00 4.1779378e+00 3.7517193e+00 3.5736643e+00 3.7921910e+00 4.2405916e+00 4.4619308e+00 3.6532104e+00 2.5166057e+00 2.8054288e+00 2.6772106e+00 2.9574795e+00 4.2432288e+00 3.4641869e+00 3.7122636e+00 4.1270439e+00 3.7289647e+00 3.0662986e+00 3.0377972e+00 3.3198830e+00 3.7260055e+00 3.0641292e+00 2.2755545e+00 3.1931595e+00 3.1413298e+00 3.1944732e+00 3.4781522e+00 2.0147789e+00 3.1206893e+00 5.5285177e+00 4.3206313e+00 5.5729738e+00 4.8516769e+00 5.2760209e+00 6.3993457e+00 3.5845641e+00 5.8888128e+00 5.2363047e+00 6.0048639e+00 4.5931187e+00 4.6990570e+00 5.1032995e+00 4.2942009e+00 4.5764832e+00 4.8700756e+00 4.8371227e+00 6.6352567e+00 6.8118435e+00 4.2251579e+00 5.4085001e+00 4.1338961e+00 6.5073164e+00 4.2761367e+00 5.2314103e+00 5.5807571e+00 4.1388577e+00 4.1672519e+00 5.0349772e+00 5.3375359e+00 5.8169114e+00 6.4177915e+00 5.0835203e+00 4.2997959e+00 4.6589923e+00 6.1270701e+00 5.1488606e+00 4.7942425e+00 4.0461671e+00 5.0656455e+00 5.2871960e+00 4.9271585e+00 4.3206313e+00 5.5296723e+00 5.4284389e+00 4.9149559e+00 4.4425854e+00 4.6757294e+00 4.8945670e+00 4.2712615e+00 8.6709114e-01 8.2138146e-01 7.2312018e-01 2.0000000e-01 9.9587193e-01 1.3204740e+00 4.3540658e-01 1.1618240e+00 3.1669465e-01 1.2096835e+00 7.0210005e-01 4.6787386e+00 4.2029688e+00 4.8028665e+00 3.3637099e+00 4.3389254e+00 3.7816890e+00 4.3620378e+00 2.4006868e+00 4.3176360e+00 3.1206893e+00 2.7560637e+00 3.6877374e+00 3.5224375e+00 4.1672519e+00 2.9640785e+00 4.2539502e+00 3.8096101e+00 3.3888845e+00 4.2051645e+00 3.1939253e+00 4.3316830e+00 3.5573201e+00 4.5179077e+00 4.1049644e+00 3.9602837e+00 4.1907323e+00 4.6358186e+00 4.8403042e+00 3.9887530e+00 2.8527397e+00 3.0893478e+00 2.9687801e+00 3.2902059e+00 4.5571251e+00 3.7350058e+00 4.0626267e+00 4.5264010e+00 4.0775918e+00 3.3803875e+00 3.3130810e+00 3.6024415e+00 4.0797290e+00 3.3897504e+00 2.4658910e+00 3.4902090e+00 3.4724965e+00 3.5139583e+00 3.8478780e+00 2.2310925e+00 3.4367012e+00 5.8419631e+00 4.6013171e+00 5.9452324e+00 5.1833280e+00 5.6075117e+00 6.7877661e+00 3.7438031e+00 6.2739031e+00 5.5811274e+00 6.3794487e+00 4.9499007e+00 5.0308844e+00 5.4626962e+00 4.5531554e+00 4.8382155e+00 5.2029793e+00 5.1890055e+00 7.0393861e+00 7.1840161e+00 4.5252808e+00 5.7709601e+00 4.3932337e+00 6.8964881e+00 4.6092826e+00 5.5920504e+00 5.9759019e+00 4.4685330e+00 4.4951609e+00 5.3584003e+00 5.7363115e+00 6.2035314e+00 6.8414940e+00 5.4027975e+00 4.6483004e+00 4.9803019e+00 6.5196015e+00 5.4718367e+00 5.1436358e+00 4.3660312e+00 5.4373008e+00 5.6307204e+00 5.2933088e+00 4.6013171e+00 5.8835999e+00 5.7724014e+00 5.2622114e+00 4.7624351e+00 5.0227314e+00 5.2158184e+00 4.5781867e+00 2.8246002e-01 1.3238340e+00 7.7810927e-01 4.5227024e-01 6.3338930e-01 5.4772047e-01 4.1800334e-01 5.6532807e-01 3.7328014e-01 1.8410575e-01 4.1101481e+00 3.6900332e+00 4.2718137e+00 3.1237525e+00 3.8837316e+00 3.4330554e+00 3.8560104e+00 2.3359495e+00 3.8298223e+00 2.8924901e+00 2.7057915e+00 3.2710001e+00 3.1942341e+00 3.7489248e+00 2.5946321e+00 3.7179360e+00 3.4533779e+00 3.0186586e+00 3.8659061e+00 2.8951391e+00 3.9085907e+00 3.1280810e+00 4.1345148e+00 3.6951713e+00 3.4844399e+00 3.6832388e+00 4.1511568e+00 4.3551876e+00 3.5823598e+00 2.5042377e+00 2.8283494e+00 2.7046874e+00 2.9213401e+00 4.1961434e+00 3.4176378e+00 3.5706671e+00 4.0068409e+00 3.7042135e+00 3.0059745e+00 3.0425215e+00 3.3174013e+00 3.6423751e+00 3.0399789e+00 2.3773122e+00 3.1697649e+00 3.0782741e+00 3.1415166e+00 3.3983587e+00 2.0776241e+00 3.0785394e+00 5.4086631e+00 4.2776245e+00 5.4621055e+00 4.7757095e+00 5.1811770e+00 6.2847738e+00 3.6299768e+00 5.7889291e+00 5.1783556e+00 5.8354540e+00 4.4682123e+00 4.6312046e+00 4.9957865e+00 4.2705306e+00 4.5167418e+00 4.7492809e+00 4.7434820e+00 6.4559894e+00 6.7219631e+00 4.2203228e+00 5.2785016e+00 4.0892062e+00 6.4064788e+00 4.2099431e+00 5.0974437e+00 5.4524028e+00 4.0668599e+00 4.0812691e+00 4.9592063e+00 5.2286303e+00 5.7180923e+00 6.2307675e+00 5.0064170e+00 4.2321503e+00 4.6229380e+00 6.0019305e+00 5.0122051e+00 4.6942662e+00 3.9633621e+00 4.9439917e+00 5.1718087e+00 4.7987627e+00 4.2776245e+00 5.4056762e+00 5.2912244e+00 4.8042198e+00 4.3922906e+00 4.5752266e+00 4.7584719e+00 4.1971642e+00 1.3321121e+00 7.0210005e-01 4.4092035e-01 7.1370782e-01 5.6532807e-01 4.7384703e-01 5.4772047e-01 4.5332153e-01 2.5735380e-01 4.3039014e+00 3.8745926e+00 4.4661032e+00 3.3160908e+00 4.0800831e+00 3.6270564e+00 4.0341452e+00 2.5021288e+00 4.0328996e+00 3.0619969e+00 2.8852492e+00 3.4517722e+00 3.4117063e+00 3.9442659e+00 2.7742543e+00 3.9105969e+00 3.6313894e+00 3.2285832e+00 4.0672468e+00 3.0973242e+00 4.0774358e+00 3.3241258e+00 4.3364538e+00 3.9010050e+00 3.6839229e+00 3.8780758e+00 4.3546379e+00 4.5444242e+00 3.7704068e+00 2.7092764e+00 3.0281130e+00 2.9090888e+00 3.1192402e+00 4.3887860e+00 3.5903073e+00 3.7380731e+00 4.1984321e+00 3.9131529e+00 3.1895102e+00 3.2325394e+00 3.5143646e+00 3.8346178e+00 3.2404710e+00 2.5512062e+00 3.3611353e+00 3.2701469e+00 3.3309097e+00 3.5961760e+00 2.2440440e+00 3.2692333e+00 5.5695131e+00 4.4557473e+00 5.6480281e+00 4.9645103e+00 5.3587326e+00 6.4774167e+00 3.7821378e+00 5.9885236e+00 5.3785360e+00 5.9949246e+00 4.6408797e+00 4.8192753e+00 5.1765380e+00 4.4453659e+00 4.6747947e+00 4.9128348e+00 4.9315539e+00 6.6259647e+00 6.9179601e+00 4.4228869e+00 5.4510014e+00 4.2554322e+00 6.6058257e+00 4.3971908e+00 5.2716667e+00 5.6437144e+00 4.2501063e+00 4.2598090e+00 5.1411960e+00 5.4290948e+00 5.9159781e+00 6.4038547e+00 5.1851901e+00 4.4303951e+00 4.8280197e+00 6.1863687e+00 5.1684218e+00 4.8790484e+00 4.1393996e+00 5.1222567e+00 5.3410529e+00 4.9671528e+00 4.4557473e+00 5.5792298e+00 5.4533343e+00 4.9745668e+00 4.5799412e+00 4.7539927e+00 4.9141477e+00 4.3745338e+00 9.1899839e-01 1.4303716e+00 1.8025637e+00 7.9157919e-01 1.7017466e+00 9.2838064e-01 1.6904140e+00 1.1662169e+00 4.7093993e+00 4.2467851e+00 4.8138677e+00 3.1696415e+00 4.2866714e+00 3.7489248e+00 4.4236266e+00 2.2243004e+00 4.2940801e+00 3.0606378e+00 2.4619621e+00 3.7011660e+00 3.3035542e+00 4.1517816e+00 2.9627827e+00 4.2727093e+00 3.8304831e+00 3.3268796e+00 3.9985735e+00 3.0619969e+00 4.3786251e+00 3.5120285e+00 4.3932337e+00 4.0672273e+00 3.9396637e+00 4.1894763e+00 4.5825039e+00 4.8307891e+00 3.9725862e+00 2.7464807e+00 2.9216310e+00 2.7990155e+00 3.2202072e+00 4.4895673e+00 3.7617057e+00 4.1542139e+00 4.5419560e+00 3.8923322e+00 3.4091818e+00 3.1818063e+00 3.5143808e+00 4.0898677e+00 3.2882635e+00 2.2473999e+00 3.4262248e+00 3.5007881e+00 3.5100030e+00 3.8316087e+00 2.0754229e+00 3.4013080e+00 5.8752788e+00 4.5321122e+00 5.9237476e+00 5.1583834e+00 5.5934377e+00 6.7614421e+00 3.6324736e+00 6.2368989e+00 5.4633339e+00 6.4367934e+00 4.9762369e+00 4.9544309e+00 5.4448537e+00 4.4314359e+00 4.7862244e+00 5.2245215e+00 5.1817102e+00 7.1132668e+00 7.0848717e+00 4.3354396e+00 5.7824022e+00 4.3504021e+00 6.8356102e+00 4.5314742e+00 5.6265456e+00 5.9907948e+00 4.4171010e+00 4.4954886e+00 5.3045805e+00 5.7216093e+00 6.1433879e+00 6.9174004e+00 5.3474952e+00 4.6030052e+00 4.8955018e+00 6.4878557e+00 5.5241925e+00 5.1572104e+00 4.3686060e+00 5.4359071e+00 5.6275050e+00 5.2881916e+00 4.5321122e+00 5.8964909e+00 5.7992430e+00 5.2419050e+00 4.6343194e+00 5.0112565e+00 5.2739073e+00 4.5828488e+00 8.9555545e-01 1.1953982e+00 4.9210778e-01 1.0217326e+00 2.3011223e-01 1.0909410e+00 6.2604837e-01 4.6698095e+00 4.1932382e+00 4.8028665e+00 3.4266074e+00 4.3623987e+00 3.8078750e+00 4.3451425e+00 2.4743610e+00 4.3346170e+00 3.1590968e+00 2.8506673e+00 3.6985186e+00 3.5890472e+00 4.1847196e+00 2.9869868e+00 4.2539502e+00 3.8201151e+00 3.4248647e+00 4.2630901e+00 3.2460383e+00 4.3221849e+00 3.5848105e+00 4.5575135e+00 4.1294965e+00 3.9784751e+00 4.2004676e+00 4.6580868e+00 4.8489812e+00 4.0068409e+00 2.9020053e+00 3.1498255e+00 3.0311792e+00 3.3270383e+00 4.5855640e+00 3.7456780e+00 4.0377704e+00 4.5264010e+00 4.1316303e+00 3.3919437e+00 3.3637099e+00 3.6434140e+00 4.0896751e+00 3.4327446e+00 2.5460847e+00 3.5253587e+00 3.4838076e+00 3.5339670e+00 3.8664915e+00 2.3001295e+00 3.4649552e+00 5.8285974e+00 4.6295385e+00 5.9525950e+00 5.1980060e+00 5.6152265e+00 6.7943888e+00 3.7897707e+00 6.2865058e+00 5.6146092e+00 6.3533497e+00 4.9413657e+00 5.0571705e+00 5.4705740e+00 4.5925177e+00 4.8597383e+00 5.1947786e+00 5.1972136e+00 7.0077907e+00 7.2076794e+00 4.5799412e+00 5.7634125e+00 4.4164757e+00 6.9127102e+00 4.6374652e+00 5.5782078e+00 5.9685623e+00 4.4914626e+00 4.5043660e+00 5.3782406e+00 5.7438876e+00 6.2211842e+00 6.8091665e+00 5.4225077e+00 4.6705209e+00 5.0119853e+00 6.5264410e+00 5.4522692e+00 5.1436358e+00 4.3754531e+00 5.4373008e+00 5.6307204e+00 5.2933088e+00 4.6295385e+00 5.8761682e+00 5.7589066e+00 5.2703281e+00 4.8004175e+00 5.0311558e+00 5.1954837e+00 4.5872583e+00 5.1232775e-01 6.8946124e-01 5.3331654e-01 7.2032458e-01 5.8223100e-01 5.1470760e-01 3.9639692e+00 3.5073643e+00 4.1169483e+00 2.9563733e+00 3.7223346e+00 3.2567837e+00 3.6577913e+00 2.1583767e+00 3.6886399e+00 2.6736113e+00 2.5630404e+00 3.0688268e+00 3.0925062e+00 3.5776139e+00 2.3920089e+00 3.5620230e+00 3.2425998e+00 2.8850526e+00 3.7152210e+00 2.7467498e+00 3.6817698e+00 2.9651793e+00 3.9783131e+00 3.5488716e+00 3.3334687e+00 3.5269584e+00 4.0119001e+00 4.1796595e+00 3.3942940e+00 2.3683765e+00 2.6795593e+00 2.5699248e+00 2.7594122e+00 4.0143686e+00 3.1975756e+00 3.3501500e+00 3.8429672e+00 3.5736455e+00 2.8084369e+00 2.8645653e+00 3.1513816e+00 3.4658460e+00 2.8840875e+00 2.2134843e+00 2.9892749e+00 2.8998171e+00 2.9560486e+00 3.2382329e+00 1.8867894e+00 2.8964818e+00 5.1678417e+00 4.0639781e+00 5.2783329e+00 4.5872468e+00 4.9710431e+00 6.1193221e+00 3.3894905e+00 5.6356775e+00 5.0163452e+00 5.6132159e+00 4.2557385e+00 4.4419994e+00 4.7987786e+00 4.0516383e+00 4.2652177e+00 4.5157784e+00 4.5575064e+00 6.2656895e+00 6.5581405e+00 4.0647149e+00 5.0679966e+00 3.8527655e+00 6.2546558e+00 4.0205417e+00 4.8896094e+00 5.2866384e+00 3.8685207e+00 3.8726229e+00 4.7560164e+00 5.0823029e+00 5.5626962e+00 6.0557037e+00 4.7966587e+00 4.0667028e+00 4.4698988e+00 5.8249595e+00 4.7666481e+00 4.5015442e+00 3.7489248e+00 4.7463044e+00 4.9504523e+00 4.5847534e+00 4.0639781e+00 5.1941774e+00 5.0589949e+00 4.5871977e+00 4.2032935e+00 4.3711007e+00 4.5117083e+00 3.9838775e+00 1.0472948e+00 3.7328014e-01 1.0156040e+00 5.2951637e-01 7.8405165e-01 3.7805677e+00 3.3418492e+00 3.9434127e+00 2.9233988e+00 3.5930558e+00 3.1327017e+00 3.4815971e+00 2.1955292e+00 3.5346953e+00 2.6260524e+00 2.6107069e+00 2.9487044e+00 3.0306649e+00 3.4328299e+00 2.3177543e+00 3.4020303e+00 3.1142884e+00 2.7669527e+00 3.6510925e+00 2.6805198e+00 3.5329778e+00 2.8599837e+00 3.8659061e+00 3.3999719e+00 3.1952370e+00 3.3784752e+00 3.8644227e+00 4.0258337e+00 3.2675830e+00 2.3108048e+00 2.6364910e+00 2.5267214e+00 2.6718199e+00 3.8872575e+00 3.0754345e+00 3.1730273e+00 3.6778123e+00 3.4915999e+00 2.6851429e+00 2.8106973e+00 3.0523729e+00 3.3147273e+00 2.8011671e+00 2.2549905e+00 2.8959348e+00 2.7594122e+00 2.8365121e+00 3.1028192e+00 1.9467153e+00 2.7948633e+00 5.0053336e+00 3.9589722e+00 5.1149436e+00 4.4323632e+00 4.8208754e+00 5.9366163e+00 3.3572513e+00 5.4541198e+00 4.8811967e+00 5.4123754e+00 4.0998750e+00 4.3179941e+00 4.6496053e+00 3.9762736e+00 4.1795652e+00 4.3714999e+00 4.3949028e+00 6.0188938e+00 6.4012889e+00 3.9784960e+00 4.9059750e+00 3.7589330e+00 6.0780916e+00 3.9088130e+00 4.7101524e+00 5.0898591e+00 3.7540019e+00 3.7365671e+00 4.6239585e+00 4.8957326e+00 5.3971245e+00 5.8043713e+00 4.6697404e+00 3.9195419e+00 4.3198508e+00 5.6623762e+00 4.6010983e+00 4.3313381e+00 3.6188781e+00 4.5912578e+00 4.8064995e+00 4.4509659e+00 3.9589722e+00 5.0273918e+00 4.9005057e+00 4.4601775e+00 4.1096704e+00 4.2298718e+00 4.3478518e+00 3.8435638e+00 9.1650126e-01 3.1669465e-01 9.1073996e-01 3.9226391e-01 4.3244139e+00 3.8723048e+00 4.4584558e+00 3.0938436e+00 4.0057801e+00 3.5023081e+00 4.0445036e+00 2.1946697e+00 3.9789571e+00 2.8762921e+00 2.5476319e+00 3.3803875e+00 3.2116622e+00 3.8620501e+00 2.6602004e+00 3.9032211e+00 3.5378743e+00 3.0895187e+00 3.8941000e+00 2.9075924e+00 4.0440887e+00 3.2279947e+00 4.2082052e+00 3.8012458e+00 3.6223056e+00 3.8448810e+00 4.2936399e+00 4.5082002e+00 3.6840803e+00 2.5382161e+00 2.8116933e+00 2.6881446e+00 2.9816234e+00 4.2710531e+00 3.4828454e+00 3.7600837e+00 4.1854167e+00 3.7557494e+00 3.0959295e+00 3.0396577e+00 3.3411646e+00 3.7710984e+00 3.0864016e+00 2.2436585e+00 3.2109384e+00 3.1826071e+00 3.2238924e+00 3.5224232e+00 1.9740215e+00 3.1436031e+00 5.5575412e+00 4.3295593e+00 5.6179753e+00 4.8893530e+00 5.3067318e+00 6.4563792e+00 3.5535799e+00 5.9479718e+00 5.2719842e+00 6.0553675e+00 4.6322092e+00 4.7242645e+00 5.1395152e+00 4.2883757e+00 4.5672821e+00 4.8970139e+00 4.8809902e+00 6.7095610e+00 6.8558066e+00 4.2418314e+00 5.4486992e+00 4.1325286e+00 6.5641006e+00 4.2978293e+00 5.2792843e+00 5.6473437e+00 4.1599891e+00 4.1955189e+00 5.0588177e+00 5.4031378e+00 5.8692181e+00 6.4993890e+00 5.1033796e+00 4.3421953e+00 4.7019327e+00 6.1743517e+00 5.1795636e+00 4.8413460e+00 4.0705597e+00 5.1070993e+00 5.3158445e+00 4.9566991e+00 4.3295593e+00 5.5704251e+00 5.4607484e+00 4.9374642e+00 4.4554428e+00 4.7071790e+00 4.9248998e+00 4.2980002e+00 8.4665275e-01 2.5735380e-01 5.6532807e-01 4.0908889e+00 3.6735535e+00 4.2610649e+00 3.2379931e+00 3.9140403e+00 3.4688565e+00 3.8220331e+00 2.4872674e+00 3.8489164e+00 2.9640785e+00 2.8866578e+00 3.2891515e+00 3.3180876e+00 3.7661382e+00 2.6512518e+00 3.7170962e+00 3.4635365e+00 3.0824614e+00 3.9617965e+00 2.9934486e+00 3.8863978e+00 3.1796435e+00 4.1882919e+00 3.7244742e+00 3.5121329e+00 3.6951614e+00 4.1758508e+00 4.3538642e+00 3.6047998e+00 2.6122325e+00 2.9444779e+00 2.8278614e+00 2.9923745e+00 4.2251579e+00 3.4278812e+00 3.5231496e+00 3.9996975e+00 3.7952152e+00 3.0281130e+00 3.1344175e+00 3.3814413e+00 3.6498318e+00 3.1191808e+00 2.5411954e+00 3.2285788e+00 3.0973242e+00 3.1741873e+00 3.4266074e+00 2.2379935e+00 3.1280810e+00 5.3620144e+00 4.3061987e+00 5.4468764e+00 4.7739549e+00 5.1668956e+00 6.2616972e+00 3.6985186e+00 5.7771937e+00 5.2086322e+00 5.7530381e+00 4.4425854e+00 4.6544214e+00 4.9860894e+00 4.3210062e+00 4.5342266e+00 4.7213136e+00 4.7333736e+00 6.3477899e+00 6.7256701e+00 4.2999800e+00 5.2463582e+00 4.1121648e+00 6.3980968e+00 4.2428139e+00 5.0534183e+00 5.4164476e+00 4.0919603e+00 4.0819083e+00 4.9669434e+00 5.2144529e+00 5.7175939e+00 6.1234830e+00 5.0140958e+00 4.2505660e+00 4.6503153e+00 5.9849739e+00 4.9570448e+00 4.6735158e+00 3.9661096e+00 4.9257894e+00 5.1509778e+00 4.7854022e+00 4.3061987e+00 5.3710214e+00 5.2485033e+00 4.7994563e+00 4.4416551e+00 4.5702731e+00 4.7044691e+00 4.1938236e+00 9.0121124e-01 4.1800334e-01 4.4683404e+00 4.0041120e+00 4.6063104e+00 3.2675830e+00 4.1729164e+00 3.6395831e+00 4.1620210e+00 2.3424146e+00 4.1396770e+00 3.0122342e+00 2.7187877e+00 3.5220301e+00 3.4073937e+00 4.0052656e+00 2.8132921e+00 4.0556008e+00 3.6577913e+00 3.2450476e+00 4.0857879e+00 3.0758838e+00 4.1549346e+00 3.3974698e+00 4.3776727e+00 3.9480466e+00 3.7852701e+00 4.0045374e+00 4.4624254e+00 4.6600837e+00 3.8301037e+00 2.7201004e+00 2.9847094e+00 2.8635386e+00 3.1480500e+00 4.4161212e+00 3.5922016e+00 3.8621614e+00 4.3321657e+00 3.9470036e+00 3.2227849e+00 3.2022046e+00 3.4827563e+00 3.9088718e+00 3.2558259e+00 2.4079629e+00 3.3591012e+00 3.3099241e+00 3.3621521e+00 3.6786593e+00 2.1513981e+00 3.2927898e+00 5.6651753e+00 4.4704684e+00 5.7665138e+00 5.0249613e+00 5.4425100e+00 6.6041401e+00 3.6689358e+00 6.0969022e+00 5.4347583e+00 6.1711583e+00 4.7615528e+00 4.8812690e+00 5.2879689e+00 4.4389082e+00 4.7069065e+00 5.0227314e+00 5.0180562e+00 6.8183348e+00 7.0201427e+00 4.4122047e+00 5.5820519e+00 4.2646501e+00 6.7211196e+00 4.4601986e+00 5.3989343e+00 5.7782069e+00 4.3158080e+00 4.3316830e+00 5.2062091e+00 5.5504139e+00 6.0296334e+00 6.6134352e+00 5.2516336e+00 4.4905815e+00 4.8418108e+00 6.3335168e+00 5.2858991e+00 4.9668241e+00 4.2051848e+00 5.2517969e+00 5.4543634e+00 5.1086071e+00 4.4704684e+00 5.6980785e+00 5.5842764e+00 5.0906675e+00 4.6263279e+00 4.8522687e+00 5.0296094e+00 4.4223921e+00 5.3331654e-01 4.0480674e+00 3.6538311e+00 4.2253419e+00 3.2356807e+00 3.8808260e+00 3.4787846e+00 3.8158141e+00 2.5377251e+00 3.8128854e+00 3.0033277e+00 2.9160683e+00 3.2846611e+00 3.2778907e+00 3.7588055e+00 2.6484325e+00 3.6762336e+00 3.4865153e+00 3.0721579e+00 3.9269926e+00 2.9862105e+00 3.9013980e+00 3.1498255e+00 4.1652558e+00 3.7142161e+00 3.4773902e+00 3.6563233e+00 4.1340956e+00 4.3270664e+00 3.5985474e+00 2.5861730e+00 2.9394478e+00 2.8196854e+00 2.9762373e+00 4.2265251e+00 3.4662879e+00 3.5330767e+00 3.9675843e+00 3.7540019e+00 3.0429623e+00 3.1380860e+00 3.3977136e+00 3.6430191e+00 3.1031142e+00 2.5773443e+00 3.2356854e+00 3.1069819e+00 3.1803433e+00 3.4029769e+00 2.2618985e+00 3.1283784e+00 5.3780581e+00 4.3182367e+00 5.4237890e+00 4.7746911e+00 5.1647730e+00 6.2346766e+00 3.7662201e+00 5.7520660e+00 5.1877858e+00 5.7446472e+00 4.4325353e+00 4.6405391e+00 4.9665375e+00 4.3318572e+00 4.5481613e+00 4.7197396e+00 4.7258741e+00 6.3394885e+00 6.6939299e+00 4.2875400e+00 5.2316029e+00 4.1350697e+00 6.3660506e+00 4.2249330e+00 5.0487182e+00 5.3956990e+00 4.0792551e+00 4.0818570e+00 4.9610688e+00 5.1851901e+00 5.6838758e+00 6.1046357e+00 5.0082655e+00 4.2391682e+00 4.6534063e+00 5.9467267e+00 4.9701508e+00 4.6729059e+00 3.9694568e+00 4.9026892e+00 5.1398485e+00 4.7564553e+00 4.3182367e+00 5.3634473e+00 5.2439436e+00 4.7782327e+00 4.4215886e+00 4.5571007e+00 4.7192015e+00 4.2083617e+00 4.2394169e+00 3.8113482e+00 4.3955533e+00 3.1876597e+00 3.9916444e+00 3.5263174e+00 3.9792690e+00 2.3590658e+00 3.9444507e+00 2.9585074e+00 2.7245210e+00 3.3740440e+00 3.2707511e+00 3.8547240e+00 2.6837369e+00 3.8401183e+00 3.5498247e+00 3.1111814e+00 3.9479356e+00 2.9708115e+00 4.0179221e+00 3.2285788e+00 4.2303436e+00 3.7990084e+00 3.5955628e+00 3.8003093e+00 4.2644191e+00 4.4715617e+00 3.6846800e+00 2.5842954e+00 2.8951391e+00 2.7708600e+00 3.0107617e+00 4.2926805e+00 3.5079811e+00 3.6949441e+00 4.1282694e+00 3.7921875e+00 3.1029353e+00 3.1142884e+00 3.3974528e+00 3.7517193e+00 3.1258918e+00 2.4026142e+00 3.2545924e+00 3.1795772e+00 3.2374735e+00 3.5060560e+00 2.1124851e+00 3.1697649e+00 5.5234684e+00 4.3676336e+00 5.5805207e+00 4.8832280e+00 5.2917094e+00 6.4077639e+00 3.6776318e+00 5.9087379e+00 5.2810196e+00 5.9706138e+00 4.5860740e+00 4.7330858e+00 5.1105659e+00 4.3508736e+00 4.6055979e+00 4.8630046e+00 4.8568454e+00 6.6003712e+00 6.8359332e+00 4.3017625e+00 5.3989343e+00 4.1757599e+00 6.5261882e+00 4.3096974e+00 5.2208797e+00 5.5796123e+00 4.1677196e+00 4.1873326e+00 5.0631522e+00 5.3514199e+00 5.8356175e+00 6.3782571e+00 5.1095924e+00 4.3380784e+00 4.7210450e+00 6.1241735e+00 5.1323845e+00 4.8093338e+00 4.0672416e+00 5.0627871e+00 5.2858991e+00 4.9152237e+00 4.3676336e+00 5.5251070e+00 5.4111042e+00 4.9154459e+00 4.4855534e+00 4.6865292e+00 4.8780630e+00 4.2997611e+00 6.5721874e-01 2.8246002e-01 1.9878036e+00 6.8870991e-01 1.4145333e+00 7.5101750e-01 2.8278614e+00 5.4772047e-01 2.1107754e+00 2.8171009e+00 1.2735542e+00 1.7429550e+00 9.6720945e-01 1.8916259e+00 4.5762068e-01 1.4527830e+00 1.5755112e+00 1.3604193e+00 1.8891017e+00 1.2032352e+00 1.2809282e+00 1.0668324e+00 1.0407910e+00 8.3398998e-01 5.6852959e-01 4.7637957e-01 5.9997944e-01 1.0991700e+00 2.0319425e+00 2.0641139e+00 2.1408895e+00 1.6264080e+00 1.2685915e+00 1.6475838e+00 1.0888430e+00 3.4362433e-01 1.2451277e+00 1.5892459e+00 1.8893245e+00 1.7159829e+00 9.4214918e-01 1.6145409e+00 2.7885571e+00 1.6349103e+00 1.4702081e+00 1.4783426e+00 9.9540350e-01 2.8082548e+00 1.5537042e+00 1.9518774e+00 1.5319504e+00 1.4638897e+00 1.3252752e+00 1.5491559e+00 2.2062989e+00 2.3055594e+00 1.7547129e+00 1.4779091e+00 1.9303491e+00 9.3031410e-01 1.1919887e+00 1.1597901e+00 1.7159492e+00 1.7622422e+00 1.3094708e+00 1.1085186e+00 2.4658910e+00 2.6772106e+00 1.5222046e+00 1.4045169e+00 1.6557598e+00 2.3343395e+00 1.0333206e+00 1.3236866e+00 1.4078489e+00 1.0379897e+00 1.0701557e+00 1.4468867e+00 1.1827513e+00 1.6651806e+00 2.2264232e+00 1.5050620e+00 9.5844041e-01 1.4913364e+00 1.9218477e+00 1.6296655e+00 1.1449822e+00 1.1386148e+00 1.0459148e+00 1.4523426e+00 1.0280890e+00 1.5319504e+00 1.5771944e+00 1.5951052e+00 1.1490418e+00 1.2312232e+00 1.0156040e+00 1.5012593e+00 1.3103683e+00 6.7676105e-01 1.4684532e+00 4.3540658e-01 8.6709114e-01 2.8246002e-01 2.2832009e+00 4.5332153e-01 1.5061921e+00 2.3084864e+00 6.4713428e-01 1.3717954e+00 5.1232775e-01 1.3279285e+00 3.6384497e-01 8.3600668e-01 1.0886797e+00 1.0302943e+00 1.3803227e+00 6.9254136e-01 7.8651859e-01 8.4231031e-01 6.6234335e-01 4.3649025e-01 3.3820388e-01 6.9144557e-01 6.8946124e-01 5.1859441e-01 1.5543951e+00 1.5554645e+00 1.6462022e+00 1.1061493e+00 9.3960576e-01 1.0302943e+00 4.7637957e-01 3.9226391e-01 9.5134817e-01 9.8421557e-01 1.3410243e+00 1.1845013e+00 4.1053944e-01 1.1061493e+00 2.2589144e+00 1.0681908e+00 8.8978585e-01 8.8978585e-01 4.9309055e-01 2.2766488e+00 9.8084192e-01 1.8770657e+00 1.1454011e+00 1.7762469e+00 1.2207776e+00 1.5499973e+00 2.6155125e+00 1.7206680e+00 2.1411235e+00 1.6108505e+00 2.2170372e+00 8.2138146e-01 1.0799895e+00 1.3190232e+00 1.3104171e+00 1.3933806e+00 1.1757876e+00 1.0991700e+00 2.8679737e+00 3.0644296e+00 1.2430385e+00 1.6055229e+00 1.1769219e+00 2.7597721e+00 7.5966619e-01 1.4357436e+00 1.7922820e+00 6.6234335e-01 6.6234335e-01 1.3767616e+00 1.6051553e+00 2.0731138e+00 2.6897260e+00 1.4307662e+00 7.5761919e-01 1.3499561e+00 2.3509258e+00 1.5042921e+00 1.0704422e+00 6.6234335e-01 1.2660420e+00 1.5279134e+00 1.1915830e+00 1.1454011e+00 1.7341823e+00 1.6706458e+00 1.1887682e+00 1.0118519e+00 9.3405478e-01 1.3014540e+00 9.1700166e-01 1.9684957e+00 6.1854995e-01 1.3647837e+00 6.9905366e-01 2.8592245e+00 5.4862269e-01 2.1015927e+00 2.8245184e+00 1.2720490e+00 1.7608740e+00 8.8060445e-01 1.9469113e+00 5.6532807e-01 1.3911462e+00 1.6020568e+00 1.2736890e+00 1.9064467e+00 1.0787547e+00 1.3279285e+00 8.8184070e-01 9.7383980e-01 8.8112111e-01 6.2843180e-01 3.6384497e-01 3.3820388e-01 1.0407910e+00 2.0979682e+00 2.0803357e+00 2.1703863e+00 1.6614307e+00 1.0492910e+00 1.5817790e+00 1.0806255e+00 2.9394690e-01 1.2104597e+00 1.6051553e+00 1.8794697e+00 1.6715690e+00 8.9282147e-01 1.6324493e+00 2.8196576e+00 1.6178050e+00 1.4880236e+00 1.4799317e+00 1.0194781e+00 2.8641876e+00 1.5603234e+00 1.7152280e+00 1.3103683e+00 1.2385542e+00 1.0515237e+00 1.2809282e+00 2.0183160e+00 2.1983400e+00 1.5474285e+00 1.2034669e+00 1.7683485e+00 7.1767732e-01 9.2182836e-01 9.0114546e-01 1.5061921e+00 1.5434204e+00 1.0882435e+00 8.3398998e-01 2.3351809e+00 2.4743610e+00 1.3297856e+00 1.1835024e+00 1.4718910e+00 2.1455405e+00 8.2375853e-01 1.0954409e+00 1.2207776e+00 8.6552490e-01 8.8313857e-01 1.1700243e+00 9.8516226e-01 1.4624920e+00 2.1263508e+00 1.2312232e+00 7.3064040e-01 1.2519335e+00 1.7515914e+00 1.4144838e+00 8.8365404e-01 9.8516226e-01 8.1102313e-01 1.2096835e+00 8.3600668e-01 1.3103683e+00 1.3432471e+00 1.3774198e+00 9.1650126e-01 1.0030389e+00 7.5966619e-01 1.2970749e+00 1.0991700e+00 1.3607842e+00 7.7329583e-01 1.5922116e+00 1.0303583e+00 1.4634370e+00 5.4772047e-01 8.8546441e-01 9.0093031e-01 6.1555822e-01 1.1763288e+00 7.5761919e-01 1.5751867e+00 9.3405478e-01 6.3137460e-01 9.3405478e-01 3.3820388e-01 1.4598334e+00 8.1102313e-01 1.3014540e+00 1.1208575e+00 1.1767917e+00 1.4373651e+00 1.6915634e+00 1.8772025e+00 1.0156040e+00 7.3274750e-01 3.1669465e-01 4.5762068e-01 5.4772047e-01 1.3780319e+00 9.3405478e-01 1.4183937e+00 1.7145064e+00 9.2044891e-01 7.2312018e-01 2.0000000e-01 5.3331654e-01 1.1763288e+00 4.5762068e-01 9.5928453e-01 4.7637957e-01 7.8881249e-01 6.8724866e-01 1.0217326e+00 1.1581804e+00 5.6532807e-01 2.8385279e+00 1.4253337e+00 2.8771418e+00 2.0640283e+00 2.5081765e+00 3.7084294e+00 9.6235823e-01 3.1846707e+00 2.3377533e+00 3.4709180e+00 2.0185756e+00 1.8484646e+00 2.4107282e+00 1.3147960e+00 1.7633674e+00 2.2364785e+00 2.1263508e+00 4.1599629e+00 3.9852557e+00 1.1854166e+00 2.7700736e+00 1.3236514e+00 3.7746526e+00 1.4598334e+00 2.6187185e+00 2.9932954e+00 1.3732014e+00 1.4857417e+00 2.1940945e+00 2.7358967e+00 3.0997569e+00 4.0264813e+00 2.2405284e+00 1.5491559e+00 1.7926105e+00 3.4850773e+00 2.5451516e+00 2.1172899e+00 1.3732014e+00 2.4461105e+00 2.5976807e+00 2.3594585e+00 1.4253337e+00 2.8544314e+00 2.7987682e+00 2.2495783e+00 1.5193324e+00 1.9867860e+00 2.3192124e+00 1.5468108e+00 8.4611933e-01 5.7909019e-01 2.2813979e+00 2.5735380e-01 1.5345434e+00 2.2248332e+00 7.8452781e-01 1.1919887e+00 4.5227024e-01 1.4277283e+00 4.5332153e-01 9.4214918e-01 1.0630970e+00 7.0210005e-01 1.3252752e+00 8.5896323e-01 7.8452781e-01 4.9711212e-01 5.3331654e-01 4.1053944e-01 3.3820388e-01 3.9226391e-01 5.6492004e-01 5.2994606e-01 1.5491559e+00 1.4914761e+00 1.5909323e+00 1.0977646e+00 7.5712953e-01 1.1360956e+00 8.3163633e-01 3.9226391e-01 6.4388168e-01 1.1192461e+00 1.2840728e+00 1.1192863e+00 4.7637957e-01 1.0515237e+00 2.2349003e+00 1.0492910e+00 1.0171501e+00 9.6187679e-01 5.1232775e-01 2.2974823e+00 1.0064130e+00 1.8999048e+00 1.0118519e+00 1.6474701e+00 1.0991700e+00 1.4573870e+00 2.4785224e+00 1.6695674e+00 1.9731710e+00 1.3307960e+00 2.2400002e+00 8.6267904e-01 8.5236302e-01 1.2034669e+00 1.1385393e+00 1.3166006e+00 1.2072004e+00 9.9829999e-01 2.8808754e+00 2.8508657e+00 9.3031410e-01 1.5655251e+00 1.1213387e+00 2.5723009e+00 5.1232775e-01 1.4402005e+00 1.7239743e+00 4.9711212e-01 6.6234335e-01 1.2124972e+00 1.4638897e+00 1.8729437e+00 2.7059328e+00 1.2720490e+00 5.5129254e-01 1.1386148e+00 2.2158226e+00 1.5811595e+00 1.0394379e+00 6.8946124e-01 1.1933491e+00 1.4684856e+00 1.1385393e+00 1.0118519e+00 1.6928982e+00 1.6745950e+00 1.0954409e+00 7.2032458e-01 8.4665275e-01 1.4081318e+00 9.1700166e-01 9.1700166e-01 1.6129302e+00 9.1899839e-01 8.3163633e-01 1.5922116e+00 4.9309055e-01 9.5179250e-01 4.9210778e-01 9.1899839e-01 1.0787547e+00 3.1669465e-01 5.4772047e-01 8.4665275e-01 7.4188906e-01 7.8651859e-01 6.6464098e-01 8.5896323e-01 4.7637957e-01 7.5101750e-01 9.5134817e-01 1.1655453e+00 1.2685915e+00 3.9226391e-01 1.0909821e+00 9.0093031e-01 1.0171501e+00 6.3875221e-01 7.8283081e-01 4.3649025e-01 7.7206140e-01 1.1192863e+00 8.2138146e-01 4.7637957e-01 6.4713428e-01 3.3820388e-01 4.9210778e-01 5.7909019e-01 1.5946618e+00 3.4362433e-01 3.9226391e-01 3.2240315e-01 5.6532807e-01 1.7159829e+00 4.0000000e-01 2.2044816e+00 9.0114546e-01 2.2744972e+00 1.4238018e+00 1.8933957e+00 3.1083994e+00 9.8653440e-01 2.5818190e+00 1.8428588e+00 2.8198787e+00 1.3803227e+00 1.3028825e+00 1.8107019e+00 9.5928453e-01 1.2991526e+00 1.6217380e+00 1.4744533e+00 3.4812641e+00 3.4666679e+00 9.1700166e-01 2.1508192e+00 8.4231031e-01 3.2060614e+00 9.3960576e-01 1.9557722e+00 2.3426465e+00 8.1296182e-01 8.3749635e-01 1.6198404e+00 2.1141377e+00 2.5330826e+00 3.3548774e+00 1.6786797e+00 9.1524136e-01 1.2294495e+00 2.9167261e+00 1.8988898e+00 1.4400627e+00 7.3274750e-01 1.8408528e+00 2.0021076e+00 1.8072832e+00 9.0114546e-01 2.2229268e+00 2.1792674e+00 1.6935982e+00 1.1061493e+00 1.3762468e+00 1.6685659e+00 8.8112111e-01 2.4154150e+00 6.3137460e-01 1.5923387e+00 2.4436844e+00 7.5966619e-01 1.5600403e+00 5.1470760e-01 1.4779091e+00 6.1517707e-01 8.2787992e-01 1.2449008e+00 1.1440240e+00 1.5307091e+00 4.9210778e-01 9.9057455e-01 8.4611933e-01 7.0612170e-01 6.9144557e-01 5.9997944e-01 7.8405165e-01 6.3137460e-01 5.8223100e-01 1.7407116e+00 1.7043098e+00 1.8050393e+00 1.2744337e+00 8.2375853e-01 1.0070860e+00 3.9226391e-01 4.7637957e-01 1.1213789e+00 1.0828063e+00 1.4612037e+00 1.2536313e+00 4.5332153e-01 1.2673386e+00 2.3999876e+00 1.1700243e+00 9.9587193e-01 9.9587193e-01 6.9144557e-01 2.4299142e+00 1.1061493e+00 1.6379882e+00 9.9587193e-01 1.6486175e+00 1.0407910e+00 1.3670608e+00 2.4938337e+00 1.6904140e+00 2.0302857e+00 1.5116077e+00 2.0377636e+00 6.4597730e-01 9.5922196e-01 1.1853434e+00 1.1933491e+00 1.2225428e+00 9.7568128e-01 9.3970137e-01 2.7060020e+00 2.9522049e+00 1.2207776e+00 1.4454058e+00 1.0333206e+00 2.6538534e+00 6.8724866e-01 1.2430385e+00 1.6644111e+00 5.7909019e-01 4.9309055e-01 1.2138655e+00 1.5216304e+00 1.9804827e+00 2.5543080e+00 1.2660420e+00 6.7676105e-01 1.2357881e+00 2.2503086e+00 1.2583461e+00 8.8060445e-01 5.1232775e-01 1.1406668e+00 1.3619736e+00 1.0923450e+00 9.9587193e-01 1.5565652e+00 1.4776497e+00 1.0650316e+00 9.4210748e-01 7.8651859e-01 1.0459148e+00 7.2032458e-01 2.3357374e+00 8.9555545e-01 4.7637957e-01 1.6685659e+00 1.3726772e+00 2.0686305e+00 1.0233448e+00 2.3865658e+00 1.7005654e+00 1.3033091e+00 1.9523874e+00 9.7568128e-01 2.2813627e+00 1.5579918e+00 2.2964370e+00 1.9955439e+00 1.9981545e+00 2.2709780e+00 2.6129365e+00 2.8057677e+00 1.8916230e+00 8.7081316e-01 8.2138146e-01 7.4656027e-01 1.2034669e+00 2.3291732e+00 1.6118614e+00 2.1524024e+00 2.5850697e+00 1.8916259e+00 1.3466484e+00 1.0303583e+00 1.3412050e+00 2.0319425e+00 1.2357881e+00 1.4697345e-01 1.2904601e+00 1.4493603e+00 1.4276653e+00 1.8428588e+00 4.1053944e-01 1.3185819e+00 3.7336084e+00 2.3484924e+00 3.8470356e+00 3.0097734e+00 3.4561195e+00 4.6886388e+00 1.4411447e+00 4.1605612e+00 3.3409172e+00 4.3876376e+00 2.9196667e+00 2.8285913e+00 3.3674412e+00 2.2440440e+00 2.6381726e+00 3.1370899e+00 3.0702775e+00 5.0811244e+00 4.9925217e+00 2.1984088e+00 3.7100773e+00 2.1747009e+00 4.7662593e+00 2.4306366e+00 3.5395529e+00 3.9386997e+00 2.3174863e+00 2.3866983e+00 3.1598578e+00 3.6884878e+00 4.0868640e+00 4.9386141e+00 3.2041549e+00 2.4970599e+00 2.7343267e+00 4.4623245e+00 3.4193397e+00 3.0411642e+00 2.2573291e+00 3.3889561e+00 3.5370704e+00 3.2819827e+00 2.3484924e+00 3.7953537e+00 3.7154507e+00 3.1875854e+00 2.5189191e+00 2.9253105e+00 3.1767996e+00 2.4312113e+00 1.6375596e+00 2.2945623e+00 8.7691570e-01 1.2236984e+00 5.2994606e-01 1.4697345e+00 3.3820388e-01 1.0473756e+00 1.0681908e+00 8.7691570e-01 1.3748432e+00 9.9057455e-01 8.2138146e-01 6.6234335e-01 5.4442148e-01 3.7328014e-01 2.5735380e-01 3.3820388e-01 6.1435392e-01 6.5721874e-01 1.5665679e+00 1.5491559e+00 1.6324493e+00 1.1402466e+00 9.1700166e-01 1.2411560e+00 8.9333246e-01 3.3820388e-01 7.3064040e-01 1.1584102e+00 1.3767616e+00 1.1924221e+00 5.2994606e-01 1.1057186e+00 2.2911093e+00 1.1306561e+00 1.0280890e+00 1.0107479e+00 5.1859441e-01 2.3492729e+00 1.0704005e+00 2.0144323e+00 1.2104597e+00 1.6915634e+00 1.2063442e+00 1.5681093e+00 2.4903234e+00 1.8407914e+00 1.9776324e+00 1.4215976e+00 2.2741662e+00 9.6835294e-01 1.0194781e+00 1.2836546e+00 1.3593736e+00 1.5336952e+00 1.3410592e+00 1.0787133e+00 2.8634341e+00 2.8959536e+00 1.0923450e+00 1.6324791e+00 1.3236866e+00 2.5862603e+00 7.3274750e-01 1.4958377e+00 1.7122595e+00 7.1767732e-01 8.2330060e-01 1.3604193e+00 1.4357436e+00 1.8944855e+00 2.6649646e+00 1.4277283e+00 6.5951158e-01 1.2139032e+00 2.2422031e+00 1.6962978e+00 1.1192461e+00 8.5666462e-01 1.2564050e+00 1.5722940e+00 1.2325055e+00 1.2104597e+00 1.7624198e+00 1.7660601e+00 1.2200256e+00 9.4174091e-01 9.7568128e-01 1.5294202e+00 1.0630970e+00 9.8084192e-01 8.6552490e-01 1.0882435e+00 1.2764277e+00 5.8223100e-01 1.6836159e+00 8.3398998e-01 7.8452781e-01 1.3436157e+00 5.6852959e-01 1.4001664e+00 9.2838064e-01 1.5722940e+00 1.2836546e+00 1.3214975e+00 1.5629610e+00 1.8994439e+00 2.0027747e+00 1.0749691e+00 8.1199808e-01 5.6633242e-01 6.6234335e-01 6.4480630e-01 1.5152384e+00 7.4188906e-01 1.3204740e+00 1.8246274e+00 1.3350885e+00 5.8223100e-01 4.1053944e-01 6.5951158e-01 1.2377215e+00 6.6944640e-01 9.0664307e-01 5.3331654e-01 7.3274750e-01 6.5951158e-01 1.1386148e+00 1.0070860e+00 5.7909019e-01 2.8469646e+00 1.4998365e+00 3.0168845e+00 2.1701613e+00 2.5943893e+00 3.8749921e+00 8.0906455e-01 3.3651601e+00 2.5774483e+00 3.5194266e+00 2.0616978e+00 2.0082355e+00 2.5260285e+00 1.4402005e+00 1.7728842e+00 2.2589144e+00 2.2313693e+00 4.2354745e+00 4.2057121e+00 1.5336952e+00 2.8515819e+00 1.3014160e+00 3.9767141e+00 1.6186085e+00 2.6757536e+00 3.1222916e+00 1.4840812e+00 1.5236253e+00 2.3145888e+00 2.9071044e+00 3.2987266e+00 4.1159855e+00 2.3548983e+00 1.7030059e+00 1.9871740e+00 3.6492004e+00 2.5289433e+00 2.1908819e+00 1.3875188e+00 2.5499700e+00 2.6721077e+00 2.4470808e+00 1.4998365e+00 2.9306756e+00 2.8388706e+00 2.3401889e+00 1.7423350e+00 2.0748990e+00 2.2856851e+00 1.5579918e+00 1.7150796e+00 1.1777118e+00 2.0357430e+00 1.1845013e+00 2.3919294e+00 1.7313430e+00 1.2957415e+00 1.7473639e+00 9.3960576e-01 2.3029189e+00 1.5722357e+00 2.1632377e+00 1.9411652e+00 1.9875897e+00 2.2630934e+00 2.5377251e+00 2.7556052e+00 1.8797442e+00 9.5758668e-01 7.5966619e-01 7.0612170e-01 1.2258842e+00 2.2356528e+00 1.6560636e+00 2.2286066e+00 2.5682064e+00 1.7219993e+00 1.4334284e+00 9.8660996e-01 1.2840368e+00 2.0267507e+00 1.2104597e+00 3.7328014e-01 1.2828320e+00 1.5131717e+00 1.4673712e+00 1.8408528e+00 7.5712953e-01 1.3466484e+00 3.6897081e+00 2.2640356e+00 3.7553972e+00 2.9247866e+00 3.3772245e+00 4.5738715e+00 1.3986462e+00 4.0419624e+00 3.1822169e+00 4.3536078e+00 2.8991740e+00 2.7225044e+00 3.2942694e+00 2.1263508e+00 2.5784845e+00 3.1092510e+00 3.0003415e+00 5.0368158e+00 4.8305556e+00 1.9791420e+00 3.6535230e+00 2.1300632e+00 4.6271780e+00 2.3433917e+00 3.4976829e+00 3.8642372e+00 2.2575127e+00 2.3594585e+00 3.0608657e+00 3.5959895e+00 3.9612968e+00 4.9003439e+00 3.1062906e+00 2.4152652e+00 2.5989186e+00 4.3606663e+00 3.4041847e+00 2.9875992e+00 2.2407676e+00 3.3314512e+00 3.4765705e+00 3.2395729e+00 2.2640356e+00 3.7329248e+00 3.6751902e+00 3.1308228e+00 2.3883825e+00 2.8706710e+00 3.1747097e+00 2.3977824e+00 1.0151428e+00 5.7909019e-01 7.4188906e-01 8.5613620e-01 4.4092035e-01 6.2843180e-01 9.4210748e-01 8.2567325e-01 7.3064040e-01 4.3202390e-01 1.0030992e+00 6.8946124e-01 5.7909019e-01 7.5101750e-01 1.1554378e+00 1.2024806e+00 3.4362433e-01 1.0333206e+00 9.8618111e-01 1.0886797e+00 5.6633242e-01 9.8516226e-01 6.0246555e-01 5.4772047e-01 9.8447732e-01 9.0093031e-01 3.9226391e-01 7.4573804e-01 7.2032458e-01 4.7637957e-01 5.8223100e-01 1.6518105e+00 4.9711212e-01 3.7328014e-01 3.1669465e-01 4.1053944e-01 1.6773457e+00 3.8739477e-01 2.2157505e+00 1.0806255e+00 2.2736009e+00 1.5319539e+00 1.9265092e+00 3.1377114e+00 1.2325055e+00 2.6463748e+00 1.9740215e+00 2.7500302e+00 1.2840368e+00 1.3780319e+00 1.7822011e+00 1.1562968e+00 1.3540186e+00 1.5491559e+00 1.5168309e+00 3.4475844e+00 3.5372838e+00 1.1835024e+00 2.0991693e+00 9.9057455e-01 3.2677411e+00 9.7043733e-01 1.9271346e+00 2.3496981e+00 8.0906455e-01 8.1758743e-01 1.6907206e+00 2.1450099e+00 2.5774483e+00 3.2990803e+00 1.7367578e+00 1.0407910e+00 1.5083832e+00 2.8828852e+00 1.8560279e+00 1.4783426e+00 7.0210005e-01 1.7728842e+00 1.9557494e+00 1.6682560e+00 1.0806255e+00 2.2049480e+00 2.1173140e+00 1.6030860e+00 1.1769219e+00 1.3366492e+00 1.6129302e+00 9.6720945e-01 1.1372486e+00 1.0138644e+00 1.3593736e+00 1.2225428e+00 5.6532807e-01 7.7329583e-01 5.4772047e-01 1.6091131e+00 7.0210005e-01 1.1782318e+00 9.9777193e-01 9.7043733e-01 1.2303541e+00 1.4406492e+00 1.7441161e+00 1.0546860e+00 7.4863144e-01 6.1217218e-01 6.4713428e-01 6.1217218e-01 1.4171524e+00 1.3173259e+00 1.4998365e+00 1.5366523e+00 6.3137460e-01 9.9540350e-01 6.9254136e-01 8.3749635e-01 1.1449822e+00 5.1470760e-01 1.2720490e+00 7.8651859e-01 9.3970137e-01 8.8978585e-01 8.8978585e-01 1.4523426e+00 7.8283081e-01 2.9145756e+00 1.6100618e+00 2.7602010e+00 2.0499375e+00 2.5058703e+00 3.5478107e+00 1.5161253e+00 3.0121244e+00 2.2167088e+00 3.4098377e+00 1.9974862e+00 1.8102387e+00 2.3346152e+00 1.5609724e+00 1.9972247e+00 2.2774063e+00 2.0686620e+00 4.0308119e+00 3.8257964e+00 1.1505611e+00 2.7133406e+00 1.6332271e+00 3.5886881e+00 1.4276653e+00 2.5780587e+00 2.8385279e+00 1.3828911e+00 1.5424079e+00 2.1924418e+00 2.5354493e+00 2.9149681e+00 3.8539061e+00 2.2514822e+00 1.4646467e+00 1.7472679e+00 3.3206567e+00 2.6210448e+00 2.0881692e+00 1.4728460e+00 2.3553432e+00 2.5824042e+00 2.2905662e+00 1.6100618e+00 2.8162889e+00 2.8015113e+00 2.2157950e+00 1.4925600e+00 1.9557722e+00 2.4123453e+00 1.6789685e+00 1.2480823e+00 7.3064040e-01 5.7909019e-01 8.5896323e-01 7.6202456e-01 1.1385393e+00 5.8223100e-01 7.2312018e-01 5.2951637e-01 2.3011223e-01 5.3331654e-01 6.1555822e-01 7.2312018e-01 7.8283081e-01 2.5735380e-01 1.4231315e+00 1.3107930e+00 1.4192640e+00 9.3970137e-01 5.2951637e-01 7.6202456e-01 6.1217218e-01 6.5721874e-01 7.4188906e-01 8.3163633e-01 1.0718260e+00 8.0906455e-01 1.4697345e-01 8.8978585e-01 2.0406083e+00 7.8405165e-01 7.1767732e-01 6.7676105e-01 4.3540658e-01 2.1316761e+00 7.6855044e-01 1.8540209e+00 7.8651859e-01 1.8172450e+00 1.0407910e+00 1.4958377e+00 2.6533231e+00 1.3647837e+00 2.1332661e+00 1.4575430e+00 2.3717825e+00 9.4174091e-01 9.1700166e-01 1.3592345e+00 9.4174091e-01 1.1680137e+00 1.2316183e+00 1.0379897e+00 3.0193992e+00 3.0415959e+00 8.0213820e-01 1.7043386e+00 8.5666462e-01 2.7622934e+00 5.6492004e-01 1.5169505e+00 1.8740436e+00 4.5227024e-01 4.7637957e-01 1.2451277e+00 1.6434046e+00 2.0806654e+00 2.8782814e+00 1.3104170e+00 4.9210778e-01 9.6720945e-01 2.4468055e+00 1.5377264e+00 1.0171501e+00 4.5227024e-01 1.3762468e+00 1.5811595e+00 1.3619736e+00 7.8651859e-01 1.7915733e+00 1.7640987e+00 1.2660420e+00 7.8651859e-01 9.3960576e-01 1.3236514e+00 6.4597730e-01 1.4398518e+00 9.4214918e-01 6.8946124e-01 1.3893353e+00 5.6852959e-01 1.4303716e+00 6.7676105e-01 1.6178050e+00 1.2554395e+00 1.1042593e+00 1.3432471e+00 1.7748378e+00 1.9174005e+00 1.0407910e+00 4.7384703e-01 6.1217218e-01 6.2843180e-01 4.5332153e-01 1.6401427e+00 9.7388041e-01 1.2156057e+00 1.6580408e+00 1.2957415e+00 5.1514715e-01 6.0124032e-01 8.9282147e-01 1.1662169e+00 5.8223100e-01 1.0146116e+00 6.4480630e-01 6.3875221e-01 6.1313486e-01 9.5758668e-01 9.6235823e-01 5.2994606e-01 2.9341336e+00 1.6944819e+00 3.0030889e+00 2.2473999e+00 2.6564623e+00 3.8636573e+00 1.3593736e+00 3.3606874e+00 2.6554857e+00 3.4823060e+00 2.0192383e+00 2.0754229e+00 2.5120231e+00 1.6882272e+00 1.9519078e+00 2.2726077e+00 2.2502348e+00 4.1790666e+00 4.2446384e+00 1.7025540e+00 2.8337285e+00 1.5282823e+00 3.9783492e+00 1.6534078e+00 2.6681719e+00 3.0781176e+00 1.5061921e+00 1.5472287e+00 2.4004552e+00 2.8517015e+00 3.2832684e+00 4.0159102e+00 2.4437209e+00 1.7263643e+00 2.1298669e+00 3.5980353e+00 2.5736838e+00 2.2155544e+00 1.4215976e+00 2.5013872e+00 2.6836695e+00 2.3719380e+00 1.6944819e+00 2.9434072e+00 2.8456990e+00 2.3156665e+00 1.8238020e+00 2.0684494e+00 2.3250796e+00 1.6608506e+00 1.1242619e+00 1.1697694e+00 1.0787133e+00 1.4646467e+00 1.0379897e+00 8.3398998e-01 9.3960576e-01 8.0906455e-01 4.1053944e-01 1.4697345e-01 5.3331654e-01 7.0210005e-01 7.6202456e-01 1.5909323e+00 1.6368793e+00 1.7123442e+00 1.1871516e+00 1.1568326e+00 1.3212747e+00 8.2787992e-01 3.2240315e-01 9.2981943e-01 1.1733140e+00 1.4677697e+00 1.3563117e+00 6.5721874e-01 1.1871516e+00 2.3479033e+00 1.2294495e+00 1.0682703e+00 1.0682703e+00 5.7909019e-01 2.3558743e+00 1.1293899e+00 2.0886202e+00 1.4001664e+00 1.7749889e+00 1.3981073e+00 1.6904140e+00 2.5790193e+00 1.9767661e+00 2.1059276e+00 1.6351749e+00 2.2662023e+00 9.9777193e-01 1.2156057e+00 1.3625178e+00 1.5481556e+00 1.6518399e+00 1.3796817e+00 1.2294495e+00 2.8706603e+00 3.0214409e+00 1.3724528e+00 1.6644111e+00 1.4646467e+00 2.7037344e+00 9.2182836e-01 1.5437863e+00 1.7807817e+00 8.7480853e-01 9.3960576e-01 1.5274858e+00 1.5459941e+00 2.0142281e+00 2.6542592e+00 1.5832727e+00 9.1292896e-01 1.4998365e+00 2.2896642e+00 1.7346430e+00 1.2497843e+00 9.5844041e-01 1.2899766e+00 1.6220463e+00 1.2096835e+00 1.4001664e+00 1.8183379e+00 1.7879216e+00 1.2583461e+00 1.1454011e+00 1.0749691e+00 1.5609415e+00 1.2072004e+00 7.8651859e-01 1.0371888e+00 9.3031410e-01 5.9997944e-01 8.1025366e-01 1.0030992e+00 6.8946124e-01 8.8060445e-01 1.0174877e+00 1.2866008e+00 1.2662813e+00 4.1800334e-01 1.2504194e+00 1.0718260e+00 1.1915830e+00 8.0906455e-01 8.3398998e-01 2.0000000e-01 6.0124032e-01 1.1360956e+00 1.0668324e+00 4.6022445e-01 7.8405165e-01 5.4772047e-01 5.2994606e-01 7.8651859e-01 1.7005654e+00 4.9711212e-01 4.5762068e-01 4.1053944e-01 6.9905366e-01 1.7862883e+00 5.2951637e-01 2.0733603e+00 8.5896323e-01 2.2503926e+00 1.4047871e+00 1.8263804e+00 3.1042342e+00 9.2471857e-01 2.6066999e+00 1.9057595e+00 2.7207075e+00 1.2840368e+00 1.3185819e+00 1.7673081e+00 9.2989866e-01 1.1747785e+00 1.4952038e+00 1.4457984e+00 3.4168545e+00 3.4924517e+00 1.0799895e+00 2.0736597e+00 7.0612170e-01 3.2356539e+00 9.7043733e-01 1.8711424e+00 2.3274007e+00 8.0906455e-01 7.4863144e-01 1.5923387e+00 2.1450099e+00 2.5673091e+00 3.3070370e+00 1.6405793e+00 9.8891981e-01 1.3350885e+00 2.9010411e+00 1.7480793e+00 1.3859874e+00 6.1854995e-01 1.7877400e+00 1.9140252e+00 1.7318768e+00 8.5896323e-01 2.1436519e+00 2.0654790e+00 1.6198404e+00 1.1533322e+00 1.3166006e+00 1.5050620e+00 7.7206140e-01 9.7684577e-01 3.8739477e-01 1.2519335e+00 4.7384703e-01 1.1562968e+00 7.4188906e-01 7.6923870e-01 1.0492528e+00 1.3578169e+00 1.5865705e+00 7.4573804e-01 6.2604837e-01 5.6633242e-01 6.1854995e-01 2.9394690e-01 1.2311164e+00 8.7480853e-01 1.0923450e+00 1.3451855e+00 8.2567325e-01 4.9711212e-01 5.1232775e-01 5.1232775e-01 8.2567325e-01 2.5735380e-01 1.2667786e+00 3.9226391e-01 4.1053944e-01 4.1053944e-01 6.1517707e-01 1.3794976e+00 3.4362433e-01 2.6897260e+00 1.3977943e+00 2.6517953e+00 1.8703002e+00 2.3424616e+00 3.4694523e+00 1.2987575e+00 2.9321094e+00 2.2049480e+00 3.2222810e+00 1.7765340e+00 1.7055888e+00 2.2000566e+00 1.4277283e+00 1.7887389e+00 2.0616978e+00 1.8891017e+00 3.8528741e+00 3.8227002e+00 1.2324682e+00 2.5541952e+00 1.3604193e+00 3.5486694e+00 1.3098719e+00 2.3746954e+00 2.6968141e+00 1.2072004e+00 1.2836220e+00 2.0612387e+00 2.4301460e+00 2.8663357e+00 3.6861594e+00 2.1231905e+00 1.2939496e+00 1.6253780e+00 3.2567247e+00 2.3683313e+00 1.8724001e+00 1.1887682e+00 2.2106779e+00 2.4252094e+00 2.1549965e+00 1.3977943e+00 2.6481058e+00 2.6121229e+00 2.0786365e+00 1.4684532e+00 1.7816087e+00 2.1377129e+00 1.3859874e+00 1.0565750e+00 1.1782704e+00 8.5666462e-01 5.3331654e-01 7.4188906e-01 8.1489157e-01 9.3911501e-01 9.5922196e-01 1.1562968e+00 7.3987984e-01 1.3717954e+00 1.1568326e+00 1.2700883e+00 9.9587193e-01 8.5666462e-01 1.1757876e+00 1.2337308e+00 1.0909410e+00 2.8246002e-01 1.1644620e+00 9.9057455e-01 9.1292896e-01 8.3109521e-01 8.7480853e-01 1.8681385e+00 9.1700166e-01 1.0990923e+00 9.9057455e-01 7.7810927e-01 2.0274113e+00 9.6235823e-01 2.2422031e+00 1.0384427e+00 2.0771238e+00 1.4047871e+00 1.8113925e+00 2.8774681e+00 1.3747139e+00 2.3649698e+00 1.5180066e+00 2.7464028e+00 1.3863469e+00 1.1085186e+00 1.6513465e+00 9.8660996e-01 1.3933806e+00 1.6239962e+00 1.4276984e+00 3.4031135e+00 3.1239774e+00 5.5129254e-01 2.0322353e+00 1.1454011e+00 2.9230524e+00 7.5966619e-01 1.9285507e+00 2.2163128e+00 7.7206140e-01 9.9540350e-01 1.4859081e+00 1.9374619e+00 2.2514822e+00 3.2602216e+00 1.5368143e+00 8.9153488e-01 1.2108097e+00 2.6409739e+00 1.9796511e+00 1.4684856e+00 9.7383980e-01 1.6928814e+00 1.8845687e+00 1.6344501e+00 1.0384427e+00 2.1300632e+00 2.1186275e+00 1.5307091e+00 7.5966619e-01 1.2970749e+00 1.8014735e+00 1.1554024e+00 1.4673712e+00 6.5951158e-01 1.3509091e+00 1.0472948e+00 1.0590327e+00 1.3379499e+00 1.6431614e+00 1.8614930e+00 9.8618111e-01 4.5227024e-01 1.8410575e-01 2.8246002e-01 3.1669465e-01 1.4380165e+00 9.6235823e-01 1.3451855e+00 1.6441220e+00 9.5691303e-01 5.9902047e-01 2.5735380e-01 5.4442148e-01 1.1143033e+00 2.8246002e-01 9.2465413e-01 4.3649025e-01 6.2843180e-01 5.8223100e-01 9.0664307e-01 1.0620358e+00 4.5332153e-01 2.9077533e+00 1.5371009e+00 2.9111550e+00 2.1127974e+00 2.5720951e+00 3.7403700e+00 1.1685761e+00 3.2082263e+00 2.4147615e+00 3.4895439e+00 2.0275969e+00 1.9168808e+00 2.4468246e+00 1.4820439e+00 1.8955556e+00 2.2822698e+00 2.1513981e+00 4.1530383e+00 4.0556008e+00 1.3367012e+00 2.8043826e+00 1.4457984e+00 3.8130084e+00 1.5131717e+00 2.6393204e+00 2.9907513e+00 1.4144838e+00 1.5103492e+00 2.2726077e+00 2.7257916e+00 3.1300741e+00 3.9975895e+00 2.3260208e+00 1.5579918e+00 1.8466889e+00 3.5155378e+00 2.5927526e+00 2.1373682e+00 1.4001664e+00 2.4660819e+00 2.6524524e+00 2.3846236e+00 1.5371009e+00 2.8972307e+00 2.8456599e+00 2.2966038e+00 1.6198404e+00 2.0200470e+00 2.3595558e+00 1.5946618e+00 1.1085186e+00 9.1292896e-01 7.9516176e-01 9.8660996e-01 9.8084192e-01 1.1125321e+00 8.8060445e-01 5.6633242e-01 1.7459162e+00 1.6217380e+00 1.7427202e+00 1.2660420e+00 6.5951158e-01 7.3274750e-01 4.5332153e-01 8.9282147e-01 1.2520821e+00 9.9057455e-01 1.3317513e+00 1.0972454e+00 5.6492004e-01 1.2445090e+00 2.2771349e+00 1.0477446e+00 9.4769406e-01 9.1700166e-01 8.8546441e-01 2.3351809e+00 1.0333206e+00 1.5191633e+00 6.2843180e-01 1.7525060e+00 9.8653440e-01 1.3190232e+00 2.6168394e+00 1.3236866e+00 2.1666188e+00 1.5478692e+00 2.1377129e+00 7.3064040e-01 9.2989866e-01 1.2633607e+00 8.1489157e-01 8.3398998e-01 9.2052877e-01 9.8891981e-01 2.8641876e+00 3.0330103e+00 1.0991700e+00 1.5158711e+00 5.8223100e-01 2.7809761e+00 6.7676105e-01 1.3104170e+00 1.8383436e+00 5.1859441e-01 3.1669465e-01 1.1385393e+00 1.7413781e+00 2.1258131e+00 2.7719748e+00 1.1769219e+00 7.6219609e-01 1.1644620e+00 2.3977383e+00 1.1644620e+00 9.0121124e-01 2.3011223e-01 1.2660785e+00 1.3659450e+00 1.2139032e+00 6.2843180e-01 1.5890053e+00 1.4854016e+00 1.1085186e+00 8.7691570e-01 8.2107889e-01 9.1700166e-01 3.7328014e-01 1.0286345e+00 7.1163521e-01 4.5762068e-01 7.1767732e-01 1.1123689e+00 1.3190232e+00 5.7909019e-01 7.8651859e-01 8.2107889e-01 8.9555545e-01 3.6384497e-01 1.1733140e+00 9.5691303e-01 8.9333246e-01 1.0515237e+00 7.0612170e-01 5.6532807e-01 6.9033668e-01 7.9516176e-01 6.5721874e-01 3.9226391e-01 1.5161253e+00 5.6532807e-01 5.2951637e-01 4.7637957e-01 3.4362433e-01 1.5377576e+00 4.1800334e-01 2.5025469e+00 1.3499561e+00 2.4177825e+00 1.7322869e+00 2.1466658e+00 3.2584137e+00 1.4624920e+00 2.7481265e+00 2.0626658e+00 2.9587033e+00 1.5092160e+00 1.5231297e+00 1.9494463e+00 1.4002001e+00 1.6595694e+00 1.8102661e+00 1.7037308e+00 3.6205241e+00 3.6301040e+00 1.2385542e+00 2.2948971e+00 1.3166006e+00 3.3544405e+00 1.0991292e+00 2.1463190e+00 2.4853527e+00 9.8447732e-01 1.0909410e+00 1.8796137e+00 2.2304580e+00 2.6564427e+00 3.4397654e+00 1.9320258e+00 1.1556953e+00 1.6269162e+00 2.9913819e+00 2.1515219e+00 1.6970594e+00 1.0151428e+00 1.9363814e+00 2.1693152e+00 1.8311032e+00 1.3499561e+00 2.4161406e+00 2.3551335e+00 1.7866649e+00 1.2840728e+00 1.5347410e+00 1.9237915e+00 1.2914651e+00 5.4862269e-01 7.9516176e-01 8.2330060e-01 6.2843180e-01 7.1767732e-01 6.7953514e-01 1.6763131e+00 1.4958377e+00 1.6115427e+00 1.2325055e+00 4.5332153e-01 1.1601775e+00 1.0806255e+00 7.8452781e-01 5.9902047e-01 1.2700883e+00 1.2764277e+00 1.0472948e+00 6.5951158e-01 1.1293499e+00 2.2417803e+00 1.0874269e+00 1.1700243e+00 1.0923450e+00 7.9516176e-01 2.3781036e+00 1.1257411e+00 1.7915529e+00 7.4573804e-01 1.6094321e+00 9.0341870e-01 1.3410243e+00 2.4147721e+00 1.5020350e+00 1.8880126e+00 1.0723246e+00 2.2783970e+00 9.5691303e-01 6.4597730e-01 1.1919887e+00 8.2138146e-01 1.1490418e+00 1.2072004e+00 9.1700166e-01 2.9108742e+00 2.7057915e+00 4.5762068e-01 1.5742975e+00 9.5928453e-01 2.4762377e+00 3.7328014e-01 1.4406492e+00 1.7202988e+00 4.7384703e-01 6.4713428e-01 1.0303583e+00 1.4523100e+00 1.8005636e+00 2.7791947e+00 1.0977646e+00 3.7328014e-01 7.6202456e-01 2.2127888e+00 1.5420987e+00 9.5922196e-01 7.0427522e-01 1.2449008e+00 1.4468867e+00 1.2627492e+00 7.4573804e-01 1.6572731e+00 1.6749927e+00 1.1385393e+00 4.1800334e-01 8.4852602e-01 1.3859535e+00 7.8651859e-01 5.4772047e-01 6.8946124e-01 7.5101750e-01 9.1700166e-01 4.1053944e-01 1.3388928e+00 1.2217212e+00 1.3190232e+00 8.8313857e-01 6.1435392e-01 8.5299662e-01 7.9516176e-01 7.7206140e-01 6.5951158e-01 8.5666462e-01 1.0303583e+00 7.3064040e-01 3.1669465e-01 8.1758743e-01 1.9613334e+00 7.5712953e-01 7.0612170e-01 6.8870991e-01 4.5227024e-01 2.0776616e+00 7.5761919e-01 2.0214070e+00 9.1292896e-01 1.9316324e+00 1.1554378e+00 1.6393600e+00 2.7388456e+00 1.4054505e+00 2.1998297e+00 1.5097596e+00 2.5236542e+00 1.1298401e+00 1.0303583e+00 1.5012593e+00 1.0492528e+00 1.3407063e+00 1.4253337e+00 1.1644620e+00 3.1332512e+00 3.1095727e+00 7.8283081e-01 1.8575484e+00 1.0064130e+00 2.8244868e+00 6.9905366e-01 1.6685659e+00 1.9677114e+00 6.2604837e-01 6.8724866e-01 1.3728620e+00 1.7082203e+00 2.1487794e+00 2.9824717e+00 1.4457984e+00 5.6852959e-01 9.6485354e-01 2.5533687e+00 1.7254983e+00 1.1554024e+00 6.6944640e-01 1.5249182e+00 1.7466930e+00 1.5351388e+00 9.1292896e-01 1.9392077e+00 1.9377369e+00 1.4402005e+00 8.8978585e-01 1.1085186e+00 1.5212536e+00 8.2107889e-01 2.8246002e-01 6.8870991e-01 9.1292896e-01 5.1470760e-01 1.2171919e+00 1.2324682e+00 1.3107930e+00 7.9516176e-01 1.0171501e+00 1.0682703e+00 7.8651859e-01 6.1517707e-01 6.2604837e-01 8.4611933e-01 1.0723246e+00 9.8516226e-01 4.7384703e-01 7.8283081e-01 1.9560480e+00 8.4611933e-01 7.3446104e-01 7.1163521e-01 2.0000000e-01 1.9911718e+00 7.5101750e-01 2.2181434e+00 1.2627492e+00 2.0188852e+00 1.4312110e+00 1.8183379e+00 2.8413998e+00 1.6689878e+00 2.3335751e+00 1.7251395e+00 2.5689252e+00 1.1696125e+00 1.2311164e+00 1.5751867e+00 1.3736684e+00 1.5772174e+00 1.5159027e+00 1.3460537e+00 3.1952370e+00 3.2408786e+00 1.1568326e+00 1.9195433e+00 1.3028825e+00 2.9432427e+00 8.5666462e-01 1.7747547e+00 2.0591911e+00 7.8405165e-01 8.9333246e-01 1.5840466e+00 1.7977961e+00 2.2472880e+00 3.0012449e+00 1.6439127e+00 8.5613620e-01 1.4067865e+00 2.5782040e+00 1.8728132e+00 1.3563117e+00 8.7254337e-01 1.5491559e+00 1.8275349e+00 1.4744533e+00 1.2627492e+00 2.0489172e+00 2.0144323e+00 1.4523426e+00 1.0718260e+00 1.1984345e+00 1.6745950e+00 1.1367054e+00 5.1470760e-01 7.0210005e-01 6.3875221e-01 1.4855311e+00 1.5097596e+00 1.5900447e+00 1.0681908e+00 1.0515237e+00 1.2151435e+00 7.9516176e-01 3.6384497e-01 7.9157919e-01 1.0704422e+00 1.3350885e+00 1.2219675e+00 5.5129254e-01 1.0590327e+00 2.2299873e+00 1.0991700e+00 9.6485354e-01 9.5134817e-01 4.5227024e-01 2.2512501e+00 1.0070860e+00 2.0829547e+00 1.2970749e+00 1.8026015e+00 1.3476559e+00 1.6701710e+00 2.6196139e+00 1.8466889e+00 2.1327854e+00 1.5989791e+00 2.3299022e+00 9.9777193e-01 1.1490418e+00 1.3726772e+00 1.4333953e+00 1.5693668e+00 1.3710826e+00 1.2032352e+00 2.9487044e+00 3.0425215e+00 1.2445090e+00 1.7005591e+00 1.3607842e+00 2.7356334e+00 8.2567325e-01 1.5730672e+00 1.8330025e+00 7.7478955e-01 8.6267904e-01 1.4799317e+00 1.5831584e+00 2.0406345e+00 2.7441683e+00 1.5371009e+00 8.2787992e-01 1.4149400e+00 2.3383059e+00 1.7346430e+00 1.2294495e+00 8.7298051e-01 1.3236866e+00 1.6339706e+00 1.2451277e+00 1.2970749e+00 1.8452713e+00 1.8140029e+00 1.2583461e+00 1.0477446e+00 1.0457123e+00 1.5541920e+00 1.1292822e+00 4.5332153e-01 8.9282147e-01 1.8540209e+00 1.8102661e+00 1.9000091e+00 1.4277283e+00 9.1650126e-01 1.4770622e+00 1.1257411e+00 3.6384497e-01 8.7254337e-01 1.4638897e+00 1.6275968e+00 1.4310170e+00 7.7810927e-01 1.3774198e+00 2.5611380e+00 1.3942248e+00 1.3412050e+00 1.3062786e+00 8.3163633e-01 2.6320679e+00 1.3556291e+00 1.8916230e+00 1.2139032e+00 1.4213613e+00 1.0882435e+00 1.4027393e+00 2.1992227e+00 2.0115881e+00 1.6894120e+00 1.1680137e+00 2.0536527e+00 8.9555545e-01 8.7254337e-01 1.0584452e+00 1.3670608e+00 1.5159027e+00 1.2520821e+00 9.3620005e-01 2.6225471e+00 2.5811791e+00 1.0749691e+00 1.4127233e+00 1.3874623e+00 2.2778871e+00 6.8870991e-01 1.3236514e+00 1.4553799e+00 7.4656027e-01 8.7691570e-01 1.1996077e+00 1.1581804e+00 1.5843697e+00 2.4223596e+00 1.2667786e+00 6.1555822e-01 1.1322971e+00 1.9455098e+00 1.6094321e+00 1.0138644e+00 9.5275914e-01 1.0303583e+00 1.3859874e+00 1.0394379e+00 1.2139032e+00 1.5522286e+00 1.5950749e+00 1.0492910e+00 8.4852602e-01 8.5896323e-01 1.4792717e+00 1.1010130e+00 9.3405478e-01 2.0973307e+00 2.0292233e+00 2.1351020e+00 1.6324493e+00 8.0213820e-01 1.4475425e+00 1.0118519e+00 3.9226391e-01 1.1615141e+00 1.5522286e+00 1.7955319e+00 1.5755112e+00 8.2375853e-01 1.5909323e+00 2.7680519e+00 1.5351388e+00 1.4518406e+00 1.4189112e+00 1.0118519e+00 2.8285248e+00 1.4999501e+00 1.4598659e+00 1.0070860e+00 1.1125321e+00 7.6855044e-01 1.0064130e+00 1.9573733e+00 1.9913049e+00 1.4835751e+00 9.8447732e-01 1.6792769e+00 4.5332153e-01 5.9997944e-01 6.7676105e-01 1.2063442e+00 1.2172259e+00 8.0906455e-01 5.6532807e-01 2.3219228e+00 2.3809600e+00 1.1322971e+00 1.0194781e+00 1.1924221e+00 2.0898092e+00 5.4772047e-01 9.0341870e-01 1.1854166e+00 6.1217218e-01 6.2604837e-01 8.5896323e-01 9.8447732e-01 1.3963118e+00 2.1614971e+00 9.1700166e-01 5.2951637e-01 1.0565750e+00 1.6952221e+00 1.1615141e+00 6.2843180e-01 7.5101750e-01 6.4597730e-01 9.6666785e-01 6.6944640e-01 1.0070860e+00 1.1554378e+00 1.1618240e+00 6.4480630e-01 7.0612170e-01 4.3649025e-01 1.0384427e+00 8.2083495e-01 1.2601357e+00 1.1533322e+00 1.2668405e+00 7.6923870e-01 6.5721874e-01 6.1313486e-01 5.1514715e-01 7.7810927e-01 7.4188906e-01 6.4597730e-01 8.9665187e-01 7.0427522e-01 2.1601195e-01 7.3274750e-01 1.8662634e+00 6.1517707e-01 5.6633242e-01 4.9711212e-01 3.6821151e-01 1.9367046e+00 5.8223100e-01 1.9676343e+00 8.2107889e-01 1.9846262e+00 1.2132528e+00 1.6387387e+00 2.8401899e+00 1.2219675e+00 2.3341770e+00 1.6401077e+00 2.5110662e+00 1.0477446e+00 1.0590327e+00 1.5036272e+00 9.3205158e-01 1.1554378e+00 1.3185819e+00 1.2139032e+00 3.1938053e+00 3.2224781e+00 8.9160122e-01 1.8408528e+00 8.1199808e-01 2.9562053e+00 6.6234335e-01 1.6657696e+00 2.0661297e+00 5.1232775e-01 5.4772047e-01 1.3835659e+00 1.8491380e+00 2.2691691e+00 3.0549491e+00 1.4373651e+00 7.0210005e-01 1.1733140e+00 2.6078299e+00 1.6324493e+00 1.1871900e+00 4.5762068e-01 1.5134751e+00 1.6988414e+00 1.4493603e+00 8.2107889e-01 1.9363814e+00 1.8772025e+00 1.3592345e+00 8.7480853e-01 1.0630970e+00 1.4027057e+00 7.1370782e-01 4.5332153e-01 3.6821151e-01 4.9210778e-01 1.7926105e+00 1.2956031e+00 1.5427690e+00 1.8283349e+00 1.2316183e+00 8.3398998e-01 6.5951158e-01 9.6485354e-01 1.3705714e+00 5.6532807e-01 8.1758743e-01 8.0213820e-01 8.6709114e-01 8.5559597e-01 1.0990923e+00 8.3163633e-01 7.3064040e-01 3.2193425e+00 1.9047082e+00 3.1850618e+00 2.4409401e+00 2.8836334e+00 4.0169445e+00 1.5540671e+00 3.4918216e+00 2.7465418e+00 3.7379689e+00 2.2770786e+00 2.2341061e+00 2.7180425e+00 1.8717393e+00 2.2293780e+00 2.5544458e+00 2.4486887e+00 4.3963692e+00 4.3558392e+00 1.7251395e+00 3.0685817e+00 1.8079117e+00 4.0955432e+00 1.8123159e+00 2.9119047e+00 3.2503961e+00 1.7058678e+00 1.8018606e+00 2.5964637e+00 2.9813231e+00 3.4031824e+00 4.2141740e+00 2.6481754e+00 1.8652764e+00 2.2154195e+00 3.7627650e+00 2.8774681e+00 2.4356390e+00 1.6928982e+00 2.7153377e+00 2.9293866e+00 2.6065781e+00 1.9047082e+00 3.1801568e+00 3.1159134e+00 2.5506618e+00 1.9465762e+00 2.2948971e+00 2.6388276e+00 1.9237536e+00 1.4697345e-01 4.7384703e-01 1.5855051e+00 1.0718260e+00 1.5103492e+00 1.8184782e+00 1.0749691e+00 7.4188906e-01 3.1669465e-01 6.5721874e-01 1.2898589e+00 4.5332153e-01 7.5712953e-01 5.8223100e-01 7.9516176e-01 7.4573804e-01 1.0837483e+00 9.2981943e-01 6.1517707e-01 3.0545397e+00 1.6643846e+00 3.0699900e+00 2.2669967e+00 2.7228799e+00 3.8992460e+00 1.1763288e+00 3.3679952e+00 2.5553657e+00 3.6529541e+00 2.1899761e+00 2.0641139e+00 2.6044608e+00 1.5833003e+00 2.0100932e+00 2.4342274e+00 2.3130093e+00 4.3239738e+00 4.2004676e+00 1.4380165e+00 2.9630244e+00 1.5584126e+00 3.9677497e+00 1.6626371e+00 2.8023987e+00 3.1589757e+00 1.5670459e+00 1.6677116e+00 2.4179437e+00 2.8929117e+00 3.2867161e+00 4.1716873e+00 2.4688221e+00 1.7210327e+00 1.9894045e+00 3.6728497e+00 2.7440999e+00 2.3001295e+00 1.5543951e+00 2.6270252e+00 2.8043826e+00 2.5390625e+00 1.6643846e+00 3.0546060e+00 2.9996652e+00 2.4473968e+00 1.7515914e+00 2.1775889e+00 2.5110662e+00 1.7437852e+00 5.4862269e-01 1.7122595e+00 1.1915830e+00 1.6094321e+00 1.9088763e+00 1.1696125e+00 8.3398998e-01 4.5762068e-01 7.7810927e-01 1.3933806e+00 5.4862269e-01 6.7676105e-01 7.0427522e-01 8.8112111e-01 8.4852602e-01 1.1700243e+00 8.5236302e-01 7.2032458e-01 3.1856939e+00 1.8027925e+00 3.1858341e+00 2.3905722e+00 2.8503622e+00 4.0107971e+00 1.3028825e+00 3.4767067e+00 2.6744882e+00 3.7694836e+00 2.3066644e+00 2.1897560e+00 2.7233922e+00 1.7273093e+00 2.1515762e+00 2.5599966e+00 2.4312113e+00 4.4312174e+00 4.3165413e+00 1.5625820e+00 3.0827799e+00 1.6990751e+00 4.0772963e+00 1.7863188e+00 2.9208125e+00 3.2654193e+00 1.6911743e+00 1.7911109e+00 2.5472133e+00 2.9939122e+00 3.3956276e+00 4.2709145e+00 2.5997089e+00 1.8345729e+00 2.1059276e+00 3.7836927e+00 2.8713859e+00 2.4188374e+00 1.6792769e+00 2.7419615e+00 2.9295604e+00 2.6540378e+00 1.8027925e+00 3.1770794e+00 3.1243527e+00 2.5691821e+00 1.8802441e+00 2.2986296e+00 2.6372333e+00 1.8724001e+00 1.3144375e+00 8.9555545e-01 1.0923450e+00 1.3875188e+00 8.7254337e-01 4.5332153e-01 4.1053944e-01 6.1555822e-01 8.8978585e-01 1.4697345e-01 1.1644620e+00 3.9226391e-01 4.5762068e-01 4.1053944e-01 6.4597730e-01 1.2172259e+00 2.8246002e-01 2.7286769e+00 1.4345597e+00 2.7127643e+00 1.9542376e+00 2.3947580e+00 3.5535040e+00 1.2840368e+00 3.0318847e+00 2.2937123e+00 3.2614317e+00 1.7966657e+00 1.7567983e+00 2.2405515e+00 1.4398518e+00 1.7692666e+00 2.0702637e+00 1.9638667e+00 3.9293931e+00 3.9032211e+00 1.3181003e+00 2.5891296e+00 1.3604193e+00 3.6416936e+00 1.3366492e+00 2.4271936e+00 2.7851593e+00 1.2217212e+00 1.3108284e+00 2.1119362e+00 2.5294258e+00 2.9492821e+00 3.7626868e+00 2.1641917e+00 1.3887247e+00 1.7663888e+00 3.3072318e+00 2.3906184e+00 1.9476796e+00 1.2034669e+00 2.2432455e+00 2.4470808e+00 2.1465618e+00 1.4345597e+00 2.6949571e+00 2.6324683e+00 2.0786365e+00 1.4923551e+00 1.8113925e+00 2.1542048e+00 1.4357436e+00 9.5922196e-01 9.5758668e-01 9.5844041e-01 9.7043733e-01 1.2156433e+00 1.3181003e+00 1.0118519e+00 6.5951158e-01 1.2294495e+00 2.2980836e+00 1.0723246e+00 1.1311934e+00 1.0604579e+00 9.3970137e-01 2.4374492e+00 1.1293899e+00 1.5369832e+00 3.7328014e-01 1.5722357e+00 6.8946124e-01 1.1700243e+00 2.3922472e+00 1.3238340e+00 1.8757166e+00 1.0874269e+00 2.1729705e+00 8.6267904e-01 5.6852959e-01 1.1385393e+00 5.8223100e-01 8.4611933e-01 1.0333206e+00 7.8651859e-01 2.8325818e+00 2.7113084e+00 5.2994606e-01 1.4857417e+00 6.4597730e-01 2.4823078e+00 4.3649025e-01 1.3032602e+00 1.6850631e+00 4.5332153e-01 4.5332153e-01 8.7254337e-01 1.4816058e+00 1.8283379e+00 2.7452312e+00 9.3960576e-01 3.4362433e-01 5.7909019e-01 2.2311156e+00 1.2970749e+00 7.7478955e-01 4.9711212e-01 1.2156057e+00 1.3317513e+00 1.2736890e+00 3.7328014e-01 1.5307091e+00 1.5303550e+00 1.0977646e+00 5.1232775e-01 7.5966619e-01 1.1179012e+00 3.9226391e-01 7.5761919e-01 1.3316853e+00 1.2172259e+00 5.1470760e-01 7.8405165e-01 5.4772047e-01 7.2312018e-01 8.7480853e-01 1.6241526e+00 5.4862269e-01 5.5231726e-01 5.1232775e-01 8.8060445e-01 1.7251395e+00 6.1517707e-01 2.1650639e+00 9.4174091e-01 2.3987197e+00 1.5279134e+00 1.9467153e+00 3.2478740e+00 7.7329583e-01 2.7521741e+00 2.0401035e+00 2.8553305e+00 1.4402005e+00 1.4598659e+00 1.9185691e+00 9.8660996e-01 1.2402295e+00 1.6239962e+00 1.5890357e+00 3.5552374e+00 3.6285151e+00 1.1839103e+00 2.2158226e+00 7.4573804e-01 3.3799707e+00 1.1311934e+00 2.0073503e+00 2.4790107e+00 9.7383980e-01 9.0341870e-01 1.7152280e+00 2.3062243e+00 2.7208386e+00 3.4590012e+00 1.7607505e+00 1.1475725e+00 1.4373651e+00 3.0579467e+00 1.8525635e+00 1.5222046e+00 7.7206140e-01 1.9465762e+00 2.0479323e+00 1.8944855e+00 9.4174091e-01 2.2744972e+00 2.1918988e+00 1.7714914e+00 1.2955673e+00 1.4699627e+00 1.6104722e+00 8.8365404e-01 8.2787992e-01 1.2207776e+00 8.1439704e-01 1.2600991e+00 1.0882435e+00 4.9210778e-01 1.1085186e+00 2.1524024e+00 9.7043733e-01 7.6219609e-01 7.7407779e-01 6.8946124e-01 2.1650402e+00 8.9555545e-01 1.8520587e+00 1.0515237e+00 2.0053385e+00 1.3181003e+00 1.6569285e+00 2.8557693e+00 1.4820439e+00 2.3977383e+00 1.8452395e+00 2.3348642e+00 9.6235823e-01 1.2536313e+00 1.5294202e+00 1.2156057e+00 1.2627492e+00 1.2258842e+00 1.2685915e+00 3.0228034e+00 3.3112014e+00 1.3390974e+00 1.7708089e+00 9.8618111e-01 3.0228034e+00 9.3620005e-01 1.5565652e+00 2.0289823e+00 7.6923870e-01 6.4597730e-01 1.4961759e+00 1.9030337e+00 2.3558743e+00 2.8851693e+00 1.5405467e+00 9.5922196e-01 1.4398518e+00 2.6164252e+00 1.4578015e+00 1.1871900e+00 5.6852959e-01 1.4925280e+00 1.6626371e+00 1.4144838e+00 1.0515237e+00 1.8692080e+00 1.7569289e+00 1.3736684e+00 1.1782318e+00 1.1054520e+00 1.2096835e+00 7.9516176e-01 1.0171501e+00 1.3238340e+00 1.6145409e+00 1.4303716e+00 6.3875221e-01 1.3668829e+00 2.5488330e+00 1.3523437e+00 1.2139032e+00 1.2043706e+00 7.4573804e-01 2.5834420e+00 1.2840728e+00 1.7896753e+00 1.2073534e+00 1.4677697e+00 1.1010130e+00 1.3794976e+00 2.2824407e+00 1.9703245e+00 1.8062706e+00 1.3430160e+00 1.9758209e+00 7.1767732e-01 9.4174091e-01 1.0541806e+00 1.3863469e+00 1.4538178e+00 1.1057186e+00 9.1650126e-01 2.5871910e+00 2.7284127e+00 1.2377215e+00 1.3604193e+00 1.3181003e+00 2.4134996e+00 7.2032458e-01 1.2311164e+00 1.4783426e+00 7.0427522e-01 7.4188906e-01 1.2316183e+00 1.2554395e+00 1.7239743e+00 2.3906184e+00 1.2904601e+00 6.7953514e-01 1.2660420e+00 2.0112380e+00 1.4538178e+00 9.4210748e-01 8.0213820e-01 9.8891981e-01 1.3227610e+00 9.5275914e-01 1.2073534e+00 1.5058557e+00 1.4921296e+00 9.8447732e-01 9.4174091e-01 7.8405165e-01 1.2970749e+00 9.9540350e-01 1.0895683e+00 9.5275914e-01 8.8313857e-01 7.8881249e-01 7.5966619e-01 1.8085284e+00 8.6709114e-01 9.9777193e-01 9.1524136e-01 6.2604837e-01 1.9513626e+00 8.8365404e-01 2.3678206e+00 1.2076019e+00 2.1418745e+00 1.4998365e+00 1.9218477e+00 2.9320874e+00 1.5083832e+00 2.4072091e+00 1.6139369e+00 2.8090977e+00 1.4429618e+00 1.2217212e+00 1.7255588e+00 1.1953982e+00 1.5836883e+00 1.7257669e+00 1.4923551e+00 3.4337653e+00 3.2078247e+00 7.4188906e-01 2.1084966e+00 1.3104171e+00 2.9767301e+00 8.6267904e-01 1.9945039e+00 2.2405284e+00 8.7254337e-01 1.0837483e+00 1.6115427e+00 1.9413083e+00 2.2982288e+00 3.2649452e+00 1.6706166e+00 9.2471857e-01 1.2866008e+00 2.6952473e+00 2.0879727e+00 1.5336952e+00 1.0650316e+00 1.7496171e+00 1.9855284e+00 1.6982382e+00 1.2076019e+00 2.2162895e+00 2.2148364e+00 1.6217380e+00 9.1524136e-01 1.3762468e+00 1.9092603e+00 1.2673386e+00 5.2994606e-01 5.4772047e-01 7.4606482e-01 4.9210778e-01 1.3466484e+00 3.2240315e-01 1.8410575e-01 1.8410575e-01 6.5721874e-01 1.3933016e+00 2.3011223e-01 2.5002155e+00 1.2840728e+00 2.6104638e+00 1.8080903e+00 2.2351369e+00 3.4631029e+00 1.1054520e+00 2.9562053e+00 2.2662023e+00 3.0855380e+00 1.6296655e+00 1.6897507e+00 2.1269404e+00 1.3236514e+00 1.5874529e+00 1.8792115e+00 1.8228707e+00 3.7666735e+00 3.8604588e+00 1.3619736e+00 2.4422551e+00 1.1322971e+00 3.5872908e+00 1.2970749e+00 2.2490214e+00 2.6675102e+00 1.1406668e+00 1.1287359e+00 1.9955763e+00 2.4570996e+00 2.9046853e+00 3.6240551e+00 2.0455930e+00 1.3147960e+00 1.6894120e+00 3.2369414e+00 2.1542048e+00 1.7734694e+00 1.0030992e+00 2.1276036e+00 2.2961827e+00 2.0434189e+00 1.2840728e+00 2.5320840e+00 2.4507547e+00 1.9653317e+00 1.4857417e+00 1.6786797e+00 1.9064467e+00 1.2063442e+00 4.3540658e-01 1.0546280e+00 3.4362433e-01 9.9057455e-01 3.1669465e-01 6.1217218e-01 5.1470760e-01 9.0341870e-01 1.1306561e+00 3.9226391e-01 2.7578450e+00 1.3670608e+00 2.8196576e+00 1.9989416e+00 2.4438743e+00 3.6616479e+00 9.3031410e-01 3.1389840e+00 2.3221684e+00 3.3845625e+00 1.9213544e+00 1.8014297e+00 2.3443032e+00 1.2899766e+00 1.7015630e+00 2.1472143e+00 2.0526972e+00 4.0756015e+00 3.9670892e+00 1.2325055e+00 2.6952473e+00 1.2451277e+00 3.7413882e+00 1.4027057e+00 2.5325041e+00 2.9230687e+00 1.2970749e+00 1.3863130e+00 2.1424459e+00 2.6760041e+00 3.0607556e+00 3.9398465e+00 2.1897560e+00 1.4803412e+00 1.7579824e+00 3.4358825e+00 2.4489963e+00 2.0334992e+00 1.2668405e+00 2.3717375e+00 2.5268908e+00 2.2828439e+00 1.3670608e+00 2.7814220e+00 2.7171451e+00 2.1792674e+00 1.4972629e+00 1.9088763e+00 2.2153360e+00 1.4507265e+00 8.2107889e-01 5.1859441e-01 1.3181003e+00 2.8246002e-01 5.1470760e-01 4.5332153e-01 8.0213820e-01 1.4925860e+00 4.5332153e-01 2.4801618e+00 1.0977646e+00 2.5584526e+00 1.6897507e+00 2.1674967e+00 3.3801060e+00 8.3163633e-01 2.8455432e+00 2.0484313e+00 3.1308228e+00 1.6982382e+00 1.5483151e+00 2.1025587e+00 1.0749691e+00 1.5038592e+00 1.9216051e+00 1.7640987e+00 3.7893520e+00 3.6973464e+00 9.9587193e-01 2.4511646e+00 1.0151428e+00 3.4593388e+00 1.1915830e+00 2.2618715e+00 2.6367042e+00 1.0923450e+00 1.1454011e+00 1.8742727e+00 2.3947541e+00 2.7937993e+00 3.6680066e+00 1.9316324e+00 1.1887682e+00 1.4042001e+00 3.1994739e+00 2.1944908e+00 1.7364947e+00 1.0384427e+00 2.1441314e+00 2.2926342e+00 2.1095429e+00 1.0977646e+00 2.5161786e+00 2.4781500e+00 1.9855284e+00 1.3028825e+00 1.6749927e+00 1.9680118e+00 1.1615141e+00 8.5896323e-01 2.0085907e+00 7.5966619e-01 6.3338930e-01 6.1435392e-01 3.6384497e-01 2.0784777e+00 7.1767732e-01 1.9047147e+00 8.8546441e-01 1.8849071e+00 1.1386148e+00 1.5690556e+00 2.7266412e+00 1.3887247e+00 2.2181434e+00 1.5755112e+00 2.4035704e+00 9.6235823e-01 1.0233448e+00 1.4199495e+00 1.0384427e+00 1.2325055e+00 1.2633607e+00 1.1125321e+00 3.0563080e+00 3.1367022e+00 9.3911501e-01 1.7502061e+00 9.1700166e-01 2.8496590e+00 6.6234335e-01 1.5600403e+00 1.9303491e+00 5.2951637e-01 5.1859441e-01 1.3410592e+00 1.7115133e+00 2.1663269e+00 2.9076356e+00 1.4027393e+00 6.1217218e-01 1.1025851e+00 2.5076929e+00 1.5681033e+00 1.0806255e+00 4.7637957e-01 1.4202798e+00 1.6318832e+00 1.3859535e+00 8.8546441e-01 1.8452395e+00 1.8023884e+00 1.3094708e+00 8.9665187e-01 9.9422425e-01 1.3448172e+00 7.0612170e-01 1.1887682e+00 3.3820388e-01 4.7637957e-01 4.1053944e-01 6.3137460e-01 1.2792956e+00 2.8246002e-01 2.6805198e+00 1.3556291e+00 2.6549042e+00 1.8852034e+00 2.3342617e+00 3.4896130e+00 1.2138655e+00 2.9632703e+00 2.1966168e+00 3.2269103e+00 1.7652486e+00 1.6800657e+00 2.1882265e+00 1.3432471e+00 1.7115133e+00 2.0335992e+00 1.9055734e+00 3.8915018e+00 3.8196105e+00 1.1871900e+00 2.5446788e+00 1.3014540e+00 3.5690077e+00 1.2660420e+00 2.3847719e+00 2.7338343e+00 1.1644620e+00 1.2677246e+00 2.0409174e+00 2.4715762e+00 2.8801781e+00 3.7303675e+00 2.0945897e+00 1.3181003e+00 1.6637160e+00 3.2525896e+00 2.3556366e+00 1.8947655e+00 1.1644620e+00 2.2000332e+00 2.3995489e+00 2.1143184e+00 1.3556291e+00 2.6454380e+00 2.5927526e+00 2.0357430e+00 1.3986462e+00 1.7633931e+00 2.1241736e+00 1.3835659e+00 1.2677246e+00 1.4429618e+00 1.4144838e+00 1.8072832e+00 4.1053944e-01 1.2970749e+00 3.7227347e+00 2.3258546e+00 3.8082035e+00 2.9826893e+00 3.4296562e+00 4.6457092e+00 1.4638897e+00 4.1168689e+00 3.2893135e+00 4.3656061e+00 2.8965984e+00 2.7885571e+00 3.3321829e+00 2.2137206e+00 2.6220139e+00 3.1182895e+00 3.0411642e+00 5.0565550e+00 4.9393397e+00 2.1305662e+00 3.6809719e+00 2.1649816e+00 4.7167802e+00 2.3890868e+00 3.5174913e+00 3.9040070e+00 2.2832009e+00 2.3661912e+00 3.1271225e+00 3.6458861e+00 4.0373289e+00 4.9098442e+00 3.1717856e+00 2.4610945e+00 2.6988696e+00 4.4156477e+00 3.4106707e+00 3.0184321e+00 2.2400002e+00 3.3544705e+00 3.5089416e+00 3.2465921e+00 2.3258546e+00 3.7692111e+00 3.6942331e+00 3.1535672e+00 2.4682353e+00 2.8950380e+00 3.1706210e+00 2.4188374e+00 3.4362433e-01 2.3011223e-01 6.5721874e-01 1.3801707e+00 1.8410575e-01 2.4974859e+00 1.1475725e+00 2.5670804e+00 1.7367578e+00 2.1897560e+00 3.4105171e+00 9.3620005e-01 2.8872336e+00 2.1177359e+00 3.1128283e+00 1.6518105e+00 1.5710926e+00 2.0919814e+00 1.1402466e+00 1.5042921e+00 1.8894860e+00 1.7832346e+00 3.7930048e+00 3.7497045e+00 1.1085186e+00 2.4358319e+00 1.0373927e+00 3.5025170e+00 1.1763820e+00 2.2573291e+00 2.6516444e+00 1.0546280e+00 1.1143033e+00 1.9038590e+00 2.4150835e+00 2.8217216e+00 3.6583509e+00 1.9557494e+00 1.2172259e+00 1.5305080e+00 3.1949121e+00 2.1816524e+00 1.7549475e+00 9.9587193e-01 2.1157827e+00 2.2772725e+00 2.0445417e+00 1.1475725e+00 2.5189377e+00 2.4585123e+00 1.9417101e+00 1.3204740e+00 1.6518399e+00 1.9455413e+00 1.1782318e+00 1.4697345e-01 5.4442148e-01 1.5061921e+00 2.5735380e-01 2.4445294e+00 1.2451277e+00 2.5147113e+00 1.7169134e+00 2.1599789e+00 3.3552844e+00 1.1853434e+00 2.8401899e+00 2.1649816e+00 3.0063371e+00 1.5577992e+00 1.6090566e+00 2.0429653e+00 1.3098719e+00 1.5833003e+00 1.8259134e+00 1.7261951e+00 3.6641161e+00 3.7581572e+00 1.2836220e+00 2.3641283e+00 1.1402466e+00 3.4744384e+00 1.2236984e+00 2.1650639e+00 2.5544703e+00 1.0754096e+00 1.0634702e+00 1.9218477e+00 2.3337495e+00 2.7937993e+00 3.5144947e+00 1.9780982e+00 1.2034669e+00 1.5776250e+00 3.1403578e+00 2.1030473e+00 1.6800657e+00 9.5008395e-01 2.0435809e+00 2.2302338e+00 1.9796511e+00 1.2451277e+00 2.4529480e+00 2.3884044e+00 1.9040060e+00 1.4206323e+00 1.6030860e+00 1.8597148e+00 1.1475725e+00 5.1514715e-01 1.4837781e+00 1.4697345e-01 2.4069338e+00 1.1554378e+00 2.4767059e+00 1.6704807e+00 2.1124851e+00 3.3251835e+00 1.0901424e+00 2.8093506e+00 2.1024013e+00 2.9860936e+00 1.5249182e+00 1.5368143e+00 1.9979624e+00 1.1996077e+00 1.4884602e+00 1.7816087e+00 1.6915634e+00 3.6612234e+00 3.7068599e+00 1.1887682e+00 2.3282275e+00 1.0459148e+00 3.4368777e+00 1.1406668e+00 2.1408895e+00 2.5407367e+00 9.9383032e-01 1.0118519e+00 1.8559195e+00 2.3162603e+00 2.7528120e+00 3.5175550e+00 1.9088530e+00 1.1554378e+00 1.5319539e+00 3.1020720e+00 2.0702637e+00 1.6534078e+00 8.9333246e-01 2.0060777e+00 2.1824640e+00 1.9316324e+00 1.1554378e+00 2.4181048e+00 2.3500935e+00 1.8464547e+00 1.3246867e+00 1.5540671e+00 1.8283349e+00 1.0991292e+00 1.8540209e+00 5.6532807e-01 2.2181434e+00 1.1644620e+00 2.1124851e+00 1.4312110e+00 1.8520587e+00 2.9468162e+00 1.4872699e+00 2.4333796e+00 1.7862883e+00 2.6541889e+00 1.2171919e+00 1.2568636e+00 1.6534142e+00 1.2673386e+00 1.4958377e+00 1.5377576e+00 1.3887247e+00 3.2972769e+00 3.3417988e+00 1.0874269e+00 1.9971187e+00 1.1763288e+00 3.0519993e+00 8.5666462e-01 1.8345729e+00 2.1603261e+00 7.4606482e-01 8.3163633e-01 1.6051553e+00 1.9099532e+00 2.3580197e+00 3.1202655e+00 1.6644111e+00 8.5613620e-01 1.3645666e+00 2.6986529e+00 1.8728132e+00 1.3801707e+00 7.8405165e-01 1.6405793e+00 1.8860063e+00 1.5693668e+00 1.1644620e+00 2.1127659e+00 2.0686305e+00 1.5221731e+00 1.0718260e+00 1.2451277e+00 1.6541975e+00 1.0472948e+00 1.3670608e+00 3.8111468e+00 2.4594374e+00 3.8964123e+00 3.1060653e+00 3.5310232e+00 4.7500280e+00 1.6742782e+00 4.2334360e+00 3.4388948e+00 4.4153061e+00 2.9449440e+00 2.9022008e+00 3.4082074e+00 2.3648687e+00 2.7174185e+00 3.1740400e+00 3.1414379e+00 5.1204826e+00 5.0692804e+00 2.3390721e+00 3.7453837e+00 2.2787364e+00 4.8360274e+00 2.4843443e+00 3.5890472e+00 3.9914253e+00 2.3649698e+00 2.4420865e+00 3.2408786e+00 3.7425255e+00 4.1445584e+00 4.9604117e+00 3.2812652e+00 2.5773866e+00 2.8803800e+00 4.4890278e+00 3.4730681e+00 3.1152728e+00 2.3122536e+00 3.4133183e+00 3.5771591e+00 3.2770349e+00 2.4594374e+00 3.8483201e+00 3.7524591e+00 3.2055147e+00 2.5885371e+00 2.9666555e+00 3.2268584e+00 2.5215474e+00 2.5122465e+00 1.2200256e+00 2.5618564e+00 1.7635458e+00 2.2049480e+00 3.4109783e+00 1.0901424e+00 2.8929456e+00 2.1603261e+00 3.0888988e+00 1.6217380e+00 1.5995876e+00 2.0821863e+00 1.2377215e+00 1.5508288e+00 1.8772025e+00 1.7872466e+00 3.7688161e+00 3.7735788e+00 1.2034669e+00 2.4209193e+00 1.1123689e+00 3.5117059e+00 1.1915830e+00 2.2448113e+00 2.6373206e+00 1.0546860e+00 1.1085186e+00 1.9314051e+00 2.4023781e+00 2.8240517e+00 3.6213632e+00 1.9827165e+00 1.2311164e+00 1.6029116e+00 3.1791196e+00 2.1778654e+00 1.7578437e+00 9.9057455e-01 2.0919814e+00 2.2707854e+00 2.0066085e+00 1.2200256e+00 2.5150514e+00 2.4468246e+00 1.9222528e+00 1.3599646e+00 1.6405793e+00 1.9377369e+00 1.2043706e+00 1.4333953e+00 9.9540350e-01 9.4929639e-01 5.4862269e-01 1.5918557e+00 2.5112295e+00 1.4002001e+00 1.2258842e+00 9.7621887e-01 1.0991292e+00 1.1763288e+00 9.3205158e-01 1.6094321e+00 1.2138655e+00 7.6202456e-01 9.9057455e-01 1.7578437e+00 1.9218477e+00 1.9417101e+00 7.4188906e-01 1.5836883e+00 1.8181082e+00 1.5149485e+00 6.7953514e-01 1.1907971e+00 1.5565652e+00 1.4213613e+00 8.1199808e-01 1.3964942e+00 1.4238018e+00 1.8738444e+00 7.5966619e-01 1.5158711e+00 1.4536412e+00 1.4770622e+00 4.3540658e-01 9.3405478e-01 1.5274858e+00 1.0246555e+00 6.4597730e-01 1.1747785e+00 1.4333953e+00 5.7909019e-01 5.1859441e-01 1.0171501e+00 1.4972629e+00 1.0681908e+00 6.6944640e-01 1.3252752e+00 1.6423456e+00 7.8405165e-01 1.1477249e+00 2.4790107e+00 1.1747785e+00 2.0165427e+00 1.2172259e+00 2.1775889e+00 9.0121124e-01 6.4480630e-01 1.1871900e+00 2.8246002e-01 5.1514715e-01 9.6235823e-01 9.1292896e-01 2.9023899e+00 2.7713198e+00 7.1767732e-01 1.4961759e+00 3.3820388e-01 2.5878269e+00 5.6532807e-01 1.3339990e+00 1.8283107e+00 5.4772047e-01 5.1232775e-01 8.5666462e-01 1.6958789e+00 1.9562107e+00 2.8550332e+00 8.9333246e-01 6.7676105e-01 8.2330060e-01 2.3010008e+00 1.1996723e+00 8.8275255e-01 5.1232775e-01 1.2752289e+00 1.2955673e+00 1.2854807e+00 0.0000000e+00 1.5294202e+00 1.4792717e+00 1.0806255e+00 5.6532807e-01 8.0213820e-01 1.0138644e+00 3.4362433e-01 9.5130679e-01 6.2604837e-01 8.9160122e-01 2.8157540e+00 5.8223100e-01 7.5966619e-01 7.9516176e-01 1.0749691e+00 1.0515237e+00 5.1859441e-01 1.8283107e+00 1.6423456e+00 1.0194781e+00 8.2375853e-01 1.3659450e+00 1.3190232e+00 1.8689599e+00 4.3202390e-01 1.8902351e+00 1.0749691e+00 1.4276984e+00 5.6852959e-01 4.1053944e-01 1.5434204e+00 1.5159027e+00 8.1758743e-01 5.2994606e-01 4.9309055e-01 1.3169515e+00 8.2787992e-01 1.3828911e+00 1.4002001e+00 6.8724866e-01 1.0492528e+00 9.1292896e-01 1.6595694e+00 5.6532807e-01 6.3137460e-01 8.8060445e-01 1.6423456e+00 4.3649025e-01 7.2032458e-01 8.6709114e-01 1.4027057e+00 9.6666785e-01 1.1871516e+00 1.5387249e+00 5.2951637e-01 1.7484865e+00 1.9174005e+00 1.2647692e+00 6.3338930e-01 1.5366523e+00 6.8946124e-01 4.1053944e-01 6.2843180e-01 1.0246555e+00 9.9383032e-01 7.0427522e-01 2.5735380e-01 2.1718026e+00 2.1109876e+00 1.0828063e+00 8.9333246e-01 1.0668324e+00 1.8717537e+00 7.3987984e-01 6.9144557e-01 1.0723246e+00 8.2083495e-01 7.5101750e-01 3.4362433e-01 9.7388041e-01 1.2554395e+00 2.1244730e+00 4.3540658e-01 6.1555822e-01 5.6852959e-01 1.6349103e+00 8.1102313e-01 2.5735380e-01 8.8313857e-01 7.6923870e-01 7.8452781e-01 1.0156040e+00 7.8405165e-01 8.8546441e-01 9.5844041e-01 8.1199808e-01 7.5761919e-01 5.2951637e-01 7.8405165e-01 6.7676105e-01 1.4167992e+00 2.3085501e+00 1.0882435e+00 7.0612170e-01 1.0828063e+00 7.7810927e-01 7.0427522e-01 4.5762068e-01 1.3343943e+00 1.0874269e+00 5.7909019e-01 5.1859441e-01 1.8014735e+00 1.7660601e+00 1.5307091e+00 4.9210778e-01 1.3710826e+00 1.5983755e+00 1.1010130e+00 4.1053944e-01 9.0093031e-01 1.1871900e+00 1.1125321e+00 3.3820388e-01 9.5758668e-01 1.0604579e+00 1.8258579e+00 3.1669465e-01 1.0874269e+00 1.0590327e+00 1.2613395e+00 5.6492004e-01 5.4772047e-01 1.2430385e+00 6.1435392e-01 3.8739477e-01 8.5236302e-01 1.1477249e+00 4.1053944e-01 5.1232775e-01 6.5721874e-01 1.0681908e+00 6.4480630e-01 6.9144557e-01 1.0634702e+00 3.6449958e+00 5.6633242e-01 1.4276653e+00 1.0384427e+00 1.9519078e+00 1.8955556e+00 1.4101234e+00 2.6575256e+00 2.4790107e+00 1.8757166e+00 1.6595694e+00 8.3109521e-01 5.8223100e-01 2.6371638e+00 1.2357881e+00 2.7437987e+00 2.8246002e-01 2.2866603e+00 1.3728620e+00 8.5896323e-01 2.4131990e+00 2.3871316e+00 1.6427629e+00 1.0799895e+00 6.4388168e-01 9.1650126e-01 1.6486737e+00 2.1995136e+00 2.0973307e+00 5.6532807e-01 1.8102661e+00 1.7385093e+00 2.5324008e+00 1.4411447e+00 1.4523426e+00 1.7263643e+00 2.4790107e+00 1.1597901e+00 1.4538178e+00 1.7416975e+00 2.2417803e+00 1.8531106e+00 1.9955439e+00 2.3871316e+00 3.1578995e+00 2.3062243e+00 3.3188012e+00 1.9638667e+00 1.7908447e+00 2.3498377e+00 1.0387817e+00 1.4144838e+00 2.0588822e+00 2.0477716e+00 4.0510346e+00 3.9083690e+00 1.3181003e+00 2.6542592e+00 9.7043733e-01 3.7399576e+00 1.5083832e+00 2.4804590e+00 2.9699862e+00 1.4067865e+00 1.4215976e+00 2.0274113e+00 2.8009658e+00 3.1088776e+00 3.9985603e+00 2.0572191e+00 1.6267276e+00 1.7385093e+00 3.4717914e+00 2.2698274e+00 2.0022687e+00 1.3004831e+00 2.4180194e+00 2.4432447e+00 2.3565408e+00 1.1747785e+00 2.6889094e+00 2.6060527e+00 2.1878130e+00 1.5397703e+00 1.9274803e+00 2.0551144e+00 1.3436157e+00 9.3031410e-01 1.0668324e+00 1.5603234e+00 1.4277283e+00 1.0472948e+00 2.2139759e+00 2.1231905e+00 1.5609415e+00 1.1835024e+00 1.2073534e+00 9.9587193e-01 2.1141091e+00 9.9587193e-01 2.3069034e+00 6.4597730e-01 1.8024225e+00 1.0565750e+00 4.5762068e-01 1.9338850e+00 1.9204032e+00 1.2451277e+00 5.7909019e-01 2.8246002e-01 1.1554378e+00 1.2809282e+00 1.6706458e+00 1.5579918e+00 7.1767732e-01 1.5543951e+00 1.2764277e+00 2.0667553e+00 1.1010130e+00 1.1953982e+00 1.4380165e+00 2.0165427e+00 9.3205158e-01 1.2599867e+00 1.4238018e+00 1.7759132e+00 1.4398518e+00 1.6962689e+00 1.9204032e+00 1.5161253e+00 1.0874269e+00 6.5951158e-01 7.0427522e-01 1.3535221e+00 1.4144838e+00 1.1143033e+00 6.4713428e-01 2.0445417e+00 1.6600757e+00 1.2171919e+00 9.3405478e-01 1.5434204e+00 1.4684856e+00 1.0407910e+00 8.8313857e-01 9.2471857e-01 1.2063442e+00 1.2587344e+00 5.9997944e-01 7.7329583e-01 8.6552490e-01 1.9884081e+00 6.6234335e-01 9.7043733e-01 7.9516176e-01 1.3379499e+00 1.2402295e+00 7.7206140e-01 1.3919009e+00 8.5896323e-01 9.1524136e-01 1.1406668e+00 1.2172259e+00 9.1073996e-01 1.1123689e+00 9.8494990e-01 9.2981943e-01 8.8112111e-01 1.2955673e+00 1.2445598e+00 1.4720134e+00 1.6873826e+00 1.0972454e+00 2.3726853e+00 2.0112380e+00 1.2919546e+00 1.4073982e+00 9.1700166e-01 1.4744533e+00 2.5541365e+00 7.2032458e-01 2.3556366e+00 1.3173259e+00 2.0275969e+00 8.7480853e-01 8.4231031e-01 2.0991406e+00 2.0058462e+00 1.3937623e+00 1.1767917e+00 1.0666331e+00 9.9057455e-01 1.3603538e+00 2.0045449e+00 2.0565661e+00 8.4665275e-01 1.0991292e+00 1.4206323e+00 2.1351020e+00 1.0650316e+00 9.2989866e-01 1.2325055e+00 2.1775889e+00 6.7640775e-01 7.4863144e-01 1.2840368e+00 2.0373973e+00 1.4857417e+00 1.3147960e+00 2.0147492e+00 5.7909019e-01 5.8223100e-01 1.1123689e+00 9.4929639e-01 3.9226391e-01 5.1470760e-01 2.2114372e+00 2.3854853e+00 1.2939496e+00 8.2375853e-01 1.0407910e+00 2.1332661e+00 6.4388168e-01 6.6944640e-01 1.2096835e+00 6.6234335e-01 5.6492004e-01 6.8870991e-01 1.1568326e+00 1.4840812e+00 2.1100847e+00 7.1767732e-01 7.0612170e-01 1.1454011e+00 1.6850921e+00 7.4573804e-01 4.9210778e-01 6.8946124e-01 5.4772047e-01 7.1767732e-01 5.3331654e-01 9.0121124e-01 9.4210748e-01 8.5666462e-01 4.5332153e-01 7.6202456e-01 2.3011223e-01 5.9997944e-01 6.8724866e-01 6.1517707e-01 8.2787992e-01 8.5666462e-01 6.6464098e-01 4.1053944e-01 2.3730980e+00 2.2023791e+00 8.7480853e-01 9.7684577e-01 9.3911501e-01 1.9953837e+00 4.3540658e-01 8.5896323e-01 1.2519335e+00 5.7909019e-01 6.3137460e-01 3.9226391e-01 1.0990923e+00 1.3362791e+00 2.2961827e+00 4.5762068e-01 4.9210778e-01 7.0427522e-01 1.6928982e+00 9.6835294e-01 4.7637957e-01 7.5966619e-01 7.1767732e-01 8.2567325e-01 8.3749635e-01 6.4480630e-01 1.0384427e+00 1.0565750e+00 6.3137460e-01 3.9226391e-01 3.6384497e-01 8.7691570e-01 6.5951158e-01 1.3764580e+00 1.1871900e+00 5.6492004e-01 4.4092035e-01 1.8069650e+00 1.8091500e+00 1.4796355e+00 3.8739477e-01 1.4108983e+00 1.5833003e+00 9.5179250e-01 3.9226391e-01 7.8651859e-01 1.0515237e+00 1.0217326e+00 4.7637957e-01 7.4863144e-01 9.4769406e-01 1.7361945e+00 4.9210778e-01 9.6235823e-01 1.1372486e+00 1.1475725e+00 7.5966619e-01 5.3331654e-01 1.1618240e+00 1.8410575e-01 3.6384497e-01 4.9210778e-01 1.1871900e+00 5.1470760e-01 5.8223100e-01 3.9226391e-01 9.5283683e-01 4.5762068e-01 7.9516176e-01 1.0723246e+00 5.4772047e-01 1.1477249e+00 1.1562968e+00 3.1170608e+00 2.8977858e+00 6.9254136e-01 1.6840939e+00 3.4362433e-01 2.7545512e+00 6.9905366e-01 1.5540671e+00 2.0549061e+00 6.8946124e-01 7.1767732e-01 1.0303583e+00 1.9159748e+00 2.1349556e+00 3.0788269e+00 1.0515237e+00 8.9333246e-01 1.0030389e+00 2.4644515e+00 1.3933806e+00 1.1406668e+00 6.8946124e-01 1.4677697e+00 1.4654950e+00 1.4357436e+00 2.8246002e-01 1.7202988e+00 1.6572731e+00 1.2325055e+00 6.1313486e-01 1.0064130e+00 1.2156057e+00 6.1217218e-01 7.9516176e-01 1.0923450e+00 2.8435293e+00 2.7374823e+00 1.1554378e+00 1.3835659e+00 5.1470760e-01 2.6292305e+00 8.5666462e-01 1.3107930e+00 1.9249697e+00 8.2375853e-01 7.6923870e-01 8.8365404e-01 1.8692080e+00 2.0428042e+00 2.8524347e+00 8.4665275e-01 1.0620358e+00 1.2325055e+00 2.2329821e+00 9.8494990e-01 1.0565750e+00 7.6923870e-01 1.2668085e+00 1.1213387e+00 1.1655453e+00 5.1514715e-01 1.4189112e+00 1.2660420e+00 9.5134817e-01 8.2330060e-01 8.7691570e-01 8.3398998e-01 6.5721874e-01 6.1217218e-01 2.1149252e+00 2.2581469e+00 1.4598659e+00 6.6464098e-01 1.0901424e+00 2.0817966e+00 8.7254337e-01 5.8223100e-01 1.2445598e+00 8.9665187e-01 7.8651859e-01 5.6852959e-01 1.2700883e+00 1.4914761e+00 2.0917863e+00 5.3331654e-01 9.6187679e-01 1.2316183e+00 1.5991162e+00 4.1053944e-01 5.6532807e-01 8.9665187e-01 5.7909019e-01 4.7384703e-01 5.6532807e-01 9.6235823e-01 7.4656027e-01 5.8223100e-01 3.9226391e-01 9.1292896e-01 4.1053944e-01 3.1669465e-01 8.1025366e-01 2.0493110e+00 2.0686305e+00 1.1853434e+00 7.4573804e-01 1.1747785e+00 1.8022909e+00 7.3064040e-01 5.4862269e-01 9.2471857e-01 8.1758743e-01 7.4656027e-01 4.1053944e-01 8.1758743e-01 1.1554378e+00 1.9684957e+00 4.9210778e-01 6.1517707e-01 7.4760192e-01 1.4998365e+00 7.9516176e-01 1.4697345e-01 8.9160122e-01 5.4772047e-01 6.6944640e-01 8.1199808e-01 9.1292896e-01 7.8651859e-01 8.5299662e-01 6.4713428e-01 7.8405165e-01 3.7328014e-01 7.5966619e-01 7.4656027e-01 1.2337308e+00 3.1868161e+00 1.5036272e+00 3.1165412e+00 1.0302943e+00 2.7289439e+00 1.5895598e+00 1.2076019e+00 2.8148584e+00 2.7239471e+00 2.1014608e+00 1.5427379e+00 1.3108284e+00 4.3649025e-01 2.0965955e+00 2.6270252e+00 2.5976807e+00 1.0457123e+00 1.9303491e+00 2.0718030e+00 2.8615163e+00 1.7770570e+00 1.7607505e+00 2.0188852e+00 2.9023899e+00 1.4330453e+00 1.6270357e+00 2.0870653e+00 2.7431330e+00 2.2158226e+00 2.1258131e+00 2.7239471e+00 2.8615163e+00 1.6475171e+00 3.0524773e+00 4.3649025e-01 2.6086756e+00 1.8307578e+00 1.3863130e+00 2.7602861e+00 2.7782215e+00 1.9469113e+00 1.5468108e+00 1.0171501e+00 1.4054505e+00 1.9340514e+00 2.5618564e+00 2.3796225e+00 9.2044891e-01 2.1962131e+00 2.1632377e+00 2.9196741e+00 1.8703002e+00 1.8090011e+00 2.1107754e+00 2.7713198e+00 1.5597919e+00 1.8307578e+00 2.0967276e+00 2.5032300e+00 2.2469706e+00 2.3955500e+00 2.7656329e+00 1.8487804e+00 9.3960576e-01 2.6766565e+00 7.0427522e-01 1.7142438e+00 2.0066085e+00 7.6923870e-01 8.9282147e-01 1.1999589e+00 1.7515914e+00 2.0406083e+00 3.0912512e+00 1.2599867e+00 7.0210005e-01 7.6855044e-01 2.4788755e+00 1.7466930e+00 1.2156057e+00 9.0702094e-01 1.5673409e+00 1.6928814e+00 1.6035196e+00 7.1767732e-01 1.8968646e+00 1.9213544e+00 1.4367107e+00 6.1854995e-01 1.1562968e+00 1.5903235e+00 8.9282147e-01 1.6928982e+00 1.4598659e+00 1.3173259e+00 3.1669465e-01 6.9254136e-01 1.4001664e+00 1.3343943e+00 7.1767732e-01 8.2787992e-01 9.2182836e-01 1.4857738e+00 6.8870991e-01 1.3246867e+00 1.4330453e+00 9.5275914e-01 6.6944640e-01 7.8405165e-01 1.4684532e+00 3.9226391e-01 2.8246002e-01 6.1313486e-01 1.4961759e+00 2.3011223e-01 3.1669465e-01 5.9902047e-01 1.3178087e+00 7.8651859e-01 8.1758743e-01 1.3607842e+00 2.8727600e+00 7.5101750e-01 1.5336952e+00 2.0886202e+00 6.5721874e-01 5.9902047e-01 1.1123689e+00 1.9752243e+00 2.2442963e+00 3.0749957e+00 1.1322971e+00 9.2471857e-01 1.1406668e+00 2.5415025e+00 1.3178087e+00 1.1257411e+00 5.2951637e-01 1.4783426e+00 1.4779091e+00 1.4233421e+00 3.3820388e-01 1.7346430e+00 1.6379339e+00 1.2392971e+00 8.0213820e-01 9.9829999e-01 1.1061493e+00 4.9309055e-01 2.3859887e+00 1.5895598e+00 1.0333206e+00 2.5269936e+00 2.5313109e+00 1.7741487e+00 1.1871516e+00 7.0210005e-01 1.0909821e+00 1.7879216e+00 2.2919057e+00 2.1515219e+00 7.3064040e-01 2.0406083e+00 1.8955556e+00 2.6767986e+00 1.6275968e+00 1.6614307e+00 1.9177018e+00 2.5878269e+00 1.3875188e+00 1.6910194e+00 1.9229420e+00 2.3237377e+00 2.0115137e+00 2.2169978e+00 2.5313109e+00 1.1933491e+00 1.5890053e+00 1.8410575e-01 3.7328014e-01 8.0213820e-01 1.3964942e+00 1.7030059e+00 2.6163387e+00 8.5236302e-01 3.9226391e-01 8.7691570e-01 2.0443916e+00 1.2298330e+00 7.5761919e-01 4.5762068e-01 9.9587193e-01 1.1615141e+00 9.6235823e-01 5.6532807e-01 1.4123001e+00 1.3803227e+00 8.2567325e-01 2.5735380e-01 5.4862269e-01 1.0630970e+00 5.6852959e-01 7.0427522e-01 1.2600991e+00 1.1554024e+00 6.1555822e-01 8.2330060e-01 1.0333206e+00 1.5565652e+00 6.2843180e-01 1.1454011e+00 1.2372769e+00 1.1871900e+00 5.4772047e-01 5.4862269e-01 1.2904601e+00 4.3649025e-01 3.9226391e-01 7.2768994e-01 1.3339990e+00 3.3820388e-01 4.0000000e-01 6.4713428e-01 1.2258842e+00 6.5951158e-01 6.5951158e-01 1.1554024e+00 1.6933055e+00 1.6374787e+00 1.0901424e+00 3.6821151e-01 4.9210778e-01 1.0923450e+00 1.1298401e+00 1.4538178e+00 1.4575430e+00 7.8405165e-01 1.2402295e+00 9.8447732e-01 1.7830698e+00 7.8283081e-01 9.3960576e-01 1.1293499e+00 1.8283107e+00 6.7676105e-01 9.6835294e-01 1.1562968e+00 1.6148242e+00 1.1597901e+00 1.3607842e+00 1.6585452e+00 2.5735380e-01 9.0702094e-01 1.5142591e+00 1.8437471e+00 2.7019857e+00 9.5275914e-01 4.5762068e-01 9.6187679e-01 2.1663269e+00 1.2445090e+00 8.1758743e-01 2.9394690e-01 1.0828063e+00 1.2384836e+00 1.0233448e+00 5.4772047e-01 1.4961759e+00 1.4400298e+00 8.9665187e-01 4.1053944e-01 6.1517707e-01 1.0461626e+00 4.9711212e-01 8.8978585e-01 1.4979300e+00 1.8624652e+00 2.6246630e+00 9.3620005e-01 4.9309055e-01 9.4929639e-01 2.1618992e+00 1.0923450e+00 7.0210005e-01 1.4697345e-01 1.0472948e+00 1.1763288e+00 1.0151428e+00 5.1232775e-01 1.4152780e+00 1.3466484e+00 8.8365404e-01 5.7909019e-01 5.6852959e-01 8.7254337e-01 2.9394690e-01 1.0365569e+00 1.1777118e+00 2.0870653e+00 1.0000000e-01 8.2138146e-01 8.1758743e-01 1.4702081e+00 7.0210005e-01 4.5762068e-01 1.0171501e+00 6.4713428e-01 5.5231726e-01 8.4852602e-01 8.5666462e-01 7.2032458e-01 7.5966619e-01 6.1517707e-01 7.4188906e-01 4.9210778e-01 7.2768994e-01 8.4852602e-01 5.4862269e-01 1.3803227e+00 1.0954409e+00 1.2172259e+00 1.2478658e+00 9.5928453e-01 1.3619736e+00 9.1650126e-01 1.6427629e+00 7.5966619e-01 1.0151428e+00 1.0977646e+00 1.6958789e+00 8.7691570e-01 1.1293499e+00 1.1127975e+00 1.4276653e+00 1.0634702e+00 1.4328617e+00 1.5437863e+00 1.2139032e+00 1.2063442e+00 1.6186085e+00 1.5625820e+00 5.6852959e-01 1.5340267e+00 1.2660785e+00 2.0079282e+00 9.9057455e-01 1.1143033e+00 1.2956031e+00 1.9562107e+00 9.0664307e-01 1.2076019e+00 1.2987575e+00 1.6595694e+00 1.3540186e+00 1.6657696e+00 1.8902351e+00 2.0991693e+00 2.5047066e+00 2.5354493e+00 9.7383980e-01 1.9684311e+00 2.0003862e+00 2.7629628e+00 1.6792104e+00 1.7633931e+00 1.9229112e+00 2.8550332e+00 1.4646467e+00 1.6596462e+00 2.0248875e+00 2.6508549e+00 2.1269404e+00 2.1316761e+00 2.6579753e+00 9.0121124e-01 9.0702094e-01 1.4540804e+00 6.5721874e-01 5.3331654e-01 1.0590327e+00 6.5951158e-01 4.9711212e-01 8.2330060e-01 8.9333246e-01 6.9144557e-01 7.0427522e-01 5.8223100e-01 7.8283081e-01 5.2951637e-01 6.9905366e-01 8.9665187e-01 6.1217218e-01 2.0237038e+00 1.2587344e+00 6.3137460e-01 5.9997944e-01 1.0146116e+00 1.2156057e+00 1.0975698e+00 6.7676105e-01 1.3937623e+00 1.4192640e+00 9.6187679e-01 5.3331654e-01 6.1217218e-01 1.1057186e+00 5.6852959e-01 2.0488924e+00 1.3535221e+00 7.5966619e-01 1.0379897e+00 1.2700883e+00 1.3366492e+00 1.4984189e+00 8.2330060e-01 1.4144838e+00 1.5212536e+00 1.3030263e+00 8.5666462e-01 9.8618111e-01 1.2836546e+00 8.3749635e-01 1.5989791e+00 1.5904535e+00 2.3032863e+00 1.1402466e+00 1.1662169e+00 1.3362791e+00 2.3010008e+00 9.6485354e-01 1.1871900e+00 1.3977943e+00 2.0053385e+00 1.5999496e+00 1.7694181e+00 2.2100095e+00 7.1370782e-01 1.1933491e+00 8.0906455e-01 5.1859441e-01 8.9333246e-01 1.1996723e+00 6.5951158e-01 4.5227024e-01 7.4760192e-01 1.2587344e+00 7.7478955e-01 2.5735380e-01 1.0384427e+00 8.4231031e-01 6.1555822e-01 7.0210005e-01 8.6267904e-01 8.8275255e-01 8.1199808e-01 8.5299662e-01 7.0427522e-01 8.3163633e-01 4.1053944e-01 6.5951158e-01 6.7676105e-01 1.1845013e+00 1.3028825e+00 1.1293499e+00 5.1232775e-01 1.5491559e+00 1.4673712e+00 1.0030992e+00 6.5951158e-01 7.0612170e-01 9.6235823e-01 3.2240315e-01 4.3649025e-01 3.7328014e-01 1.2752289e+00 5.7909019e-01 6.1517707e-01 3.8739477e-01 1.0246555e+00 4.9210778e-01 8.1758743e-01 1.1293899e+00 5.6532807e-01 1.2955673e+00 3.6384497e-01 2.5735380e-01 4.3540658e-01 1.1454011e+00 6.4597730e-01 6.5951158e-01 1.1915830e+00 1.2854807e+00 8.2083495e-01 7.2768994e-01 2.5735380e-01 1.0030389e+00 5.4772047e-01 8.5559597e-01 1.1584102e+00 1.5294202e+00 1.4792717e+00 1.0806255e+00 5.6532807e-01 8.0213820e-01 1.0138644e+00 3.4362433e-01 3.3820388e-01 7.5101750e-01 1.4001664e+00 8.8978585e-01 8.4665275e-01 1.4027057e+00 6.4713428e-01 1.3803227e+00 8.4852602e-01 6.5951158e-01 1.3466484e+00 8.3749635e-01 3.7328014e-01 7.0612170e-01 9.8447732e-01 6.1217218e-01 1.1205937e+00 6.8870991e-01 6.6234335e-01 6.5721874e-01 8.2567325e-01 Added: trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml-iris.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml-iris.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/pdist-minkowski-3.2-ml-iris.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -0,0 +1 @@ + 5.0817745e-01 4.4535192e-01 5.6700421e-01 1.2418578e-01 4.8927739e-01 5.0180477e-01 1.4096146e-01 8.1242502e-01 4.1586001e-01 3.2586371e-01 3.2586371e-01 5.2942799e-01 8.6137722e-01 7.7039952e-01 9.7270522e-01 4.5581864e-01 1.0000000e-01 6.3861009e-01 3.0546431e-01 3.7427929e-01 2.5251796e-01 5.6700421e-01 3.8776762e-01 5.2942799e-01 5.0905001e-01 2.5651975e-01 1.2418578e-01 1.2418578e-01 4.5470518e-01 4.5470518e-01 3.2816937e-01 6.0181382e-01 7.3457830e-01 4.1586001e-01 3.2586371e-01 4.0147421e-01 4.1586001e-01 7.6752131e-01 1.2418578e-01 1.4096146e-01 1.2396136e+00 7.1462831e-01 4.1449626e-01 5.3588338e-01 5.2942799e-01 3.2352160e-01 5.2862779e-01 2.5251796e-01 2.0656129e-01 3.5031395e+00 3.2158090e+00 3.6682165e+00 2.7164367e+00 3.3288934e+00 3.1477087e+00 3.4033622e+00 2.0308266e+00 3.3209346e+00 2.5912926e+00 2.3257069e+00 2.8912179e+00 2.7273721e+00 3.3660466e+00 2.2876649e+00 3.1664710e+00 3.1642132e+00 2.7448172e+00 3.2474124e+00 2.5734684e+00 3.5025969e+00 2.6980573e+00 3.5983434e+00 3.3515288e+00 3.0113552e+00 3.1469325e+00 3.5526357e+00 3.7475562e+00 3.1812462e+00 2.1818668e+00 2.4927109e+00 2.3909738e+00 2.5729378e+00 3.7711998e+00 3.1620401e+00 3.1916270e+00 3.4478147e+00 3.1312883e+00 2.7541224e+00 2.6886547e+00 3.0483897e+00 3.2685282e+00 2.6752185e+00 2.0587064e+00 2.8619072e+00 2.8416143e+00 2.8554471e+00 2.9845926e+00 1.7697734e+00 2.7640668e+00 4.7690606e+00 3.8067806e+00 4.6866422e+00 4.2843668e+00 4.5417384e+00 5.4120246e+00 3.2161426e+00 5.0569442e+00 4.5165793e+00 4.9462324e+00 3.8595100e+00 4.0249346e+00 4.2787236e+00 3.7387507e+00 3.9160762e+00 4.0938708e+00 4.2028863e+00 5.5316487e+00 5.7297286e+00 3.6968486e+00 4.5074741e+00 3.6330985e+00 5.5146761e+00 3.6293227e+00 4.4495340e+00 4.7599229e+00 3.5255287e+00 3.6076762e+00 4.3339547e+00 4.5590471e+00 4.8997298e+00 5.2856169e+00 4.3511402e+00 3.7760534e+00 4.2460554e+00 5.0103780e+00 4.3808704e+00 4.1939019e+00 3.5087649e+00 4.2018804e+00 4.4140402e+00 3.9807996e+00 3.8067806e+00 4.6775324e+00 4.5250934e+00 4.0376133e+00 3.7473276e+00 3.9523060e+00 4.1709262e+00 3.7872951e+00 2.5251796e-01 3.0546431e-01 6.0060595e-01 9.5035453e-01 4.4535192e-01 4.0293660e-01 5.0090417e-01 1.4096146e-01 7.6752131e-01 4.1449626e-01 1.2418578e-01 6.2024833e-01 1.1845977e+00 1.4700179e+00 9.4309624e-01 5.0905001e-01 1.0003617e+00 8.0358695e-01 5.8851328e-01 7.0826681e-01 6.6384020e-01 4.3456114e-01 5.6700421e-01 2.0656129e-01 4.2667565e-01 5.2942799e-01 4.4417983e-01 2.8192292e-01 2.1269358e-01 5.7324170e-01 1.1056650e+00 1.2393677e+00 1.4096146e-01 2.5251796e-01 6.8961791e-01 1.4096146e-01 5.0090417e-01 4.1449626e-01 5.0270183e-01 7.3535471e-01 5.0905001e-01 5.7324170e-01 8.5690100e-01 1.2418578e-01 8.0587320e-01 3.2352160e-01 7.3496673e-01 3.0275928e-01 3.5601468e+00 3.2472699e+00 3.7137483e+00 2.6693888e+00 3.3563815e+00 3.1472333e+00 3.4276314e+00 1.9506288e+00 3.3563695e+00 2.5739370e+00 2.1870094e+00 2.9033014e+00 2.6860278e+00 3.3789262e+00 2.2884830e+00 3.2153154e+00 3.1667333e+00 2.7423060e+00 3.2269725e+00 2.5465772e+00 3.5123782e+00 2.7147889e+00 3.6030381e+00 3.3619470e+00 3.0427908e+00 3.1888219e+00 3.5910272e+00 3.7805671e+00 3.1921903e+00 2.1611020e+00 2.4491518e+00 2.3430978e+00 2.5700421e+00 3.7741357e+00 3.1615131e+00 3.2084454e+00 3.4884789e+00 3.1228939e+00 2.7575407e+00 2.6617768e+00 3.0343591e+00 3.2842184e+00 2.6656374e+00 1.9595652e+00 2.8539100e+00 2.8474367e+00 2.8585579e+00 3.0059712e+00 1.6867642e+00 2.7634340e+00 4.7806735e+00 3.8055585e+00 4.7194850e+00 4.2963997e+00 4.5579706e+00 5.4507801e+00 3.1945300e+00 5.0903533e+00 4.5297786e+00 4.9814379e+00 3.8841455e+00 4.0376849e+00 4.3069372e+00 3.7284750e+00 3.9173293e+00 4.1124749e+00 4.2221165e+00 5.5759608e+00 5.7633066e+00 3.6758942e+00 4.5370189e+00 3.6312130e+00 5.5536680e+00 3.6416405e+00 4.4736906e+00 4.7961103e+00 3.5380868e+00 3.6203213e+00 4.3467079e+00 4.5977693e+00 4.9380624e+00 5.3421274e+00 4.3637834e+00 3.7899304e+00 4.2477635e+00 5.0602038e+00 4.3953045e+00 4.2110583e+00 3.5192753e+00 4.2358121e+00 4.4378207e+00 4.0189525e+00 3.8055585e+00 4.7017335e+00 4.5483787e+00 4.0656879e+00 3.7516222e+00 3.9742971e+00 4.1845313e+00 3.7939847e+00 2.1269358e-01 4.4535192e-01 8.9366705e-01 2.1845981e-01 3.4378533e-01 3.7427929e-01 2.5651975e-01 7.7039952e-01 3.2586371e-01 2.1845981e-01 4.2667565e-01 1.2113327e+00 1.3801284e+00 8.7175869e-01 4.4651726e-01 1.0719360e+00 6.5223271e-01 7.3813096e-01 5.7867728e-01 4.4535192e-01 5.2655962e-01 6.0611244e-01 3.8776762e-01 4.0176783e-01 5.3588338e-01 5.0905001e-01 3.0000000e-01 3.0546431e-01 7.1169738e-01 9.4309624e-01 1.1327825e+00 2.5651975e-01 3.0275928e-01 8.1067767e-01 2.5651975e-01 3.2352160e-01 4.2538717e-01 3.7427929e-01 9.0252542e-01 3.0000000e-01 5.1138698e-01 7.7869083e-01 2.1845981e-01 6.6384020e-01 1.2418578e-01 6.9325418e-01 3.0546431e-01 3.7098973e+00 3.3770904e+00 3.8553941e+00 2.7868575e+00 3.4895316e+00 3.2571492e+00 3.5499573e+00 2.0646687e+00 3.4944845e+00 2.6743800e+00 2.3196869e+00 3.0181476e+00 2.8270253e+00 3.4973911e+00 2.3997585e+00 3.3600102e+00 3.2716172e+00 2.8619072e+00 3.3597438e+00 2.6649106e+00 3.6203213e+00 2.8440609e+00 3.7280682e+00 3.4822008e+00 3.1786890e+00 3.3296038e+00 3.7325066e+00 3.9121945e+00 3.3084060e+00 2.2888897e+00 2.5683989e+00 2.4649412e+00 2.6906230e+00 3.8866112e+00 3.2625043e+00 3.3219248e+00 3.6264668e+00 3.2609948e+00 2.8656468e+00 2.7738624e+00 3.1430282e+00 3.4033622e+00 2.7865812e+00 2.0797392e+00 2.9638836e+00 2.9589097e+00 2.9695568e+00 3.1337459e+00 1.7991433e+00 2.8758936e+00 4.8875515e+00 3.9111857e+00 4.8490379e+00 4.4107143e+00 4.6725771e+00 5.5854254e+00 3.2933477e+00 5.2226262e+00 4.6541348e+00 5.1068487e+00 4.0049607e+00 4.1564977e+00 4.4321573e+00 3.8331006e+00 4.0161098e+00 4.2255639e+00 4.3417782e+00 5.7091264e+00 5.8970064e+00 3.7961619e+00 4.6611065e+00 3.7313856e+00 5.6903014e+00 3.7618406e+00 4.5942943e+00 4.9290197e+00 3.6553612e+00 3.7333492e+00 4.4613366e+00 4.7342792e+00 5.0749049e+00 5.4844039e+00 4.4774673e+00 3.9102500e+00 4.3611782e+00 5.2016658e+00 4.5034762e+00 4.3281161e+00 3.6300436e+00 4.3648112e+00 4.5562166e+00 4.1482002e+00 3.9111857e+00 4.8218416e+00 4.6648403e+00 4.1879434e+00 3.8717400e+00 4.0945154e+00 4.2919258e+00 3.9013483e+00 5.6700421e-01 9.9714776e-01 3.0546431e-01 4.4417983e-01 2.5251796e-01 3.0275928e-01 8.8835966e-01 3.2586371e-01 2.1845981e-01 4.4651726e-01 1.3360558e+00 1.5022608e+00 9.9714776e-01 5.6769031e-01 1.1765359e+00 7.6752131e-01 8.1354181e-01 6.9325418e-01 6.2092891e-01 5.4292906e-01 4.5470518e-01 4.0293660e-01 4.5581864e-01 6.4704320e-01 6.2024833e-01 1.4096146e-01 2.0656129e-01 8.1354181e-01 1.0574300e+00 1.2554784e+00 3.0275928e-01 4.4535192e-01 9.2264612e-01 3.0275928e-01 2.5251796e-01 5.2862779e-01 5.0592043e-01 8.0358695e-01 2.5251796e-01 5.6454040e-01 7.9878917e-01 2.1845981e-01 7.6752131e-01 1.2418578e-01 8.1242502e-01 4.1449626e-01 3.5875094e+00 3.2277825e+00 3.7190120e+00 2.6019240e+00 3.3414931e+00 3.0741797e+00 3.3904673e+00 1.8683030e+00 3.3506325e+00 2.4892190e+00 2.1209506e+00 2.8530088e+00 2.6606291e+00 3.3264150e+00 2.2345869e+00 3.2325480e+00 3.0894572e+00 2.6859989e+00 3.1954750e+00 2.4836725e+00 3.4467337e+00 2.6928468e+00 3.5602810e+00 3.3090659e+00 3.0346426e+00 3.1953687e+00 3.5930845e+00 3.7635112e+00 3.1392617e+00 2.1242643e+00 2.3839455e+00 2.2806773e+00 2.5225548e+00 3.7070070e+00 3.0760590e+00 3.1551922e+00 3.4865435e+00 3.1033781e+00 2.6867856e+00 2.5906376e+00 2.9536363e+00 3.2348458e+00 2.6148507e+00 1.8841403e+00 2.7819255e+00 2.7801917e+00 2.7920574e+00 2.9774862e+00 1.6195190e+00 2.7001131e+00 4.7151191e+00 3.7310738e+00 4.6963107e+00 4.2348119e+00 4.5036643e+00 5.4345951e+00 3.1040223e+00 5.0660245e+00 4.4858951e+00 4.9576471e+00 3.8485743e+00 3.9894963e+00 4.2781102e+00 3.6535208e+00 3.8473084e+00 4.0656969e+00 4.1736133e+00 5.5611269e+00 5.7439963e+00 3.6142694e+00 4.5082936e+00 3.5527533e+00 5.5400450e+00 3.5988819e+00 4.4321573e+00 4.7754556e+00 3.4913787e+00 3.5638529e+00 4.2915574e+00 4.5844335e+00 4.9269527e+00 5.3501611e+00 4.3091163e+00 3.7395252e+00 4.1763853e+00 5.0687940e+00 4.3363292e+00 4.1568278e+00 3.4594086e+00 4.2175903e+00 4.4004449e+00 4.0139427e+00 3.7310738e+00 4.6611132e+00 4.5083524e+00 4.0415593e+00 3.7070350e+00 3.9354060e+00 4.1243443e+00 3.7225506e+00 4.8927739e-01 4.1449626e-01 2.0656129e-01 8.1242502e-01 5.0270183e-01 4.0293660e-01 2.8192292e-01 6.0611244e-01 8.2305664e-01 8.2899253e-01 9.3824087e-01 4.5581864e-01 1.4096146e-01 7.1840099e-01 2.1845981e-01 4.5470518e-01 2.1845981e-01 4.9674312e-01 4.2418962e-01 5.1607523e-01 6.0551856e-01 2.8192292e-01 2.1269358e-01 2.4837156e-01 4.5470518e-01 5.1607523e-01 4.2667565e-01 5.0991930e-01 6.8917100e-01 5.0270183e-01 4.1312257e-01 5.0180477e-01 5.0270183e-01 7.4549115e-01 2.1269358e-01 1.4096146e-01 1.3190071e+00 6.4755655e-01 4.1449626e-01 5.1691876e-01 6.0611244e-01 2.5251796e-01 4.9674312e-01 3.0546431e-01 3.0000000e-01 3.5310961e+00 3.2313174e+00 3.6912396e+00 2.7363446e+00 3.3486156e+00 3.1550780e+00 3.4146950e+00 2.0587064e+00 3.3422688e+00 2.6000813e+00 2.3658814e+00 2.9005672e+00 2.7581254e+00 3.3764180e+00 2.2982662e+00 3.1914715e+00 3.1684808e+00 2.7581145e+00 3.2719146e+00 2.5906376e+00 3.5076679e+00 2.7164648e+00 3.6146980e+00 3.3629944e+00 3.0317688e+00 3.1699749e+00 3.5767944e+00 3.7653940e+00 3.1912695e+00 2.2046610e+00 2.5131017e+00 2.4132939e+00 2.5882494e+00 3.7797776e+00 3.1649733e+00 3.1986968e+00 3.4685882e+00 3.1575873e+00 2.7599092e+00 2.7031874e+00 3.0575551e+00 3.2787144e+00 2.6914804e+00 2.0914773e+00 2.8714673e+00 2.8482104e+00 2.8631525e+00 3.0002861e+00 1.8009624e+00 2.7738624e+00 4.7744685e+00 3.8132783e+00 4.7036953e+00 4.2925903e+00 4.5507995e+00 5.4317036e+00 3.2245243e+00 5.0748136e+00 4.5314818e+00 4.9621679e+00 3.8715927e+00 4.0372136e+00 4.2937599e+00 3.7469906e+00 3.9213497e+00 4.1030149e+00 4.2136261e+00 5.5512721e+00 5.7499082e+00 3.7127205e+00 4.5218897e+00 3.6377830e+00 5.5357771e+00 3.6429670e+00 4.4609633e+00 4.7775824e+00 3.5373240e+00 3.6158814e+00 4.3437318e+00 4.5790474e+00 4.9211035e+00 5.3110568e+00 4.3608329e+00 3.7876656e+00 4.2543813e+00 5.0356467e+00 4.3872625e+00 4.2028863e+00 3.5161021e+00 4.2189979e+00 4.4261470e+00 4.0000622e+00 3.8132783e+00 4.6893387e+00 4.5361087e+00 4.0527696e+00 3.7622948e+00 3.9645936e+00 4.1768667e+00 3.7924679e+00 8.6137722e-01 5.7867728e-01 1.2470767e+00 8.6361309e-01 2.8192292e-01 6.9369532e-01 9.8450810e-01 1.2949422e+00 5.7324170e-01 5.3588338e-01 4.0000000e-01 4.8135521e-01 3.0546431e-01 3.2816937e-01 5.0817745e-01 3.4378533e-01 9.4558103e-01 6.2024833e-01 6.9728513e-01 9.2288144e-01 5.6700421e-01 4.3691963e-01 5.4292906e-01 8.7202528e-01 8.9095811e-01 5.0817745e-01 3.6171588e-01 3.8934542e-01 8.6361309e-01 7.9878917e-01 5.0592043e-01 8.6361309e-01 1.1959482e+00 5.4292906e-01 5.6454040e-01 1.6807352e+00 1.1055064e+00 5.0592043e-01 3.2586371e-01 9.7779835e-01 3.2816937e-01 9.4558103e-01 2.8507955e-01 6.6827038e-01 3.1533911e+00 2.8840079e+00 3.3274872e+00 2.5335921e+00 3.0169509e+00 2.8661222e+00 3.0732956e+00 1.9492232e+00 3.0013391e+00 2.3437032e+00 2.3116343e+00 2.5873149e+00 2.5591371e+00 3.0631725e+00 2.0220740e+00 2.8270253e+00 2.8656468e+00 2.4892190e+00 3.0178921e+00 2.3656538e+00 3.1846482e+00 2.4132559e+00 3.3163294e+00 3.0590735e+00 2.6993871e+00 2.8174914e+00 3.2310326e+00 3.4162231e+00 2.8802219e+00 1.9932786e+00 2.3173648e+00 2.2314118e+00 2.3212593e+00 3.4779999e+00 2.8654680e+00 2.8662571e+00 3.1113805e+00 2.8927401e+00 2.4634131e+00 2.4685230e+00 2.7948819e+00 2.9596963e+00 2.4341346e+00 2.0039447e+00 2.6000813e+00 2.5498770e+00 2.5700421e+00 2.6813098e+00 1.7123398e+00 2.4913669e+00 4.4418755e+00 3.5123791e+00 4.3488707e+00 3.9713081e+00 4.2172545e+00 5.0700045e+00 2.9631582e+00 4.7239900e+00 4.2113881e+00 4.5979409e+00 3.5255287e+00 3.7162377e+00 3.9448212e+00 3.4598280e+00 3.6097419e+00 3.7620043e+00 3.8810240e+00 5.1822310e+00 5.3953096e+00 3.4508156e+00 4.1665786e+00 3.3353616e+00 5.1763300e+00 3.3260356e+00 4.1143832e+00 4.4201622e+00 3.2188998e+00 3.2929599e+00 4.0183758e+00 4.2229849e+00 4.5637045e+00 4.9290256e+00 4.0343724e+00 3.4708900e+00 3.9559935e+00 4.6576736e+00 4.0502252e+00 3.8718131e+00 3.1963475e+00 3.8610636e+00 4.0785553e+00 3.6345765e+00 3.5123791e+00 4.3416284e+00 4.1864302e+00 3.7018916e+00 3.4568305e+00 3.6254423e+00 3.8415026e+00 3.4775621e+00 4.0293660e-01 5.0905001e-01 3.8934542e-01 8.1130291e-01 2.5251796e-01 4.2538717e-01 4.8927739e-01 1.2406194e+00 1.3074132e+00 8.5233811e-01 5.0090417e-01 1.1185330e+00 5.6700421e-01 8.1099042e-01 5.3022554e-01 4.1449626e-01 5.3665999e-01 5.0905001e-01 5.0592043e-01 4.1449626e-01 6.0181382e-01 6.0060595e-01 2.5651975e-01 3.4583729e-01 8.0064372e-01 8.1558458e-01 1.0597541e+00 3.8934542e-01 4.2667565e-01 9.0074515e-01 3.8934542e-01 4.1586001e-01 5.0180477e-01 4.0293660e-01 1.1003197e+00 2.5651975e-01 4.5581864e-01 6.6539428e-01 4.1312257e-01 5.7324170e-01 2.0656129e-01 7.1504098e-01 4.0293660e-01 3.6583368e+00 3.3018939e+00 3.7934214e+00 2.7118627e+00 3.4196168e+00 3.1646752e+00 3.4663954e+00 1.9965608e+00 3.4302944e+00 2.5753574e+00 2.2837561e+00 2.9283888e+00 2.7788099e+00 3.4116298e+00 2.3101107e+00 3.3028359e+00 3.1719381e+00 2.7826178e+00 3.2957091e+00 2.5882494e+00 3.5217244e+00 2.7724782e+00 3.6509512e+00 3.3998935e+00 3.1126354e+00 3.2681313e+00 3.6719821e+00 3.8384263e+00 3.2202056e+00 2.2240476e+00 2.4960474e+00 2.3970928e+00 2.6119950e+00 3.7951491e+00 3.1592993e+00 3.2300555e+00 3.5604418e+00 3.2025128e+00 2.7701355e+00 2.6892823e+00 3.0524247e+00 3.3177721e+00 2.7092568e+00 2.0227167e+00 2.8731220e+00 2.8671099e+00 2.8775912e+00 3.0586720e+00 1.7332099e+00 2.7865812e+00 4.7866828e+00 3.8123695e+00 4.7714708e+00 4.3189924e+00 4.5796358e+00 5.5132325e+00 3.1921277e+00 5.1489022e+00 4.5737586e+00 5.0249531e+00 3.9185849e+00 4.0697987e+00 4.3502657e+00 3.7349501e+00 3.9102370e+00 4.1311343e+00 4.2548570e+00 5.6362307e+00 5.8240252e+00 3.7174048e+00 4.5773480e+00 3.6270581e+00 5.6209145e+00 3.6774027e+00 4.5072397e+00 4.8555167e+00 3.5675580e+00 3.6401392e+00 4.3693804e+00 4.6657186e+00 5.0062061e+00 5.4227201e+00 4.3844239e+00 3.8261182e+00 4.2718480e+00 5.1373047e+00 4.4043123e+00 4.2383633e+00 3.5347392e+00 4.2868650e+00 4.4668117e+00 4.0716645e+00 3.8123695e+00 4.7338066e+00 4.5734052e+00 4.1036179e+00 3.7882079e+00 4.0078491e+00 4.1922661e+00 3.8027591e+00 6.8961791e-01 3.0546431e-01 4.4417983e-01 2.0656129e-01 4.1586001e-01 7.6625946e-01 8.9687438e-01 1.0919712e+00 5.7867728e-01 1.5422108e-01 7.3851529e-01 4.0293660e-01 4.1312257e-01 3.2586371e-01 5.7257017e-01 3.2816937e-01 4.1312257e-01 4.0147421e-01 2.0656129e-01 2.0656129e-01 2.0656129e-01 3.2586371e-01 3.2586371e-01 4.1312257e-01 7.0437330e-01 8.5205778e-01 3.0546431e-01 3.2352160e-01 5.0905001e-01 3.0546431e-01 6.5172743e-01 1.0000000e-01 2.1269358e-01 1.1283882e+00 6.1092863e-01 4.0293660e-01 5.0592043e-01 4.1586001e-01 4.0293660e-01 4.1449626e-01 3.7255734e-01 1.2418578e-01 3.4445326e+00 3.1392617e+00 3.6011035e+00 2.6118700e+00 3.2516941e+00 3.0511838e+00 3.3218097e+00 1.9189245e+00 3.2468925e+00 2.4924452e+00 2.2081024e+00 2.8038661e+00 2.6291264e+00 3.2767369e+00 2.1964719e+00 3.1025274e+00 3.0696611e+00 2.6485861e+00 3.1554034e+00 2.4715204e+00 3.4135983e+00 2.6151245e+00 3.5092032e+00 3.2604423e+00 2.9354140e+00 3.0782101e+00 3.4818889e+00 3.6726568e+00 3.0922811e+00 2.0843471e+00 2.3874354e+00 2.2845234e+00 2.4794505e+00 3.6775470e+00 3.0659000e+00 3.1055388e+00 3.3775462e+00 3.0430948e+00 2.6597612e+00 2.5873149e+00 2.9471553e+00 3.1807044e+00 2.5795723e+00 1.9450499e+00 2.7640668e+00 2.7473221e+00 2.7611864e+00 2.9015702e+00 1.6626642e+00 2.6693888e+00 4.6823704e+00 3.7130994e+00 4.6117428e+00 4.1946425e+00 4.4565357e+00 5.3399939e+00 3.1168466e+00 4.9805386e+00 4.4303862e+00 4.8738189e+00 3.7806643e+00 3.9387918e+00 4.2018804e+00 3.6441274e+00 3.8290120e+00 4.0132700e+00 4.1177139e+00 5.4615788e+00 5.6559440e+00 3.5983434e+00 4.4321573e+00 3.5405803e+00 5.4429455e+00 3.5441556e+00 4.3687483e+00 4.6853394e+00 3.4399664e+00 3.5203203e+00 4.2473048e+00 4.4861009e+00 4.8281381e+00 5.2242271e+00 4.2652659e+00 3.6876909e+00 4.1503255e+00 4.9488209e+00 4.2966585e+00 4.1071698e+00 3.4205830e+00 4.1292490e+00 4.3363292e+00 3.9150359e+00 3.7130994e+00 4.5977729e+00 4.4473292e+00 3.9643224e+00 3.6603913e+00 3.8715927e+00 4.0861975e+00 3.6954796e+00 5.0991930e-01 1.1327825e+00 5.7257017e-01 4.0293660e-01 3.0811765e-01 1.5771666e+00 1.7488874e+00 1.2431040e+00 8.1273630e-01 1.4170618e+00 1.0106392e+00 1.0389435e+00 9.3824087e-01 7.3813096e-01 7.5976039e-01 6.6491075e-01 6.0611244e-01 6.9728513e-01 8.8861541e-01 8.5177726e-01 3.8776762e-01 4.2538717e-01 1.0346741e+00 1.2943100e+00 1.5015203e+00 5.0991930e-01 6.2482915e-01 1.1473003e+00 5.0991930e-01 1.2418578e-01 7.6752131e-01 7.4586719e-01 6.0181382e-01 3.0275928e-01 7.7869083e-01 1.0440187e+00 4.0293660e-01 1.0120221e+00 3.2352160e-01 1.0597541e+00 6.4704320e-01 3.7504939e+00 3.3717768e+00 3.8731169e+00 2.7062054e+00 3.4865562e+00 3.1921903e+00 3.5262546e+00 1.9522524e+00 3.5018009e+00 2.5914913e+00 2.1818668e+00 2.9807120e+00 2.7874290e+00 3.4557351e+00 2.3604042e+00 3.3915488e+00 3.2027420e+00 2.8150728e+00 3.3206640e+00 2.6018930e+00 3.5642457e+00 2.8360166e+00 3.6902583e+00 3.4394878e+00 3.1847477e+00 3.3503379e+00 3.7461474e+00 3.9068076e+00 3.2666666e+00 2.2590074e+00 2.4950353e+00 2.3935209e+00 2.6534332e+00 3.8259590e+00 3.1834936e+00 3.2834077e+00 3.6377049e+00 3.2390016e+00 2.8060305e+00 2.7012392e+00 3.0647279e+00 3.3658240e+00 2.7423171e+00 1.9645331e+00 2.8984764e+00 2.9033203e+00 2.9139413e+00 3.1189900e+00 1.7118795e+00 2.8228127e+00 4.8290847e+00 3.8416142e+00 4.8350745e+00 4.3569606e+00 4.6261788e+00 5.5774554e+00 3.1958228e+00 5.2067803e+00 4.6153241e+00 5.0947934e+00 3.9803199e+00 4.1159553e+00 4.4131159e+00 3.7587872e+00 3.9513472e+00 4.1881498e+00 4.3024754e+00 5.7071195e+00 5.8839539e+00 3.7280682e+00 4.6419531e+00 3.6578722e+00 5.6843788e+00 3.7276068e+00 4.5625120e+00 4.9179194e+00 3.6182608e+00 3.6866535e+00 4.4136707e+00 4.7307689e+00 5.0723886e+00 5.5062533e+00 4.4301849e+00 3.8690719e+00 4.2943891e+00 5.2192815e+00 4.4536259e+00 4.2828634e+00 3.5797958e+00 4.3570079e+00 4.5278761e+00 4.1542558e+00 3.8416142e+00 4.7899951e+00 4.6341170e+00 4.1740602e+00 3.8316735e+00 4.0656969e+00 4.2413113e+00 3.8376713e+00 6.8961791e-01 3.0811765e-01 1.4096146e-01 6.4755655e-01 1.1229906e+00 1.3835747e+00 8.6361309e-01 4.2667565e-01 9.4009473e-01 7.0784540e-01 5.3665999e-01 6.2482915e-01 6.3977563e-01 4.3691963e-01 4.4651726e-01 1.5422108e-01 3.7598397e-01 4.4535192e-01 3.7598397e-01 2.1845981e-01 1.4096146e-01 5.5419992e-01 1.0065841e+00 1.1474460e+00 0.0000000e+00 3.0811765e-01 6.5223271e-01 0.0000000e+00 5.0991930e-01 3.2586371e-01 4.2667565e-01 8.3172002e-01 5.0991930e-01 5.6769031e-01 7.5082357e-01 2.1845981e-01 7.0479928e-01 3.0811765e-01 6.4755655e-01 2.1845981e-01 3.4865562e+00 3.1726595e+00 3.6377960e+00 2.5987470e+00 3.2814045e+00 3.0627375e+00 3.3515846e+00 1.8841865e+00 3.2769379e+00 2.5038079e+00 2.1311468e+00 2.8311678e+00 2.6104387e+00 3.2962520e+00 2.2214438e+00 3.1433122e+00 3.0878634e+00 2.6552472e+00 3.1570103e+00 2.4668912e+00 3.4394878e+00 2.6411293e+00 3.5233648e+00 3.2747247e+00 2.9659871e+00 3.1154783e+00 3.5134741e+00 3.7059620e+00 3.1148696e+00 2.0851901e+00 2.3731428e+00 2.2655571e+00 2.4927109e+00 3.6920087e+00 3.0823446e+00 3.1337459e+00 3.4135200e+00 3.0481703e+00 2.6780487e+00 2.5874301e+00 2.9489507e+00 3.2027420e+00 2.5873149e+00 1.8973383e+00 2.7738355e+00 2.7632614e+00 2.7778954e+00 2.9269923e+00 1.6390769e+00 2.6848587e+00 4.7106706e+00 3.7313856e+00 4.6446321e+00 4.2142736e+00 4.4836580e+00 5.3716885e+00 3.1250284e+00 5.0074019e+00 4.4485220e+00 4.9128219e+00 3.8150636e+00 3.9624529e+00 4.2358121e+00 3.6602286e+00 3.8605980e+00 4.0488387e+00 4.1418643e+00 5.4970002e+00 5.6855224e+00 3.5964347e+00 4.4685630e+00 3.5634461e+00 5.4730406e+00 3.5693950e+00 4.3989089e+00 4.7150659e+00 3.4668130e+00 3.5464993e+00 4.2723380e+00 4.5155386e+00 4.8594290e+00 5.2647079e+00 4.2921213e+00 3.7064459e+00 4.1581964e+00 4.9913682e+00 4.3286007e+00 4.1303097e+00 3.4468286e+00 4.1669742e+00 4.3729308e+00 3.9624170e+00 3.7313856e+00 4.6297577e+00 4.4844827e+00 4.0056359e+00 3.6817961e+00 3.9035218e+00 4.1179678e+00 3.7164366e+00 6.2024833e-01 8.1304731e-01 1.1868139e+00 4.8036801e-01 7.1799256e-01 2.8192292e-01 3.2816937e-01 3.2816937e-01 3.0546431e-01 3.2352160e-01 3.2352160e-01 8.5205778e-01 4.8927739e-01 6.6384020e-01 7.3496673e-01 4.5581864e-01 2.4837156e-01 3.2586371e-01 7.6752131e-01 7.4549115e-01 3.2352160e-01 4.1449626e-01 5.0180477e-01 6.8961791e-01 5.8851328e-01 2.5251796e-01 6.8961791e-01 1.0919712e+00 3.7255734e-01 4.2667565e-01 1.4993782e+00 1.0344911e+00 5.0592043e-01 4.5581864e-01 8.1304731e-01 3.0546431e-01 8.5205778e-01 1.0000000e-01 4.9766035e-01 3.3472053e+00 3.0922811e+00 3.5254266e+00 2.6661987e+00 3.2094276e+00 3.0570957e+00 3.2869053e+00 2.0190980e+00 3.1913594e+00 2.5206151e+00 2.3403819e+00 2.7928582e+00 2.6680945e+00 3.2615924e+00 2.2070201e+00 3.0233425e+00 3.0716969e+00 2.6575076e+00 3.1694367e+00 2.5088543e+00 3.4030318e+00 2.5954147e+00 3.4988409e+00 3.2483608e+00 2.8891737e+00 3.0123702e+00 3.4182420e+00 3.6203759e+00 3.0811775e+00 2.1190324e+00 2.4416796e+00 2.3440712e+00 2.4897570e+00 3.6753309e+00 3.0715435e+00 3.0851463e+00 3.3123070e+00 3.0424689e+00 2.6625505e+00 2.6241824e+00 2.9689697e+00 3.1616811e+00 2.5961850e+00 2.0559262e+00 2.7803619e+00 2.7462372e+00 2.7639489e+00 2.8736288e+00 1.7674365e+00 2.6773131e+00 4.6660957e+00 3.7173526e+00 4.5567672e+00 4.1782968e+00 4.4326194e+00 5.2720689e+00 3.1469325e+00 4.9232255e+00 4.4057732e+00 4.8164157e+00 3.7433882e+00 3.9194796e+00 4.1567419e+00 3.6582432e+00 3.8303544e+00 3.9861488e+00 4.0892044e+00 5.3882212e+00 5.5946413e+00 3.6180819e+00 4.3839191e+00 3.5469476e+00 5.3734444e+00 3.5262672e+00 4.3306501e+00 4.6237863e+00 3.4237160e+00 3.5051302e+00 4.2288456e+00 4.4201622e+00 4.7609637e+00 5.1280035e+00 4.2469785e+00 3.6684143e+00 4.1480002e+00 4.8602572e+00 4.2765700e+00 4.0824098e+00 3.4092877e+00 4.0737132e+00 4.2991233e+00 3.8524190e+00 3.7173526e+00 4.5590471e+00 4.4107160e+00 3.9202843e+00 3.6509512e+00 3.8388884e+00 4.0680120e+00 3.6894983e+00 4.1449626e-01 6.6539428e-01 1.0717668e+00 1.1847335e+00 7.0776547e-01 3.2816937e-01 9.2095040e-01 4.4651726e-01 6.0060595e-01 3.8934542e-01 6.1092863e-01 3.7598397e-01 3.0000000e-01 4.1312257e-01 2.4837156e-01 4.0293660e-01 4.1312257e-01 2.0656129e-01 3.0000000e-01 6.0611244e-01 7.3535471e-01 9.3801395e-01 3.0811765e-01 4.2538717e-01 7.1462831e-01 3.0811765e-01 5.2574978e-01 3.0275928e-01 3.2816937e-01 1.1107977e+00 4.5470518e-01 4.1449626e-01 4.8927739e-01 4.1449626e-01 4.4417983e-01 2.8192292e-01 5.2942799e-01 2.5251796e-01 3.4297053e+00 3.0906838e+00 3.5704156e+00 2.5301680e+00 3.2062204e+00 2.9663489e+00 3.2615889e+00 1.8330979e+00 3.2074600e+00 2.4030878e+00 2.1292724e+00 2.7344480e+00 2.5716369e+00 3.2053511e+00 2.1242643e+00 3.0798277e+00 2.9831836e+00 2.5729378e+00 3.0964590e+00 2.3917863e+00 3.3353616e+00 2.5635110e+00 3.4441347e+00 3.1882407e+00 2.8938821e+00 3.0477086e+00 3.4484194e+00 3.6265826e+00 3.0209783e+00 2.0203134e+00 2.3063579e+00 2.2046610e+00 2.4100833e+00 3.5972040e+00 2.9748436e+00 3.0349291e+00 3.3414931e+00 2.9918962e+00 2.5764694e+00 2.5038051e+00 2.8573838e+00 3.1113597e+00 2.5079404e+00 1.8623849e+00 2.6799601e+00 2.6656374e+00 2.6804452e+00 2.8458006e+00 1.5870088e+00 2.5906376e+00 4.6056614e+00 3.6293396e+00 4.5625120e+00 4.1184849e+00 4.3862724e+00 5.2957861e+00 3.0253131e+00 4.9300368e+00 4.3656957e+00 4.8256905e+00 3.7228356e+00 3.8717400e+00 4.1487889e+00 3.5605424e+00 3.7509165e+00 3.9489970e+00 4.0502806e+00 5.4193574e+00 5.6096505e+00 3.5201263e+00 4.3797165e+00 3.4555095e+00 5.4004015e+00 3.4805320e+00 4.3069452e+00 4.6373516e+00 3.3738930e+00 3.4478147e+00 4.1762321e+00 4.4428877e+00 4.7870294e+00 5.1982218e+00 4.1948678e+00 3.6180819e+00 4.0668114e+00 4.9227056e+00 4.2245318e+00 4.0358897e+00 3.3459883e+00 4.0835979e+00 4.2783731e+00 3.8797354e+00 3.6293396e+00 4.5370189e+00 4.3879553e+00 3.9155334e+00 3.5955337e+00 3.8113970e+00 4.0131848e+00 3.6132595e+00 5.2862779e-01 1.2431040e+00 1.5013525e+00 9.7779835e-01 5.3588338e-01 1.0669582e+00 8.1385214e-01 6.6432544e-01 7.2823007e-01 6.5223271e-01 5.1138698e-01 5.6700421e-01 2.5251796e-01 4.6472023e-01 5.6769031e-01 4.9766035e-01 2.5651975e-01 2.1269358e-01 6.6432544e-01 1.1134787e+00 1.2632199e+00 1.4096146e-01 2.8507955e-01 7.6787403e-01 1.4096146e-01 4.0293660e-01 4.4651726e-01 5.1691876e-01 7.1840099e-01 4.1586001e-01 6.3108414e-01 8.7021234e-01 2.0000000e-01 8.1385214e-01 2.5251796e-01 7.6787403e-01 3.2586371e-01 3.6025735e+00 3.2810515e+00 3.7511944e+00 2.6894009e+00 3.3904673e+00 3.1636869e+00 3.4574937e+00 1.9666356e+00 3.3893691e+00 2.5954173e+00 2.1997395e+00 2.9322283e+00 2.7092568e+00 3.4012145e+00 2.3186758e+00 3.2568914e+00 3.1861493e+00 2.7595194e+00 3.2561045e+00 2.5646808e+00 3.5381764e+00 2.7476411e+00 3.6278993e+00 3.3809159e+00 3.0768226e+00 3.2277675e+00 3.6265617e+00 3.8150532e+00 3.2176230e+00 2.1864840e+00 2.4668912e+00 2.3596992e+00 2.5949561e+00 3.7935487e+00 3.1789378e+00 3.2360886e+00 3.5252258e+00 3.1522058e+00 2.7777040e+00 2.6819136e+00 3.0473722e+00 3.3079290e+00 2.6886547e+00 1.9757309e+00 2.8726212e+00 2.8654680e+00 2.8788483e+00 3.0349462e+00 1.7160413e+00 2.7852734e+00 4.8087107e+00 3.8282466e+00 4.7531334e+00 4.3176393e+00 4.5857287e+00 5.4831923e+00 3.2147850e+00 5.1185883e+00 4.5544260e+00 5.0194259e+00 3.9185849e+00 4.0655452e+00 4.3416283e+00 3.7535680e+00 3.9509795e+00 4.1478442e+00 4.2472736e+00 5.6096505e+00 5.7957776e+00 3.6945993e+00 4.5734622e+00 3.6568202e+00 5.5854254e+00 3.6720840e+00 4.5038991e+00 4.8262859e+00 3.5684917e+00 3.6474985e+00 4.3740189e+00 4.6282931e+00 4.9713928e+00 5.3806679e+00 4.3928114e+00 3.8121990e+00 4.2612863e+00 5.1032991e+00 4.4267055e+00 4.2347444e+00 3.5464871e+00 4.2738510e+00 4.4745238e+00 4.0663411e+00 3.8282466e+00 4.7338066e+00 4.5852690e+00 4.1075310e+00 3.7823897e+00 4.0070636e+00 4.2156933e+00 3.8157950e+00 1.6177449e+00 1.7454671e+00 1.2604558e+00 8.6361309e-01 1.4955532e+00 1.0118409e+00 1.1594648e+00 9.6204649e-01 6.2081167e-01 9.1750357e-01 8.7504951e-01 7.6752131e-01 8.0660588e-01 9.5965467e-01 9.2859317e-01 5.7324170e-01 6.2205176e-01 1.1313840e+00 1.2653669e+00 1.4930627e+00 6.4755655e-01 7.0479928e-01 1.2236003e+00 6.4755655e-01 2.1269358e-01 8.5105559e-01 7.7360126e-01 7.1169738e-01 2.5651975e-01 8.7229670e-01 1.1327578e+00 5.3588338e-01 1.0269295e+00 3.8934542e-01 1.1042097e+00 7.2823007e-01 4.0317004e+00 3.6659830e+00 4.1618561e+00 3.0123702e+00 3.7804276e+00 3.4970843e+00 3.8244351e+00 2.2591077e+00 3.7930789e+00 2.8953397e+00 2.4889124e+00 3.2809188e+00 3.0866488e+00 3.7578933e+00 2.6595288e+00 3.6754272e+00 3.5073435e+00 3.1173742e+00 3.6212723e+00 2.9065572e+00 3.8667462e+00 3.1302383e+00 3.9918403e+00 3.7416229e+00 3.4760444e+00 3.6375992e+00 4.0358101e+00 4.2016915e+00 3.5683934e+00 2.5569968e+00 2.8007817e+00 2.6989368e+00 2.9539253e+00 4.1306024e+00 3.4882801e+00 3.5831257e+00 3.9280671e+00 3.5362697e+00 3.1099883e+00 3.0065416e+00 3.3706887e+00 3.6672620e+00 3.0442126e+00 2.2719663e+00 3.2032390e+00 3.2071637e+00 3.2176230e+00 3.4155491e+00 2.0139971e+00 3.1260028e+00 5.1310217e+00 4.1456639e+00 5.1323742e+00 4.6609614e+00 4.9284761e+00 5.8739676e+00 3.4984873e+00 5.5048216e+00 4.9175276e+00 5.3898806e+00 4.2781762e+00 4.4176533e+00 4.7107211e+00 4.0621414e+00 4.2494597e+00 4.4865569e+00 4.6045396e+00 6.0012333e+00 6.1816086e+00 4.0339598e+00 4.9390284e+00 3.9601358e+00 5.9803696e+00 4.0277694e+00 4.8626276e+00 5.2147981e+00 3.9185849e+00 3.9887029e+00 4.7161140e+00 5.0257341e+00 5.3673499e+00 5.7939320e+00 4.7320534e+00 4.1713411e+00 4.5995433e+00 5.5085511e+00 4.7536729e+00 4.5857356e+00 3.8819510e+00 4.6519178e+00 4.8256399e+00 4.4430890e+00 4.1456639e+00 5.0898961e+00 4.9316646e+00 4.4680158e+00 4.1325542e+00 4.3648035e+00 4.5412859e+00 4.1418557e+00 4.5581864e-01 4.1586001e-01 7.7074935e-01 5.0991930e-01 7.1840099e-01 7.2486328e-01 7.3145860e-01 1.2122249e+00 9.2112464e-01 1.1384810e+00 1.1451403e+00 9.1163729e-01 7.0386584e-01 7.4855857e-01 1.2220203e+00 1.1947245e+00 6.6827038e-01 6.2081167e-01 3.4378533e-01 1.1229906e+00 9.9348625e-01 5.2942799e-01 1.1229906e+00 1.5344133e+00 8.2275389e-01 8.5233811e-01 1.8985661e+00 1.4692412e+00 8.9653332e-01 8.7420176e-01 1.2431040e+00 7.3813096e-01 1.2951131e+00 5.5419992e-01 9.3801395e-01 3.5789198e+00 3.3663244e+00 3.7753619e+00 3.0049442e+00 3.4909841e+00 3.3695525e+00 3.5654259e+00 2.3989172e+00 3.4663502e+00 2.8427326e+00 2.7185849e+00 3.0894572e+00 3.0108764e+00 3.5617386e+00 2.5173832e+00 3.2758681e+00 3.3732554e+00 2.9816791e+00 3.4895316e+00 2.8451507e+00 3.6905956e+00 2.8989400e+00 3.8036776e+00 3.5549103e+00 3.1734856e+00 3.2772927e+00 3.6834126e+00 3.8868430e+00 3.3809159e+00 2.4588872e+00 2.7850016e+00 2.6918796e+00 2.8113773e+00 3.9804187e+00 3.3742776e+00 3.3692592e+00 3.5726491e+00 3.3587234e+00 2.9691171e+00 2.9539253e+00 3.2926883e+00 3.4584304e+00 2.9217347e+00 2.4321061e+00 3.0988783e+00 3.0546600e+00 3.0736357e+00 3.1699903e+00 2.1306832e+00 2.9913743e+00 4.9420128e+00 4.0177712e+00 4.8123874e+00 4.4703485e+00 4.7113827e+00 5.5147622e+00 3.4715574e+00 5.1811127e+00 4.6944291e+00 5.0587041e+00 4.0117533e+00 4.2085851e+00 4.4199792e+00 3.9616570e+00 4.1103933e+00 4.2537610e+00 4.3721243e+00 5.6218420e+00 5.8419148e+00 3.9412893e+00 4.6390186e+00 3.8408636e+00 5.6159291e+00 3.8175051e+00 4.5984929e+00 4.8771654e+00 3.7143727e+00 3.7943375e+00 4.5141564e+00 4.6734732e+00 5.0086627e+00 5.3396700e+00 4.5298770e+00 3.9647930e+00 4.4561969e+00 5.0778756e+00 4.5477422e+00 4.3671210e+00 3.6996802e+00 4.3269400e+00 4.5602465e+00 4.0901232e+00 4.0177712e+00 4.8233796e+00 4.6689006e+00 4.1757336e+00 3.9466531e+00 4.1130674e+00 4.3408596e+00 3.9840684e+00 5.3588338e-01 9.7098574e-01 6.0611244e-01 7.4549115e-01 1.0101422e+00 8.1242502e-01 1.2342162e+00 1.1486378e+00 1.1959482e+00 1.4468211e+00 1.0906388e+00 9.4287188e-01 1.0346741e+00 1.3793330e+00 1.4148192e+00 1.0065841e+00 5.5419992e-01 2.8507955e-01 1.3835747e+00 1.2681309e+00 9.0679720e-01 1.3835747e+00 1.6801917e+00 1.0588560e+00 1.0122141e+00 2.2040881e+00 1.5564198e+00 1.0122141e+00 7.7553525e-01 1.4987155e+00 7.4893123e-01 1.4320120e+00 7.3813096e-01 1.1765359e+00 3.3186105e+00 3.0934278e+00 3.5115632e+00 2.9015832e+00 3.2557855e+00 3.1381850e+00 3.2787144e+00 2.3983798e+00 3.2261964e+00 2.6655261e+00 2.7738368e+00 2.8425716e+00 2.9377092e+00 3.3097860e+00 2.3365894e+00 3.0236933e+00 3.1147370e+00 2.7988444e+00 3.3431646e+00 2.7201960e+00 3.4033622e+00 2.7009102e+00 3.5863979e+00 3.3171611e+00 2.9439491e+00 3.0327979e+00 3.4475678e+00 3.6195561e+00 3.1337459e+00 2.3758157e+00 2.6957302e+00 2.6219409e+00 2.6429556e+00 3.7305206e+00 3.1152653e+00 3.0762634e+00 3.3088561e+00 3.2115055e+00 2.7318540e+00 2.8101506e+00 3.0967820e+00 3.1998457e+00 2.7619926e+00 2.4596921e+00 2.9002737e+00 2.8148869e+00 2.8449691e+00 2.9378173e+00 2.1723936e+00 2.7843048e+00 4.6358686e+00 3.7621042e+00 4.5316360e+00 4.1928583e+00 4.4221843e+00 5.2364242e+00 3.2682245e+00 4.9072991e+00 4.4428425e+00 4.7561724e+00 3.7219581e+00 3.9498605e+00 4.1390009e+00 3.7275066e+00 3.8377652e+00 3.9569614e+00 4.0917968e+00 5.3289557e+00 5.5738695e+00 3.7540308e+00 4.3457024e+00 3.5797958e+00 5.3465693e+00 3.5720882e+00 4.3012547e+00 4.5936468e+00 3.4616111e+00 3.5205889e+00 4.2389017e+00 4.4031390e+00 4.7432976e+00 5.0569442e+00 4.2531342e+00 3.7092459e+00 4.2038056e+00 4.8064634e+00 4.2402361e+00 4.0806404e+00 3.4276314e+00 4.0438546e+00 4.2676463e+00 3.8085992e+00 3.7621042e+00 4.5272919e+00 4.3667579e+00 3.8946701e+00 3.7163265e+00 3.8338395e+00 4.0342445e+00 3.7061759e+00 4.4651726e-01 4.4651726e-01 3.2816937e-01 5.7257017e-01 3.4378533e-01 8.2384013e-01 6.6432544e-01 8.0758367e-01 9.3048953e-01 5.8851328e-01 4.3691963e-01 5.1691876e-01 8.8062848e-01 8.9917007e-01 5.0817745e-01 3.6171588e-01 3.2816937e-01 8.6361309e-01 7.3851529e-01 4.1449626e-01 8.6361309e-01 1.1845977e+00 5.4292906e-01 4.9766035e-01 1.6754036e+00 1.0919712e+00 5.3309112e-01 6.2024833e-01 9.7098574e-01 3.8934542e-01 9.3824087e-01 2.8507955e-01 6.5223271e-01 3.5185448e+00 3.2633258e+00 3.6996953e+00 2.8710255e+00 3.3892942e+00 3.2497279e+00 3.4561374e+00 2.2371784e+00 3.3772302e+00 2.7023432e+00 2.5704711e+00 2.9638836e+00 2.8904978e+00 3.4483274e+00 2.3826791e+00 3.1954061e+00 3.2493673e+00 2.8645447e+00 3.3669805e+00 2.7184506e+00 3.5654259e+00 2.7812639e+00 3.6908684e+00 3.4451701e+00 3.0736340e+00 3.1881331e+00 3.6017790e+00 3.7914024e+00 3.2604423e+00 2.3308454e+00 2.6548674e+00 2.5630676e+00 2.6859989e+00 3.8615219e+00 3.2492317e+00 3.2498302e+00 3.4856775e+00 3.2460061e+00 2.8456767e+00 2.8220742e+00 3.1709561e+00 3.3452644e+00 2.7965957e+00 2.2780262e+00 2.9733693e+00 2.9362769e+00 2.9511072e+00 3.0600825e+00 1.9688013e+00 2.8661222e+00 4.8176767e+00 3.8889176e+00 4.7230291e+00 4.3578295e+00 4.5962942e+00 5.4442203e+00 3.3242177e+00 5.1039076e+00 4.5914416e+00 4.9653393e+00 3.8994399e+00 4.0931001e+00 4.3174903e+00 3.8262108e+00 3.9673816e+00 4.1302370e+00 4.2654212e+00 5.5551457e+00 5.7673205e+00 3.8189943e+00 4.5366342e+00 3.7059360e+00 5.5500825e+00 3.6985459e+00 4.4934936e+00 4.7995387e+00 3.5922369e+00 3.6724425e+00 4.3963259e+00 4.6010378e+00 4.9364818e+00 5.2936070e+00 4.4094664e+00 3.8558772e+00 4.3453589e+00 5.0159331e+00 4.4225169e+00 4.2579435e+00 3.5745624e+00 4.2301614e+00 4.4459076e+00 3.9875954e+00 3.8889176e+00 4.7169919e+00 4.5531173e+00 4.0619315e+00 3.8238093e+00 3.9999729e+00 4.2141826e+00 3.8611742e+00 6.3808075e-01 3.0275928e-01 3.7598397e-01 2.1269358e-01 5.6769031e-01 3.4378533e-01 5.3022554e-01 5.0991930e-01 2.1845981e-01 1.4096146e-01 1.4096146e-01 4.5581864e-01 4.5581864e-01 3.0811765e-01 6.0670504e-01 7.3496673e-01 4.2667565e-01 3.2816937e-01 4.0293660e-01 4.2667565e-01 7.6787403e-01 1.4096146e-01 1.2418578e-01 1.2394907e+00 7.1504098e-01 3.2586371e-01 5.2942799e-01 5.2862779e-01 3.2586371e-01 5.2942799e-01 2.5651975e-01 2.1269358e-01 3.4944845e+00 3.2032390e+00 3.6588207e+00 2.7040077e+00 3.3172489e+00 3.1387381e+00 3.3902207e+00 2.0195610e+00 3.3129652e+00 2.5744164e+00 2.3173648e+00 2.8753045e+00 2.7215057e+00 3.3565935e+00 2.2694598e+00 3.1556501e+00 3.1511848e+00 2.7390328e+00 3.2351115e+00 2.5646808e+00 3.4858646e+00 2.6854398e+00 3.5885398e+00 3.3452644e+00 3.0014619e+00 3.1359624e+00 3.5442447e+00 3.7351231e+00 3.1683717e+00 2.1722580e+00 2.4832809e+00 2.3831271e+00 2.5617005e+00 3.7607269e+00 3.1489919e+00 3.1764760e+00 3.4370400e+00 3.1222134e+00 2.7420671e+00 2.6759392e+00 3.0406669e+00 3.2584404e+00 2.6649106e+00 2.0477765e+00 2.8508344e+00 2.8325946e+00 2.8443188e+00 2.9745020e+00 1.7495699e+00 2.7521074e+00 4.7498176e+00 3.7908064e+00 4.6736601e+00 4.2736523e+00 4.5261084e+00 5.4025762e+00 3.1986968e+00 5.0495127e+00 4.5070435e+00 4.9284820e+00 3.8418637e+00 4.0108142e+00 4.2628455e+00 3.7198158e+00 3.8891307e+00 4.0719001e+00 4.1917075e+00 5.5215376e+00 5.7192826e+00 3.6876129e+00 4.4897240e+00 3.6129201e+00 5.5066558e+00 3.6138577e+00 4.4349731e+00 4.7514299e+00 3.5090368e+00 3.5920050e+00 4.3185209e+00 4.5521574e+00 4.8905855e+00 5.2768100e+00 4.3339547e+00 3.7672401e+00 4.2403934e+00 4.9963306e+00 4.3598652e+00 4.1826701e+00 3.4920978e+00 4.1853524e+00 4.3933832e+00 3.9574195e+00 3.7908064e+00 4.6611791e+00 4.5034762e+00 4.0149574e+00 3.7307866e+00 3.9355645e+00 4.1498459e+00 3.7732223e+00 6.0551856e-01 4.4535192e-01 6.0670504e-01 1.1765359e+00 6.9325418e-01 9.2288144e-01 9.3637892e-01 7.3535471e-01 5.3665999e-01 5.8914551e-01 1.0576043e+00 1.0106392e+00 4.5581864e-01 5.4292906e-01 4.5581864e-01 9.4009473e-01 8.6290690e-01 4.5581864e-01 9.4009473e-01 1.3885563e+00 6.5223271e-01 7.4740267e-01 1.7041201e+00 1.3421549e+00 7.2823007e-01 6.0611244e-01 1.0653845e+00 6.0121055e-01 1.1521791e+00 4.1586001e-01 7.7919451e-01 3.1037808e+00 2.8727295e+00 3.2914954e+00 2.5112138e+00 2.9950832e+00 2.8632951e+00 3.0711321e+00 1.9332545e+00 2.9709745e+00 2.3448578e+00 2.2688022e+00 2.5914913e+00 2.5183808e+00 3.0579528e+00 2.0217308e+00 2.7906520e+00 2.8719896e+00 2.4738237e+00 2.9926636e+00 2.3440712e+00 3.1967616e+00 2.3980102e+00 3.3005331e+00 3.0483897e+00 2.6752185e+00 2.7868575e+00 3.1931777e+00 3.3968373e+00 2.8794765e+00 1.9640287e+00 2.2899742e+00 2.1990648e+00 2.3082381e+00 3.4762640e+00 2.8726212e+00 2.8752807e+00 3.0841055e+00 2.8599559e+00 2.4658566e+00 2.4543822e+00 2.7852734e+00 2.9558536e+00 2.4184985e+00 1.9730073e+00 2.5941661e+00 2.5490308e+00 2.5692104e+00 2.6676432e+00 1.6855044e+00 2.4875166e+00 4.4549901e+00 3.5192877e+00 4.3283747e+00 3.9701062e+00 4.2192020e+00 5.0364062e+00 2.9740218e+00 4.6944291e+00 4.1953299e+00 4.5849301e+00 3.5249823e+00 3.7114178e+00 3.9340128e+00 3.4663826e+00 3.6308220e+00 3.7719045e+00 3.8752244e+00 5.1489675e+00 5.3620178e+00 3.4363773e+00 4.1584261e+00 3.3485848e+00 5.1375979e+00 3.3209346e+00 4.1101337e+00 4.3926615e+00 3.2186045e+00 3.2982828e+00 4.0192434e+00 4.1885158e+00 4.5274663e+00 4.8785522e+00 4.0373008e+00 3.4619693e+00 3.9494193e+00 4.6147130e+00 4.0642632e+00 3.8698115e+00 3.2042572e+00 3.8459316e+00 4.0795080e+00 3.6227082e+00 3.5192877e+00 4.3377723e+00 4.1907472e+00 3.6992844e+00 3.4507210e+00 3.6230931e+00 3.8568809e+00 3.4855556e+00 4.5581864e-01 1.2418578e-01 6.2660376e-01 5.1607523e-01 5.2655962e-01 8.0096515e-01 4.0438741e-01 3.0546431e-01 4.0438741e-01 6.4806901e-01 7.1504098e-01 4.4535192e-01 3.2586371e-01 4.9857388e-01 7.0784540e-01 6.2081167e-01 4.5581864e-01 7.0784540e-01 9.3824087e-01 4.0147421e-01 3.2586371e-01 1.5252485e+00 8.1558458e-01 3.7598397e-01 4.0147421e-01 8.1099042e-01 1.2418578e-01 6.9006418e-01 2.1269358e-01 5.0270183e-01 3.4104878e+00 3.1150013e+00 3.5735680e+00 2.6813198e+00 3.2413086e+00 3.0598576e+00 3.2985843e+00 2.0418831e+00 3.2329790e+00 2.5171713e+00 2.3816204e+00 2.7937685e+00 2.7102198e+00 3.2724336e+00 2.2054062e+00 3.0737397e+00 3.0650685e+00 2.6738621e+00 3.1983741e+00 2.5253420e+00 3.3951420e+00 2.6185785e+00 3.5201263e+00 3.2642011e+00 2.9245132e+00 3.0559405e+00 3.4672191e+00 3.6501426e+00 3.0869409e+00 2.1449779e+00 2.4611582e+00 2.3678836e+00 2.5038051e+00 3.6798850e+00 3.0627375e+00 3.0833417e+00 3.3518108e+00 3.0810282e+00 2.6595270e+00 2.6323570e+00 2.9747184e+00 3.1719581e+00 2.6119950e+00 2.0875308e+00 2.7837517e+00 2.7481947e+00 2.7653278e+00 2.8959432e+00 1.7918633e+00 2.6810089e+00 4.6579399e+00 3.7114178e+00 4.5860934e+00 4.1845117e+00 4.4368376e+00 5.3138890e+00 3.1392617e+00 4.9608959e+00 4.4280037e+00 4.8387532e+00 3.7530908e+00 3.9304148e+00 4.1764880e+00 3.6510310e+00 3.8111653e+00 3.9838913e+00 4.1019789e+00 5.4302306e+00 5.6352651e+00 3.6334268e+00 4.4011799e+00 3.5332521e+00 5.4201202e+00 3.5378545e+00 4.3430510e+00 4.6603717e+00 3.4302376e+00 3.5053533e+00 4.2335883e+00 4.4640423e+00 4.8059592e+00 5.1881280e+00 4.2497073e+00 3.6834126e+00 4.1572779e+00 4.9128775e+00 4.2687104e+00 4.0908836e+00 3.4061169e+00 4.0989195e+00 4.3064904e+00 3.8759115e+00 3.7114178e+00 4.5707958e+00 4.4147019e+00 3.9326468e+00 3.6624594e+00 3.8494244e+00 4.0586633e+00 3.6843892e+00 4.0176783e-01 9.3801395e-01 3.7427929e-01 6.0551856e-01 4.9766035e-01 4.1449626e-01 2.5251796e-01 3.2352160e-01 7.0437330e-01 6.2024833e-01 2.4837156e-01 7.0826681e-01 8.1099042e-01 5.3665999e-01 5.7257017e-01 4.0293660e-01 5.3665999e-01 1.0321505e+00 3.2352160e-01 4.9857388e-01 1.2654843e+00 1.0181000e+00 4.9857388e-01 4.6472023e-01 6.6432544e-01 4.4535192e-01 8.1354181e-01 3.2586371e-01 4.4535192e-01 3.1652953e+00 2.9034751e+00 3.3383293e+00 2.4277398e+00 3.0113552e+00 2.8500355e+00 3.0981427e+00 1.7594421e+00 2.9944056e+00 2.3105335e+00 2.0559262e+00 2.5987706e+00 2.4171653e+00 3.0605340e+00 2.0054351e+00 2.8372675e+00 2.8748086e+00 2.4385827e+00 2.9411544e+00 2.2761106e+00 3.2149087e+00 2.3896630e+00 3.2878368e+00 3.0415738e+00 2.6906230e+00 2.8216976e+00 3.2222602e+00 3.4304873e+00 2.8822802e+00 1.8816502e+00 2.1994544e+00 2.0961718e+00 2.2729984e+00 3.4713427e+00 2.8746311e+00 2.8977380e+00 3.1239380e+00 2.8149627e+00 2.4626518e+00 2.3988202e+00 2.7512943e+00 2.9634715e+00 2.3744738e+00 1.7861398e+00 2.5679553e+00 2.5438761e+00 2.5602722e+00 2.6724144e+00 1.5132025e+00 2.4693940e+00 4.4818617e+00 3.5188715e+00 4.3693901e+00 3.9814082e+00 4.2430316e+00 5.0846750e+00 2.9378173e+00 4.7308926e+00 4.2026915e+00 4.6369546e+00 3.5592955e+00 3.7219741e+00 3.9702025e+00 3.4565374e+00 3.6485303e+00 3.8059948e+00 3.8952692e+00 5.2045888e+00 5.4038637e+00 3.3942456e+00 4.2018404e+00 3.3550631e+00 5.1838582e+00 3.3280757e+00 4.1439346e+00 4.4349731e+00 3.2284912e+00 3.3133518e+00 4.0354963e+00 4.2293106e+00 4.5707958e+00 4.9486891e+00 4.0555804e+00 3.4667821e+00 3.9402495e+00 4.6817169e+00 4.0952984e+00 3.8891597e+00 3.2181054e+00 3.8906833e+00 4.1179678e+00 3.6792093e+00 3.5188715e+00 4.3738746e+00 4.2318888e+00 3.7415007e+00 3.4482727e+00 3.6509580e+00 3.8867812e+00 3.4956677e+00 6.2660376e-01 4.1449626e-01 4.8927739e-01 7.0479928e-01 3.0546431e-01 2.5251796e-01 3.2816937e-01 5.7324170e-01 6.2538346e-01 3.7255734e-01 4.4535192e-01 5.7324170e-01 6.2482915e-01 5.3665999e-01 4.3691963e-01 6.2482915e-01 8.7420176e-01 3.2352160e-01 2.5651975e-01 1.4293465e+00 7.7360126e-01 2.5651975e-01 4.0147421e-01 7.1504098e-01 2.1269358e-01 6.2660376e-01 2.4837156e-01 4.1586001e-01 3.4011512e+00 3.1015495e+00 3.5629124e+00 2.6446848e+00 3.2242409e+00 3.0444970e+00 3.2854349e+00 1.9922212e+00 3.2208624e+00 2.4875432e+00 2.3235341e+00 2.7738624e+00 2.6761538e+00 3.2590031e+00 2.1770137e+00 3.0609726e+00 3.0488669e+00 2.6564689e+00 3.1671679e+00 2.4967542e+00 3.3778209e+00 2.5968629e+00 3.5012162e+00 3.2523394e+00 2.9093820e+00 3.0417674e+00 3.4541339e+00 3.6357801e+00 3.0695657e+00 2.1117686e+00 2.4265922e+00 2.3324013e+00 2.4794505e+00 3.6641654e+00 3.0465086e+00 3.0686943e+00 3.3395333e+00 3.0541897e+00 2.6428278e+00 2.6018930e+00 2.9558536e+00 3.1589081e+00 2.5867906e+00 2.0334278e+00 2.7624503e+00 2.7347909e+00 2.7481947e+00 2.8804789e+00 1.7294430e+00 2.6604040e+00 4.6390099e+00 3.6904099e+00 4.5721680e+00 4.1717456e+00 4.4201622e+00 5.3038306e+00 3.1101376e+00 4.9521292e+00 4.4131751e+00 4.8218478e+00 3.7351231e+00 3.9119157e+00 4.1593600e+00 3.6239123e+00 3.7806200e+00 3.9616940e+00 4.0893976e+00 5.4208566e+00 5.6225133e+00 3.6099406e+00 4.3833809e+00 3.5087649e+00 5.4106224e+00 3.5167400e+00 4.3287713e+00 4.6517741e+00 3.4091049e+00 3.4875352e+00 4.2154392e+00 4.4559638e+00 4.7948032e+00 5.1800729e+00 4.2298456e+00 3.6705550e+00 4.1464752e+00 4.8981257e+00 4.2482702e+00 4.0788778e+00 3.3871264e+00 4.0817153e+00 4.2852718e+00 3.8517038e+00 3.6904099e+00 4.5544260e+00 4.3933832e+00 3.9084933e+00 3.6377874e+00 3.8310704e+00 4.0381483e+00 3.6684338e+00 7.9016429e-01 9.0454394e-01 7.7553525e-01 6.5633874e-01 6.8961791e-01 6.5172743e-01 6.4755655e-01 6.9325418e-01 8.5690100e-01 7.5871717e-01 9.8800009e-01 6.3977563e-01 5.0503591e-01 9.0852141e-01 6.3977563e-01 6.2482915e-01 6.2605182e-01 4.4651726e-01 1.3039319e+00 4.5470518e-01 6.8801986e-01 9.4492923e-01 6.5223271e-01 6.9325418e-01 4.9674312e-01 7.6752131e-01 5.2574978e-01 3.9950977e+00 3.6682165e+00 4.1454421e+00 3.1171350e+00 3.7869887e+00 3.5623665e+00 3.8418637e+00 2.4093459e+00 3.7913585e+00 2.9787373e+00 2.6930133e+00 3.3123070e+00 3.1668302e+00 3.7985007e+00 2.6980573e+00 3.6472316e+00 3.5682291e+00 3.1756360e+00 3.6828708e+00 2.9891564e+00 3.9102500e+00 3.1455588e+00 4.0375495e+00 3.7881557e+00 3.4756264e+00 3.6204175e+00 4.0288578e+00 4.2043522e+00 3.6069560e+00 2.6127852e+00 2.9004348e+00 2.8010550e+00 3.0013391e+00 4.1901031e+00 3.5584876e+00 3.6126340e+00 3.9170234e+00 3.5823448e+00 3.1646752e+00 3.0923554e+00 3.4563987e+00 3.7021702e+00 3.1018442e+00 2.4341346e+00 3.2724336e+00 3.2604423e+00 3.2715632e+00 3.4335342e+00 2.1375243e+00 3.1807243e+00 5.1732049e+00 4.2085267e+00 5.1402548e+00 4.7090394e+00 4.9640507e+00 5.8783901e+00 3.5970425e+00 5.5195747e+00 4.9586651e+00 5.3905797e+00 4.2919639e+00 4.4545908e+00 4.7214902e+00 4.1323720e+00 4.2962344e+00 4.5078390e+00 4.6379987e+00 5.9985593e+00 6.1927610e+00 4.1173292e+00 4.9467209e+00 4.0217355e+00 5.9855018e+00 4.0597680e+00 4.8845913e+00 5.2228901e+00 3.9505682e+00 4.0262006e+00 4.7557226e+00 5.0295898e+00 5.3695643e+00 5.7704875e+00 4.7697480e+00 4.2124808e+00 4.6690776e+00 5.4857949e+00 4.7867344e+00 4.6237863e+00 3.9220577e+00 4.6512574e+00 4.8397561e+00 4.4244727e+00 4.2085267e+00 5.1102370e+00 4.9464234e+00 4.4688286e+00 4.1733964e+00 4.3844239e+00 4.5752087e+00 4.1957914e+00 3.8934542e-01 3.7598397e-01 1.5422108e-01 3.4583729e-01 3.7598397e-01 4.4651726e-01 3.8934542e-01 3.2816937e-01 8.2929029e-01 9.3610001e-01 4.3691963e-01 5.3022554e-01 5.3309112e-01 4.3691963e-01 7.5976039e-01 3.2586371e-01 4.2667565e-01 1.0733200e+00 7.4777660e-01 2.1845981e-01 5.0905001e-01 4.3456114e-01 5.2942799e-01 5.5492130e-01 4.6472023e-01 3.7427929e-01 3.2191540e+00 2.9033203e+00 3.3725057e+00 2.3744738e+00 3.0162346e+00 2.8254861e+00 3.0850817e+00 1.6867642e+00 3.0206125e+00 2.2489449e+00 1.9859316e+00 2.5612285e+00 2.4037412e+00 3.0483897e+00 1.9482601e+00 2.8711841e+00 2.8361445e+00 2.4280197e+00 2.9151666e+00 2.2428341e+00 3.1709561e+00 2.3770599e+00 3.2772927e+00 3.0392407e+00 2.7044574e+00 2.8456337e+00 3.2543813e+00 3.4363773e+00 2.8560815e+00 1.8517858e+00 2.1570512e+00 2.0577182e+00 2.2449618e+00 3.4472201e+00 2.8333788e+00 2.8654874e+00 3.1455372e+00 2.8102985e+00 2.4278629e+00 2.3504126e+00 2.7240842e+00 2.9511072e+00 2.3468577e+00 1.7140774e+00 2.5325623e+00 2.5220817e+00 2.5303132e+00 2.6704164e+00 1.4096199e+00 2.4355523e+00 4.4339908e+00 3.4713427e+00 4.3742064e+00 3.9639546e+00 4.2144772e+00 5.1104621e+00 2.8721481e+00 4.7555981e+00 4.1997133e+00 4.6264002e+00 3.5337158e+00 3.6986235e+00 3.9580816e+00 3.3951420e+00 3.5651172e+00 3.7578933e+00 3.8852294e+00 5.2312618e+00 5.4232729e+00 3.3678461e+00 4.1846468e+00 3.2909043e+00 5.2164277e+00 3.3005331e+00 4.1286019e+00 4.4583488e+00 3.1948184e+00 3.2785487e+00 4.0052019e+00 4.2627019e+00 4.5989546e+00 4.9978258e+00 4.0193656e+00 3.4602150e+00 3.9315374e+00 4.7096962e+00 4.0441539e+00 3.8751788e+00 3.1769821e+00 3.8841455e+00 4.0829381e+00 3.6559398e+00 3.4713427e+00 4.3535851e+00 4.1922661e+00 3.7063225e+00 3.4135466e+00 3.6262912e+00 3.8337160e+00 3.4586921e+00 4.5470518e-01 3.4378533e-01 4.9766035e-01 5.6631629e-01 3.2586371e-01 3.7255734e-01 6.5172743e-01 7.6625946e-01 9.7356960e-01 4.4651726e-01 7.0784540e-01 8.1273630e-01 4.4651726e-01 6.8757066e-01 4.4417983e-01 6.0670504e-01 1.1521791e+00 6.5172743e-01 4.5581864e-01 4.5470518e-01 5.6700421e-01 4.8036801e-01 5.1607523e-01 5.8851328e-01 5.0905001e-01 3.1972361e+00 2.8360340e+00 3.3243092e+00 2.2696891e+00 2.9531300e+00 2.6835197e+00 2.9981183e+00 1.5916843e+00 2.9546153e+00 2.1366783e+00 1.9099663e+00 2.4717637e+00 2.3219731e+00 2.9300203e+00 1.8705419e+00 2.8448793e+00 2.7044574e+00 2.2951567e+00 2.8430073e+00 2.1220080e+00 3.0654291e+00 2.3117864e+00 3.1749624e+00 2.9091307e+00 2.6433897e+00 2.8065044e+00 3.2000771e+00 3.3714688e+00 2.7511201e+00 1.7679293e+00 2.0426611e+00 1.9423536e+00 2.1457242e+00 3.3172489e+00 2.6940968e+00 2.7682296e+00 3.0935247e+00 2.7391698e+00 2.2996943e+00 2.2360451e+00 2.5729378e+00 2.8382774e+00 2.2413445e+00 1.6312555e+00 2.4031247e+00 2.3848740e+00 2.4037412e+00 2.5843380e+00 1.3803845e+00 2.3178393e+00 4.3373464e+00 3.3555449e+00 4.3029534e+00 3.8394246e+00 4.1166152e+00 5.0345534e+00 2.7564428e+00 4.6628709e+00 4.0929284e+00 4.5724955e+00 3.4657942e+00 3.6038441e+00 3.8912788e+00 3.2935105e+00 3.4985926e+00 3.6938082e+00 3.7771525e+00 5.1600819e+00 5.3477989e+00 3.2453592e+00 4.1245629e+00 3.1885527e+00 5.1389533e+00 3.2183480e+00 4.0411872e+00 4.3734530e+00 3.1116430e+00 3.1793624e+00 3.9065553e+00 4.1815080e+00 4.5288943e+00 4.9506208e+00 3.9281139e+00 3.3421539e+00 3.7789119e+00 4.6812838e+00 3.9623295e+00 3.7603559e+00 3.0782101e+00 3.8325036e+00 4.0241284e+00 3.6474081e+00 3.3555449e+00 4.2739171e+00 4.1339606e+00 3.6720159e+00 3.3349237e+00 3.5512382e+00 3.7511837e+00 3.3364095e+00 4.1312257e-01 5.0905001e-01 4.2538717e-01 3.2352160e-01 2.0656129e-01 5.0592043e-01 1.1017858e+00 1.2234738e+00 1.5422108e-01 4.1312257e-01 6.3924842e-01 1.5422108e-01 6.1968386e-01 4.0293660e-01 5.2942799e-01 7.7919451e-01 6.2482915e-01 5.6631629e-01 8.1385214e-01 2.5251796e-01 8.0032200e-01 4.2538717e-01 7.1462831e-01 3.2352160e-01 3.3601225e+00 3.0492285e+00 3.5130686e+00 2.4784234e+00 3.1574358e+00 2.9495683e+00 3.2305582e+00 1.7639552e+00 3.1543365e+00 2.3872777e+00 2.0066796e+00 2.7104259e+00 2.4866453e+00 3.1794134e+00 2.0999661e+00 3.0164205e+00 2.9733298e+00 2.5409084e+00 3.0313923e+00 2.3496997e+00 3.3211033e+00 2.5173832e+00 3.4035007e+00 3.1599783e+00 2.8424094e+00 2.9896107e+00 3.3894792e+00 3.5821206e+00 2.9960387e+00 1.9633030e+00 2.2546134e+00 2.1472921e+00 2.3729779e+00 3.5766918e+00 2.9692947e+00 3.0147040e+00 3.2887803e+00 2.9233984e+00 2.5628362e+00 2.4694536e+00 2.8371552e+00 3.0850817e+00 2.4681135e+00 1.7749726e+00 2.6585961e+00 2.6493446e+00 2.6623632e+00 2.8060305e+00 1.5124582e+00 2.5679553e+00 4.5912390e+00 3.6144502e+00 4.5212874e+00 4.0982070e+00 4.3637125e+00 5.2494547e+00 3.0086587e+00 4.8875515e+00 4.3294620e+00 4.7880147e+00 3.6912876e+00 3.8418637e+00 4.1117747e+00 3.5413188e+00 3.7389462e+00 3.9250135e+00 4.0233529e+00 5.3754694e+00 5.5627643e+00 3.4785161e+00 4.3436980e+00 3.4455964e+00 5.3512930e+00 3.4471566e+00 4.2776053e+00 4.5941143e+00 3.3449470e+00 3.4269051e+00 4.1524717e+00 4.3946634e+00 4.7366258e+00 5.1414650e+00 4.1713411e+00 3.5895201e+00 4.0467919e+00 4.8635964e+00 4.2075047e+00 4.0127353e+00 3.3273395e+00 4.0411872e+00 4.2480617e+00 3.8321687e+00 3.6144502e+00 4.5072985e+00 4.3598062e+00 3.8780834e+00 3.5586316e+00 3.7805671e+00 3.9971028e+00 3.6003219e+00 2.5651975e-01 2.8192292e-01 3.4378533e-01 3.4378533e-01 4.0147421e-01 7.1840099e-01 8.5690100e-01 3.7598397e-01 4.2538717e-01 5.3665999e-01 3.7598397e-01 6.6827038e-01 2.1269358e-01 3.0546431e-01 1.1320702e+00 6.2988288e-01 2.0656129e-01 4.4535192e-01 4.2667565e-01 4.1449626e-01 4.3691963e-01 3.8934542e-01 2.5251796e-01 3.3428183e+00 3.0232018e+00 3.4944845e+00 2.4950353e+00 3.1381402e+00 2.9363801e+00 3.2027420e+00 1.8084630e+00 3.1409294e+00 2.3642733e+00 2.1113036e+00 2.6784604e+00 2.5283251e+00 3.1625374e+00 2.0667297e+00 2.9950041e+00 2.9473422e+00 2.5410503e+00 3.0407257e+00 2.3596992e+00 3.2858223e+00 2.4986337e+00 3.3960124e+00 3.1519721e+00 2.8255193e+00 2.9686973e+00 3.3765772e+00 3.5575681e+00 2.9720515e+00 1.9732878e+00 2.2758449e+00 2.1765379e+00 2.3630256e+00 3.5606213e+00 2.9432282e+00 2.9813163e+00 3.2672636e+00 2.9349850e+00 2.5393641e+00 2.4678343e+00 2.8348218e+00 3.0655803e+00 2.4649412e+00 1.8381372e+00 2.6459992e+00 2.6324803e+00 2.6428278e+00 2.7886501e+00 1.5384446e+00 2.5500177e+00 4.5509522e+00 3.5863729e+00 4.4953238e+00 4.0776551e+00 4.3319640e+00 5.2308062e+00 2.9880146e+00 4.8736353e+00 4.3174903e+00 4.7496159e+00 3.6545040e+00 3.8173510e+00 4.0797075e+00 3.5129177e+00 3.6850739e+00 3.8789949e+00 4.0011311e+00 5.3516635e+00 5.5447338e+00 3.4854203e+00 4.3070102e+00 3.4066692e+00 5.3366535e+00 3.4209331e+00 4.2472818e+00 4.5769661e+00 3.3144678e+00 3.3951450e+00 4.1229838e+00 4.3815083e+00 4.7200939e+00 5.1200990e+00 4.1381062e+00 3.5750015e+00 4.0416512e+00 4.8355880e+00 4.1628805e+00 3.9898962e+00 3.2934163e+00 4.0073765e+00 4.2053647e+00 3.7839552e+00 3.5863729e+00 4.4735121e+00 4.3145846e+00 3.8316735e+00 3.5355330e+00 3.7466071e+00 3.9521135e+00 3.5718733e+00 1.2418578e-01 5.2942799e-01 4.9766035e-01 2.5251796e-01 6.0060595e-01 7.1462831e-01 4.4535192e-01 3.8776762e-01 3.2352160e-01 4.4535192e-01 8.5434758e-01 1.2418578e-01 2.5251796e-01 1.2643026e+00 8.1354181e-01 4.1449626e-01 4.5581864e-01 5.6769031e-01 3.0546431e-01 6.2024833e-01 2.0656129e-01 2.5251796e-01 3.3898078e+00 3.1105347e+00 3.5575681e+00 2.6249526e+00 3.2229246e+00 3.0488669e+00 3.3004172e+00 1.9465831e+00 3.2118493e+00 2.4993166e+00 2.2473120e+00 2.7928582e+00 2.6296047e+00 3.2639046e+00 2.1933937e+00 3.0559188e+00 3.0673749e+00 2.6440180e+00 3.1486786e+00 2.4776707e+00 3.4056271e+00 2.5954147e+00 3.4958702e+00 3.2483608e+00 2.9041534e+00 3.0378828e+00 3.4425295e+00 3.6411503e+00 3.0811775e+00 2.0851901e+00 2.3997585e+00 2.2980893e+00 2.4741664e+00 3.6714798e+00 3.0661139e+00 3.0923102e+00 3.3390355e+00 3.0288896e+00 2.6566259e+00 2.5949561e+00 2.9511072e+00 3.1662394e+00 2.5768305e+00 1.9764051e+00 2.7650187e+00 2.7420671e+00 2.7570191e+00 2.8802219e+00 1.6913411e+00 2.6662783e+00 4.6723657e+00 3.7109297e+00 4.5802461e+00 4.1829734e+00 4.4414351e+00 5.3024507e+00 3.1246867e+00 4.9479218e+00 4.4123750e+00 4.8421359e+00 3.7582429e+00 3.9238367e+00 4.1750713e+00 3.6455011e+00 3.8262353e+00 3.9966275e+00 4.0997246e+00 5.4219259e+00 5.6210533e+00 3.5985833e+00 4.4045665e+00 3.5402439e+00 5.4041845e+00 3.5288526e+00 4.3467079e+00 4.6509698e+00 3.4261305e+00 3.5087649e+00 4.2340479e+00 4.4487072e+00 4.7898591e+00 5.1726632e+00 4.2521321e+00 3.6728562e+00 4.1446028e+00 4.9002452e+00 4.2845042e+00 4.0915924e+00 3.4110551e+00 4.0971854e+00 4.3142588e+00 3.8789274e+00 3.7109297e+00 4.5753785e+00 4.4261431e+00 3.9377466e+00 3.6482464e+00 3.8509694e+00 4.0749843e+00 3.6894983e+00 5.1607523e-01 4.5470518e-01 2.5251796e-01 7.0086313e-01 8.1067767e-01 3.7598397e-01 2.8192292e-01 3.0546431e-01 3.7598397e-01 8.2654509e-01 1.2418578e-01 2.1845981e-01 1.1754055e+00 8.0326782e-01 4.2667565e-01 5.7324170e-01 4.9766035e-01 4.1449626e-01 6.0551856e-01 3.0546431e-01 2.0656129e-01 3.4780839e+00 3.2028668e+00 3.6478832e+00 2.7001131e+00 3.3123070e+00 3.1424188e+00 3.3940268e+00 2.0081113e+00 3.3027430e+00 2.5846998e+00 2.2899742e+00 2.8843735e+00 2.7014135e+00 3.3579678e+00 2.2804674e+00 3.1447330e+00 3.1614572e+00 2.7347909e+00 3.2266676e+00 2.5600441e+00 3.4989115e+00 2.6835197e+00 3.5848035e+00 3.3425343e+00 2.9944056e+00 3.1272113e+00 3.5315985e+00 3.7321938e+00 3.1736230e+00 2.1642821e+00 2.4763086e+00 2.3729779e+00 2.5613679e+00 3.7645411e+00 3.1602773e+00 3.1861493e+00 3.4298218e+00 3.1090174e+00 2.7503801e+00 2.6773131e+00 3.0414782e+00 3.2606191e+00 2.6626548e+00 2.0308266e+00 2.8549070e+00 2.8371552e+00 2.8500790e+00 2.9720515e+00 1.7439430e+00 2.7570191e+00 4.7646254e+00 3.8019108e+00 4.6714768e+00 4.2777154e+00 4.5341669e+00 5.3940437e+00 3.2096520e+00 5.0408889e+00 4.5037829e+00 4.9318274e+00 3.8493108e+00 4.0147814e+00 4.2656755e+00 3.7323432e+00 3.9122146e+00 4.0862794e+00 4.1939019e+00 5.5136120e+00 5.7113100e+00 3.6836404e+00 4.4947801e+00 3.6298047e+00 5.4953655e+00 3.6181784e+00 4.4396174e+00 4.7440323e+00 3.5161021e+00 3.6013159e+00 4.3259034e+00 4.5411167e+00 4.8804165e+00 5.2620015e+00 4.3431589e+00 3.7666196e+00 4.2394195e+00 4.9871255e+00 4.3755778e+00 4.1864815e+00 3.5032323e+00 4.1868319e+00 4.4036244e+00 3.9638383e+00 3.8019108e+00 4.6672392e+00 4.5155386e+00 4.0245873e+00 3.7349501e+00 3.9420153e+00 4.1660972e+00 3.7835217e+00 1.2418578e-01 7.0826681e-01 9.4125538e-01 1.1340084e+00 2.1845981e-01 4.4417983e-01 8.2105460e-01 2.1845981e-01 3.8776762e-01 4.1449626e-01 4.2418962e-01 9.1075311e-01 3.7255734e-01 4.8036801e-01 6.6827038e-01 2.5651975e-01 6.4704320e-01 2.0656129e-01 6.8961791e-01 3.2586371e-01 3.4686627e+00 3.1154621e+00 3.6024772e+00 2.5108475e+00 3.2290313e+00 2.9704704e+00 3.2809332e+00 1.7903952e+00 3.2349033e+00 2.3960250e+00 2.0600195e+00 2.7476411e+00 2.5610667e+00 3.2181149e+00 2.1323638e+00 3.1154281e+00 2.9881598e+00 2.5786309e+00 3.0947136e+00 2.3839455e+00 3.3448197e+00 2.5821869e+00 3.4532666e+00 3.1998457e+00 2.9200439e+00 3.0794219e+00 3.4771054e+00 3.6510733e+00 3.0328831e+00 2.0197525e+00 2.2893157e+00 2.1858172e+00 2.4166535e+00 3.6030381e+00 2.9770247e+00 3.0492285e+00 3.3713329e+00 2.9974031e+00 2.5833316e+00 2.4944673e+00 2.8535197e+00 3.1260028e+00 2.5104998e+00 1.8109223e+00 2.6804452e+00 2.6742360e+00 2.6875169e+00 2.8656044e+00 1.5447938e+00 2.5961850e+00 4.6147552e+00 3.6320149e+00 4.5850999e+00 4.1288948e+00 4.3989089e+00 5.3208661e+00 3.0146208e+00 4.9525575e+00 4.3778283e+00 4.8485483e+00 3.7416375e+00 3.8836706e+00 4.1692394e+00 3.5584719e+00 3.7545764e+00 3.9635178e+00 4.0653249e+00 5.4465238e+00 5.6318041e+00 3.5148434e+00 4.4004449e+00 3.4571917e+00 5.4256316e+00 3.4931266e+00 4.3243671e+00 4.6617210e+00 3.3863989e+00 3.4595139e+00 4.1872611e+00 4.4691596e+00 4.8126955e+00 5.2323771e+00 4.2057897e+00 3.6309135e+00 4.0714444e+00 4.9544547e+00 4.2355968e+00 4.0495222e+00 3.3563815e+00 4.1075398e+00 4.2957899e+00 3.9065020e+00 3.6320149e+00 4.5543025e+00 4.4046818e+00 3.9362563e+00 3.6038441e+00 3.8285790e+00 4.0238937e+00 3.6204282e+00 6.2538346e-01 1.0167353e+00 1.1763980e+00 1.4096146e-01 4.1449626e-01 7.4740267e-01 1.4096146e-01 4.4535192e-01 3.7427929e-01 4.5581864e-01 8.2135873e-01 4.4535192e-01 5.0503591e-01 7.3145860e-01 2.1269358e-01 7.1421512e-01 2.5251796e-01 6.8961791e-01 2.8192292e-01 3.4295980e+00 3.0905489e+00 3.5700123e+00 2.4944673e+00 3.2020292e+00 2.9613737e+00 3.2617087e+00 1.7750284e+00 3.2049793e+00 2.3909366e+00 2.0308266e+00 2.7326472e+00 2.5286673e+00 3.2028668e+00 2.1181082e+00 3.0792693e+00 2.9816970e+00 2.5624932e+00 3.0681391e+00 2.3677174e+00 3.3352475e+00 2.5566444e+00 3.4334259e+00 3.1839972e+00 2.8907702e+00 3.0462904e+00 3.4448498e+00 3.6256155e+00 3.0181476e+00 1.9946242e+00 2.2719663e+00 2.1665831e+00 2.3980102e+00 3.5922217e+00 2.9733478e+00 3.0355056e+00 3.3410264e+00 2.9673667e+00 2.5744164e+00 2.4820750e+00 2.8455141e+00 3.1100045e+00 2.4920874e+00 1.7903952e+00 2.6704164e+00 2.6637326e+00 2.6767607e+00 2.8425716e+00 1.5257596e+00 2.5839288e+00 4.6057175e+00 3.6244539e+00 4.5619285e+00 4.1170543e+00 4.3856360e+00 5.2953657e+00 3.0110441e+00 4.9290739e+00 4.3593510e+00 4.8266994e+00 3.7227460e+00 3.8675033e+00 4.1480696e+00 3.5505922e+00 3.7479505e+00 3.9489183e+00 4.0495222e+00 5.4213759e+00 5.6069704e+00 3.4988409e+00 4.3796539e+00 3.4519560e+00 5.3990720e+00 3.4751739e+00 4.3070102e+00 4.6372963e+00 3.3701472e+00 3.4467337e+00 4.1738909e+00 4.4422690e+00 4.7852959e+00 5.2004339e+00 4.1925494e+00 3.6148707e+00 4.0613681e+00 4.9222119e+00 4.2248103e+00 4.0355816e+00 3.3448336e+00 4.0832977e+00 4.2781022e+00 3.8793995e+00 3.6244539e+00 4.5369609e+00 4.3880177e+00 3.9147164e+00 3.5857963e+00 3.8105301e+00 4.0134966e+00 3.6122845e+00 7.1799256e-01 8.0358695e-01 5.5419992e-01 4.6472023e-01 2.5651975e-01 5.5419992e-01 1.0198386e+00 3.2352160e-01 4.1586001e-01 1.2565757e+00 1.0054037e+00 4.1586001e-01 5.2574978e-01 6.4806901e-01 4.5581864e-01 8.0619006e-01 3.2586371e-01 4.1586001e-01 3.3274681e+00 3.0643176e+00 3.5031390e+00 2.5831315e+00 3.1734856e+00 3.0256804e+00 3.2593968e+00 1.9049236e+00 3.1662394e+00 2.4587503e+00 2.1948123e+00 2.7522526e+00 2.5874301e+00 3.2341367e+00 2.1493214e+00 2.9966141e+00 3.0389019e+00 2.6214821e+00 3.0978571e+00 2.4463233e+00 3.3673968e+00 2.5500177e+00 3.4578354e+00 3.2240818e+00 2.8578051e+00 2.9828212e+00 3.3905763e+00 3.5904118e+00 3.0455175e+00 2.0467937e+00 2.3640301e+00 2.2638728e+00 2.4385827e+00 3.6424937e+00 3.0387448e+00 3.0543001e+00 3.2867025e+00 2.9810914e+00 2.6291524e+00 2.5579619e+00 2.9291061e+00 3.1351569e+00 2.5421955e+00 1.9274228e+00 2.7359835e+00 2.7196686e+00 2.7293044e+00 2.8418790e+00 1.6234861e+00 2.6349941e+00 4.6268918e+00 3.6735954e+00 4.5276539e+00 4.1519514e+00 4.3981255e+00 5.2510005e+00 3.0847983e+00 4.9049143e+00 4.3738893e+00 4.7804645e+00 3.7059360e+00 3.8806135e+00 4.1210200e+00 3.6007179e+00 3.7674167e+00 3.9401211e+00 4.0632074e+00 5.3683319e+00 5.5675337e+00 3.5650560e+00 4.3467079e+00 3.4964385e+00 5.3534247e+00 3.4817971e+00 4.3007421e+00 4.6057628e+00 3.3796707e+00 3.4684743e+00 4.1910954e+00 4.4033511e+00 4.7374076e+00 5.1107389e+00 4.2056854e+00 3.6417452e+00 4.1251907e+00 4.8290847e+00 4.2339606e+00 4.0576409e+00 3.3702841e+00 4.0376849e+00 4.2550416e+00 3.8015574e+00 3.6735954e+00 4.5249462e+00 4.3662620e+00 3.8699102e+00 3.5979726e+00 3.8007870e+00 4.0252278e+00 3.6568095e+00 3.0811765e-01 1.0065841e+00 9.1075311e-01 6.2538346e-01 1.0065841e+00 1.2125198e+00 7.0086313e-01 6.1623531e-01 1.8279039e+00 1.0613462e+00 6.9369532e-01 4.8135521e-01 1.1149070e+00 3.0811765e-01 9.7098574e-01 4.0293660e-01 8.0358695e-01 3.4154940e+00 3.1439160e+00 3.5872997e+00 2.8054691e+00 3.2839149e+00 3.1127876e+00 3.3274872e+00 2.2159139e+00 3.2598167e+00 2.6167778e+00 2.5758644e+00 2.8523754e+00 2.8256291e+00 3.3122081e+00 2.3003824e+00 3.0947136e+00 3.1160876e+00 2.7384939e+00 3.2940867e+00 2.6281170e+00 3.4401593e+00 2.6851662e+00 3.5758474e+00 3.3024121e+00 2.9636544e+00 3.0850893e+00 3.4935692e+00 3.6787177e+00 3.1382691e+00 2.2643860e+00 2.5838312e+00 2.4957147e+00 2.5876691e+00 3.7272092e+00 3.1148696e+00 3.1192689e+00 3.3731473e+00 3.1641238e+00 2.7164367e+00 2.7371177e+00 3.0433470e+00 3.2094276e+00 2.6989752e+00 2.2729593e+00 2.8576425e+00 2.7954161e+00 2.8234677e+00 2.9407805e+00 1.9980146e+00 2.7511201e+00 4.6993349e+00 3.7716613e+00 4.6090409e+00 4.2170163e+00 4.4740971e+00 5.3233695e+00 3.2312218e+00 4.9715358e+00 4.4649192e+00 4.8634712e+00 3.7907269e+00 3.9777091e+00 4.2102908e+00 3.7293867e+00 3.8887827e+00 4.0321207e+00 4.1304736e+00 5.4336694e+00 5.6535520e+00 3.7088191e+00 4.4333012e+00 3.6017014e+00 5.4287623e+00 3.5939935e+00 4.3696884e+00 4.6684884e+00 3.4865359e+00 3.5518450e+00 4.2777882e+00 4.4716883e+00 4.8204359e+00 5.1830573e+00 4.2975164e+00 3.7189281e+00 4.1915116e+00 4.9282164e+00 4.3126073e+00 4.1182993e+00 3.4568393e+00 4.1297239e+00 4.3496867e+00 3.9207320e+00 3.7716613e+00 4.6018276e+00 4.4564872e+00 3.9827168e+00 3.7295388e+00 3.8905364e+00 4.1037903e+00 3.7281480e+00 1.1474460e+00 1.0344911e+00 7.0043186e-01 1.1474460e+00 1.4311891e+00 8.2654509e-01 7.6787403e-01 1.9730918e+00 1.3073038e+00 7.9878917e-01 6.2407309e-01 1.2632199e+00 5.0503591e-01 1.1833480e+00 5.0905001e-01 9.4080461e-01 3.4392518e+00 3.2008338e+00 3.6261197e+00 2.9076510e+00 3.3439089e+00 3.2073032e+00 3.3907558e+00 2.3329978e+00 3.3168472e+00 2.7081478e+00 2.6929215e+00 2.9283888e+00 2.9264154e+00 3.3942456e+00 2.3848677e+00 3.1312883e+00 3.2027420e+00 2.8385969e+00 3.3781905e+00 2.7324845e+00 3.5133135e+00 2.7602023e+00 3.6563535e+00 3.3905763e+00 3.0256209e+00 3.1312883e+00 3.5423793e+00 3.7299679e+00 3.2179031e+00 2.3661539e+00 2.6906231e+00 2.6054995e+00 2.6801752e+00 3.8138933e+00 3.2027420e+00 3.1888037e+00 3.4187265e+00 3.2459231e+00 2.8060305e+00 2.8359967e+00 3.1453916e+00 3.2886661e+00 2.7943622e+00 2.3874574e+00 2.9533314e+00 2.8877105e+00 2.9141136e+00 3.0147886e+00 2.0992326e+00 2.8425716e+00 4.7630756e+00 3.8535531e+00 4.6550014e+00 4.2947468e+00 4.5389196e+00 5.3632740e+00 3.3234239e+00 5.0232338e+00 4.5363757e+00 4.8985515e+00 3.8441304e+00 4.0476997e+00 4.2599433e+00 3.8106152e+00 3.9516603e+00 4.0850903e+00 4.1995425e+00 5.4671477e+00 5.6957748e+00 3.8037734e+00 4.4771379e+00 3.6783395e+00 5.4690202e+00 3.6632177e+00 4.4259826e+00 4.7160634e+00 3.5560806e+00 3.6239123e+00 4.3464973e+00 4.5187406e+00 4.8619146e+00 5.2001625e+00 4.3635746e+00 3.7979761e+00 4.2843668e+00 4.9451734e+00 4.3709882e+00 4.1899199e+00 3.5299194e+00 4.1707976e+00 4.3972344e+00 3.9457376e+00 3.8535531e+00 4.6546556e+00 4.5024055e+00 4.0227020e+00 3.8004969e+00 3.9484773e+00 4.1635108e+00 3.8079860e+00 3.0811765e-01 6.5223271e-01 0.0000000e+00 5.0991930e-01 3.2586371e-01 4.2667565e-01 8.3172002e-01 5.0991930e-01 5.6769031e-01 7.5082357e-01 2.1845981e-01 7.0479928e-01 3.0811765e-01 6.4755655e-01 2.1845981e-01 3.4865562e+00 3.1726595e+00 3.6377960e+00 2.5987470e+00 3.2814045e+00 3.0627375e+00 3.3515846e+00 1.8841865e+00 3.2769379e+00 2.5038079e+00 2.1311468e+00 2.8311678e+00 2.6104387e+00 3.2962520e+00 2.2214438e+00 3.1433122e+00 3.0878634e+00 2.6552472e+00 3.1570103e+00 2.4668912e+00 3.4394878e+00 2.6411293e+00 3.5233648e+00 3.2747247e+00 2.9659871e+00 3.1154783e+00 3.5134741e+00 3.7059620e+00 3.1148696e+00 2.0851901e+00 2.3731428e+00 2.2655571e+00 2.4927109e+00 3.6920087e+00 3.0823446e+00 3.1337459e+00 3.4135200e+00 3.0481703e+00 2.6780487e+00 2.5874301e+00 2.9489507e+00 3.2027420e+00 2.5873149e+00 1.8973383e+00 2.7738355e+00 2.7632614e+00 2.7778954e+00 2.9269923e+00 1.6390769e+00 2.6848587e+00 4.7106706e+00 3.7313856e+00 4.6446321e+00 4.2142736e+00 4.4836580e+00 5.3716885e+00 3.1250284e+00 5.0074019e+00 4.4485220e+00 4.9128219e+00 3.8150636e+00 3.9624529e+00 4.2358121e+00 3.6602286e+00 3.8605980e+00 4.0488387e+00 4.1418643e+00 5.4970002e+00 5.6855224e+00 3.5964347e+00 4.4685630e+00 3.5634461e+00 5.4730406e+00 3.5693950e+00 4.3989089e+00 4.7150659e+00 3.4668130e+00 3.5464993e+00 4.2723380e+00 4.5155386e+00 4.8594290e+00 5.2647079e+00 4.2921213e+00 3.7064459e+00 4.1581964e+00 4.9913682e+00 4.3286007e+00 4.1303097e+00 3.4468286e+00 4.1669742e+00 4.3729308e+00 3.9624170e+00 3.7313856e+00 4.6297577e+00 4.4844827e+00 4.0056359e+00 3.6817961e+00 3.9035218e+00 4.1179678e+00 3.7164366e+00 5.2942799e-01 3.0811765e-01 6.0611244e-01 3.2586371e-01 3.0546431e-01 9.4125538e-01 6.0060595e-01 5.2574978e-01 8.1558458e-01 2.8507955e-01 6.4755655e-01 4.1312257e-01 5.5419992e-01 2.0656129e-01 3.7045940e+00 3.4142500e+00 3.8690719e+00 2.8688189e+00 3.5226542e+00 3.3385842e+00 3.6010215e+00 2.1580776e+00 3.5196916e+00 2.7652601e+00 2.4083873e+00 3.0820950e+00 2.8783309e+00 3.5617386e+00 2.4693940e+00 3.3658240e+00 3.3558214e+00 2.9322808e+00 3.4112518e+00 2.7424260e+00 3.6945405e+00 2.8867565e+00 3.7848217e+00 3.5471494e+00 3.2076743e+00 3.3449470e+00 3.7498842e+00 3.9450818e+00 3.3735875e+00 2.3490515e+00 2.6490839e+00 2.5444216e+00 2.7549369e+00 3.9621873e+00 3.3527310e+00 3.3865418e+00 3.6475099e+00 3.3024121e+00 2.9459653e+00 2.8566322e+00 3.2311957e+00 3.4653703e+00 2.8535197e+00 2.1708533e+00 3.0455175e+00 3.0364473e+00 3.0465086e+00 3.1799184e+00 1.8842354e+00 2.9509414e+00 4.9594922e+00 3.9924292e+00 4.8844442e+00 4.4804205e+00 4.7354764e+00 5.6130421e+00 3.3873806e+00 5.2583931e+00 4.7090394e+00 5.1413739e+00 4.0532097e+00 4.2156327e+00 4.4735121e+00 3.9153764e+00 4.0928954e+00 4.2826383e+00 4.4004808e+00 5.7341534e+00 5.9271927e+00 3.8700742e+00 4.7016733e+00 3.8156003e+00 5.7155096e+00 3.8175051e+00 4.6462020e+00 4.9620553e+00 3.7143727e+00 3.8000004e+00 4.5254820e+00 4.7613782e+00 5.0991856e+00 5.4888822e+00 4.5411167e+00 3.9718373e+00 4.4397363e+00 5.2074442e+00 4.5701358e+00 4.3916992e+00 3.6996802e+00 4.3970196e+00 4.6045465e+00 4.1691696e+00 3.9924292e+00 4.8725396e+00 4.7150659e+00 4.2256400e+00 3.9292780e+00 4.1454529e+00 4.3599285e+00 3.9798670e+00 6.5223271e-01 1.1268457e+00 4.1449626e-01 5.0090417e-01 1.3784393e+00 1.1053488e+00 5.8851328e-01 6.6827038e-01 7.6787403e-01 4.8036801e-01 9.0852141e-01 2.8192292e-01 5.0905001e-01 3.5117473e+00 3.2719724e+00 3.6961290e+00 2.8060101e+00 3.3799936e+00 3.2401159e+00 3.4709594e+00 2.1293854e+00 3.3643376e+00 2.6848587e+00 2.4115946e+00 2.9723937e+00 2.7984009e+00 3.4455106e+00 2.3749088e+00 3.1913397e+00 3.2574960e+00 2.8320532e+00 3.3150921e+00 2.6637326e+00 3.5883493e+00 2.7640668e+00 3.6695251e+00 3.4317240e+00 3.0617355e+00 3.1820648e+00 3.5855784e+00 3.7950050e+00 3.2620096e+00 2.2645766e+00 2.5831070e+00 2.4810276e+00 2.6563403e+00 3.8575846e+00 3.2574960e+00 3.2718360e+00 3.4856613e+00 3.1913594e+00 2.8466990e+00 2.7801709e+00 3.1437608e+00 3.3466419e+00 2.7595194e+00 2.1498672e+00 2.9543365e+00 2.9330570e+00 2.9459653e+00 3.0511838e+00 1.8555964e+00 2.8534301e+00 4.8490742e+00 3.8962785e+00 4.7308926e+00 4.3643842e+00 4.6144072e+00 5.4442665e+00 3.3129652e+00 5.0997539e+00 4.5816539e+00 4.9883395e+00 3.9213002e+00 4.0961125e+00 4.3313403e+00 3.8279951e+00 4.0003537e+00 4.1625074e+00 4.2731561e+00 5.5604940e+00 5.7635900e+00 3.7812981e+00 4.5580745e+00 3.7236571e+00 5.5437155e+00 3.6992145e+00 4.5120086e+00 4.8012240e+00 3.5989213e+00 3.6872980e+00 4.4084575e+00 4.5949523e+00 4.9306472e+00 5.2918657e+00 4.4250143e+00 3.8510143e+00 4.3338058e+00 5.0198276e+00 4.4571663e+00 4.2687771e+00 3.5910375e+00 4.2454653e+00 4.4729144e+00 4.0139676e+00 3.8962785e+00 4.7377574e+00 4.5853438e+00 4.0877338e+00 3.8179781e+00 4.0161568e+00 4.2490407e+00 3.8755800e+00 5.0991930e-01 3.2586371e-01 4.2667565e-01 8.3172002e-01 5.0991930e-01 5.6769031e-01 7.5082357e-01 2.1845981e-01 7.0479928e-01 3.0811765e-01 6.4755655e-01 2.1845981e-01 3.4865562e+00 3.1726595e+00 3.6377960e+00 2.5987470e+00 3.2814045e+00 3.0627375e+00 3.3515846e+00 1.8841865e+00 3.2769379e+00 2.5038079e+00 2.1311468e+00 2.8311678e+00 2.6104387e+00 3.2962520e+00 2.2214438e+00 3.1433122e+00 3.0878634e+00 2.6552472e+00 3.1570103e+00 2.4668912e+00 3.4394878e+00 2.6411293e+00 3.5233648e+00 3.2747247e+00 2.9659871e+00 3.1154783e+00 3.5134741e+00 3.7059620e+00 3.1148696e+00 2.0851901e+00 2.3731428e+00 2.2655571e+00 2.4927109e+00 3.6920087e+00 3.0823446e+00 3.1337459e+00 3.4135200e+00 3.0481703e+00 2.6780487e+00 2.5874301e+00 2.9489507e+00 3.2027420e+00 2.5873149e+00 1.8973383e+00 2.7738355e+00 2.7632614e+00 2.7778954e+00 2.9269923e+00 1.6390769e+00 2.6848587e+00 4.7106706e+00 3.7313856e+00 4.6446321e+00 4.2142736e+00 4.4836580e+00 5.3716885e+00 3.1250284e+00 5.0074019e+00 4.4485220e+00 4.9128219e+00 3.8150636e+00 3.9624529e+00 4.2358121e+00 3.6602286e+00 3.8605980e+00 4.0488387e+00 4.1418643e+00 5.4970002e+00 5.6855224e+00 3.5964347e+00 4.4685630e+00 3.5634461e+00 5.4730406e+00 3.5693950e+00 4.3989089e+00 4.7150659e+00 3.4668130e+00 3.5464993e+00 4.2723380e+00 4.5155386e+00 4.8594290e+00 5.2647079e+00 4.2921213e+00 3.7064459e+00 4.1581964e+00 4.9913682e+00 4.3286007e+00 4.1303097e+00 3.4468286e+00 4.1669742e+00 4.3729308e+00 3.9624170e+00 3.7313856e+00 4.6297577e+00 4.4844827e+00 4.0056359e+00 3.6817961e+00 3.9035218e+00 4.1179678e+00 3.7164366e+00 7.3813096e-01 6.8961791e-01 7.0086313e-01 2.0000000e-01 7.3805807e-01 1.0030700e+00 4.0293660e-01 9.4352681e-01 2.5251796e-01 1.0120221e+00 6.2024833e-01 3.8265307e+00 3.4552560e+00 3.9537404e+00 2.8022534e+00 3.5701225e+00 3.2863508e+00 3.6126198e+00 2.0524386e+00 3.5845127e+00 2.6848587e+00 2.2888897e+00 3.0684384e+00 2.8791325e+00 3.5464993e+00 2.4469125e+00 3.4686755e+00 3.2961206e+00 2.9072057e+00 3.4107902e+00 2.6959009e+00 3.6545040e+00 2.9195876e+00 3.7806187e+00 3.5312474e+00 3.2669151e+00 3.4295849e+00 3.8277021e+00 3.9909030e+00 3.3562690e+00 2.3465937e+00 2.5906376e+00 2.4892531e+00 2.7423171e+00 3.9193693e+00 3.2780620e+00 3.3708389e+00 3.7190229e+00 3.3268984e+00 2.8983020e+00 2.7954161e+00 3.1611584e+00 3.4557351e+00 2.8328337e+00 2.0658700e+00 2.9919517e+00 2.9960210e+00 3.0059712e+00 3.2048547e+00 1.8038968e+00 2.9141136e+00 4.9189452e+00 3.9342203e+00 4.9208723e+00 4.4494735e+00 4.7160542e+00 5.6635213e+00 3.2909043e+00 5.2946188e+00 4.7062325e+00 5.1779277e+00 4.0657707e+00 4.2053647e+00 4.4986279e+00 3.8509694e+00 4.0384339e+00 4.2739171e+00 4.3927415e+00 5.7909894e+00 5.9706827e+00 3.8237409e+00 4.7267599e+00 3.7490739e+00 5.7704875e+00 3.8154018e+00 4.6503268e+00 5.0044958e+00 3.7060524e+00 3.7762575e+00 4.5037232e+00 4.8164539e+00 5.1574084e+00 5.5860081e+00 4.5195237e+00 3.9601358e+00 4.3901702e+00 5.2992055e+00 4.5412859e+00 4.3739561e+00 3.6694918e+00 4.4403343e+00 4.6130415e+00 4.2323959e+00 3.9342203e+00 4.8773871e+00 4.7190595e+00 4.2559866e+00 3.9201797e+00 4.1523445e+00 4.3289315e+00 3.9302319e+00 2.1845981e-01 1.1486378e+00 7.0784540e-01 4.0438741e-01 5.0503591e-01 4.4651726e-01 4.0147421e-01 5.0905001e-01 3.2352160e-01 1.4096146e-01 3.4156574e+00 3.1235447e+00 3.5778307e+00 2.6097685e+00 3.2346686e+00 3.0478400e+00 3.3101102e+00 1.9193093e+00 3.2270948e+00 2.4922287e+00 2.2081369e+00 2.7965957e+00 2.6184141e+00 3.2685282e+00 2.1916898e+00 3.0773654e+00 3.0673749e+00 2.6423274e+00 3.1444983e+00 2.4678343e+00 3.4088888e+00 2.6016025e+00 3.4988409e+00 3.2521427e+00 2.9171710e+00 3.0559188e+00 3.4597125e+00 3.6553612e+00 3.0847983e+00 2.0765921e+00 2.3848740e+00 2.2817008e+00 2.4722095e+00 3.6724425e+00 3.0650478e+00 3.0981264e+00 3.3567173e+00 3.0288896e+00 2.6566259e+00 2.5851693e+00 2.9455446e+00 3.1719381e+00 2.5729378e+00 1.9450955e+00 2.7611864e+00 2.7431084e+00 2.7570191e+00 2.8884401e+00 1.6625998e+00 2.6648989e+00 4.6768871e+00 3.7101281e+00 4.5948688e+00 4.1876541e+00 4.4480565e+00 5.3202405e+00 3.1169790e+00 4.9630576e+00 4.4189653e+00 4.8572313e+00 3.7684708e+00 3.9292780e+00 4.1872611e+00 3.6418662e+00 3.8262353e+00 4.0041417e+00 4.1076175e+00 5.4411191e+00 5.6370076e+00 3.5929878e+00 4.4174698e+00 3.5389106e+00 5.4223305e+00 3.5340177e+00 4.3569684e+00 4.6672392e+00 3.4309563e+00 3.5133135e+00 4.2392500e+00 4.4661721e+00 4.8075242e+00 5.1977119e+00 4.2572858e+00 3.6784045e+00 4.1454521e+00 4.9233665e+00 4.2900309e+00 4.0984960e+00 3.4145942e+00 4.1120703e+00 4.3243538e+00 3.8957047e+00 3.7101281e+00 4.5857922e+00 4.4360042e+00 3.9497198e+00 3.6509512e+00 3.8600234e+00 4.0800357e+00 3.6915258e+00 1.2223099e+00 6.2024833e-01 3.7255734e-01 6.2081167e-01 5.0905001e-01 3.7598397e-01 4.4651726e-01 3.4583729e-01 2.1269358e-01 3.6091470e+00 3.3105724e+00 3.7708932e+00 2.7979838e+00 3.4251430e+00 3.2391031e+00 3.4951642e+00 2.1075335e+00 3.4235403e+00 2.6687055e+00 2.3989464e+00 2.9762945e+00 2.8216056e+00 3.4603628e+00 2.3673218e+00 3.2680041e+00 3.2498302e+00 2.8414525e+00 3.3361912e+00 2.6626548e+00 3.5849794e+00 2.7906520e+00 3.6926714e+00 3.4497714e+00 3.1105675e+00 3.2468925e+00 3.6557661e+00 3.8432801e+00 3.2705166e+00 2.2719663e+00 2.5786309e+00 2.4784234e+00 2.6629602e+00 3.8619321e+00 3.2465133e+00 3.2780765e+00 3.5475145e+00 3.2266676e+00 2.8416143e+00 2.7719788e+00 3.1392934e+00 3.3624692e+00 2.7656089e+00 2.1335398e+00 2.9496515e+00 2.9338590e+00 2.9447165e+00 3.0808399e+00 1.8330979e+00 2.8520904e+00 4.8482992e+00 3.8884996e+00 4.7814945e+00 4.3763964e+00 4.6280797e+00 5.5131379e+00 3.2922206e+00 5.1594703e+00 4.6125121e+00 5.0342965e+00 3.9453171e+00 4.1137002e+00 4.3683295e+00 3.8151836e+00 3.9816719e+00 4.1715493e+00 4.2963195e+00 5.6322635e+00 5.8289682e+00 3.7874513e+00 4.5945190e+00 3.7079546e+00 5.6180203e+00 3.7164611e+00 4.5394421e+00 4.8614468e+00 3.6107037e+00 3.6929889e+00 4.4201622e+00 4.6634723e+00 5.0015266e+00 5.3906681e+00 4.4348302e+00 3.8718490e+00 4.3427947e+00 5.1078309e+00 4.4583488e+00 4.2864208e+00 3.5920050e+00 4.2919639e+00 4.4953238e+00 4.0619633e+00 3.8884996e+00 4.7650352e+00 4.6046026e+00 4.1173867e+00 3.8320624e+00 4.0389546e+00 4.2480032e+00 3.8727359e+00 9.0049692e-01 1.2307737e+00 1.5483011e+00 7.1462831e-01 1.5272277e+00 9.0074515e-01 1.4700179e+00 1.0331736e+00 3.7896333e+00 3.4304205e+00 3.9179666e+00 2.7683644e+00 3.5321772e+00 3.2685282e+00 3.5962433e+00 2.0250421e+00 3.5485736e+00 2.6642702e+00 2.2244833e+00 3.0435803e+00 2.8325748e+00 3.5230967e+00 2.4205131e+00 3.4307077e+00 3.2815626e+00 2.8843735e+00 3.3658240e+00 2.6687055e+00 3.6389628e+00 2.8830783e+00 3.7490739e+00 3.5087649e+00 3.2305801e+00 3.3908902e+00 3.7876239e+00 3.9561876e+00 3.3306114e+00 2.3112968e+00 2.5604155e+00 2.4585271e+00 2.7122813e+00 3.8971376e+00 3.2667813e+00 3.3674720e+00 3.6849783e+00 3.2837729e+00 2.8840079e+00 2.7685572e+00 3.1442943e+00 3.4335342e+00 2.8028287e+00 2.0286682e+00 2.9704704e+00 2.9822537e+00 2.9868163e+00 3.1741954e+00 1.7644184e+00 2.8908296e+00 4.8985114e+00 3.9102500e+00 4.8863496e+00 4.4272873e+00 4.6888407e+00 5.6294495e+00 3.2706756e+00 5.2636641e+00 4.6765452e+00 5.1547576e+00 4.0378383e+00 4.1743230e+00 4.4638518e+00 3.8230269e+00 4.0056625e+00 4.2450961e+00 4.3676124e+00 5.7745449e+00 5.9344852e+00 3.7932062e+00 4.6942925e+00 3.7245053e+00 5.7354045e+00 3.7814598e+00 4.6271849e+00 4.9763401e+00 3.6736483e+00 3.7511498e+00 4.4747039e+00 4.7841150e+00 5.1205765e+00 5.5660104e+00 4.4889834e+00 3.9348528e+00 4.3728356e+00 5.2548517e+00 4.5226167e+00 4.3526639e+00 3.6449787e+00 4.4041536e+00 4.5787890e+00 4.1879339e+00 3.9102500e+00 4.8490587e+00 4.6897155e+00 4.2150171e+00 3.8841455e+00 4.1203091e+00 4.3121165e+00 3.9109678e+00 6.7975091e-01 9.0056222e-01 4.1586001e-01 8.2275389e-01 2.0656129e-01 9.4287188e-01 6.0121055e-01 3.8264361e+00 3.4551376e+00 3.9537404e+00 2.8149627e+00 3.5710248e+00 3.2874334e+00 3.6122384e+00 2.0711789e+00 3.5849006e+00 2.6879715e+00 2.3281827e+00 3.0685922e+00 2.8946126e+00 3.5468964e+00 2.4478108e+00 3.4686755e+00 3.2962520e+00 2.9098194e+00 3.4214793e+00 2.7033034e+00 3.6543993e+00 2.9209919e+00 3.7841436e+00 3.5321717e+00 3.2673909e+00 3.4297053e+00 3.8284763e+00 3.9909892e+00 3.3567173e+00 2.3533545e+00 2.6019240e+00 2.5015675e+00 2.7452885e+00 3.9207248e+00 3.2781950e+00 3.3698144e+00 3.7190229e+00 3.3356294e+00 2.8984764e+00 2.8022534e+00 3.1646752e+00 3.4558535e+00 2.8373077e+00 2.0905239e+00 2.9944056e+00 2.9961831e+00 3.0065426e+00 3.2053509e+00 1.8216743e+00 2.9155237e+00 4.9187518e+00 3.9355645e+00 4.9209267e+00 4.4497146e+00 4.7161140e+00 5.6635613e+00 3.2956846e+00 5.2947833e+00 4.7084108e+00 5.1767384e+00 4.0656879e+00 4.2065257e+00 4.4986941e+00 3.8543544e+00 4.0391220e+00 4.2738429e+00 4.3928114e+00 5.7890564e+00 5.9715517e+00 3.8320624e+00 4.7267005e+00 3.7498842e+00 5.7708014e+00 3.8168398e+00 4.6501080e+00 5.0044433e+00 3.7068836e+00 3.7763550e+00 4.5042646e+00 4.8165110e+00 5.1578102e+00 5.5839155e+00 4.5200609e+00 3.9608542e+00 4.3918790e+00 5.2992517e+00 4.5407542e+00 4.3739561e+00 3.6695956e+00 4.4403343e+00 4.6130415e+00 4.2323959e+00 3.9355645e+00 4.8773316e+00 4.7188476e+00 4.2560614e+00 3.9234348e+00 4.1524235e+00 4.3283407e+00 3.9303212e+00 3.8934542e-01 5.4292906e-01 4.4535192e-01 5.3309112e-01 4.5581864e-01 4.2538717e-01 3.3319064e+00 3.0058998e+00 3.4822680e+00 2.4967542e+00 3.1249915e+00 2.9284660e+00 3.1836200e+00 1.8265014e+00 3.1331426e+00 2.3481462e+00 2.1458939e+00 2.6572703e+00 2.5437119e+00 3.1519721e+00 2.0470220e+00 2.9815576e+00 2.9302134e+00 2.5421955e+00 3.0374850e+00 2.3632684e+00 3.2598750e+00 2.4873223e+00 3.3884269e+00 3.1477087e+00 2.8156804e+00 2.9556616e+00 3.3682605e+00 3.5401725e+00 2.9561205e+00 1.9790422e+00 2.2832934e+00 2.1885968e+00 2.3571494e+00 3.5486864e+00 2.9260462e+00 2.9587612e+00 3.2530866e+00 2.9361879e+00 2.5256527e+00 2.4631898e+00 2.8325946e+00 3.0534395e+00 2.4619105e+00 1.8618589e+00 2.6377354e+00 2.6235630e+00 2.6314198e+00 2.7785210e+00 1.5475473e+00 2.5392051e+00 4.5179415e+00 3.5641186e+00 4.4752183e+00 4.0626016e+00 4.3069105e+00 5.2164277e+00 2.9689697e+00 4.8634846e+00 4.3067423e+00 4.7194915e+00 3.6262912e+00 3.7979761e+00 4.0547736e+00 3.4875352e+00 3.6400497e+00 3.8418637e+00 3.9849753e+00 5.3352888e+00 5.5294519e+00 3.4830211e+00 4.2776053e+00 3.3760149e+00 5.3253207e+00 3.4004918e+00 4.2238184e+00 4.5645220e+00 3.2914954e+00 3.3718862e+00 4.0995928e+00 4.3725648e+00 4.7075069e+00 5.1063282e+00 4.1113292e+00 3.5651462e+00 4.0375056e+00 4.8132427e+00 4.1268905e+00 3.9732869e+00 3.2685282e+00 3.9810803e+00 4.1706050e+00 3.7449914e+00 3.5641186e+00 4.4464848e+00 4.2774083e+00 3.7941767e+00 3.5148434e+00 3.7206115e+00 3.9162695e+00 3.5510950e+00 8.6137722e-01 3.2352160e-01 7.6166891e-01 4.2667565e-01 6.2660376e-01 3.0634640e+00 2.7392828e+00 3.2125175e+00 2.3391296e+00 2.8734025e+00 2.6707502e+00 2.9145708e+00 1.7569738e+00 2.8671376e+00 2.1479276e+00 2.1308063e+00 2.4108292e+00 2.3854031e+00 2.8851564e+00 1.8368900e+00 2.7201546e+00 2.6724144e+00 2.2982662e+00 2.8483417e+00 2.1701312e+00 3.0045018e+00 2.2531409e+00 3.1444983e+00 2.8783309e+00 2.5586145e+00 2.6967931e+00 3.1073497e+00 3.2779401e+00 2.7018605e+00 1.8104298e+00 2.1219691e+00 2.0368741e+00 2.1367260e+00 3.2905600e+00 2.6692615e+00 2.6939411e+00 2.9863438e+00 2.7320931e+00 2.2698938e+00 2.2722516e+00 2.5933163e+00 2.7845473e+00 2.2472326e+00 1.8195937e+00 2.4037412e+00 2.3571494e+00 2.3781826e+00 2.5200525e+00 1.5411691e+00 2.3001580e+00 4.2694227e+00 3.3237039e+00 4.2115652e+00 3.7930080e+00 4.0498216e+00 4.9425633e+00 2.7652100e+00 4.5847429e+00 4.0464464e+00 4.4666326e+00 3.3738930e+00 3.5479683e+00 3.8004969e+00 3.2711669e+00 3.4346585e+00 3.6043418e+00 3.7146255e+00 5.0600559e+00 5.2639977e+00 3.2609948e+00 4.0260071e+00 3.1481222e+00 5.0506841e+00 3.1599876e+00 3.9594081e+00 4.2851208e+00 3.0501817e+00 3.1181310e+00 3.8476631e+00 4.0931004e+00 4.4378867e+00 4.8317916e+00 3.8652515e+00 3.2970551e+00 3.7653550e+00 4.5583070e+00 3.8836720e+00 3.7008091e+00 3.0188386e+00 3.7282629e+00 3.9300286e+00 3.5186510e+00 3.3237039e+00 4.1891573e+00 4.0376133e+00 3.5648733e+00 3.2885200e+00 3.4693398e+00 3.6732275e+00 3.2917360e+00 8.1385214e-01 2.5251796e-01 7.6787403e-01 3.2586371e-01 3.5846101e+00 3.2546607e+00 3.7315988e+00 2.6609901e+00 3.3659358e+00 3.1439065e+00 3.4298218e+00 1.9383545e+00 3.3723944e+00 2.5580763e+00 2.1777421e+00 2.8983020e+00 2.6954219e+00 3.3808052e+00 2.2790175e+00 3.2344170e+00 3.1579733e+00 2.7462372e+00 3.2292608e+00 2.5444216e+00 3.5028333e+00 2.7205595e+00 3.6067948e+00 3.3670797e+00 3.0557792e+00 3.2048395e+00 3.6088607e+00 3.7891577e+00 3.1900581e+00 2.1641873e+00 2.4447974e+00 2.3408917e+00 2.5700421e+00 3.7710363e+00 3.1506190e+00 3.2040124e+00 3.5027314e+00 3.1322650e+00 2.7512730e+00 2.6533250e+00 3.0299528e+00 3.2862185e+00 2.6656374e+00 1.9477421e+00 2.8481000e+00 2.8454952e+00 2.8544453e+00 3.0132514e+00 1.6658308e+00 2.7590026e+00 4.7688362e+00 3.7943375e+00 4.7263320e+00 4.2949506e+00 4.5532150e+00 5.4636648e+00 3.1768366e+00 5.1030228e+00 4.5342701e+00 4.9831843e+00 3.8820426e+00 4.0358897e+00 4.3088496e+00 3.7133362e+00 3.8949006e+00 4.1025163e+00 4.2237423e+00 5.5888590e+00 5.7742361e+00 3.6743314e+00 4.5370189e+00 3.6141649e+00 5.5687868e+00 3.6395551e+00 4.4736906e+00 4.8085584e+00 3.5338163e+00 3.6144782e+00 4.3417782e+00 4.6138035e+00 4.9524148e+00 5.3625968e+00 4.3570317e+00 3.7932922e+00 4.2488997e+00 5.0747397e+00 4.3832471e+00 4.2110583e+00 3.5113289e+00 4.2399031e+00 4.4320962e+00 4.0189525e+00 3.7943375e+00 4.7000551e+00 4.5409269e+00 4.0612006e+00 3.7475562e+00 3.9722979e+00 4.1719819e+00 3.7859347e+00 6.9325418e-01 2.1269358e-01 5.0905001e-01 3.3337914e+00 3.0376046e+00 3.4948415e+00 2.6099670e+00 3.1641230e+00 2.9745020e+00 3.2202056e+00 1.9796375e+00 3.1511769e+00 2.4469125e+00 2.3235342e+00 2.7196435e+00 2.6337042e+00 3.1881331e+00 2.1375243e+00 2.9985516e+00 2.9847499e+00 2.5867906e+00 3.1255136e+00 2.4464131e+00 3.3203249e+00 2.5432298e+00 3.4386456e+00 3.1757436e+00 2.8453413e+00 2.9797458e+00 3.3872988e+00 3.5731577e+00 3.0079222e+00 2.0710306e+00 2.3862284e+00 2.2923690e+00 2.4260574e+00 3.5964347e+00 2.9822786e+00 3.0067893e+00 3.2740296e+00 3.0040546e+00 2.5786309e+00 2.5579141e+00 2.8891491e+00 3.0885642e+00 2.5333642e+00 2.0283816e+00 2.7031874e+00 2.6626548e+00 2.6835197e+00 2.8149627e+00 1.7472675e+00 2.6016025e+00 4.5864727e+00 3.6358644e+00 4.5092329e+00 4.1008711e+00 4.3608329e+00 5.2329560e+00 3.0685922e+00 4.8761643e+00 4.3448624e+00 4.7688607e+00 3.6817961e+00 3.8534030e+00 4.1033021e+00 3.5811154e+00 3.7530357e+00 3.9183591e+00 4.0199092e+00 5.3504583e+00 5.5556442e+00 3.5517562e+00 4.3306939e+00 3.4641481e+00 5.3377017e+00 3.4637450e+00 4.2663890e+00 4.5772917e+00 3.3571533e+00 3.4296698e+00 4.1575709e+00 4.3797497e+00 4.7253427e+00 5.1097682e+00 4.1763898e+00 3.5983434e+00 4.0666282e+00 4.8419079e+00 4.2005634e+00 4.0083071e+00 3.3318481e+00 4.0278210e+00 4.2396851e+00 3.8171357e+00 3.6358644e+00 4.4969460e+00 4.3490518e+00 3.8705614e+00 3.5905415e+00 3.7766172e+00 3.9906340e+00 3.6052686e+00 7.6752131e-01 4.0147421e-01 3.6660608e+00 3.3135273e+00 3.8017611e+00 2.7018605e+00 3.4275679e+00 3.1699903e+00 3.4789136e+00 1.9730403e+00 3.4358679e+00 2.5840983e+00 2.2331309e+00 2.9422991e+00 2.7581254e+00 3.4189217e+00 2.3233512e+00 3.3121677e+00 3.1836200e+00 2.7812918e+00 3.2896000e+00 2.5816639e+00 3.5379744e+00 2.7795823e+00 3.6532797e+00 3.4029480e+00 3.1195329e+00 3.2770643e+00 3.6772238e+00 3.8493740e+00 3.2305582e+00 2.2173292e+00 2.4840285e+00 2.3814525e+00 2.6148507e+00 3.8019334e+00 3.1710836e+00 3.2447990e+00 3.5700242e+00 3.1955870e+00 2.7803619e+00 2.6879415e+00 3.0521985e+00 3.3264150e+00 2.7089627e+00 1.9908167e+00 2.8775912e+00 2.8744403e+00 2.8857836e+00 3.0658390e+00 1.7171798e+00 2.7936066e+00 4.8056033e+00 3.8247106e+00 4.7834029e+00 4.3283723e+00 4.5943507e+00 5.5219241e+00 3.2001457e+00 5.1552806e+00 4.5786596e+00 5.0423887e+00 3.9353963e+00 4.0804944e+00 4.3648743e+00 3.7469906e+00 3.9346929e+00 4.1523445e+00 4.2650653e+00 5.6468786e+00 5.8321617e+00 3.7127205e+00 4.5943003e+00 3.6444925e+00 5.6275915e+00 3.6885686e+00 4.5212945e+00 4.8635596e+00 3.5807904e+00 3.6545040e+00 4.3827087e+00 4.6717461e+00 5.0136174e+00 5.4320857e+00 4.3994790e+00 3.8323332e+00 4.2736523e+00 5.1501184e+00 4.4249262e+00 4.2490074e+00 3.5500567e+00 4.3022895e+00 4.4864974e+00 4.0933482e+00 3.8247106e+00 4.7495571e+00 4.5943072e+00 4.1245629e+00 3.7976741e+00 4.0232438e+00 4.2129603e+00 3.8158144e+00 4.4535192e-01 3.3681634e+00 3.1015495e+00 3.5417515e+00 2.6663854e+00 3.2198557e+00 3.0579528e+00 3.2934163e+00 2.0153916e+00 3.2040320e+00 2.5204039e+00 2.3388377e+00 2.7956674e+00 2.6725726e+00 3.2655357e+00 2.2078644e+00 3.0402181e+00 3.0721050e+00 2.6595270e+00 3.1749624e+00 2.5094912e+00 3.4048516e+00 2.6019240e+00 3.5045178e+00 3.2523394e+00 2.8999277e+00 3.0267460e+00 3.4333346e+00 3.6317584e+00 3.0844423e+00 2.1209506e+00 2.4419061e+00 2.3443191e+00 2.4920874e+00 3.6775470e+00 3.0715602e+00 3.0884019e+00 3.3261336e+00 3.0501817e+00 2.6631094e+00 2.6243758e+00 2.9691171e+00 3.1659032e+00 2.5983106e+00 2.0538718e+00 2.7808700e+00 2.7473221e+00 2.7650187e+00 2.8804789e+00 1.7660585e+00 2.6784604e+00 4.6691123e+00 3.7183181e+00 4.5689156e+00 4.1821417e+00 4.4377562e+00 5.2873851e+00 3.1455384e+00 4.9362269e+00 4.4131751e+00 4.8285697e+00 3.7508315e+00 3.9249912e+00 4.1665786e+00 3.6588207e+00 3.8312584e+00 3.9914600e+00 4.0953360e+00 5.4042844e+00 5.6094349e+00 3.6203759e+00 4.3940519e+00 3.5472449e+00 5.3896044e+00 3.5318477e+00 4.3383367e+00 4.6370771e+00 3.4283809e+00 3.5084967e+00 4.2335104e+00 4.4348302e+00 4.7765764e+00 5.1494118e+00 4.2515997e+00 3.6735311e+00 4.1503255e+00 4.8803856e+00 4.2802235e+00 4.0874500e+00 3.4119017e+00 4.0856134e+00 4.3069340e+00 3.8658667e+00 3.7183181e+00 4.5670800e+00 4.4180998e+00 3.9298460e+00 3.6561219e+00 3.8459316e+00 4.0712063e+00 3.6910219e+00 3.5300704e+00 3.2300705e+00 3.6894189e+00 2.6906230e+00 3.3402581e+00 3.1455455e+00 3.4142500e+00 1.9871921e+00 3.3364095e+00 2.5801041e+00 2.2579027e+00 2.8953397e+00 2.7040361e+00 3.3706887e+00 2.2848507e+00 3.1889632e+00 3.1641787e+00 2.7405950e+00 3.2351115e+00 2.5567836e+00 3.5066271e+00 2.7031874e+00 3.5985833e+00 3.3547156e+00 3.0245025e+00 3.1656773e+00 3.5695690e+00 3.7624530e+00 3.1847809e+00 2.1665831e+00 2.4678343e+00 2.3636654e+00 2.5680682e+00 3.7710578e+00 3.1606607e+00 3.1985717e+00 3.4665002e+00 3.1244487e+00 2.7540755e+00 2.6724144e+00 3.0392407e+00 3.2747247e+00 2.6671530e+00 2.0066796e+00 2.8554471e+00 2.8427684e+00 2.8549070e+00 2.9928504e+00 1.7230625e+00 2.7611864e+00 4.7742557e+00 3.8047268e+00 4.7018935e+00 4.2892152e+00 4.5488617e+00 5.4303909e+00 3.2037606e+00 5.0724791e+00 4.5217060e+00 4.9623634e+00 3.8707551e+00 4.0296740e+00 4.2915574e+00 3.7321091e+00 3.9154512e+00 4.1022778e+00 4.2113304e+00 5.5520135e+00 5.7453700e+00 3.6849669e+00 4.5212945e+00 3.6308222e+00 5.5330176e+00 3.6335075e+00 4.4607162e+00 4.7770551e+00 3.5299194e+00 3.6126659e+00 4.3390241e+00 4.5771358e+00 4.9175276e+00 5.3118739e+00 4.3561658e+00 3.7812981e+00 4.2455646e+00 5.0340960e+00 4.3872001e+00 4.2015182e+00 3.5126820e+00 4.2176412e+00 4.4249262e+00 3.9985367e+00 3.8047268e+00 4.6887893e+00 4.5358705e+00 4.0502685e+00 3.7475470e+00 3.9619683e+00 4.1767972e+00 3.7895730e+00 6.0611244e-01 2.1845981e-01 1.6212669e+00 5.6769031e-01 1.3103855e+00 7.0437330e-01 2.2923690e+00 4.4651726e-01 1.8497891e+00 2.2196852e+00 1.1283882e+00 1.3099706e+00 9.0827783e-01 1.5790055e+00 3.7427929e-01 1.4018200e+00 1.2701139e+00 1.1341579e+00 1.5133392e+00 1.1134787e+00 1.0264409e+00 8.7202528e-01 9.2264612e-01 6.6432544e-01 4.5470518e-01 4.1449626e-01 4.3456114e-01 1.0085601e+00 1.5838351e+00 1.6415861e+00 1.6742876e+00 1.3140585e+00 1.0496979e+00 1.6013574e+00 1.0054037e+00 3.0546431e-01 1.0168833e+00 1.4293465e+00 1.5774037e+00 1.5278635e+00 9.0252542e-01 1.2994764e+00 2.2231652e+00 1.4317371e+00 1.3207609e+00 1.3224963e+00 8.3649708e-01 2.2607507e+00 1.3421549e+00 1.5412452e+00 1.2539702e+00 1.2643026e+00 1.0324775e+00 1.2342162e+00 1.9387309e+00 2.1209313e+00 1.6105602e+00 1.1912106e+00 1.5832517e+00 7.2486328e-01 8.5585239e-01 9.4009473e-01 1.3873503e+00 1.3945703e+00 1.0313560e+00 8.7720955e-01 2.0658700e+00 2.2655571e+00 1.2460824e+00 1.1834841e+00 1.4368020e+00 2.0378171e+00 7.9878917e-01 1.0960883e+00 1.3102767e+00 8.5105559e-01 9.2480363e-01 1.0805899e+00 1.1043883e+00 1.4313279e+00 1.8006336e+00 1.1235486e+00 7.6625946e-01 1.1633029e+00 1.5390703e+00 1.2493717e+00 9.0965328e-01 1.0182895e+00 8.6983677e-01 1.1880428e+00 9.2095040e-01 1.2539702e+00 1.3335022e+00 1.3109705e+00 9.5035453e-01 9.2112464e-01 7.6166891e-01 1.1418127e+00 1.1276971e+00 5.6700421e-01 1.1449732e+00 4.0293660e-01 7.3813096e-01 2.1845981e-01 1.7551534e+00 3.4583729e-01 1.2603076e+00 1.7354460e+00 5.3588338e-01 1.0777972e+00 3.8934542e-01 1.0669582e+00 3.0811765e-01 8.0294841e-01 7.8768770e-01 1.0018083e+00 1.0175773e+00 5.5419992e-01 5.9426792e-01 7.3496673e-01 4.8927739e-01 3.4378533e-01 2.5651975e-01 5.2655962e-01 5.4292906e-01 4.4417983e-01 1.1634384e+00 1.1527805e+00 1.2020363e+00 8.1521713e-01 7.2526325e-01 1.0018083e+00 4.1449626e-01 3.2586371e-01 9.0277242e-01 8.3172002e-01 1.0440187e+00 9.7779835e-01 3.2816937e-01 8.1521713e-01 1.7083888e+00 8.6361309e-01 7.3145860e-01 7.3145860e-01 3.6171588e-01 1.7816674e+00 7.6914805e-01 1.6177449e+00 8.3060013e-01 1.4732400e+00 1.1107977e+00 1.3546017e+00 2.2147080e+00 1.5404344e+00 1.8624350e+00 1.3603471e+00 1.7544191e+00 6.8961791e-01 8.7478495e-01 1.0733200e+00 9.5271386e-01 1.0466623e+00 9.9348625e-01 1.0085601e+00 2.3452277e+00 2.5288464e+00 1.0480665e+00 1.3130641e+00 8.9653332e-01 2.3282127e+00 5.8914551e-01 1.2436109e+00 1.5625142e+00 4.8927739e-01 4.8927739e-01 1.1593224e+00 1.3813076e+00 1.7138020e+00 2.1603815e+00 1.1866786e+00 6.4755655e-01 1.1521791e+00 1.8620175e+00 1.2565757e+00 1.0067784e+00 4.8927739e-01 1.0056742e+00 1.2594846e+00 9.3049742e-01 8.3060013e-01 1.4762619e+00 1.3817041e+00 9.4558103e-01 7.9613242e-01 7.7074935e-01 1.0627606e+00 7.0776547e-01 1.5593809e+00 4.8036801e-01 1.2165505e+00 6.1151102e-01 2.2871743e+00 4.0176783e-01 1.7963441e+00 2.1851225e+00 1.0906388e+00 1.2884575e+00 8.0619006e-01 1.6156775e+00 5.0905001e-01 1.3093850e+00 1.2434795e+00 1.0262547e+00 1.4875372e+00 1.0069726e+00 1.0669582e+00 7.4511469e-01 8.2384013e-01 6.9728513e-01 5.3022554e-01 3.0811765e-01 2.5651975e-01 9.2264612e-01 1.6478667e+00 1.6180636e+00 1.6694817e+00 1.3199714e+00 9.2288144e-01 1.5068702e+00 9.2859317e-01 2.4837156e-01 9.3238528e-01 1.3813076e+00 1.5238543e+00 1.4346522e+00 8.1130291e-01 1.2794849e+00 2.2234347e+00 1.3629833e+00 1.2671726e+00 1.2652657e+00 8.1810461e-01 2.3116343e+00 1.2988558e+00 1.3410314e+00 1.1276971e+00 1.0590298e+00 8.2552685e-01 1.0264409e+00 1.7485421e+00 2.0171203e+00 1.4118594e+00 9.7949166e-01 1.3980896e+00 5.7324170e-01 6.6317860e-01 7.4586719e-01 1.2603076e+00 1.2604558e+00 8.7504951e-01 6.6432544e-01 1.8915404e+00 2.0711789e+00 1.1178264e+00 9.9368623e-01 1.3223897e+00 1.8515012e+00 6.6384020e-01 8.9303452e-01 1.1107977e+00 7.2823007e-01 8.1099042e-01 8.7170815e-01 9.0876485e-01 1.2370832e+00 1.6626615e+00 9.2112464e-01 6.2482915e-01 9.7377870e-01 1.3752391e+00 1.0720678e+00 7.0386584e-01 9.0876485e-01 6.8917100e-01 1.0120221e+00 8.0294841e-01 1.1276971e+00 1.1329323e+00 1.1353806e+00 8.1385214e-01 7.7588000e-01 5.8914551e-01 9.8054887e-01 1.0085601e+00 1.0879524e+00 6.2605182e-01 1.2079117e+00 8.2305664e-01 1.1903922e+00 4.4651726e-01 6.5648056e-01 7.4164639e-01 5.2942799e-01 8.9852394e-01 6.4755655e-01 1.3035649e+00 7.7074935e-01 4.8135521e-01 7.7074935e-01 2.5651975e-01 1.1022599e+00 6.8917100e-01 1.0627606e+00 8.6290690e-01 9.7759114e-01 1.1868139e+00 1.3969297e+00 1.4333755e+00 7.6166891e-01 5.6075294e-01 2.5251796e-01 3.7427929e-01 4.4651726e-01 1.1444449e+00 7.7074935e-01 1.1571858e+00 1.3491011e+00 8.2624515e-01 7.0086313e-01 2.0000000e-01 4.4535192e-01 8.9852394e-01 3.7427929e-01 7.7885297e-01 4.1449626e-01 7.0826681e-01 6.1092863e-01 8.2275389e-01 1.0198386e+00 5.0905001e-01 2.2002582e+00 1.1640914e+00 2.2347161e+00 1.6833015e+00 1.9584639e+00 2.9773446e+00 7.2852070e-01 2.5984158e+00 1.9494155e+00 2.5625921e+00 1.4644662e+00 1.4491244e+00 1.8190688e+00 1.0934620e+00 1.3861754e+00 1.6265426e+00 1.6626615e+00 3.1878246e+00 3.2549253e+00 1.0346741e+00 2.0606771e+00 1.0425476e+00 3.0882196e+00 1.1022599e+00 1.9692383e+00 2.3537589e+00 1.0082605e+00 1.0950112e+00 1.7332099e+00 2.1942739e+00 2.5032087e+00 3.0886055e+00 1.7538274e+00 1.2342162e+00 1.6237100e+00 2.7181432e+00 1.8926658e+00 1.6507294e+00 1.0082605e+00 1.8244836e+00 1.9254808e+00 1.7303440e+00 1.1640914e+00 2.1641182e+00 2.0565627e+00 1.6435752e+00 1.1782910e+00 1.4699978e+00 1.7142546e+00 1.2095267e+00 8.0326782e-01 5.0991930e-01 1.8350577e+00 2.1269358e-01 1.3537729e+00 1.7146525e+00 6.5172743e-01 8.5585239e-01 4.0438741e-01 1.1847335e+00 3.4583729e-01 9.0252542e-01 8.2372435e-01 6.2024833e-01 1.0324775e+00 6.6827038e-01 6.5172743e-01 3.8776762e-01 4.4535192e-01 3.2816937e-01 2.5651975e-01 3.2586371e-01 4.3691963e-01 5.0180477e-01 1.2342162e+00 1.1573546e+00 1.2172454e+00 8.7848692e-01 6.2205176e-01 1.1016264e+00 6.9006418e-01 3.2586371e-01 5.2371571e-01 9.4492923e-01 1.0646687e+00 1.0101422e+00 4.1449626e-01 8.2552685e-01 1.7679545e+00 9.2288144e-01 8.3888121e-01 8.2929029e-01 3.8934542e-01 1.8776878e+00 8.5434758e-01 1.5481649e+00 7.9613242e-01 1.3657247e+00 1.0085601e+00 1.2641849e+00 2.1002817e+00 1.6030661e+00 1.7482192e+00 1.2100024e+00 1.7005893e+00 6.6491075e-01 7.3535471e-01 9.7949166e-01 8.8358844e-01 1.0423677e+00 9.5498315e-01 9.1051084e-01 2.2737459e+00 2.4086493e+00 7.2486328e-01 1.2326306e+00 9.4832302e-01 2.2096958e+00 3.8934542e-01 1.1729895e+00 1.4561933e+00 3.8776762e-01 4.8927739e-01 1.0574300e+00 1.2643026e+00 1.5918956e+00 2.0914667e+00 1.0906388e+00 5.0817745e-01 1.0182895e+00 1.7457596e+00 1.2250414e+00 9.1663180e-01 5.4292906e-01 9.1750357e-01 1.1891470e+00 8.8358844e-01 7.9613242e-01 1.3916739e+00 1.3267389e+00 8.9303452e-01 5.3309112e-01 6.9325418e-01 1.0574013e+00 7.0776547e-01 7.0776547e-01 1.3071453e+00 9.0049692e-01 6.9006418e-01 1.2079117e+00 3.6171588e-01 7.1791510e-01 4.1586001e-01 9.0049692e-01 1.0069726e+00 2.5251796e-01 4.4651726e-01 6.9325418e-01 6.2538346e-01 5.9426792e-01 5.6631629e-01 6.6827038e-01 4.1449626e-01 7.0437330e-01 9.0277242e-01 1.1055069e+00 1.0496979e+00 3.2586371e-01 1.0083666e+00 7.4164639e-01 8.3888121e-01 6.0181382e-01 6.3861009e-01 3.4378533e-01 6.3808075e-01 1.0101422e+00 6.8961791e-01 4.1449626e-01 5.3588338e-01 2.5651975e-01 4.1586001e-01 5.0991930e-01 1.2869134e+00 3.0546431e-01 3.2586371e-01 3.0275928e-01 5.0905001e-01 1.5278635e+00 4.0000000e-01 1.7279861e+00 7.4586719e-01 1.7831878e+00 1.1718516e+00 1.4824233e+00 2.5111349e+00 8.3620494e-01 2.1256928e+00 1.4719311e+00 2.0814452e+00 1.0175773e+00 1.0014633e+00 1.3875139e+00 7.7885297e-01 1.1473003e+00 1.2144845e+00 1.1591754e+00 2.6773585e+00 2.7900071e+00 7.0776547e-01 1.6151673e+00 7.3496673e-01 2.6263773e+00 7.2526325e-01 1.4645804e+00 1.8755806e+00 6.3924842e-01 6.2407309e-01 1.2731262e+00 1.7507664e+00 2.0635966e+00 2.6116811e+00 1.3129189e+00 7.4855857e-01 1.1149070e+00 2.3160147e+00 1.4246028e+00 1.1229843e+00 5.6075294e-01 1.4120836e+00 1.5094575e+00 1.4108494e+00 7.4586719e-01 1.6884234e+00 1.6211869e+00 1.3017208e+00 8.1521713e-01 1.0401425e+00 1.2452704e+00 6.9728513e-01 1.8185955e+00 4.8135521e-01 1.2509218e+00 1.8049926e+00 5.8914551e-01 1.2205493e+00 4.2538717e-01 1.1912106e+00 4.6472023e-01 7.1840099e-01 8.9207714e-01 1.1017858e+00 1.1127329e+00 4.1586001e-01 7.8197925e-01 8.0326782e-01 5.7257017e-01 5.2655962e-01 4.3456114e-01 6.2660376e-01 4.8135521e-01 4.5581864e-01 1.3318128e+00 1.2468939e+00 1.3144065e+00 9.4935318e-01 6.6384020e-01 9.1075311e-01 3.2586371e-01 4.1449626e-01 1.0130748e+00 8.3280511e-01 1.0906119e+00 9.6204649e-01 3.4583729e-01 9.3296062e-01 1.7901543e+00 8.7170815e-01 7.3805807e-01 7.3805807e-01 5.2655962e-01 1.9041928e+00 8.1521713e-01 1.4138821e+00 7.3805807e-01 1.3166957e+00 9.2264612e-01 1.1533602e+00 2.0690479e+00 1.4700179e+00 1.7092525e+00 1.2231847e+00 1.5870088e+00 5.0592043e-01 7.5791688e-01 9.0575661e-01 9.1750357e-01 9.1802948e-01 8.1304731e-01 8.1638392e-01 2.1978861e+00 2.3802944e+00 1.1107977e+00 1.1386292e+00 7.9878917e-01 2.1900222e+00 6.1092863e-01 1.0480665e+00 1.4148192e+00 5.0991930e-01 3.6171588e-01 9.7825559e-01 1.2593659e+00 1.5912764e+00 2.0615043e+00 1.0056742e+00 5.6700421e-01 1.0137836e+00 1.7695175e+00 1.0597541e+00 8.0619006e-01 3.8934542e-01 8.6513410e-01 1.0755693e+00 8.4050231e-01 7.3805807e-01 1.2832075e+00 1.1947245e+00 8.0660588e-01 8.2105460e-01 5.9426792e-01 8.6983677e-01 5.3309112e-01 1.9083318e+00 6.7975091e-01 4.1449626e-01 1.2452704e+00 1.1763980e+00 1.6420607e+00 7.9016429e-01 1.9365498e+00 1.3172979e+00 1.0653845e+00 1.5684812e+00 8.1304731e-01 1.7169601e+00 1.2768639e+00 1.8804140e+00 1.6311692e+00 1.6315809e+00 1.8424891e+00 2.1489929e+00 2.2038673e+00 1.4613032e+00 8.0587320e-01 6.8961791e-01 6.4704320e-01 9.7949166e-01 1.9250543e+00 1.2802798e+00 1.5824669e+00 2.0485534e+00 1.5790055e+00 1.0078327e+00 8.2305664e-01 1.1498269e+00 1.5838351e+00 1.0137836e+00 1.2418578e-01 1.0230441e+00 1.1119327e+00 1.0941064e+00 1.4719311e+00 3.2816937e-01 1.0165138e+00 2.9338155e+00 1.9158303e+00 3.0455280e+00 2.4635485e+00 2.7430309e+00 3.7921012e+00 1.2632199e+00 3.4105293e+00 2.7619926e+00 3.3261421e+00 2.2045198e+00 2.2598424e+00 2.6204307e+00 1.8330979e+00 2.0701646e+00 2.3622531e+00 2.4525409e+00 3.9619101e+00 4.0743074e+00 1.8315269e+00 2.8475224e+00 1.7388184e+00 3.9054939e+00 1.9111264e+00 2.7377517e+00 3.1510494e+00 1.7964653e+00 1.8350071e+00 2.5277506e+00 2.9970778e+00 3.3196868e+00 3.8532018e+00 2.5453122e+00 2.0312250e+00 2.3887539e+00 3.5269824e+00 2.5986705e+00 2.4210417e+00 1.7228354e+00 2.6125646e+00 2.7062349e+00 2.4839132e+00 1.9158303e+00 2.9502077e+00 2.8139128e+00 2.4180244e+00 1.9947426e+00 2.2550764e+00 2.3956104e+00 1.9332869e+00 1.4468211e+00 1.8027242e+00 7.3851529e-01 9.0658670e-01 5.0180477e-01 1.2418578e+00 2.5651975e-01 1.0022010e+00 8.6361309e-01 7.3851529e-01 1.1055064e+00 7.8197925e-01 6.8961791e-01 4.8927739e-01 5.0270183e-01 3.2352160e-01 2.1269358e-01 2.5651975e-01 4.9857388e-01 6.0611244e-01 1.2633451e+00 1.2342162e+00 1.2794849e+00 9.3824087e-01 7.0776547e-01 1.2014753e+00 7.0429250e-01 2.5651975e-01 6.2482915e-01 1.0329901e+00 1.1593224e+00 1.1069580e+00 5.0180477e-01 8.9712482e-01 1.8394959e+00 1.0181000e+00 9.2095040e-01 9.2047746e-01 4.4417983e-01 1.9314297e+00 9.4103005e-01 1.6328100e+00 9.3238528e-01 1.3969297e+00 1.0389435e+00 1.3327491e+00 2.0961718e+00 1.7103548e+00 1.7405652e+00 1.2330392e+00 1.7474965e+00 7.7919451e-01 8.1810461e-01 1.0613462e+00 1.0417249e+00 1.2331989e+00 1.0974061e+00 9.4125538e-01 2.2568188e+00 2.4127176e+00 8.4050231e-01 1.3145067e+00 1.0960883e+00 2.1973666e+00 5.6075294e-01 1.2221471e+00 1.4467170e+00 5.7324170e-01 6.3977563e-01 1.1341579e+00 1.2436109e+00 1.5826476e+00 2.0476065e+00 1.1847335e+00 5.3665999e-01 1.0391247e+00 1.7521201e+00 1.3293211e+00 9.4492923e-01 6.9369532e-01 1.0019724e+00 1.3083079e+00 1.0406064e+00 9.3238528e-01 1.4580335e+00 1.4387122e+00 1.0576043e+00 7.0233835e-01 8.1304731e-01 1.1697902e+00 8.2372435e-01 7.6914805e-01 7.2823007e-01 8.7504951e-01 1.0611732e+00 4.5581864e-01 1.5204521e+00 6.6432544e-01 6.5172743e-01 1.0866092e+00 4.5470518e-01 1.0573285e+00 9.0074515e-01 1.3083079e+00 1.0613462e+00 1.2123540e+00 1.4190961e+00 1.6754036e+00 1.6596797e+00 8.9095811e-01 6.1947990e-01 4.2418962e-01 4.8927739e-01 6.0551856e-01 1.2951131e+00 6.2538346e-01 1.0030700e+00 1.5663312e+00 1.1396406e+00 4.5581864e-01 3.2816937e-01 5.3665999e-01 1.0166932e+00 6.0670504e-01 6.9167458e-01 4.4535192e-01 5.6075294e-01 5.3665999e-01 1.0182895e+00 9.1075311e-01 5.0991930e-01 2.2632657e+00 1.2601890e+00 2.4384530e+00 1.8269304e+00 2.0927845e+00 3.1870761e+00 6.4290921e-01 2.8096725e+00 2.1462316e+00 2.6900593e+00 1.5901181e+00 1.6364474e+00 2.0101738e+00 1.1729895e+00 1.4078246e+00 1.7083888e+00 1.8278268e+00 3.3435703e+00 3.4604677e+00 1.2331989e+00 2.2206574e+00 1.0719360e+00 3.3068858e+00 1.3163598e+00 2.0994872e+00 2.5539296e+00 1.1948578e+00 1.1991899e+00 1.8828324e+00 2.4245766e+00 2.7358293e+00 3.2702869e+00 1.8959565e+00 1.4312787e+00 1.7665622e+00 2.9527671e+00 1.9255490e+00 1.7860690e+00 1.0796583e+00 2.0205937e+00 2.0647798e+00 1.9168750e+00 1.2601890e+00 2.3069539e+00 2.1608869e+00 1.8128438e+00 1.3838212e+00 1.6376058e+00 1.7220696e+00 1.2768639e+00 1.2687651e+00 1.0344911e+00 1.5320003e+00 9.7779835e-01 1.8837258e+00 1.2979752e+00 1.0012667e+00 1.3957794e+00 7.2526325e-01 1.6850672e+00 1.2372418e+00 1.7004805e+00 1.4979666e+00 1.5611922e+00 1.7745022e+00 2.0153916e+00 2.0815027e+00 1.3830210e+00 8.1242502e-01 5.8914551e-01 5.7257017e-01 9.5676647e-01 1.7518264e+00 1.2724737e+00 1.6669115e+00 1.9675324e+00 1.4200435e+00 1.1136605e+00 7.1881659e-01 1.0072663e+00 1.5134954e+00 9.3238528e-01 3.2352160e-01 9.5222919e-01 1.1681971e+00 1.1043332e+00 1.4120836e+00 6.2205176e-01 1.0078327e+00 2.8028143e+00 1.7525933e+00 2.8815987e+00 2.2944257e+00 2.5825907e+00 3.6132031e+00 1.1179743e+00 3.2286633e+00 2.5673494e+00 3.2133201e+00 2.1127170e+00 2.0867931e+00 2.4721080e+00 1.6626615e+00 1.9456450e+00 2.2607446e+00 2.2983453e+00 3.8335668e+00 3.8818411e+00 1.6299374e+00 2.7127377e+00 1.6132118e+00 3.7182722e+00 1.7559391e+00 2.6123294e+00 2.9966900e+00 1.6625128e+00 1.7303440e+00 2.3560577e+00 2.8340159e+00 3.1407514e+00 3.7366777e+00 2.3765195e+00 1.8701780e+00 2.1933937e+00 3.3657099e+00 2.5066503e+00 2.2797241e+00 1.6331631e+00 2.4808010e+00 2.5698271e+00 2.3770285e+00 1.7525933e+00 2.8053367e+00 2.6963680e+00 2.2934334e+00 1.8202060e+00 2.1229819e+00 2.3231793e+00 1.8122257e+00 8.5462626e-01 5.0991930e-01 6.2538346e-01 8.0358695e-01 3.7255734e-01 5.3022554e-01 8.2105460e-01 6.0900723e-01 6.2482915e-01 3.0844217e-01 7.9580667e-01 5.4292906e-01 5.0991930e-01 7.0437330e-01 9.7270522e-01 9.9532071e-01 3.0546431e-01 7.9878917e-01 7.2343175e-01 7.8768770e-01 4.2418962e-01 9.0876485e-01 5.2862779e-01 4.4651726e-01 8.5205778e-01 7.4164639e-01 3.2586371e-01 5.7867728e-01 5.3309112e-01 4.1449626e-01 4.5581864e-01 1.2131545e+00 3.8776762e-01 3.2352160e-01 2.5251796e-01 3.2816937e-01 1.3221405e+00 2.8507955e-01 1.8873850e+00 9.2859317e-01 1.8730683e+00 1.4111029e+00 1.6550480e+00 2.6320302e+00 1.0406064e+00 2.2657813e+00 1.6658308e+00 2.1339968e+00 1.0072663e+00 1.1444449e+00 1.4417207e+00 8.9971984e-01 1.1192426e+00 1.2342162e+00 1.3367840e+00 2.7726042e+00 2.9277580e+00 9.9368623e-01 1.6694974e+00 7.8197925e-01 2.7493700e+00 7.5976039e-01 1.5849874e+00 1.9802196e+00 6.4290921e-01 7.1799256e-01 1.4445746e+00 1.8216794e+00 2.1462316e+00 2.6367554e+00 1.4616539e+00 9.2264612e-01 1.4088394e+00 2.3235034e+00 1.5120955e+00 1.3224963e+00 6.2024833e-01 1.4078246e+00 1.5587730e+00 1.2801437e+00 9.2859317e-01 1.8096161e+00 1.6710566e+00 1.2378278e+00 8.9653332e-01 1.0864449e+00 1.3071453e+00 9.0827783e-01 8.9159388e-01 7.7763126e-01 1.0417249e+00 9.1802948e-01 5.0905001e-01 6.2605182e-01 4.4651726e-01 1.2379511e+00 6.2024833e-01 9.5571254e-01 8.1558458e-01 7.5976039e-01 9.2944046e-01 1.0661822e+00 1.2662457e+00 8.2342214e-01 5.8851328e-01 5.1691876e-01 5.3588338e-01 5.1691876e-01 1.1717125e+00 9.6838716e-01 1.2601890e+00 1.1258723e+00 4.8135521e-01 8.3649708e-01 5.5419992e-01 6.2407309e-01 9.0965328e-01 4.2538717e-01 1.0906388e+00 5.9426792e-01 8.1638392e-01 7.3145860e-01 7.3145860e-01 1.1880428e+00 6.3861009e-01 2.2927296e+00 1.2766755e+00 2.1156916e+00 1.6869465e+00 1.9835684e+00 2.8209672e+00 1.2028939e+00 2.4458200e+00 1.8683030e+00 2.5149752e+00 1.4746001e+00 1.4371043e+00 1.7501772e+00 1.2500343e+00 1.5991931e+00 1.7211928e+00 1.6271057e+00 3.0580852e+00 3.1168283e+00 1.0328064e+00 2.0203543e+00 1.2344562e+00 2.9146252e+00 1.0941064e+00 1.9515265e+00 2.2002582e+00 1.0531192e+00 1.1790011e+00 1.7600233e+00 1.9895190e+00 2.3106402e+00 2.8876509e+00 1.7983401e+00 1.1763719e+00 1.6118154e+00 2.5100676e+00 2.0039716e+00 1.6449456e+00 1.1276917e+00 1.7245185e+00 1.9495298e+00 1.6638124e+00 1.2766755e+00 2.1512175e+00 2.1034605e+00 1.6449189e+00 1.1924295e+00 1.4645804e+00 1.8408873e+00 1.3037063e+00 1.1269972e+00 6.2482915e-01 5.0991930e-01 6.6827038e-01 7.0479928e-01 8.8358844e-01 4.5581864e-01 7.0086313e-01 4.2667565e-01 2.0656129e-01 4.4535192e-01 5.2942799e-01 7.0086313e-01 6.3861009e-01 2.1269358e-01 1.2261087e+00 1.0119857e+00 1.1001291e+00 8.1638392e-01 4.2667565e-01 7.0479928e-01 5.1691876e-01 6.0611244e-01 6.2538346e-01 6.9006418e-01 8.3812833e-01 6.4290921e-01 1.2418578e-01 7.3145860e-01 1.6044563e+00 6.2660376e-01 5.7324170e-01 5.6700421e-01 4.0293660e-01 1.7981158e+00 6.4806901e-01 1.5090287e+00 5.9426792e-01 1.4258804e+00 9.2264612e-01 1.2221471e+00 2.1613095e+00 1.2165505e+00 1.7814077e+00 1.1712156e+00 1.7475837e+00 7.0233835e-01 7.0776547e-01 1.0386594e+00 7.0233835e-01 1.0228981e+00 9.8450810e-01 8.5105559e-01 2.3257048e+00 2.4547248e+00 7.1504098e-01 1.2838690e+00 6.9369532e-01 2.2753334e+00 4.3691963e-01 1.1508502e+00 1.5109753e+00 4.0438741e-01 4.1449626e-01 1.0168833e+00 1.3670543e+00 1.6898941e+00 2.2253038e+00 1.0655560e+00 4.1586001e-01 9.0827783e-01 1.9262937e+00 1.2075315e+00 8.3888121e-01 4.0438741e-01 1.0401425e+00 1.2250414e+00 1.0755693e+00 5.9426792e-01 1.3866792e+00 1.3487634e+00 1.0056742e+00 5.9426792e-01 7.2526325e-01 1.0425476e+00 5.0592043e-01 1.2125198e+00 9.0252542e-01 5.4292906e-01 1.0679144e+00 4.5470518e-01 1.2307737e+00 5.6700421e-01 1.3629833e+00 1.1271488e+00 9.3592296e-01 1.1329323e+00 1.4903933e+00 1.5826638e+00 9.2264612e-01 3.7598397e-01 5.1691876e-01 5.3022554e-01 3.4583729e-01 1.5102079e+00 9.0478973e-01 9.6664346e-01 1.3678655e+00 1.0012667e+00 5.0090417e-01 4.9766035e-01 8.1130291e-01 1.0331736e+00 4.5581864e-01 7.6955924e-01 6.0551856e-01 6.0181382e-01 6.0060595e-01 8.1242502e-01 7.2852070e-01 5.0180477e-01 2.4944334e+00 1.5259640e+00 2.4897635e+00 2.0286682e+00 2.2758462e+00 3.2467454e+00 1.0417249e+00 2.8819633e+00 2.2804674e+00 2.7472449e+00 1.6234861e+00 1.7644184e+00 2.0587064e+00 1.4533724e+00 1.6559784e+00 1.8347926e+00 1.9605308e+00 3.3855928e+00 3.5452222e+00 1.4540815e+00 2.2852232e+00 1.3536716e+00 3.3617477e+00 1.3717027e+00 2.2096171e+00 2.5931780e+00 1.2603076e+00 1.3371180e+00 2.0643410e+00 2.4233813e+00 2.7521037e+00 3.2246201e+00 2.0784533e+00 1.5405106e+00 2.0088441e+00 2.9099860e+00 2.1140685e+00 1.9448322e+00 1.2330392e+00 2.0122105e+00 2.1687358e+00 1.8353933e+00 1.5259640e+00 2.4321505e+00 2.2783778e+00 1.8251179e+00 1.4795374e+00 1.7068208e+00 1.9049236e+00 1.5165339e+00 1.1004794e+00 9.4753140e-01 9.4125538e-01 1.1763719e+00 8.5105559e-01 6.6432544e-01 7.2526325e-01 6.4290921e-01 3.2816937e-01 1.2418578e-01 4.4535192e-01 6.2024833e-01 7.0479928e-01 1.2172454e+00 1.3021788e+00 1.3289150e+00 9.6141901e-01 8.9366705e-01 1.3003320e+00 7.1840099e-01 3.0275928e-01 8.2654509e-01 1.1056650e+00 1.2497790e+00 1.2234738e+00 6.0611244e-01 9.6141901e-01 1.8661545e+00 1.1149070e+00 1.0038051e+00 1.0038051e+00 5.0991930e-01 1.8886923e+00 1.0132664e+00 1.7427900e+00 1.0573285e+00 1.5462225e+00 1.2230220e+00 1.4700179e+00 2.2554582e+00 1.8183902e+00 1.9191337e+00 1.4359851e+00 1.8399871e+00 8.1558458e-01 9.6664346e-01 1.1754055e+00 1.1548215e+00 1.2523175e+00 1.1229906e+00 1.1149070e+00 2.3868096e+00 2.5734684e+00 1.0665149e+00 1.4148192e+00 1.1763719e+00 2.3591336e+00 6.6317860e-01 1.3545005e+00 1.6178623e+00 6.3735887e-01 7.2526325e-01 1.2709820e+00 1.4169523e+00 1.7425222e+00 2.1449779e+00 1.3015611e+00 7.4777660e-01 1.2601890e+00 1.8513630e+00 1.3897316e+00 1.1185330e+00 7.6625946e-01 1.0919712e+00 1.3783420e+00 1.0120221e+00 1.0573285e+00 1.5860263e+00 1.5022608e+00 1.0597541e+00 8.3060013e-01 8.9095811e-01 1.2107055e+00 9.5498315e-01 5.9426792e-01 8.8835966e-01 7.2486328e-01 4.3456114e-01 6.3108414e-01 7.9580667e-01 5.4292906e-01 8.0619006e-01 1.0003942e+00 1.2057554e+00 1.1282371e+00 4.0147421e-01 1.0482443e+00 8.3812833e-01 9.3049742e-01 6.4290921e-01 6.6432544e-01 2.0000000e-01 4.9766035e-01 1.1016264e+00 8.7202528e-01 4.1312257e-01 6.2660376e-01 4.4651726e-01 5.0180477e-01 5.9426792e-01 1.3172979e+00 3.8776762e-01 3.7427929e-01 3.2816937e-01 6.1151102e-01 1.5338492e+00 4.2667565e-01 1.6536633e+00 6.6827038e-01 1.8195408e+00 1.1798960e+00 1.4588731e+00 2.5552364e+00 7.7039952e-01 2.1764356e+00 1.5179392e+00 2.0659196e+00 1.0072663e+00 1.0165138e+00 1.4077317e+00 7.0523271e-01 9.7441804e-01 1.1290808e+00 1.1879078e+00 2.7003420e+00 2.8251568e+00 8.7478495e-01 1.6113870e+00 5.7257017e-01 2.6756977e+00 7.5976039e-01 1.4611141e+00 1.9290721e+00 6.4290921e-01 5.8851328e-01 1.2509218e+00 1.8216794e+00 2.1226924e+00 2.6556584e+00 1.2741904e+00 8.1527569e-01 1.1396406e+00 2.3658814e+00 1.3219975e+00 1.1377990e+00 4.8036801e-01 1.4418088e+00 1.4695582e+00 1.4097125e+00 6.6827038e-01 1.6762567e+00 1.5624022e+00 1.2731262e+00 8.4812820e-01 1.0423677e+00 1.1235486e+00 6.3808075e-01 7.0328431e-01 2.8507955e-01 9.7377870e-01 3.7598397e-01 8.9971984e-01 6.2538346e-01 6.2988288e-01 8.4591037e-01 1.1042097e+00 1.1949615e+00 5.7867728e-01 6.0121055e-01 4.2418962e-01 4.8036801e-01 2.4837156e-01 1.0588560e+00 6.3735887e-01 8.4050231e-01 1.0216438e+00 6.0900723e-01 3.8776762e-01 3.8934542e-01 3.8934542e-01 6.0900723e-01 2.1269358e-01 1.0100718e+00 3.2586371e-01 3.2816937e-01 3.2816937e-01 4.6472023e-01 1.1765359e+00 3.0546431e-01 2.1603815e+00 1.1833480e+00 2.0696037e+00 1.5733646e+00 1.8844302e+00 2.7913211e+00 1.0279631e+00 2.4069427e+00 1.8096161e+00 2.4013270e+00 1.3194762e+00 1.3641156e+00 1.6852518e+00 1.1847335e+00 1.5344133e+00 1.5901181e+00 1.5133392e+00 2.9601125e+00 3.0929882e+00 9.7994716e-01 1.9359434e+00 1.1341579e+00 2.8969791e+00 1.0267435e+00 1.8174459e+00 2.1353579e+00 9.5498315e-01 1.0067464e+00 1.6752254e+00 1.9600024e+00 2.3015655e+00 2.8161147e+00 1.7177705e+00 1.0636401e+00 1.5095556e+00 2.5229584e+00 1.8388413e+00 1.5016471e+00 9.4558103e-01 1.6620056e+00 1.8661202e+00 1.6246433e+00 1.1833480e+00 2.0524784e+00 1.9917352e+00 1.5896248e+00 1.1449732e+00 1.3635198e+00 1.6539414e+00 1.1377990e+00 7.8695083e-01 1.0194752e+00 6.9369532e-01 4.4535192e-01 6.2538346e-01 7.1169738e-01 8.2684479e-01 7.5791688e-01 8.9971984e-01 7.0394675e-01 1.0777972e+00 8.9366705e-01 9.7548738e-01 7.3805807e-01 6.9369532e-01 9.9348625e-01 1.2013436e+00 9.4287188e-01 2.1845981e-01 9.1163729e-01 7.8197925e-01 7.4777660e-01 8.0096515e-01 6.3735887e-01 1.5043029e+00 7.0776547e-01 8.7021234e-01 7.8197925e-01 7.0784540e-01 1.6629594e+00 7.2852070e-01 1.7521201e+00 7.5705927e-01 1.5812904e+00 1.1798960e+00 1.4306494e+00 2.2994849e+00 1.3047221e+00 1.9342059e+00 1.3259654e+00 2.0165210e+00 1.0919404e+00 8.7720955e-01 1.2180145e+00 7.1881659e-01 1.0466623e+00 1.2389598e+00 1.1426203e+00 2.5872805e+00 2.5766735e+00 5.0817745e-01 1.4924169e+00 8.3060013e-01 2.3982377e+00 5.8914551e-01 1.4728952e+00 1.7209381e+00 6.3808075e-01 8.3649708e-01 1.1916257e+00 1.5183917e+00 1.7983401e+00 2.4620092e+00 1.2174316e+00 7.4549115e-01 1.1136343e+00 1.9965599e+00 1.5255331e+00 1.1891470e+00 8.2384013e-01 1.2304904e+00 1.3937115e+00 1.1842231e+00 7.5705927e-01 1.6132118e+00 1.5725854e+00 1.1127329e+00 5.8914551e-01 9.8054887e-01 1.4089719e+00 9.0521488e-01 1.1043332e+00 5.3665999e-01 1.1040512e+00 8.6137722e-01 8.5335130e-01 1.0692258e+00 1.3395518e+00 1.4121163e+00 7.2343175e-01 4.0438741e-01 1.4096146e-01 2.1845981e-01 2.5251796e-01 1.2340567e+00 7.2852070e-01 1.0216438e+00 1.2599182e+00 7.7360126e-01 5.1607523e-01 2.1269358e-01 5.0270183e-01 8.3345577e-01 2.1845981e-01 7.4893123e-01 3.4378533e-01 5.3022554e-01 4.5581864e-01 6.9167458e-01 9.4080461e-01 3.4583729e-01 2.3056888e+00 1.2961380e+00 2.2790932e+00 1.7645599e+00 2.0520955e+00 3.0186066e+00 8.9827435e-01 2.6386155e+00 2.0191749e+00 2.5992685e+00 1.4843324e+00 1.5325189e+00 1.8691652e+00 1.2554784e+00 1.5582387e+00 1.7070813e+00 1.7171798e+00 3.2008583e+00 3.3121677e+00 1.1313840e+00 2.1147926e+00 1.1879078e+00 3.1280700e+00 1.1681971e+00 2.0145868e+00 2.3728666e+00 1.0720678e+00 1.1437669e+00 1.8347926e+00 2.2027051e+00 2.5315934e+00 3.0688850e+00 1.8636112e+00 1.2768639e+00 1.7126039e+00 2.7381221e+00 1.9739212e+00 1.7039473e+00 1.0573285e+00 1.8507968e+00 2.0095044e+00 1.7591313e+00 1.2961380e+00 2.2339736e+00 2.1358764e+00 1.7106141e+00 1.2731262e+00 1.5241199e+00 1.7828037e+00 1.2869134e+00 8.7720955e-01 7.4777660e-01 6.5223271e-01 7.1881659e-01 7.6914805e-01 9.3999899e-01 8.0619006e-01 4.2418962e-01 1.4104707e+00 1.2144845e+00 1.3128167e+00 1.0056742e+00 5.3665999e-01 5.6075294e-01 3.4583729e-01 8.1130291e-01 9.7730901e-01 7.8197925e-01 9.9089002e-01 8.0353565e-01 4.3691963e-01 9.6095130e-01 1.7110336e+00 7.7033318e-01 7.5196795e-01 7.0776547e-01 6.5648056e-01 1.8915404e+00 7.9878917e-01 1.2730931e+00 5.3022554e-01 1.4349259e+00 8.3620494e-01 1.0733200e+00 2.1767273e+00 1.0960883e+00 1.8048569e+00 1.2035173e+00 1.6539414e+00 6.2482915e-01 7.0523271e-01 1.0184370e+00 7.1169738e-01 6.6432544e-01 7.0480730e-01 8.1527569e-01 2.3116343e+00 2.4505705e+00 1.0085601e+00 1.2063335e+00 4.5581864e-01 2.3022338e+00 5.6700421e-01 1.0655560e+00 1.5550492e+00 4.4417983e-01 2.5251796e-01 8.8358844e-01 1.4559276e+00 1.7532140e+00 2.2755980e+00 8.9653332e-01 5.5160819e-01 9.1163729e-01 1.9862884e+00 9.1163729e-01 7.6752131e-01 2.0656129e-01 1.0632598e+00 1.0516761e+00 1.0391247e+00 5.3022554e-01 1.2756158e+00 1.1406052e+00 8.7720955e-01 7.3851529e-01 6.5633874e-01 7.0776547e-01 3.2352160e-01 9.1273187e-01 7.0043186e-01 3.7427929e-01 5.7324170e-01 9.3615100e-01 1.0733200e+00 5.0991930e-01 5.9426792e-01 6.5633874e-01 6.7975091e-01 3.0811765e-01 1.1056650e+00 7.7360126e-01 7.0429250e-01 8.2552685e-01 5.7257017e-01 5.0905001e-01 6.1968386e-01 6.5223271e-01 6.0611244e-01 3.2586371e-01 1.2028939e+00 5.0905001e-01 4.2667565e-01 4.1449626e-01 3.0546431e-01 1.2470767e+00 4.0147421e-01 2.1213832e+00 1.1521791e+00 2.0070710e+00 1.6126950e+00 1.8637576e+00 2.7490677e+00 1.2370832e+00 2.3910690e+00 1.8274132e+00 2.3004229e+00 1.1979861e+00 1.3368881e+00 1.5972416e+00 1.1093572e+00 1.3693737e+00 1.4644753e+00 1.5211725e+00 2.9013543e+00 3.0559175e+00 1.0590298e+00 1.8374244e+00 1.0423677e+00 2.8588399e+00 9.4309624e-01 1.7735968e+00 2.0979142e+00 8.5205778e-01 9.4287188e-01 1.6546836e+00 1.9109434e+00 2.2424413e+00 2.7118839e+00 1.6774684e+00 1.1029298e+00 1.6007141e+00 2.3898698e+00 1.7557336e+00 1.5191033e+00 8.5462626e-01 1.5344007e+00 1.7571295e+00 1.3898545e+00 1.1521791e+00 1.9987470e+00 1.8815752e+00 1.4085850e+00 1.0646687e+00 1.2740417e+00 1.5577803e+00 1.1296247e+00 4.0176783e-01 6.5223271e-01 6.3977563e-01 5.3022554e-01 5.7324170e-01 5.2574978e-01 1.4438552e+00 1.2221471e+00 1.3131724e+00 1.0406064e+00 3.4583729e-01 9.5943875e-01 9.2859317e-01 6.5172743e-01 5.1607523e-01 9.7548738e-01 1.0611732e+00 8.6137722e-01 5.3665999e-01 9.4854455e-01 1.8311457e+00 8.7420176e-01 8.7170815e-01 8.4050231e-01 6.5223271e-01 2.0303919e+00 8.9917007e-01 1.3866318e+00 5.7867728e-01 1.2002762e+00 7.4740267e-01 1.0440187e+00 1.9213397e+00 1.4087466e+00 1.5433565e+00 9.2836103e-01 1.6392533e+00 7.7360126e-01 5.0592043e-01 8.5585239e-01 6.8961791e-01 9.5035453e-01 9.5498315e-01 7.0776547e-01 2.1812146e+00 2.2081369e+00 3.7427929e-01 1.1335961e+00 7.7885297e-01 2.0291151e+00 3.2352160e-01 1.0661822e+00 1.3165513e+00 3.7598397e-01 5.3588338e-01 8.2305664e-01 1.1437730e+00 1.4415965e+00 2.0902718e+00 8.7848692e-01 3.2352160e-01 7.0479928e-01 1.6865203e+00 1.1904611e+00 7.5791688e-01 5.5492130e-01 8.9207714e-01 1.0805899e+00 9.6271042e-01 5.7867728e-01 1.2256881e+00 1.2481462e+00 8.8358844e-01 4.0147421e-01 6.4405773e-01 1.0887986e+00 5.9426792e-01 4.4651726e-01 5.4292906e-01 7.0437330e-01 7.0776547e-01 3.2816937e-01 1.2134101e+00 9.8820253e-01 1.0733200e+00 8.1099042e-01 4.9857388e-01 7.2172678e-01 6.5223271e-01 6.3808075e-01 5.3665999e-01 6.9369532e-01 8.2305664e-01 6.2482915e-01 2.5251796e-01 7.1799256e-01 1.5895397e+00 6.2205176e-01 5.7257017e-01 5.6769031e-01 4.0438741e-01 1.7935777e+00 6.4755655e-01 1.6267976e+00 7.4777660e-01 1.4807336e+00 9.7270522e-01 1.3173487e+00 2.1839601e+00 1.2277129e+00 1.7938033e+00 1.1948932e+00 1.8448199e+00 8.7383925e-01 8.2305664e-01 1.1418127e+00 8.4591037e-01 1.2153720e+00 1.1640914e+00 9.1163729e-01 2.3638833e+00 2.4815883e+00 6.3861009e-01 1.3946921e+00 8.5434758e-01 2.2902807e+00 6.1151102e-01 1.2452704e+00 1.5325394e+00 6.0121055e-01 6.1092863e-01 1.1228379e+00 1.3752705e+00 1.7103060e+00 2.2560685e+00 1.1879078e+00 4.5470518e-01 9.0454394e-01 1.9729066e+00 1.3650300e+00 9.0521488e-01 6.0670504e-01 1.1454006e+00 1.3674559e+00 1.2262704e+00 7.4777660e-01 1.4820085e+00 1.4947429e+00 1.1729895e+00 7.3145860e-01 8.7720955e-01 1.2163831e+00 6.5633874e-01 2.1845981e-01 5.6769031e-01 7.4777660e-01 4.2538717e-01 9.5099818e-01 9.7994716e-01 1.0119857e+00 6.5223271e-01 8.3888121e-01 1.0038051e+00 5.9426792e-01 4.6472023e-01 6.0121055e-01 8.0326782e-01 9.2836103e-01 9.0876485e-01 3.7598397e-01 6.3861009e-01 1.5602029e+00 8.0326782e-01 7.0129382e-01 7.0043186e-01 2.0000000e-01 1.6208239e+00 7.0437330e-01 1.8619092e+00 9.6271042e-01 1.6849072e+00 1.3188999e+00 1.5860263e+00 2.4084158e+00 1.5142414e+00 2.0543079e+00 1.5230852e+00 1.9980352e+00 9.4375082e-01 1.0588560e+00 1.3035649e+00 1.0035600e+00 1.2499342e+00 1.2459608e+00 1.2225634e+00 2.5586145e+00 2.7210925e+00 8.9366705e-01 1.5500052e+00 1.0014633e+00 2.5139485e+00 6.9369532e-01 1.4790710e+00 1.7580510e+00 6.2660376e-01 7.0429250e-01 1.3804167e+00 1.5625881e+00 1.8966943e+00 2.3518757e+00 1.4139741e+00 8.0358695e-01 1.3075101e+00 2.0455018e+00 1.5153654e+00 1.2234738e+00 6.6539428e-01 1.2342162e+00 1.5049644e+00 1.1591754e+00 9.6271042e-01 1.7107332e+00 1.6328100e+00 1.1880428e+00 8.3812833e-01 1.0106392e+00 1.3267389e+00 8.9767734e-01 4.2538717e-01 6.2024833e-01 6.0181382e-01 1.1431021e+00 1.1948932e+00 1.2269747e+00 8.6361309e-01 8.2552685e-01 1.2002640e+00 6.5223271e-01 3.0811765e-01 7.1462831e-01 1.0067784e+00 1.1396406e+00 1.1147518e+00 5.0817745e-01 8.5335130e-01 1.7711504e+00 1.0085601e+00 9.0454394e-01 9.0277242e-01 4.0438741e-01 1.8140813e+00 9.1075311e-01 1.7412567e+00 9.8054887e-01 1.5527694e+00 1.2155004e+00 1.4692412e+00 2.2702600e+00 1.7126039e+00 1.9279661e+00 1.4238090e+00 1.8539569e+00 8.1558458e-01 9.5035453e-01 1.1763980e+00 1.0621081e+00 1.2047214e+00 1.1205013e+00 1.1134787e+00 2.4108292e+00 2.5851693e+00 9.6095130e-01 1.4178113e+00 1.0879524e+00 2.3751496e+00 6.0900723e-01 1.3570688e+00 1.6277043e+00 5.7015910e-01 6.6491075e-01 1.2652657e+00 1.4292566e+00 1.7566567e+00 2.1846001e+00 1.2961380e+00 7.1840099e-01 1.2329148e+00 1.8795815e+00 1.3897316e+00 1.1149070e+00 6.8757066e-01 1.0960883e+00 1.3785366e+00 1.0168833e+00 9.8054887e-01 1.5871961e+00 1.5043071e+00 1.0597541e+00 7.7033318e-01 8.8861541e-01 1.2058675e+00 8.9134001e-01 3.4583729e-01 8.1130291e-01 1.5090287e+00 1.4644753e+00 1.5150043e+00 1.1847335e+00 8.1385214e-01 1.4041085e+00 8.9917007e-01 3.0811765e-01 6.6539428e-01 1.2643026e+00 1.3836712e+00 1.3112758e+00 7.0784540e-01 1.1353806e+00 2.0777059e+00 1.2396136e+00 1.1498269e+00 1.1474460e+00 6.9006418e-01 2.1775976e+00 1.1752673e+00 1.4613032e+00 1.0391247e+00 1.1810170e+00 8.7504951e-01 1.1390131e+00 1.8670836e+00 1.9048338e+00 1.5205305e+00 1.0228981e+00 1.5676403e+00 6.7975091e-01 6.6539428e-01 8.7175869e-01 1.1533602e+00 1.2459608e+00 9.7730901e-01 7.5082357e-01 2.0536508e+00 2.1838261e+00 8.9095811e-01 1.1306949e+00 1.2394907e+00 1.9665910e+00 5.6769031e-01 1.0425476e+00 1.2324706e+00 6.4704320e-01 7.3851529e-01 9.5476489e-01 1.0198386e+00 1.3510699e+00 1.8411319e+00 1.0100718e+00 5.2942799e-01 9.3801395e-01 1.5112621e+00 1.2002762e+00 7.7763126e-01 8.2899253e-01 8.2305664e-01 1.1377990e+00 9.1663180e-01 1.0391247e+00 1.2653669e+00 1.2757312e+00 9.2288144e-01 6.4405773e-01 6.6827038e-01 1.0851476e+00 9.3048953e-01 7.7074935e-01 1.6569692e+00 1.5391185e+00 1.6134578e+00 1.2794849e+00 7.1504098e-01 1.3197776e+00 7.9613242e-01 3.2586371e-01 8.6165877e-01 1.2653669e+00 1.4028652e+00 1.2701139e+00 6.6384020e-01 1.2172454e+00 2.1489775e+00 1.2262704e+00 1.1578646e+00 1.1452867e+00 7.9613242e-01 2.2808589e+00 1.1959482e+00 1.1500393e+00 9.1075311e-01 9.3999899e-01 6.4806901e-01 8.5434758e-01 1.6806723e+00 1.8184542e+00 1.3334814e+00 8.5205778e-01 1.2702636e+00 3.4583729e-01 4.3456114e-01 5.6700421e-01 1.0389435e+00 1.0122141e+00 6.4290921e-01 5.0905001e-01 1.8419636e+00 1.9902374e+00 9.3801395e-01 8.1810461e-01 1.1069580e+00 1.7940242e+00 4.4651726e-01 7.4740267e-01 1.0346741e+00 5.1691876e-01 6.0121055e-01 6.6827038e-01 8.5205778e-01 1.1776640e+00 1.6778021e+00 7.0776547e-01 4.2667565e-01 7.8695083e-01 1.3400806e+00 8.6165877e-01 5.3022554e-01 7.0437330e-01 5.0592043e-01 8.1273630e-01 6.0670504e-01 9.1075311e-01 9.7270522e-01 9.4352681e-01 6.0551856e-01 5.7257017e-01 3.4378533e-01 7.5705927e-01 8.0064372e-01 1.0450018e+00 8.4812820e-01 9.3847194e-01 6.2988288e-01 6.0611244e-01 6.0060595e-01 5.0090417e-01 7.0784540e-01 6.2538346e-01 5.0592043e-01 6.6932542e-01 5.5492130e-01 1.5422108e-01 5.6075294e-01 1.4235605e+00 4.6472023e-01 4.2418962e-01 3.8776762e-01 2.8192292e-01 1.5978583e+00 4.5581864e-01 1.6256459e+00 6.5633874e-01 1.5986180e+00 1.1106412e+00 1.3708966e+00 2.3519748e+00 1.1147518e+00 1.9798165e+00 1.3654173e+00 1.8856245e+00 7.7033318e-01 8.5335130e-01 1.1771643e+00 6.8076724e-01 9.7270522e-01 1.0165138e+00 1.0391247e+00 2.5081056e+00 2.6437138e+00 7.6716823e-01 1.4120836e+00 6.1947990e-01 2.4692682e+00 4.8927739e-01 1.3077572e+00 1.7030709e+00 3.8934542e-01 4.4651726e-01 1.1594648e+00 1.5551984e+00 1.8760773e+00 2.3977345e+00 1.1868139e+00 6.2024833e-01 1.1056650e+00 2.0821572e+00 1.2794849e+00 1.0244319e+00 3.7427929e-01 1.1646003e+00 1.3139135e+00 1.1119327e+00 6.5633874e-01 1.5344007e+00 1.4333755e+00 1.0386594e+00 6.3735887e-01 8.2372435e-01 1.0901359e+00 6.2081167e-01 3.4583729e-01 2.8192292e-01 4.1586001e-01 1.6237100e+00 1.0540105e+00 1.1816401e+00 1.4110536e+00 9.8450810e-01 6.6432544e-01 5.3665999e-01 9.0454394e-01 1.1389644e+00 5.0905001e-01 7.1799256e-01 7.1504098e-01 7.3813096e-01 7.2783368e-01 8.7021234e-01 6.9006418e-01 6.2482915e-01 2.6619364e+00 1.6754669e+00 2.5821869e+00 2.1421834e+00 2.4107926e+00 3.3209792e+00 1.2036484e+00 2.9531363e+00 2.3720162e+00 2.8824828e+00 1.7671769e+00 1.8842354e+00 2.1714345e+00 1.6176764e+00 1.8723516e+00 2.0134817e+00 2.0676751e+00 3.4808493e+00 3.6264553e+00 1.5230852e+00 2.4135751e+00 1.5351194e+00 3.4281547e+00 1.4948868e+00 2.3378347e+00 2.6680945e+00 1.3977032e+00 1.4832928e+00 2.1976523e+00 2.4795532e+00 2.8157449e+00 3.2956170e+00 2.2214438e+00 1.6336229e+00 2.1064881e+00 2.9775369e+00 2.2994849e+00 2.0603946e+00 1.3916739e+00 2.1189748e+00 2.3204945e+00 1.9672068e+00 1.6754669e+00 2.5635110e+00 2.4436082e+00 1.9753271e+00 1.6077195e+00 1.8374244e+00 2.0981613e+00 1.6585806e+00 1.2418578e-01 3.7598397e-01 1.3405045e+00 8.3812833e-01 1.1437669e+00 1.3915412e+00 8.9095811e-01 6.2538346e-01 2.5251796e-01 6.0611244e-01 9.6791960e-01 3.4583729e-01 6.2205176e-01 4.5581864e-01 6.5223271e-01 5.7867728e-01 8.2619017e-01 8.2654509e-01 4.6472023e-01 2.4061696e+00 1.3868130e+00 2.3985329e+00 1.8751958e+00 2.1591630e+00 3.1397173e+00 8.9852394e-01 2.7599154e+00 2.1335771e+00 2.7193241e+00 1.6021202e+00 1.6415861e+00 1.9851797e+00 1.3336069e+00 1.6224878e+00 1.8082080e+00 1.8350829e+00 3.3292261e+00 3.4297053e+00 1.2340567e+00 2.2298076e+00 1.2654843e+00 3.2489933e+00 1.2770118e+00 2.1337366e+00 2.4988032e+00 1.1786349e+00 1.2545301e+00 1.9393053e+00 2.3288114e+00 2.6536325e+00 3.2010862e+00 1.9648876e+00 1.3964978e+00 1.8188234e+00 2.8588023e+00 2.0766308e+00 1.8216743e+00 1.1634384e+00 1.9698860e+00 2.1147926e+00 1.8660999e+00 1.3868130e+00 2.3472906e+00 2.2417376e+00 1.8131734e+00 1.3752391e+00 1.6372749e+00 1.8856245e+00 1.3922071e+00 4.0176783e-01 1.4467170e+00 9.3049742e-01 1.2002762e+00 1.4411886e+00 9.4375082e-01 6.6432544e-01 3.7427929e-01 7.0784540e-01 1.0466623e+00 4.0176783e-01 5.6700421e-01 5.5492130e-01 6.9728513e-01 6.4405773e-01 8.7170815e-01 7.3535471e-01 5.3309112e-01 2.5193321e+00 1.5039793e+00 2.4895662e+00 1.9791576e+00 2.2673478e+00 3.2268480e+00 1.0014633e+00 2.8466240e+00 2.2303173e+00 2.8133325e+00 1.6962564e+00 1.7458338e+00 2.0805039e+00 1.4552205e+00 1.7454671e+00 1.9165907e+00 1.9332869e+00 3.4131779e+00 3.5208177e+00 1.3379696e+00 2.3275025e+00 1.3866044e+00 3.3340853e+00 1.3784233e+00 2.2317775e+00 2.5822073e+00 1.2828332e+00 1.3595018e+00 2.0485193e+00 2.4057315e+00 2.7355566e+00 3.2722484e+00 2.0762069e+00 1.4905436e+00 1.9191337e+00 2.9375895e+00 2.1864773e+00 1.9213461e+00 1.2702636e+00 2.0582667e+00 2.2206505e+00 1.9521784e+00 1.5039793e+00 2.4497583e+00 2.3480580e+00 1.9124077e+00 1.4817438e+00 1.7372199e+00 1.9937367e+00 1.5016471e+00 1.2122249e+00 6.7975091e-01 8.4050231e-01 1.0796583e+00 6.6539428e-01 3.4583729e-01 3.2816937e-01 5.2942799e-01 7.3145860e-01 1.2418578e-01 9.1163729e-01 3.2586371e-01 3.7427929e-01 3.2816937e-01 5.0592043e-01 1.0122141e+00 2.1845981e-01 2.2481791e+00 1.2631020e+00 2.1874158e+00 1.7295419e+00 1.9965608e+00 2.9333950e+00 1.0072663e+00 2.5632712e+00 1.9670002e+00 2.4858980e+00 1.3655398e+00 1.4724669e+00 1.7716601e+00 1.2125198e+00 1.4903113e+00 1.6105641e+00 1.6572339e+00 3.0940465e+00 3.2344170e+00 1.1332978e+00 2.0129643e+00 1.1341579e+00 3.0445772e+00 1.0864449e+00 1.9287276e+00 2.2802541e+00 9.8820253e-01 1.0688498e+00 1.7838044e+00 2.1039999e+00 2.4365934e+00 2.9349538e+00 1.8084630e+00 1.2266837e+00 1.7026843e+00 2.6138892e+00 1.8911946e+00 1.6476803e+00 9.7949166e-01 1.7305789e+00 1.9168750e+00 1.6065247e+00 1.2631020e+00 2.1541966e+00 2.0395401e+00 1.5896248e+00 1.1996741e+00 1.4306494e+00 1.6928004e+00 1.2436109e+00 7.5791688e-01 8.1242502e-01 7.6625946e-01 7.5976039e-01 1.0289803e+00 1.1332978e+00 7.9613242e-01 5.3665999e-01 1.1149070e+00 1.9007091e+00 9.2836103e-01 9.3610001e-01 9.1858284e-01 8.1638392e-01 2.1493214e+00 1.0132664e+00 1.1680362e+00 3.2352160e-01 1.2372418e+00 5.4292906e-01 8.7170815e-01 1.9366254e+00 1.1486378e+00 1.5564198e+00 8.7420176e-01 1.5682049e+00 6.6491075e-01 4.5470518e-01 8.8358844e-01 4.5581864e-01 8.0326782e-01 7.9878917e-01 5.9426792e-01 2.1460410e+00 2.1931311e+00 5.0180477e-01 1.0950112e+00 5.0592043e-01 2.0545952e+00 3.4378533e-01 9.3923979e-01 1.3512935e+00 3.4583729e-01 3.4583729e-01 6.6539428e-01 1.2670555e+00 1.5369942e+00 2.1465859e+00 7.2526325e-01 3.0546431e-01 5.0991930e-01 1.8206746e+00 9.8054887e-01 5.7015910e-01 3.8776762e-01 9.6664346e-01 9.9089002e-01 1.0262547e+00 3.2352160e-01 1.1127329e+00 1.1166017e+00 8.7848692e-01 3.8934542e-01 5.8914551e-01 8.8062848e-01 3.2586371e-01 6.4755655e-01 1.3011270e+00 1.0122141e+00 4.2538717e-01 6.2660376e-01 4.4651726e-01 7.0086313e-01 6.3735887e-01 1.2926374e+00 4.0176783e-01 4.2288438e-01 3.8934542e-01 8.0619006e-01 1.5230852e+00 4.6472023e-01 1.6933635e+00 7.0233835e-01 1.9584922e+00 1.2594846e+00 1.5411691e+00 2.6785768e+00 6.2605182e-01 2.3003744e+00 1.6284481e+00 2.1882128e+00 1.1729895e+00 1.1500393e+00 1.5577059e+00 7.1881659e-01 9.8985697e-01 1.2389598e+00 1.3108618e+00 2.8217641e+00 2.9357847e+00 9.3026633e-01 1.7457596e+00 5.7867728e-01 2.7994225e+00 9.3610001e-01 1.5801828e+00 2.0692197e+00 8.2384013e-01 7.4740267e-01 1.3410314e+00 1.9783833e+00 2.2683159e+00 2.8062463e+00 1.3610783e+00 9.7249562e-01 1.1868139e+00 2.5244698e+00 1.3852951e+00 1.2460824e+00 6.3808075e-01 1.6077195e+00 1.5873000e+00 1.5826476e+00 7.0233835e-01 1.7831878e+00 1.6667819e+00 1.4276261e+00 9.9519977e-01 1.1984588e+00 1.1903343e+00 7.0386584e-01 7.1840099e-01 1.1107977e+00 5.8624446e-01 9.8495853e-01 8.7504951e-01 4.1586001e-01 8.7720955e-01 1.5824669e+00 7.5976039e-01 5.5160819e-01 5.7741073e-01 5.4292906e-01 1.6736318e+00 6.7975091e-01 1.5883552e+00 8.2552685e-01 1.5948732e+00 1.1332978e+00 1.3595997e+00 2.3503762e+00 1.2554784e+00 1.9862884e+00 1.4596621e+00 1.8378727e+00 7.2852070e-01 9.6204649e-01 1.1697902e+00 9.6664346e-01 9.6271042e-01 9.5676647e-01 1.0496979e+00 2.4751922e+00 2.6546397e+00 1.2224367e+00 1.3843268e+00 7.2343175e-01 2.4751922e+00 7.5082357e-01 1.2832075e+00 1.7000773e+00 6.2988288e-01 5.0592043e-01 1.1833351e+00 1.5613251e+00 1.8886923e+00 2.3645560e+00 1.2016233e+00 7.5791688e-01 1.2125198e+00 2.0748074e+00 1.2155370e+00 1.0244319e+00 4.5470518e-01 1.1485394e+00 1.2770118e+00 1.0720678e+00 8.2552685e-01 1.5113992e+00 1.3835368e+00 1.0035600e+00 9.5571254e-01 8.2234151e-01 1.0120221e+00 6.5223271e-01 8.3888121e-01 1.1486378e+00 1.2994764e+00 1.2307737e+00 6.0181382e-01 1.0483827e+00 1.9867752e+00 1.1408504e+00 1.0391247e+00 1.0361698e+00 5.7867728e-01 2.0669733e+00 1.0646687e+00 1.4623898e+00 9.5866719e-01 1.2497790e+00 9.3048953e-01 1.1765359e+00 1.9666356e+00 1.8175297e+00 1.6242657e+00 1.1520347e+00 1.5603665e+00 5.7324170e-01 7.0233835e-01 8.8887100e-01 1.0919404e+00 1.1355826e+00 8.9712482e-01 8.1385214e-01 2.1052360e+00 2.2845234e+00 1.0166932e+00 1.1341579e+00 1.1332978e+00 2.0738150e+00 5.3309112e-01 1.0588560e+00 1.3224963e+00 5.5492130e-01 6.2538346e-01 9.8450810e-01 1.1271488e+00 1.4561933e+00 1.8911946e+00 1.0230441e+00 5.2574978e-01 1.0056742e+00 1.5916843e+00 1.1355826e+00 8.2105460e-01 7.1504098e-01 8.1527569e-01 1.1176720e+00 8.2899253e-01 9.5866719e-01 1.2943100e+00 1.2429818e+00 8.5205778e-01 7.0233835e-01 6.2660376e-01 9.8054887e-01 8.3649708e-01 8.7822463e-01 8.2899253e-01 8.1099042e-01 7.0826681e-01 5.8914551e-01 1.5042268e+00 7.3813096e-01 8.1558458e-01 7.4855857e-01 6.0121055e-01 1.6260946e+00 7.0386584e-01 1.8605327e+00 8.8503502e-01 1.6493191e+00 1.2601890e+00 1.5390703e+00 2.3592515e+00 1.4088394e+00 1.9940473e+00 1.4245508e+00 2.0716002e+00 1.1004436e+00 9.8820253e-01 1.2927814e+00 9.0056222e-01 1.2208301e+00 1.3194807e+00 1.1996741e+00 2.6153308e+00 2.6539963e+00 6.2538346e-01 1.5687169e+00 9.5271386e-01 2.4562038e+00 6.6491075e-01 1.5249255e+00 1.7538274e+00 6.6539428e-01 8.2619017e-01 1.3131724e+00 1.5409345e+00 1.8470010e+00 2.4533073e+00 1.3504603e+00 7.7039952e-01 1.2057554e+00 2.0352149e+00 1.6006330e+00 1.2331989e+00 8.0660588e-01 1.2747177e+00 1.5040391e+00 1.2426449e+00 8.8503502e-01 1.7019078e+00 1.6700310e+00 1.2144845e+00 7.4855857e-01 1.0401425e+00 1.4600567e+00 9.3296062e-01 5.0180477e-01 4.4651726e-01 6.2149089e-01 4.1586001e-01 1.0078327e+00 3.0275928e-01 1.4096146e-01 1.4096146e-01 6.0611244e-01 1.1536782e+00 2.0656129e-01 2.0491051e+00 1.0646687e+00 2.0979729e+00 1.5528443e+00 1.8279176e+00 2.8469870e+00 8.2234151e-01 2.4692682e+00 1.8399871e+00 2.3632803e+00 1.2493717e+00 1.3312249e+00 1.6756749e+00 1.0425476e+00 1.3092012e+00 1.4505265e+00 1.5123788e+00 2.9884772e+00 3.1361386e+00 1.0755693e+00 1.9017004e+00 9.3801395e-01 2.9635613e+00 9.8054887e-01 1.7833384e+00 2.1970231e+00 8.6513410e-01 8.9742724e-01 1.6159903e+00 2.0524973e+00 2.3760856e+00 2.8811560e+00 1.6399646e+00 1.0934620e+00 1.5205305e+00 2.5867433e+00 1.6928004e+00 1.4836711e+00 7.9580667e-01 1.6659943e+00 1.7839298e+00 1.5792930e+00 1.0646687e+00 2.0113485e+00 1.8901379e+00 1.5067717e+00 1.0950112e+00 1.3129189e+00 1.4875372e+00 1.0389435e+00 4.0293660e-01 8.0499049e-01 3.0546431e-01 7.8197925e-01 2.5251796e-01 5.1691876e-01 4.2538717e-01 7.4740267e-01 1.0181000e+00 3.2586371e-01 2.1717162e+00 1.1533602e+00 2.2234347e+00 1.6690840e+00 1.9433381e+00 2.9713636e+00 7.2486328e-01 2.5929835e+00 1.9489982e+00 2.5241649e+00 1.4089364e+00 1.4425304e+00 1.8012344e+00 1.0919712e+00 1.3726860e+00 1.5830057e+00 1.6408468e+00 3.1546522e+00 3.2544456e+00 1.0406064e+00 2.0352149e+00 1.0168833e+00 3.0859269e+00 1.0901359e+00 1.9325796e+00 2.3348454e+00 9.8054887e-01 1.0379132e+00 1.7250039e+00 2.1825260e+00 2.4995667e+00 3.0529994e+00 1.7458338e+00 1.2167151e+00 1.6214915e+00 2.7108297e+00 1.8418195e+00 1.6195190e+00 9.3847194e-01 1.7995863e+00 1.9034198e+00 1.7022897e+00 1.1533602e+00 2.1413027e+00 2.0233319e+00 1.6211869e+00 1.1770266e+00 1.4411886e+00 1.6502968e+00 1.1644030e+00 6.5633874e-01 4.4417983e-01 1.1332978e+00 2.1845981e-01 4.2538717e-01 3.4583729e-01 7.1504098e-01 1.4080793e+00 3.4583729e-01 1.8866180e+00 8.7848692e-01 1.9819543e+00 1.3312249e+00 1.6523803e+00 2.6988671e+00 6.9006418e-01 2.3100474e+00 1.6455737e+00 2.2934334e+00 1.2426449e+00 1.1905954e+00 1.5932297e+00 8.9095811e-01 1.2681309e+00 1.4065584e+00 1.3487634e+00 2.8835141e+00 2.9705897e+00 7.3805807e-01 1.8205354e+00 8.5462626e-01 2.8117234e+00 9.3049742e-01 1.6679957e+00 2.0758969e+00 8.4050231e-01 8.3060013e-01 1.4419145e+00 1.9521697e+00 2.2599493e+00 2.8310619e+00 1.4807336e+00 9.4558103e-01 1.2404967e+00 2.5235709e+00 1.6070713e+00 1.3102444e+00 7.5705927e-01 1.6281130e+00 1.7021627e+00 1.6240596e+00 8.7848692e-01 1.8790831e+00 1.8155245e+00 1.5040391e+00 1.0014633e+00 1.2481462e+00 1.4334902e+00 8.6165877e-01 6.6827038e-01 1.5475692e+00 5.8914551e-01 5.0503591e-01 4.9857388e-01 3.0811765e-01 1.7160413e+00 5.7324170e-01 1.5795964e+00 6.5648056e-01 1.4967461e+00 1.0182895e+00 1.3034549e+00 2.2380042e+00 1.2266837e+00 1.8619092e+00 1.2701139e+00 1.8007564e+00 7.2852070e-01 7.9016429e-01 1.0989735e+00 7.5705927e-01 1.0406064e+00 1.0184370e+00 9.3999899e-01 2.3886514e+00 2.5357185e+00 8.2684479e-01 1.3424112e+00 7.0776547e-01 2.3522207e+00 4.8927739e-01 1.2205493e+00 1.5832517e+00 4.2667565e-01 4.4417983e-01 1.0974061e+00 1.4319225e+00 1.7587110e+00 2.2711652e+00 1.1390131e+00 5.1691876e-01 1.0163549e+00 1.9782498e+00 1.2532075e+00 9.2859317e-01 4.1449626e-01 1.0852663e+00 1.2786117e+00 1.0887986e+00 6.5648056e-01 1.4596621e+00 1.3991741e+00 1.0313560e+00 6.6932542e-01 7.7553525e-01 1.0741917e+00 5.7257017e-01 9.4558103e-01 2.5651975e-01 4.1449626e-01 3.2816937e-01 4.8135521e-01 1.0908017e+00 2.1845981e-01 2.1701312e+00 1.1752673e+00 2.1084262e+00 1.6352583e+00 1.9101184e+00 2.8518881e+00 9.7825559e-01 2.4781934e+00 1.8745369e+00 2.4235816e+00 1.3078976e+00 1.3842113e+00 1.6965018e+00 1.1329323e+00 1.4319225e+00 1.5496439e+00 1.5691346e+00 3.0266197e+00 3.1503439e+00 1.0244319e+00 1.9425540e+00 1.0627606e+00 2.9623467e+00 1.0056742e+00 1.8539828e+00 2.2026387e+00 9.1163729e-01 9.9475949e-01 1.6952454e+00 2.0275673e+00 2.3581240e+00 2.8793190e+00 1.7227544e+00 1.1332978e+00 1.6029963e+00 2.5482247e+00 1.8278913e+00 1.5611067e+00 9.1163729e-01 1.6653066e+00 1.8462692e+00 1.5634147e+00 1.1752673e+00 2.0757295e+00 1.9739212e+00 1.5320003e+00 1.1179743e+00 1.3567326e+00 1.6362950e+00 1.1594648e+00 9.9475949e-01 1.1004436e+00 1.0720678e+00 1.4108494e+00 3.2816937e-01 9.8054887e-01 2.9240179e+00 1.9013501e+00 3.0016960e+00 2.4403742e+00 2.7185134e+00 3.7481490e+00 1.2643026e+00 3.3676733e+00 2.7249658e+00 3.2951180e+00 2.1701459e+00 2.2231652e+00 2.5778372e+00 1.8193838e+00 2.0594742e+00 2.3383666e+00 2.4210417e+00 3.9277558e+00 4.0319248e+00 1.8011138e+00 2.8105150e+00 1.7324239e+00 3.8595400e+00 1.8657887e+00 2.7098209e+00 3.1083486e+00 1.7551534e+00 1.8090259e+00 2.5002193e+00 2.9463843e+00 3.2688068e+00 3.8087204e+00 2.5182043e+00 1.9933741e+00 2.3692479e+00 3.4705738e+00 2.5885717e+00 2.3959721e+00 1.7005893e+00 2.5655126e+00 2.6734142e+00 2.4311441e+00 1.9013501e+00 2.9205331e+00 2.7876433e+00 2.3735872e+00 1.9516947e+00 2.2170194e+00 2.3879674e+00 1.9213461e+00 3.0546431e-01 2.0656129e-01 6.0611244e-01 1.2246352e+00 1.4096146e-01 1.9777274e+00 9.7249562e-01 2.0297383e+00 1.4616539e+00 1.7458338e+00 2.7737198e+00 7.5082357e-01 2.3931826e+00 1.7478866e+00 2.3213742e+00 1.2131545e+00 1.2498134e+00 1.6130724e+00 9.3824087e-01 1.2565757e+00 1.4029855e+00 1.4325768e+00 2.9414941e+00 3.0577671e+00 8.7720955e-01 1.8438146e+00 8.6956871e-01 2.8895427e+00 9.1310225e-01 1.7228354e+00 2.1321061e+00 8.0499049e-01 8.3345577e-01 1.5318874e+00 1.9898963e+00 2.3090270e+00 2.8491218e+00 1.5587730e+00 1.0122141e+00 1.4162017e+00 2.5326059e+00 1.6463627e+00 1.4047678e+00 7.3805807e-01 1.6165635e+00 1.7228488e+00 1.5520745e+00 9.7249562e-01 1.9420274e+00 1.8372522e+00 1.4628493e+00 1.0030700e+00 1.2523175e+00 1.4531349e+00 9.5571254e-01 1.2418578e-01 5.0270183e-01 1.2603076e+00 2.1269358e-01 1.9932786e+00 1.0168833e+00 1.9946994e+00 1.4557537e+00 1.7495699e+00 2.7337358e+00 9.0575661e-01 2.3519748e+00 1.7324239e+00 2.2796281e+00 1.1801240e+00 1.2450709e+00 1.5872286e+00 1.0267435e+00 1.3336069e+00 1.4152303e+00 1.4096199e+00 2.8778917e+00 3.0268604e+00 1.0067464e+00 1.8215944e+00 9.3824087e-01 2.8471683e+00 9.0658670e-01 1.6933635e+00 2.0801243e+00 8.0758367e-01 8.3783744e-01 1.5390703e+00 1.9310038e+00 2.2599493e+00 2.7651778e+00 1.5728839e+00 9.7949166e-01 1.4165336e+00 2.4822593e+00 1.6510537e+00 1.3842113e+00 7.5755387e-01 1.5773217e+00 1.7253276e+00 1.5255331e+00 1.0168833e+00 1.9287244e+00 1.8366596e+00 1.4599710e+00 1.0339865e+00 1.2378278e+00 1.4537266e+00 9.7249562e-01 5.0090417e-01 1.2507669e+00 1.2418578e-01 1.9589833e+00 9.7270522e-01 1.9792779e+00 1.4437673e+00 1.7230625e+00 2.7260686e+00 8.6012420e-01 2.3478326e+00 1.7190893e+00 2.2590861e+00 1.1454006e+00 1.2174316e+00 1.5614941e+00 9.5476489e-01 1.2555979e+00 1.3635198e+00 1.3969297e+00 2.8759951e+00 3.0161959e+00 9.4558103e-01 1.7925890e+00 8.6983677e-01 2.8416706e+00 8.6513410e-01 1.6742876e+00 2.0756986e+00 7.5871717e-01 7.9613242e-01 1.5107481e+00 1.9286915e+00 2.2531942e+00 2.7669732e+00 1.5384446e+00 9.7270522e-01 1.4111029e+00 2.4671050e+00 1.6105641e+00 1.3717027e+00 7.0429250e-01 1.5517600e+00 1.6837214e+00 1.4807336e+00 9.7270522e-01 1.9032219e+00 1.7953587e+00 1.4097072e+00 9.7855477e-01 1.2036484e+00 1.4110536e+00 9.4309624e-01 1.5090287e+00 5.0905001e-01 1.8619092e+00 9.1163729e-01 1.7230625e+00 1.3188999e+00 1.5883552e+00 2.4588872e+00 1.3193952e+00 2.0946464e+00 1.5338492e+00 2.0321740e+00 9.5099818e-01 1.0604511e+00 1.3277861e+00 9.3296062e-01 1.2221471e+00 1.2470767e+00 1.2266837e+00 2.6106370e+00 2.7667028e+00 8.7420176e-01 1.5746612e+00 8.9852394e-01 2.5679581e+00 6.9369532e-01 1.4905436e+00 1.8028753e+00 6.2149089e-01 6.9006418e-01 1.3813076e+00 1.6199747e+00 1.9552274e+00 2.4344864e+00 1.4148192e+00 8.0358695e-01 1.3039319e+00 2.1287551e+00 1.5153654e+00 1.2246352e+00 6.2660376e-01 1.2741904e+00 1.5160122e+00 1.2047214e+00 9.1163729e-01 1.7242097e+00 1.6420607e+00 1.2064640e+00 8.3812833e-01 1.0168833e+00 1.3257654e+00 8.6137722e-01 1.1533602e+00 3.1382691e+00 2.1485328e+00 3.1786790e+00 2.6799312e+00 2.9354140e+00 3.9353144e+00 1.5252485e+00 3.5658557e+00 2.9475994e+00 3.4455976e+00 2.3167786e+00 2.4320363e+00 2.7459122e+00 2.0598189e+00 2.2501104e+00 2.5013206e+00 2.6321552e+00 4.0910078e+00 4.2293986e+00 2.0521052e+00 2.9731112e+00 1.9619929e+00 4.0491656e+00 2.0481101e+00 2.8946126e+00 3.2860707e+00 1.9342059e+00 2.0025214e+00 2.7210925e+00 3.1148548e+00 3.4424959e+00 3.9360563e+00 2.7333517e+00 2.2078200e+00 2.6383936e+00 3.6047462e+00 2.7713578e+00 2.6121617e+00 1.8925840e+00 2.7075477e+00 2.8419886e+00 2.5215069e+00 2.1485328e+00 3.1102248e+00 2.9517129e+00 2.5041493e+00 2.1435335e+00 2.3887866e+00 2.5633372e+00 2.1544995e+00 2.0467316e+00 1.0576043e+00 2.0528819e+00 1.5379283e+00 1.8096161e+00 2.8029161e+00 8.6012420e-01 2.4272793e+00 1.8028753e+00 2.3372930e+00 1.2144845e+00 1.2985682e+00 1.6312555e+00 1.0166932e+00 1.3073038e+00 1.4333755e+00 1.4843487e+00 2.9588514e+00 3.0950947e+00 9.7949166e-01 1.8647706e+00 9.3615100e-01 2.9181741e+00 9.3049742e-01 1.7594421e+00 2.1522124e+00 8.2342214e-01 8.7720955e-01 1.5965946e+00 1.9973159e+00 2.3235032e+00 2.8379387e+00 1.6211988e+00 1.0588560e+00 1.5076049e+00 2.5254157e+00 1.6945041e+00 1.4637418e+00 7.8197925e-01 1.6130724e+00 1.7539916e+00 1.5193574e+00 1.0576043e+00 1.9849009e+00 1.8691652e+00 1.4607586e+00 1.0375119e+00 1.2741904e+00 1.4947429e+00 1.0361698e+00 1.0621081e+00 8.3649708e-01 7.6590510e-01 4.0176783e-01 1.3455136e+00 1.8827665e+00 1.1093572e+00 9.5676647e-01 9.0852141e-01 9.4309624e-01 8.9852394e-01 6.8076724e-01 1.2002762e+00 9.7825559e-01 7.0479928e-01 7.8197925e-01 1.4637418e+00 1.5390703e+00 1.4628493e+00 6.2538346e-01 1.2208301e+00 1.4754770e+00 1.2162549e+00 5.2574978e-01 1.0104465e+00 1.2832075e+00 1.1810170e+00 6.1947990e-01 1.1242402e+00 1.1718516e+00 1.6295015e+00 5.8914551e-01 1.2063335e+00 1.1879206e+00 1.4041085e+00 4.0293660e-01 7.7074935e-01 1.2709820e+00 7.7869083e-01 5.0592043e-01 9.7441804e-01 1.0621081e+00 5.0991930e-01 4.4417983e-01 8.3888121e-01 1.1770266e+00 8.6361309e-01 6.0670504e-01 1.0324775e+00 1.3844611e+00 6.2660376e-01 8.8695363e-01 2.0692197e+00 9.7441804e-01 1.6995747e+00 1.0122141e+00 1.6372749e+00 7.6752131e-01 6.0551856e-01 1.0244319e+00 2.1845981e-01 5.0090417e-01 7.2852070e-01 7.4777660e-01 2.2645802e+00 2.3019759e+00 5.7324170e-01 1.1833351e+00 2.5651975e-01 2.1907335e+00 5.0905001e-01 1.0330459e+00 1.5124582e+00 4.4651726e-01 3.8934542e-01 6.9369532e-01 1.4517959e+00 1.7036156e+00 2.3021295e+00 7.0429250e-01 5.6700421e-01 6.3977563e-01 1.9782093e+00 8.7229670e-01 6.8801986e-01 3.8934542e-01 1.1199472e+00 9.9519977e-01 1.1263042e+00 0.0000000e+00 1.1697902e+00 1.0851476e+00 9.2859317e-01 5.0905001e-01 7.1504098e-01 7.7763126e-01 3.0546431e-01 8.2135873e-01 6.0121055e-01 7.6716823e-01 2.3579605e+00 4.5581864e-01 5.8914551e-01 6.5223271e-01 8.9095811e-01 8.2552685e-01 4.4417983e-01 1.5124582e+00 1.3844611e+00 8.1810461e-01 6.6384020e-01 1.0516761e+00 1.0733200e+00 1.3725949e+00 3.0844217e-01 1.6183051e+00 8.9095811e-01 1.1426203e+00 4.5470518e-01 3.2816937e-01 1.2604558e+00 1.2459608e+00 7.1799256e-01 5.0180477e-01 3.6171588e-01 1.0269295e+00 7.1840099e-01 1.0531192e+00 1.1093572e+00 6.1092863e-01 8.4591037e-01 7.4777660e-01 1.3693737e+00 5.0905001e-01 4.8135521e-01 8.0619006e-01 1.3844611e+00 3.4378533e-01 5.3309112e-01 7.3813096e-01 1.0901359e+00 8.1273630e-01 9.6141901e-01 1.2978356e+00 4.2667565e-01 1.4573287e+00 1.5826638e+00 1.0904758e+00 5.0503591e-01 1.1258723e+00 5.4292906e-01 3.2816937e-01 5.3022554e-01 7.7869083e-01 7.5871717e-01 5.5492130e-01 2.1269358e-01 1.6596342e+00 1.6919202e+00 8.3280511e-01 7.0429250e-01 8.7202528e-01 1.5772389e+00 7.0394675e-01 5.2655962e-01 9.2836103e-01 8.0064372e-01 7.0437330e-01 3.0546431e-01 9.0478973e-01 1.1271488e+00 1.7235501e+00 4.0293660e-01 5.2942799e-01 4.5470518e-01 1.4317371e+00 6.8917100e-01 2.1269358e-01 8.1099042e-01 6.2988288e-01 6.5172743e-01 7.6166891e-01 6.2660376e-01 6.5648056e-01 7.6625946e-01 6.1947990e-01 6.4755655e-01 4.2667565e-01 6.2660376e-01 5.6700421e-01 1.2113327e+00 1.8396098e+00 8.7504951e-01 5.7257017e-01 8.3280511e-01 7.0784540e-01 5.5492130e-01 3.7427929e-01 1.0284501e+00 8.7420176e-01 5.0991930e-01 4.4417983e-01 1.4089719e+00 1.4387122e+00 1.1127329e+00 4.1586001e-01 1.1205013e+00 1.3344634e+00 9.3048953e-01 3.2816937e-01 7.4164639e-01 1.0244319e+00 9.3999899e-01 2.5651975e-01 8.1242502e-01 9.1858284e-01 1.4955532e+00 2.5251796e-01 8.7420176e-01 8.5335130e-01 1.2045536e+00 4.3691963e-01 4.4651726e-01 1.0480665e+00 4.9857388e-01 2.8507955e-01 7.3535471e-01 8.8695363e-01 3.2816937e-01 3.8934542e-01 6.0611244e-01 8.6361309e-01 6.0551856e-01 5.2655962e-01 8.3783744e-01 3.0351721e+00 4.2418962e-01 1.0941064e+00 7.5705927e-01 1.6559784e+00 1.5582387e+00 1.2112034e+00 2.1967372e+00 2.0692197e+00 1.5564198e+00 1.3693737e+00 8.0096515e-01 4.5581864e-01 2.0330276e+00 1.0137836e+00 2.3142399e+00 2.1845981e-01 1.9017011e+00 1.1228379e+00 6.6827038e-01 2.0223026e+00 1.9969203e+00 1.3792358e+00 8.7478495e-01 5.2371571e-01 8.1385214e-01 1.3793330e+00 1.7664528e+00 1.6569692e+00 5.0905001e-01 1.4644753e+00 1.4341959e+00 2.1204309e+00 1.2632199e+00 1.1880428e+00 1.5405106e+00 2.0692197e+00 9.4009473e-01 1.1355826e+00 1.4992973e+00 1.8311457e+00 1.5765737e+00 1.6311692e+00 1.9969203e+00 2.6670272e+00 1.9783833e+00 2.5784641e+00 1.6572339e+00 1.5613865e+00 1.9842916e+00 8.6110333e-01 1.0720678e+00 1.6180482e+00 1.7140774e+00 3.2123303e+00 3.2542669e+00 1.1332978e+00 2.1449779e+00 7.5976039e-01 3.1540626e+00 1.4088394e+00 1.9797139e+00 2.4825886e+00 1.3075101e+00 1.2330392e+00 1.6629594e+00 2.4148300e+00 2.6746409e+00 3.2573703e+00 1.6686069e+00 1.4322723e+00 1.4341959e+00 2.9471490e+00 1.6864366e+00 1.6385322e+00 1.1320702e+00 2.0632091e+00 1.9468380e+00 2.0389505e+00 9.7441804e-01 2.1303950e+00 2.0095672e+00 1.8517858e+00 1.4168607e+00 1.6483152e+00 1.5346983e+00 1.0866092e+00 7.2486328e-01 8.7202528e-01 1.2988558e+00 1.1847335e+00 8.6137722e-01 1.8265471e+00 1.7177705e+00 1.2107055e+00 9.9368623e-01 9.5866719e-01 7.3805807e-01 1.6506221e+00 7.3805807e-01 1.9449573e+00 5.0592043e-01 1.5350426e+00 7.8695083e-01 3.7427929e-01 1.6553809e+00 1.6249178e+00 1.0168833e+00 5.0991930e-01 2.1845981e-01 9.7270522e-01 1.0264409e+00 1.3817041e+00 1.2768639e+00 5.7324170e-01 1.1634384e+00 1.0611732e+00 1.7483574e+00 9.3048953e-01 9.0056222e-01 1.2340567e+00 1.6995747e+00 6.8076724e-01 9.1883539e-01 1.1718516e+00 1.4616896e+00 1.2125198e+00 1.2951888e+00 1.6249178e+00 1.2028939e+00 8.7420176e-01 5.3665999e-01 5.5492130e-01 1.1340084e+00 1.0720678e+00 8.3345577e-01 5.3588338e-01 1.5520745e+00 1.3258714e+00 9.5099818e-01 7.7074935e-01 1.2604558e+00 1.1891470e+00 9.2264612e-01 8.1099042e-01 7.7039952e-01 1.0389435e+00 1.0054794e+00 4.3456114e-01 6.2605182e-01 7.2823007e-01 1.5784191e+00 4.8927739e-01 7.5976039e-01 6.5223271e-01 1.0692258e+00 9.8985697e-01 6.3808075e-01 1.1178200e+00 6.6827038e-01 7.4855857e-01 8.6513410e-01 1.0122141e+00 7.6787403e-01 9.3615100e-01 7.5835500e-01 8.2654509e-01 6.9728513e-01 9.9519977e-01 9.7356960e-01 1.1306887e+00 1.2197188e+00 8.0353565e-01 1.7933375e+00 1.5916843e+00 1.0118409e+00 1.0089164e+00 7.0776547e-01 1.1591754e+00 1.8437762e+00 5.3309112e-01 1.8278913e+00 9.6838716e-01 1.4843324e+00 6.3735887e-01 7.3496673e-01 1.5570415e+00 1.5003972e+00 1.0421979e+00 9.7759114e-01 8.9070384e-01 7.8197925e-01 1.0329598e+00 1.4388174e+00 1.5204340e+00 6.9325418e-01 9.4309624e-01 1.0339865e+00 1.6134578e+00 8.0660588e-01 7.0523271e-01 1.0406064e+00 1.6372749e+00 5.1303949e-01 5.8851328e-01 1.0072663e+00 1.4951106e+00 1.0950112e+00 1.0934620e+00 1.5213929e+00 5.0991930e-01 4.5581864e-01 9.3615100e-01 7.6590510e-01 3.2586371e-01 4.2538717e-01 1.7942496e+00 1.9566981e+00 1.0636401e+00 6.6384020e-01 9.2264612e-01 1.7814077e+00 5.2371571e-01 6.0670504e-01 1.0120221e+00 4.8927739e-01 4.3691963e-01 5.6769031e-01 8.9366705e-01 1.1948578e+00 1.6982795e+00 5.7324170e-01 5.7257017e-01 8.3060013e-01 1.3824965e+00 5.7867728e-01 4.1586001e-01 5.4292906e-01 4.4651726e-01 5.7324170e-01 4.4535192e-01 7.6752131e-01 8.2105460e-01 6.9369532e-01 3.4583729e-01 7.0479928e-01 2.0656129e-01 4.3456114e-01 6.1092863e-01 4.6472023e-01 7.1840099e-01 6.9369532e-01 5.6631629e-01 3.2816937e-01 1.8058693e+00 1.8261179e+00 6.3735887e-01 7.0328431e-01 8.2684479e-01 1.6791597e+00 4.0293660e-01 6.6827038e-01 9.7377870e-01 5.0991930e-01 4.8135521e-01 3.2586371e-01 8.7021234e-01 1.1327825e+00 1.7839298e+00 3.7427929e-01 4.1586001e-01 5.5492130e-01 1.3916739e+00 7.7919451e-01 4.1449626e-01 5.8914551e-01 5.7324170e-01 6.0900723e-01 6.2407309e-01 6.0551856e-01 7.5705927e-01 7.8695083e-01 4.8135521e-01 3.2586371e-01 3.0811765e-01 7.3851529e-01 5.3665999e-01 1.1524979e+00 1.0244319e+00 4.3691963e-01 3.7255734e-01 1.4090646e+00 1.5060944e+00 1.0810263e+00 2.8507955e-01 1.2406194e+00 1.3336069e+00 7.1791510e-01 3.2586371e-01 5.9426792e-01 8.2552685e-01 8.2275389e-01 4.1449626e-01 5.8851328e-01 7.5196795e-01 1.3415658e+00 4.1586001e-01 7.2852070e-01 8.9159388e-01 9.7249562e-01 5.8914551e-01 4.4535192e-01 9.4352681e-01 1.4096146e-01 3.0811765e-01 4.1586001e-01 1.0244319e+00 4.2538717e-01 4.5581864e-01 3.2586371e-01 7.0869559e-01 3.7427929e-01 6.5223271e-01 9.2836103e-01 4.4651726e-01 8.8695363e-01 8.9971984e-01 2.4227359e+00 2.4243464e+00 5.5419992e-01 1.3235313e+00 3.0546431e-01 2.3149695e+00 6.1151102e-01 1.2036484e+00 1.6520677e+00 5.4292906e-01 5.7324170e-01 8.2305664e-01 1.5788188e+00 1.8238348e+00 2.4554026e+00 8.2552685e-01 7.0429250e-01 7.7588000e-01 2.0959492e+00 1.0466623e+00 8.6513410e-01 5.4292906e-01 1.2497790e+00 1.1215059e+00 1.2436109e+00 2.1845981e-01 1.3165513e+00 1.2256881e+00 1.0406064e+00 6.0060595e-01 8.5434758e-01 9.6664346e-01 5.1691876e-01 6.5223271e-01 8.4050231e-01 2.2451458e+00 2.2996030e+00 9.7270522e-01 1.1594648e+00 4.2538717e-01 2.1936248e+00 6.9369532e-01 1.0119857e+00 1.5297036e+00 6.6384020e-01 6.2988288e-01 7.0386584e-01 1.5113992e+00 1.7140171e+00 2.2868482e+00 6.9325418e-01 9.4080461e-01 1.0406064e+00 1.9734538e+00 7.5835500e-01 7.8695083e-01 6.2988288e-01 1.1158787e+00 9.4832302e-01 1.1055069e+00 5.0090417e-01 1.1452867e+00 1.0056742e+00 9.0277242e-01 6.3977563e-01 7.3851529e-01 6.6432544e-01 6.0611244e-01 5.1691876e-01 1.6983410e+00 1.8377590e+00 1.1500393e+00 5.6631629e-01 8.6012420e-01 1.6864433e+00 6.6539428e-01 4.5581864e-01 9.7356960e-01 6.6932542e-01 5.9426792e-01 4.5470518e-01 9.7548738e-01 1.1573546e+00 1.6772907e+00 4.4535192e-01 8.2929029e-01 9.8450810e-01 1.3812107e+00 3.2816937e-01 5.0905001e-01 6.6932542e-01 5.0991930e-01 3.7598397e-01 5.0905001e-01 7.2852070e-01 6.4704320e-01 4.5581864e-01 3.2586371e-01 7.4777660e-01 3.2816937e-01 2.5251796e-01 6.3108414e-01 1.5573817e+00 1.6420607e+00 9.0575661e-01 5.7867728e-01 9.7441804e-01 1.4917344e+00 6.2482915e-01 4.0176783e-01 7.7039952e-01 7.1799256e-01 6.4704320e-01 3.2816937e-01 7.1799256e-01 9.7270522e-01 1.5593809e+00 4.1586001e-01 4.6472023e-01 5.6454040e-01 1.2601890e+00 6.5223271e-01 1.2418578e-01 7.6716823e-01 4.4651726e-01 6.0670504e-01 6.1947990e-01 7.4777660e-01 5.9426792e-01 7.2172678e-01 5.3588338e-01 6.2660376e-01 3.2352160e-01 5.8914551e-01 6.4704320e-01 1.2013436e+00 2.3665136e+00 1.1771643e+00 2.4806944e+00 1.0018083e+00 2.1098467e+00 1.2627078e+00 8.8503502e-01 2.2024869e+00 2.1511385e+00 1.6189643e+00 1.1368070e+00 1.0688498e+00 3.4378533e-01 1.6188960e+00 1.9698860e+00 1.9254808e+00 8.8861541e-01 1.5832517e+00 1.5978297e+00 2.2712062e+00 1.4277162e+00 1.3610783e+00 1.6849072e+00 2.2645802e+00 1.1106525e+00 1.2665468e+00 1.6689743e+00 2.0995265e+00 1.7457596e+00 1.7532140e+00 2.1511385e+00 2.2712062e+00 1.3276804e+00 2.5485519e+00 3.4378533e-01 2.1870851e+00 1.4266198e+00 1.0379132e+00 2.3072128e+00 2.2736138e+00 1.6156775e+00 1.2095267e+00 8.3888121e-01 1.2277129e+00 1.6151153e+00 2.0528819e+00 1.8792214e+00 8.2624515e-01 1.7265353e+00 1.7004805e+00 2.3953564e+00 1.5733646e+00 1.4691764e+00 1.8497891e+00 2.3019759e+00 1.2238809e+00 1.4266198e+00 1.7962897e+00 2.1027465e+00 1.8635467e+00 1.9008621e+00 2.2439391e+00 1.3353353e+00 7.2526325e-01 2.1293320e+00 5.5492130e-01 1.2776560e+00 1.5193574e+00 6.2988288e-01 8.1130291e-01 8.6912228e-01 1.3752391e+00 1.6044563e+00 2.3474075e+00 9.1883539e-01 6.2024833e-01 6.4806901e-01 1.9000365e+00 1.3674559e+00 9.6664346e-01 8.1354181e-01 1.1751082e+00 1.2304904e+00 1.2256933e+00 5.7324170e-01 1.3628690e+00 1.4089364e+00 1.0866132e+00 4.8036801e-01 8.9971984e-01 1.3044654e+00 8.1130291e-01 1.3916739e+00 1.1500393e+00 9.6838716e-01 2.5251796e-01 5.5419992e-01 1.0573285e+00 1.0284501e+00 5.7324170e-01 7.1840099e-01 6.6317860e-01 1.1434428e+00 5.6769031e-01 9.7855477e-01 1.1106525e+00 8.2899253e-01 6.0670504e-01 6.2660376e-01 1.1449732e+00 3.2586371e-01 2.1845981e-01 6.0060595e-01 1.1833351e+00 2.0656129e-01 2.5251796e-01 5.1607523e-01 9.6324667e-01 5.9426792e-01 7.1799256e-01 1.0879524e+00 2.4372751e+00 7.0437330e-01 1.2331989e+00 1.7427900e+00 6.0611244e-01 5.1607523e-01 9.3615100e-01 1.6812503e+00 1.9411754e+00 2.5109747e+00 9.3801395e-01 7.7039952e-01 8.6513410e-01 2.2052183e+00 9.6324667e-01 8.9917007e-01 4.2667565e-01 1.3224963e+00 1.1912106e+00 1.3084046e+00 2.5651975e-01 1.3897316e+00 1.2541242e+00 1.1120775e+00 7.1504098e-01 9.1051084e-01 8.1521713e-01 3.6171588e-01 2.0209349e+00 1.2627078e+00 7.9878917e-01 2.1431239e+00 2.1198551e+00 1.5016009e+00 9.6141901e-01 6.2024833e-01 1.0083666e+00 1.5022608e+00 1.8803649e+00 1.7557336e+00 6.2482915e-01 1.6044563e+00 1.5582387e+00 2.2435182e+00 1.3836712e+00 1.3199714e+00 1.6568705e+00 2.1907335e+00 1.0796583e+00 1.2825987e+00 1.6205332e+00 1.9460721e+00 1.6995133e+00 1.7678302e+00 2.1198551e+00 9.1750357e-01 1.2756158e+00 1.4096146e-01 3.2352160e-01 7.1504098e-01 1.1242402e+00 1.4312787e+00 2.0223464e+00 7.3535471e-01 3.2586371e-01 7.3851529e-01 1.6386882e+00 9.4477932e-01 6.4755655e-01 3.7427929e-01 7.3805807e-01 8.6165877e-01 7.2852070e-01 5.0905001e-01 1.0922991e+00 1.0175773e+00 6.0900723e-01 2.1269358e-01 4.0176783e-01 8.2372435e-01 4.5470518e-01 5.5492130e-01 9.8495853e-01 9.0521488e-01 5.2942799e-01 6.3977563e-01 7.9878917e-01 1.2832075e+00 5.3022554e-01 8.3060013e-01 9.4500268e-01 1.0244319e+00 4.4651726e-01 4.0176783e-01 1.0230441e+00 3.4378533e-01 3.2586371e-01 6.1623531e-01 1.0330459e+00 2.5651975e-01 4.0000000e-01 5.3588338e-01 9.5676647e-01 5.3665999e-01 5.3665999e-01 9.0521488e-01 1.3865084e+00 1.3669552e+00 8.6012420e-01 2.8192292e-01 4.1586001e-01 8.4050231e-01 8.7383925e-01 1.1355826e+00 1.1712156e+00 6.2660376e-01 9.8985697e-01 8.5205778e-01 1.4909823e+00 6.3861009e-01 7.2526325e-01 9.4854455e-01 1.5124582e+00 5.6700421e-01 7.7919451e-01 8.9971984e-01 1.2483814e+00 9.4009473e-01 1.0879524e+00 1.4147273e+00 2.1269358e-01 8.1354181e-01 1.2441035e+00 1.5551238e+00 2.1137172e+00 8.2899253e-01 3.7427929e-01 8.2929029e-01 1.7587110e+00 9.6095130e-01 7.1799256e-01 2.4837156e-01 8.3280511e-01 9.3797093e-01 7.9016429e-01 4.4651726e-01 1.1833351e+00 1.0724413e+00 6.6932542e-01 3.2816937e-01 4.6472023e-01 8.0467258e-01 3.8776762e-01 7.3145860e-01 1.2564564e+00 1.5558094e+00 2.0983278e+00 7.5082357e-01 3.6171588e-01 7.6590510e-01 1.7862655e+00 8.4050231e-01 6.2024833e-01 1.2418578e-01 8.6137722e-01 8.9852394e-01 8.5462626e-01 3.8934542e-01 1.1192362e+00 1.0078327e+00 7.0386584e-01 5.0991930e-01 4.5470518e-01 6.6539428e-01 2.4837156e-01 8.5690100e-01 1.0344911e+00 1.6689743e+00 1.0000000e-01 6.8961791e-01 7.1799256e-01 1.3207609e+00 6.2024833e-01 3.7427929e-01 8.3888121e-01 5.3588338e-01 4.2288438e-01 6.4405773e-01 6.9369532e-01 5.3309112e-01 5.8914551e-01 4.6472023e-01 6.2538346e-01 4.1586001e-01 6.1623531e-01 6.4405773e-01 4.0176783e-01 1.0175773e+00 8.9303452e-01 1.0122141e+00 1.1161766e+00 7.7885297e-01 1.0755693e+00 8.1385214e-01 1.3792358e+00 5.8914551e-01 8.5462626e-01 8.7848692e-01 1.4517959e+00 7.3851529e-01 9.4854455e-01 8.6263408e-01 1.0941064e+00 8.3783744e-01 1.1172689e+00 1.3545005e+00 1.0391247e+00 1.0389435e+00 1.3163598e+00 1.3379696e+00 4.5470518e-01 1.1951875e+00 1.0632598e+00 1.6796759e+00 7.8197925e-01 8.3345577e-01 1.0540105e+00 1.7036156e+00 6.9167458e-01 8.8503502e-01 1.0279631e+00 1.3693737e+00 1.1192426e+00 1.3077572e+00 1.6183051e+00 1.6694974e+00 1.9094934e+00 1.9895190e+00 8.2384013e-01 1.6634400e+00 1.6218244e+00 2.2178691e+00 1.3008161e+00 1.3567326e+00 1.4994715e+00 2.3021295e+00 1.1763719e+00 1.3024224e+00 1.5535909e+00 2.0373882e+00 1.6756749e+00 1.7981158e+00 2.1739455e+00 7.6752131e-01 8.1354181e-01 1.3198846e+00 6.0611244e-01 4.4535192e-01 8.5335130e-01 5.3665999e-01 3.8776762e-01 6.3977563e-01 7.0429250e-01 5.2655962e-01 5.5492130e-01 4.5581864e-01 6.3861009e-01 4.2667565e-01 6.1151102e-01 6.6932542e-01 5.1691876e-01 1.5922648e+00 1.0054794e+00 4.8135521e-01 4.3456114e-01 7.6955924e-01 9.6664346e-01 8.9687438e-01 5.6700421e-01 1.0421979e+00 1.1001291e+00 8.2929029e-01 4.4535192e-01 5.1691876e-01 8.9712482e-01 4.5470518e-01 1.6914476e+00 1.1340084e+00 5.8914551e-01 8.5105559e-01 9.7548738e-01 1.0864449e+00 1.1160770e+00 6.3977563e-01 1.0720678e+00 1.2163831e+00 1.0047836e+00 6.9369532e-01 7.2343175e-01 1.0613462e+00 6.2407309e-01 1.4238090e+00 1.3511716e+00 1.9067300e+00 9.3824087e-01 1.0331736e+00 1.1327825e+00 1.9782093e+00 9.0454394e-01 1.0244319e+00 1.1833480e+00 1.5948732e+00 1.3360558e+00 1.5461469e+00 1.8900319e+00 6.2081167e-01 9.1750357e-01 6.4290921e-01 4.4417983e-01 7.0429250e-01 8.7229670e-01 5.3665999e-01 4.0438741e-01 5.6454040e-01 1.0054794e+00 5.7015910e-01 2.1269358e-01 7.5705927e-01 7.3496673e-01 5.2942799e-01 6.2024833e-01 6.6491075e-01 6.8801986e-01 6.1947990e-01 7.2172678e-01 5.5492130e-01 6.9006418e-01 3.2816937e-01 5.3665999e-01 5.6700421e-01 9.7779835e-01 1.0014633e+00 9.4854455e-01 3.8934542e-01 1.2342162e+00 1.1043332e+00 7.9580667e-01 5.3665999e-01 5.7257017e-01 7.2852070e-01 3.0275928e-01 3.4378533e-01 3.2352160e-01 1.1199472e+00 5.0991930e-01 4.6472023e-01 2.8507955e-01 7.7869083e-01 4.1586001e-01 7.1799256e-01 1.0132664e+00 5.0905001e-01 9.9519977e-01 3.0811765e-01 2.1269358e-01 4.0293660e-01 8.3060013e-01 5.0592043e-01 5.3665999e-01 9.3049742e-01 1.1263042e+00 8.0064372e-01 6.1623531e-01 2.1269358e-01 7.7588000e-01 4.4651726e-01 7.2783368e-01 1.0329901e+00 1.1697902e+00 1.0851476e+00 9.2859317e-01 5.0905001e-01 7.1504098e-01 7.7763126e-01 3.0546431e-01 2.5651975e-01 7.0437330e-01 1.0573285e+00 7.3145860e-01 6.9325418e-01 1.0901359e+00 5.3588338e-01 1.0175773e+00 6.4405773e-01 5.3665999e-01 1.0078327e+00 6.2407309e-01 3.2352160e-01 5.7257017e-01 8.5205778e-01 5.1691876e-01 9.4022486e-01 5.6769031e-01 4.8927739e-01 6.0611244e-01 6.0900723e-01 Added: trunk/scipy/cluster/tests/pdist-minkowski-5.8-ml-iris.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-minkowski-5.8-ml-iris.txt 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/pdist-minkowski-5.8-ml-iris.txt 2008-04-18 02:13:12 UTC (rev 4148) @@ -0,0 +1 @@ + 5.0042326e-01 4.1210927e-01 5.2133179e-01 1.1269424e-01 4.2362917e-01 5.0001522e-01 1.2085435e-01 7.4262850e-01 4.0127250e-01 3.0482299e-01 3.0482299e-01 5.0436965e-01 8.0923926e-01 7.1629168e-01 9.1424701e-01 4.1317535e-01 1.0000000e-01 6.0366256e-01 3.0017653e-01 3.3813251e-01 2.2573593e-01 5.2133179e-01 3.4080442e-01 5.0436965e-01 5.0043084e-01 2.2608083e-01 1.1269424e-01 1.1269424e-01 4.1315633e-01 4.1315633e-01 3.0490481e-01 6.0000952e-01 7.0462550e-01 4.0127250e-01 3.0482299e-01 4.0002221e-01 4.0127250e-01 7.1621748e-01 1.1269424e-01 1.2085435e-01 1.2036864e+00 7.0088477e-01 4.0125062e-01 5.0476836e-01 5.0436965e-01 3.0474106e-01 5.0436235e-01 2.2573593e-01 2.0061436e-01 3.3243227e+00 3.1068812e+00 3.5145413e+00 2.6080595e+00 3.2075731e+00 3.1014454e+00 3.3055260e+00 1.9156198e+00 3.2079238e+00 2.5066441e+00 2.1498493e+00 2.8059664e+00 2.6093989e+00 3.3021953e+00 2.2070266e+00 3.0158454e+00 3.1034764e+00 2.7009878e+00 3.1081779e+00 2.5032992e+00 3.4074959e+00 2.6050088e+00 3.5035589e+00 3.3011884e+00 2.9065890e+00 3.0117336e+00 3.4118782e+00 3.6094426e+00 3.1038958e+00 2.1042326e+00 2.4058620e+00 2.3063407e+00 2.5029614e+00 3.7025335e+00 3.1034636e+00 3.1057006e+00 3.3110189e+00 3.0065909e+00 2.7025941e+00 2.6047974e+00 3.0013665e+00 3.2025221e+00 2.6029242e+00 1.9242109e+00 2.8024935e+00 2.8013151e+00 2.8022622e+00 2.9036582e+00 1.6267693e+00 2.7028014e+00 4.6144526e+00 3.7071079e+00 4.5121787e+00 4.2031939e+00 4.4087839e+00 5.2153194e+00 3.1086291e+00 4.9093646e+00 4.4044245e+00 4.7202040e+00 3.7119486e+00 3.9066365e+00 4.1123628e+00 3.6114402e+00 3.7307413e+00 3.9194642e+00 4.1043951e+00 5.3177489e+00 5.5157728e+00 3.6035661e+00 4.3162097e+00 3.5127031e+00 5.3163123e+00 3.5077296e+00 4.3088507e+00 4.6100803e+00 3.4082578e+00 3.5068380e+00 4.2080636e+00 4.4113183e+00 4.7149608e+00 5.0316727e+00 4.2105572e+00 3.7024462e+00 4.2007769e+00 4.7331529e+00 4.2173557e+00 4.1039096e+00 3.4076329e+00 4.0157626e+00 4.2194897e+00 3.7329396e+00 3.7071079e+00 4.5119962e+00 4.3218071e+00 3.8249612e+00 3.6093673e+00 3.8105293e+00 4.0166459e+00 3.7050109e+00 2.2573593e-01 3.0017653e-01 6.0000317e-01 9.0534502e-01 4.1210927e-01 4.0004442e-01 5.0000761e-01 1.2085435e-01 7.1621748e-01 4.0125062e-01 1.1269424e-01 6.0184622e-01 1.0776294e+00 1.4092540e+00 9.0508756e-01 5.0043084e-01 9.0181717e-01 8.0004602e-01 5.2491131e-01 7.0017011e-01 6.1119267e-01 3.6452132e-01 5.2133179e-01 2.0061436e-01 4.0246123e-01 5.0436965e-01 4.1209001e-01 2.4170870e-01 2.0121983e-01 5.2167829e-01 1.1001015e+00 1.2036862e+00 1.2085435e-01 2.2573593e-01 6.3164977e-01 1.2085435e-01 5.0000761e-01 4.0125062e-01 5.0002283e-01 7.0462844e-01 5.0043084e-01 5.2167829e-01 8.0888055e-01 1.1269424e-01 8.0008884e-01 3.0474106e-01 7.0462697e-01 3.0008832e-01 3.3416860e+00 3.1112912e+00 3.5249966e+00 2.6033557e+00 3.2127499e+00 3.1015178e+00 3.3078313e+00 1.9025708e+00 3.2150318e+00 2.5060738e+00 2.1061951e+00 2.8068283e+00 2.6040016e+00 3.3032134e+00 2.2072454e+00 3.0286102e+00 3.1035443e+00 2.7011973e+00 3.1070853e+00 2.5014549e+00 3.4078435e+00 2.6080511e+00 3.5048916e+00 3.3021665e+00 2.9125999e+00 3.0213627e+00 3.4211337e+00 3.6148618e+00 3.1047537e+00 2.1027003e+00 2.4016639e+00 2.3011929e+00 2.5032633e+00 3.7028303e+00 3.1034629e+00 3.1065984e+00 3.3192072e+00 3.0078209e+00 2.7027260e+00 2.6031664e+00 3.0009332e+00 3.2037232e+00 2.6027120e+00 1.9031578e+00 2.8022915e+00 2.8015662e+00 2.8024715e+00 2.9065359e+00 1.6099792e+00 2.7029416e+00 4.6149181e+00 3.7071538e+00 4.5172866e+00 4.2039132e+00 4.4099272e+00 5.2224057e+00 3.1078968e+00 4.9146298e+00 4.4063795e+00 4.7253524e+00 3.7145622e+00 3.9080413e+00 4.1161770e+00 3.6111646e+00 3.7308314e+00 3.9209137e+00 4.1060063e+00 5.3254977e+00 5.5222404e+00 3.6024247e+00 4.3201293e+00 3.5126957e+00 5.3240486e+00 3.5093499e+00 4.3111749e+00 4.6158382e+00 3.4095576e+00 3.5076152e+00 4.2090727e+00 4.4184242e+00 4.7227808e+00 5.0458491e+00 4.2115634e+00 3.7037441e+00 4.2010125e+00 4.7466313e+00 4.2180733e+00 4.1050714e+00 3.4081972e+00 4.0212972e+00 4.2220584e+00 3.7407842e+00 3.7071538e+00 4.5144444e+00 4.3240980e+00 3.8290678e+00 3.6105228e+00 3.8128297e+00 4.0172657e+00 3.7052380e+00 2.0121983e-01 4.1210927e-01 7.9153339e-01 2.0181667e-01 3.0915245e-01 3.3813251e-01 2.2608083e-01 7.1629168e-01 3.0482299e-01 2.0181667e-01 4.0246123e-01 1.1281267e+00 1.2633045e+00 7.8890721e-01 4.1212852e-01 1.0095370e+00 6.0964891e-01 7.0470720e-01 5.2201750e-01 4.1210927e-01 4.5784410e-01 6.0017982e-01 3.4080442e-01 3.4342562e-01 5.0476836e-01 5.0043084e-01 3.0000000e-01 3.0017653e-01 7.0025283e-01 9.0508756e-01 1.0426513e+00 2.2608083e-01 3.0008832e-01 8.0046605e-01 2.2608083e-01 3.0474106e-01 4.0243965e-01 3.3813251e-01 9.0002570e-01 3.0000000e-01 4.3213914e-01 6.8170466e-01 2.0181667e-01 6.1119267e-01 1.1269424e-01 6.3178534e-01 3.0017653e-01 3.4595765e+00 3.2168311e+00 3.6364650e+00 2.7037323e+00 3.3192099e+00 3.2017763e+00 3.4107328e+00 2.0033798e+00 3.3237063e+00 2.6050967e+00 2.2121910e+00 2.9077087e+00 2.7085154e+00 3.4047917e+00 2.3071665e+00 3.1428042e+00 3.2033135e+00 2.8024935e+00 3.2103481e+00 2.6021247e+00 3.5076152e+00 2.7127272e+00 3.6073242e+00 3.4038884e+00 3.0203881e+00 3.1325879e+00 3.5317021e+00 3.7210979e+00 3.2059139e+00 2.2051638e+00 2.5023084e+00 2.4021168e+00 2.6048201e+00 3.8033004e+00 3.2030448e+00 3.2074921e+00 3.4286399e+00 3.1131211e+00 2.8028008e+00 2.7031257e+00 3.1010004e+00 3.3055260e+00 2.7040740e+00 2.0050309e+00 2.9023862e+00 2.9020767e+00 2.9028421e+00 3.0107283e+00 1.7089863e+00 2.8033666e+00 4.7142986e+00 3.8066401e+00 4.6226512e+00 4.3047830e+00 4.5107876e+00 5.3296471e+00 3.2068572e+00 5.0203871e+00 4.5089338e+00 4.8299744e+00 3.8170042e+00 4.0095939e+00 4.2200398e+00 3.7100654e+00 3.8275330e+00 4.0209836e+00 4.2079639e+00 5.4332277e+00 5.6287689e+00 3.7032748e+00 4.4237036e+00 3.6112573e+00 5.4319232e+00 3.6111754e+00 4.4135512e+00 4.7221364e+00 3.5107924e+00 3.6081749e+00 4.3098514e+00 4.5261773e+00 4.8309399e+00 5.1593152e+00 4.3120751e+00 3.8056232e+00 4.3015640e+00 4.8592534e+00 4.3174320e+00 4.2064763e+00 3.5083248e+00 4.1268500e+00 4.3236383e+00 3.8471097e+00 3.8066401e+00 4.6166518e+00 4.4251081e+00 3.9318948e+00 3.7118930e+00 3.9150333e+00 4.1165034e+00 3.8051417e+00 5.2133179e-01 9.0160400e-01 3.0017653e-01 4.1209001e-01 2.2573593e-01 3.0008832e-01 8.2418002e-01 3.0482299e-01 2.0181667e-01 4.1212852e-01 1.2363278e+00 1.3741498e+00 9.0160400e-01 5.2133802e-01 1.1133986e+00 7.1621748e-01 8.0051036e-01 6.3178534e-01 5.6347121e-01 5.0517282e-01 4.1315633e-01 4.0004442e-01 4.1317535e-01 6.0948212e-01 6.0184622e-01 1.2085435e-01 2.0061436e-01 8.0051036e-01 1.0087250e+00 1.1527669e+00 3.0008832e-01 4.1210927e-01 9.0142636e-01 3.0008832e-01 2.2573593e-01 5.0436235e-01 4.5148429e-01 8.0004602e-01 2.2573593e-01 4.8342635e-01 7.2044167e-01 2.0181667e-01 7.1621748e-01 1.1269424e-01 7.4262850e-01 4.0125062e-01 3.2983364e+00 3.0300451e+00 3.4603347e+00 2.5053901e+00 3.1338090e+00 3.0030658e+00 3.2183845e+00 1.8040969e+00 3.1419971e+00 2.4075162e+00 2.0123013e+00 2.7132680e+00 2.5163999e+00 3.2086215e+00 2.1132077e+00 2.9750754e+00 3.0049127e+00 2.6055197e+00 3.0177719e+00 2.4040962e+00 3.3110162e+00 2.5253371e+00 3.4126529e+00 3.2074182e+00 2.8380954e+00 2.9580787e+00 3.3536443e+00 3.5347730e+00 3.0101869e+00 2.0123796e+00 2.3038195e+00 2.2036797e+00 2.4099203e+00 3.6051707e+00 3.0042758e+00 3.0123228e+00 3.2490712e+00 2.9241808e+00 2.6047889e+00 2.5049231e+00 2.9016211e+00 3.1100277e+00 2.5081992e+00 1.8056342e+00 2.7040060e+00 2.7039988e+00 2.7050721e+00 2.8205713e+00 1.5147271e+00 2.6060742e+00 4.5183778e+00 3.6090052e+00 4.4337691e+00 4.1072664e+00 4.3151164e+00 5.1425125e+00 3.0092613e+00 4.8303615e+00 4.3139066e+00 4.6422789e+00 3.6259317e+00 3.8146285e+00 4.0301568e+00 3.5133848e+00 3.6358680e+00 3.8290678e+00 4.0124919e+00 5.2471177e+00 5.4403962e+00 3.5051114e+00 4.2343452e+00 3.4149831e+00 5.2455706e+00 3.4177035e+00 4.2200398e+00 4.5335328e+00 3.3168776e+00 3.4123846e+00 4.1140176e+00 4.3402553e+00 4.6459028e+00 4.9843016e+00 4.1167964e+00 3.6096226e+00 4.1026403e+00 4.6849407e+00 4.1230798e+00 4.0100505e+00 3.3123688e+00 3.9407837e+00 4.1330547e+00 3.6700537e+00 3.6090052e+00 4.4237036e+00 4.2343452e+00 3.7463488e+00 3.5181052e+00 3.7227931e+00 3.9220791e+00 3.6072781e+00 4.2362917e-01 4.0125062e-01 2.0061436e-01 7.4262850e-01 5.0002283e-01 4.0004442e-01 2.4170870e-01 6.0017982e-01 7.4329527e-01 8.0250123e-01 8.5406674e-01 4.1317535e-01 1.2085435e-01 7.0096858e-01 2.0181667e-01 4.1315633e-01 2.0181667e-01 4.5077696e-01 3.6259865e-01 5.0084481e-01 6.0017665e-01 2.4170870e-01 2.0121983e-01 2.2538848e-01 4.1315633e-01 5.0084481e-01 4.0246123e-01 5.0043842e-01 6.3164729e-01 5.0002283e-01 4.0122873e-01 5.0001522e-01 5.0002283e-01 6.7616723e-01 2.0121983e-01 1.2085435e-01 1.3008771e+00 6.0948506e-01 4.0125062e-01 5.0085236e-01 6.0017982e-01 2.2573593e-01 4.5077696e-01 3.0017653e-01 3.0000000e-01 3.3320240e+00 3.1087192e+00 3.5191371e+00 2.6110181e+00 3.2098845e+00 3.1016129e+00 3.3064697e+00 1.9242109e+00 3.2110200e+00 2.5072065e+00 2.1702438e+00 2.8063347e+00 2.6144115e+00 3.3026483e+00 2.2074446e+00 3.0213781e+00 3.1035271e+00 2.7015967e+00 3.1108570e+00 2.5049231e+00 3.4076266e+00 2.6065485e+00 3.5045818e+00 3.3016829e+00 2.9091905e+00 3.0158857e+00 3.4160038e+00 3.6117923e+00 3.1042949e+00 2.1068047e+00 2.4087956e+00 2.3099309e+00 2.5038387e+00 3.7027671e+00 3.1034919e+00 3.1060428e+00 3.3145595e+00 3.0095593e+00 2.7026925e+00 2.6061038e+00 3.0017811e+00 3.2030205e+00 2.6039803e+00 1.9366876e+00 2.8028640e+00 2.8014482e+00 2.8024453e+00 2.9049136e+00 1.6388635e+00 2.7031257e+00 4.6146430e+00 3.7072412e+00 4.5144508e+00 4.2035048e+00 4.4092709e+00 5.2185448e+00 3.1091788e+00 4.9117351e+00 4.4054277e+00 4.7224997e+00 3.7130507e+00 3.9073151e+00 4.1140274e+00 3.6117351e+00 3.7308330e+00 3.9200674e+00 4.1050815e+00 5.3212796e+00 5.5187578e+00 3.6046347e+00 4.3179262e+00 3.5127783e+00 5.3198559e+00 3.5085510e+00 4.3098508e+00 4.6126513e+00 3.4088749e+00 3.5071604e+00 4.2085176e+00 4.4144980e+00 4.7185095e+00 5.0381903e+00 4.2110099e+00 3.7030413e+00 4.2009868e+00 4.7393218e+00 4.2176488e+00 4.1043951e+00 3.4078683e+00 4.0181902e+00 4.2205976e+00 3.7363838e+00 3.7072412e+00 4.5130595e+00 4.3227928e+00 3.8267408e+00 3.6102542e+00 3.8115096e+00 4.0168944e+00 3.7051079e+00 8.0923926e-01 5.2201750e-01 1.1270411e+00 8.0928056e-01 2.4170870e-01 6.3178782e-01 9.1471442e-01 1.1573074e+00 5.2167829e-01 5.0476836e-01 4.0000000e-01 4.2270142e-01 3.0017653e-01 3.0490481e-01 5.0042326e-01 3.0915245e-01 8.5440680e-01 6.0184622e-01 6.3192325e-01 9.0142681e-01 5.2133179e-01 4.0363334e-01 5.0517282e-01 7.8890806e-01 8.2421923e-01 5.0042326e-01 3.1328089e-01 3.4085233e-01 8.0928056e-01 7.2044167e-01 4.5148429e-01 8.0928056e-01 1.0782211e+00 5.0517282e-01 4.8342635e-01 1.6097492e+00 1.0215068e+00 4.5148429e-01 3.0482299e-01 9.1446938e-01 3.0490481e-01 8.5440680e-01 2.4195741e-01 6.1135434e-01 3.0143288e+00 2.8035152e+00 3.2080663e+00 2.3476141e+00 2.9053991e+00 2.8028019e+00 3.0030626e+00 1.7519158e+00 2.9045816e+00 2.2149484e+00 2.0887699e+00 2.5048522e+00 2.3645147e+00 3.0018766e+00 1.9120303e+00 2.7085154e+00 2.8028008e+00 2.4075162e+00 2.8284908e+00 2.2272457e+00 3.1054022e+00 2.3075573e+00 3.2060163e+00 3.0018874e+00 2.6044486e+00 2.7064438e+00 3.1073418e+00 3.3054063e+00 2.8034238e+00 1.8447840e+00 2.1492024e+00 2.0607272e+00 2.2122063e+00 3.4028104e+00 2.8028007e+00 2.8036182e+00 3.0057998e+00 2.7234787e+00 2.4027927e+00 2.3234132e+00 2.7070699e+00 2.9017335e+00 2.3151346e+00 1.8036834e+00 2.5072065e+00 2.5017313e+00 2.5032633e+00 2.6031823e+00 1.5292174e+00 2.4058519e+00 4.3116266e+00 3.4064593e+00 4.2076930e+00 3.9021503e+00 4.1063936e+00 4.9099401e+00 2.8141516e+00 4.6055969e+00 4.1036742e+00 4.4145324e+00 3.4082578e+00 3.6052799e+00 3.8082804e+00 3.3123693e+00 3.4273179e+00 3.6154977e+00 3.8026444e+00 5.0117750e+00 5.2107474e+00 3.3130198e+00 4.0114753e+00 3.2109395e+00 5.0107787e+00 3.2067490e+00 4.0058313e+00 4.3058539e+00 3.1067996e+00 3.2049797e+00 3.9061098e+00 4.1066170e+00 4.4095056e+00 4.7221364e+00 3.9082316e+00 3.4019453e+00 3.9014304e+00 4.4232188e+00 3.9139973e+00 3.8023591e+00 3.1057392e+00 3.7104219e+00 3.9150553e+00 3.4248402e+00 3.4064593e+00 4.2084919e+00 4.0172759e+00 3.5193527e+00 3.3100431e+00 3.5073655e+00 3.7133435e+00 3.4036743e+00 4.0004442e-01 5.0043084e-01 3.4085233e-01 8.0046764e-01 2.2573593e-01 4.0243965e-01 4.2362917e-01 1.2036925e+00 1.1896595e+00 8.0879776e-01 5.0000761e-01 1.1006371e+00 5.2133179e-01 8.0046685e-01 5.0437695e-01 4.0125062e-01 5.0477564e-01 5.0043084e-01 4.5148429e-01 4.0125062e-01 6.0000952e-01 6.0000317e-01 2.2608083e-01 3.0922892e-01 8.0000160e-01 7.4269314e-01 9.6572569e-01 3.4085233e-01 4.0246123e-01 9.0000136e-01 3.4085233e-01 4.0127250e-01 5.0001522e-01 4.0004442e-01 1.1000003e+00 2.2608083e-01 4.1317535e-01 5.7609230e-01 4.0122873e-01 5.2167829e-01 2.0061436e-01 7.0088627e-01 4.0004442e-01 3.3852404e+00 3.1245391e+00 3.5521657e+00 2.6057331e+00 3.2281303e+00 3.1021033e+00 3.3145497e+00 1.9088256e+00 3.2358110e+00 2.5040476e+00 2.1337832e+00 2.8091158e+00 2.6173653e+00 3.3068237e+00 2.2078368e+00 3.0635687e+00 3.1029264e+00 2.7045714e+00 3.1156892e+00 2.5038387e+00 3.4072735e+00 2.6199287e+00 3.5105217e+00 3.3061800e+00 2.9316687e+00 3.0488379e+00 3.4462681e+00 3.6292576e+00 3.1074604e+00 2.1103491e+00 2.4046650e+00 2.3052527e+00 2.5074705e+00 3.7037846e+00 3.1023805e+00 3.1087156e+00 3.3416864e+00 3.0212423e+00 2.7029308e+00 2.6036513e+00 3.0012006e+00 3.2078939e+00 2.6064541e+00 1.9145304e+00 2.8026114e+00 2.8028068e+00 2.8033825e+00 2.9167099e+00 1.6147493e+00 2.7040740e+00 4.6133719e+00 3.7058811e+00 4.5290217e+00 4.2056470e+00 4.4115634e+00 5.2381327e+00 3.1057013e+00 4.9271590e+00 4.4118721e+00 4.7354168e+00 3.7201124e+00 3.9113698e+00 4.1247181e+00 3.6087856e+00 3.7244383e+00 3.9212835e+00 4.1101783e+00 5.3422962e+00 5.5362181e+00 3.6046999e+00 4.3279835e+00 3.5095358e+00 5.3412086e+00 3.5135120e+00 4.3162096e+00 4.6297141e+00 3.4124092e+00 3.5088081e+00 4.2105763e+00 4.4358170e+00 4.7408876e+00 5.0762364e+00 4.2125085e+00 3.7079173e+00 4.2021973e+00 4.7752666e+00 4.2166536e+00 4.1080028e+00 3.4084548e+00 4.0338654e+00 4.2256165e+00 3.7563734e+00 3.7058811e+00 4.5190617e+00 4.3264209e+00 3.8360186e+00 3.6136974e+00 3.8177300e+00 4.0156240e+00 3.7048582e+00 6.3164977e-01 3.0017653e-01 4.1209001e-01 2.0061436e-01 4.0127250e-01 7.0911112e-01 8.2458409e-01 1.0207396e+00 5.2201750e-01 1.2699992e-01 7.0470867e-01 4.0004442e-01 4.0122873e-01 3.0482299e-01 5.2167208e-01 3.0490481e-01 4.0122873e-01 4.0002221e-01 2.0061436e-01 2.0061436e-01 2.0061436e-01 3.0482299e-01 3.0482299e-01 4.0122873e-01 7.0008584e-01 8.0879701e-01 3.0017653e-01 3.0474106e-01 5.0043084e-01 3.0017653e-01 6.0964597e-01 1.0000000e-01 2.0121983e-01 1.1019599e+00 6.0035305e-01 4.0004442e-01 4.5148429e-01 4.0127250e-01 4.0004442e-01 4.0125062e-01 3.3808272e-01 1.1269424e-01 3.2369541e+00 3.0101869e+00 3.4219340e+00 2.5073576e+00 3.1113295e+00 3.0016913e+00 3.2074921e+00 1.8128536e+00 3.1127326e+00 2.4076937e+00 2.0429861e+00 2.7074657e+00 2.5087337e+00 3.2029987e+00 2.1087640e+00 2.9250474e+00 3.0040848e+00 2.6011837e+00 3.0090716e+00 2.4029250e+00 3.3087901e+00 2.5074281e+00 3.4046875e+00 3.2018065e+00 2.8107271e+00 2.9185950e+00 3.3183094e+00 3.5134617e+00 3.0049285e+00 2.0041542e+00 2.3049133e+00 2.2050331e+00 2.4035997e+00 3.6030023e+00 3.0040438e+00 3.0070658e+00 3.2168317e+00 2.9083216e+00 2.6031436e+00 2.5048522e+00 2.9013423e+00 3.1034810e+00 2.5032729e+00 1.8201043e+00 2.7028014e+00 2.7016556e+00 2.7027522e+00 2.8056775e+00 1.5256523e+00 2.6033557e+00 4.5162553e+00 3.6081006e+00 4.4160732e+00 4.1039121e+00 4.3103378e+00 5.1203327e+00 3.0096880e+00 4.8129366e+00 4.3058720e+00 4.6249088e+00 3.6148619e+00 3.8081633e+00 4.0157626e+00 3.5129206e+00 3.6349703e+00 3.8226858e+00 4.0057080e+00 5.2232912e+00 5.4204287e+00 3.5035589e+00 4.2200398e+00 3.4145570e+00 5.2217206e+00 3.4096180e+00 4.2110197e+00 4.5140458e+00 3.3101076e+00 3.4081996e+00 4.1095117e+00 4.3161641e+00 4.6204721e+00 4.9419857e+00 4.1123051e+00 3.6033860e+00 4.1009647e+00 4.6434791e+00 4.1197833e+00 4.0049425e+00 3.3090452e+00 3.9205015e+00 4.1230798e+00 3.6413278e+00 3.6081006e+00 4.4145323e+00 4.2254713e+00 3.7302938e+00 3.5112285e+00 3.7130507e+00 3.9190472e+00 3.6058055e+00 5.0043842e-01 1.0426513e+00 5.2167208e-01 4.0004442e-01 3.0026460e-01 1.4542931e+00 1.5965783e+00 1.1269511e+00 7.4262964e-01 1.3253871e+00 9.3306807e-01 1.0032293e+00 8.5406674e-01 7.0470720e-01 7.0633229e-01 5.7608844e-01 6.0017982e-01 6.3192325e-01 8.2418071e-01 8.0879625e-01 3.4080442e-01 4.0243965e-01 1.0030871e+00 1.2189645e+00 1.3741465e+00 5.0043842e-01 6.0201716e-01 1.1055705e+00 5.0043842e-01 1.1269424e-01 7.1621748e-01 6.7616902e-01 6.0000952e-01 3.0008832e-01 6.8170466e-01 9.3735629e-01 4.0004442e-01 9.3308853e-01 3.0474106e-01 9.6572569e-01 6.0948212e-01 3.4311880e+00 3.1440065e+00 3.5828092e+00 2.6061623e+00 3.2490712e+00 3.1047537e+00 3.3265679e+00 1.9024467e+00 3.2610547e+00 2.5066443e+00 2.1042326e+00 2.8182771e+00 2.6268573e+00 3.3136174e+00 2.2177383e+00 3.1042292e+00 3.1056084e+00 2.7106185e+00 3.1258664e+00 2.5072166e+00 3.4123850e+00 2.6397031e+00 3.5191318e+00 3.3125861e+00 2.9569988e+00 3.0825000e+00 3.4750557e+00 3.6484459e+00 3.1148203e+00 2.1231535e+00 2.4058952e+00 2.3063814e+00 2.5167763e+00 3.7071732e+00 3.1042001e+00 3.1166462e+00 3.3690976e+00 3.0370401e+00 2.7067267e+00 2.6060811e+00 3.0024163e+00 3.2157547e+00 2.6139440e+00 1.9029771e+00 2.8056558e+00 2.8068283e+00 2.8077255e+00 2.9323793e+00 1.6119586e+00 2.7091848e+00 4.6187512e+00 3.7092298e+00 4.5442576e+00 4.2099019e+00 4.4180513e+00 5.2548586e+00 3.1079005e+00 4.9407795e+00 4.4195588e+00 4.7516511e+00 3.7329384e+00 3.9191954e+00 4.1389224e+00 3.6127211e+00 3.7328453e+00 3.9318950e+00 4.1174259e+00 5.3601143e+00 5.5513974e+00 3.6073242e+00 4.3425018e+00 3.5138357e+00 5.3586950e+00 3.5235095e+00 4.3257995e+00 4.6452056e+00 3.4217238e+00 3.5154314e+00 4.2169032e+00 4.4544908e+00 4.7602896e+00 5.1057502e+00 4.2193718e+00 3.7147036e+00 4.2043114e+00 4.8058872e+00 4.2239687e+00 4.1138950e+00 3.4146523e+00 4.0526593e+00 4.2382079e+00 3.7847403e+00 3.7092298e+00 4.5291248e+00 4.3385161e+00 3.8547029e+00 3.6228903e+00 3.8290678e+00 4.0228342e+00 3.7082809e+00 6.3164977e-01 3.0026460e-01 1.2085435e-01 6.0948506e-01 1.0143978e+00 1.3131369e+00 8.0928056e-01 4.0246123e-01 8.5409862e-01 7.0016860e-01 5.0477564e-01 6.0201716e-01 5.6595908e-01 4.0363334e-01 4.1212852e-01 1.2699992e-01 3.3818226e-01 4.1210927e-01 3.3818226e-01 2.0181667e-01 1.2085435e-01 5.0855077e-01 1.0001598e+00 1.1055707e+00 0.0000000e+00 3.0026460e-01 6.0964891e-01 0.0000000e+00 5.0043842e-01 3.0482299e-01 4.0246123e-01 8.0254500e-01 5.0043842e-01 5.2133802e-01 7.0556260e-01 2.0181667e-01 7.0008735e-01 3.0026460e-01 6.0948506e-01 2.0181667e-01 3.2490712e+00 3.0153168e+00 3.4297841e+00 2.5067523e+00 3.1166337e+00 3.0027816e+00 3.2112793e+00 1.8068048e+00 3.1183051e+00 2.4116924e+00 2.0138832e+00 2.7116615e+00 2.5059537e+00 3.2048192e+00 2.1144760e+00 2.9351753e+00 3.0063019e+00 2.6019122e+00 3.0106587e+00 2.4030297e+00 3.3125861e+00 2.5120719e+00 3.4068163e+00 3.2029877e+00 2.8162444e+00 2.9267417e+00 3.3252407e+00 3.5189464e+00 3.0077107e+00 2.0051350e+00 2.3037132e+00 2.2028146e+00 2.4058620e+00 3.6044981e+00 3.0062070e+00 3.0107283e+00 3.2237456e+00 2.9105093e+00 2.6052541e+00 2.5062865e+00 2.9018772e+00 3.1056084e+00 2.5048522e+00 1.8082911e+00 2.7043948e+00 2.7029415e+00 2.7046027e+00 2.8091099e+00 1.5248852e+00 2.6055127e+00 4.5209020e+00 3.6112573e+00 4.4212031e+00 4.1056541e+00 4.3138986e+00 5.1255338e+00 3.0133997e+00 4.8167235e+00 4.3081273e+00 4.6319211e+00 3.6205854e+00 3.8114965e+00 4.0212972e+00 3.5173798e+00 3.6449970e+00 3.8299342e+00 4.0081754e+00 5.2290121e+00 5.4254411e+00 3.5039202e+00 4.2264145e+00 3.4198378e+00 5.2270034e+00 3.4138008e+00 4.2149806e+00 4.5183778e+00 3.3145502e+00 3.4118179e+00 4.1129687e+00 4.3210760e+00 4.6261633e+00 4.9512603e+00 4.1165035e+00 3.6051692e+00 4.1014742e+00 4.6540056e+00 4.1257291e+00 4.0071257e+00 3.3129914e+00 3.9274863e+00 4.1301604e+00 3.6542046e+00 3.6112573e+00 4.4192311e+00 4.2328883e+00 3.7399948e+00 3.5155767e+00 3.7180846e+00 3.9250546e+00 3.6083191e+00 6.0184622e-01 7.4263078e-01 1.1138955e+00 4.2268438e-01 7.0096708e-01 2.4170870e-01 3.0490481e-01 3.0490481e-01 3.0017653e-01 3.0474106e-01 3.0474106e-01 8.0879701e-01 4.2362917e-01 6.1119267e-01 7.0462697e-01 4.1317535e-01 2.2538848e-01 3.0482299e-01 7.1621748e-01 6.7616723e-01 3.0474106e-01 4.0125062e-01 5.0001522e-01 6.3164977e-01 5.2491131e-01 2.2573593e-01 6.3164977e-01 1.0207396e+00 3.3808272e-01 4.0246123e-01 1.4180463e+00 1.0030868e+00 4.5148429e-01 4.1317535e-01 7.4263078e-01 3.0017653e-01 8.0879701e-01 1.0000000e-01 4.5078948e-01 3.2116783e+00 3.0049285e+00 3.4072983e+00 2.5182898e+00 3.1051604e+00 3.0020136e+00 3.2049016e+00 1.8469618e+00 3.1036832e+00 2.4099081e+00 2.1180493e+00 2.7068820e+00 2.5224740e+00 3.2021231e+00 2.1097449e+00 2.9077617e+00 3.0041462e+00 2.6022422e+00 3.0134290e+00 2.4087504e+00 3.3085101e+00 2.5050799e+00 3.4038679e+00 3.2010814e+00 2.8036959e+00 2.9060895e+00 3.3058271e+00 3.5063866e+00 3.0043212e+00 2.0122773e+00 2.3159426e+00 2.2186306e+00 2.4051454e+00 3.6029749e+00 3.0041461e+00 3.0062373e+00 3.2059465e+00 2.9096170e+00 2.6032656e+00 2.5097004e+00 2.9028411e+00 3.1023606e+00 2.5057847e+00 1.8685354e+00 2.7039990e+00 2.7016498e+00 2.7029428e+00 2.8028074e+00 1.5747520e+00 2.6039937e+00 4.5157550e+00 3.6083209e+00 4.4088451e+00 4.1031691e+00 4.3089952e+00 5.1095334e+00 3.0117336e+00 4.8052574e+00 4.3035619e+00 4.6175091e+00 3.6116958e+00 3.8067089e+00 4.0107159e+00 3.5138361e+00 3.6350483e+00 3.8210210e+00 4.0037985e+00 5.2113565e+00 5.4105254e+00 3.5063553e+00 4.2147222e+00 3.4147657e+00 5.2097995e+00 3.4081036e+00 4.2080425e+00 4.5057296e+00 3.3089414e+00 3.4074852e+00 4.1084282e+00 4.3058539e+00 4.6088153e+00 4.9193995e+00 4.1112251e+00 3.6020843e+00 4.1009356e+00 4.6223848e+00 4.1190046e+00 4.0036188e+00 3.3085886e+00 3.9129256e+00 4.1197933e+00 3.6305006e+00 3.6083209e+00 4.4113183e+00 4.2225427e+00 3.7249938e+00 3.5105217e+00 3.7103007e+00 3.9184088e+00 3.6056580e+00 4.0125062e-01 5.7609230e-01 1.0095367e+00 1.0776296e+00 6.3322667e-01 3.0490481e-01 9.0140221e-01 4.1212852e-01 6.0000317e-01 3.4085233e-01 6.0035305e-01 3.3818226e-01 3.0000000e-01 4.0122873e-01 2.2538848e-01 4.0004442e-01 4.0122873e-01 2.0061436e-01 3.0000000e-01 6.0017982e-01 7.0462844e-01 8.5406616e-01 3.0026460e-01 4.0243965e-01 7.0088477e-01 3.0026460e-01 4.5783248e-01 3.0008832e-01 3.0490481e-01 1.1002025e+00 4.1315633e-01 4.0125062e-01 4.2362917e-01 4.0125062e-01 4.1209001e-01 2.4170870e-01 5.0436965e-01 2.2573593e-01 3.1712557e+00 2.9203034e+00 3.3425817e+00 2.4092081e+00 3.0228582e+00 2.9024211e+00 3.1131137e+00 1.7168003e+00 3.0276611e+00 2.3094323e+00 1.9540727e+00 2.6109956e+00 2.4153242e+00 3.1056218e+00 2.0123796e+00 2.8520945e+00 2.9050328e+00 2.5029614e+00 2.9148948e+00 2.3042831e+00 3.2109395e+00 2.4161682e+00 3.3086859e+00 3.1042389e+00 2.7244207e+00 2.8394157e+00 3.2369857e+00 3.4247142e+00 2.9077271e+00 1.9085444e+00 2.2064916e+00 2.1068047e+00 2.3066817e+00 3.5042241e+00 2.9048033e+00 2.9102290e+00 3.1338090e+00 2.8169587e+00 2.5042601e+00 2.4061715e+00 2.8017212e+00 3.0065627e+00 2.4058322e+00 1.7261843e+00 2.6037439e+00 2.6027120e+00 2.6040234e+00 2.7127458e+00 1.4350761e+00 2.5049231e+00 4.4189015e+00 3.5095669e+00 4.3257995e+00 4.0057109e+00 4.2135057e+00 5.0324952e+00 2.9113810e+00 4.7221382e+00 4.2099962e+00 4.5353918e+00 3.5215862e+00 3.7118930e+00 3.9240025e+00 3.4150232e+00 3.5401623e+00 3.7282910e+00 3.9092259e+00 5.1365012e+00 5.3314853e+00 3.4049933e+00 4.1286955e+00 3.3168890e+00 5.1347989e+00 3.3143385e+00 4.1161770e+00 4.4243750e+00 3.2143454e+00 3.3110189e+00 4.0125032e+00 4.2289520e+00 4.5343227e+00 4.8661173e+00 4.0156353e+00 3.5063553e+00 4.0017163e+00 4.5675364e+00 4.0235140e+00 3.9076272e+00 3.2116700e+00 3.8321139e+00 4.0301570e+00 3.5598557e+00 3.5095669e+00 4.3201293e+00 4.1322798e+00 3.6413292e+00 3.4157005e+00 3.6188994e+00 3.8226858e+00 3.5071409e+00 5.0436235e-01 1.1269511e+00 1.4180734e+00 9.1446938e-01 5.0476836e-01 9.6593231e-01 8.0051115e-01 6.1119558e-01 7.0176271e-01 6.0964891e-01 4.3213914e-01 5.2133179e-01 2.2573593e-01 4.1420960e-01 5.2133802e-01 4.5078948e-01 2.2608083e-01 2.0121983e-01 6.1119558e-01 1.1005364e+00 1.2089192e+00 1.2085435e-01 2.4195741e-01 7.1621884e-01 1.2085435e-01 4.0004442e-01 4.1212852e-01 5.0085236e-01 7.0096858e-01 4.0127250e-01 5.6394820e-01 8.0967961e-01 2.0000000e-01 8.0051115e-01 2.2573593e-01 7.1621884e-01 3.0482299e-01 3.3545239e+00 3.1166331e+00 3.5333785e+00 2.6054739e+00 3.2183845e+00 3.1025789e+00 3.3116521e+00 1.9046783e+00 3.2211369e+00 2.5096353e+00 2.1074907e+00 2.8107054e+00 2.6064541e+00 3.3051050e+00 2.2121875e+00 3.0393610e+00 3.1054994e+00 2.7022579e+00 3.1107490e+00 2.5027328e+00 3.4112739e+00 2.6129479e+00 3.5073688e+00 3.3035252e+00 2.9185900e+00 3.0300451e+00 3.4286400e+00 3.6205854e+00 3.1074470e+00 2.1053074e+00 2.4030297e+00 2.3022754e+00 2.5057763e+00 3.7043108e+00 3.1053329e+00 3.1100313e+00 3.3265652e+00 3.0118276e+00 2.7046025e+00 2.6052853e+00 3.0016501e+00 3.2059133e+00 2.6047974e+00 1.9052628e+00 2.8038694e+00 2.8028007e+00 2.8041967e+00 2.9102290e+00 1.6179159e+00 2.7049931e+00 4.6192199e+00 3.7100254e+00 4.5225779e+00 4.2056438e+00 4.4133506e+00 5.2278849e+00 3.1114444e+00 4.9186970e+00 4.4088300e+00 4.7323336e+00 3.7201124e+00 3.9113387e+00 4.1217116e+00 3.6152935e+00 3.7397620e+00 3.9276515e+00 4.1085246e+00 5.3314853e+00 5.5274937e+00 3.6037456e+00 4.3264210e+00 3.5173586e+00 5.3296471e+00 3.5134601e+00 4.3151165e+00 4.6204664e+00 3.4137985e+00 3.5110031e+00 4.2123903e+00 4.4237218e+00 4.7288133e+00 5.0555470e+00 4.2155430e+00 3.7056457e+00 4.2016096e+00 4.7574592e+00 4.2235569e+00 4.1072664e+00 3.4118179e+00 4.0283196e+00 4.2288238e+00 3.7532858e+00 3.7100254e+00 4.5190617e+00 4.3311362e+00 3.8383398e+00 3.6148683e+00 3.8177286e+00 4.0227665e+00 3.7075359e+00 1.5237054e+00 1.5778323e+00 1.1528553e+00 8.0928056e-01 1.4109657e+00 9.0296858e-01 1.1060939e+00 8.5617086e-01 6.0184934e-01 8.2671175e-01 8.1112984e-01 7.1621748e-01 7.2113820e-01 9.0642722e-01 9.0166476e-01 5.2167829e-01 5.6347978e-01 1.1011719e+00 1.1531951e+00 1.3523685e+00 6.0948506e-01 7.0008735e-01 1.2012929e+00 6.0948506e-01 2.0121983e-01 8.0488008e-01 7.1636719e-01 7.0025283e-01 2.2608083e-01 7.4418186e-01 9.6702272e-01 5.0476836e-01 9.0657583e-01 3.4085233e-01 1.0214933e+00 7.0176271e-01 3.7102713e+00 3.4382051e+00 3.8712380e+00 2.9060895e+00 3.5425492e+00 3.4047913e+00 3.6240078e+00 2.2025238e+00 3.5521653e+00 2.8062729e+00 2.4042873e+00 3.1166330e+00 2.9229849e+00 3.6127194e+00 2.5155829e+00 3.3866455e+00 3.4056098e+00 3.0096888e+00 3.4232171e+00 2.8068501e+00 3.7118528e+00 2.9335034e+00 3.8176417e+00 3.6116893e+00 3.2480452e+00 3.3690976e+00 3.7643838e+00 3.9429243e+00 3.4137984e+00 2.4191998e+00 2.7057317e+00 2.6060678e+00 2.8148779e+00 4.0071259e+00 3.4042418e+00 3.4154455e+00 3.6592943e+00 3.3320889e+00 3.0065584e+00 2.9059779e+00 3.3025806e+00 3.5145393e+00 2.9126049e+00 2.2031052e+00 3.1056091e+00 3.1065947e+00 3.1074470e+00 3.2280982e+00 1.9100994e+00 3.0087060e+00 4.9179684e+00 4.0090033e+00 4.8406432e+00 4.5097222e+00 4.7173415e+00 5.5505575e+00 3.4073974e+00 5.2376127e+00 4.7184838e+00 5.0477042e+00 4.0301568e+00 4.2181242e+00 4.4357103e+00 3.9120615e+00 4.0296437e+00 4.2295175e+00 4.4165186e+00 5.6553854e+00 5.8478137e+00 3.9072483e+00 4.6391758e+00 3.8129545e+00 5.6540008e+00 3.8217034e+00 4.6242406e+00 4.9412981e+00 3.7201124e+00 3.8146271e+00 4.5162248e+00 4.7490801e+00 5.0547228e+00 5.3951639e+00 4.5184830e+00 4.0138270e+00 4.5043856e+00 5.0949990e+00 4.5225786e+00 4.4133506e+00 3.7138970e+00 4.3475342e+00 4.5353918e+00 4.0747727e+00 4.0090033e+00 4.8274110e+00 4.6357670e+00 4.1493188e+00 3.9212879e+00 4.1268500e+00 4.3214438e+00 4.0081754e+00 4.1317535e-01 4.0127250e-01 7.1629303e-01 5.0043842e-01 7.0096858e-01 6.3912709e-01 7.0184453e-01 1.2003596e+00 7.9871893e-01 1.0286506e+00 1.0433442e+00 8.2635069e-01 6.3309012e-01 6.7626502e-01 1.1286016e+00 1.0782105e+00 6.1135434e-01 6.0184934e-01 3.0915245e-01 1.0143978e+00 9.0155393e-01 5.0436965e-01 1.0143978e+00 1.4324323e+00 7.4329414e-01 8.0879776e-01 1.7570482e+00 1.4092511e+00 8.1343016e-01 7.8895472e-01 1.1269511e+00 7.0470720e-01 1.2189701e+00 5.0855077e-01 8.5406616e-01 3.5025396e+00 3.3027388e+00 3.7022129e+00 2.8281704e+00 3.4036672e+00 3.3025779e+00 3.5030234e+00 2.1725076e+00 3.4018155e+00 2.7109019e+00 2.4518621e+00 3.0049127e+00 2.8364042e+00 3.5019450e+00 2.4088882e+00 3.2025657e+00 3.3031143e+00 2.9050277e+00 3.3192099e+00 2.7159616e+00 3.6057054e+00 2.8056568e+00 3.7048624e+00 3.5016345e+00 3.1026586e+00 3.2026875e+00 3.6024856e+00 3.8034160e+00 3.3035252e+00 2.3226028e+00 2.6270968e+00 2.5319718e+00 2.7081195e+00 3.9029099e+00 3.3031170e+00 3.3039553e+00 3.5023855e+00 3.2150432e+00 2.9028412e+00 2.8148779e+00 3.2051933e+00 3.4018781e+00 2.8098127e+00 2.1974660e+00 3.0055598e+00 3.0017653e+00 3.0030650e+00 3.1026235e+00 1.9002712e+00 2.9047832e+00 4.8115512e+00 3.9065683e+00 4.7047990e+00 4.4023911e+00 4.6064349e+00 5.4038141e+00 3.3119500e+00 5.1019028e+00 4.6029848e+00 4.9110422e+00 3.9076509e+00 4.1051819e+00 4.3067850e+00 3.8114951e+00 3.9246405e+00 4.1145310e+00 4.3025710e+00 5.5046681e+00 5.7049556e+00 3.8098343e+00 4.5095384e+00 3.7106240e+00 5.5035834e+00 3.7063915e+00 4.5052925e+00 4.8020893e+00 3.6066590e+00 3.7052383e+00 4.4062090e+00 4.6017113e+00 4.9033376e+00 5.2065497e+00 4.4082090e+00 3.9018737e+00 4.4013937e+00 4.9097097e+00 4.4135256e+00 4.3024877e+00 3.6059708e+00 4.2076410e+00 4.4136664e+00 3.9189006e+00 3.9065683e+00 4.7076752e+00 4.5157700e+00 4.0166034e+00 3.8091065e+00 4.0069397e+00 4.2129114e+00 3.9040721e+00 5.0476836e-01 9.1422402e-01 6.0017982e-01 6.7616723e-01 1.0001903e+00 7.4262850e-01 1.1298636e+00 1.1055799e+00 1.0782211e+00 1.4043036e+00 1.0207260e+00 9.0508712e-01 1.0030871e+00 1.2632996e+00 1.3253497e+00 1.0001598e+00 5.0855077e-01 2.4195741e-01 1.3131369e+00 1.2089895e+00 9.0007572e-01 1.3131369e+00 1.5263518e+00 1.0087393e+00 9.3308891e-01 2.1138769e+00 1.4140515e+00 9.3308891e-01 6.8160885e-01 1.4180436e+00 6.7626681e-01 1.3018145e+00 7.0470720e-01 1.1133986e+00 3.2054626e+00 3.0041787e+00 3.4044439e+00 2.6382589e+00 3.1129223e+00 3.0138245e+00 3.2030205e+00 2.1566438e+00 3.1086927e+00 2.4554557e+00 2.5269479e+00 2.7127202e+00 2.6737930e+00 3.2074207e+00 2.1510232e+00 2.9068053e+00 3.0077106e+00 2.6369414e+00 3.0816280e+00 2.4971338e+00 3.3055260e+00 2.5325155e+00 3.4206210e+00 3.2100081e+00 2.8135926e+00 2.9088609e+00 3.3100014e+00 3.5053029e+00 3.0107283e+00 2.1554609e+00 2.4508792e+00 2.3794578e+00 2.4537333e+00 3.6090037e+00 3.0077114e+00 3.0034200e+00 3.2047284e+00 2.9729700e+00 2.6131590e+00 2.5821442e+00 2.9309340e+00 3.1060464e+00 2.5610212e+00 2.2285414e+00 2.7317035e+00 2.7106184e+00 2.7159615e+00 2.8134622e+00 1.9767345e+00 2.6270952e+00 4.5095106e+00 3.6117736e+00 4.4050179e+00 4.1034650e+00 4.3058769e+00 5.1048430e+00 3.0395885e+00 4.8030341e+00 4.3077256e+00 4.6095748e+00 3.6067573e+00 3.8091370e+00 4.0067454e+00 3.5235094e+00 3.6257071e+00 3.8125141e+00 4.0031827e+00 5.2054101e+00 5.4066794e+00 3.5404367e+00 4.2082468e+00 3.4146523e+00 5.2054259e+00 3.4138230e+00 4.2042865e+00 4.5025743e+00 3.3123786e+00 3.4067938e+00 4.1072911e+00 4.3032007e+00 4.6053784e+00 4.9093646e+00 4.1089590e+00 3.6062594e+00 4.1061436e+00 4.6117560e+00 4.1111295e+00 4.0026055e+00 3.3078313e+00 3.9072844e+00 4.1120111e+00 3.6177796e+00 3.6117736e+00 4.4064445e+00 4.2133758e+00 3.7157992e+00 3.5215805e+00 3.7072609e+00 3.9105673e+00 3.6051689e+00 4.1212852e-01 4.1212852e-01 3.0490481e-01 5.2167208e-01 3.0915245e-01 8.0097499e-01 6.1119558e-01 6.9518117e-01 9.0168933e-01 5.2491131e-01 4.0363334e-01 5.0085236e-01 7.8940551e-01 8.2462252e-01 5.0042326e-01 3.1328089e-01 3.0490481e-01 8.0928056e-01 7.0470867e-01 4.0125062e-01 8.0928056e-01 1.0776294e+00 5.0517282e-01 4.5078948e-01 1.6096629e+00 1.0207396e+00 4.5847767e-01 6.0184622e-01 9.1422402e-01 3.4085233e-01 8.5406674e-01 2.4195741e-01 6.0964891e-01 3.4079041e+00 3.2018548e+00 3.6045966e+00 2.7227151e+00 3.3029106e+00 3.2014779e+00 3.4016816e+00 2.0608234e+00 3.3024690e+00 2.6067721e+00 2.3393392e+00 2.9023862e+00 2.7310942e+00 3.4010299e+00 2.3048574e+00 3.1044057e+00 3.2014774e+00 2.8036023e+00 3.2152055e+00 2.6124447e+00 3.5030234e+00 2.7035171e+00 3.6034258e+00 3.4010358e+00 3.0022434e+00 3.1033306e+00 3.5041120e+00 3.7031277e+00 3.2018065e+00 2.2177966e+00 2.5220687e+00 2.4265152e+00 2.6055197e+00 3.8016494e+00 3.2014773e+00 3.2019092e+00 3.4031881e+00 3.1122360e+00 2.8013347e+00 2.7110046e+00 3.1036553e+00 3.3009330e+00 2.7070770e+00 2.0855888e+00 2.9035486e+00 2.9008500e+00 2.9016034e+00 3.0016038e+00 1.7857124e+00 2.8028019e+00 4.7076061e+00 3.8037955e+00 4.6049801e+00 4.3013465e+00 4.5040960e+00 5.3068325e+00 3.2075036e+00 5.0037550e+00 4.5023523e+00 4.8096009e+00 3.8048551e+00 4.0031892e+00 4.2051335e+00 3.7071735e+00 3.8161632e+00 4.0093901e+00 4.2016368e+00 5.4081547e+00 5.6075434e+00 3.7075525e+00 4.4072835e+00 3.6062405e+00 5.4074634e+00 3.6038441e+00 4.4036959e+00 4.7038247e+00 3.5038075e+00 3.6028345e+00 4.3038299e+00 4.5042394e+00 4.8062731e+00 5.1150203e+00 4.3051629e+00 3.8011413e+00 4.3008955e+00 4.8153681e+00 4.3087925e+00 4.2014602e+00 3.5032125e+00 4.1063865e+00 4.3094598e+00 3.8146853e+00 3.8037955e+00 4.6054982e+00 4.4109814e+00 3.9115832e+00 3.7058197e+00 3.9043917e+00 4.1081838e+00 3.8021570e+00 6.0365948e-01 3.0008832e-01 3.3818226e-01 2.0121983e-01 5.2133802e-01 3.0915245e-01 5.0437695e-01 5.0043842e-01 2.0181667e-01 1.2085435e-01 1.2085435e-01 4.1317535e-01 4.1317535e-01 3.0026460e-01 6.0018299e-01 7.0462697e-01 4.0246123e-01 3.0490481e-01 4.0004442e-01 4.0246123e-01 7.1621884e-01 1.2085435e-01 1.1269424e-01 1.2036863e+00 7.0088627e-01 3.0482299e-01 5.0436965e-01 5.0436235e-01 3.0482299e-01 5.0436965e-01 2.2608083e-01 2.0121983e-01 3.3237063e+00 3.1056091e+00 3.5138377e+00 2.6067805e+00 3.2064817e+00 3.1008890e+00 3.3041599e+00 1.9144935e+00 3.2074507e+00 2.5042498e+00 2.1492024e+00 2.8038903e+00 2.6091437e+00 3.3015588e+00 2.2041706e+00 3.0148613e+00 3.1021975e+00 2.7007716e+00 3.1069083e+00 2.5027328e+00 3.4052051e+00 2.6037226e+00 3.5028446e+00 3.3009330e+00 2.9058292e+00 3.0107430e+00 3.4113341e+00 3.6081814e+00 3.1026177e+00 2.1035154e+00 2.4051766e+00 2.3058791e+00 2.5019964e+00 3.7017412e+00 3.1021847e+00 3.1038570e+00 3.3100818e+00 3.0059450e+00 2.7015162e+00 2.6035107e+00 3.0009631e+00 3.2017847e+00 2.6021247e+00 1.9231085e+00 2.8015882e+00 2.8007533e+00 2.8013565e+00 2.9028946e+00 1.6222582e+00 2.7017239e+00 4.6112605e+00 3.7050457e+00 4.5107898e+00 4.2023583e+00 4.4067851e+00 5.2146266e+00 3.1060428e+00 4.9089682e+00 4.4037570e+00 4.7173415e+00 3.7092301e+00 3.9050336e+00 4.1101936e+00 3.6083379e+00 3.7235997e+00 3.9149881e+00 4.1034584e+00 5.3169366e+00 5.5149065e+00 3.6029421e+00 4.3133953e+00 3.5091580e+00 5.3158283e+00 3.5057369e+00 4.3071174e+00 4.6095441e+00 3.4059695e+00 3.5048429e+00 4.2061215e+00 4.4109767e+00 4.7143113e+00 5.0310424e+00 4.2080636e+00 3.7018984e+00 4.2005765e+00 4.7313463e+00 4.2134002e+00 4.1029723e+00 3.4053426e+00 4.0133308e+00 4.2155438e+00 3.7272780e+00 3.7050457e+00 4.5097224e+00 4.3174320e+00 3.8199266e+00 3.6070223e+00 3.8081328e+00 4.0126677e+00 3.7034791e+00 6.0017665e-01 4.1210927e-01 6.0018299e-01 1.1133986e+00 6.3178534e-01 9.0142681e-01 8.5403486e-01 7.0462844e-01 5.0477564e-01 5.2491734e-01 1.0087252e+00 9.3306807e-01 4.1317535e-01 5.0517282e-01 4.1317535e-01 8.5409862e-01 7.5503094e-01 4.1317535e-01 8.5409862e-01 1.3133231e+00 6.0964891e-01 7.0548138e-01 1.5640758e+00 1.3027556e+00 7.0176271e-01 6.0017982e-01 9.6591433e-01 6.0000635e-01 1.1056693e+00 4.0127250e-01 7.1700909e-01 3.0056049e+00 2.8037508e+00 3.2038047e+00 2.3350905e+00 2.9043042e+00 2.8024566e+00 3.0040963e+00 1.7133143e+00 2.9021652e+00 2.2134864e+00 2.0299551e+00 2.5066443e+00 2.3464211e+00 3.0020171e+00 1.9120296e+00 2.7041827e+00 2.8038683e+00 2.4047867e+00 2.8219468e+00 2.2186306e+00 3.1079220e+00 2.3063026e+00 3.2048524e+00 3.0013665e+00 2.6029242e+00 2.7037323e+00 3.1033714e+00 3.3046348e+00 2.8041978e+00 1.8296471e+00 2.1344310e+00 2.0421601e+00 2.2088481e+00 3.4030563e+00 2.8038694e+00 2.8056176e+00 3.0035303e+00 2.7166861e+00 2.4032760e+00 2.3173405e+00 2.7049931e+00 2.9020943e+00 2.3107074e+00 1.7540491e+00 2.5057744e+00 2.5017294e+00 2.5032614e+00 2.6027348e+00 1.4738792e+00 2.4051328e+00 4.3150879e+00 3.4081972e+00 4.2065765e+00 3.9027794e+00 4.1082339e+00 4.9060122e+00 2.8144592e+00 4.6029848e+00 4.1031680e+00 4.4149701e+00 3.4105998e+00 3.6062867e+00 3.8091132e+00 3.3145497e+00 3.4354252e+00 3.6203140e+00 3.8031346e+00 5.0073650e+00 5.2071845e+00 3.3100796e+00 4.0129286e+00 3.2145637e+00 5.0059527e+00 3.2079238e+00 4.0069158e+00 4.3033003e+00 3.1086424e+00 3.2069551e+00 3.9078313e+00 4.1030253e+00 4.4053246e+00 4.7120702e+00 3.9105941e+00 3.4019027e+00 3.9011588e+00 4.4155733e+00 3.9183552e+00 3.8030509e+00 3.1080886e+00 3.7106642e+00 3.9186175e+00 3.4279064e+00 3.4081972e+00 4.2100505e+00 4.0214626e+00 3.5236480e+00 3.3110446e+00 3.5093262e+00 3.7177968e+00 3.4052047e+00 4.1317535e-01 1.1269424e-01 5.6371422e-01 5.0084481e-01 4.5784410e-01 8.0000239e-01 4.0006662e-01 3.0017653e-01 4.0006662e-01 6.0948800e-01 7.0088627e-01 4.1210927e-01 3.0482299e-01 4.5080200e-01 7.0016860e-01 6.0184934e-01 4.1317535e-01 7.0016860e-01 8.5406674e-01 4.0002221e-01 3.0482299e-01 1.5012719e+00 7.4269314e-01 3.3818226e-01 4.0002221e-01 8.0046685e-01 1.1269424e-01 6.3165225e-01 2.0121983e-01 5.0002283e-01 3.2274206e+00 3.0066036e+00 3.4159337e+00 2.5238518e+00 3.1081931e+00 3.0018108e+00 3.2048307e+00 1.8672243e+00 3.1090333e+00 2.4088880e+00 2.1557835e+00 2.7050009e+00 2.5327574e+00 3.2021240e+00 2.1075767e+00 2.9175658e+00 3.0027966e+00 2.6034860e+00 3.0173373e+00 2.4124132e+00 3.3060311e+00 2.5063233e+00 3.4049933e+00 3.2016467e+00 2.8074882e+00 2.9128790e+00 3.3135401e+00 3.5094636e+00 3.0034944e+00 2.0185049e+00 2.3226176e+00 2.2272636e+00 2.4061715e+00 3.6025233e+00 3.0027816e+00 3.0045159e+00 3.2117473e+00 2.9147768e+00 2.6022650e+00 2.5117111e+00 2.9035536e+00 3.1022707e+00 2.5074705e+00 1.8959538e+00 2.7040250e+00 2.7012715e+00 2.7023320e+00 2.8040244e+00 1.6015419e+00 2.6035923e+00 4.5125057e+00 3.6062867e+00 4.4120448e+00 4.1027436e+00 4.3076126e+00 5.1160601e+00 3.0101869e+00 4.8099407e+00 4.3047534e+00 4.6192050e+00 3.6105351e+00 3.8061121e+00 4.0115220e+00 3.5110245e+00 3.6271576e+00 3.8169672e+00 4.0039490e+00 5.2185416e+00 5.4163883e+00 3.5078417e+00 4.2149895e+00 3.4109302e+00 5.2173835e+00 3.4072913e+00 4.2079670e+00 4.5106052e+00 3.3073674e+00 3.4056857e+00 4.1070396e+00 4.3122866e+00 4.6159499e+00 4.9341410e+00 4.1092167e+00 3.6024856e+00 4.1011078e+00 4.6347105e+00 4.1150272e+00 4.0033723e+00 3.3063033e+00 3.9150644e+00 4.1174503e+00 3.6310621e+00 3.6062867e+00 4.4108290e+00 4.2194920e+00 3.7226812e+00 3.5095242e+00 3.7093173e+00 3.9142888e+00 3.6040604e+00 3.4342562e-01 8.5406616e-01 3.3813251e-01 6.0017665e-01 4.5078948e-01 4.0125062e-01 2.2573593e-01 3.0474106e-01 7.0008584e-01 6.0184622e-01 2.2538848e-01 7.0017011e-01 8.0046685e-01 5.0477564e-01 5.2167208e-01 4.0004442e-01 5.0477564e-01 1.0016896e+00 3.0474106e-01 4.5080200e-01 1.1531953e+00 1.0008617e+00 4.5080200e-01 4.1420960e-01 6.1119558e-01 4.1210927e-01 8.0051036e-01 3.0482299e-01 4.1210927e-01 3.0158412e+00 2.8068284e+00 3.2097099e+00 2.3108757e+00 2.9065890e+00 2.8022000e+00 3.0066661e+00 1.6225614e+00 2.9048017e+00 2.2116239e+00 1.8685354e+00 2.5096708e+00 2.3100354e+00 3.0026666e+00 1.9136652e+00 2.7108290e+00 2.8056165e+00 2.4010446e+00 2.8094419e+00 2.2042326e+00 3.1114445e+00 2.3060252e+00 3.2036636e+00 3.0010404e+00 2.6048201e+00 2.7083838e+00 3.1074856e+00 3.3083888e+00 2.8056953e+00 1.8055938e+00 2.1074903e+00 2.0078120e+00 2.2044098e+00 3.4034897e+00 2.8056164e+00 2.8086638e+00 3.0080453e+00 2.7058598e+00 2.4044765e+00 2.3071636e+00 2.7018643e+00 2.9031229e+00 2.3040302e+00 1.6345914e+00 2.5039390e+00 2.5021287e+00 2.5037126e+00 2.6035547e+00 1.3485963e+00 2.4045982e+00 4.3195471e+00 3.4105069e+00 4.2110205e+00 3.9039624e+00 4.1112641e+00 4.9115281e+00 2.8134622e+00 4.6064153e+00 4.1040152e+00 4.4216160e+00 3.4153329e+00 3.6083651e+00 3.8136432e+00 3.3170079e+00 3.4454804e+00 3.6271127e+00 3.8048208e+00 5.0136911e+00 5.2125102e+00 3.3041886e+00 4.0185527e+00 3.2193583e+00 5.0117789e+00 3.2102572e+00 4.0101485e+00 4.3071174e+00 3.1116727e+00 3.2099137e+00 3.9105756e+00 4.1073261e+00 4.4108290e+00 4.7236350e+00 3.9141183e+00 3.4025037e+00 3.9008223e+00 4.4275986e+00 3.9240716e+00 3.8046112e+00 3.1114731e+00 3.7165788e+00 3.9250546e+00 3.4397950e+00 3.4105069e+00 4.2141201e+00 4.0283725e+00 3.5323888e+00 3.3126331e+00 3.5133654e+00 3.7236064e+00 3.4073749e+00 5.6371422e-01 4.0125062e-01 4.2362917e-01 7.0008735e-01 3.0017653e-01 2.2573593e-01 3.0490481e-01 5.2167829e-01 6.0202028e-01 3.3808272e-01 4.1210927e-01 5.2167829e-01 6.0201716e-01 5.0477564e-01 4.0363334e-01 6.0201716e-01 7.8895472e-01 3.0474106e-01 2.2608083e-01 1.4017696e+00 7.1636719e-01 2.2608083e-01 4.0002221e-01 7.0088627e-01 2.0121983e-01 5.6371422e-01 2.2538848e-01 4.0127250e-01 3.2269400e+00 3.0055754e+00 3.4153574e+00 2.5158464e+00 3.1070003e+00 3.0010043e+00 3.2037264e+00 1.8447764e+00 3.1084925e+00 2.4051329e+00 2.1169795e+00 2.7031257e+00 2.5230194e+00 3.2014729e+00 2.1040690e+00 2.9167440e+00 3.0016616e+00 2.6020655e+00 3.0122358e+00 2.4077390e+00 3.3040889e+00 2.5044039e+00 3.4036241e+00 3.2011770e+00 2.8066054e+00 2.9119764e+00 3.3128842e+00 3.5083774e+00 3.0022542e+00 2.0112442e+00 2.3146813e+00 2.2178117e+00 2.4035997e+00 3.6016272e+00 3.0016466e+00 3.0030180e+00 3.2109724e+00 2.9107838e+00 2.6012056e+00 2.5072166e+00 2.9020943e+00 3.1016037e+00 2.5045154e+00 1.8665804e+00 2.7022828e+00 2.7006623e+00 2.7012715e+00 2.8031364e+00 1.5665127e+00 2.6019940e+00 4.5096473e+00 3.6042722e+00 4.4108394e+00 4.1020090e+00 4.3058539e+00 5.1154681e+00 3.0065585e+00 4.8095984e+00 4.3039464e+00 4.6166518e+00 3.6081814e+00 3.8045576e+00 4.0096177e+00 3.5076367e+00 3.6204901e+00 3.8129595e+00 4.0031500e+00 5.2178509e+00 5.4155855e+00 3.5053718e+00 4.2125027e+00 3.4076329e+00 5.2169557e+00 3.4052726e+00 4.2064771e+00 4.5101686e+00 3.3051940e+00 3.4039470e+00 4.1052782e+00 4.3120002e+00 4.6153660e+00 4.9336188e+00 4.1069501e+00 3.6018985e+00 4.1007374e+00 4.6331222e+00 4.1114855e+00 4.0025890e+00 3.3042986e+00 3.9129418e+00 4.1139050e+00 3.6259501e+00 3.6042722e+00 4.4088300e+00 4.2155438e+00 3.7181244e+00 3.5068261e+00 3.7072136e+00 3.9107458e+00 3.6027359e+00 7.1779518e-01 9.0005048e-01 6.8160885e-01 6.0980961e-01 6.3164977e-01 6.0964597e-01 6.0948506e-01 6.3178534e-01 8.0888055e-01 6.5712813e-01 9.1552331e-01 5.6595908e-01 4.5147187e-01 9.0026543e-01 5.6595908e-01 6.0201716e-01 5.6370994e-01 4.1212852e-01 1.3000455e+00 4.1315633e-01 6.1830764e-01 9.0511169e-01 6.0964891e-01 6.3178534e-01 4.5077696e-01 7.1621748e-01 4.5783248e-01 3.7510248e+00 3.5145413e+00 3.9319585e+00 3.0060350e+00 3.6168418e+00 3.5015800e+00 3.7092301e+00 2.3098782e+00 3.6209185e+00 2.9036019e+00 2.5319798e+00 3.2059465e+00 3.0125595e+00 3.7043511e+00 2.6050088e+00 3.4362995e+00 3.5023713e+00 3.1027850e+00 3.5112541e+00 2.9034027e+00 3.8056232e+00 3.0109656e+00 3.9070007e+00 3.7037948e+00 3.3177283e+00 3.4278716e+00 3.8279200e+00 4.0185639e+00 3.5049370e+00 2.5063489e+00 2.8048596e+00 2.7053910e+00 2.9045816e+00 4.1028806e+00 3.5020661e+00 3.5059137e+00 3.7249599e+00 3.4134555e+00 3.1021033e+00 3.0035422e+00 3.4012314e+00 3.6049329e+00 3.0042977e+00 2.3151346e+00 3.2021240e+00 3.2018065e+00 3.2023319e+00 3.3095196e+00 2.0139907e+00 3.1028259e+00 5.0111326e+00 4.1049446e+00 4.9203200e+00 4.6042055e+00 4.8089555e+00 5.6273643e+00 3.5051449e+00 5.3190012e+00 4.8083867e+00 5.1260178e+00 4.1140184e+00 4.3082037e+00 4.5172930e+00 4.0074572e+00 4.1195081e+00 4.3162103e+00 4.5071301e+00 5.7305902e+00 5.9266306e+00 4.0041352e+00 4.7202045e+00 3.9078680e+00 5.7295930e+00 3.9093593e+00 4.7117434e+00 5.0203874e+00 3.8087102e+00 3.9064537e+00 4.6081315e+00 4.8239967e+00 5.1282911e+00 5.4538016e+00 4.6097450e+00 4.1052255e+00 4.6016323e+00 5.1527860e+00 4.6133719e+00 4.5057296e+00 3.8063301e+00 4.4231469e+00 4.6192070e+00 4.1384491e+00 4.1049446e+00 4.9142249e+00 4.7202041e+00 4.2256252e+00 4.0099717e+00 4.2125085e+00 4.4124585e+00 4.1039188e+00 3.4085233e-01 3.3818226e-01 1.2699992e-01 3.0922892e-01 3.3818226e-01 4.1212852e-01 3.4085233e-01 3.0490481e-01 8.0250202e-01 9.0192695e-01 4.0363334e-01 5.0437695e-01 4.5847767e-01 4.0363334e-01 7.0633229e-01 3.0482299e-01 4.0246123e-01 1.0095513e+00 7.0548283e-01 2.0181667e-01 5.0043084e-01 3.6452132e-01 5.0436965e-01 5.0855778e-01 4.1420960e-01 3.3813251e-01 3.0360001e+00 2.8068283e+00 3.2199554e+00 2.3040302e+00 2.9083228e+00 2.8004229e+00 3.0040677e+00 1.6099792e+00 2.9111118e+00 2.2023225e+00 1.8444678e+00 2.5026969e+00 2.3072196e+00 3.0013665e+00 1.9023442e+00 2.7227152e+00 2.8012528e+00 2.4005053e+00 2.8054838e+00 2.2013444e+00 3.1036553e+00 2.3040711e+00 3.2026875e+00 3.0010106e+00 2.6084695e+00 2.7159628e+00 3.1166009e+00 3.3100796e+00 2.8019019e+00 1.8020058e+00 2.1029252e+00 2.0034861e+00 2.2011906e+00 3.4011297e+00 2.8012319e+00 2.8028007e+00 3.0142197e+00 2.7060544e+00 2.4007552e+00 2.3017471e+00 2.7003774e+00 2.9016034e+00 2.3011979e+00 1.6179000e+00 2.5007284e+00 2.5003793e+00 2.5007008e+00 2.6035320e+00 1.3154932e+00 2.4008859e+00 4.3091529e+00 3.4034897e+00 4.2123904e+00 3.9018704e+00 4.1056542e+00 4.9181670e+00 2.8038684e+00 4.6114520e+00 4.1039624e+00 4.4180514e+00 3.4084525e+00 3.6042874e+00 3.8104403e+00 3.3060311e+00 3.4198458e+00 3.6127194e+00 3.8032956e+00 5.0208687e+00 5.2178587e+00 3.3018328e+00 4.0133297e+00 3.2067991e+00 5.0200323e+00 3.2048524e+00 4.0067585e+00 4.3122441e+00 3.1047671e+00 3.2036090e+00 3.9049697e+00 4.1148052e+00 4.4184267e+00 4.7404155e+00 3.9065727e+00 3.4018864e+00 3.9004186e+00 4.4392802e+00 3.9110280e+00 3.8025990e+00 3.1038577e+00 3.7145622e+00 3.9140895e+00 3.4287259e+00 3.4034897e+00 4.2090841e+00 4.0156240e+00 3.5189468e+00 3.3056781e+00 3.5073617e+00 3.7102604e+00 3.4023494e+00 4.1315633e-01 3.0915245e-01 4.5078948e-01 5.2132556e-01 3.0482299e-01 3.3808272e-01 6.0964597e-01 7.0911112e-01 8.6051414e-01 4.1212852e-01 7.0016860e-01 7.4262964e-01 4.1212852e-01 6.1830489e-01 4.1209001e-01 6.0018299e-01 1.1056693e+00 6.0964597e-01 4.1317535e-01 4.1315633e-01 5.2133179e-01 4.2268438e-01 5.0084481e-01 5.2491131e-01 5.0043084e-01 2.9115264e+00 2.6338022e+00 3.0658361e+00 2.1172959e+00 2.7373419e+00 2.6040822e+00 2.8212040e+00 1.4407364e+00 2.7450517e+00 2.0182279e+00 1.7116683e+00 2.3196029e+00 2.1285888e+00 2.8091316e+00 1.7264084e+00 2.5863714e+00 2.6084695e+00 2.2054529e+00 2.6248910e+00 2.0083311e+00 2.9174382e+00 2.1301354e+00 3.0136614e+00 2.8068911e+00 2.4421128e+00 2.5659281e+00 2.9581275e+00 3.1380442e+00 2.6129786e+00 1.6191482e+00 1.9129988e+00 1.8141046e+00 2.0129571e+00 3.2064817e+00 2.6080847e+00 2.6171503e+00 2.8540078e+00 2.5288353e+00 2.2078337e+00 2.1116321e+00 2.5029614e+00 2.7108347e+00 2.1109969e+00 1.4620239e+00 2.3067198e+00 2.3048725e+00 2.3072196e+00 2.4221911e+00 1.1960519e+00 2.2090466e+00 4.1263920e+00 3.2146438e+00 4.0362393e+00 3.7082866e+00 3.9191966e+00 4.7434452e+00 2.6190662e+00 4.4302264e+00 3.9142233e+00 4.2488425e+00 3.2328627e+00 3.4177609e+00 3.6349468e+00 3.1232336e+00 3.2606481e+00 3.4419771e+00 3.6135028e+00 4.8484858e+00 5.0414126e+00 3.1077602e+00 3.8409517e+00 3.0264502e+00 4.8462395e+00 3.0224855e+00 3.8231767e+00 4.1339850e+00 2.9228238e+00 3.0173096e+00 3.7181009e+00 3.9409635e+00 4.2473796e+00 4.5888422e+00 3.7226114e+00 3.2097424e+00 3.7024938e+00 4.2924779e+00 3.7339169e+00 3.6111693e+00 2.9185950e+00 3.5470876e+00 3.7434043e+00 3.2896416e+00 3.2146438e+00 4.0283196e+00 3.8460162e+00 3.3616756e+00 3.1242731e+00 3.3284650e+00 3.5333785e+00 3.2109426e+00 4.0122873e-01 5.0043084e-01 4.0243965e-01 3.0474106e-01 2.0061436e-01 4.5148429e-01 1.1000100e+00 1.2012928e+00 1.2699992e-01 4.0122873e-01 5.6595488e-01 1.2699992e-01 6.0184309e-01 4.0004442e-01 5.0436965e-01 7.1700909e-01 6.0201716e-01 5.2132556e-01 8.0051115e-01 2.2573593e-01 8.0000080e-01 4.0243965e-01 7.0088477e-01 3.0474106e-01 3.1428043e+00 2.9119661e+00 3.3252402e+00 2.4048325e+00 3.0131919e+00 2.9019362e+00 3.1087162e+00 1.7043719e+00 3.0148571e+00 2.3090280e+00 1.9099608e+00 2.6089255e+00 2.4039780e+00 3.1034773e+00 2.0109328e+00 2.8295063e+00 2.9047982e+00 2.5011632e+00 2.9079901e+00 2.3019339e+00 3.2101766e+00 2.4088882e+00 3.3051149e+00 3.1020645e+00 2.7127201e+00 2.8219255e+00 3.2211370e+00 3.4154432e+00 2.9057760e+00 1.9031964e+00 2.2023924e+00 2.1016800e+00 2.3040177e+00 3.5033831e+00 2.9047500e+00 2.9083094e+00 3.1195526e+00 2.8078790e+00 2.5037817e+00 2.4045555e+00 2.8012577e+00 3.0040677e+00 2.4032886e+00 1.7053664e+00 2.6031367e+00 2.6019751e+00 2.6032655e+00 2.7067267e+00 1.4186217e+00 2.5039390e+00 4.4180854e+00 3.5092124e+00 4.3179254e+00 4.0043989e+00 4.2115634e+00 5.0223341e+00 2.9108451e+00 4.7142986e+00 4.2064794e+00 4.5276385e+00 3.5169841e+00 3.7092301e+00 3.9177719e+00 3.4145764e+00 3.5398518e+00 3.7257231e+00 3.9064409e+00 5.1255523e+00 5.3223081e+00 3.4028319e+00 4.1224590e+00 3.3167394e+00 5.1238108e+00 3.3110167e+00 4.1123595e+00 4.4156295e+00 3.2116669e+00 3.3094499e+00 4.0106882e+00 4.2180724e+00 4.5227110e+00 4.8462592e+00 4.0138270e+00 3.5038530e+00 4.0010263e+00 4.5481710e+00 4.0222346e+00 3.9055783e+00 3.2104685e+00 3.8231767e+00 4.0259306e+00 3.5470873e+00 3.5092124e+00 4.3162096e+00 4.1285334e+00 3.6344358e+00 3.4126369e+00 3.6148618e+00 3.8215373e+00 3.5066394e+00 2.2608083e-01 2.4170870e-01 3.0915245e-01 3.0915245e-01 4.0002221e-01 7.0096858e-01 8.0888055e-01 3.3818226e-01 4.0243965e-01 5.0477564e-01 3.3818226e-01 6.1135434e-01 2.0121983e-01 3.0017653e-01 1.1020506e+00 6.0219099e-01 2.0061436e-01 4.1210927e-01 4.0246123e-01 4.0125062e-01 4.0363334e-01 3.4085233e-01 2.2573593e-01 3.1414744e+00 2.9090612e+00 3.3237063e+00 2.4058952e+00 3.0107723e+00 2.9007492e+00 3.1056084e+00 1.7139238e+00 3.0138400e+00 2.3035512e+00 1.9525301e+00 2.6040007e+00 2.4100386e+00 3.1020779e+00 2.0037730e+00 2.8273039e+00 2.9018637e+00 2.5009579e+00 2.9077468e+00 2.3022754e+00 3.2048985e+00 2.4059812e+00 3.3038272e+00 3.1015567e+00 2.7110304e+00 2.8196992e+00 3.2199879e+00 3.4126307e+00 2.9028597e+00 1.9035634e+00 2.2044603e+00 2.1052067e+00 2.3021298e+00 3.5016873e+00 2.9018153e+00 2.9040211e+00 3.1174676e+00 2.8083845e+00 2.5012694e+00 2.4028385e+00 2.8006965e+00 3.0024198e+00 2.4021168e+00 1.7233814e+00 2.6012647e+00 2.6007117e+00 2.6012056e+00 2.7050190e+00 1.4220898e+00 2.5015263e+00 4.4109742e+00 3.5045842e+00 4.3148937e+00 4.0025815e+00 4.2071337e+00 5.0208677e+00 2.9053047e+00 4.7134688e+00 4.2051335e+00 4.5213131e+00 3.5107904e+00 3.7056862e+00 3.9129303e+00 3.4076849e+00 3.5232606e+00 3.7154827e+00 3.9043905e+00 5.1238111e+00 5.3204854e+00 3.4027174e+00 4.1161770e+00 3.3085473e+00 5.1228006e+00 3.3065392e+00 4.1085246e+00 4.4144908e+00 3.2064337e+00 3.3048953e+00 4.0063737e+00 4.2173565e+00 4.5213359e+00 4.8449108e+00 4.0082529e+00 3.5026815e+00 4.0006690e+00 4.5442582e+00 4.0132894e+00 3.9035247e+00 3.2051958e+00 3.8177289e+00 4.0170262e+00 3.5340950e+00 3.5045842e+00 4.3111747e+00 4.1186693e+00 3.6228903e+00 3.4075338e+00 3.6094379e+00 3.8124787e+00 3.5031928e+00 1.1269424e-01 5.0436965e-01 4.5078948e-01 2.2573593e-01 6.0000317e-01 7.0088477e-01 4.1210927e-01 3.4080442e-01 3.0474106e-01 4.1210927e-01 8.0883841e-01 1.1269424e-01 2.2573593e-01 1.2089253e+00 8.0051036e-01 4.0125062e-01 4.1317535e-01 5.2133802e-01 3.0017653e-01 6.0184622e-01 2.0061436e-01 2.2573593e-01 3.2211375e+00 3.0065592e+00 3.4126307e+00 2.5097024e+00 3.1069750e+00 3.0016616e+00 3.2056674e+00 1.8201133e+00 3.1066333e+00 2.4080686e+00 2.0619186e+00 2.7068820e+00 2.5107632e+00 3.2022485e+00 2.1087015e+00 2.9137660e+00 3.0040552e+00 2.6010528e+00 3.0089164e+00 2.4039766e+00 3.3085605e+00 2.5050799e+00 3.4035383e+00 3.2010814e+00 2.8057187e+00 2.9102474e+00 3.3101488e+00 3.5088135e+00 3.0043212e+00 2.0051350e+00 2.3071665e+00 2.2078183e+00 2.4034084e+00 3.6027901e+00 3.0040510e+00 3.0064311e+00 3.2097125e+00 2.9065741e+00 2.6030847e+00 2.5057763e+00 2.9016034e+00 3.1025924e+00 2.5033702e+00 1.8310475e+00 2.7029487e+00 2.7015162e+00 2.7026433e+00 2.8034238e+00 1.5358653e+00 2.6032968e+00 4.5159027e+00 3.6080734e+00 4.4115652e+00 4.1033603e+00 4.3094200e+00 5.1138780e+00 3.0100866e+00 4.8082318e+00 4.3041941e+00 4.6203464e+00 3.6127197e+00 3.8070338e+00 4.0124958e+00 3.5130651e+00 3.6349183e+00 3.8215362e+00 4.0044029e+00 5.2162094e+00 5.4145184e+00 3.5039680e+00 4.2166537e+00 3.4145702e+00 5.2146334e+00 3.4083285e+00 4.2090727e+00 4.5089181e+00 3.3091123e+00 3.4076329e+00 4.1087140e+00 4.3098021e+00 4.6133860e+00 4.9287684e+00 4.1115100e+00 3.6023704e+00 4.1007820e+00 4.6309835e+00 4.1192351e+00 4.0040240e+00 3.3086516e+00 3.9156759e+00 4.1209257e+00 3.6344375e+00 3.6080734e+00 4.4124586e+00 4.2235561e+00 3.7268101e+00 3.5102374e+00 3.7111714e+00 3.9185866e+00 3.6056580e+00 5.0084481e-01 4.1315633e-01 2.2573593e-01 7.0000303e-01 8.0046605e-01 3.3818226e-01 2.4170870e-01 3.0017653e-01 3.3818226e-01 8.0245824e-01 1.1269424e-01 2.0181667e-01 1.1133897e+00 8.0004523e-01 4.0246123e-01 5.2167829e-01 4.5078948e-01 4.0125062e-01 6.0017665e-01 3.0017653e-01 2.0061436e-01 3.3182813e+00 3.1056085e+00 3.5110034e+00 2.6060742e+00 3.2059465e+00 3.1013637e+00 3.3048926e+00 1.9099680e+00 3.2056789e+00 2.5063346e+00 2.1344310e+00 2.8057704e+00 2.6059875e+00 3.3019214e+00 2.2068463e+00 3.0117188e+00 3.1034568e+00 2.7006623e+00 3.1063566e+00 2.5023073e+00 3.4074246e+00 2.6040822e+00 3.5028878e+00 3.3008913e+00 2.9048017e+00 3.0087102e+00 3.4087684e+00 3.6077011e+00 3.1036688e+00 2.1027637e+00 2.4039664e+00 2.3040177e+00 2.5024922e+00 3.7023994e+00 3.1034532e+00 3.1054994e+00 3.3083865e+00 3.0045919e+00 2.7025560e+00 2.6039937e+00 3.0011260e+00 3.2022183e+00 2.6023240e+00 1.9156198e+00 2.8022964e+00 2.8012577e+00 2.8021795e+00 2.9028597e+00 1.6190551e+00 2.7026433e+00 4.6143249e+00 3.7070367e+00 4.5103890e+00 4.2029881e+00 4.4084395e+00 5.2126509e+00 3.1082889e+00 4.9074567e+00 4.4036930e+00 4.7183734e+00 3.7111657e+00 3.9061763e+00 4.1111077e+00 3.6112621e+00 3.7306950e+00 3.9190472e+00 4.1039096e+00 5.3148048e+00 5.5132902e+00 3.6028435e+00 4.3148929e+00 3.5126667e+00 5.3133599e+00 3.5071916e+00 4.3081091e+00 4.6080296e+00 3.4078683e+00 3.5066415e+00 4.2077543e+00 4.4087821e+00 4.7120754e+00 5.0261502e+00 4.2102487e+00 3.7020547e+00 4.2006494e+00 4.7279956e+00 4.2171591e+00 4.1035746e+00 3.4074978e+00 4.0138994e+00 4.2186688e+00 3.7302926e+00 3.7070367e+00 4.5111938e+00 4.3210760e+00 3.8236433e+00 3.6087856e+00 3.8098356e+00 4.0164852e+00 3.7049593e+00 1.1269424e-01 7.0017011e-01 9.0506343e-01 1.0426636e+00 2.0181667e-01 4.1209001e-01 8.0093081e-01 2.0181667e-01 3.4080442e-01 4.0125062e-01 3.6259865e-01 9.0029064e-01 3.3808272e-01 4.2268438e-01 6.1135434e-01 2.2608083e-01 6.0948212e-01 2.0061436e-01 6.3164977e-01 3.0482299e-01 3.1902650e+00 2.9267417e+00 3.3545239e+00 2.4065479e+00 3.0300492e+00 2.9028462e+00 3.1166330e+00 1.7073273e+00 3.0369978e+00 2.3091363e+00 1.9242178e+00 2.6129479e+00 2.4148785e+00 3.1074477e+00 2.0138888e+00 2.8680310e+00 2.9053048e+00 2.5042875e+00 2.9165009e+00 2.3038195e+00 3.2116668e+00 2.4221589e+00 3.3110857e+00 3.1060464e+00 2.7333589e+00 2.8520935e+00 3.2480481e+00 3.4313924e+00 2.9094538e+00 1.9103596e+00 2.2042535e+00 2.1040084e+00 2.3086427e+00 3.5048916e+00 2.9048754e+00 2.9119661e+00 3.1440058e+00 2.8212158e+00 2.5048147e+00 2.4054865e+00 2.8016296e+00 3.0087060e+00 2.4071454e+00 1.7108740e+00 2.6040234e+00 2.6035022e+00 2.6047905e+00 2.7176633e+00 1.4222462e+00 2.5057847e+00 4.4195581e+00 3.5098289e+00 4.3311360e+00 4.0067587e+00 4.2149806e+00 5.0390074e+00 2.9109559e+00 4.7273232e+00 4.2124122e+00 4.5405876e+00 3.5250718e+00 3.7139027e+00 3.9284285e+00 3.4150426e+00 3.5404383e+00 3.7302923e+00 3.9113385e+00 5.1434691e+00 5.3373009e+00 3.4049076e+00 4.1330547e+00 3.3170101e+00 5.1417717e+00 3.3168869e+00 4.1189487e+00 4.4302240e+00 3.2165105e+00 3.3123688e+00 4.0139003e+00 4.2362095e+00 4.5418862e+00 4.8784553e+00 4.0170271e+00 3.5083268e+00 4.0022121e+00 4.5797332e+00 4.0245435e+00 3.9092247e+00 3.2127499e+00 3.8383398e+00 4.0332236e+00 3.5687055e+00 3.5098289e+00 4.3229228e+00 4.1350002e+00 3.6463113e+00 3.4177609e+00 3.6219569e+00 3.8236419e+00 3.5076152e+00 6.0202028e-01 1.0008471e+00 1.1133984e+00 1.2085435e-01 4.0125062e-01 7.0548138e-01 1.2085435e-01 4.1210927e-01 3.3813251e-01 4.1317535e-01 8.0093160e-01 4.1210927e-01 4.5147187e-01 7.0184453e-01 2.0121983e-01 7.0088326e-01 2.2573593e-01 6.3164977e-01 2.4170870e-01 3.1712556e+00 2.9203033e+00 3.3425812e+00 2.4054865e+00 3.0228150e+00 2.9023686e+00 3.1131138e+00 1.7053664e+00 3.0276460e+00 2.3090554e+00 1.9156198e+00 2.6109872e+00 2.4094445e+00 3.1056085e+00 2.0122722e+00 2.8520934e+00 2.9050277e+00 2.5027053e+00 2.9125192e+00 2.3027405e+00 3.2109394e+00 2.4160415e+00 3.3084146e+00 3.1042008e+00 2.7243956e+00 2.8394100e+00 3.2369546e+00 3.4247119e+00 2.9077087e+00 1.9065546e+00 2.2031052e+00 2.1025721e+00 2.3063026e+00 3.5041732e+00 2.9047982e+00 2.9102300e+00 3.1338083e+00 2.8152056e+00 2.5042498e+00 2.4049187e+00 2.8014068e+00 3.0065584e+00 2.4051787e+00 1.7073273e+00 2.6035320e+00 2.6027034e+00 2.6039922e+00 2.7127202e+00 1.4197348e+00 2.5048165e+00 4.4189015e+00 3.5095163e+00 4.3257988e+00 4.0057069e+00 4.2135049e+00 5.0324949e+00 2.9108796e+00 4.7221364e+00 4.2099109e+00 4.5353940e+00 3.5215862e+00 3.7118544e+00 3.9240013e+00 3.4147901e+00 3.5401421e+00 3.7282909e+00 3.9092247e+00 5.1365094e+00 5.3314710e+00 3.4038679e+00 4.1286955e+00 3.3168613e+00 5.1347955e+00 3.3142720e+00 4.1161770e+00 4.4243750e+00 3.2143132e+00 3.3110162e+00 4.0124921e+00 4.2289511e+00 4.5343165e+00 4.8661278e+00 4.0156242e+00 3.5063341e+00 4.0016595e+00 4.5675358e+00 4.0235142e+00 3.9076269e+00 3.2116668e+00 3.8321137e+00 4.0301568e+00 3.5598554e+00 3.5095163e+00 4.3201293e+00 4.1322798e+00 3.6413274e+00 3.4154677e+00 3.6188977e+00 3.8226861e+00 3.5071388e+00 7.0096708e-01 8.0004602e-01 5.0855077e-01 4.1420960e-01 2.2608083e-01 5.0855077e-01 1.0008768e+00 3.0474106e-01 4.0127250e-01 1.1527746e+00 1.0000457e+00 4.0127250e-01 4.5783248e-01 6.0948800e-01 4.1317535e-01 8.0008964e-01 3.0482299e-01 4.0127250e-01 3.2104685e+00 3.0024155e+00 3.4059092e+00 2.5048145e+00 3.1026586e+00 3.0005260e+00 3.2022151e+00 1.8108200e+00 3.1025924e+00 2.4028974e+00 2.0417688e+00 2.7025751e+00 2.5062865e+00 3.2007416e+00 2.1027376e+00 2.9057769e+00 3.0015388e+00 2.6003213e+00 3.0043084e+00 2.4017233e+00 3.3039365e+00 2.5015263e+00 3.4013673e+00 3.2002931e+00 2.8019179e+00 2.9040262e+00 3.3045112e+00 3.5038551e+00 3.0015958e+00 2.0020172e+00 2.3035509e+00 2.2041009e+00 2.4010446e+00 3.6011254e+00 3.0015387e+00 3.0025850e+00 3.2040849e+00 2.9029297e+00 2.6009614e+00 2.5022969e+00 2.9005699e+00 3.1008537e+00 2.5011717e+00 1.8179820e+00 2.7009799e+00 2.7004102e+00 2.7008225e+00 2.8010266e+00 1.5160787e+00 2.6010449e+00 4.5093548e+00 3.6039076e+00 4.4060847e+00 4.1014985e+00 4.3050076e+00 5.1081747e+00 3.0045274e+00 4.8044751e+00 4.3019076e+00 4.6117611e+00 3.6062405e+00 3.8032982e+00 4.0063634e+00 3.5066398e+00 3.6202705e+00 3.8119529e+00 4.0019489e+00 5.2097659e+00 5.4087506e+00 3.5019664e+00 4.2090727e+00 3.4073888e+00 5.2088330e+00 3.4037266e+00 4.2046087e+00 4.5046939e+00 3.3041077e+00 3.4034672e+00 4.1044794e+00 4.3051857e+00 4.6074982e+00 4.9181673e+00 4.1061528e+00 3.6008588e+00 4.1002763e+00 4.6187512e+00 4.1110303e+00 4.0017844e+00 3.3039580e+00 3.9080413e+00 4.1118167e+00 3.6188744e+00 3.6039076e+00 4.4067826e+00 4.2136946e+00 3.7147052e+00 3.5048712e+00 3.7054764e+00 3.9103830e+00 3.6025973e+00 3.0026460e-01 1.0001598e+00 9.0029064e-01 6.0202028e-01 1.0001598e+00 1.1281352e+00 7.0000303e-01 6.0052920e-01 1.8012962e+00 9.6574369e-01 6.3178782e-01 4.2270142e-01 1.1005460e+00 3.0026460e-01 9.1422402e-01 4.0004442e-01 8.0004602e-01 3.2225450e+00 3.0091788e+00 3.4142737e+00 2.5659206e+00 3.1121190e+00 3.0065741e+00 3.2080663e+00 1.9795481e+00 3.1095927e+00 2.4291135e+00 2.3151880e+00 2.7129011e+00 2.5826416e+00 3.2051685e+00 2.1273517e+00 2.9165009e+00 3.0077149e+00 2.6132476e+00 3.0422268e+00 2.4403272e+00 3.3124044e+00 2.5166989e+00 3.4115621e+00 3.2044340e+00 2.8105357e+00 2.9137358e+00 3.3135329e+00 3.5115123e+00 3.0089448e+00 2.0634477e+00 2.3669955e+00 2.2798676e+00 2.4222743e+00 3.6065353e+00 3.0077107e+00 3.0095641e+00 3.2119165e+00 2.9352117e+00 2.6080595e+00 2.5371436e+00 2.9126008e+00 3.1051604e+00 2.5254396e+00 2.0316239e+00 2.7143597e+00 2.7050980e+00 2.7084026e+00 2.8082597e+00 1.7626307e+00 2.6129786e+00 4.5202811e+00 3.6136284e+00 4.4137920e+00 4.1051791e+00 4.3125133e+00 5.1149745e+00 3.0264326e+00 4.8090821e+00 4.3074243e+00 4.6242424e+00 3.6169385e+00 3.8113313e+00 4.0160029e+00 3.5235168e+00 3.6464145e+00 3.8279938e+00 4.0062032e+00 5.2173409e+00 5.4162239e+00 3.5202520e+00 4.2206877e+00 3.4219359e+00 5.2156030e+00 3.4146242e+00 4.2116109e+00 4.5097900e+00 3.3150972e+00 3.4115327e+00 4.1123767e+00 4.3106068e+00 4.6148396e+00 4.9296764e+00 4.1159139e+00 3.6049049e+00 4.1030781e+00 4.6336876e+00 4.1247374e+00 4.0056652e+00 3.3131419e+00 3.9194404e+00 4.1265834e+00 3.6428011e+00 3.6136284e+00 4.4157045e+00 4.2295866e+00 3.7344540e+00 3.5196603e+00 3.7152542e+00 3.9242137e+00 3.6086340e+00 1.1055707e+00 1.0030868e+00 7.0000151e-01 1.1055707e+00 1.3018102e+00 8.0245824e-01 7.1621884e-01 1.9078389e+00 1.1896594e+00 7.2044167e-01 5.3943256e-01 1.2089192e+00 4.5147187e-01 1.0776188e+00 5.0043084e-01 9.0506254e-01 3.3079985e+00 3.1046072e+00 3.5056118e+00 2.6709345e+00 3.2081329e+00 3.1065948e+00 3.3043807e+00 2.0901204e+00 3.2052035e+00 2.5276373e+00 2.4267777e+00 2.8091158e+00 2.6904888e+00 3.3041886e+00 2.2241050e+00 3.0065909e+00 3.1056084e+00 2.7155799e+00 3.1440950e+00 2.5451785e+00 3.4078458e+00 2.6152930e+00 3.5111169e+00 3.3045112e+00 2.9070941e+00 3.0065909e+00 3.4069929e+00 3.6059670e+00 3.1068940e+00 2.1702441e+00 2.4737523e+00 2.3880607e+00 2.5238437e+00 3.7056514e+00 3.1056084e+00 3.1055129e+00 3.3051256e+00 3.0372254e+00 2.7067267e+00 2.6397031e+00 3.0142197e+00 3.2037566e+00 2.6278605e+00 2.1424915e+00 2.8148768e+00 2.8047553e+00 2.8077256e+00 2.9066659e+00 1.8682644e+00 2.7127202e+00 4.6142218e+00 3.7103348e+00 4.5074842e+00 4.2035307e+00 4.4083412e+00 5.2074280e+00 3.1239158e+00 4.9041928e+00 4.4055872e+00 4.7149533e+00 3.7103439e+00 3.9081758e+00 4.1095835e+00 3.6188977e+00 3.7328455e+00 3.9187196e+00 4.1037709e+00 5.3087451e+00 5.5089283e+00 3.6218973e+00 4.3127798e+00 3.5155554e+00 5.3076917e+00 3.5109043e+00 4.3070065e+00 4.6043043e+00 3.4107931e+00 3.5076367e+00 4.2085644e+00 4.4044360e+00 4.7071579e+00 5.0144130e+00 4.2110565e+00 3.7038321e+00 4.2031939e+00 4.7176313e+00 4.2169539e+00 4.1034568e+00 3.4087523e+00 4.0110693e+00 4.2176552e+00 3.7262659e+00 3.7103348e+00 4.5099841e+00 4.3199893e+00 3.8223318e+00 3.6159248e+00 3.8096375e+00 4.0163546e+00 3.7058422e+00 3.0026460e-01 6.0964891e-01 0.0000000e+00 5.0043842e-01 3.0482299e-01 4.0246123e-01 8.0254500e-01 5.0043842e-01 5.2133802e-01 7.0556260e-01 2.0181667e-01 7.0008735e-01 3.0026460e-01 6.0948506e-01 2.0181667e-01 3.2490712e+00 3.0153168e+00 3.4297841e+00 2.5067523e+00 3.1166337e+00 3.0027816e+00 3.2112793e+00 1.8068048e+00 3.1183051e+00 2.4116924e+00 2.0138832e+00 2.7116615e+00 2.5059537e+00 3.2048192e+00 2.1144760e+00 2.9351753e+00 3.0063019e+00 2.6019122e+00 3.0106587e+00 2.4030297e+00 3.3125861e+00 2.5120719e+00 3.4068163e+00 3.2029877e+00 2.8162444e+00 2.9267417e+00 3.3252407e+00 3.5189464e+00 3.0077107e+00 2.0051350e+00 2.3037132e+00 2.2028146e+00 2.4058620e+00 3.6044981e+00 3.0062070e+00 3.0107283e+00 3.2237456e+00 2.9105093e+00 2.6052541e+00 2.5062865e+00 2.9018772e+00 3.1056084e+00 2.5048522e+00 1.8082911e+00 2.7043948e+00 2.7029415e+00 2.7046027e+00 2.8091099e+00 1.5248852e+00 2.6055127e+00 4.5209020e+00 3.6112573e+00 4.4212031e+00 4.1056541e+00 4.3138986e+00 5.1255338e+00 3.0133997e+00 4.8167235e+00 4.3081273e+00 4.6319211e+00 3.6205854e+00 3.8114965e+00 4.0212972e+00 3.5173798e+00 3.6449970e+00 3.8299342e+00 4.0081754e+00 5.2290121e+00 5.4254411e+00 3.5039202e+00 4.2264145e+00 3.4198378e+00 5.2270034e+00 3.4138008e+00 4.2149806e+00 4.5183778e+00 3.3145502e+00 3.4118179e+00 4.1129687e+00 4.3210760e+00 4.6261633e+00 4.9512603e+00 4.1165035e+00 3.6051692e+00 4.1014742e+00 4.6540056e+00 4.1257291e+00 4.0071257e+00 3.3129914e+00 3.9274863e+00 4.1301604e+00 3.6542046e+00 3.6112573e+00 4.4192311e+00 4.2328883e+00 3.7399948e+00 3.5155767e+00 3.7180846e+00 3.9250546e+00 3.6083191e+00 5.0436965e-01 3.0026460e-01 6.0017982e-01 3.0482299e-01 3.0017653e-01 9.0506343e-01 6.0000317e-01 4.5783248e-01 7.4269314e-01 2.4195741e-01 6.0948506e-01 4.0122873e-01 5.0855077e-01 2.0061436e-01 3.5243030e+00 3.3064692e+00 3.7147036e+00 2.8028227e+00 3.4072759e+00 3.3010449e+00 3.5048841e+00 2.1026764e+00 3.4081977e+00 2.7042302e+00 2.3098753e+00 3.0045117e+00 2.8027924e+00 3.5019450e+00 2.4045982e+00 3.2157547e+00 3.3025861e+00 2.9005886e+00 3.3047156e+00 2.7010554e+00 3.6058037e+00 2.8042692e+00 3.7029937e+00 3.5011559e+00 3.1065954e+00 3.2116669e+00 3.6121048e+00 3.8091015e+00 3.3031148e+00 2.3014285e+00 2.6014645e+00 2.5011992e+00 2.7018905e+00 3.9020189e+00 3.3025600e+00 3.3044825e+00 3.5110031e+00 3.2044340e+00 2.9018587e+00 2.8023124e+00 3.2006932e+00 3.4022345e+00 2.8016296e+00 2.1039819e+00 3.0015958e+00 3.0009948e+00 3.0016466e+00 3.1034780e+00 1.8068049e+00 2.9019412e+00 4.8119571e+00 3.9055005e+00 4.7117433e+00 4.4027872e+00 4.6074923e+00 5.4154953e+00 3.3059205e+00 5.1096877e+00 4.6042055e+00 4.9184662e+00 3.9101579e+00 4.1056576e+00 4.3111747e+00 3.8086187e+00 3.9240074e+00 4.1158326e+00 4.3040379e+00 5.5178488e+00 5.7157885e+00 3.8018678e+00 4.5144444e+00 3.7097243e+00 5.5166376e+00 3.7063915e+00 4.5079295e+00 4.8103281e+00 3.6066590e+00 3.7054748e+00 4.4067833e+00 4.6117275e+00 4.9151622e+00 5.2317566e+00 4.4087821e+00 3.9022961e+00 4.4006562e+00 4.9323259e+00 4.4141504e+00 4.3034963e+00 3.6059708e+00 4.2144276e+00 4.4165186e+00 3.9284285e+00 3.9055005e+00 4.7106152e+00 4.5183778e+00 4.0209837e+00 3.8074712e+00 4.0090032e+00 4.2134002e+00 3.9039579e+00 6.0964891e-01 1.1019501e+00 4.0125062e-01 5.0000761e-01 1.2632947e+00 1.1001012e+00 5.2491131e-01 6.1135434e-01 7.1621884e-01 4.2268438e-01 9.0026543e-01 2.4170870e-01 5.0043084e-01 3.4064574e+00 3.2033141e+00 3.6042703e+00 2.7067267e+00 3.3031847e+00 3.2012079e+00 3.4035361e+00 2.0125822e+00 3.3019706e+00 2.6055127e+00 2.2404570e+00 2.9047685e+00 2.7070958e+00 3.4014441e+00 2.3056303e+00 3.1043374e+00 3.2029748e+00 2.8006755e+00 3.2059945e+00 2.6027034e+00 3.5064150e+00 2.7028014e+00 3.6021536e+00 3.4005708e+00 3.0020583e+00 3.1034908e+00 3.5031921e+00 3.7043162e+00 3.2030081e+00 2.2031888e+00 2.5048145e+00 2.4051640e+00 2.6022353e+00 3.8020808e+00 3.2029748e+00 3.2045605e+00 3.4036086e+00 3.1036832e+00 2.8021575e+00 2.7039988e+00 3.1011640e+00 3.3016475e+00 2.7022579e+00 2.0191796e+00 2.9020892e+00 2.9010579e+00 2.9018587e+00 3.0016913e+00 1.7203066e+00 2.8022905e+00 4.7127831e+00 3.8062227e+00 4.6064153e+00 4.3024456e+00 4.5071341e+00 5.3066177e+00 3.2074507e+00 5.0034627e+00 4.5024143e+00 4.8135231e+00 3.8088290e+00 4.0049892e+00 4.2080447e+00 3.7100251e+00 3.8270894e+00 4.0163858e+00 4.2028588e+00 5.4079977e+00 5.6075453e+00 3.7029588e+00 4.4113160e+00 3.6111044e+00 5.4066727e+00 3.6058057e+00 4.4062018e+00 4.7037812e+00 3.5065182e+00 3.6056307e+00 4.3065776e+00 4.5036239e+00 4.8058364e+00 5.1131156e+00 4.3088094e+00 3.8014142e+00 4.3005452e+00 4.8156922e+00 4.3151195e+00 4.2027764e+00 3.5064276e+00 4.1095026e+00 4.3155223e+00 3.8226872e+00 3.8062227e+00 4.6088777e+00 4.4178507e+00 3.9190516e+00 3.7073875e+00 3.9078043e+00 4.1144923e+00 3.8043348e+00 5.0043842e-01 3.0482299e-01 4.0246123e-01 8.0254500e-01 5.0043842e-01 5.2133802e-01 7.0556260e-01 2.0181667e-01 7.0008735e-01 3.0026460e-01 6.0948506e-01 2.0181667e-01 3.2490712e+00 3.0153168e+00 3.4297841e+00 2.5067523e+00 3.1166337e+00 3.0027816e+00 3.2112793e+00 1.8068048e+00 3.1183051e+00 2.4116924e+00 2.0138832e+00 2.7116615e+00 2.5059537e+00 3.2048192e+00 2.1144760e+00 2.9351753e+00 3.0063019e+00 2.6019122e+00 3.0106587e+00 2.4030297e+00 3.3125861e+00 2.5120719e+00 3.4068163e+00 3.2029877e+00 2.8162444e+00 2.9267417e+00 3.3252407e+00 3.5189464e+00 3.0077107e+00 2.0051350e+00 2.3037132e+00 2.2028146e+00 2.4058620e+00 3.6044981e+00 3.0062070e+00 3.0107283e+00 3.2237456e+00 2.9105093e+00 2.6052541e+00 2.5062865e+00 2.9018772e+00 3.1056084e+00 2.5048522e+00 1.8082911e+00 2.7043948e+00 2.7029415e+00 2.7046027e+00 2.8091099e+00 1.5248852e+00 2.6055127e+00 4.5209020e+00 3.6112573e+00 4.4212031e+00 4.1056541e+00 4.3138986e+00 5.1255338e+00 3.0133997e+00 4.8167235e+00 4.3081273e+00 4.6319211e+00 3.6205854e+00 3.8114965e+00 4.0212972e+00 3.5173798e+00 3.6449970e+00 3.8299342e+00 4.0081754e+00 5.2290121e+00 5.4254411e+00 3.5039202e+00 4.2264145e+00 3.4198378e+00 5.2270034e+00 3.4138008e+00 4.2149806e+00 4.5183778e+00 3.3145502e+00 3.4118179e+00 4.1129687e+00 4.3210760e+00 4.6261633e+00 4.9512603e+00 4.1165035e+00 3.6051692e+00 4.1014742e+00 4.6540056e+00 4.1257291e+00 4.0071257e+00 3.3129914e+00 3.9274863e+00 4.1301604e+00 3.6542046e+00 3.6112573e+00 4.4192311e+00 4.2328883e+00 3.7399948e+00 3.5155767e+00 3.7180846e+00 3.9250546e+00 3.6083191e+00 7.0470720e-01 6.3164977e-01 7.0000303e-01 2.0000000e-01 6.4049114e-01 8.7212232e-01 4.0004442e-01 8.5437440e-01 2.2573593e-01 9.3308853e-01 6.0184622e-01 3.5152865e+00 3.2379971e+00 3.6729302e+00 2.7052554e+00 3.3425813e+00 3.2040843e+00 3.4230889e+00 2.0021220e+00 3.3530528e+00 2.6055127e+00 2.2051638e+00 2.9154879e+00 2.7227228e+00 3.4118179e+00 2.3143923e+00 3.1902650e+00 3.2048191e+00 2.8089346e+00 3.2223766e+00 2.6060092e+00 3.5107904e+00 2.7333577e+00 3.6167495e+00 3.4109217e+00 3.0488339e+00 3.1712556e+00 3.5658221e+00 3.7426726e+00 3.2127498e+00 2.2186491e+00 2.5049231e+00 2.4052960e+00 2.6139440e+00 3.8063158e+00 3.2036084e+00 3.2143157e+00 3.4603347e+00 3.1318587e+00 2.8056557e+00 2.7050980e+00 3.1020681e+00 3.3136174e+00 2.7116685e+00 2.0027889e+00 2.9047842e+00 2.9057760e+00 2.9065359e+00 3.0276459e+00 1.7091578e+00 2.8077256e+00 4.7169309e+00 3.8081280e+00 4.6399369e+00 4.3088507e+00 4.5162248e+00 5.3501952e+00 3.2067991e+00 5.0370912e+00 4.5175831e+00 4.8468186e+00 3.8290678e+00 4.0170262e+00 4.2347722e+00 3.7111714e+00 3.8289857e+00 4.0283196e+00 4.2155430e+00 5.4550926e+00 5.6472422e+00 3.7064735e+00 4.4381718e+00 3.6121030e+00 5.4538016e+00 3.6205857e+00 4.4231445e+00 4.7408825e+00 3.5189464e+00 3.6135011e+00 4.3151164e+00 4.5490925e+00 4.8546830e+00 5.1966534e+00 4.3173271e+00 3.8129545e+00 4.3038527e+00 4.8962803e+00 4.3214438e+00 4.2123903e+00 3.5127693e+00 4.1469662e+00 4.3342207e+00 3.8751227e+00 3.8081280e+00 4.6262568e+00 4.4345825e+00 3.9485180e+00 3.7201181e+00 3.9257254e+00 4.1203162e+00 3.8072915e+00 2.0181667e-01 1.1055799e+00 7.0016860e-01 4.0006662e-01 4.5147187e-01 4.1212852e-01 4.0002221e-01 5.0043084e-01 3.0474106e-01 1.2085435e-01 3.2280983e+00 3.0080445e+00 3.4166801e+00 2.5073304e+00 3.1087541e+00 3.0016255e+00 3.2064005e+00 1.8128544e+00 3.1091921e+00 2.4076934e+00 2.0429861e+00 2.7070770e+00 2.5077793e+00 3.2025221e+00 2.1086021e+00 2.9185909e+00 3.0040552e+00 2.6009247e+00 3.0080768e+00 2.4028385e+00 3.3086417e+00 2.5058827e+00 3.4038679e+00 3.2013290e+00 2.8077473e+00 2.9137660e+00 3.3136458e+00 3.5107924e+00 3.0045274e+00 2.0036964e+00 2.3048725e+00 2.2049827e+00 2.4032211e+00 3.6028345e+00 3.0040403e+00 3.0066661e+00 3.2127504e+00 2.9065741e+00 2.6030847e+00 2.5048249e+00 2.9013288e+00 3.1029264e+00 2.5029614e+00 1.8201043e+00 2.7027522e+00 2.7015465e+00 2.7026433e+00 2.8042851e+00 1.5256523e+00 2.6032253e+00 4.5160443e+00 3.6080467e+00 4.4135519e+00 4.1035779e+00 4.3098000e+00 5.1168009e+00 3.0096881e+00 4.8103297e+00 4.3048676e+00 4.6223708e+00 3.6136097e+00 3.8074712e+00 4.0139003e+00 3.5128896e+00 3.6349183e+00 3.8220063e+00 4.0049433e+00 5.2194303e+00 5.4171979e+00 3.5033669e+00 4.2181241e+00 3.4145410e+00 5.2178541e+00 3.4088042e+00 4.2099019e+00 4.5111938e+00 3.3094784e+00 3.4078458e+00 4.1090316e+00 4.3126257e+00 4.6165627e+00 4.9348334e+00 4.1118265e+00 3.6027619e+00 4.1008192e+00 4.6366757e+00 4.1194553e+00 4.0043991e+00 3.3087928e+00 3.9177721e+00 4.1218428e+00 3.6374332e+00 3.6080467e+00 4.4133507e+00 4.2243717e+00 3.7282925e+00 3.5105217e+00 3.7119499e+00 3.9187675e+00 3.6057072e+00 1.2012865e+00 6.0184622e-01 3.3808272e-01 6.0184934e-01 5.0043084e-01 3.3818226e-01 4.1212852e-01 3.0922892e-01 2.0121983e-01 3.4273160e+00 3.2064011e+00 3.6161317e+00 2.7056828e+00 3.3075153e+00 3.2008118e+00 3.4044261e+00 2.0113827e+00 3.3090710e+00 2.6035236e+00 2.2398619e+00 2.9035670e+00 2.7083020e+00 3.4017079e+00 2.3034787e+00 3.1174706e+00 3.2019092e+00 2.8008297e+00 3.2066700e+00 2.6023240e+00 3.5046442e+00 2.7041827e+00 3.6031099e+00 3.4011658e+00 3.0071110e+00 3.1127326e+00 3.5134157e+00 3.7092355e+00 3.2025439e+00 2.2031052e+00 2.5042875e+00 2.4048325e+00 2.6019131e+00 3.8016620e+00 3.2018790e+00 3.2036084e+00 3.4118203e+00 3.1063566e+00 2.8013151e+00 2.7029498e+00 3.1008327e+00 3.3019518e+00 2.7019892e+00 2.0181988e+00 2.9013773e+00 2.9007142e+00 2.9012240e+00 3.0034647e+00 1.7168003e+00 2.8015399e+00 4.7103355e+00 3.8044833e+00 4.6117631e+00 4.3023732e+00 4.5065283e+00 5.3163061e+00 3.2051927e+00 5.0102923e+00 4.5041827e+00 4.8177760e+00 3.8091017e+00 4.0050028e+00 4.2105704e+00 3.7073402e+00 3.8208501e+00 4.0138272e+00 4.2036880e+00 5.4187310e+00 5.6164039e+00 3.7027275e+00 4.4135513e+00 3.6080195e+00 5.4177192e+00 3.6056365e+00 4.4072751e+00 4.7109359e+00 3.5056751e+00 3.6045028e+00 4.3058539e+00 4.5127175e+00 4.8161488e+00 5.1342237e+00 4.3075896e+00 3.8021528e+00 4.3006308e+00 4.8339900e+00 4.3122441e+00 4.2030792e+00 3.5048429e+00 4.1140184e+00 4.3148937e+00 3.8271256e+00 3.8044833e+00 4.6097143e+00 4.4165186e+00 3.9191998e+00 3.7067060e+00 3.9080455e+00 4.1114854e+00 3.8031381e+00 9.0000091e-01 1.2014191e+00 1.5025345e+00 7.0088477e-01 1.5012926e+00 9.0000136e-01 1.4092540e+00 1.0030724e+00 3.4932678e+00 3.2284356e+00 3.6579694e+00 2.7029237e+00 3.3320310e+00 3.2025221e+00 3.4171529e+00 2.0008116e+00 3.3407229e+00 2.6032740e+00 2.2005685e+00 2.9103582e+00 2.7153679e+00 3.4082220e+00 2.3087475e+00 3.1706684e+00 3.2030687e+00 2.8057704e+00 3.2157547e+00 2.6035236e+00 3.5075879e+00 2.7233837e+00 3.6121030e+00 3.4076329e+00 3.0364247e+00 3.1548602e+00 3.5517240e+00 3.7328844e+00 3.2086545e+00 2.2116271e+00 2.5026949e+00 2.4028972e+00 2.6089340e+00 3.8042764e+00 3.2022967e+00 3.2108192e+00 3.4468872e+00 3.1231713e+00 2.8035152e+00 2.7029238e+00 3.1011647e+00 3.3095196e+00 2.7074599e+00 2.0008921e+00 2.9028462e+00 2.9036791e+00 2.9040745e+00 3.0197997e+00 1.7043730e+00 2.8047771e+00 4.7130344e+00 3.8056232e+00 4.6318991e+00 4.3063824e+00 4.5121922e+00 5.3416858e+00 3.2045522e+00 5.0302179e+00 4.5134527e+00 4.8380714e+00 3.8218532e+00 4.0124930e+00 4.2269486e+00 3.7079008e+00 3.8220112e+00 4.0214147e+00 4.2115853e+00 5.4465234e+00 5.6393868e+00 3.7043105e+00 4.4299700e+00 3.6085945e+00 5.4449998e+00 3.6148636e+00 4.4178341e+00 4.7331065e+00 3.5134671e+00 3.6094821e+00 4.3111775e+00 4.5398308e+00 4.8449119e+00 5.1826640e+00 4.3129030e+00 3.8093617e+00 4.3026669e+00 4.8806417e+00 4.3164776e+00 4.2091204e+00 3.5088587e+00 4.1368711e+00 4.3264627e+00 3.8592376e+00 3.8056232e+00 4.6204067e+00 4.4269727e+00 3.9374314e+00 3.7145622e+00 3.9192263e+00 4.1154804e+00 3.8050056e+00 6.1288055e-01 7.7603846e-01 4.0127250e-01 7.4329414e-01 2.0061436e-01 9.0508712e-01 6.0000635e-01 3.5152864e+00 3.2379970e+00 3.6729302e+00 2.7058598e+00 3.3425838e+00 3.2040874e+00 3.4230885e+00 2.0034894e+00 3.3530533e+00 2.6055423e+00 2.2123846e+00 2.9154880e+00 2.7237438e+00 3.4118184e+00 2.3143951e+00 3.1902650e+00 3.2048192e+00 2.8089552e+00 3.2228316e+00 2.6061975e+00 3.5107904e+00 2.7333644e+00 3.6167885e+00 3.4109240e+00 3.0488346e+00 3.1712557e+00 3.5658240e+00 3.7426726e+00 3.2127504e+00 2.2188249e+00 2.5053901e+00 2.4058634e+00 2.6139732e+00 3.8063206e+00 3.2036085e+00 3.2143126e+00 3.4603347e+00 3.1321581e+00 2.8056558e+00 2.7052554e+00 3.1021033e+00 3.3136175e+00 2.7117356e+00 2.0053411e+00 2.9048017e+00 2.9057761e+00 2.9065368e+00 3.0276467e+00 1.7105814e+00 2.8077315e+00 4.7169308e+00 3.8081328e+00 4.6399369e+00 4.3088509e+00 4.5162248e+00 5.3501952e+00 3.2068686e+00 5.0370912e+00 4.5175965e+00 4.8468145e+00 3.8290678e+00 4.0170299e+00 4.2347722e+00 3.7112059e+00 3.8289870e+00 4.0283196e+00 4.2155430e+00 5.4550814e+00 5.6472442e+00 3.7067060e+00 4.4381718e+00 3.6121048e+00 5.4538018e+00 3.6205918e+00 4.4231444e+00 4.7408825e+00 3.5189484e+00 3.6135011e+00 4.3151171e+00 4.5490925e+00 4.8546834e+00 5.1966394e+00 4.3173279e+00 3.8129558e+00 4.3038600e+00 4.8962803e+00 4.3214431e+00 4.2123903e+00 3.5127694e+00 4.1469662e+00 4.3342207e+00 3.8751227e+00 3.8081328e+00 4.6262568e+00 4.4345823e+00 3.9485180e+00 3.7201522e+00 3.9257254e+00 4.1203153e+00 3.8072915e+00 3.4085233e-01 5.0517282e-01 4.1210927e-01 4.5847767e-01 4.1317535e-01 4.0243965e-01 3.1409605e+00 2.9078360e+00 3.3230621e+00 2.4077390e+00 3.0097979e+00 2.9003941e+00 3.1042002e+00 1.7227897e+00 3.0135090e+00 2.3017319e+00 1.9755996e+00 2.6019350e+00 2.4142039e+00 3.1015567e+00 2.0014192e+00 2.8264551e+00 2.9006366e+00 2.5011717e+00 2.9082658e+00 2.3033727e+00 3.2022157e+00 2.4051094e+00 3.3034165e+00 3.1014454e+00 2.7104802e+00 2.8188502e+00 3.2195779e+00 3.4112824e+00 2.9016560e+00 1.9053006e+00 2.2068965e+00 2.1085395e+00 2.3018945e+00 3.5009585e+00 2.9005880e+00 2.9020766e+00 3.1165913e+00 2.8092629e+00 2.5004154e+00 2.4029432e+00 2.8007533e+00 3.0017918e+00 2.4022355e+00 1.7369589e+00 2.6007937e+00 2.6003442e+00 2.6005344e+00 2.7044628e+00 1.4329832e+00 2.5008032e+00 4.4064393e+00 3.5021596e+00 4.3131639e+00 4.0016670e+00 4.2045223e+00 5.0200323e+00 2.9028411e+00 4.7130517e+00 4.2044861e+00 4.5172866e+00 3.5073617e+00 3.7038321e+00 3.9101623e+00 3.4039470e+00 3.5128093e+00 3.7092301e+00 3.9033549e+00 5.1227972e+00 5.3193887e+00 3.4029615e+00 4.1123595e+00 3.3040255e+00 5.1222477e+00 3.3043123e+00 4.1063328e+00 4.4139149e+00 3.2038047e+00 3.3025879e+00 4.0039164e+00 4.2170349e+00 4.5206139e+00 4.8441812e+00 4.0049702e+00 3.5022104e+00 4.0005674e+00 4.5418878e+00 4.0077003e+00 3.9024858e+00 3.2025221e+00 3.8146102e+00 4.0114630e+00 3.5261349e+00 3.5021596e+00 4.3081194e+00 4.1123594e+00 3.6158324e+00 3.4049076e+00 3.6064417e+00 3.8069566e+00 3.5014492e+00 8.0923926e-01 3.0474106e-01 6.5724028e-01 4.0246123e-01 5.6371422e-01 2.8500310e+00 2.6110761e+00 3.0277528e+00 2.1510447e+00 2.7141512e+00 2.6027937e+00 2.8070667e+00 1.5787180e+00 2.7167342e+00 2.0166118e+00 1.9318287e+00 2.3071806e+00 2.1715812e+00 2.8031215e+00 1.7145956e+00 2.5336675e+00 2.6035547e+00 2.2074446e+00 2.6319765e+00 2.0282636e+00 2.9076123e+00 2.1122780e+00 3.0080768e+00 2.8027924e+00 2.4144060e+00 2.5243969e+00 2.9241685e+00 3.1150226e+00 2.6049377e+00 1.6499744e+00 1.9530826e+00 1.8666228e+00 2.0130304e+00 3.2033374e+00 2.6035250e+00 2.6059866e+00 2.8207213e+00 2.5287261e+00 2.2032583e+00 2.1244184e+00 2.5066544e+00 2.7033232e+00 2.1157724e+00 1.6395342e+00 2.3072196e+00 2.3018945e+00 2.3035850e+00 2.4072314e+00 1.3788456e+00 2.2062031e+00 4.1150297e+00 3.2079717e+00 4.0170857e+00 3.7033716e+00 3.9093672e+00 4.7228082e+00 2.6158579e+00 4.4145659e+00 3.9067187e+00 4.2256164e+00 3.2143454e+00 3.4081069e+00 3.6159248e+00 3.1148584e+00 3.2358776e+00 3.4219579e+00 3.6052692e+00 4.8260874e+00 5.0225486e+00 3.1131211e+00 3.8201108e+00 3.0142352e+00 4.8248264e+00 3.0102191e+00 3.8104451e+00 4.1158426e+00 2.9100849e+00 3.0073054e+00 3.7087638e+00 3.9191144e+00 4.2237272e+00 4.5500784e+00 3.7114840e+00 3.2036323e+00 3.7015743e+00 4.2506870e+00 3.7186993e+00 3.6043148e+00 2.9081165e+00 3.5216379e+00 3.7226348e+00 3.2449757e+00 3.2079717e+00 4.0139105e+00 3.8249612e+00 3.3311289e+00 3.1134242e+00 3.3125194e+00 3.5179632e+00 3.2049019e+00 8.0051115e-01 2.2573593e-01 7.1621884e-01 3.0482299e-01 3.3530529e+00 3.1135637e+00 3.5317001e+00 2.6021962e+00 3.2157548e+00 3.1011640e+00 3.3083865e+00 1.9014069e+00 3.2199554e+00 2.5036852e+00 2.1054816e+00 2.8056557e+00 2.6057308e+00 3.3035252e+00 2.2049636e+00 3.0369970e+00 3.1023768e+00 2.7016498e+00 3.1076516e+00 2.5011992e+00 3.4059088e+00 2.6097152e+00 3.5056297e+00 3.3028597e+00 2.9166917e+00 3.0276459e+00 3.4273156e+00 3.6176286e+00 3.1043337e+00 2.1032882e+00 2.4011650e+00 2.3009622e+00 2.5032633e+00 3.7024058e+00 3.1022094e+00 3.1056121e+00 3.3243222e+00 3.0101957e+00 2.7018643e+00 2.6020065e+00 3.0005955e+00 3.2040843e+00 2.6027120e+00 1.9019962e+00 2.8015673e+00 2.8013346e+00 2.8018959e+00 2.9083044e+00 1.6052507e+00 2.7022567e+00 4.6121162e+00 3.7052383e+00 4.5194334e+00 4.2036849e+00 4.4088275e+00 5.2263180e+00 3.1053076e+00 4.9177739e+00 4.4072684e+00 4.7260117e+00 3.7138970e+00 3.9076272e+00 4.1167962e+00 3.6081590e+00 3.7238338e+00 3.9176170e+00 4.1063328e+00 5.3296625e+00 5.5255577e+00 3.6022190e+00 4.3201293e+00 3.5092121e+00 5.3285444e+00 3.5088064e+00 4.3111749e+00 4.6192198e+00 3.4084525e+00 3.5063337e+00 4.2079639e+00 4.4229098e+00 4.7273231e+00 5.0541259e+00 4.2099019e+00 3.7043105e+00 4.2011108e+00 4.7534769e+00 4.2147199e+00 4.1050714e+00 3.4064570e+00 4.0228303e+00 4.2200398e+00 3.7407842e+00 3.7052383e+00 4.5139612e+00 4.3214432e+00 3.8271242e+00 3.6094426e+00 3.8122429e+00 4.0138280e+00 3.7039439e+00 6.3178534e-01 2.0121983e-01 5.0043084e-01 3.1326249e+00 2.9095058e+00 3.3192760e+00 2.4306373e+00 3.0110559e+00 2.9028946e+00 3.1074604e+00 1.7872757e+00 3.0111989e+00 2.3143923e+00 2.0898615e+00 2.6089349e+00 2.4398792e+00 3.1033306e+00 2.0139907e+00 2.8220753e+00 2.9050462e+00 2.5045154e+00 2.9220490e+00 2.3159976e+00 3.2100379e+00 2.4095513e+00 3.3067017e+00 3.1022615e+00 2.7099669e+00 2.8165723e+00 3.2163877e+00 3.4125151e+00 2.9058641e+00 1.9245956e+00 2.2287984e+00 2.1344529e+00 2.3089795e+00 3.5039202e+00 2.9050287e+00 2.9078401e+00 3.1149135e+00 2.8183214e+00 2.5042875e+00 2.4160514e+00 2.8047612e+00 3.0036601e+00 2.4102273e+00 1.8223604e+00 2.6061038e+00 2.6023240e+00 2.6040822e+00 2.7058598e+00 1.5384093e+00 2.5058827e+00 4.4178532e+00 3.5098740e+00 4.3151587e+00 4.0041429e+00 4.2110099e+00 5.0184788e+00 2.9154880e+00 4.7114737e+00 4.2061525e+00 4.5248210e+00 3.5155767e+00 3.7089995e+00 3.9157422e+00 3.4167041e+00 3.5401921e+00 3.7249704e+00 3.9056466e+00 5.1213055e+00 5.3189433e+00 3.4098171e+00 4.1203252e+00 3.3172667e+00 5.1196436e+00 3.3110366e+00 4.1111102e+00 4.4124656e+00 3.2115770e+00 3.3091938e+00 4.0103680e+00 4.2141675e+00 4.5185015e+00 4.8383751e+00 4.0135080e+00 3.5035589e+00 4.0015001e+00 4.5406852e+00 4.0218666e+00 3.9049967e+00 3.2103515e+00 3.8201314e+00 4.0245707e+00 3.5427188e+00 3.5098740e+00 4.3149009e+00 4.1273075e+00 3.6322643e+00 3.4139979e+00 3.6137088e+00 3.8212216e+00 3.5066417e+00 7.1621748e-01 4.0002221e-01 3.3858048e+00 3.1257747e+00 3.5528332e+00 2.6049377e+00 3.2291581e+00 3.1026235e+00 3.3158954e+00 1.9043238e+00 3.2362541e+00 2.5062158e+00 2.1151984e+00 2.8111676e+00 2.6144115e+00 3.3074459e+00 2.2106051e+00 3.0644792e+00 3.1042002e+00 2.7046286e+00 3.1155579e+00 2.5035275e+00 3.4095576e+00 2.6210983e+00 3.5110555e+00 3.3064076e+00 2.9323802e+00 3.0497665e+00 3.4467650e+00 3.6304824e+00 3.1087162e+00 2.1099919e+00 2.4034951e+00 2.3034398e+00 2.5081992e+00 3.7045399e+00 3.1036554e+00 3.1105454e+00 3.3425812e+00 3.0208515e+00 2.7039990e+00 2.6042124e+00 3.0014077e+00 3.2086215e+00 2.6068616e+00 1.9064532e+00 2.8033825e+00 2.8033607e+00 2.8042643e+00 2.9174390e+00 1.6121856e+00 2.7050791e+00 4.6165570e+00 3.7079065e+00 4.5303834e+00 4.2064764e+00 4.4135512e+00 5.2388103e+00 3.1079784e+00 4.9275471e+00 4.4124760e+00 4.7382279e+00 3.7227931e+00 3.9129335e+00 4.1268500e+00 3.6117351e+00 3.7315577e+00 3.9257254e+00 4.1111068e+00 5.3430927e+00 5.5370582e+00 3.6046347e+00 4.3307527e+00 3.5130597e+00 5.3416790e+00 3.5154388e+00 4.3179254e+00 4.6302391e+00 3.4146546e+00 3.5107904e+00 4.2125004e+00 4.4361489e+00 4.7415152e+00 5.0768435e+00 4.2149814e+00 3.7084460e+00 4.2023583e+00 4.7769945e+00 4.2205945e+00 4.1089343e+00 3.4107328e+00 4.0362383e+00 4.2295174e+00 3.7618281e+00 3.7079065e+00 4.5213131e+00 4.3307527e+00 3.8409517e+00 3.6158715e+00 3.8200965e+00 4.0195882e+00 3.7063858e+00 4.1210927e-01 3.2157661e+00 3.0055754e+00 3.4095823e+00 2.5182899e+00 3.1060146e+00 3.0020171e+00 3.2051958e+00 1.8468437e+00 3.1049591e+00 2.4099079e+00 2.1180305e+00 2.7069308e+00 2.5226256e+00 3.2022186e+00 2.1097489e+00 2.9102819e+00 3.0041469e+00 2.6022650e+00 3.0136614e+00 2.4087525e+00 3.3085287e+00 2.5053901e+00 3.4040883e+00 3.2011770e+00 2.8045980e+00 2.9078384e+00 3.3077457e+00 3.5074140e+00 3.0043867e+00 2.0123013e+00 2.3159429e+00 2.2186309e+00 2.4051787e+00 3.6030023e+00 3.0041461e+00 3.0063027e+00 3.2075252e+00 2.9100849e+00 2.6032671e+00 2.5097006e+00 2.9028412e+00 3.1024718e+00 2.5058120e+00 1.8685011e+00 2.7040002e+00 2.7016556e+00 2.7029487e+00 2.8031364e+00 1.5747356e+00 2.6040007e+00 4.5158117e+00 3.6083256e+00 4.4100325e+00 4.1032589e+00 4.3091726e+00 5.1114855e+00 3.0117223e+00 4.8065772e+00 4.3039464e+00 4.6187506e+00 3.6121095e+00 3.8069169e+00 4.0114753e+00 3.5138377e+00 3.6350529e+00 3.8212252e+00 4.0040508e+00 5.2135438e+00 5.4123528e+00 3.5063866e+00 4.2155461e+00 3.4147661e+00 5.2119900e+00 3.4083227e+00 4.2084707e+00 4.5071259e+00 3.3090897e+00 3.4075560e+00 4.1085724e+00 4.3075896e+00 4.6108642e+00 4.9236635e+00 4.1113689e+00 3.6022523e+00 4.1009647e+00 4.6262707e+00 4.1190929e+00 4.0037820e+00 3.3086298e+00 3.9141023e+00 4.1202674e+00 3.6321858e+00 3.6083256e+00 4.4117993e+00 4.2229640e+00 3.7257625e+00 3.5107118e+00 3.7106642e+00 3.9184747e+00 3.6056703e+00 3.3320214e+00 3.1087156e+00 3.5191298e+00 2.6048201e+00 3.2097208e+00 3.1014199e+00 3.3064692e+00 1.9064149e+00 3.2109426e+00 2.5061784e+00 2.1231492e+00 2.8062729e+00 2.6052659e+00 3.3025806e+00 2.2069764e+00 3.0213628e+00 3.1034889e+00 2.7008785e+00 3.1069083e+00 2.5018386e+00 3.4076243e+00 2.6061038e+00 3.5039680e+00 3.3015400e+00 2.9090661e+00 3.0158419e+00 3.4158824e+00 3.6117739e+00 3.1042038e+00 2.1025721e+00 2.4028385e+00 2.3026344e+00 2.5028039e+00 3.7026090e+00 3.1034538e+00 3.1060427e+00 3.3145497e+00 3.0064351e+00 2.7026184e+00 2.6035547e+00 3.0010106e+00 3.2029877e+00 2.6024546e+00 1.9099608e+00 2.8022622e+00 2.8013859e+00 2.8022964e+00 2.9047883e+00 1.6144390e+00 2.7027522e+00 4.6146429e+00 3.7070840e+00 4.5144445e+00 4.2034836e+00 4.4092638e+00 5.2185417e+00 3.1080879e+00 4.9117250e+00 4.4052231e+00 4.7224998e+00 3.7130492e+00 3.9071930e+00 4.1140176e+00 3.6112039e+00 3.7307535e+00 3.9200662e+00 4.1050716e+00 5.3212806e+00 5.5187164e+00 3.6026912e+00 4.3179254e+00 3.5126721e+00 5.3198415e+00 3.5083463e+00 4.3098506e+00 4.6126508e+00 3.4087523e+00 3.5071392e+00 4.2084730e+00 4.4144909e+00 4.7184838e+00 5.0381916e+00 4.2109654e+00 3.7029588e+00 4.2008334e+00 4.7393168e+00 4.2176488e+00 4.1043916e+00 3.4078439e+00 4.0181863e+00 4.2205945e+00 3.7363783e+00 3.7070840e+00 4.5130589e+00 4.3227927e+00 3.8267268e+00 3.6097220e+00 3.8114954e+00 4.0168944e+00 3.7050916e+00 6.0017982e-01 2.0181667e-01 1.5160570e+00 5.2133802e-01 1.3002451e+00 7.0008584e-01 2.1344529e+00 4.1212852e-01 1.8029854e+00 2.0342311e+00 1.1019599e+00 1.1393620e+00 9.0026497e-01 1.4543172e+00 3.3813251e-01 1.4000061e+00 1.2053003e+00 1.0426638e+00 1.4134492e+00 1.1005364e+00 9.3424697e-01 7.8890806e-01 9.0142636e-01 6.1119558e-01 4.1315633e-01 4.0125062e-01 3.6452132e-01 1.0001753e+00 1.4158897e+00 1.5195166e+00 1.5300146e+00 1.2201636e+00 1.0039209e+00 1.6000032e+00 1.0000457e+00 3.0017653e-01 9.3329055e-01 1.4017696e+00 1.5061610e+00 1.5012947e+00 9.0002570e-01 1.2124837e+00 2.0445123e+00 1.4012283e+00 1.3008855e+00 1.3009222e+00 8.0291749e-01 2.0440118e+00 1.3027556e+00 1.3788457e+00 1.2029161e+00 1.2089253e+00 9.3446811e-01 1.1298636e+00 1.9014076e+00 2.1006232e+00 1.6001224e+00 1.1139906e+00 1.4544336e+00 6.3912709e-01 7.1183012e-01 8.5409862e-01 1.3086191e+00 1.2638465e+00 9.2745734e-01 8.1117067e-01 2.0027889e+00 2.2028146e+00 1.1270327e+00 1.0776190e+00 1.4019372e+00 2.0011307e+00 7.2044167e-01 1.0208709e+00 1.3002450e+00 8.0488008e-01 9.0145141e-01 9.4622126e-01 1.1000289e+00 1.4009513e+00 1.7086186e+00 9.7694377e-01 7.0911112e-01 1.0224133e+00 1.4220925e+00 1.0923537e+00 8.2631334e-01 1.0008620e+00 7.8886139e-01 1.0777307e+00 9.0140221e-01 1.2029161e+00 1.2362755e+00 1.1897289e+00 9.0534502e-01 7.9871893e-01 6.5724028e-01 9.8998705e-01 1.1010807e+00 5.2133179e-01 1.0171340e+00 4.0004442e-01 7.0470720e-01 2.0181667e-01 1.5698091e+00 3.0922892e-01 1.2049541e+00 1.5104875e+00 5.0476836e-01 1.0069214e+00 3.4085233e-01 9.6593231e-01 3.0026460e-01 8.0004443e-01 6.6334810e-01 1.0000152e+00 8.7372177e-01 5.0855077e-01 5.2524663e-01 7.0462697e-01 4.2362917e-01 3.0915245e-01 2.2608083e-01 4.5784410e-01 5.0517282e-01 4.1209001e-01 1.0313359e+00 9.9085945e-01 1.0179856e+00 6.9600743e-01 6.3912943e-01 1.0000152e+00 4.0125062e-01 3.0482299e-01 9.0002615e-01 8.0254500e-01 9.3735629e-01 9.1446938e-01 3.0490481e-01 6.9600743e-01 1.4994060e+00 8.0928056e-01 7.0184453e-01 7.0184453e-01 3.1328089e-01 1.5989637e+00 7.0918894e-01 1.5237054e+00 6.9987517e-01 1.4060443e+00 1.1002025e+00 1.3061181e+00 2.1141220e+00 1.5030978e+00 1.8055480e+00 1.3062025e+00 1.6223413e+00 6.3164977e-01 8.1112909e-01 1.0095513e+00 8.0713433e-01 9.2867113e-01 9.0155393e-01 1.0001753e+00 2.2182690e+00 2.4124980e+00 1.0039060e+00 1.2201577e+00 8.1343016e-01 2.2176846e+00 5.2491734e-01 1.2037520e+00 1.5066999e+00 4.2362917e-01 4.2362917e-01 1.1060937e+00 1.3130978e+00 1.6177611e+00 1.9760242e+00 1.1138953e+00 6.0948506e-01 1.1056693e+00 1.6779798e+00 1.1527746e+00 1.0001601e+00 4.2362917e-01 9.1892454e-01 1.1528477e+00 8.3183672e-01 6.9987517e-01 1.4094144e+00 1.2633467e+00 8.5440680e-01 7.2036951e-01 7.1629303e-01 9.6576136e-01 6.3322667e-01 1.4267554e+00 4.2268438e-01 1.2004262e+00 6.0035621e-01 2.0860325e+00 3.4342562e-01 1.7133162e+00 1.9641993e+00 1.0207260e+00 1.0897469e+00 8.0008964e-01 1.4650300e+00 5.0043084e-01 1.3002407e+00 1.1303267e+00 9.3424659e-01 1.3473688e+00 1.0001604e+00 9.6593231e-01 6.7616545e-01 8.0097499e-01 6.3192325e-01 5.0437695e-01 3.0026460e-01 2.2608083e-01 9.0142636e-01 1.4861824e+00 1.4580174e+00 1.4889602e+00 1.1900969e+00 9.0142681e-01 1.5001212e+00 9.0166476e-01 2.2538848e-01 8.3187290e-01 1.3130978e+00 1.4197078e+00 1.4012600e+00 8.0046764e-01 1.1544060e+00 2.0075255e+00 1.3063533e+00 1.2089835e+00 1.2089313e+00 7.4275547e-01 2.0887699e+00 1.2190319e+00 1.1935069e+00 1.1010807e+00 1.0087396e+00 7.4335736e-01 9.3424697e-01 1.7023957e+00 2.0003507e+00 1.4002035e+00 9.1449234e-01 1.2643523e+00 5.2167829e-01 5.5450500e-01 6.7616902e-01 1.2049541e+00 1.1528553e+00 8.1112984e-01 6.1119558e-01 1.8053679e+00 2.0034894e+00 1.0142484e+00 9.0155438e-01 1.3009222e+00 1.8029948e+00 6.1119267e-01 8.2425704e-01 1.1002025e+00 7.0176271e-01 8.0046685e-01 7.5564478e-01 9.0026588e-01 1.2017042e+00 1.5269837e+00 7.9871893e-01 6.0201716e-01 8.6051471e-01 1.2366099e+00 9.4532171e-01 6.3309012e-01 9.0026588e-01 6.3164729e-01 9.3308853e-01 8.0004443e-01 1.1010807e+00 1.0426516e+00 1.0426760e+00 8.0051115e-01 6.8161057e-01 5.2491734e-01 8.6084272e-01 1.0001753e+00 1.0116865e+00 5.6370994e-01 1.0599087e+00 7.4329527e-01 1.1110092e+00 4.1212852e-01 5.6838732e-01 7.0478886e-01 5.0436965e-01 7.7598796e-01 6.0948506e-01 1.2192920e+00 7.1629303e-01 4.2270142e-01 7.1629303e-01 2.2608083e-01 9.7033357e-01 6.3164729e-01 9.6576136e-01 7.5503094e-01 9.1446896e-01 1.1138955e+00 1.3139296e+00 1.2705641e+00 6.5724028e-01 5.0894102e-01 2.2573593e-01 3.3813251e-01 4.1212852e-01 1.1025819e+00 7.1629303e-01 1.1039833e+00 1.2272550e+00 8.0245746e-01 7.0000303e-01 2.0000000e-01 4.1210927e-01 7.7598796e-01 3.3813251e-01 7.1700774e-01 4.0125062e-01 7.0017011e-01 6.0035305e-01 7.4329414e-01 1.0008768e+00 5.0043084e-01 2.0249458e+00 1.1061923e+00 2.0081838e+00 1.6061519e+00 1.8167511e+00 2.7171724e+00 6.3925756e-01 2.3875202e+00 1.8286180e+00 2.2239101e+00 1.2353587e+00 1.3278587e+00 1.6038059e+00 1.0207533e+00 1.2407946e+00 1.3868868e+00 1.5269837e+00 2.8396169e+00 2.9941208e+00 1.0030871e+00 1.8005082e+00 9.3733589e-01 2.8269381e+00 9.7033357e-01 1.7520952e+00 2.1193712e+00 8.6676847e-01 9.4912864e-01 1.6147493e+00 1.9768316e+00 2.2674825e+00 2.7199050e+00 1.6193612e+00 1.1298636e+00 1.6009488e+00 2.4288142e+00 1.6617386e+00 1.5199103e+00 8.6676847e-01 1.5881447e+00 1.6785116e+00 1.4886759e+00 1.1061923e+00 1.9457481e+00 1.7813291e+00 1.3946348e+00 1.0498347e+00 1.2771155e+00 1.4848797e+00 1.1157320e+00 8.0004523e-01 5.0043842e-01 1.6743483e+00 2.0121983e-01 1.3061139e+00 1.5464046e+00 6.0964597e-01 7.1183012e-01 4.0006662e-01 1.0776296e+00 3.0922892e-01 9.0002570e-01 7.3084171e-01 6.0184622e-01 9.3446811e-01 6.1135434e-01 6.0964597e-01 3.4080442e-01 4.1210927e-01 3.0490481e-01 2.2608083e-01 3.0482299e-01 4.0363334e-01 5.0001522e-01 1.1298636e+00 1.0440350e+00 1.0803561e+00 7.8935898e-01 5.6347978e-01 1.1000098e+00 6.3165225e-01 3.0482299e-01 5.0126466e-01 9.0511169e-01 1.0088926e+00 1.0001903e+00 4.0125062e-01 7.4335736e-01 1.5972311e+00 9.0142681e-01 8.0296037e-01 8.0250202e-01 3.4085233e-01 1.7081446e+00 8.0883841e-01 1.4329858e+00 7.2036951e-01 1.3050153e+00 1.0001753e+00 1.2089252e+00 2.0109333e+00 1.6000184e+00 1.7036944e+00 1.2001396e+00 1.5327217e+00 5.7608844e-01 7.0462844e-01 9.1449234e-01 8.1156529e-01 9.3733552e-01 8.5583415e-01 9.0029018e-01 2.1191883e+00 2.3098756e+00 6.3912709e-01 1.1290757e+00 9.0532049e-01 2.1139617e+00 3.4085233e-01 1.1074834e+00 1.4044980e+00 3.4080442e-01 4.2362917e-01 1.0087250e+00 1.2089253e+00 1.5132032e+00 1.8748226e+00 1.0207260e+00 5.0042326e-01 1.0008620e+00 1.5694554e+00 1.0837679e+00 9.0053003e-01 5.0517282e-01 8.2671175e-01 1.0777411e+00 8.1156529e-01 7.2036951e-01 1.3133662e+00 1.1910068e+00 8.2425704e-01 4.5847767e-01 6.3178534e-01 9.1590889e-01 6.3322667e-01 6.3322667e-01 1.2193537e+00 9.0000091e-01 6.3165225e-01 1.0599087e+00 3.1328089e-01 6.3451734e-01 4.0127250e-01 9.0000091e-01 1.0001604e+00 2.2573593e-01 4.1212852e-01 6.3178534e-01 6.0202028e-01 5.2524663e-01 5.2132556e-01 6.1135434e-01 4.0125062e-01 7.0008584e-01 9.0002615e-01 1.1001014e+00 1.0039209e+00 3.0482299e-01 1.0001751e+00 7.0478886e-01 8.0296037e-01 6.0000952e-01 6.0366256e-01 3.0915245e-01 6.0365948e-01 1.0001903e+00 6.3164977e-01 4.0125062e-01 5.0476836e-01 2.2608083e-01 4.0127250e-01 5.0043842e-01 1.2102248e+00 3.0017653e-01 3.0482299e-01 3.0008832e-01 5.0043084e-01 1.5012947e+00 4.0000000e-01 1.5653766e+00 6.7616902e-01 1.5829749e+00 1.1074742e+00 1.3373141e+00 2.2681751e+00 8.0291671e-01 1.9315820e+00 1.3458100e+00 1.7862938e+00 8.7372177e-01 8.7209348e-01 1.2093969e+00 7.1700774e-01 1.1055705e+00 1.0604287e+00 1.0451812e+00 2.3834499e+00 2.5286011e+00 6.3322667e-01 1.3903623e+00 7.0462697e-01 2.3796582e+00 6.3912943e-01 1.2792049e+00 1.6907308e+00 5.6595488e-01 5.3943256e-01 1.1400339e+00 1.5965952e+00 1.8639835e+00 2.3424496e+00 1.1635325e+00 6.7626502e-01 1.1005460e+00 2.0903382e+00 1.2459141e+00 1.0236548e+00 5.0894102e-01 1.2528590e+00 1.2949162e+00 1.2662318e+00 6.7616902e-01 1.4817248e+00 1.3908238e+00 1.1389163e+00 6.9600743e-01 8.9540816e-01 1.0858512e+00 6.3192325e-01 1.5890088e+00 4.2270142e-01 1.1330776e+00 1.5368468e+00 5.2491734e-01 1.1187430e+00 4.0243965e-01 1.1139906e+00 4.1420960e-01 7.0096858e-01 7.3895268e-01 1.1000100e+00 9.3861512e-01 4.0127250e-01 7.1708289e-01 8.0004523e-01 5.2167208e-01 4.5784410e-01 3.6452132e-01 5.6371422e-01 4.2270142e-01 4.1317535e-01 1.2159868e+00 1.0567817e+00 1.1138092e+00 8.3387677e-01 6.1119267e-01 9.0029064e-01 3.0482299e-01 4.0125062e-01 1.0003196e+00 7.4395693e-01 9.3459651e-01 8.5617086e-01 3.0922892e-01 8.0073117e-01 1.5493206e+00 7.5564478e-01 6.4049114e-01 6.4049114e-01 4.5784410e-01 1.7404389e+00 6.9600743e-01 1.3253457e+00 6.4049114e-01 1.2202193e+00 9.0142636e-01 1.1056785e+00 1.9348400e+00 1.4092540e+00 1.6176783e+00 1.1286101e+00 1.4350761e+00 4.5148429e-01 6.7720957e-01 8.1757693e-01 8.2671175e-01 8.1937731e-01 7.4263078e-01 8.0055465e-01 2.0418418e+00 2.2277117e+00 1.1002025e+00 1.0286508e+00 7.2044167e-01 2.0415798e+00 6.0035305e-01 1.0039060e+00 1.3253497e+00 5.0043842e-01 3.1328089e-01 9.0999313e-01 1.1528476e+00 1.4548293e+00 1.8637334e+00 9.1892454e-01 5.2133179e-01 9.3310976e-01 1.5801693e+00 9.6572569e-01 8.0008964e-01 3.4085233e-01 7.5508853e-01 9.6674360e-01 7.4618926e-01 6.4049114e-01 1.2101609e+00 1.0782105e+00 7.2113820e-01 8.0093081e-01 5.2524663e-01 7.8886139e-01 4.5847767e-01 1.7572657e+00 6.1288055e-01 4.0125062e-01 1.0858512e+00 1.1133984e+00 1.4858469e+00 7.1779518e-01 1.8187119e+00 1.2137020e+00 9.6591433e-01 1.4146346e+00 7.4263078e-01 1.5359852e+00 1.2093243e+00 1.7083042e+00 1.4853863e+00 1.5241361e+00 1.7234436e+00 1.9756319e+00 1.9771636e+00 1.3035495e+00 8.0008884e-01 6.3164977e-01 6.0948212e-01 9.1449234e-01 1.8179429e+00 1.2062153e+00 1.3486924e+00 1.8673780e+00 1.4543172e+00 8.7240114e-01 7.4329527e-01 1.1055892e+00 1.4158897e+00 9.3310976e-01 1.1269424e-01 9.3351278e-01 9.7600992e-01 9.6953662e-01 1.3458100e+00 3.0490481e-01 9.0320459e-01 2.7259033e+00 1.8109877e+00 2.7506971e+00 2.3226569e+00 2.5372438e+00 3.4590995e+00 1.2089192e+00 3.1281646e+00 2.5610212e+00 2.9500632e+00 1.9406671e+00 2.0633570e+00 2.3443688e+00 1.7168003e+00 1.8708330e+00 2.0857354e+00 2.2573821e+00 3.5725062e+00 3.7336869e+00 1.7229558e+00 2.5362836e+00 1.6198349e+00 3.5690915e+00 1.7116793e+00 2.4776152e+00 2.8599555e+00 1.6016303e+00 1.6534235e+00 2.3372717e+00 2.7159844e+00 3.0094888e+00 3.4430661e+00 2.3406025e+00 1.8663319e+00 2.3090404e+00 3.1586433e+00 2.3454995e+00 2.2408459e+00 1.5471213e+00 2.3192230e+00 2.4059451e+00 2.1751377e+00 1.8109877e+00 2.6757243e+00 2.4966678e+00 2.1111734e+00 1.7901165e+00 2.0121175e+00 2.1471399e+00 1.8133657e+00 1.4043036e+00 1.6388784e+00 7.0470867e-01 7.7652636e-01 5.0001522e-01 1.1269424e+00 2.2608083e-01 1.0000158e+00 8.0928056e-01 7.0470867e-01 1.0215068e+00 7.1708289e-01 6.3164977e-01 4.2362917e-01 5.0002283e-01 3.0474106e-01 2.0121983e-01 2.2608083e-01 4.5080200e-01 6.0017982e-01 1.1529284e+00 1.1298636e+00 1.1544060e+00 8.5406674e-01 6.3322667e-01 1.2000066e+00 6.3309258e-01 2.2608083e-01 6.0201716e-01 1.0030721e+00 1.1060937e+00 1.1001110e+00 5.0001522e-01 8.2458478e-01 1.6747799e+00 1.0008617e+00 9.0140221e-01 9.0140131e-01 4.1209001e-01 1.7511598e+00 9.0506299e-01 1.4854079e+00 8.3187290e-01 1.3139296e+00 1.0032293e+00 1.2362702e+00 2.0078120e+00 1.7001329e+00 1.7019430e+00 1.2016381e+00 1.5675442e+00 7.1700909e-01 7.4275547e-01 9.6574369e-01 9.3541878e-01 1.1298552e+00 1.0208844e+00 9.0506343e-01 2.1136134e+00 2.3085898e+00 7.4618926e-01 1.1897982e+00 1.0208709e+00 2.1090362e+00 5.0894102e-01 1.1286018e+00 1.4024091e+00 5.2167829e-01 5.6595908e-01 1.0426638e+00 1.2037520e+00 1.5079206e+00 1.8503663e+00 1.0776296e+00 5.0477564e-01 1.0032296e+00 1.5611241e+00 1.1910693e+00 9.0511169e-01 6.3178782e-01 9.0184172e-01 1.1896660e+00 1.0032443e+00 8.3187290e-01 1.3450688e+00 1.3020492e+00 1.0087252e+00 6.1990228e-01 7.4263078e-01 1.0458540e+00 7.3084171e-01 7.0918894e-01 7.0176271e-01 8.1112984e-01 9.6574336e-01 4.1317535e-01 1.5005626e+00 6.1119558e-01 6.0964597e-01 1.0116724e+00 4.1315633e-01 9.3848935e-01 9.0000136e-01 1.1896660e+00 9.6574369e-01 1.2003597e+00 1.4006465e+00 1.6096629e+00 1.5401713e+00 8.2421923e-01 5.3914287e-01 3.6259865e-01 4.2362917e-01 6.0017665e-01 1.2189701e+00 6.0202028e-01 8.7212232e-01 1.5067961e+00 1.1024820e+00 4.1317535e-01 3.0490481e-01 5.0477564e-01 9.3329017e-01 6.0018299e-01 6.1845783e-01 4.1210927e-01 5.0894102e-01 5.0477564e-01 1.0008620e+00 9.0029064e-01 5.0043842e-01 2.1169442e+00 1.2049539e+00 2.2014913e+00 1.7227908e+00 1.9366943e+00 2.8973091e+00 6.0383105e-01 2.5621105e+00 1.9756002e+00 2.3854144e+00 1.4163126e+00 1.4857201e+00 1.8044011e+00 1.1074834e+00 1.2661803e+00 1.4994060e+00 1.6741010e+00 3.0107625e+00 3.1586112e+00 1.1298552e+00 1.9796588e+00 1.0095370e+00 3.0090568e+00 1.1900276e+00 1.8963668e+00 2.3135911e+00 1.0782107e+00 1.0783219e+00 1.7384347e+00 2.2009981e+00 2.4793129e+00 2.9421182e+00 1.7402224e+00 1.3018103e+00 1.7072540e+00 2.6745468e+00 1.7367211e+00 1.6485141e+00 9.6691372e-01 1.8209763e+00 1.8293641e+00 1.7435092e+00 1.2049539e+00 2.0881329e+00 1.9090398e+00 1.6063540e+00 1.2407432e+00 1.4664722e+00 1.5386307e+00 1.2093243e+00 1.0943600e+00 1.0030868e+00 1.3272142e+00 9.1446938e-01 1.7295996e+00 1.1336109e+00 8.7209296e-01 1.2643054e+00 6.3912943e-01 1.4396100e+00 1.1299441e+00 1.5271597e+00 1.3148232e+00 1.4267817e+00 1.6268514e+00 1.8468437e+00 1.8305154e+00 1.1759988e+00 7.4262850e-01 5.2491734e-01 5.2167208e-01 8.5586571e-01 1.6206300e+00 1.1291536e+00 1.4631182e+00 1.7576822e+00 1.3254284e+00 1.0172489e+00 6.0605366e-01 9.1894698e-01 1.2951152e+00 8.3187290e-01 3.0474106e-01 8.1500329e-01 1.0396215e+00 9.6150595e-01 1.2528590e+00 5.6347978e-01 8.7240114e-01 2.5401214e+00 1.6166178e+00 2.5672376e+00 2.1256636e+00 2.3434890e+00 3.2706021e+00 1.0235120e+00 2.9379053e+00 2.3650373e+00 2.7819820e+00 1.7939428e+00 1.8718670e+00 2.1669217e+00 1.5269837e+00 1.7152309e+00 1.9257519e+00 2.0672316e+00 3.3962101e+00 3.5413320e+00 1.5241169e+00 2.3604685e+00 1.4422764e+00 3.3805191e+00 1.5352907e+00 2.2985560e+00 2.6785349e+00 1.4314424e+00 1.4886759e+00 2.1422340e+00 2.5406863e+00 2.8290490e+00 3.2861997e+00 2.1472832e+00 1.6782365e+00 2.1087015e+00 2.9939447e+00 2.1830772e+00 2.0525906e+00 1.3935744e+00 2.1564350e+00 2.2287876e+00 2.0426476e+00 1.6166178e+00 2.4889554e+00 2.3256006e+00 1.9561612e+00 1.6066555e+00 1.8386981e+00 2.0009986e+00 1.6313110e+00 8.0883916e-01 5.0043842e-01 6.0202028e-01 8.0004602e-01 3.3808272e-01 5.0437695e-01 8.0093081e-01 5.2838320e-01 6.0201716e-01 2.5399984e-01 7.2036819e-01 5.0517282e-01 5.0043842e-01 7.0008584e-01 9.1424701e-01 9.0157896e-01 3.0017653e-01 7.2044167e-01 6.2656178e-01 6.6334810e-01 3.6259865e-01 9.0026588e-01 5.0436235e-01 4.1212852e-01 8.0879701e-01 7.0478886e-01 3.0482299e-01 5.2201750e-01 4.5847767e-01 4.0125062e-01 4.1317535e-01 1.0363096e+00 3.4080442e-01 3.0474106e-01 2.2573593e-01 3.0490481e-01 1.2204839e+00 2.4195741e-01 1.8101835e+00 9.0166476e-01 1.7375279e+00 1.4002005e+00 1.6032003e+00 2.4532171e+00 1.0032443e+00 2.1331916e+00 1.6052507e+00 1.9422649e+00 9.1894698e-01 1.1025819e+00 1.3276411e+00 8.1719606e-01 1.0142626e+00 1.1298636e+00 1.3025621e+00 2.5612597e+00 2.7430487e+00 9.0155438e-01 1.5299064e+00 7.1708289e-01 2.5605373e+00 7.0633229e-01 1.5079428e+00 1.8443132e+00 6.0383105e-01 7.0096708e-01 1.4023806e+00 1.6740160e+00 1.9756002e+00 2.3801033e+00 1.4049093e+00 9.0142636e-01 1.4001717e+00 2.0898615e+00 1.4183606e+00 1.3009222e+00 6.0184622e-01 1.2661803e+00 1.4267527e+00 1.1084368e+00 9.0166476e-01 1.7108631e+00 1.5299252e+00 1.0782751e+00 8.1343016e-01 1.0116721e+00 1.2193537e+00 9.0026497e-01 7.9148746e-01 7.0993998e-01 9.3541878e-01 8.1937731e-01 5.0043084e-01 5.6370994e-01 4.1212852e-01 1.0782753e+00 6.0184622e-01 9.0557807e-01 7.4269314e-01 7.0633229e-01 8.2841920e-01 9.1695534e-01 1.0756891e+00 7.3084048e-01 5.2491131e-01 5.0085236e-01 5.0476836e-01 5.0085236e-01 1.1074740e+00 8.3916809e-01 1.2049539e+00 9.6501813e-01 4.2270142e-01 8.0291749e-01 5.0855077e-01 5.3943256e-01 8.2631334e-01 4.0243965e-01 1.0207260e+00 5.2524663e-01 8.0055465e-01 7.0184453e-01 7.0184453e-01 1.0777307e+00 6.0366256e-01 2.0696799e+00 1.1543334e+00 1.9286352e+00 1.6071727e+00 1.8312163e+00 2.6295459e+00 1.1153247e+00 2.3155068e+00 1.8040969e+00 2.1901871e+00 1.2562955e+00 1.3263639e+00 1.5518083e+00 1.1271226e+00 1.4557657e+00 1.4915559e+00 1.5136393e+00 2.7555974e+00 2.9267466e+00 1.0030718e+00 1.7744103e+00 1.0843333e+00 2.7324083e+00 9.6953662e-01 1.7456060e+00 2.0249458e+00 9.1568820e-01 1.0151258e+00 1.6309461e+00 1.8315348e+00 2.1358791e+00 2.5304748e+00 1.6492450e+00 1.1075720e+00 1.6001777e+00 2.2141198e+00 1.7441970e+00 1.5196090e+00 9.6683480e-01 1.4838225e+00 1.7167914e+00 1.4122282e+00 1.1543334e+00 1.9438463e+00 1.8374400e+00 1.4268530e+00 1.0778421e+00 1.2792049e+00 1.5857302e+00 1.1532421e+00 1.1019503e+00 6.0201716e-01 5.0043842e-01 6.1135434e-01 7.0008735e-01 8.1156529e-01 4.1317535e-01 7.0000303e-01 4.0246123e-01 2.0061436e-01 4.1210927e-01 5.0436965e-01 7.0000303e-01 6.0366256e-01 2.0121983e-01 1.2007726e+00 9.1916394e-01 1.0124729e+00 8.0055465e-01 4.0246123e-01 7.0008735e-01 5.0085236e-01 6.0017982e-01 6.0202028e-01 6.3165225e-01 7.4612830e-01 6.0383105e-01 1.1269424e-01 7.0184453e-01 1.4559030e+00 5.6371422e-01 5.2167829e-01 5.2133179e-01 4.0004442e-01 1.7133283e+00 6.0948800e-01 1.3743342e+00 5.2524663e-01 1.2702954e+00 9.0142636e-01 1.1286018e+00 1.9763960e+00 1.2004262e+00 1.6484371e+00 1.1066159e+00 1.5033966e+00 6.1990228e-01 6.3322667e-01 8.9538275e-01 6.1990228e-01 1.0010060e+00 9.1471442e-01 8.0488008e-01 2.0894199e+00 2.2581358e+00 7.0088627e-01 1.1085342e+00 6.3178782e-01 2.0855639e+00 4.0363334e-01 1.0293900e+00 1.3743657e+00 4.0006662e-01 4.0125062e-01 9.3329055e-01 1.2396422e+00 1.5267540e+00 1.9798779e+00 9.6591465e-01 4.0127250e-01 9.0026497e-01 1.7151603e+00 1.0797805e+00 8.0296037e-01 4.0006662e-01 8.9540816e-01 1.0837679e+00 9.6674360e-01 5.2524663e-01 1.2440789e+00 1.1938630e+00 9.1892454e-01 5.2524663e-01 6.3912943e-01 9.3733589e-01 4.5148429e-01 1.1281352e+00 9.0002570e-01 5.0517282e-01 9.4513210e-01 4.1315633e-01 1.2014191e+00 5.2133179e-01 1.3063533e+00 1.1019505e+00 8.5403370e-01 1.0426516e+00 1.3523310e+00 1.4544312e+00 9.0142636e-01 3.3818226e-01 5.0085236e-01 5.0437695e-01 3.0922892e-01 1.5001461e+00 9.0005094e-01 9.0668287e-01 1.2396475e+00 8.7209296e-01 5.0000761e-01 4.5078948e-01 8.0046764e-01 1.0030724e+00 4.1317535e-01 6.7824250e-01 6.0017665e-01 6.0000952e-01 6.0000317e-01 7.4262850e-01 6.3925756e-01 5.0001522e-01 2.4077059e+00 1.5012741e+00 2.3329496e+00 2.0008921e+00 2.2042323e+00 3.0476353e+00 9.3541878e-01 2.7309758e+00 2.2068463e+00 2.5373913e+00 1.5160787e+00 1.7043730e+00 1.9242109e+00 1.4044668e+00 1.5401330e+00 1.7168122e+00 1.9044144e+00 3.1543192e+00 3.3406961e+00 1.4044697e+00 2.1265131e+00 1.3061138e+00 3.1536525e+00 1.3069754e+00 2.1097680e+00 2.4379736e+00 1.2049541e+00 1.3017511e+00 2.0033792e+00 2.2562563e+00 2.5606009e+00 2.9377608e+00 2.0050253e+00 1.5030978e+00 2.0001168e+00 2.6390071e+00 2.0114908e+00 1.9023062e+00 1.2016381e+00 1.8467998e+00 2.0209800e+00 1.6143467e+00 1.5012741e+00 2.3121231e+00 2.1220697e+00 1.6461460e+00 1.4062065e+00 1.6118728e+00 1.8108200e+00 1.5004645e+00 1.1000005e+00 9.0305330e-01 9.0506343e-01 1.1075720e+00 8.0488008e-01 6.1119558e-01 6.3912943e-01 6.0383105e-01 3.0490481e-01 1.1269424e-01 4.1210927e-01 6.0184622e-01 7.0008735e-01 1.0803561e+00 1.2125410e+00 1.2178626e+00 9.0645118e-01 7.9153339e-01 1.3000002e+00 7.0096858e-01 3.0008832e-01 8.0245824e-01 1.1001015e+00 1.2040344e+00 1.2012928e+00 6.0017982e-01 9.0645118e-01 1.7262450e+00 1.1005460e+00 1.0000307e+00 1.0000307e+00 5.0043842e-01 1.7087610e+00 1.0003198e+00 1.6300950e+00 9.3848935e-01 1.5032156e+00 1.2007124e+00 1.4092540e+00 2.2026134e+00 1.8005395e+00 1.9004485e+00 1.4019342e+00 1.7231818e+00 7.4269314e-01 9.0668287e-01 1.1133897e+00 1.0251597e+00 1.0924484e+00 1.0143978e+00 1.1005460e+00 2.3044111e+00 2.5032992e+00 9.4511250e-01 1.3253497e+00 1.1075720e+00 2.3033192e+00 5.5450500e-01 1.3061180e+00 1.6004128e+00 5.4219811e-01 6.3912943e-01 1.2090477e+00 1.4006179e+00 1.7019555e+00 2.0185049e+00 1.2190878e+00 7.0548283e-01 1.2049539e+00 1.7202439e+00 1.2636227e+00 1.1006371e+00 7.0911112e-01 1.0207396e+00 1.2632946e+00 9.3308853e-01 9.3848935e-01 1.5130871e+00 1.3741498e+00 9.6572569e-01 6.9987517e-01 8.2421923e-01 1.0798806e+00 8.5583415e-01 5.2524663e-01 8.2418002e-01 6.3912709e-01 3.6452132e-01 5.6394820e-01 7.2036819e-01 5.0517282e-01 8.0008964e-01 1.0000005e+00 1.2000731e+00 1.1019597e+00 4.0002221e-01 1.0039063e+00 7.4612830e-01 8.3183672e-01 6.0383105e-01 6.1119558e-01 2.0000000e-01 4.5078948e-01 1.1000098e+00 7.8890806e-01 4.0122873e-01 5.6371422e-01 4.1212852e-01 5.0001522e-01 5.2524663e-01 1.2137020e+00 3.4080442e-01 3.3813251e-01 3.0490481e-01 6.0035621e-01 1.5010034e+00 4.0246123e-01 1.5265987e+00 6.1135434e-01 1.6395342e+00 1.1134850e+00 1.3309249e+00 2.3136797e+00 7.1629168e-01 1.9760038e+00 1.3748534e+00 1.8136626e+00 9.1894698e-01 9.0320459e-01 1.2661802e+00 6.0427481e-01 9.1427000e-01 9.6685270e-01 1.0777305e+00 2.4270428e+00 2.5626268e+00 8.1112909e-01 1.4228744e+00 5.2167208e-01 2.4261071e+00 7.0633229e-01 1.3043552e+00 1.7511131e+00 6.0383105e-01 5.2491131e-01 1.1330776e+00 1.6740160e+00 1.9314874e+00 2.4166999e+00 1.1400420e+00 7.4269200e-01 1.1024820e+00 2.1702438e+00 1.1639421e+00 1.0427822e+00 4.2268438e-01 1.3276412e+00 1.2710363e+00 1.3154933e+00 6.1135434e-01 1.4922566e+00 1.3466030e+00 1.1400339e+00 7.3461436e-01 9.3733552e-01 9.7694377e-01 6.0365948e-01 5.8750389e-01 2.4195741e-01 8.6051471e-01 3.3818226e-01 8.1719606e-01 6.0202028e-01 6.0219099e-01 8.0337471e-01 1.0214933e+00 1.0338224e+00 5.2201750e-01 6.0000635e-01 3.6259865e-01 4.2268438e-01 2.2538848e-01 1.0087393e+00 5.4219811e-01 7.4618926e-01 9.2019277e-01 5.2838320e-01 3.4080442e-01 3.4085233e-01 3.4085233e-01 5.2838320e-01 2.0121983e-01 9.0294373e-01 3.0482299e-01 3.0490481e-01 3.0490481e-01 4.1420960e-01 1.1133986e+00 3.0017653e-01 1.9760242e+00 1.0776188e+00 1.8598666e+00 1.5071120e+00 1.7384459e+00 2.5637810e+00 9.3426769e-01 2.2403929e+00 1.7108631e+00 2.0993246e+00 1.1405598e+00 1.2394690e+00 1.4816205e+00 1.0776296e+00 1.4324323e+00 1.4163126e+00 1.4134492e+00 2.6753615e+00 2.8540068e+00 9.1001664e-01 1.6986597e+00 1.0426638e+00 2.6697938e+00 9.0657539e-01 1.6396943e+00 1.9541963e+00 8.5583415e-01 9.0207914e-01 1.5412500e+00 1.7849153e+00 2.0880425e+00 2.4973149e+00 1.5650163e+00 1.0060994e+00 1.5001440e+00 2.2185588e+00 1.6410190e+00 1.4111252e+00 8.5440680e-01 1.4330979e+00 1.6474117e+00 1.4095656e+00 1.0776188e+00 1.8534896e+00 1.7579984e+00 1.3938438e+00 1.0171340e+00 1.1990152e+00 1.4686236e+00 1.0427822e+00 6.8261201e-01 1.0004792e+00 6.3178782e-01 4.1210927e-01 6.0202028e-01 7.0025283e-01 8.0245903e-01 6.7720957e-01 8.1719606e-01 7.0008432e-01 1.0069214e+00 7.9153339e-01 8.6054545e-01 6.4049114e-01 6.3178782e-01 9.0155393e-01 1.2000065e+00 9.0508712e-01 2.0181667e-01 8.2635069e-01 7.1708289e-01 7.0548283e-01 8.0000239e-01 5.4219811e-01 1.3530568e+00 6.3322667e-01 8.0967961e-01 7.1708289e-01 7.0016860e-01 1.5402579e+00 6.3925756e-01 1.5611241e+00 6.4620889e-01 1.4283663e+00 1.1134850e+00 1.3189663e+00 2.1346646e+00 1.3000497e+00 1.8186729e+00 1.3009674e+00 1.7335369e+00 1.0118233e+00 8.1117067e-01 1.0567664e+00 6.0605366e-01 9.2867113e-01 1.0782857e+00 1.0429127e+00 2.2917679e+00 2.4270713e+00 5.0042326e-01 1.2848760e+00 6.9987517e-01 2.2396581e+00 5.2491734e-01 1.3051737e+00 1.5457820e+00 6.0365948e-01 8.0291749e-01 1.1110184e+00 1.3561934e+00 1.6492450e+00 2.1212048e+00 1.1186586e+00 6.7616723e-01 1.1005365e+00 1.7574668e+00 1.3269962e+00 1.0777411e+00 8.0097499e-01 1.0411548e+00 1.1972915e+00 9.9911696e-01 6.4620889e-01 1.4422764e+00 1.3473056e+00 9.3861512e-01 5.2491734e-01 8.6084272e-01 1.2528048e+00 8.2498722e-01 9.6150595e-01 5.0477564e-01 1.0214931e+00 8.0923926e-01 8.0492246e-01 1.0062544e+00 1.2363856e+00 1.2438823e+00 6.2656178e-01 4.0006662e-01 1.2085435e-01 2.0181667e-01 2.2573593e-01 1.2016443e+00 6.3925756e-01 9.2019277e-01 1.1335345e+00 7.1636719e-01 5.0084481e-01 2.0121983e-01 5.0002283e-01 7.3155911e-01 2.0181667e-01 6.7626681e-01 3.0915245e-01 5.0437695e-01 4.1317535e-01 6.1845783e-01 9.0506254e-01 3.0922892e-01 2.1350025e+00 1.2189760e+00 2.0658767e+00 1.7034615e+00 1.9177947e+00 2.7775988e+00 7.7598704e-01 2.4534018e+00 1.9144928e+00 2.2857680e+00 1.2749306e+00 1.4182222e+00 1.6639408e+00 1.1527669e+00 1.4140789e+00 1.4954274e+00 1.6121856e+00 2.8913337e+00 3.0644792e+00 1.1011719e+00 1.8708183e+00 1.0777305e+00 2.8852099e+00 1.0396215e+00 1.8297117e+00 2.1701542e+00 9.4532171e-01 1.0262619e+00 1.7168122e+00 2.0059655e+00 2.3063931e+00 2.7230908e+00 1.7261949e+00 1.2093243e+00 1.7002548e+00 2.4331092e+00 1.7646791e+00 1.6080687e+00 9.3848935e-01 1.6152383e+00 1.7771159e+00 1.4971922e+00 1.2189760e+00 2.0349233e+00 1.8831259e+00 1.4665397e+00 1.1400339e+00 1.3492939e+00 1.5757399e+00 1.2102248e+00 8.1117067e-01 7.0548283e-01 6.0964891e-01 6.0605366e-01 7.0918894e-01 9.0279223e-01 8.0008964e-01 3.6259865e-01 1.3154973e+00 1.0604287e+00 1.1536694e+00 9.1892454e-01 5.0477564e-01 5.0894102e-01 3.0922892e-01 8.0046764e-01 9.0778124e-01 7.1708289e-01 8.6225026e-01 6.8685125e-01 4.0363334e-01 8.4536936e-01 1.5318139e+00 6.5832080e-01 6.7636452e-01 6.3322667e-01 5.6838732e-01 1.8053679e+00 7.2044167e-01 1.2092602e+00 5.0437695e-01 1.3018595e+00 8.0291671e-01 1.0095513e+00 1.9760044e+00 1.0208709e+00 1.6387179e+00 1.0597877e+00 1.4686236e+00 6.0201716e-01 6.0427481e-01 9.3331138e-01 7.0025283e-01 6.1119558e-01 6.0427175e-01 7.4269200e-01 2.0887699e+00 2.2281421e+00 1.0001753e+00 1.0797700e+00 4.1317535e-01 2.0885107e+00 5.2133179e-01 9.6591465e-01 1.4140457e+00 4.1209001e-01 2.2573593e-01 8.1156529e-01 1.3450340e+00 1.5966664e+00 2.0855643e+00 8.1343016e-01 4.6440171e-01 8.2635069e-01 1.8444686e+00 8.2635069e-01 7.1621748e-01 2.0061436e-01 1.0088783e+00 9.1566538e-01 1.0032296e+00 5.0437695e-01 1.1543257e+00 9.8997136e-01 8.1117067e-01 7.0470867e-01 6.0980961e-01 6.3322667e-01 3.0474106e-01 9.0031539e-01 7.0000151e-01 3.3813251e-01 5.2167829e-01 8.5403428e-01 1.0095513e+00 5.0043842e-01 5.2524663e-01 6.0980961e-01 6.1288055e-01 3.0026460e-01 1.1001015e+00 7.1636719e-01 6.3309258e-01 7.4335736e-01 5.2167208e-01 5.0043084e-01 6.0184309e-01 6.0964891e-01 6.0017982e-01 3.0482299e-01 1.1153247e+00 5.0043084e-01 4.0246123e-01 4.0125062e-01 3.0017653e-01 1.1270411e+00 4.0002221e-01 2.0175565e+00 1.1056693e+00 1.9099615e+00 1.6003257e+00 1.8055799e+00 2.6186105e+00 1.2017042e+00 2.3090806e+00 1.8007233e+00 2.1233216e+00 1.1144002e+00 1.3025622e+00 1.5097103e+00 1.0216374e+00 1.2396937e+00 1.3452695e+00 1.5005647e+00 2.7241212e+00 2.9166918e+00 1.0087396e+00 1.7168636e+00 9.3733552e-01 2.7221286e+00 9.0508756e-01 1.7046111e+00 2.0107590e+00 8.0879701e-01 9.0508712e-01 1.6049314e+00 1.8174378e+00 2.1221146e+00 2.4750525e+00 1.6096791e+00 1.1000193e+00 1.6000016e+00 2.1732693e+00 1.6308665e+00 1.5004872e+00 8.0883916e-01 1.4182493e+00 1.6308803e+00 1.2094550e+00 1.1056693e+00 1.9088565e+00 1.7377460e+00 1.2661852e+00 1.0088926e+00 1.2092662e+00 1.4340155e+00 1.1019692e+00 3.4342562e-01 6.0964891e-01 5.6595908e-01 5.0437695e-01 5.2167829e-01 4.5783248e-01 1.4023777e+00 1.1286018e+00 1.2201578e+00 1.0032443e+00 3.0922892e-01 9.0642679e-01 9.0166476e-01 6.0964597e-01 5.0084481e-01 8.6054545e-01 9.6574336e-01 8.0923926e-01 5.0477564e-01 9.0532093e-01 1.6742781e+00 7.8895472e-01 7.5564478e-01 7.4618926e-01 6.0964891e-01 1.9222003e+00 8.2462252e-01 1.2093908e+00 5.2201750e-01 1.0522594e+00 7.0548138e-01 9.3735629e-01 1.7578497e+00 1.4001717e+00 1.4326118e+00 9.0166431e-01 1.3681502e+00 7.1636719e-01 4.5148429e-01 7.1183012e-01 6.3164977e-01 9.0534502e-01 8.5583415e-01 6.3322667e-01 1.9047821e+00 2.0429861e+00 3.3813251e-01 9.4634218e-01 7.1700774e-01 1.8662975e+00 3.0474106e-01 9.1695534e-01 1.1636098e+00 3.3818226e-01 5.0476836e-01 7.4329527e-01 1.0171202e+00 1.3020942e+00 1.8013674e+00 7.8935898e-01 3.0474106e-01 7.0008735e-01 1.4927071e+00 1.0336860e+00 6.7720957e-01 5.0855778e-01 7.3895268e-01 9.4622126e-01 8.4540285e-01 5.2201750e-01 1.0621172e+00 1.0788651e+00 8.1156529e-01 4.0002221e-01 5.6618864e-01 9.6935134e-01 5.2524663e-01 4.1212852e-01 5.0517282e-01 7.0008584e-01 6.3322667e-01 3.0490481e-01 1.2003660e+00 9.1552373e-01 1.0095513e+00 8.0046685e-01 4.5080200e-01 7.0105084e-01 6.0964891e-01 6.0365948e-01 5.0477564e-01 6.3178782e-01 7.4329527e-01 6.0201716e-01 2.2573593e-01 7.0096708e-01 1.4548054e+00 5.6347978e-01 5.2167208e-01 5.2133802e-01 4.0006662e-01 1.7132643e+00 6.0948506e-01 1.4655221e+00 7.0548283e-01 1.2921474e+00 9.1424701e-01 1.1900342e+00 1.9791159e+00 1.2013591e+00 1.6491682e+00 1.1111057e+00 1.5689626e+00 8.0726668e-01 7.4329527e-01 9.8998705e-01 8.0337471e-01 1.2004198e+00 1.1061923e+00 8.2635069e-01 2.0953157e+00 2.2622460e+00 6.0366256e-01 1.2097311e+00 8.0883841e-01 2.0866883e+00 6.0035621e-01 1.0858512e+00 1.3762609e+00 6.0000635e-01 6.0035305e-01 1.0143975e+00 1.2399444e+00 1.5291965e+00 1.9842703e+00 1.0777305e+00 4.1315633e-01 9.0005048e-01 1.7303039e+00 1.2394744e+00 8.2498722e-01 6.0018299e-01 9.9013884e-01 1.2395260e+00 1.1286911e+00 7.0548283e-01 1.3081175e+00 1.3479052e+00 1.1074834e+00 7.0184453e-01 8.1117067e-01 1.1186499e+00 6.0980961e-01 2.0181667e-01 5.2133802e-01 7.0548283e-01 4.0243965e-01 8.5471446e-01 9.1001664e-01 9.1916394e-01 6.0964891e-01 8.0296037e-01 1.0000307e+00 5.2524663e-01 4.1420960e-01 6.0000635e-01 8.0004523e-01 9.0166431e-01 9.0026588e-01 3.3818226e-01 6.0366256e-01 1.4340438e+00 8.0004523e-01 7.0000454e-01 7.0000151e-01 2.0000000e-01 1.4651632e+00 7.0008584e-01 1.7369589e+00 8.4540285e-01 1.6071563e+00 1.3008770e+00 1.5130871e+00 2.3098753e+00 1.5002444e+00 2.0034559e+00 1.5005854e+00 1.8322392e+00 8.5437498e-01 1.0087393e+00 1.2192920e+00 8.4786353e-01 1.1330694e+00 1.1270325e+00 1.2012867e+00 2.4144060e+00 2.6097166e+00 7.9153339e-01 1.4330116e+00 8.7209348e-01 2.4119960e+00 6.3178782e-01 1.4094452e+00 1.7039341e+00 5.6371422e-01 6.3309258e-01 1.3130937e+00 1.5066999e+00 1.8106410e+00 2.1515742e+00 1.3253458e+00 8.0004602e-01 1.3000908e+00 1.8533295e+00 1.3748188e+00 1.2012928e+00 5.7609230e-01 1.1298636e+00 1.3741846e+00 1.0451812e+00 8.4540285e-01 1.6176927e+00 1.4854079e+00 1.0777307e+00 7.4612830e-01 9.3306807e-01 1.1910068e+00 8.1715665e-01 4.0243965e-01 6.0184622e-01 6.0000952e-01 1.0158274e+00 1.1111057e+00 1.1191444e+00 8.0928056e-01 7.4335736e-01 1.2000002e+00 6.0964891e-01 3.0026460e-01 7.0088477e-01 1.0001601e+00 1.1024820e+00 1.1005458e+00 5.0042326e-01 8.0492246e-01 1.6321742e+00 1.0001753e+00 9.0005048e-01 9.0002615e-01 4.0006662e-01 1.6390068e+00 9.0029064e-01 1.6300430e+00 8.6084272e-01 1.5035329e+00 1.2004200e+00 1.4092511e+00 2.2043907e+00 1.7002548e+00 1.9010379e+00 1.4007831e+00 1.7240342e+00 7.4269314e-01 9.0534502e-01 1.1133984e+00 9.3184922e-01 1.0597992e+00 1.0142766e+00 1.1005364e+00 2.3071806e+00 2.5048249e+00 8.4536936e-01 1.3253910e+00 1.0116865e+00 2.3056305e+00 5.2838320e-01 1.3061582e+00 1.6010223e+00 4.8391482e-01 5.7608844e-01 1.2089313e+00 1.4017695e+00 1.7039229e+00 2.0293124e+00 1.2189760e+00 7.0096858e-01 1.2016380e+00 1.7295384e+00 1.2636227e+00 1.1005460e+00 6.1830489e-01 1.0208709e+00 1.2632948e+00 9.3329055e-01 8.6084272e-01 1.5130912e+00 1.3741813e+00 9.6572569e-01 6.5832080e-01 8.2418071e-01 1.0788007e+00 7.9148662e-01 3.0922892e-01 8.0046764e-01 1.3743342e+00 1.3452695e+00 1.3745152e+00 1.0776296e+00 8.0051115e-01 1.4000349e+00 8.2462252e-01 3.0026460e-01 5.7609230e-01 1.2089253e+00 1.3131370e+00 1.3002493e+00 7.0016860e-01 1.0426760e+00 1.8951252e+00 1.2036864e+00 1.1055892e+00 1.1055707e+00 6.3165225e-01 1.9760099e+00 1.1133895e+00 1.3035495e+00 1.0032296e+00 1.1134939e+00 8.1112984e-01 1.0427944e+00 1.8040883e+00 1.9000220e+00 1.5005626e+00 1.0010060e+00 1.3844234e+00 6.1288055e-01 5.7609230e-01 7.8890721e-01 1.1056785e+00 1.1270325e+00 9.0778124e-01 7.0556260e-01 1.9141294e+00 2.1052841e+00 8.2421923e-01 1.0150395e+00 1.2036863e+00 1.9046783e+00 5.2133802e-01 9.3733589e-01 1.2010584e+00 6.0948212e-01 7.0470867e-01 8.5583357e-01 1.0008768e+00 1.3033860e+00 1.6469593e+00 9.0294373e-01 5.0436965e-01 8.5406616e-01 1.3485619e+00 1.0522594e+00 7.0993998e-01 8.0250123e-01 7.4329527e-01 1.0427822e+00 9.0053003e-01 1.0032296e+00 1.1531951e+00 1.1543259e+00 9.0142681e-01 5.6618864e-01 6.1135434e-01 9.3984267e-01 9.0168933e-01 7.1629303e-01 1.5266891e+00 1.3564850e+00 1.4198077e+00 1.1544060e+00 7.0088627e-01 1.3008812e+00 7.2036951e-01 3.0482299e-01 7.4954884e-01 1.1531951e+00 1.2645755e+00 1.2053003e+00 6.1119267e-01 1.0803561e+00 1.9177201e+00 1.1286911e+00 1.0451689e+00 1.0433444e+00 7.2036951e-01 2.0856547e+00 1.0782211e+00 1.0434746e+00 9.0029064e-01 9.0279223e-01 6.0948800e-01 8.0883841e-01 1.6097492e+00 1.8003682e+00 1.3025173e+00 8.0879701e-01 1.1347620e+00 3.0922892e-01 3.6452132e-01 5.2133179e-01 1.0032293e+00 9.3308891e-01 6.0383105e-01 5.0043084e-01 1.7170314e+00 1.9082779e+00 8.5406616e-01 7.4275547e-01 1.1001110e+00 1.7132654e+00 4.1212852e-01 7.0548138e-01 1.0030871e+00 5.0085236e-01 6.0000635e-01 6.1135434e-01 8.0879701e-01 1.1134075e+00 1.4922778e+00 6.3322667e-01 4.0246123e-01 6.8261201e-01 1.1935004e+00 7.4954884e-01 5.0437695e-01 7.0008584e-01 4.5148429e-01 7.4262964e-01 6.0018299e-01 9.0029064e-01 9.1424701e-01 8.5437440e-01 6.0017665e-01 5.2167208e-01 3.0915245e-01 6.4620889e-01 8.0000160e-01 1.0033867e+00 7.3461436e-01 8.2512420e-01 6.0219099e-01 6.0017982e-01 6.0000317e-01 5.0000761e-01 7.0016860e-01 6.0202028e-01 4.5148429e-01 5.7630313e-01 5.0855778e-01 1.2699992e-01 5.0894102e-01 1.2671752e+00 4.1420960e-01 3.6259865e-01 3.4080442e-01 2.4170870e-01 1.5133193e+00 4.1317535e-01 1.5238388e+00 6.0980961e-01 1.4557632e+00 1.1002023e+00 1.3069713e+00 2.1693127e+00 1.1005458e+00 1.8443124e+00 1.3063934e+00 1.6655594e+00 6.5832080e-01 8.0492246e-01 1.0498228e+00 5.7832449e-01 9.1424701e-01 9.0320459e-01 1.0032296e+00 2.2802814e+00 2.4537354e+00 7.1621613e-01 1.2528590e+00 5.3914287e-01 2.2781292e+00 4.2362917e-01 1.2128138e+00 1.5640141e+00 3.4085233e-01 4.1212852e-01 1.1060939e+00 1.4140458e+00 1.7081323e+00 2.1436849e+00 1.1138955e+00 6.0184622e-01 1.1001015e+00 1.8659091e+00 1.1544060e+00 1.0010209e+00 3.3813251e-01 1.0224270e+00 1.1635398e+00 9.7600992e-01 6.0980961e-01 1.4182493e+00 1.2705641e+00 8.9538275e-01 5.4219811e-01 7.3084171e-01 9.6936870e-01 6.0184934e-01 3.0922892e-01 2.4170870e-01 4.0127250e-01 1.6009488e+00 1.0040629e+00 1.0499492e+00 1.2653025e+00 9.1471442e-01 6.1119558e-01 5.0477564e-01 9.0005048e-01 1.1016049e+00 5.0043084e-01 7.0096708e-01 7.0088627e-01 7.0470720e-01 7.0176121e-01 8.0967961e-01 6.3165225e-01 6.0201716e-01 2.5221737e+00 1.6096629e+00 2.4221589e+00 2.1015969e+00 2.3098905e+00 3.1317714e+00 1.0597879e+00 2.8188299e+00 2.3040148e+00 2.6373482e+00 1.6231306e+00 1.8068049e+00 2.0210084e+00 1.5237053e+00 1.7080686e+00 1.8459262e+00 2.0034094e+00 3.2387184e+00 3.4286399e+00 1.5005854e+00 2.2285172e+00 1.4324350e+00 3.2358000e+00 1.4109628e+00 2.2110849e+00 2.5224740e+00 1.3139336e+00 1.4095777e+00 2.1090366e+00 2.3323064e+00 2.6377472e+00 2.9966835e+00 2.1144760e+00 1.6012568e+00 2.1000482e+00 2.6968519e+00 2.1346646e+00 2.0025815e+00 1.3133662e+00 1.9351024e+00 2.1377869e+00 1.7137965e+00 1.6096629e+00 2.4161682e+00 2.2434416e+00 1.7684500e+00 1.5143051e+00 1.7168636e+00 1.9368172e+00 1.6050040e+00 1.1269424e-01 3.3818226e-01 1.3017961e+00 7.4612830e-01 1.0262619e+00 1.2443200e+00 8.2421923e-01 6.0202028e-01 2.2573593e-01 6.0017982e-01 8.4572653e-01 3.0922892e-01 5.6347978e-01 4.1317535e-01 6.0964891e-01 5.2201750e-01 7.3090905e-01 8.0245824e-01 4.1420960e-01 2.2297880e+00 1.3131802e+00 2.1734835e+00 1.8042696e+00 2.0169191e+00 2.8857511e+00 7.7598796e-01 2.5607759e+00 2.0181988e+00 2.3909895e+00 1.3770846e+00 1.5195166e+00 1.7689720e+00 1.2362756e+00 1.4651863e+00 1.5800353e+00 1.7155605e+00 3.0010211e+00 3.1712557e+00 1.2016443e+00 1.9735224e+00 1.1531953e+00 2.9937162e+00 1.1401191e+00 1.9335528e+00 2.2793947e+00 1.0403116e+00 1.1237940e+00 1.8155572e+00 2.1170640e+00 2.4166673e+00 2.8369211e+00 1.8227568e+00 1.3135522e+00 1.8005404e+00 2.5443612e+00 1.8557670e+00 1.7105814e+00 1.0313359e+00 1.7226330e+00 1.8708183e+00 1.5881025e+00 1.3131802e+00 2.1363271e+00 1.9752912e+00 1.5530527e+00 1.2366099e+00 1.4501583e+00 1.6655594e+00 1.3088083e+00 3.4342562e-01 1.4024091e+00 8.3183672e-01 1.0522594e+00 1.2712749e+00 8.5437498e-01 6.1119558e-01 3.3813251e-01 7.0016860e-01 9.2867113e-01 3.4342562e-01 5.2133179e-01 5.0855778e-01 6.3192325e-01 5.6618864e-01 7.5564478e-01 7.0462844e-01 4.5847767e-01 2.3345511e+00 1.4181033e+00 2.2624227e+00 1.9044571e+00 2.1188381e+00 2.9740725e+00 8.7209348e-01 2.6511588e+00 2.1151751e+00 2.4832720e+00 1.4692287e+00 1.6190709e+00 1.8603115e+00 1.3450304e+00 1.5778323e+00 1.6856949e+00 1.8133657e+00 3.0879393e+00 3.2627356e+00 1.3017553e+00 2.0678448e+00 1.2635708e+00 3.0810441e+00 1.2366675e+00 2.0307764e+00 2.3657459e+00 1.1404856e+00 1.2257611e+00 1.9176961e+00 2.1957105e+00 2.4980314e+00 2.9055191e+00 1.9262438e+00 1.4100098e+00 1.9004485e+00 2.6116431e+00 1.9609333e+00 1.8095574e+00 1.1347620e+00 1.8037909e+00 1.9725464e+00 1.6581521e+00 1.4181033e+00 2.2355461e+00 2.0784269e+00 1.6462102e+00 1.3373104e+00 1.5468618e+00 1.7698041e+00 1.4111252e+00 1.2003596e+00 6.1288055e-01 7.4618926e-01 9.6691372e-01 5.7609230e-01 3.0922892e-01 3.0490481e-01 5.0436965e-01 7.0184453e-01 1.1269424e-01 8.2635069e-01 3.0482299e-01 3.3813251e-01 3.0490481e-01 4.5148429e-01 9.3308891e-01 2.0181667e-01 2.1221982e+00 1.2089191e+00 2.0305682e+00 1.7009400e+00 1.9088256e+00 2.7434081e+00 9.1894698e-01 2.4265154e+00 1.9046790e+00 2.2453370e+00 1.2284047e+00 1.4060413e+00 1.6267848e+00 1.1281352e+00 1.3523310e+00 1.4562730e+00 1.6032169e+00 2.8519346e+00 3.0369970e+00 1.1020600e+00 1.8342569e+00 1.0426638e+00 2.8491513e+00 1.0116721e+00 1.8114932e+00 2.1335035e+00 9.1552373e-01 1.0090312e+00 1.7079369e+00 1.9522117e+00 2.2566913e+00 2.6406601e+00 1.7139238e+00 1.2013529e+00 1.7000137e+00 2.3442222e+00 1.7386523e+00 1.6019500e+00 9.1449234e-01 1.5517970e+00 1.7435092e+00 1.3757183e+00 1.2089191e+00 2.0167186e+00 1.8496945e+00 1.3938438e+00 1.1152390e+00 1.3189663e+00 1.5429659e+00 1.2037520e+00 6.7720957e-01 7.4262850e-01 7.0911112e-01 7.0633229e-01 1.0011648e+00 1.1020600e+00 7.2036951e-01 5.0477564e-01 1.1005460e+00 1.8106900e+00 9.0166431e-01 9.0192695e-01 9.0055475e-01 8.0055465e-01 2.1027376e+00 1.0003198e+00 1.0225570e+00 3.0474106e-01 1.1299441e+00 5.0517282e-01 7.5564478e-01 1.7513222e+00 1.1055799e+00 1.4140515e+00 7.8895472e-01 1.3181953e+00 5.7608844e-01 4.1315633e-01 8.1156529e-01 4.1317535e-01 8.0004523e-01 7.2044167e-01 5.2524663e-01 1.8787830e+00 1.9768256e+00 5.0001522e-01 9.4912864e-01 4.5148429e-01 1.8635775e+00 3.0915245e-01 7.8611860e-01 1.2373911e+00 3.0922892e-01 3.0922892e-01 5.7609230e-01 1.2089834e+00 1.4324608e+00 1.9471600e+00 6.3912943e-01 3.0017653e-01 5.0043842e-01 1.7149040e+00 8.6084272e-01 4.8391482e-01 3.4080442e-01 9.0668287e-01 8.6225026e-01 9.3424659e-01 3.0474106e-01 9.3861512e-01 9.5646231e-01 7.8935898e-01 3.4085233e-01 5.2491734e-01 7.8940551e-01 3.0482299e-01 6.0948506e-01 1.3000044e+00 9.3308891e-01 4.0243965e-01 5.6371422e-01 4.1212852e-01 7.0000303e-01 5.4219811e-01 1.2105001e+00 3.4342562e-01 3.6256305e-01 3.4085233e-01 8.0008964e-01 1.5005854e+00 4.1420960e-01 1.5358856e+00 6.1990228e-01 1.7849054e+00 1.1528477e+00 1.3788456e+00 2.4261894e+00 5.6370994e-01 2.0884901e+00 1.4655452e+00 1.9390732e+00 1.1074834e+00 1.0434746e+00 1.4340155e+00 6.0605366e-01 9.1554656e-01 1.0782857e+00 1.1897288e+00 2.5394068e+00 2.6516318e+00 8.3183606e-01 1.5694554e+00 5.2201750e-01 2.5386539e+00 9.0192695e-01 1.4157600e+00 1.8949500e+00 8.0097499e-01 7.0548138e-01 1.1935069e+00 1.8443040e+00 2.0853276e+00 2.5816887e+00 1.1989547e+00 9.1424659e-01 1.1138955e+00 2.3468430e+00 1.1963432e+00 1.1270327e+00 6.0365948e-01 1.5143051e+00 1.3938114e+00 1.5079206e+00 6.1990228e-01 1.5829749e+00 1.4450801e+00 1.3189240e+00 9.1132198e-01 1.1152300e+00 1.0159134e+00 6.3309012e-01 7.0096858e-01 1.1002025e+00 4.8852375e-01 9.1024401e-01 8.1112984e-01 4.0127250e-01 8.1117067e-01 1.3486924e+00 7.0633229e-01 4.6440171e-01 5.1257987e-01 5.0517282e-01 1.5260594e+00 6.1288055e-01 1.5131090e+00 7.4335736e-01 1.4549432e+00 1.1020600e+00 1.3036236e+00 2.1691920e+00 1.1527669e+00 1.8444686e+00 1.3309288e+00 1.6567564e+00 6.3925756e-01 8.5617086e-01 1.0458540e+00 9.0668287e-01 8.4540285e-01 8.5586571e-01 1.0039209e+00 2.2782572e+00 2.4540263e+00 1.2012866e+00 1.2440282e+00 6.2656178e-01 2.2782572e+00 7.0556260e-01 1.2101609e+00 1.5639802e+00 6.0219099e-01 4.5148429e-01 1.1079931e+00 1.4142064e+00 1.7087610e+00 2.1412345e+00 1.1115204e+00 6.7720957e-01 1.1281352e+00 1.8646736e+00 1.1282162e+00 1.0010209e+00 4.1315633e-01 1.0172673e+00 1.1401191e+00 9.4532171e-01 7.4335736e-01 1.4134218e+00 1.2440229e+00 8.4786353e-01 9.0557807e-01 7.2440846e-01 9.3308853e-01 6.0964891e-01 8.0296037e-01 1.1055799e+00 1.2124837e+00 1.2014191e+00 6.0000952e-01 9.3755356e-01 1.7874653e+00 1.1024913e+00 1.0032296e+00 1.0031018e+00 5.2201750e-01 1.8640262e+00 1.0088926e+00 1.3452347e+00 9.0417295e-01 1.2040344e+00 9.0168933e-01 1.1133986e+00 1.9046783e+00 1.8005318e+00 1.6009504e+00 1.1056691e+00 1.4335330e+00 5.2167829e-01 6.1990228e-01 8.2418141e-01 1.0118233e+00 1.0151880e+00 8.2458478e-01 8.0051115e-01 2.0076819e+00 2.2050331e+00 9.3329017e-01 1.0426638e+00 1.1020600e+00 2.0062587e+00 4.5847767e-01 1.0087393e+00 1.3009222e+00 5.0855778e-01 6.0202028e-01 9.1471442e-01 1.1019505e+00 1.4044980e+00 1.7386523e+00 9.3351278e-01 4.5783248e-01 9.1892454e-01 1.4407364e+00 1.0151880e+00 8.0093081e-01 7.0088627e-01 7.4269200e-01 1.0142482e+00 8.0250123e-01 9.0417295e-01 1.2189645e+00 1.1269510e+00 8.0879701e-01 6.1990228e-01 5.6371422e-01 8.6084272e-01 8.0291749e-01 7.8935813e-01 8.0250123e-01 8.0046685e-01 7.0017011e-01 5.2491734e-01 1.3741813e+00 7.0470720e-01 7.4269314e-01 6.7626502e-01 6.0000635e-01 1.4852616e+00 6.3309012e-01 1.6636721e+00 7.5826453e-01 1.5161847e+00 1.2049539e+00 1.4220925e+00 2.2191056e+00 1.4001717e+00 1.9083789e+00 1.4007861e+00 1.7945122e+00 9.6133119e-01 9.1552373e-01 1.1416778e+00 7.7603846e-01 1.1170561e+00 1.1351073e+00 1.1152390e+00 2.3540839e+00 2.5167781e+00 6.0202028e-01 1.3687074e+00 8.0713433e-01 2.3222107e+00 5.7608844e-01 1.3563898e+00 1.6193612e+00 5.7609230e-01 7.3090905e-01 1.2201578e+00 1.4221192e+00 1.7236083e+00 2.1360791e+00 1.2373857e+00 7.1629168e-01 1.2000731e+00 1.7962160e+00 1.3755348e+00 1.1298552e+00 7.2113820e-01 1.0843962e+00 1.3150470e+00 1.0664292e+00 7.5826453e-01 1.5362595e+00 1.4451976e+00 1.0604287e+00 6.7626502e-01 8.9540816e-01 1.2552585e+00 8.0073117e-01 5.0001522e-01 4.1212852e-01 5.6347549e-01 4.0127250e-01 8.7240114e-01 3.0008832e-01 1.2085435e-01 1.2085435e-01 6.0017982e-01 1.1038933e+00 2.0061436e-01 1.9231154e+00 1.0088926e+00 1.8971338e+00 1.5035330e+00 1.7143629e+00 2.6071033e+00 7.2440846e-01 2.2781292e+00 1.7231818e+00 2.0998984e+00 1.0923537e+00 1.2224463e+00 1.4922544e+00 9.3733589e-01 1.1896725e+00 1.2782589e+00 1.4186216e+00 2.7177641e+00 2.8857013e+00 9.6674360e-01 1.6882618e+00 8.5406616e-01 2.7167827e+00 8.6084272e-01 1.6345263e+00 2.0058565e+00 7.5508853e-01 8.1715593e-01 1.5132180e+00 1.8635428e+00 2.1554613e+00 2.5926811e+00 1.5194972e+00 1.0207533e+00 1.5005626e+00 2.3165875e+00 1.5429659e+00 1.4098467e+00 7.2036819e-01 1.4724918e+00 1.5757929e+00 1.3838027e+00 1.0088926e+00 1.8378491e+00 1.6745686e+00 1.2948699e+00 9.4912864e-01 1.1635325e+00 1.3473688e+00 1.0032293e+00 4.0004442e-01 6.9509552e-01 3.0017653e-01 7.1708289e-01 2.2573593e-01 5.0085236e-01 4.0243965e-01 7.0548138e-01 1.0008617e+00 3.0482299e-01 2.0206913e+00 1.1056785e+00 2.0075255e+00 1.6053217e+00 1.8156855e+00 2.7170183e+00 6.3912709e-01 2.3873965e+00 1.8286172e+00 2.2132187e+00 1.2079042e+00 1.3276450e+00 1.6018644e+00 1.0207396e+00 1.2397507e+00 1.3715471e+00 1.5245240e+00 2.8327619e+00 2.9941199e+00 1.0032443e+00 1.7962160e+00 9.3329055e-01 2.8269181e+00 9.6936870e-01 1.7435156e+00 2.1174156e+00 8.6084272e-01 9.2351241e-01 1.6144550e+00 1.9761215e+00 2.2674248e+00 2.7114616e+00 1.6190709e+00 1.1282247e+00 1.6009322e+00 2.4285500e+00 1.6432478e+00 1.5147271e+00 8.2512420e-01 1.5839544e+00 1.6753044e+00 1.4829434e+00 1.1056785e+00 1.9427965e+00 1.7734131e+00 1.3908238e+00 1.0498226e+00 1.2712749e+00 1.4523130e+00 1.1044111e+00 6.0980961e-01 4.1209001e-01 1.1020600e+00 2.0181667e-01 4.0243965e-01 3.0922892e-01 7.0088627e-01 1.4001688e+00 3.0922892e-01 1.6797901e+00 7.8935898e-01 1.7574606e+00 1.2224463e+00 1.4618181e+00 2.4274025e+00 6.3165225e-01 2.0887499e+00 1.4865883e+00 1.9561612e+00 1.0664292e+00 1.0336863e+00 1.3939836e+00 8.2421923e-01 1.2089895e+00 1.1997296e+00 1.1938630e+00 2.5462062e+00 2.6763758e+00 6.4049114e-01 1.5645185e+00 8.0883916e-01 2.5391583e+00 8.3183672e-01 1.4351453e+00 1.8644317e+00 7.4618926e-01 6.9987517e-01 1.2680580e+00 1.7844580e+00 2.0440071e+00 2.5329067e+00 1.2921474e+00 8.5440680e-01 1.2036924e+00 2.2838099e+00 1.3737025e+00 1.1587585e+00 6.4620889e-01 1.4491800e+00 1.4507713e+00 1.4583848e+00 7.8935898e-01 1.6277433e+00 1.5384791e+00 1.3150470e+00 8.7209348e-01 1.0788651e+00 1.2179890e+00 7.4954884e-01 6.1135434e-01 1.3790270e+00 5.2491734e-01 4.5147187e-01 4.5080200e-01 3.0026460e-01 1.6179159e+00 5.2167829e-01 1.4543196e+00 5.6838732e-01 1.3502290e+00 1.0008620e+00 1.2192919e+00 2.0611274e+00 1.2013529e+00 1.7369589e+00 1.2053003e+00 1.5767956e+00 6.3925756e-01 7.1779518e-01 9.6131279e-01 6.4620889e-01 1.0032443e+00 9.3331138e-01 9.0279223e-01 2.1713885e+00 2.3476282e+00 8.0245903e-01 1.1755517e+00 6.3322667e-01 2.1693131e+00 4.2362917e-01 1.1187430e+00 1.4544336e+00 4.0246123e-01 4.1209001e-01 1.0208844e+00 1.3018144e+00 1.5969056e+00 2.0303761e+00 1.0427944e+00 5.0085236e-01 1.0008465e+00 1.7574039e+00 1.1274284e+00 9.0166476e-01 4.0125062e-01 9.3437551e-01 1.1319099e+00 9.6935134e-01 5.6838732e-01 1.3309288e+00 1.2428507e+00 9.2745734e-01 5.7630313e-01 6.8160885e-01 9.6672602e-01 5.2167208e-01 8.5440680e-01 2.2608083e-01 4.0125062e-01 3.0490481e-01 4.2270142e-01 1.0207262e+00 2.0181667e-01 2.0282636e+00 1.1133895e+00 1.9386586e+00 1.6012719e+00 1.8114342e+00 2.6515677e+00 9.0999313e-01 2.3322945e+00 1.8060515e+00 2.1578375e+00 1.1447365e+00 1.3085752e+00 1.5359734e+00 1.0426516e+00 1.3018144e+00 1.3779960e+00 1.5044724e+00 2.7627283e+00 2.9432651e+00 1.0010209e+00 1.7447170e+00 9.6576136e-01 2.7579768e+00 9.1892454e-01 1.7159977e+00 2.0420308e+00 8.2635069e-01 9.1576742e-01 1.6105700e+00 1.8662195e+00 2.1696258e+00 2.5680120e+00 1.6184785e+00 1.1020600e+00 1.6000183e+00 2.2731185e+00 1.6529028e+00 1.5029725e+00 8.2635069e-01 1.4699000e+00 1.6570292e+00 1.3301857e+00 1.1133895e+00 1.9214944e+00 1.7646791e+00 1.3272142e+00 1.0235120e+00 1.2275665e+00 1.4621584e+00 1.1060939e+00 9.1576742e-01 9.6133119e-01 9.4532171e-01 1.2662318e+00 3.0490481e-01 8.6084272e-01 2.7230933e+00 1.8083405e+00 2.7192500e+00 2.3152780e+00 2.5278895e+00 3.4307167e+00 1.2089253e+00 3.1023107e+00 2.5446557e+00 2.9238544e+00 1.9071235e+00 2.0445123e+00 2.3113306e+00 1.7148932e+00 1.8686471e+00 2.0692591e+00 2.2408459e+00 3.5448121e+00 3.7102716e+00 1.7134856e+00 2.5076804e+00 1.6187837e+00 3.5398901e+00 1.6780493e+00 2.4594169e+00 2.8277283e+00 1.5698091e+00 1.6365650e+00 2.3270565e+00 2.6739856e+00 2.9710335e+00 3.3954286e+00 2.3304578e+00 1.8446316e+00 2.3054869e+00 3.1050823e+00 2.3405162e+00 2.2288004e+00 1.5327217e+00 2.2740189e+00 2.3840998e+00 2.1122339e+00 1.8083405e+00 2.6588338e+00 2.4791402e+00 2.0688078e+00 1.7632513e+00 1.9828965e+00 2.1428811e+00 1.8095574e+00 3.0017653e-01 2.0061436e-01 6.0017982e-01 1.2012991e+00 1.2085435e-01 1.8301371e+00 9.1424659e-01 1.8223693e+00 1.4049093e+00 1.6190709e+00 2.5271432e+00 7.0556260e-01 2.1953731e+00 1.6303102e+00 2.0261311e+00 1.0363096e+00 1.1330692e+00 1.4229011e+00 8.5406674e-01 1.1527746e+00 1.2106302e+00 1.3261864e+00 2.6410980e+00 2.8004332e+00 8.1117067e-01 1.6146557e+00 7.8886054e-01 2.6375763e+00 7.9824795e-01 1.5471213e+00 1.9317133e+00 6.9509552e-01 7.3155911e-01 1.4182194e+00 1.8031267e+00 2.0887452e+00 2.5422790e+00 1.4267527e+00 9.3308891e-01 1.4006149e+00 2.2706274e+00 1.4614246e+00 1.3141581e+00 6.4049114e-01 1.4230277e+00 1.5004249e+00 1.3669148e+00 9.1424659e-01 1.7490906e+00 1.5981930e+00 1.2553121e+00 8.7212232e-01 1.0924484e+00 1.2731059e+00 9.0557807e-01 1.1269424e-01 5.0002283e-01 1.2049541e+00 2.0121983e-01 1.8447840e+00 9.3329055e-01 1.7901165e+00 1.4035225e+00 1.6222582e+00 2.4980210e+00 8.1757693e-01 2.1693127e+00 1.6187837e+00 2.0049100e+00 1.0151397e+00 1.1261381e+00 1.3938113e+00 9.0657539e-01 1.2362756e+00 1.2472959e+00 1.3154932e+00 2.6088344e+00 2.7785257e+00 9.0207914e-01 1.5972548e+00 8.5406674e-01 2.6071034e+00 7.7652636e-01 1.5358856e+00 1.8953567e+00 6.9518117e-01 7.4612718e-01 1.4220925e+00 1.7511588e+00 2.0440071e+00 2.4804818e+00 1.4362913e+00 9.1449234e-01 1.4003402e+00 2.2077377e+00 1.4867147e+00 1.3085752e+00 6.7720780e-01 1.3734975e+00 1.5100598e+00 1.3269962e+00 9.3329055e-01 1.7441015e+00 1.6143613e+00 1.2552584e+00 8.7796615e-01 1.0782751e+00 1.3029195e+00 9.1424659e-01 5.0000761e-01 1.2040406e+00 1.1269424e-01 1.8289847e+00 9.1424701e-01 1.7872748e+00 1.4023776e+00 1.6144390e+00 2.4974488e+00 8.0533198e-01 2.1691714e+00 1.6179842e+00 1.9948417e+00 9.9013884e-01 1.1186586e+00 1.3842454e+00 8.5583357e-01 1.1527671e+00 1.1990152e+00 1.3139296e+00 2.6085083e+00 2.7775771e+00 8.5440680e-01 1.5835478e+00 7.8886139e-01 2.6068470e+00 7.5508853e-01 1.5300146e+00 1.8950932e+00 6.5712813e-01 7.2036951e-01 1.4134189e+00 1.7511120e+00 2.0435901e+00 2.4807480e+00 1.4220898e+00 9.1424701e-01 1.4002005e+00 2.2048860e+00 1.4562730e+00 1.3069754e+00 6.3309258e-01 1.3632211e+00 1.4815986e+00 1.2921474e+00 9.1424701e-01 1.7351894e+00 1.5836236e+00 1.2085436e+00 8.4725834e-01 1.0597879e+00 1.2653025e+00 9.0508756e-01 1.3743342e+00 5.0043084e-01 1.7369589e+00 8.2635069e-01 1.6144390e+00 1.3008770e+00 1.5131090e+00 2.3226028e+00 1.3004854e+00 2.0107294e+00 1.5010034e+00 1.8390199e+00 8.5471446e-01 1.0087539e+00 1.2223855e+00 8.0073117e-01 1.1286018e+00 1.1270411e+00 1.2013529e+00 2.4290388e+00 2.6198428e+00 7.8895472e-01 1.4363167e+00 7.7598796e-01 2.4266979e+00 6.3178782e-01 1.4100098e+00 1.7134977e+00 5.6347549e-01 6.3165225e-01 1.3130978e+00 1.5237265e+00 1.8289379e+00 2.1979419e+00 1.3253497e+00 8.0004602e-01 1.3000455e+00 1.9028805e+00 1.3748188e+00 1.2012991e+00 5.6371422e-01 1.1400420e+00 1.3748220e+00 1.0597992e+00 8.2635069e-01 1.6184929e+00 1.4858469e+00 1.0797702e+00 7.4612830e-01 9.3329055e-01 1.1910002e+00 8.0923926e-01 1.1056785e+00 3.0089448e+00 2.1019570e+00 2.9563162e+00 2.6052626e+00 2.8107271e+00 3.6717374e+00 1.5012719e+00 3.3522198e+00 2.8186527e+00 3.1596417e+00 2.1362161e+00 2.3151198e+00 2.5461024e+00 2.0036629e+00 2.1224665e+00 2.3234228e+00 2.5150159e+00 3.7801779e+00 3.9623034e+00 2.0033816e+00 2.7467405e+00 1.9044216e+00 3.7784933e+00 1.9231092e+00 2.7237438e+00 3.0623796e+00 1.8186729e+00 1.9089573e+00 2.6097166e+00 2.8846684e+00 3.1885494e+00 3.5706709e+00 2.6109888e+00 2.1139043e+00 2.6017555e+00 3.2706949e+00 2.6138780e+00 2.5099937e+00 1.8069857e+00 2.4748863e+00 2.6338874e+00 2.2385678e+00 2.1019570e+00 2.9251726e+00 2.7321685e+00 2.2661994e+00 2.0190735e+00 2.2288464e+00 2.4131370e+00 2.1020441e+00 1.9226845e+00 1.0087252e+00 1.8684939e+00 1.5017097e+00 1.7108631e+00 2.5816562e+00 8.0533198e-01 2.2563154e+00 1.7134977e+00 2.0770423e+00 1.0604287e+00 1.2124777e+00 1.4620239e+00 9.3329017e-01 1.1896594e+00 1.2705641e+00 1.4098496e+00 2.6923501e+00 2.8659663e+00 9.1449234e-01 1.6637458e+00 8.5403428e-01 2.6902417e+00 8.3183672e-01 1.6225614e+00 1.9757175e+00 7.3084048e-01 8.1117067e-01 1.5097082e+00 1.8197097e+00 2.1169795e+00 2.5408329e+00 1.5160570e+00 1.0087393e+00 1.5001233e+00 2.2573596e+00 1.5423651e+00 1.4049376e+00 7.1708289e-01 1.4229011e+00 1.5611429e+00 1.3142952e+00 1.0087252e+00 1.8271493e+00 1.6639408e+00 1.2552635e+00 9.2768675e-01 1.1400420e+00 1.3479052e+00 1.0031018e+00 9.3184922e-01 8.0291749e-01 7.0910969e-01 3.4342562e-01 1.3028005e+00 1.6474201e+00 1.0216374e+00 8.5586571e-01 9.0026543e-01 9.0508756e-01 7.7598796e-01 5.7832449e-01 1.0522594e+00 9.0999313e-01 7.0008735e-01 7.1708289e-01 1.4049376e+00 1.4220925e+00 1.2553121e+00 6.0202028e-01 1.1170561e+00 1.4055109e+00 1.1186497e+00 4.5783248e-01 9.3306769e-01 1.2101609e+00 1.1134939e+00 5.3914287e-01 1.0144117e+00 1.1074742e+00 1.6007365e+00 5.2491734e-01 1.0797700e+00 1.1139044e+00 1.4000349e+00 4.0004442e-01 7.1629303e-01 1.2090477e+00 6.8170466e-01 4.5148429e-01 9.1427000e-01 9.3184922e-01 5.0043842e-01 4.1209001e-01 8.0296037e-01 1.0498226e+00 8.0928056e-01 6.0018299e-01 9.3446811e-01 1.3131410e+00 5.6371422e-01 7.8985507e-01 1.8949500e+00 9.1427000e-01 1.5639785e+00 9.3308891e-01 1.4501583e+00 7.1621748e-01 6.0017665e-01 1.0010209e+00 2.0181667e-01 5.0000761e-01 6.3925756e-01 7.0548283e-01 2.0162299e+00 2.0885102e+00 5.2167829e-01 1.1079931e+00 2.2608083e-01 2.0057464e+00 5.0043084e-01 9.2747919e-01 1.4186217e+00 4.1212852e-01 3.4085233e-01 6.3178782e-01 1.4043632e+00 1.6175925e+00 2.1298991e+00 6.3309258e-01 5.2133179e-01 5.6595908e-01 1.9078843e+00 7.4418186e-01 6.1830764e-01 3.4085233e-01 1.1006468e+00 9.1132198e-01 1.1010711e+00 0.0000000e+00 1.0458540e+00 9.3984267e-01 9.0166476e-01 5.0043084e-01 7.0088627e-01 7.0993998e-01 3.0017653e-01 8.0093160e-01 6.0000635e-01 7.1621613e-01 2.2268632e+00 4.1317535e-01 5.2491734e-01 6.0964891e-01 8.2421923e-01 7.4335736e-01 4.1209001e-01 1.4186217e+00 1.3131410e+00 7.4275547e-01 6.1119267e-01 9.1566538e-01 1.0095513e+00 1.1796101e+00 2.5399984e-01 1.5237074e+00 8.2421923e-01 1.0429127e+00 4.1315633e-01 3.0490481e-01 1.1528553e+00 1.1270325e+00 7.0096708e-01 5.0001522e-01 3.1328089e-01 9.0657583e-01 7.0096858e-01 9.1568820e-01 1.0216374e+00 6.0035305e-01 8.0337471e-01 7.0548283e-01 1.2396937e+00 5.0043084e-01 4.2270142e-01 8.0008964e-01 1.3131410e+00 3.0915245e-01 4.5847767e-01 7.0470720e-01 9.6936870e-01 7.4262964e-01 9.0645118e-01 1.2190260e+00 4.0246123e-01 1.3450652e+00 1.4544312e+00 1.0207258e+00 4.5147187e-01 9.6501813e-01 5.0517282e-01 3.0490481e-01 5.0437695e-01 6.8170466e-01 6.5712813e-01 5.0855778e-01 2.0121983e-01 1.4695463e+00 1.5267750e+00 7.4395693e-01 6.3309258e-01 7.8890806e-01 1.4542932e+00 7.0008432e-01 4.5784410e-01 9.0166431e-01 8.0000160e-01 7.0008584e-01 3.0017653e-01 9.0005094e-01 1.1019505e+00 1.6144405e+00 4.0004442e-01 5.0436965e-01 4.1315633e-01 1.4012283e+00 6.3164729e-01 2.0121983e-01 8.0046685e-01 6.0219099e-01 6.0964597e-01 6.5724028e-01 5.6371422e-01 5.6838732e-01 7.0911112e-01 5.3914287e-01 6.0948506e-01 4.0246123e-01 5.6371422e-01 5.2133179e-01 1.1281267e+00 1.6745375e+00 8.1112984e-01 5.2167208e-01 7.4395693e-01 7.0016860e-01 5.0855778e-01 3.3813251e-01 9.0659977e-01 7.8895472e-01 5.0043842e-01 4.1209001e-01 1.2528048e+00 1.3020492e+00 9.3861512e-01 4.0127250e-01 1.0142766e+00 1.2362810e+00 9.0168933e-01 3.0490481e-01 7.0478886e-01 1.0010209e+00 9.0279223e-01 2.2608083e-01 7.4262850e-01 9.0055475e-01 1.4109657e+00 2.2573593e-01 7.8895472e-01 8.0492246e-01 1.2000668e+00 4.0363334e-01 4.1212852e-01 1.0039060e+00 4.5080200e-01 2.4195741e-01 7.0462844e-01 7.8985507e-01 3.0490481e-01 3.4085233e-01 6.0017982e-01 8.0928056e-01 6.0017665e-01 4.5784410e-01 7.4612718e-01 2.7992301e+00 3.6259865e-01 9.6953662e-01 6.4620889e-01 1.5401330e+00 1.4140789e+00 1.1281265e+00 2.0058560e+00 1.8949500e+00 1.4140515e+00 1.2396937e+00 8.0000239e-01 4.1317535e-01 1.8064092e+00 9.3310976e-01 2.1167364e+00 2.0181667e-01 1.7570696e+00 1.0143975e+00 6.1135434e-01 1.8661434e+00 1.8197089e+00 1.2632995e+00 8.1112909e-01 5.0126466e-01 8.0051115e-01 1.2632996e+00 1.5975200e+00 1.5266891e+00 5.0043084e-01 1.3452695e+00 1.3018553e+00 1.9314575e+00 1.2089192e+00 1.0777307e+00 1.5030978e+00 1.8949500e+00 8.5409862e-01 1.0151880e+00 1.4180463e+00 1.6742781e+00 1.4542907e+00 1.4853863e+00 1.8197089e+00 2.4725511e+00 1.8443040e+00 2.3518103e+00 1.6032169e+00 1.5066818e+00 1.9080163e+00 8.0923851e-01 9.4532171e-01 1.5109394e+00 1.6179000e+00 2.9132779e+00 2.9705619e+00 1.1020600e+00 2.0185049e+00 7.0633229e-01 2.9085831e+00 1.4001717e+00 1.8310931e+00 2.3325127e+00 1.3000908e+00 1.2016381e+00 1.5402579e+00 2.3143334e+00 2.5314248e+00 3.0393618e+00 1.5405402e+00 1.4018011e+00 1.3018553e+00 2.8185850e+00 1.4728279e+00 1.5248833e+00 1.1020506e+00 2.0036931e+00 1.8191683e+00 2.0009584e+00 9.1427000e-01 1.9534067e+00 1.8336293e+00 1.8020058e+00 1.4006178e+00 1.6026130e+00 1.3506710e+00 1.0116724e+00 6.3912709e-01 7.8890806e-01 1.2190319e+00 1.0776296e+00 8.0923926e-01 1.6740888e+00 1.5650163e+00 1.0798806e+00 9.0155438e-01 9.0417295e-01 6.4049114e-01 1.4685147e+00 6.4049114e-01 1.7843537e+00 4.5148429e-01 1.4324350e+00 6.8261201e-01 3.3813251e-01 1.5401311e+00 1.4852570e+00 9.3329055e-01 5.0043842e-01 2.0181667e-01 9.1424701e-01 9.3424697e-01 1.2633467e+00 1.2093243e+00 5.2167829e-01 1.0313359e+00 9.6574336e-01 1.5965767e+00 9.0168933e-01 7.7603846e-01 1.2016443e+00 1.5639785e+00 5.7832449e-01 7.7882758e-01 1.1074742e+00 1.3452311e+00 1.1281352e+00 1.1558746e+00 1.4852570e+00 1.1153247e+00 7.8895472e-01 5.0477564e-01 5.0855778e-01 1.0426636e+00 9.4532171e-01 7.3155911e-01 5.0476836e-01 1.3669148e+00 1.1910003e+00 8.5471446e-01 7.1629303e-01 1.1528553e+00 1.0777411e+00 9.0142636e-01 8.0046685e-01 7.1629168e-01 1.0032293e+00 9.1892413e-01 3.6452132e-01 5.6370994e-01 7.0176271e-01 1.4157327e+00 4.2362917e-01 7.0633229e-01 6.0964891e-01 1.0062544e+00 9.1554656e-01 6.0365948e-01 1.0235118e+00 6.1135434e-01 6.7626502e-01 7.5508853e-01 9.3308891e-01 7.1621884e-01 8.5403428e-01 6.5712608e-01 8.0245824e-01 6.3192325e-01 9.1132198e-01 8.6051414e-01 1.0242692e+00 1.0232576e+00 6.8685125e-01 1.5761415e+00 1.4407364e+00 9.0296858e-01 8.3689956e-01 6.3322667e-01 1.0451812e+00 1.5490134e+00 4.5847767e-01 1.6529028e+00 8.3916809e-01 1.2749306e+00 5.4219811e-01 7.0462697e-01 1.3611955e+00 1.3103292e+00 9.0792879e-01 9.1446896e-01 8.2421853e-01 7.1708289e-01 9.0683128e-01 1.1954899e+00 1.2957636e+00 6.3178534e-01 9.0508756e-01 8.7796615e-01 1.4198077e+00 7.2113820e-01 6.0427481e-01 1.0032443e+00 1.4501583e+00 4.5216167e-01 5.2491131e-01 9.1894698e-01 1.2738390e+00 9.4912864e-01 1.0207533e+00 1.3523292e+00 5.0043842e-01 4.1317535e-01 8.5403428e-01 7.0910969e-01 3.0482299e-01 4.0243965e-01 1.6491696e+00 1.8289467e+00 1.0060994e+00 6.1119267e-01 9.0142636e-01 1.6484371e+00 5.0126466e-01 6.0018299e-01 9.3308853e-01 4.2362917e-01 4.0363334e-01 5.2133802e-01 7.9153339e-01 1.0782107e+00 1.5275160e+00 5.2167829e-01 5.2167208e-01 6.9987517e-01 1.2633516e+00 5.2201750e-01 4.0127250e-01 5.0517282e-01 4.1212852e-01 5.2167829e-01 4.1210927e-01 7.1621748e-01 8.0093081e-01 6.3178782e-01 3.0922892e-01 7.0008735e-01 2.0061436e-01 3.6452132e-01 6.0035305e-01 4.1420960e-01 7.0096858e-01 6.3178782e-01 5.2132556e-01 3.0490481e-01 1.5634961e+00 1.6740875e+00 5.4219811e-01 5.8750389e-01 8.0245903e-01 1.5263478e+00 4.0004442e-01 6.1135434e-01 8.6051471e-01 5.0043842e-01 4.2270142e-01 3.0482299e-01 8.0967961e-01 1.0426513e+00 1.5757929e+00 3.3813251e-01 4.0127250e-01 5.0855778e-01 1.3133662e+00 7.1700909e-01 4.0125062e-01 5.2491734e-01 5.2167829e-01 5.2838320e-01 5.3943256e-01 6.0017665e-01 6.4620889e-01 6.8261201e-01 4.2270142e-01 3.0482299e-01 3.0026460e-01 7.0470867e-01 5.0477564e-01 1.1038840e+00 1.0010209e+00 4.0363334e-01 3.3808272e-01 1.2528049e+00 1.4182049e+00 9.2033101e-01 2.4195741e-01 1.2036925e+00 1.2362756e+00 6.3451734e-01 3.0482299e-01 5.2524663e-01 7.4335736e-01 7.4329414e-01 4.0125062e-01 5.2491131e-01 6.7636452e-01 1.1755449e+00 4.0127250e-01 6.3925756e-01 7.9148746e-01 9.1424659e-01 5.2491734e-01 4.1210927e-01 8.5437440e-01 1.2085435e-01 3.0026460e-01 4.0127250e-01 1.0010209e+00 4.0243965e-01 4.1317535e-01 3.0482299e-01 6.0444249e-01 3.3813251e-01 6.0964891e-01 9.0166431e-01 4.1212852e-01 7.8985507e-01 8.1719606e-01 2.1378157e+00 2.2009978e+00 5.0855077e-01 1.2175952e+00 3.0017653e-01 2.1167404e+00 6.0035621e-01 1.0597879e+00 1.5265797e+00 5.0517282e-01 5.2167829e-01 7.4329527e-01 1.5072282e+00 1.7227391e+00 2.2434054e+00 7.4335736e-01 6.3309258e-01 6.8161057e-01 2.0107350e+00 9.2867113e-01 7.5508853e-01 5.0517282e-01 1.2040344e+00 1.0178820e+00 1.2037520e+00 2.0181667e-01 1.1636098e+00 1.0621172e+00 1.0032443e+00 6.0000317e-01 8.0883841e-01 9.0668287e-01 5.0085236e-01 6.0964891e-01 7.4618926e-01 2.0118073e+00 2.0884859e+00 9.1424701e-01 1.1060939e+00 4.0243965e-01 2.0057764e+00 6.3178782e-01 9.1916394e-01 1.4198627e+00 6.1119267e-01 6.0219099e-01 6.3309012e-01 1.4134218e+00 1.6179000e+00 2.1265315e+00 6.3178534e-01 9.0506254e-01 1.0032443e+00 1.9078396e+00 6.5712608e-01 6.8261201e-01 6.0219099e-01 1.1003034e+00 9.0532049e-01 1.1001014e+00 5.0000761e-01 1.0433444e+00 9.1892454e-01 9.0002615e-01 5.6595908e-01 7.0470867e-01 6.1119558e-01 6.0017982e-01 5.0085236e-01 1.5275160e+00 1.6747664e+00 1.0434746e+00 5.2132556e-01 8.0533198e-01 1.5264802e+00 5.7609230e-01 4.1317535e-01 8.6051414e-01 5.7630313e-01 5.2524663e-01 4.1315633e-01 8.6054545e-01 1.0440350e+00 1.5412701e+00 4.1210927e-01 8.0250202e-01 9.1471442e-01 1.3130978e+00 3.0490481e-01 5.0043084e-01 5.7630313e-01 5.0043842e-01 3.3818226e-01 5.0043084e-01 6.3925756e-01 6.0948212e-01 4.1317535e-01 3.0482299e-01 7.0548283e-01 3.0490481e-01 2.2573593e-01 5.6394820e-01 1.3634093e+00 1.4858469e+00 8.1757693e-01 5.2201750e-01 9.1427000e-01 1.3523380e+00 6.0201716e-01 3.4342562e-01 7.1629168e-01 7.0096708e-01 6.0948212e-01 3.0490481e-01 7.0096708e-01 9.1424701e-01 1.4267554e+00 4.0127250e-01 4.1420960e-01 4.8342635e-01 1.2049539e+00 6.0964891e-01 1.1269424e-01 7.1621613e-01 4.1212852e-01 6.0018299e-01 5.3914287e-01 7.0548283e-01 5.2524663e-01 7.0105084e-01 5.0476836e-01 5.6371422e-01 3.0474106e-01 5.2491734e-01 6.0948212e-01 1.2000065e+00 2.0187441e+00 1.0498228e+00 2.2315584e+00 1.0000152e+00 1.8808952e+00 1.1286798e+00 7.5826453e-01 1.9821126e+00 1.9334872e+00 1.4094023e+00 9.7944085e-01 1.0090312e+00 3.0915245e-01 1.4094022e+00 1.7226330e+00 1.6785116e+00 8.2418071e-01 1.4544336e+00 1.4183053e+00 2.0448570e+00 1.3189240e+00 1.1989547e+00 1.6071563e+00 2.0162299e+00 9.7599312e-01 1.1287691e+00 1.5299044e+00 1.8304280e+00 1.5694554e+00 1.5966664e+00 1.9334872e+00 2.0448570e+00 1.2223853e+00 2.3135239e+00 3.0915245e-01 2.0415522e+00 1.2703001e+00 9.2351241e-01 2.1487275e+00 2.0854181e+00 1.4650300e+00 1.1157320e+00 8.0296037e-01 1.2013591e+00 1.4650276e+00 1.8684939e+00 1.6818191e+00 8.0245746e-01 1.5324961e+00 1.5271597e+00 2.1953922e+00 1.5071120e+00 1.3457716e+00 1.8029854e+00 2.0885102e+00 1.0837575e+00 1.2703001e+00 1.7133162e+00 1.9522053e+00 1.7369702e+00 1.6941963e+00 2.0286286e+00 1.1213597e+00 6.3912943e-01 1.9163315e+00 5.0855778e-01 1.1310337e+00 1.3142952e+00 6.0219099e-01 8.0046764e-01 7.2904264e-01 1.2366099e+00 1.4559030e+00 2.0467625e+00 7.7882758e-01 6.0184622e-01 6.0948800e-01 1.7296063e+00 1.2395260e+00 9.0668287e-01 8.0051036e-01 1.0231745e+00 1.0411548e+00 1.0543951e+00 5.2167829e-01 1.1356187e+00 1.2079042e+00 9.3439622e-01 4.2268438e-01 8.1719606e-01 1.2192978e+00 8.0046764e-01 1.3133662e+00 1.0434746e+00 8.3916809e-01 2.2573593e-01 5.0855077e-01 9.3848935e-01 9.0659977e-01 5.2167829e-01 7.0096858e-01 5.5450500e-01 1.0287902e+00 5.2133802e-01 8.4725834e-01 9.7599312e-01 8.0250123e-01 6.0018299e-01 5.6371422e-01 1.0171340e+00 3.0482299e-01 2.0181667e-01 6.0000317e-01 1.1079931e+00 2.0061436e-01 2.2573593e-01 5.0084481e-01 8.1683095e-01 5.2524663e-01 7.0096708e-01 1.0116865e+00 2.2278855e+00 7.0008584e-01 1.1298552e+00 1.6300950e+00 6.0017982e-01 5.0084481e-01 8.5403428e-01 1.6097507e+00 1.8284464e+00 2.3350903e+00 8.5406616e-01 7.1629168e-01 7.5508853e-01 2.1138813e+00 8.1683095e-01 8.2462252e-01 4.0246123e-01 1.3009222e+00 1.1139906e+00 1.3000951e+00 2.2608083e-01 1.2636227e+00 1.1315710e+00 1.1002119e+00 7.0088627e-01 9.0029018e-01 6.9600743e-01 3.1328089e-01 1.8661354e+00 1.1286798e+00 7.2044167e-01 1.9755679e+00 1.9314520e+00 1.3741466e+00 9.0645118e-01 6.0184622e-01 1.0001751e+00 1.3741498e+00 1.7083042e+00 1.6308665e+00 6.0201716e-01 1.4559030e+00 1.4140789e+00 2.0433026e+00 1.3131370e+00 1.1900969e+00 1.6049479e+00 2.0057464e+00 9.6691372e-01 1.1304042e+00 1.5237285e+00 1.7843627e+00 1.5639785e+00 1.5975352e+00 1.9314520e+00 8.2671175e-01 1.1543257e+00 1.2085435e-01 3.0474106e-01 7.0088627e-01 1.0144117e+00 1.3018103e+00 1.7709153e+00 7.0462844e-01 3.0482299e-01 7.0470867e-01 1.4857440e+00 8.1457587e-01 6.0948506e-01 3.3813251e-01 6.4049114e-01 7.4954884e-01 6.3925756e-01 5.0043084e-01 1.0090834e+00 8.7372177e-01 5.2838320e-01 2.0121983e-01 3.4342562e-01 7.3084171e-01 4.1315633e-01 5.0855778e-01 9.1024401e-01 8.2498722e-01 5.0436965e-01 5.6595908e-01 7.2044167e-01 1.2101609e+00 5.0437695e-01 6.9987517e-01 8.1457660e-01 1.0010209e+00 4.1212852e-01 3.4342562e-01 9.3351278e-01 3.0915245e-01 3.0482299e-01 6.0052920e-01 9.2747919e-01 2.2608083e-01 4.0000000e-01 5.0476836e-01 8.5586571e-01 5.0477564e-01 5.0477564e-01 8.2498722e-01 1.2635707e+00 1.2396421e+00 8.0533198e-01 2.4170870e-01 4.0127250e-01 7.4618926e-01 8.0726668e-01 1.0151880e+00 1.1066159e+00 5.6371422e-01 9.1554656e-01 8.0879701e-01 1.3523345e+00 6.0366256e-01 6.3912943e-01 9.0532093e-01 1.4186217e+00 5.2133179e-01 7.1700909e-01 8.1719606e-01 1.0923439e+00 8.5409862e-01 1.0116865e+00 1.3253496e+00 2.0121983e-01 8.0051036e-01 1.1269596e+00 1.4140457e+00 1.8721285e+00 8.0250123e-01 3.3813251e-01 8.0250202e-01 1.5969056e+00 8.4536936e-01 7.0096708e-01 2.2538848e-01 7.4395693e-01 8.3222261e-01 7.1779518e-01 4.1212852e-01 1.1079931e+00 9.4151244e-01 5.7630313e-01 3.0490481e-01 4.1420960e-01 6.9509395e-01 3.4080442e-01 7.0184453e-01 1.1527745e+00 1.4140486e+00 1.8971345e+00 7.0556260e-01 3.1328089e-01 7.0910969e-01 1.6486410e+00 7.4618926e-01 6.0184622e-01 1.1269424e-01 8.0923926e-01 7.7598796e-01 8.0883916e-01 3.4085233e-01 1.0235254e+00 8.7240114e-01 6.3309012e-01 5.0043842e-01 4.1315633e-01 5.7609230e-01 2.2538848e-01 8.0888055e-01 1.0030868e+00 1.5299044e+00 1.0000000e-01 6.3164977e-01 7.0096708e-01 1.3008855e+00 6.0184622e-01 3.3813251e-01 8.0296037e-01 5.0476836e-01 3.6256305e-01 5.6618864e-01 6.3178782e-01 4.5847767e-01 5.2491734e-01 4.1420960e-01 6.0202028e-01 4.0127250e-01 6.0052920e-01 5.6618864e-01 3.4342562e-01 8.7372177e-01 8.2425704e-01 9.3308891e-01 1.1005554e+00 7.1700774e-01 9.6674360e-01 8.0051115e-01 1.2632995e+00 5.2491734e-01 8.0883916e-01 7.8935898e-01 1.4043632e+00 7.0470867e-01 9.0532093e-01 7.5502989e-01 9.6953662e-01 7.4612718e-01 1.0222576e+00 1.3061180e+00 1.0032296e+00 1.0032293e+00 1.1900276e+00 1.3017553e+00 4.1315633e-01 1.1093621e+00 1.0088783e+00 1.5263498e+00 7.1708289e-01 7.3155911e-01 1.0040629e+00 1.6175925e+00 6.1845783e-01 7.5826453e-01 9.3426769e-01 1.2396937e+00 1.0142626e+00 1.2128138e+00 1.5237074e+00 1.5299064e+00 1.6885111e+00 1.8315348e+00 8.0097499e-01 1.6050900e+00 1.5160591e+00 2.0074169e+00 1.1389082e+00 1.2275665e+00 1.3502668e+00 2.1298991e+00 1.1075720e+00 1.2113964e+00 1.3632538e+00 1.7639471e+00 1.4922544e+00 1.7133283e+00 2.0290146e+00 7.1621748e-01 8.0051036e-01 1.3008813e+00 6.0017982e-01 4.1210927e-01 8.0492246e-01 5.0477564e-01 3.4080442e-01 5.6595908e-01 6.3309258e-01 4.5784410e-01 5.0855778e-01 4.1317535e-01 6.0366256e-01 4.0246123e-01 6.0035621e-01 5.7630313e-01 5.0085236e-01 1.4407390e+00 9.1892413e-01 4.2270142e-01 3.6452132e-01 6.7824250e-01 9.0668287e-01 8.2458409e-01 5.2133179e-01 9.0792879e-01 1.0124729e+00 8.0250202e-01 4.1210927e-01 5.0085236e-01 8.2458478e-01 4.1315633e-01 1.6100639e+00 1.0426636e+00 5.2491734e-01 8.0488008e-01 8.6054545e-01 1.0116721e+00 9.7291273e-01 5.6595908e-01 9.4532171e-01 1.1186499e+00 9.1681464e-01 6.3178782e-01 6.2656178e-01 9.6574369e-01 5.3943256e-01 1.4007831e+00 1.3033860e+00 1.7572550e+00 8.5406674e-01 1.0030724e+00 1.0426513e+00 1.9078843e+00 9.0005048e-01 1.0010209e+00 1.0776188e+00 1.4549432e+00 1.2363278e+00 1.5032156e+00 1.8103044e+00 6.0184934e-01 8.2671175e-01 6.0383105e-01 4.1209001e-01 6.3309258e-01 7.4418186e-01 5.0477564e-01 4.0006662e-01 4.8342635e-01 9.1892413e-01 4.8391482e-01 2.0121983e-01 6.4620889e-01 7.0462697e-01 5.0436965e-01 6.0184622e-01 5.7608844e-01 6.1830764e-01 5.3914287e-01 7.0105084e-01 5.0855778e-01 6.3165225e-01 3.0490481e-01 5.0477564e-01 5.2133179e-01 9.1446938e-01 8.7209348e-01 9.0532093e-01 3.4085233e-01 1.1298636e+00 9.6150595e-01 7.2036819e-01 5.0477564e-01 5.2167208e-01 6.3925756e-01 3.0008832e-01 3.0915245e-01 3.0474106e-01 1.1006468e+00 5.0043842e-01 4.1420960e-01 2.4195741e-01 6.8170466e-01 4.0127250e-01 7.0096708e-01 1.0003198e+00 5.0043084e-01 9.1132198e-01 3.0026460e-01 2.0121983e-01 4.0004442e-01 6.9987517e-01 4.5148429e-01 5.0477564e-01 8.3183672e-01 1.1010711e+00 8.0000160e-01 6.0052920e-01 2.0121983e-01 6.8161057e-01 4.1212852e-01 7.0176121e-01 1.0030721e+00 1.0458540e+00 9.3984267e-01 9.0166476e-01 5.0043084e-01 7.0088627e-01 7.0993998e-01 3.0017653e-01 2.2608083e-01 7.0008584e-01 9.3848935e-01 7.0184453e-01 6.3178534e-01 9.6936870e-01 5.0476836e-01 8.7372177e-01 5.6618864e-01 5.0477564e-01 8.7240114e-01 5.3943256e-01 3.0474106e-01 5.2167208e-01 8.0879701e-01 5.0085236e-01 9.0279268e-01 5.2133802e-01 4.2362917e-01 6.0017982e-01 5.2838320e-01 Added: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-17 21:15:51 UTC (rev 4147) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 02:13:12 UTC (rev 4148) @@ -0,0 +1,401 @@ +#! /usr/bin/env python + +# Author: Damian Eads +# Date: April 17, 2008 + +# Copyright (C) 2008 Damian Eads +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +import sys +import os.path +from scipy.testing import * +from scipy.cluster.hierarchy import pdist + +import numpy +#import math + +#from scipy.cluster.hierarchy import pdist, euclidean + +_filenames = ["iris.txt", + "pdist-hamming-ml.txt", + "pdist-boolean-inp.txt", + "pdist-jaccard-ml.txt", + "pdist-cityblock-ml-iris.txt", + "pdist-minkowski-3.2-ml-iris.txt", + "pdist-cityblock-ml.txt", + "pdist-correlation-ml-iris.txt", + "pdist-minkowski-5.8-ml-iris.txt", + "pdist-correlation-ml.txt", + "pdist-minkowski-3.2-ml.txt", + "pdist-cosine-ml-iris.txt", + "pdist-seuclidean-ml-iris.txt", + "pdist-cosine-ml.txt", + "pdist-seuclidean-ml.txt", + "pdist-double-inp.txt", + "pdist-spearman-ml.txt", + "pdist-euclidean-ml.txt", + "pdist-euclidean-ml-iris.txt"] + +# A hashmap of expected output arrays for the tests. These arrays +# come from a list of text files, which are read prior to testing. + +eo = {} + +def load_testing_files(): + for fn in _filenames: + name = fn.replace(".txt", "").replace("-ml", "") + fqfn = os.path.join(os.path.dirname(__file__), fn) + eo[name] = numpy.loadtxt(open(fqfn)) + #print "%s: %s %s" % (name, str(eo[name].shape), str(eo[name].dtype)) + eo['pdist-boolean-inp'] = numpy.bool_(eo['pdist-boolean-inp']) + +load_testing_files() + +#print eo.keys() + + +#print numpy.abs(Y_test2 - Y_right).max() +#print numpy.abs(Y_test1 - Y_right).max() + +class TestPdist(TestCase): + + ################### pdist: euclidean + def test_pdist_euclidean_random(self): + "Tests pdist(X, 'euclidean') on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-euclidean'] + + Y_test1 = pdist(X, 'euclidean') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_euclidean_random_nonC(self): + "Tests pdist(X, 'test_euclidean') [the non-C implementation] on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-euclidean'] + Y_test2 = pdist(X, 'test_euclidean') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_euclidean_iris(self): + "Tests pdist(X, 'euclidean') on the Iris data set." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-euclidean-iris'] + + Y_test1 = pdist(X, 'euclidean') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_euclidean_iris_nonC(self): + "Tests pdist(X, 'test_euclidean') [the non-C implementation] on the Iris data set." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-euclidean-iris'] + Y_test2 = pdist(X, 'test_euclidean') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: seuclidean + def test_pdist_seuclidean_random(self): + "Tests pdist(X, 'seuclidean') on random data." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-seuclidean'] + + Y_test1 = pdist(X, 'seuclidean') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_seuclidean_random_nonC(self): + "Tests pdist(X, 'test_sqeuclidean') [the non-C implementation] on random data." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-seuclidean'] + Y_test2 = pdist(X, 'test_sqeuclidean') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_seuclidean_iris(self): + "Tests pdist(X, 'seuclidean') on the Iris data set." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-seuclidean-iris'] + + Y_test1 = pdist(X, 'seuclidean') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_seuclidean_iris_nonC(self): + "Tests pdist(X, 'test_seuclidean') [the non-C implementation] on the Iris data set." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-seuclidean-iris'] + Y_test2 = pdist(X, 'test_sqeuclidean') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: cosine + def test_pdist_cosine_random(self): + "Tests pdist(X, 'cosine') on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-cosine'] + + Y_test1 = pdist(X, 'cosine') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_cosine_random_nonC(self): + "Tests pdist(X, 'test_cosine') [the non-C implementation] on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-cosine'] + Y_test2 = pdist(X, 'test_cosine') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_cosine_iris(self): + "Tests pdist(X, 'cosine') on the Iris data set." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-cosine-iris'] + + Y_test1 = pdist(X, 'cosine') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + #print "cosine-iris", numpy.abs(Y_test1 - Y_right).max() + + def test_pdist_cosine_iris_nonC(self): + "Tests pdist(X, 'test_cosine') [the non-C implementation] on the Iris data set." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-cosine-iris'] + Y_test2 = pdist(X, 'test_cosine') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: cityblock + def test_pdist_cityblock_random(self): + "Tests pdist(X, 'cityblock') on random data." + eps = 1e-06 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-cityblock'] + + Y_test1 = pdist(X, 'cityblock') + #print "cityblock", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_cityblock_random_nonC(self): + "Tests pdist(X, 'test_cityblock') [the non-C implementation] on random data." + eps = 1e-06 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-cityblock'] + Y_test2 = pdist(X, 'test_cityblock') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_cityblock_iris(self): + "Tests pdist(X, 'cityblock') on the Iris data set." + eps = 1e-14 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-cityblock-iris'] + + Y_test1 = pdist(X, 'cityblock') + self.failUnless(within_tol(Y_test1, Y_right, eps)) + #print "cityblock-iris", numpy.abs(Y_test1 - Y_right).max() + + def test_pdist_cityblock_iris_nonC(self): + "Tests pdist(X, 'test_cityblock') [the non-C implementation] on the Iris data set." + eps = 1e-14 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-cityblock-iris'] + Y_test2 = pdist(X, 'test_cityblock') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: correlation + def test_pdist_correlation_random(self): + "Tests pdist(X, 'correlation') on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-correlation'] + + Y_test1 = pdist(X, 'correlation') + #print "correlation", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_correlation_random_nonC(self): + "Tests pdist(X, 'test_correlation') [the non-C implementation] on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-correlation'] + Y_test2 = pdist(X, 'test_correlation') + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_correlation_iris(self): + "Tests pdist(X, 'correlation') on the Iris data set." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-correlation-iris'] + + Y_test1 = pdist(X, 'correlation') + #print "correlation-iris", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_correlation_iris_nonC(self): + "Tests pdist(X, 'test_correlation') [the non-C implementation] on the Iris data set." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-correlation-iris'] + Y_test2 = pdist(X, 'test_correlation') + #print "test-correlation-iris", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################# minkowski + + def test_pdist_minkowski_random(self): + "Tests pdist(X, 'minkowski') on random data." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-minkowski-3.2'] + + Y_test1 = pdist(X, 'minkowski', 3.2) + #print "minkowski", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_minkowski_random_nonC(self): + "Tests pdist(X, 'test_minkowski') [the non-C implementation] on random data." + eps = 1e-05 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-minkowski-3.2'] + Y_test2 = pdist(X, 'test_minkowski', 3.2) + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_minkowski_iris(self): + "Tests pdist(X, 'minkowski') on iris data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-minkowski-3.2-iris'] + + Y_test1 = pdist(X, 'minkowski', 3.2) + #print "minkowski-iris-3.2", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_minkowski_iris_nonC(self): + "Tests pdist(X, 'test_minkowski') [the non-C implementation] on iris data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-minkowski-3.2-iris'] + Y_test2 = pdist(X, 'test_minkowski', 3.2) + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_minkowski_iris(self): + "Tests pdist(X, 'minkowski') on iris data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-minkowski-5.8-iris'] + + Y_test1 = pdist(X, 'minkowski', 5.8) + #print "minkowski-iris-5.8", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_minkowski_iris_nonC(self): + "Tests pdist(X, 'test_minkowski') [the non-C implementation] on iris data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-minkowski-5.8-iris'] + Y_test2 = pdist(X, 'test_minkowski', 5.8) + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: hamming + def test_pdist_hamming_random(self): + "Tests pdist(X, 'hamming') on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-boolean-inp'] + Y_right = eo['pdist-hamming'] + + Y_test1 = pdist(X, 'hamming') + #print "hamming", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_hamming_random_nonC(self): + "Tests pdist(X, 'test_hamming') [the non-C implementation] on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = eo['pdist-boolean-inp'] + Y_right = eo['pdist-hamming'] + Y_test2 = pdist(X, 'test_hamming') + #print "test-hamming", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: jaccard + def test_pdist_jaccard_random(self): + "Tests pdist(X, 'jaccard') on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-boolean-inp'] + Y_right = eo['pdist-jaccard'] + + Y_test1 = pdist(X, 'jaccard') + #print "jaccard", numpy.abs(Y_test1 - Y_right).max() + #self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_jaccard_random_nonC(self): + "Tests pdist(X, 'test_jaccard') [the non-C implementation] on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-boolean-inp'] + Y_right = eo['pdist-jaccard'] + Y_test2 = pdist(X, 'test_jaccard') + #print "test-jaccard", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + +def within_tol(a, b, tol): + return numpy.abs(a - b).max() < tol + +if __name__ == "__main__": + nose.run(argv=['', __file__]) From scipy-svn at scipy.org Thu Apr 17 22:25:28 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 21:25:28 -0500 (CDT) Subject: [Scipy-svn] r4149 - in trunk/scipy/cluster: . tests Message-ID: <20080418022528.61B1A39C472@new.scipy.org> Author: damian.eads Date: 2008-04-17 21:25:25 -0500 (Thu, 17 Apr 2008) New Revision: 4149 Modified: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/tests/test_hierarchy.py Log: Added test to make sure pdist checks properly for observation matrices of unsupported type. Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-18 02:13:12 UTC (rev 4148) +++ trunk/scipy/cluster/hierarchy.py 2008-04-18 02:25:25 UTC (rev 4149) @@ -1301,7 +1301,7 @@ if type(X) is not _array_type: raise TypeError('The parameter passed must be an array.') - if X.dtype == 'float32': + if X.dtype == 'float32' or X.dtype == 'float96': raise TypeError('Floating point arrays must be 64-bit.') # The C code doesn't do striding. Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 02:13:12 UTC (rev 4148) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 02:25:25 UTC (rev 4149) @@ -1,8 +1,8 @@ #! /usr/bin/env python - +# # Author: Damian Eads # Date: April 17, 2008 - +# # Copyright (C) 2008 Damian Eads # # Redistribution and use in source and binary forms, with or without @@ -87,6 +87,49 @@ class TestPdist(TestCase): + def test_pdist_raises_type_error_float32(self): + "Testing whether passing a float32 observation array generates an exception." + X = numpy.zeros((10, 10), dtype='float32') + try: + pdist(X, 'euclidean') + except TypeError: + pass + except: + fail("float32 matrices should generate an error in pdist.") + + def test_pdist_raises_type_error_float96(self): + "Testing whether passing a float96 observation array generates an exception." + X = numpy.zeros((10, 10), dtype='float96') + try: + pdist(X, 'euclidean') + except TypeError: + pass + except: + fail("float96 matrices should generate an error in pdist.") + + def test_pdist_var_raises_type_error_float32(self): + "Testing whether passing a float32 variance matrix generates an exception." + X = numpy.zeros((10, 10)) + V = numpy.zeros((10, 10), dtype='float32') + try: + pdist(X, 'seuclidean', V) + except TypeError: + pass + except: + fail("float32 matrices should generate an error in pdist.") + + def test_pdist_var_raises_type_error_float96(self): + "Testing whether passing a float96 variance matrix generates an exception." + X = numpy.zeros((10, 10)) + V = numpy.zeros((10, 10), dtype='float96') + + try: + pdist(X, 'seuclidean', V) + except TypeError: + pass + except: + fail("float96 matrices should generate an error in pdist.") + ################### pdist: euclidean def test_pdist_euclidean_random(self): "Tests pdist(X, 'euclidean') on random data." From scipy-svn at scipy.org Thu Apr 17 23:06:38 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 22:06:38 -0500 (CDT) Subject: [Scipy-svn] r4150 - trunk/scipy/cluster/tests Message-ID: <20080418030638.9913B39C432@new.scipy.org> Author: damian.eads Date: 2008-04-17 22:06:35 -0500 (Thu, 17 Apr 2008) New Revision: 4150 Added: trunk/scipy/cluster/tests/pdist-chebychev-ml-iris.txt trunk/scipy/cluster/tests/pdist-chebychev-ml.txt Modified: trunk/scipy/cluster/tests/test_hierarchy.py Log: Added test for chebychev distance function. Added: trunk/scipy/cluster/tests/pdist-chebychev-ml-iris.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-chebychev-ml-iris.txt 2008-04-18 02:25:25 UTC (rev 4149) +++ trunk/scipy/cluster/tests/pdist-chebychev-ml-iris.txt 2008-04-18 03:06:35 UTC (rev 4150) @@ -0,0 +1 @@ + 5.0000000e-01 4.0000000e-01 5.0000000e-01 1.0000000e-01 4.0000000e-01 5.0000000e-01 1.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 8.0000000e-01 7.0000000e-01 9.0000000e-01 4.0000000e-01 1.0000000e-01 6.0000000e-01 3.0000000e-01 3.0000000e-01 2.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 2.0000000e-01 1.0000000e-01 1.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e-01 1.0000000e-01 1.2000000e+00 7.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 2.0000000e-01 2.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 2.0000000e-01 3.0000000e-01 6.0000000e-01 9.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 1.0000000e-01 7.0000000e-01 4.0000000e-01 1.0000000e-01 6.0000000e-01 1.0000000e+00 1.4000000e+00 9.0000000e-01 5.0000000e-01 8.0000000e-01 8.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 3.0000000e-01 5.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 2.0000000e-01 2.0000000e-01 5.0000000e-01 1.1000000e+00 1.2000000e+00 1.0000000e-01 2.0000000e-01 6.0000000e-01 1.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e-01 8.0000000e-01 3.0000000e-01 7.0000000e-01 3.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 2.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 3.0000000e-01 3.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 1.1000000e+00 1.2000000e+00 7.0000000e-01 4.0000000e-01 1.0000000e+00 6.0000000e-01 7.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 6.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 7.0000000e-01 9.0000000e-01 1.0000000e+00 2.0000000e-01 3.0000000e-01 8.0000000e-01 2.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 9.0000000e-01 3.0000000e-01 4.0000000e-01 6.0000000e-01 2.0000000e-01 6.0000000e-01 1.0000000e-01 6.0000000e-01 3.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 5.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 2.0000000e-01 3.0000000e-01 8.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 1.2000000e+00 1.3000000e+00 8.0000000e-01 5.0000000e-01 1.1000000e+00 7.0000000e-01 8.0000000e-01 6.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 6.0000000e-01 6.0000000e-01 1.0000000e-01 2.0000000e-01 8.0000000e-01 1.0000000e+00 1.1000000e+00 3.0000000e-01 4.0000000e-01 9.0000000e-01 3.0000000e-01 2.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 2.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 1.0000000e-01 7.0000000e-01 4.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 4.0000000e-01 4.0000000e-01 2.0000000e-01 7.0000000e-01 5.0000000e-01 4.0000000e-01 2.0000000e-01 6.0000000e-01 7.0000000e-01 8.0000000e-01 8.0000000e-01 4.0000000e-01 1.0000000e-01 7.0000000e-01 2.0000000e-01 4.0000000e-01 2.0000000e-01 4.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 2.0000000e-01 2.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 2.0000000e-01 1.0000000e-01 1.3000000e+00 6.0000000e-01 4.0000000e-01 5.0000000e-01 6.0000000e-01 2.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 8.0000000e-01 5.0000000e-01 1.0000000e+00 8.0000000e-01 2.0000000e-01 6.0000000e-01 9.0000000e-01 1.1000000e+00 5.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 7.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 4.0000000e-01 1.6000000e+00 1.0000000e+00 4.0000000e-01 3.0000000e-01 9.0000000e-01 3.0000000e-01 8.0000000e-01 2.0000000e-01 6.0000000e-01 3.0000000e+00 2.8000000e+00 3.2000000e+00 2.3000000e+00 2.9000000e+00 2.8000000e+00 3.0000000e+00 1.6000000e+00 2.9000000e+00 2.2000000e+00 1.9000000e+00 2.5000000e+00 2.3000000e+00 3.0000000e+00 1.9000000e+00 2.7000000e+00 2.8000000e+00 2.4000000e+00 2.8000000e+00 2.2000000e+00 3.1000000e+00 2.3000000e+00 3.2000000e+00 3.0000000e+00 2.6000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.8000000e+00 1.8000000e+00 2.1000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 2.8000000e+00 2.8000000e+00 3.0000000e+00 2.7000000e+00 2.4000000e+00 2.3000000e+00 2.7000000e+00 2.9000000e+00 2.3000000e+00 1.6000000e+00 2.5000000e+00 2.5000000e+00 2.5000000e+00 2.6000000e+00 1.4000000e+00 2.4000000e+00 4.3000000e+00 3.4000000e+00 4.2000000e+00 3.9000000e+00 4.1000000e+00 4.9000000e+00 2.8000000e+00 4.6000000e+00 4.1000000e+00 4.4000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 5.0000000e+00 5.2000000e+00 3.3000000e+00 4.0000000e+00 3.2000000e+00 5.0000000e+00 3.2000000e+00 4.0000000e+00 4.3000000e+00 3.1000000e+00 3.2000000e+00 3.9000000e+00 4.1000000e+00 4.4000000e+00 4.7000000e+00 3.9000000e+00 3.4000000e+00 3.9000000e+00 4.4000000e+00 3.9000000e+00 3.8000000e+00 3.1000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.4000000e+00 4.2000000e+00 4.0000000e+00 3.5000000e+00 3.3000000e+00 3.5000000e+00 3.7000000e+00 3.4000000e+00 4.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 2.0000000e-01 4.0000000e-01 4.0000000e-01 1.2000000e+00 1.1000000e+00 8.0000000e-01 5.0000000e-01 1.1000000e+00 5.0000000e-01 8.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 6.0000000e-01 6.0000000e-01 2.0000000e-01 3.0000000e-01 8.0000000e-01 7.0000000e-01 9.0000000e-01 3.0000000e-01 4.0000000e-01 9.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 1.1000000e+00 2.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 2.0000000e-01 7.0000000e-01 4.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 6.0000000e-01 3.0000000e-01 4.0000000e-01 2.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 1.0000000e-01 7.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 5.0000000e-01 3.0000000e-01 4.0000000e-01 4.0000000e-01 2.0000000e-01 2.0000000e-01 2.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 3.0000000e-01 6.0000000e-01 1.0000000e-01 2.0000000e-01 1.1000000e+00 6.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 1.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 5.0000000e-01 1.0000000e+00 5.0000000e-01 4.0000000e-01 3.0000000e-01 1.4000000e+00 1.5000000e+00 1.0000000e+00 7.0000000e-01 1.3000000e+00 9.0000000e-01 1.0000000e+00 8.0000000e-01 7.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 8.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 1.0000000e+00 1.2000000e+00 1.3000000e+00 5.0000000e-01 6.0000000e-01 1.1000000e+00 5.0000000e-01 1.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 6.0000000e-01 9.0000000e-01 4.0000000e-01 9.0000000e-01 3.0000000e-01 9.0000000e-01 6.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 6.0000000e-01 3.0000000e-01 1.0000000e-01 6.0000000e-01 9.0000000e-01 1.3000000e+00 8.0000000e-01 4.0000000e-01 8.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 1.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 1.0000000e-01 5.0000000e-01 1.0000000e+00 1.1000000e+00 0.0000000e+00 3.0000000e-01 6.0000000e-01 0.0000000e+00 5.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 6.0000000e-01 2.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 6.0000000e-01 7.0000000e-01 1.1000000e+00 4.0000000e-01 7.0000000e-01 2.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 2.0000000e-01 3.0000000e-01 7.0000000e-01 6.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 2.0000000e-01 6.0000000e-01 1.0000000e+00 3.0000000e-01 4.0000000e-01 1.4000000e+00 1.0000000e+00 4.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 8.0000000e-01 1.0000000e-01 4.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 4.0000000e-01 5.0000000e-01 1.0000000e+00 1.0000000e+00 6.0000000e-01 3.0000000e-01 9.0000000e-01 4.0000000e-01 6.0000000e-01 3.0000000e-01 6.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 2.0000000e-01 4.0000000e-01 4.0000000e-01 2.0000000e-01 3.0000000e-01 6.0000000e-01 7.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 1.1000000e+00 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 2.0000000e-01 5.0000000e-01 2.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 5.0000000e-01 1.0000000e+00 1.4000000e+00 9.0000000e-01 5.0000000e-01 9.0000000e-01 8.0000000e-01 6.0000000e-01 7.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 2.0000000e-01 2.0000000e-01 6.0000000e-01 1.1000000e+00 1.2000000e+00 1.0000000e-01 2.0000000e-01 7.0000000e-01 1.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 4.0000000e-01 5.0000000e-01 8.0000000e-01 2.0000000e-01 8.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 1.5000000e+00 1.4000000e+00 1.1000000e+00 8.0000000e-01 1.4000000e+00 8.0000000e-01 1.1000000e+00 8.0000000e-01 6.0000000e-01 8.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 9.0000000e-01 9.0000000e-01 5.0000000e-01 5.0000000e-01 1.1000000e+00 1.1000000e+00 1.2000000e+00 6.0000000e-01 7.0000000e-01 1.2000000e+00 6.0000000e-01 2.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 8.0000000e-01 3.0000000e-01 1.0000000e+00 7.0000000e-01 3.6000000e+00 3.4000000e+00 3.8000000e+00 2.9000000e+00 3.5000000e+00 3.4000000e+00 3.6000000e+00 2.2000000e+00 3.5000000e+00 2.8000000e+00 2.4000000e+00 3.1000000e+00 2.9000000e+00 3.6000000e+00 2.5000000e+00 3.3000000e+00 3.4000000e+00 3.0000000e+00 3.4000000e+00 2.8000000e+00 3.7000000e+00 2.9000000e+00 3.8000000e+00 3.6000000e+00 3.2000000e+00 3.3000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 2.4000000e+00 2.7000000e+00 2.6000000e+00 2.8000000e+00 4.0000000e+00 3.4000000e+00 3.4000000e+00 3.6000000e+00 3.3000000e+00 3.0000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 2.9000000e+00 2.2000000e+00 3.1000000e+00 3.1000000e+00 3.1000000e+00 3.2000000e+00 1.9000000e+00 3.0000000e+00 4.9000000e+00 4.0000000e+00 4.8000000e+00 4.5000000e+00 4.7000000e+00 5.5000000e+00 3.4000000e+00 5.2000000e+00 4.7000000e+00 5.0000000e+00 4.0000000e+00 4.2000000e+00 4.4000000e+00 3.9000000e+00 4.0000000e+00 4.2000000e+00 4.4000000e+00 5.6000000e+00 5.8000000e+00 3.9000000e+00 4.6000000e+00 3.8000000e+00 5.6000000e+00 3.8000000e+00 4.6000000e+00 4.9000000e+00 3.7000000e+00 3.8000000e+00 4.5000000e+00 4.7000000e+00 5.0000000e+00 5.3000000e+00 4.5000000e+00 4.0000000e+00 4.5000000e+00 5.0000000e+00 4.5000000e+00 4.4000000e+00 3.7000000e+00 4.3000000e+00 4.5000000e+00 4.0000000e+00 4.0000000e+00 4.8000000e+00 4.6000000e+00 4.1000000e+00 3.9000000e+00 4.1000000e+00 4.3000000e+00 4.0000000e+00 4.0000000e-01 4.0000000e-01 7.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 7.0000000e-01 1.2000000e+00 7.0000000e-01 1.0000000e+00 1.0000000e+00 8.0000000e-01 6.0000000e-01 6.0000000e-01 1.1000000e+00 1.0000000e+00 6.0000000e-01 6.0000000e-01 3.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 9.0000000e-01 1.4000000e+00 7.0000000e-01 8.0000000e-01 1.7000000e+00 1.4000000e+00 8.0000000e-01 7.0000000e-01 1.0000000e+00 7.0000000e-01 1.2000000e+00 5.0000000e-01 8.0000000e-01 3.5000000e+00 3.3000000e+00 3.7000000e+00 2.8000000e+00 3.4000000e+00 3.3000000e+00 3.5000000e+00 2.1000000e+00 3.4000000e+00 2.7000000e+00 2.3000000e+00 3.0000000e+00 2.8000000e+00 3.5000000e+00 2.4000000e+00 3.2000000e+00 3.3000000e+00 2.9000000e+00 3.3000000e+00 2.7000000e+00 3.6000000e+00 2.8000000e+00 3.7000000e+00 3.5000000e+00 3.1000000e+00 3.2000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 2.3000000e+00 2.6000000e+00 2.5000000e+00 2.7000000e+00 3.9000000e+00 3.3000000e+00 3.3000000e+00 3.5000000e+00 3.2000000e+00 2.9000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.8000000e+00 2.1000000e+00 3.0000000e+00 3.0000000e+00 3.0000000e+00 3.1000000e+00 1.8000000e+00 2.9000000e+00 4.8000000e+00 3.9000000e+00 4.7000000e+00 4.4000000e+00 4.6000000e+00 5.4000000e+00 3.3000000e+00 5.1000000e+00 4.6000000e+00 4.9000000e+00 3.9000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.9000000e+00 4.1000000e+00 4.3000000e+00 5.5000000e+00 5.7000000e+00 3.8000000e+00 4.5000000e+00 3.7000000e+00 5.5000000e+00 3.7000000e+00 4.5000000e+00 4.8000000e+00 3.6000000e+00 3.7000000e+00 4.4000000e+00 4.6000000e+00 4.9000000e+00 5.2000000e+00 4.4000000e+00 3.9000000e+00 4.4000000e+00 4.9000000e+00 4.4000000e+00 4.3000000e+00 3.6000000e+00 4.2000000e+00 4.4000000e+00 3.9000000e+00 3.9000000e+00 4.7000000e+00 4.5000000e+00 4.0000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.9000000e+00 5.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 1.0000000e+00 7.0000000e-01 1.1000000e+00 1.1000000e+00 1.0000000e+00 1.4000000e+00 1.0000000e+00 9.0000000e-01 1.0000000e+00 1.2000000e+00 1.3000000e+00 1.0000000e+00 5.0000000e-01 2.0000000e-01 1.3000000e+00 1.2000000e+00 9.0000000e-01 1.3000000e+00 1.4000000e+00 1.0000000e+00 9.0000000e-01 2.1000000e+00 1.3000000e+00 9.0000000e-01 6.0000000e-01 1.4000000e+00 6.0000000e-01 1.2000000e+00 7.0000000e-01 1.1000000e+00 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 2.0000000e+00 3.1000000e+00 2.4000000e+00 2.4000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 2.1000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.9000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 4.0000000e-01 4.0000000e-01 3.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 7.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 4.0000000e-01 1.6000000e+00 1.0000000e+00 4.0000000e-01 6.0000000e-01 9.0000000e-01 3.0000000e-01 8.0000000e-01 2.0000000e-01 6.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 6.0000000e-01 3.0000000e-01 3.0000000e-01 2.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 2.0000000e-01 1.0000000e-01 1.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e-01 1.0000000e-01 1.2000000e+00 7.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 2.0000000e-01 2.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 6.0000000e-01 4.0000000e-01 6.0000000e-01 1.1000000e+00 6.0000000e-01 9.0000000e-01 8.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 1.0000000e+00 9.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 7.0000000e-01 4.0000000e-01 8.0000000e-01 1.3000000e+00 6.0000000e-01 7.0000000e-01 1.5000000e+00 1.3000000e+00 7.0000000e-01 6.0000000e-01 9.0000000e-01 6.0000000e-01 1.1000000e+00 4.0000000e-01 7.0000000e-01 3.0000000e+00 2.8000000e+00 3.2000000e+00 2.3000000e+00 2.9000000e+00 2.8000000e+00 3.0000000e+00 1.6000000e+00 2.9000000e+00 2.2000000e+00 1.8000000e+00 2.5000000e+00 2.3000000e+00 3.0000000e+00 1.9000000e+00 2.7000000e+00 2.8000000e+00 2.4000000e+00 2.8000000e+00 2.2000000e+00 3.1000000e+00 2.3000000e+00 3.2000000e+00 3.0000000e+00 2.6000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.8000000e+00 1.8000000e+00 2.1000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 2.8000000e+00 2.8000000e+00 3.0000000e+00 2.7000000e+00 2.4000000e+00 2.3000000e+00 2.7000000e+00 2.9000000e+00 2.3000000e+00 1.6000000e+00 2.5000000e+00 2.5000000e+00 2.5000000e+00 2.6000000e+00 1.3000000e+00 2.4000000e+00 4.3000000e+00 3.4000000e+00 4.2000000e+00 3.9000000e+00 4.1000000e+00 4.9000000e+00 2.8000000e+00 4.6000000e+00 4.1000000e+00 4.4000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 5.0000000e+00 5.2000000e+00 3.3000000e+00 4.0000000e+00 3.2000000e+00 5.0000000e+00 3.2000000e+00 4.0000000e+00 4.3000000e+00 3.1000000e+00 3.2000000e+00 3.9000000e+00 4.1000000e+00 4.4000000e+00 4.7000000e+00 3.9000000e+00 3.4000000e+00 3.9000000e+00 4.4000000e+00 3.9000000e+00 3.8000000e+00 3.1000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.4000000e+00 4.2000000e+00 4.0000000e+00 3.5000000e+00 3.3000000e+00 3.5000000e+00 3.7000000e+00 3.4000000e+00 4.0000000e-01 1.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 7.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 4.0000000e-01 3.0000000e-01 1.5000000e+00 7.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e-01 6.0000000e-01 2.0000000e-01 5.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 3.0000000e-01 8.0000000e-01 3.0000000e-01 6.0000000e-01 4.0000000e-01 4.0000000e-01 2.0000000e-01 3.0000000e-01 7.0000000e-01 6.0000000e-01 2.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 1.0000000e+00 3.0000000e-01 4.0000000e-01 1.1000000e+00 1.0000000e+00 4.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e+00 2.8000000e+00 3.2000000e+00 2.3000000e+00 2.9000000e+00 2.8000000e+00 3.0000000e+00 1.6000000e+00 2.9000000e+00 2.2000000e+00 1.8000000e+00 2.5000000e+00 2.3000000e+00 3.0000000e+00 1.9000000e+00 2.7000000e+00 2.8000000e+00 2.4000000e+00 2.8000000e+00 2.2000000e+00 3.1000000e+00 2.3000000e+00 3.2000000e+00 3.0000000e+00 2.6000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.8000000e+00 1.8000000e+00 2.1000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 2.8000000e+00 2.8000000e+00 3.0000000e+00 2.7000000e+00 2.4000000e+00 2.3000000e+00 2.7000000e+00 2.9000000e+00 2.3000000e+00 1.6000000e+00 2.5000000e+00 2.5000000e+00 2.5000000e+00 2.6000000e+00 1.3000000e+00 2.4000000e+00 4.3000000e+00 3.4000000e+00 4.2000000e+00 3.9000000e+00 4.1000000e+00 4.9000000e+00 2.8000000e+00 4.6000000e+00 4.1000000e+00 4.4000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 5.0000000e+00 5.2000000e+00 3.3000000e+00 4.0000000e+00 3.2000000e+00 5.0000000e+00 3.2000000e+00 4.0000000e+00 4.3000000e+00 3.1000000e+00 3.2000000e+00 3.9000000e+00 4.1000000e+00 4.4000000e+00 4.7000000e+00 3.9000000e+00 3.4000000e+00 3.9000000e+00 4.4000000e+00 3.9000000e+00 3.8000000e+00 3.1000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.4000000e+00 4.2000000e+00 4.0000000e+00 3.5000000e+00 3.3000000e+00 3.5000000e+00 3.7000000e+00 3.4000000e+00 5.0000000e-01 4.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 2.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 3.0000000e-01 2.0000000e-01 1.4000000e+00 7.0000000e-01 2.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 5.0000000e-01 2.0000000e-01 4.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 7.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 9.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 4.0000000e-01 1.3000000e+00 4.0000000e-01 6.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 4.0000000e-01 3.7000000e+00 3.5000000e+00 3.9000000e+00 3.0000000e+00 3.6000000e+00 3.5000000e+00 3.7000000e+00 2.3000000e+00 3.6000000e+00 2.9000000e+00 2.5000000e+00 3.2000000e+00 3.0000000e+00 3.7000000e+00 2.6000000e+00 3.4000000e+00 3.5000000e+00 3.1000000e+00 3.5000000e+00 2.9000000e+00 3.8000000e+00 3.0000000e+00 3.9000000e+00 3.7000000e+00 3.3000000e+00 3.4000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 2.5000000e+00 2.8000000e+00 2.7000000e+00 2.9000000e+00 4.1000000e+00 3.5000000e+00 3.5000000e+00 3.7000000e+00 3.4000000e+00 3.1000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.0000000e+00 2.3000000e+00 3.2000000e+00 3.2000000e+00 3.2000000e+00 3.3000000e+00 2.0000000e+00 3.1000000e+00 5.0000000e+00 4.1000000e+00 4.9000000e+00 4.6000000e+00 4.8000000e+00 5.6000000e+00 3.5000000e+00 5.3000000e+00 4.8000000e+00 5.1000000e+00 4.1000000e+00 4.3000000e+00 4.5000000e+00 4.0000000e+00 4.1000000e+00 4.3000000e+00 4.5000000e+00 5.7000000e+00 5.9000000e+00 4.0000000e+00 4.7000000e+00 3.9000000e+00 5.7000000e+00 3.9000000e+00 4.7000000e+00 5.0000000e+00 3.8000000e+00 3.9000000e+00 4.6000000e+00 4.8000000e+00 5.1000000e+00 5.4000000e+00 4.6000000e+00 4.1000000e+00 4.6000000e+00 5.1000000e+00 4.6000000e+00 4.5000000e+00 3.8000000e+00 4.4000000e+00 4.6000000e+00 4.1000000e+00 4.1000000e+00 4.9000000e+00 4.7000000e+00 4.2000000e+00 4.0000000e+00 4.2000000e+00 4.4000000e+00 4.1000000e+00 3.0000000e-01 3.0000000e-01 1.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 9.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 4.0000000e-01 1.0000000e+00 7.0000000e-01 2.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e+00 2.8000000e+00 3.2000000e+00 2.3000000e+00 2.9000000e+00 2.8000000e+00 3.0000000e+00 1.6000000e+00 2.9000000e+00 2.2000000e+00 1.8000000e+00 2.5000000e+00 2.3000000e+00 3.0000000e+00 1.9000000e+00 2.7000000e+00 2.8000000e+00 2.4000000e+00 2.8000000e+00 2.2000000e+00 3.1000000e+00 2.3000000e+00 3.2000000e+00 3.0000000e+00 2.6000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.8000000e+00 1.8000000e+00 2.1000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 2.8000000e+00 2.8000000e+00 3.0000000e+00 2.7000000e+00 2.4000000e+00 2.3000000e+00 2.7000000e+00 2.9000000e+00 2.3000000e+00 1.6000000e+00 2.5000000e+00 2.5000000e+00 2.5000000e+00 2.6000000e+00 1.3000000e+00 2.4000000e+00 4.3000000e+00 3.4000000e+00 4.2000000e+00 3.9000000e+00 4.1000000e+00 4.9000000e+00 2.8000000e+00 4.6000000e+00 4.1000000e+00 4.4000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 5.0000000e+00 5.2000000e+00 3.3000000e+00 4.0000000e+00 3.2000000e+00 5.0000000e+00 3.2000000e+00 4.0000000e+00 4.3000000e+00 3.1000000e+00 3.2000000e+00 3.9000000e+00 4.1000000e+00 4.4000000e+00 4.7000000e+00 3.9000000e+00 3.4000000e+00 3.9000000e+00 4.4000000e+00 3.9000000e+00 3.8000000e+00 3.1000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.4000000e+00 4.2000000e+00 4.0000000e+00 3.5000000e+00 3.3000000e+00 3.5000000e+00 3.7000000e+00 3.4000000e+00 4.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 6.0000000e-01 7.0000000e-01 8.0000000e-01 4.0000000e-01 7.0000000e-01 7.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 6.0000000e-01 1.1000000e+00 6.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 2.8000000e+00 2.6000000e+00 3.0000000e+00 2.1000000e+00 2.7000000e+00 2.6000000e+00 2.8000000e+00 1.4000000e+00 2.7000000e+00 2.0000000e+00 1.6000000e+00 2.3000000e+00 2.1000000e+00 2.8000000e+00 1.7000000e+00 2.5000000e+00 2.6000000e+00 2.2000000e+00 2.6000000e+00 2.0000000e+00 2.9000000e+00 2.1000000e+00 3.0000000e+00 2.8000000e+00 2.4000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.6000000e+00 1.6000000e+00 1.9000000e+00 1.8000000e+00 2.0000000e+00 3.2000000e+00 2.6000000e+00 2.6000000e+00 2.8000000e+00 2.5000000e+00 2.2000000e+00 2.1000000e+00 2.5000000e+00 2.7000000e+00 2.1000000e+00 1.4000000e+00 2.3000000e+00 2.3000000e+00 2.3000000e+00 2.4000000e+00 1.1000000e+00 2.2000000e+00 4.1000000e+00 3.2000000e+00 4.0000000e+00 3.7000000e+00 3.9000000e+00 4.7000000e+00 2.6000000e+00 4.4000000e+00 3.9000000e+00 4.2000000e+00 3.2000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 3.2000000e+00 3.4000000e+00 3.6000000e+00 4.8000000e+00 5.0000000e+00 3.1000000e+00 3.8000000e+00 3.0000000e+00 4.8000000e+00 3.0000000e+00 3.8000000e+00 4.1000000e+00 2.9000000e+00 3.0000000e+00 3.7000000e+00 3.9000000e+00 4.2000000e+00 4.5000000e+00 3.7000000e+00 3.2000000e+00 3.7000000e+00 4.2000000e+00 3.7000000e+00 3.6000000e+00 2.9000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 3.2000000e+00 4.0000000e+00 3.8000000e+00 3.3000000e+00 3.1000000e+00 3.3000000e+00 3.5000000e+00 3.2000000e+00 4.0000000e-01 5.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 1.1000000e+00 1.2000000e+00 1.0000000e-01 4.0000000e-01 5.0000000e-01 1.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 8.0000000e-01 2.0000000e-01 8.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 2.0000000e-01 2.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 3.0000000e-01 6.0000000e-01 2.0000000e-01 3.0000000e-01 1.1000000e+00 6.0000000e-01 2.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 1.0000000e-01 5.0000000e-01 4.0000000e-01 2.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e-01 2.0000000e-01 1.2000000e+00 8.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 3.0000000e-01 6.0000000e-01 2.0000000e-01 2.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 5.0000000e-01 4.0000000e-01 2.0000000e-01 7.0000000e-01 8.0000000e-01 3.0000000e-01 2.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 1.0000000e-01 2.0000000e-01 1.1000000e+00 8.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 6.0000000e-01 3.0000000e-01 2.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 1.0000000e-01 7.0000000e-01 9.0000000e-01 1.0000000e+00 2.0000000e-01 4.0000000e-01 8.0000000e-01 2.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 9.0000000e-01 3.0000000e-01 4.0000000e-01 6.0000000e-01 2.0000000e-01 6.0000000e-01 2.0000000e-01 6.0000000e-01 3.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 6.0000000e-01 1.0000000e+00 1.1000000e+00 1.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 4.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 2.0000000e-01 6.0000000e-01 2.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 7.0000000e-01 8.0000000e-01 5.0000000e-01 4.0000000e-01 2.0000000e-01 5.0000000e-01 1.0000000e+00 3.0000000e-01 4.0000000e-01 1.1000000e+00 1.0000000e+00 4.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 8.0000000e-01 3.0000000e-01 4.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 3.0000000e-01 1.0000000e+00 9.0000000e-01 6.0000000e-01 1.0000000e+00 1.1000000e+00 7.0000000e-01 6.0000000e-01 1.8000000e+00 9.0000000e-01 6.0000000e-01 4.0000000e-01 1.1000000e+00 3.0000000e-01 9.0000000e-01 4.0000000e-01 8.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.1000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.6000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 1.1000000e+00 1.0000000e+00 7.0000000e-01 1.1000000e+00 1.2000000e+00 8.0000000e-01 7.0000000e-01 1.9000000e+00 1.1000000e+00 7.0000000e-01 5.0000000e-01 1.2000000e+00 4.0000000e-01 1.0000000e+00 5.0000000e-01 9.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.2000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.7000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 3.0000000e-01 6.0000000e-01 0.0000000e+00 5.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 6.0000000e-01 2.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 5.0000000e-01 3.0000000e-01 6.0000000e-01 3.0000000e-01 3.0000000e-01 9.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 2.0000000e-01 3.5000000e+00 3.3000000e+00 3.7000000e+00 2.8000000e+00 3.4000000e+00 3.3000000e+00 3.5000000e+00 2.1000000e+00 3.4000000e+00 2.7000000e+00 2.3000000e+00 3.0000000e+00 2.8000000e+00 3.5000000e+00 2.4000000e+00 3.2000000e+00 3.3000000e+00 2.9000000e+00 3.3000000e+00 2.7000000e+00 3.6000000e+00 2.8000000e+00 3.7000000e+00 3.5000000e+00 3.1000000e+00 3.2000000e+00 3.6000000e+00 3.8000000e+00 3.3000000e+00 2.3000000e+00 2.6000000e+00 2.5000000e+00 2.7000000e+00 3.9000000e+00 3.3000000e+00 3.3000000e+00 3.5000000e+00 3.2000000e+00 2.9000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.8000000e+00 2.1000000e+00 3.0000000e+00 3.0000000e+00 3.0000000e+00 3.1000000e+00 1.8000000e+00 2.9000000e+00 4.8000000e+00 3.9000000e+00 4.7000000e+00 4.4000000e+00 4.6000000e+00 5.4000000e+00 3.3000000e+00 5.1000000e+00 4.6000000e+00 4.9000000e+00 3.9000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.9000000e+00 4.1000000e+00 4.3000000e+00 5.5000000e+00 5.7000000e+00 3.8000000e+00 4.5000000e+00 3.7000000e+00 5.5000000e+00 3.7000000e+00 4.5000000e+00 4.8000000e+00 3.6000000e+00 3.7000000e+00 4.4000000e+00 4.6000000e+00 4.9000000e+00 5.2000000e+00 4.4000000e+00 3.9000000e+00 4.4000000e+00 4.9000000e+00 4.4000000e+00 4.3000000e+00 3.6000000e+00 4.2000000e+00 4.4000000e+00 3.9000000e+00 3.9000000e+00 4.7000000e+00 4.5000000e+00 4.0000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.9000000e+00 6.0000000e-01 1.1000000e+00 4.0000000e-01 5.0000000e-01 1.2000000e+00 1.1000000e+00 5.0000000e-01 6.0000000e-01 7.0000000e-01 4.0000000e-01 9.0000000e-01 2.0000000e-01 5.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 5.0000000e-01 3.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 6.0000000e-01 2.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 7.0000000e-01 6.0000000e-01 7.0000000e-01 2.0000000e-01 6.0000000e-01 8.0000000e-01 4.0000000e-01 8.0000000e-01 2.0000000e-01 9.0000000e-01 6.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 2.0000000e-01 1.1000000e+00 7.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 3.0000000e-01 1.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 1.2000000e+00 6.0000000e-01 3.0000000e-01 6.0000000e-01 5.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 9.0000000e-01 1.2000000e+00 1.5000000e+00 7.0000000e-01 1.5000000e+00 9.0000000e-01 1.4000000e+00 1.0000000e+00 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 6.0000000e-01 7.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 9.0000000e-01 6.0000000e-01 3.4000000e+00 3.2000000e+00 3.6000000e+00 2.7000000e+00 3.3000000e+00 3.2000000e+00 3.4000000e+00 2.0000000e+00 3.3000000e+00 2.6000000e+00 2.2000000e+00 2.9000000e+00 2.7000000e+00 3.4000000e+00 2.3000000e+00 3.1000000e+00 3.2000000e+00 2.8000000e+00 3.2000000e+00 2.6000000e+00 3.5000000e+00 2.7000000e+00 3.6000000e+00 3.4000000e+00 3.0000000e+00 3.1000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 2.2000000e+00 2.5000000e+00 2.4000000e+00 2.6000000e+00 3.8000000e+00 3.2000000e+00 3.2000000e+00 3.4000000e+00 3.1000000e+00 2.8000000e+00 2.7000000e+00 3.1000000e+00 3.3000000e+00 2.7000000e+00 2.0000000e+00 2.9000000e+00 2.9000000e+00 2.9000000e+00 3.0000000e+00 1.7000000e+00 2.8000000e+00 4.7000000e+00 3.8000000e+00 4.6000000e+00 4.3000000e+00 4.5000000e+00 5.3000000e+00 3.2000000e+00 5.0000000e+00 4.5000000e+00 4.8000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.8000000e+00 4.0000000e+00 4.2000000e+00 5.4000000e+00 5.6000000e+00 3.7000000e+00 4.4000000e+00 3.6000000e+00 5.4000000e+00 3.6000000e+00 4.4000000e+00 4.7000000e+00 3.5000000e+00 3.6000000e+00 4.3000000e+00 4.5000000e+00 4.8000000e+00 5.1000000e+00 4.3000000e+00 3.8000000e+00 4.3000000e+00 4.8000000e+00 4.3000000e+00 4.2000000e+00 3.5000000e+00 4.1000000e+00 4.3000000e+00 3.8000000e+00 3.8000000e+00 4.6000000e+00 4.4000000e+00 3.9000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.8000000e+00 3.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 8.0000000e-01 3.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 2.8000000e+00 2.6000000e+00 3.0000000e+00 2.1000000e+00 2.7000000e+00 2.6000000e+00 2.8000000e+00 1.4000000e+00 2.7000000e+00 2.0000000e+00 1.8000000e+00 2.3000000e+00 2.1000000e+00 2.8000000e+00 1.7000000e+00 2.5000000e+00 2.6000000e+00 2.2000000e+00 2.6000000e+00 2.0000000e+00 2.9000000e+00 2.1000000e+00 3.0000000e+00 2.8000000e+00 2.4000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.6000000e+00 1.6000000e+00 1.9000000e+00 1.8000000e+00 2.0000000e+00 3.2000000e+00 2.6000000e+00 2.6000000e+00 2.8000000e+00 2.5000000e+00 2.2000000e+00 2.1000000e+00 2.5000000e+00 2.7000000e+00 2.1000000e+00 1.5000000e+00 2.3000000e+00 2.3000000e+00 2.3000000e+00 2.4000000e+00 1.3000000e+00 2.2000000e+00 4.1000000e+00 3.2000000e+00 4.0000000e+00 3.7000000e+00 3.9000000e+00 4.7000000e+00 2.6000000e+00 4.4000000e+00 3.9000000e+00 4.2000000e+00 3.2000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 3.2000000e+00 3.4000000e+00 3.6000000e+00 4.8000000e+00 5.0000000e+00 3.1000000e+00 3.8000000e+00 3.0000000e+00 4.8000000e+00 3.0000000e+00 3.8000000e+00 4.1000000e+00 2.9000000e+00 3.0000000e+00 3.7000000e+00 3.9000000e+00 4.2000000e+00 4.5000000e+00 3.7000000e+00 3.2000000e+00 3.7000000e+00 4.2000000e+00 3.7000000e+00 3.6000000e+00 2.9000000e+00 3.5000000e+00 3.7000000e+00 3.2000000e+00 3.2000000e+00 4.0000000e+00 3.8000000e+00 3.3000000e+00 3.1000000e+00 3.3000000e+00 3.5000000e+00 3.2000000e+00 8.0000000e-01 2.0000000e-01 7.0000000e-01 3.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 6.0000000e-01 2.0000000e-01 5.0000000e-01 3.1000000e+00 2.9000000e+00 3.3000000e+00 2.4000000e+00 3.0000000e+00 2.9000000e+00 3.1000000e+00 1.7000000e+00 3.0000000e+00 2.3000000e+00 1.9000000e+00 2.6000000e+00 2.4000000e+00 3.1000000e+00 2.0000000e+00 2.8000000e+00 2.9000000e+00 2.5000000e+00 2.9000000e+00 2.3000000e+00 3.2000000e+00 2.4000000e+00 3.3000000e+00 3.1000000e+00 2.7000000e+00 2.8000000e+00 3.2000000e+00 3.4000000e+00 2.9000000e+00 1.9000000e+00 2.2000000e+00 2.1000000e+00 2.3000000e+00 3.5000000e+00 2.9000000e+00 2.9000000e+00 3.1000000e+00 2.8000000e+00 2.5000000e+00 2.4000000e+00 2.8000000e+00 3.0000000e+00 2.4000000e+00 1.7000000e+00 2.6000000e+00 2.6000000e+00 2.6000000e+00 2.7000000e+00 1.4000000e+00 2.5000000e+00 4.4000000e+00 3.5000000e+00 4.3000000e+00 4.0000000e+00 4.2000000e+00 5.0000000e+00 2.9000000e+00 4.7000000e+00 4.2000000e+00 4.5000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.4000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 5.1000000e+00 5.3000000e+00 3.4000000e+00 4.1000000e+00 3.3000000e+00 5.1000000e+00 3.3000000e+00 4.1000000e+00 4.4000000e+00 3.2000000e+00 3.3000000e+00 4.0000000e+00 4.2000000e+00 4.5000000e+00 4.8000000e+00 4.0000000e+00 3.5000000e+00 4.0000000e+00 4.5000000e+00 4.0000000e+00 3.9000000e+00 3.2000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.5000000e+00 4.3000000e+00 4.1000000e+00 3.6000000e+00 3.4000000e+00 3.6000000e+00 3.8000000e+00 3.5000000e+00 7.0000000e-01 4.0000000e-01 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 4.0000000e-01 3.2000000e+00 3.0000000e+00 3.4000000e+00 2.5000000e+00 3.1000000e+00 3.0000000e+00 3.2000000e+00 1.8000000e+00 3.1000000e+00 2.4000000e+00 2.0000000e+00 2.7000000e+00 2.5000000e+00 3.2000000e+00 2.1000000e+00 2.9000000e+00 3.0000000e+00 2.6000000e+00 3.0000000e+00 2.4000000e+00 3.3000000e+00 2.5000000e+00 3.4000000e+00 3.2000000e+00 2.8000000e+00 2.9000000e+00 3.3000000e+00 3.5000000e+00 3.0000000e+00 2.0000000e+00 2.3000000e+00 2.2000000e+00 2.4000000e+00 3.6000000e+00 3.0000000e+00 3.0000000e+00 3.2000000e+00 2.9000000e+00 2.6000000e+00 2.5000000e+00 2.9000000e+00 3.1000000e+00 2.5000000e+00 1.8000000e+00 2.7000000e+00 2.7000000e+00 2.7000000e+00 2.8000000e+00 1.5000000e+00 2.6000000e+00 4.5000000e+00 3.6000000e+00 4.4000000e+00 4.1000000e+00 4.3000000e+00 5.1000000e+00 3.0000000e+00 4.8000000e+00 4.3000000e+00 4.6000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.5000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 5.2000000e+00 5.4000000e+00 3.5000000e+00 4.2000000e+00 3.4000000e+00 5.2000000e+00 3.4000000e+00 4.2000000e+00 4.5000000e+00 3.3000000e+00 3.4000000e+00 4.1000000e+00 4.3000000e+00 4.6000000e+00 4.9000000e+00 4.1000000e+00 3.6000000e+00 4.1000000e+00 4.6000000e+00 4.1000000e+00 4.0000000e+00 3.3000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.6000000e+00 4.4000000e+00 4.2000000e+00 3.7000000e+00 3.5000000e+00 3.7000000e+00 3.9000000e+00 3.6000000e+00 3.3000000e+00 3.1000000e+00 3.5000000e+00 2.6000000e+00 3.2000000e+00 3.1000000e+00 3.3000000e+00 1.9000000e+00 3.2000000e+00 2.5000000e+00 2.1000000e+00 2.8000000e+00 2.6000000e+00 3.3000000e+00 2.2000000e+00 3.0000000e+00 3.1000000e+00 2.7000000e+00 3.1000000e+00 2.5000000e+00 3.4000000e+00 2.6000000e+00 3.5000000e+00 3.3000000e+00 2.9000000e+00 3.0000000e+00 3.4000000e+00 3.6000000e+00 3.1000000e+00 2.1000000e+00 2.4000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.1000000e+00 3.1000000e+00 3.3000000e+00 3.0000000e+00 2.7000000e+00 2.6000000e+00 3.0000000e+00 3.2000000e+00 2.6000000e+00 1.9000000e+00 2.8000000e+00 2.8000000e+00 2.8000000e+00 2.9000000e+00 1.6000000e+00 2.7000000e+00 4.6000000e+00 3.7000000e+00 4.5000000e+00 4.2000000e+00 4.4000000e+00 5.2000000e+00 3.1000000e+00 4.9000000e+00 4.4000000e+00 4.7000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 3.6000000e+00 3.7000000e+00 3.9000000e+00 4.1000000e+00 5.3000000e+00 5.5000000e+00 3.6000000e+00 4.3000000e+00 3.5000000e+00 5.3000000e+00 3.5000000e+00 4.3000000e+00 4.6000000e+00 3.4000000e+00 3.5000000e+00 4.2000000e+00 4.4000000e+00 4.7000000e+00 5.0000000e+00 4.2000000e+00 3.7000000e+00 4.2000000e+00 4.7000000e+00 4.2000000e+00 4.1000000e+00 3.4000000e+00 4.0000000e+00 4.2000000e+00 3.7000000e+00 3.7000000e+00 4.5000000e+00 4.3000000e+00 3.8000000e+00 3.6000000e+00 3.8000000e+00 4.0000000e+00 3.7000000e+00 6.0000000e-01 2.0000000e-01 1.5000000e+00 5.0000000e-01 1.3000000e+00 7.0000000e-01 2.1000000e+00 4.0000000e-01 1.8000000e+00 2.0000000e+00 1.1000000e+00 1.0000000e+00 9.0000000e-01 1.4000000e+00 3.0000000e-01 1.4000000e+00 1.2000000e+00 1.0000000e+00 1.4000000e+00 1.1000000e+00 9.0000000e-01 7.0000000e-01 9.0000000e-01 6.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 1.0000000e+00 1.3000000e+00 1.5000000e+00 1.5000000e+00 1.2000000e+00 1.0000000e+00 1.6000000e+00 1.0000000e+00 3.0000000e-01 9.0000000e-01 1.4000000e+00 1.5000000e+00 1.5000000e+00 9.0000000e-01 1.2000000e+00 2.0000000e+00 1.4000000e+00 1.3000000e+00 1.3000000e+00 8.0000000e-01 1.9000000e+00 1.3000000e+00 1.3000000e+00 1.2000000e+00 1.2000000e+00 9.0000000e-01 1.1000000e+00 1.9000000e+00 2.1000000e+00 1.6000000e+00 1.1000000e+00 1.4000000e+00 6.0000000e-01 6.0000000e-01 8.0000000e-01 1.3000000e+00 1.2000000e+00 9.0000000e-01 8.0000000e-01 2.0000000e+00 2.2000000e+00 1.0000000e+00 1.0000000e+00 1.4000000e+00 2.0000000e+00 7.0000000e-01 1.0000000e+00 1.3000000e+00 8.0000000e-01 9.0000000e-01 9.0000000e-01 1.1000000e+00 1.4000000e+00 1.7000000e+00 9.0000000e-01 7.0000000e-01 9.0000000e-01 1.4000000e+00 1.0000000e+00 8.0000000e-01 1.0000000e+00 7.0000000e-01 1.0000000e+00 9.0000000e-01 1.2000000e+00 1.2000000e+00 1.1000000e+00 9.0000000e-01 7.0000000e-01 6.0000000e-01 9.0000000e-01 1.1000000e+00 5.0000000e-01 9.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 1.5000000e+00 3.0000000e-01 1.2000000e+00 1.4000000e+00 5.0000000e-01 1.0000000e+00 3.0000000e-01 9.0000000e-01 3.0000000e-01 8.0000000e-01 6.0000000e-01 1.0000000e+00 8.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 1.0000000e+00 9.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 1.0000000e+00 4.0000000e-01 3.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 9.0000000e-01 3.0000000e-01 6.0000000e-01 1.4000000e+00 8.0000000e-01 7.0000000e-01 7.0000000e-01 3.0000000e-01 1.5000000e+00 7.0000000e-01 1.5000000e+00 6.0000000e-01 1.4000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 1.5000000e+00 1.8000000e+00 1.3000000e+00 1.6000000e+00 6.0000000e-01 8.0000000e-01 1.0000000e+00 7.0000000e-01 9.0000000e-01 8.0000000e-01 1.0000000e+00 2.2000000e+00 2.4000000e+00 1.0000000e+00 1.2000000e+00 8.0000000e-01 2.2000000e+00 5.0000000e-01 1.2000000e+00 1.5000000e+00 4.0000000e-01 4.0000000e-01 1.1000000e+00 1.3000000e+00 1.6000000e+00 1.9000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 1.6000000e+00 1.1000000e+00 1.0000000e+00 4.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 6.0000000e-01 1.4000000e+00 1.2000000e+00 8.0000000e-01 7.0000000e-01 7.0000000e-01 9.0000000e-01 6.0000000e-01 1.4000000e+00 4.0000000e-01 1.2000000e+00 6.0000000e-01 2.0000000e+00 3.0000000e-01 1.7000000e+00 1.9000000e+00 1.0000000e+00 9.0000000e-01 8.0000000e-01 1.3000000e+00 5.0000000e-01 1.3000000e+00 1.1000000e+00 9.0000000e-01 1.3000000e+00 1.0000000e+00 9.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 5.0000000e-01 3.0000000e-01 2.0000000e-01 9.0000000e-01 1.4000000e+00 1.4000000e+00 1.4000000e+00 1.1000000e+00 9.0000000e-01 1.5000000e+00 9.0000000e-01 2.0000000e-01 8.0000000e-01 1.3000000e+00 1.4000000e+00 1.4000000e+00 8.0000000e-01 1.1000000e+00 1.9000000e+00 1.3000000e+00 1.2000000e+00 1.2000000e+00 7.0000000e-01 1.9000000e+00 1.2000000e+00 1.1000000e+00 1.1000000e+00 1.0000000e+00 7.0000000e-01 9.0000000e-01 1.7000000e+00 2.0000000e+00 1.4000000e+00 9.0000000e-01 1.2000000e+00 5.0000000e-01 5.0000000e-01 6.0000000e-01 1.2000000e+00 1.1000000e+00 8.0000000e-01 6.0000000e-01 1.8000000e+00 2.0000000e+00 9.0000000e-01 8.0000000e-01 1.3000000e+00 1.8000000e+00 6.0000000e-01 8.0000000e-01 1.1000000e+00 7.0000000e-01 8.0000000e-01 7.0000000e-01 9.0000000e-01 1.2000000e+00 1.5000000e+00 7.0000000e-01 6.0000000e-01 8.0000000e-01 1.2000000e+00 9.0000000e-01 6.0000000e-01 9.0000000e-01 6.0000000e-01 9.0000000e-01 8.0000000e-01 1.1000000e+00 1.0000000e+00 1.0000000e+00 8.0000000e-01 6.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e+00 1.0000000e+00 5.0000000e-01 1.0000000e+00 7.0000000e-01 1.1000000e+00 4.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 1.2000000e+00 7.0000000e-01 4.0000000e-01 7.0000000e-01 2.0000000e-01 9.0000000e-01 6.0000000e-01 9.0000000e-01 7.0000000e-01 9.0000000e-01 1.1000000e+00 1.3000000e+00 1.2000000e+00 6.0000000e-01 5.0000000e-01 2.0000000e-01 3.0000000e-01 4.0000000e-01 1.1000000e+00 7.0000000e-01 1.1000000e+00 1.2000000e+00 8.0000000e-01 7.0000000e-01 2.0000000e-01 4.0000000e-01 7.0000000e-01 3.0000000e-01 7.0000000e-01 4.0000000e-01 7.0000000e-01 6.0000000e-01 7.0000000e-01 1.0000000e+00 5.0000000e-01 2.0000000e+00 1.1000000e+00 1.9000000e+00 1.6000000e+00 1.8000000e+00 2.6000000e+00 6.0000000e-01 2.3000000e+00 1.8000000e+00 2.1000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.0000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 2.7000000e+00 2.9000000e+00 1.0000000e+00 1.7000000e+00 9.0000000e-01 2.7000000e+00 9.0000000e-01 1.7000000e+00 2.0000000e+00 8.0000000e-01 9.0000000e-01 1.6000000e+00 1.8000000e+00 2.1000000e+00 2.4000000e+00 1.6000000e+00 1.1000000e+00 1.6000000e+00 2.2000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 1.4000000e+00 1.6000000e+00 1.4000000e+00 1.1000000e+00 1.9000000e+00 1.7000000e+00 1.2000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.1000000e+00 8.0000000e-01 5.0000000e-01 1.6000000e+00 2.0000000e-01 1.3000000e+00 1.5000000e+00 6.0000000e-01 6.0000000e-01 4.0000000e-01 1.0000000e+00 3.0000000e-01 9.0000000e-01 7.0000000e-01 6.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 4.0000000e-01 3.0000000e-01 2.0000000e-01 3.0000000e-01 4.0000000e-01 5.0000000e-01 1.1000000e+00 1.0000000e+00 1.0000000e+00 7.0000000e-01 5.0000000e-01 1.1000000e+00 6.0000000e-01 3.0000000e-01 5.0000000e-01 9.0000000e-01 1.0000000e+00 1.0000000e+00 4.0000000e-01 7.0000000e-01 1.5000000e+00 9.0000000e-01 8.0000000e-01 8.0000000e-01 3.0000000e-01 1.6000000e+00 8.0000000e-01 1.4000000e+00 7.0000000e-01 1.3000000e+00 1.0000000e+00 1.2000000e+00 2.0000000e+00 1.6000000e+00 1.7000000e+00 1.2000000e+00 1.5000000e+00 5.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 2.1000000e+00 2.3000000e+00 6.0000000e-01 1.1000000e+00 9.0000000e-01 2.1000000e+00 3.0000000e-01 1.1000000e+00 1.4000000e+00 3.0000000e-01 4.0000000e-01 1.0000000e+00 1.2000000e+00 1.5000000e+00 1.8000000e+00 1.0000000e+00 5.0000000e-01 1.0000000e+00 1.5000000e+00 1.0000000e+00 9.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e+00 8.0000000e-01 7.0000000e-01 1.3000000e+00 1.1000000e+00 8.0000000e-01 4.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 1.2000000e+00 9.0000000e-01 6.0000000e-01 1.0000000e+00 3.0000000e-01 6.0000000e-01 4.0000000e-01 9.0000000e-01 1.0000000e+00 2.0000000e-01 4.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 9.0000000e-01 1.1000000e+00 1.0000000e+00 3.0000000e-01 1.0000000e+00 7.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 6.0000000e-01 1.0000000e+00 6.0000000e-01 4.0000000e-01 5.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 1.2000000e+00 3.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 1.5000000e+00 4.0000000e-01 1.5000000e+00 6.0000000e-01 1.4000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 8.0000000e-01 1.8000000e+00 1.3000000e+00 1.6000000e+00 8.0000000e-01 8.0000000e-01 1.1000000e+00 7.0000000e-01 1.1000000e+00 1.0000000e+00 1.0000000e+00 2.2000000e+00 2.4000000e+00 6.0000000e-01 1.2000000e+00 7.0000000e-01 2.2000000e+00 6.0000000e-01 1.2000000e+00 1.5000000e+00 5.0000000e-01 5.0000000e-01 1.1000000e+00 1.5000000e+00 1.7000000e+00 2.2000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 2.0000000e+00 1.1000000e+00 1.0000000e+00 5.0000000e-01 1.2000000e+00 1.1000000e+00 1.2000000e+00 6.0000000e-01 1.4000000e+00 1.2000000e+00 1.0000000e+00 6.0000000e-01 8.0000000e-01 1.0000000e+00 6.0000000e-01 1.4000000e+00 4.0000000e-01 1.1000000e+00 1.3000000e+00 5.0000000e-01 1.1000000e+00 4.0000000e-01 1.1000000e+00 4.0000000e-01 7.0000000e-01 6.0000000e-01 1.1000000e+00 8.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 4.0000000e-01 3.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 1.2000000e+00 9.0000000e-01 1.0000000e+00 8.0000000e-01 6.0000000e-01 9.0000000e-01 3.0000000e-01 4.0000000e-01 1.0000000e+00 7.0000000e-01 8.0000000e-01 8.0000000e-01 3.0000000e-01 7.0000000e-01 1.4000000e+00 7.0000000e-01 6.0000000e-01 6.0000000e-01 4.0000000e-01 1.7000000e+00 6.0000000e-01 1.3000000e+00 6.0000000e-01 1.2000000e+00 9.0000000e-01 1.1000000e+00 1.9000000e+00 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.4000000e+00 4.0000000e-01 6.0000000e-01 8.0000000e-01 8.0000000e-01 8.0000000e-01 7.0000000e-01 8.0000000e-01 2.0000000e+00 2.2000000e+00 1.1000000e+00 1.0000000e+00 7.0000000e-01 2.0000000e+00 6.0000000e-01 1.0000000e+00 1.3000000e+00 5.0000000e-01 3.0000000e-01 9.0000000e-01 1.1000000e+00 1.4000000e+00 1.7000000e+00 9.0000000e-01 5.0000000e-01 9.0000000e-01 1.4000000e+00 9.0000000e-01 8.0000000e-01 3.0000000e-01 7.0000000e-01 9.0000000e-01 7.0000000e-01 6.0000000e-01 1.2000000e+00 1.0000000e+00 7.0000000e-01 8.0000000e-01 5.0000000e-01 7.0000000e-01 4.0000000e-01 1.7000000e+00 6.0000000e-01 4.0000000e-01 1.0000000e+00 1.1000000e+00 1.4000000e+00 7.0000000e-01 1.8000000e+00 1.2000000e+00 9.0000000e-01 1.3000000e+00 7.0000000e-01 1.5000000e+00 1.2000000e+00 1.6000000e+00 1.4000000e+00 1.5000000e+00 1.7000000e+00 1.9000000e+00 1.8000000e+00 1.2000000e+00 8.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 1.8000000e+00 1.2000000e+00 1.2000000e+00 1.8000000e+00 1.4000000e+00 8.0000000e-01 7.0000000e-01 1.1000000e+00 1.3000000e+00 9.0000000e-01 1.0000000e-01 9.0000000e-01 9.0000000e-01 9.0000000e-01 1.3000000e+00 3.0000000e-01 8.0000000e-01 2.7000000e+00 1.8000000e+00 2.6000000e+00 2.3000000e+00 2.5000000e+00 3.3000000e+00 1.2000000e+00 3.0000000e+00 2.5000000e+00 2.8000000e+00 1.8000000e+00 2.0000000e+00 2.2000000e+00 1.7000000e+00 1.8000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 3.6000000e+00 1.7000000e+00 2.4000000e+00 1.6000000e+00 3.4000000e+00 1.6000000e+00 2.4000000e+00 2.7000000e+00 1.5000000e+00 1.6000000e+00 2.3000000e+00 2.5000000e+00 2.8000000e+00 3.1000000e+00 2.3000000e+00 1.8000000e+00 2.3000000e+00 2.8000000e+00 2.3000000e+00 2.2000000e+00 1.5000000e+00 2.1000000e+00 2.3000000e+00 2.0000000e+00 1.8000000e+00 2.6000000e+00 2.4000000e+00 1.9000000e+00 1.7000000e+00 1.9000000e+00 2.1000000e+00 1.8000000e+00 1.4000000e+00 1.6000000e+00 7.0000000e-01 7.0000000e-01 5.0000000e-01 1.0000000e+00 2.0000000e-01 1.0000000e+00 8.0000000e-01 7.0000000e-01 1.0000000e+00 7.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 3.0000000e-01 2.0000000e-01 2.0000000e-01 4.0000000e-01 6.0000000e-01 1.1000000e+00 1.1000000e+00 1.1000000e+00 8.0000000e-01 6.0000000e-01 1.2000000e+00 6.0000000e-01 2.0000000e-01 6.0000000e-01 1.0000000e+00 1.1000000e+00 1.1000000e+00 5.0000000e-01 8.0000000e-01 1.6000000e+00 1.0000000e+00 9.0000000e-01 9.0000000e-01 4.0000000e-01 1.6000000e+00 9.0000000e-01 1.4000000e+00 8.0000000e-01 1.3000000e+00 1.0000000e+00 1.2000000e+00 2.0000000e+00 1.7000000e+00 1.7000000e+00 1.2000000e+00 1.5000000e+00 7.0000000e-01 7.0000000e-01 9.0000000e-01 9.0000000e-01 1.1000000e+00 1.0000000e+00 9.0000000e-01 2.1000000e+00 2.3000000e+00 7.0000000e-01 1.1000000e+00 1.0000000e+00 2.1000000e+00 5.0000000e-01 1.1000000e+00 1.4000000e+00 5.0000000e-01 5.0000000e-01 1.0000000e+00 1.2000000e+00 1.5000000e+00 1.8000000e+00 1.0000000e+00 5.0000000e-01 1.0000000e+00 1.5000000e+00 1.1000000e+00 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.1000000e+00 1.0000000e+00 8.0000000e-01 1.3000000e+00 1.2000000e+00 1.0000000e+00 6.0000000e-01 7.0000000e-01 1.0000000e+00 7.0000000e-01 7.0000000e-01 7.0000000e-01 8.0000000e-01 9.0000000e-01 4.0000000e-01 1.5000000e+00 6.0000000e-01 6.0000000e-01 1.0000000e+00 4.0000000e-01 9.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 1.2000000e+00 1.4000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 5.0000000e-01 3.0000000e-01 4.0000000e-01 6.0000000e-01 1.2000000e+00 6.0000000e-01 8.0000000e-01 1.5000000e+00 1.1000000e+00 4.0000000e-01 3.0000000e-01 5.0000000e-01 9.0000000e-01 6.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 1.0000000e+00 9.0000000e-01 5.0000000e-01 2.1000000e+00 1.2000000e+00 2.0000000e+00 1.7000000e+00 1.9000000e+00 2.7000000e+00 6.0000000e-01 2.4000000e+00 1.9000000e+00 2.2000000e+00 1.3000000e+00 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 2.8000000e+00 3.0000000e+00 1.1000000e+00 1.8000000e+00 1.0000000e+00 2.8000000e+00 1.1000000e+00 1.8000000e+00 2.1000000e+00 1.0000000e+00 1.0000000e+00 1.7000000e+00 2.0000000e+00 2.2000000e+00 2.7000000e+00 1.7000000e+00 1.2000000e+00 1.7000000e+00 2.5000000e+00 1.7000000e+00 1.6000000e+00 9.0000000e-01 1.7000000e+00 1.7000000e+00 1.7000000e+00 1.2000000e+00 2.0000000e+00 1.8000000e+00 1.5000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.2000000e+00 1.0000000e+00 1.0000000e+00 1.2000000e+00 9.0000000e-01 1.7000000e+00 1.0000000e+00 8.0000000e-01 1.2000000e+00 6.0000000e-01 1.3000000e+00 1.1000000e+00 1.4000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 1.8000000e+00 1.7000000e+00 1.0000000e+00 7.0000000e-01 5.0000000e-01 5.0000000e-01 8.0000000e-01 1.6000000e+00 1.0000000e+00 1.4000000e+00 1.7000000e+00 1.3000000e+00 1.0000000e+00 5.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 3.0000000e-01 7.0000000e-01 1.0000000e+00 9.0000000e-01 1.2000000e+00 5.0000000e-01 8.0000000e-01 2.5000000e+00 1.6000000e+00 2.4000000e+00 2.1000000e+00 2.3000000e+00 3.1000000e+00 1.0000000e+00 2.8000000e+00 2.3000000e+00 2.6000000e+00 1.6000000e+00 1.8000000e+00 2.0000000e+00 1.5000000e+00 1.6000000e+00 1.8000000e+00 2.0000000e+00 3.2000000e+00 3.4000000e+00 1.5000000e+00 2.2000000e+00 1.4000000e+00 3.2000000e+00 1.4000000e+00 2.2000000e+00 2.5000000e+00 1.3000000e+00 1.4000000e+00 2.1000000e+00 2.3000000e+00 2.6000000e+00 2.9000000e+00 2.1000000e+00 1.6000000e+00 2.1000000e+00 2.7000000e+00 2.1000000e+00 2.0000000e+00 1.3000000e+00 1.9000000e+00 2.1000000e+00 1.9000000e+00 1.6000000e+00 2.4000000e+00 2.2000000e+00 1.7000000e+00 1.5000000e+00 1.7000000e+00 1.9000000e+00 1.6000000e+00 8.0000000e-01 5.0000000e-01 6.0000000e-01 8.0000000e-01 3.0000000e-01 5.0000000e-01 8.0000000e-01 5.0000000e-01 6.0000000e-01 2.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 3.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 7.0000000e-01 3.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 4.0000000e-01 9.0000000e-01 3.0000000e-01 3.0000000e-01 2.0000000e-01 3.0000000e-01 1.2000000e+00 2.0000000e-01 1.8000000e+00 9.0000000e-01 1.7000000e+00 1.4000000e+00 1.6000000e+00 2.4000000e+00 1.0000000e+00 2.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 8.0000000e-01 9.0000000e-01 1.1000000e+00 1.3000000e+00 2.5000000e+00 2.7000000e+00 8.0000000e-01 1.5000000e+00 7.0000000e-01 2.5000000e+00 7.0000000e-01 1.5000000e+00 1.8000000e+00 6.0000000e-01 7.0000000e-01 1.4000000e+00 1.6000000e+00 1.9000000e+00 2.2000000e+00 1.4000000e+00 9.0000000e-01 1.4000000e+00 1.9000000e+00 1.4000000e+00 1.3000000e+00 6.0000000e-01 1.2000000e+00 1.4000000e+00 1.0000000e+00 9.0000000e-01 1.7000000e+00 1.5000000e+00 1.0000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 7.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 1.0000000e+00 6.0000000e-01 9.0000000e-01 7.0000000e-01 7.0000000e-01 8.0000000e-01 8.0000000e-01 1.0000000e+00 7.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 1.1000000e+00 8.0000000e-01 1.2000000e+00 9.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 8.0000000e-01 4.0000000e-01 1.0000000e+00 5.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 1.0000000e+00 6.0000000e-01 2.0000000e+00 1.1000000e+00 1.9000000e+00 1.6000000e+00 1.8000000e+00 2.6000000e+00 1.1000000e+00 2.3000000e+00 1.8000000e+00 2.1000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.0000000e+00 1.4000000e+00 1.3000000e+00 1.5000000e+00 2.7000000e+00 2.9000000e+00 1.0000000e+00 1.7000000e+00 1.0000000e+00 2.7000000e+00 9.0000000e-01 1.7000000e+00 2.0000000e+00 8.0000000e-01 9.0000000e-01 1.6000000e+00 1.8000000e+00 2.1000000e+00 2.4000000e+00 1.6000000e+00 1.1000000e+00 1.6000000e+00 2.1000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 1.4000000e+00 1.6000000e+00 1.3000000e+00 1.1000000e+00 1.9000000e+00 1.7000000e+00 1.3000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.1000000e+00 1.1000000e+00 6.0000000e-01 5.0000000e-01 6.0000000e-01 7.0000000e-01 8.0000000e-01 4.0000000e-01 7.0000000e-01 4.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 2.0000000e-01 1.2000000e+00 9.0000000e-01 1.0000000e+00 8.0000000e-01 4.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 7.0000000e-01 6.0000000e-01 1.0000000e-01 7.0000000e-01 1.4000000e+00 5.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 1.7000000e+00 6.0000000e-01 1.3000000e+00 5.0000000e-01 1.2000000e+00 9.0000000e-01 1.1000000e+00 1.9000000e+00 1.2000000e+00 1.6000000e+00 1.1000000e+00 1.4000000e+00 6.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 1.0000000e+00 9.0000000e-01 8.0000000e-01 2.0000000e+00 2.2000000e+00 7.0000000e-01 1.0000000e+00 6.0000000e-01 2.0000000e+00 4.0000000e-01 1.0000000e+00 1.3000000e+00 4.0000000e-01 4.0000000e-01 9.0000000e-01 1.1000000e+00 1.4000000e+00 1.8000000e+00 9.0000000e-01 4.0000000e-01 9.0000000e-01 1.6000000e+00 1.0000000e+00 8.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 5.0000000e-01 1.2000000e+00 1.1000000e+00 9.0000000e-01 5.0000000e-01 6.0000000e-01 9.0000000e-01 4.0000000e-01 1.1000000e+00 9.0000000e-01 5.0000000e-01 9.0000000e-01 4.0000000e-01 1.2000000e+00 5.0000000e-01 1.3000000e+00 1.1000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 1.4000000e+00 9.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 1.5000000e+00 9.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 4.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 2.4000000e+00 1.5000000e+00 2.3000000e+00 2.0000000e+00 2.2000000e+00 3.0000000e+00 9.0000000e-01 2.7000000e+00 2.2000000e+00 2.5000000e+00 1.5000000e+00 1.7000000e+00 1.9000000e+00 1.4000000e+00 1.5000000e+00 1.7000000e+00 1.9000000e+00 3.1000000e+00 3.3000000e+00 1.4000000e+00 2.1000000e+00 1.3000000e+00 3.1000000e+00 1.3000000e+00 2.1000000e+00 2.4000000e+00 1.2000000e+00 1.3000000e+00 2.0000000e+00 2.2000000e+00 2.5000000e+00 2.8000000e+00 2.0000000e+00 1.5000000e+00 2.0000000e+00 2.5000000e+00 2.0000000e+00 1.9000000e+00 1.2000000e+00 1.8000000e+00 2.0000000e+00 1.5000000e+00 1.5000000e+00 2.3000000e+00 2.1000000e+00 1.6000000e+00 1.4000000e+00 1.6000000e+00 1.8000000e+00 1.5000000e+00 1.1000000e+00 9.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 1.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 1.0000000e+00 1.2000000e+00 1.2000000e+00 9.0000000e-01 7.0000000e-01 1.3000000e+00 7.0000000e-01 3.0000000e-01 8.0000000e-01 1.1000000e+00 1.2000000e+00 1.2000000e+00 6.0000000e-01 9.0000000e-01 1.7000000e+00 1.1000000e+00 1.0000000e+00 1.0000000e+00 5.0000000e-01 1.6000000e+00 1.0000000e+00 1.6000000e+00 9.0000000e-01 1.5000000e+00 1.2000000e+00 1.4000000e+00 2.2000000e+00 1.8000000e+00 1.9000000e+00 1.4000000e+00 1.7000000e+00 7.0000000e-01 9.0000000e-01 1.1000000e+00 1.0000000e+00 1.0000000e+00 9.0000000e-01 1.1000000e+00 2.3000000e+00 2.5000000e+00 9.0000000e-01 1.3000000e+00 1.1000000e+00 2.3000000e+00 5.0000000e-01 1.3000000e+00 1.6000000e+00 5.0000000e-01 6.0000000e-01 1.2000000e+00 1.4000000e+00 1.7000000e+00 2.0000000e+00 1.2000000e+00 7.0000000e-01 1.2000000e+00 1.7000000e+00 1.2000000e+00 1.1000000e+00 7.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 9.0000000e-01 1.5000000e+00 1.3000000e+00 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 8.0000000e-01 5.0000000e-01 8.0000000e-01 6.0000000e-01 3.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e+00 1.2000000e+00 1.1000000e+00 4.0000000e-01 1.0000000e+00 7.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 2.0000000e-01 4.0000000e-01 1.1000000e+00 7.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 1.2000000e+00 3.0000000e-01 3.0000000e-01 3.0000000e-01 6.0000000e-01 1.5000000e+00 4.0000000e-01 1.5000000e+00 6.0000000e-01 1.5000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 7.0000000e-01 1.8000000e+00 1.3000000e+00 1.6000000e+00 9.0000000e-01 8.0000000e-01 1.2000000e+00 5.0000000e-01 9.0000000e-01 8.0000000e-01 1.0000000e+00 2.2000000e+00 2.4000000e+00 8.0000000e-01 1.3000000e+00 5.0000000e-01 2.2000000e+00 7.0000000e-01 1.2000000e+00 1.6000000e+00 6.0000000e-01 5.0000000e-01 1.1000000e+00 1.6000000e+00 1.8000000e+00 2.3000000e+00 1.1000000e+00 7.0000000e-01 1.1000000e+00 2.1000000e+00 1.1000000e+00 1.0000000e+00 4.0000000e-01 1.3000000e+00 1.1000000e+00 1.3000000e+00 6.0000000e-01 1.4000000e+00 1.2000000e+00 1.1000000e+00 7.0000000e-01 9.0000000e-01 9.0000000e-01 6.0000000e-01 5.0000000e-01 2.0000000e-01 8.0000000e-01 3.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 5.0000000e-01 6.0000000e-01 3.0000000e-01 4.0000000e-01 2.0000000e-01 1.0000000e+00 5.0000000e-01 7.0000000e-01 9.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 2.0000000e-01 8.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 1.1000000e+00 3.0000000e-01 1.9000000e+00 1.0000000e+00 1.8000000e+00 1.5000000e+00 1.7000000e+00 2.5000000e+00 9.0000000e-01 2.2000000e+00 1.7000000e+00 2.0000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.0000000e+00 1.4000000e+00 1.3000000e+00 1.4000000e+00 2.6000000e+00 2.8000000e+00 9.0000000e-01 1.6000000e+00 1.0000000e+00 2.6000000e+00 8.0000000e-01 1.6000000e+00 1.9000000e+00 8.0000000e-01 8.0000000e-01 1.5000000e+00 1.7000000e+00 2.0000000e+00 2.3000000e+00 1.5000000e+00 1.0000000e+00 1.5000000e+00 2.0000000e+00 1.5000000e+00 1.4000000e+00 8.0000000e-01 1.3000000e+00 1.5000000e+00 1.3000000e+00 1.0000000e+00 1.8000000e+00 1.6000000e+00 1.3000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 1.0000000e+00 6.0000000e-01 1.0000000e+00 6.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 8.0000000e-01 6.0000000e-01 8.0000000e-01 7.0000000e-01 1.0000000e+00 7.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 8.0000000e-01 1.2000000e+00 9.0000000e-01 2.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 8.0000000e-01 5.0000000e-01 1.2000000e+00 6.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 1.5000000e+00 6.0000000e-01 1.5000000e+00 6.0000000e-01 1.4000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 1.3000000e+00 1.8000000e+00 1.3000000e+00 1.6000000e+00 1.0000000e+00 8.0000000e-01 1.0000000e+00 5.0000000e-01 9.0000000e-01 1.0000000e+00 1.0000000e+00 2.2000000e+00 2.4000000e+00 5.0000000e-01 1.2000000e+00 6.0000000e-01 2.2000000e+00 5.0000000e-01 1.2000000e+00 1.5000000e+00 6.0000000e-01 8.0000000e-01 1.1000000e+00 1.3000000e+00 1.6000000e+00 1.9000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 1.6000000e+00 1.2000000e+00 1.0000000e+00 8.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 6.0000000e-01 1.4000000e+00 1.2000000e+00 8.0000000e-01 5.0000000e-01 8.0000000e-01 1.2000000e+00 8.0000000e-01 9.0000000e-01 5.0000000e-01 1.0000000e+00 8.0000000e-01 8.0000000e-01 1.0000000e+00 1.2000000e+00 1.1000000e+00 6.0000000e-01 4.0000000e-01 1.0000000e-01 2.0000000e-01 2.0000000e-01 1.2000000e+00 6.0000000e-01 9.0000000e-01 1.1000000e+00 7.0000000e-01 5.0000000e-01 2.0000000e-01 5.0000000e-01 7.0000000e-01 2.0000000e-01 6.0000000e-01 3.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 9.0000000e-01 3.0000000e-01 2.1000000e+00 1.2000000e+00 2.0000000e+00 1.7000000e+00 1.9000000e+00 2.7000000e+00 7.0000000e-01 2.4000000e+00 1.9000000e+00 2.2000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.3000000e+00 1.4000000e+00 1.6000000e+00 2.8000000e+00 3.0000000e+00 1.1000000e+00 1.8000000e+00 1.0000000e+00 2.8000000e+00 1.0000000e+00 1.8000000e+00 2.1000000e+00 9.0000000e-01 1.0000000e+00 1.7000000e+00 1.9000000e+00 2.2000000e+00 2.5000000e+00 1.7000000e+00 1.2000000e+00 1.7000000e+00 2.2000000e+00 1.7000000e+00 1.6000000e+00 9.0000000e-01 1.5000000e+00 1.7000000e+00 1.3000000e+00 1.2000000e+00 2.0000000e+00 1.8000000e+00 1.3000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.2000000e+00 8.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 3.0000000e-01 1.3000000e+00 1.0000000e+00 1.1000000e+00 9.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 9.0000000e-01 7.0000000e-01 8.0000000e-01 6.0000000e-01 4.0000000e-01 8.0000000e-01 1.5000000e+00 6.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 1.8000000e+00 7.0000000e-01 1.2000000e+00 5.0000000e-01 1.2000000e+00 8.0000000e-01 1.0000000e+00 1.8000000e+00 1.0000000e+00 1.5000000e+00 1.0000000e+00 1.3000000e+00 6.0000000e-01 5.0000000e-01 9.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 1.9000000e+00 2.1000000e+00 1.0000000e+00 1.0000000e+00 4.0000000e-01 1.9000000e+00 5.0000000e-01 9.0000000e-01 1.3000000e+00 4.0000000e-01 2.0000000e-01 8.0000000e-01 1.3000000e+00 1.5000000e+00 2.0000000e+00 8.0000000e-01 4.0000000e-01 8.0000000e-01 1.8000000e+00 8.0000000e-01 7.0000000e-01 2.0000000e-01 1.0000000e+00 8.0000000e-01 1.0000000e+00 5.0000000e-01 1.1000000e+00 9.0000000e-01 8.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 9.0000000e-01 7.0000000e-01 3.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 1.1000000e+00 7.0000000e-01 6.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 3.0000000e-01 1.1000000e+00 5.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 1.0000000e+00 4.0000000e-01 2.0000000e+00 1.1000000e+00 1.9000000e+00 1.6000000e+00 1.8000000e+00 2.6000000e+00 1.2000000e+00 2.3000000e+00 1.8000000e+00 2.1000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.0000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 2.7000000e+00 2.9000000e+00 1.0000000e+00 1.7000000e+00 9.0000000e-01 2.7000000e+00 9.0000000e-01 1.7000000e+00 2.0000000e+00 8.0000000e-01 9.0000000e-01 1.6000000e+00 1.8000000e+00 2.1000000e+00 2.4000000e+00 1.6000000e+00 1.1000000e+00 1.6000000e+00 2.1000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.1000000e+00 1.9000000e+00 1.7000000e+00 1.2000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.1000000e+00 3.0000000e-01 6.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 1.4000000e+00 1.1000000e+00 1.2000000e+00 1.0000000e+00 3.0000000e-01 9.0000000e-01 9.0000000e-01 6.0000000e-01 5.0000000e-01 8.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 9.0000000e-01 1.6000000e+00 7.0000000e-01 7.0000000e-01 7.0000000e-01 6.0000000e-01 1.9000000e+00 8.0000000e-01 1.1000000e+00 5.0000000e-01 1.0000000e+00 7.0000000e-01 9.0000000e-01 1.7000000e+00 1.4000000e+00 1.4000000e+00 9.0000000e-01 1.2000000e+00 7.0000000e-01 4.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 8.0000000e-01 6.0000000e-01 1.8000000e+00 2.0000000e+00 3.0000000e-01 8.0000000e-01 7.0000000e-01 1.8000000e+00 3.0000000e-01 8.0000000e-01 1.1000000e+00 3.0000000e-01 5.0000000e-01 7.0000000e-01 9.0000000e-01 1.2000000e+00 1.6000000e+00 7.0000000e-01 3.0000000e-01 7.0000000e-01 1.4000000e+00 9.0000000e-01 6.0000000e-01 5.0000000e-01 6.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 1.0000000e+00 1.0000000e+00 8.0000000e-01 4.0000000e-01 5.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 3.0000000e-01 1.2000000e+00 9.0000000e-01 1.0000000e+00 8.0000000e-01 4.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 6.0000000e-01 7.0000000e-01 6.0000000e-01 2.0000000e-01 7.0000000e-01 1.4000000e+00 5.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 1.7000000e+00 6.0000000e-01 1.3000000e+00 7.0000000e-01 1.2000000e+00 9.0000000e-01 1.1000000e+00 1.9000000e+00 1.2000000e+00 1.6000000e+00 1.1000000e+00 1.4000000e+00 8.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 1.2000000e+00 1.1000000e+00 8.0000000e-01 2.0000000e+00 2.2000000e+00 6.0000000e-01 1.1000000e+00 8.0000000e-01 2.0000000e+00 6.0000000e-01 1.0000000e+00 1.3000000e+00 6.0000000e-01 6.0000000e-01 9.0000000e-01 1.1000000e+00 1.4000000e+00 1.8000000e+00 1.0000000e+00 4.0000000e-01 9.0000000e-01 1.6000000e+00 1.2000000e+00 8.0000000e-01 6.0000000e-01 9.0000000e-01 1.2000000e+00 1.1000000e+00 7.0000000e-01 1.2000000e+00 1.3000000e+00 1.1000000e+00 7.0000000e-01 8.0000000e-01 1.1000000e+00 6.0000000e-01 2.0000000e-01 5.0000000e-01 7.0000000e-01 4.0000000e-01 8.0000000e-01 9.0000000e-01 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 4.0000000e-01 6.0000000e-01 8.0000000e-01 9.0000000e-01 9.0000000e-01 3.0000000e-01 6.0000000e-01 1.4000000e+00 8.0000000e-01 7.0000000e-01 7.0000000e-01 2.0000000e-01 1.3000000e+00 7.0000000e-01 1.7000000e+00 8.0000000e-01 1.6000000e+00 1.3000000e+00 1.5000000e+00 2.3000000e+00 1.5000000e+00 2.0000000e+00 1.5000000e+00 1.8000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 7.0000000e-01 1.1000000e+00 1.0000000e+00 1.2000000e+00 2.4000000e+00 2.6000000e+00 7.0000000e-01 1.4000000e+00 8.0000000e-01 2.4000000e+00 6.0000000e-01 1.4000000e+00 1.7000000e+00 5.0000000e-01 6.0000000e-01 1.3000000e+00 1.5000000e+00 1.8000000e+00 2.1000000e+00 1.3000000e+00 8.0000000e-01 1.3000000e+00 1.8000000e+00 1.3000000e+00 1.2000000e+00 5.0000000e-01 1.1000000e+00 1.3000000e+00 1.0000000e+00 8.0000000e-01 1.6000000e+00 1.4000000e+00 1.0000000e+00 7.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 4.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 1.1000000e+00 1.1000000e+00 8.0000000e-01 7.0000000e-01 1.2000000e+00 6.0000000e-01 3.0000000e-01 7.0000000e-01 1.0000000e+00 1.1000000e+00 1.1000000e+00 5.0000000e-01 8.0000000e-01 1.6000000e+00 1.0000000e+00 9.0000000e-01 9.0000000e-01 4.0000000e-01 1.5000000e+00 9.0000000e-01 1.6000000e+00 8.0000000e-01 1.5000000e+00 1.2000000e+00 1.4000000e+00 2.2000000e+00 1.7000000e+00 1.9000000e+00 1.4000000e+00 1.7000000e+00 7.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 1.0000000e+00 9.0000000e-01 1.1000000e+00 2.3000000e+00 2.5000000e+00 8.0000000e-01 1.3000000e+00 1.0000000e+00 2.3000000e+00 5.0000000e-01 1.3000000e+00 1.6000000e+00 4.0000000e-01 5.0000000e-01 1.2000000e+00 1.4000000e+00 1.7000000e+00 2.0000000e+00 1.2000000e+00 7.0000000e-01 1.2000000e+00 1.7000000e+00 1.2000000e+00 1.1000000e+00 6.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 8.0000000e-01 1.5000000e+00 1.3000000e+00 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 7.0000000e-01 3.0000000e-01 8.0000000e-01 1.3000000e+00 1.3000000e+00 1.3000000e+00 1.0000000e+00 8.0000000e-01 1.4000000e+00 8.0000000e-01 3.0000000e-01 5.0000000e-01 1.2000000e+00 1.3000000e+00 1.3000000e+00 7.0000000e-01 1.0000000e+00 1.8000000e+00 1.2000000e+00 1.1000000e+00 1.1000000e+00 6.0000000e-01 1.8000000e+00 1.1000000e+00 1.2000000e+00 1.0000000e+00 1.1000000e+00 8.0000000e-01 1.0000000e+00 1.8000000e+00 1.9000000e+00 1.5000000e+00 1.0000000e+00 1.3000000e+00 6.0000000e-01 5.0000000e-01 7.0000000e-01 1.1000000e+00 1.0000000e+00 9.0000000e-01 7.0000000e-01 1.9000000e+00 2.1000000e+00 8.0000000e-01 9.0000000e-01 1.2000000e+00 1.9000000e+00 5.0000000e-01 9.0000000e-01 1.2000000e+00 6.0000000e-01 7.0000000e-01 8.0000000e-01 1.0000000e+00 1.3000000e+00 1.6000000e+00 8.0000000e-01 5.0000000e-01 8.0000000e-01 1.3000000e+00 1.0000000e+00 7.0000000e-01 8.0000000e-01 7.0000000e-01 1.0000000e+00 9.0000000e-01 1.0000000e+00 1.1000000e+00 1.1000000e+00 9.0000000e-01 5.0000000e-01 6.0000000e-01 9.0000000e-01 9.0000000e-01 7.0000000e-01 1.5000000e+00 1.2000000e+00 1.3000000e+00 1.1000000e+00 7.0000000e-01 1.3000000e+00 7.0000000e-01 3.0000000e-01 7.0000000e-01 1.1000000e+00 1.2000000e+00 1.2000000e+00 6.0000000e-01 1.0000000e+00 1.7000000e+00 1.1000000e+00 1.0000000e+00 1.0000000e+00 7.0000000e-01 2.0000000e+00 1.0000000e+00 1.0000000e+00 9.0000000e-01 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.6000000e+00 1.8000000e+00 1.3000000e+00 8.0000000e-01 1.1000000e+00 3.0000000e-01 3.0000000e-01 5.0000000e-01 1.0000000e+00 9.0000000e-01 6.0000000e-01 5.0000000e-01 1.7000000e+00 1.9000000e+00 8.0000000e-01 7.0000000e-01 1.1000000e+00 1.7000000e+00 4.0000000e-01 7.0000000e-01 1.0000000e+00 5.0000000e-01 6.0000000e-01 6.0000000e-01 8.0000000e-01 1.1000000e+00 1.4000000e+00 6.0000000e-01 4.0000000e-01 6.0000000e-01 1.1000000e+00 7.0000000e-01 5.0000000e-01 7.0000000e-01 4.0000000e-01 7.0000000e-01 6.0000000e-01 9.0000000e-01 9.0000000e-01 8.0000000e-01 6.0000000e-01 5.0000000e-01 3.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 7.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 1.0000000e-01 5.0000000e-01 1.2000000e+00 4.0000000e-01 3.0000000e-01 3.0000000e-01 2.0000000e-01 1.5000000e+00 4.0000000e-01 1.5000000e+00 6.0000000e-01 1.4000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 1.1000000e+00 1.8000000e+00 1.3000000e+00 1.6000000e+00 6.0000000e-01 8.0000000e-01 1.0000000e+00 5.0000000e-01 9.0000000e-01 8.0000000e-01 1.0000000e+00 2.2000000e+00 2.4000000e+00 7.0000000e-01 1.2000000e+00 5.0000000e-01 2.2000000e+00 4.0000000e-01 1.2000000e+00 1.5000000e+00 3.0000000e-01 4.0000000e-01 1.1000000e+00 1.3000000e+00 1.6000000e+00 1.9000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 1.7000000e+00 1.1000000e+00 1.0000000e+00 3.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 6.0000000e-01 1.4000000e+00 1.2000000e+00 8.0000000e-01 5.0000000e-01 7.0000000e-01 9.0000000e-01 6.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 1.6000000e+00 1.0000000e+00 1.0000000e+00 1.2000000e+00 9.0000000e-01 6.0000000e-01 5.0000000e-01 9.0000000e-01 1.1000000e+00 5.0000000e-01 7.0000000e-01 7.0000000e-01 7.0000000e-01 7.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 2.5000000e+00 1.6000000e+00 2.4000000e+00 2.1000000e+00 2.3000000e+00 3.1000000e+00 1.0000000e+00 2.8000000e+00 2.3000000e+00 2.6000000e+00 1.6000000e+00 1.8000000e+00 2.0000000e+00 1.5000000e+00 1.6000000e+00 1.8000000e+00 2.0000000e+00 3.2000000e+00 3.4000000e+00 1.5000000e+00 2.2000000e+00 1.4000000e+00 3.2000000e+00 1.4000000e+00 2.2000000e+00 2.5000000e+00 1.3000000e+00 1.4000000e+00 2.1000000e+00 2.3000000e+00 2.6000000e+00 2.9000000e+00 2.1000000e+00 1.6000000e+00 2.1000000e+00 2.6000000e+00 2.1000000e+00 2.0000000e+00 1.3000000e+00 1.9000000e+00 2.1000000e+00 1.6000000e+00 1.6000000e+00 2.4000000e+00 2.2000000e+00 1.7000000e+00 1.5000000e+00 1.7000000e+00 1.9000000e+00 1.6000000e+00 1.0000000e-01 3.0000000e-01 1.3000000e+00 7.0000000e-01 1.0000000e+00 1.2000000e+00 8.0000000e-01 6.0000000e-01 2.0000000e-01 6.0000000e-01 8.0000000e-01 3.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 8.0000000e-01 4.0000000e-01 2.2000000e+00 1.3000000e+00 2.1000000e+00 1.8000000e+00 2.0000000e+00 2.8000000e+00 7.0000000e-01 2.5000000e+00 2.0000000e+00 2.3000000e+00 1.3000000e+00 1.5000000e+00 1.7000000e+00 1.2000000e+00 1.3000000e+00 1.5000000e+00 1.7000000e+00 2.9000000e+00 3.1000000e+00 1.2000000e+00 1.9000000e+00 1.1000000e+00 2.9000000e+00 1.1000000e+00 1.9000000e+00 2.2000000e+00 1.0000000e+00 1.1000000e+00 1.8000000e+00 2.0000000e+00 2.3000000e+00 2.6000000e+00 1.8000000e+00 1.3000000e+00 1.8000000e+00 2.3000000e+00 1.8000000e+00 1.7000000e+00 1.0000000e+00 1.6000000e+00 1.8000000e+00 1.4000000e+00 1.3000000e+00 2.1000000e+00 1.9000000e+00 1.4000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 1.3000000e+00 3.0000000e-01 1.4000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 8.0000000e-01 6.0000000e-01 3.0000000e-01 7.0000000e-01 9.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 7.0000000e-01 4.0000000e-01 2.3000000e+00 1.4000000e+00 2.2000000e+00 1.9000000e+00 2.1000000e+00 2.9000000e+00 8.0000000e-01 2.6000000e+00 2.1000000e+00 2.4000000e+00 1.4000000e+00 1.6000000e+00 1.8000000e+00 1.3000000e+00 1.4000000e+00 1.6000000e+00 1.8000000e+00 3.0000000e+00 3.2000000e+00 1.3000000e+00 2.0000000e+00 1.2000000e+00 3.0000000e+00 1.2000000e+00 2.0000000e+00 2.3000000e+00 1.1000000e+00 1.2000000e+00 1.9000000e+00 2.1000000e+00 2.4000000e+00 2.7000000e+00 1.9000000e+00 1.4000000e+00 1.9000000e+00 2.4000000e+00 1.9000000e+00 1.8000000e+00 1.1000000e+00 1.7000000e+00 1.9000000e+00 1.4000000e+00 1.4000000e+00 2.2000000e+00 2.0000000e+00 1.5000000e+00 1.3000000e+00 1.5000000e+00 1.7000000e+00 1.4000000e+00 1.2000000e+00 6.0000000e-01 7.0000000e-01 9.0000000e-01 5.0000000e-01 3.0000000e-01 3.0000000e-01 5.0000000e-01 7.0000000e-01 1.0000000e-01 8.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 4.0000000e-01 9.0000000e-01 2.0000000e-01 2.1000000e+00 1.2000000e+00 2.0000000e+00 1.7000000e+00 1.9000000e+00 2.7000000e+00 9.0000000e-01 2.4000000e+00 1.9000000e+00 2.2000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.2000000e+00 1.4000000e+00 1.6000000e+00 2.8000000e+00 3.0000000e+00 1.1000000e+00 1.8000000e+00 1.0000000e+00 2.8000000e+00 1.0000000e+00 1.8000000e+00 2.1000000e+00 9.0000000e-01 1.0000000e+00 1.7000000e+00 1.9000000e+00 2.2000000e+00 2.5000000e+00 1.7000000e+00 1.2000000e+00 1.7000000e+00 2.2000000e+00 1.7000000e+00 1.6000000e+00 9.0000000e-01 1.5000000e+00 1.7000000e+00 1.2000000e+00 1.2000000e+00 2.0000000e+00 1.8000000e+00 1.3000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.2000000e+00 6.0000000e-01 7.0000000e-01 7.0000000e-01 7.0000000e-01 1.0000000e+00 1.1000000e+00 7.0000000e-01 5.0000000e-01 1.1000000e+00 1.8000000e+00 9.0000000e-01 9.0000000e-01 9.0000000e-01 8.0000000e-01 2.1000000e+00 1.0000000e+00 9.0000000e-01 3.0000000e-01 1.1000000e+00 5.0000000e-01 7.0000000e-01 1.6000000e+00 1.1000000e+00 1.3000000e+00 7.0000000e-01 1.2000000e+00 5.0000000e-01 4.0000000e-01 8.0000000e-01 4.0000000e-01 8.0000000e-01 7.0000000e-01 5.0000000e-01 1.7000000e+00 1.8000000e+00 5.0000000e-01 9.0000000e-01 4.0000000e-01 1.7000000e+00 3.0000000e-01 7.0000000e-01 1.2000000e+00 3.0000000e-01 3.0000000e-01 5.0000000e-01 1.2000000e+00 1.4000000e+00 1.9000000e+00 6.0000000e-01 3.0000000e-01 5.0000000e-01 1.7000000e+00 8.0000000e-01 4.0000000e-01 3.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 3.0000000e-01 8.0000000e-01 9.0000000e-01 7.0000000e-01 3.0000000e-01 5.0000000e-01 7.0000000e-01 3.0000000e-01 6.0000000e-01 1.3000000e+00 9.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 7.0000000e-01 5.0000000e-01 1.2000000e+00 3.0000000e-01 3.0000000e-01 3.0000000e-01 8.0000000e-01 1.5000000e+00 4.0000000e-01 1.5000000e+00 6.0000000e-01 1.7000000e+00 1.1000000e+00 1.3000000e+00 2.2000000e+00 5.0000000e-01 1.9000000e+00 1.3000000e+00 1.8000000e+00 1.1000000e+00 1.0000000e+00 1.4000000e+00 5.0000000e-01 9.0000000e-01 1.0000000e+00 1.1000000e+00 2.3000000e+00 2.4000000e+00 8.0000000e-01 1.5000000e+00 5.0000000e-01 2.3000000e+00 9.0000000e-01 1.3000000e+00 1.8000000e+00 8.0000000e-01 7.0000000e-01 1.1000000e+00 1.8000000e+00 2.0000000e+00 2.5000000e+00 1.1000000e+00 9.0000000e-01 1.1000000e+00 2.3000000e+00 1.1000000e+00 1.0000000e+00 6.0000000e-01 1.5000000e+00 1.3000000e+00 1.5000000e+00 6.0000000e-01 1.4000000e+00 1.3000000e+00 1.3000000e+00 9.0000000e-01 1.1000000e+00 9.0000000e-01 6.0000000e-01 7.0000000e-01 1.1000000e+00 4.0000000e-01 9.0000000e-01 8.0000000e-01 4.0000000e-01 8.0000000e-01 1.2000000e+00 7.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 1.5000000e+00 6.0000000e-01 1.5000000e+00 7.0000000e-01 1.4000000e+00 1.1000000e+00 1.3000000e+00 2.1000000e+00 1.1000000e+00 1.8000000e+00 1.3000000e+00 1.6000000e+00 6.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 8.0000000e-01 8.0000000e-01 1.0000000e+00 2.2000000e+00 2.4000000e+00 1.2000000e+00 1.2000000e+00 6.0000000e-01 2.2000000e+00 7.0000000e-01 1.2000000e+00 1.5000000e+00 6.0000000e-01 4.0000000e-01 1.1000000e+00 1.3000000e+00 1.6000000e+00 1.9000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 1.7000000e+00 1.1000000e+00 1.0000000e+00 4.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 7.0000000e-01 1.4000000e+00 1.2000000e+00 7.0000000e-01 9.0000000e-01 7.0000000e-01 9.0000000e-01 6.0000000e-01 8.0000000e-01 1.1000000e+00 1.2000000e+00 1.2000000e+00 6.0000000e-01 9.0000000e-01 1.7000000e+00 1.1000000e+00 1.0000000e+00 1.0000000e+00 5.0000000e-01 1.7000000e+00 1.0000000e+00 1.3000000e+00 9.0000000e-01 1.2000000e+00 9.0000000e-01 1.1000000e+00 1.9000000e+00 1.8000000e+00 1.6000000e+00 1.1000000e+00 1.4000000e+00 5.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 8.0000000e-01 8.0000000e-01 2.0000000e+00 2.2000000e+00 9.0000000e-01 1.0000000e+00 1.1000000e+00 2.0000000e+00 4.0000000e-01 1.0000000e+00 1.3000000e+00 5.0000000e-01 6.0000000e-01 9.0000000e-01 1.1000000e+00 1.4000000e+00 1.7000000e+00 9.0000000e-01 4.0000000e-01 9.0000000e-01 1.4000000e+00 9.0000000e-01 8.0000000e-01 7.0000000e-01 7.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 1.2000000e+00 1.0000000e+00 8.0000000e-01 6.0000000e-01 5.0000000e-01 8.0000000e-01 8.0000000e-01 7.0000000e-01 8.0000000e-01 8.0000000e-01 7.0000000e-01 5.0000000e-01 1.3000000e+00 7.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 1.4000000e+00 6.0000000e-01 1.6000000e+00 7.0000000e-01 1.5000000e+00 1.2000000e+00 1.4000000e+00 2.2000000e+00 1.4000000e+00 1.9000000e+00 1.4000000e+00 1.7000000e+00 9.0000000e-01 9.0000000e-01 1.1000000e+00 7.0000000e-01 1.1000000e+00 1.0000000e+00 1.1000000e+00 2.3000000e+00 2.5000000e+00 6.0000000e-01 1.3000000e+00 7.0000000e-01 2.3000000e+00 5.0000000e-01 1.3000000e+00 1.6000000e+00 5.0000000e-01 7.0000000e-01 1.2000000e+00 1.4000000e+00 1.7000000e+00 2.0000000e+00 1.2000000e+00 7.0000000e-01 1.2000000e+00 1.7000000e+00 1.2000000e+00 1.1000000e+00 7.0000000e-01 1.0000000e+00 1.2000000e+00 1.0000000e+00 7.0000000e-01 1.5000000e+00 1.3000000e+00 1.0000000e+00 6.0000000e-01 8.0000000e-01 1.1000000e+00 7.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 3.0000000e-01 1.0000000e-01 1.0000000e-01 6.0000000e-01 1.1000000e+00 2.0000000e-01 1.9000000e+00 1.0000000e+00 1.8000000e+00 1.5000000e+00 1.7000000e+00 2.5000000e+00 7.0000000e-01 2.2000000e+00 1.7000000e+00 2.0000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 9.0000000e-01 1.1000000e+00 1.2000000e+00 1.4000000e+00 2.6000000e+00 2.8000000e+00 9.0000000e-01 1.6000000e+00 8.0000000e-01 2.6000000e+00 8.0000000e-01 1.6000000e+00 1.9000000e+00 7.0000000e-01 8.0000000e-01 1.5000000e+00 1.7000000e+00 2.0000000e+00 2.3000000e+00 1.5000000e+00 1.0000000e+00 1.5000000e+00 2.1000000e+00 1.5000000e+00 1.4000000e+00 7.0000000e-01 1.3000000e+00 1.5000000e+00 1.3000000e+00 1.0000000e+00 1.8000000e+00 1.6000000e+00 1.1000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 1.0000000e+00 4.0000000e-01 6.0000000e-01 3.0000000e-01 7.0000000e-01 2.0000000e-01 5.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e+00 3.0000000e-01 2.0000000e+00 1.1000000e+00 1.9000000e+00 1.6000000e+00 1.8000000e+00 2.6000000e+00 6.0000000e-01 2.3000000e+00 1.8000000e+00 2.1000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.0000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 2.7000000e+00 2.9000000e+00 1.0000000e+00 1.7000000e+00 9.0000000e-01 2.7000000e+00 9.0000000e-01 1.7000000e+00 2.0000000e+00 8.0000000e-01 9.0000000e-01 1.6000000e+00 1.8000000e+00 2.1000000e+00 2.4000000e+00 1.6000000e+00 1.1000000e+00 1.6000000e+00 2.2000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 1.4000000e+00 1.6000000e+00 1.4000000e+00 1.1000000e+00 1.9000000e+00 1.7000000e+00 1.2000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.1000000e+00 6.0000000e-01 4.0000000e-01 1.1000000e+00 2.0000000e-01 4.0000000e-01 3.0000000e-01 7.0000000e-01 1.4000000e+00 3.0000000e-01 1.6000000e+00 7.0000000e-01 1.6000000e+00 1.2000000e+00 1.4000000e+00 2.2000000e+00 6.0000000e-01 1.9000000e+00 1.4000000e+00 1.7000000e+00 1.0000000e+00 9.0000000e-01 1.3000000e+00 8.0000000e-01 1.2000000e+00 1.1000000e+00 1.1000000e+00 2.3000000e+00 2.5000000e+00 6.0000000e-01 1.4000000e+00 8.0000000e-01 2.3000000e+00 8.0000000e-01 1.3000000e+00 1.7000000e+00 7.0000000e-01 6.0000000e-01 1.2000000e+00 1.7000000e+00 1.9000000e+00 2.4000000e+00 1.2000000e+00 8.0000000e-01 1.2000000e+00 2.2000000e+00 1.2000000e+00 1.1000000e+00 6.0000000e-01 1.4000000e+00 1.2000000e+00 1.4000000e+00 7.0000000e-01 1.5000000e+00 1.3000000e+00 1.2000000e+00 8.0000000e-01 1.0000000e+00 1.1000000e+00 7.0000000e-01 6.0000000e-01 1.3000000e+00 5.0000000e-01 4.0000000e-01 4.0000000e-01 3.0000000e-01 1.6000000e+00 5.0000000e-01 1.4000000e+00 5.0000000e-01 1.3000000e+00 1.0000000e+00 1.2000000e+00 2.0000000e+00 1.2000000e+00 1.7000000e+00 1.2000000e+00 1.5000000e+00 6.0000000e-01 7.0000000e-01 9.0000000e-01 6.0000000e-01 1.0000000e+00 9.0000000e-01 9.0000000e-01 2.1000000e+00 2.3000000e+00 8.0000000e-01 1.1000000e+00 6.0000000e-01 2.1000000e+00 4.0000000e-01 1.1000000e+00 1.4000000e+00 4.0000000e-01 4.0000000e-01 1.0000000e+00 1.2000000e+00 1.5000000e+00 1.8000000e+00 1.0000000e+00 5.0000000e-01 1.0000000e+00 1.6000000e+00 1.0000000e+00 9.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 5.0000000e-01 1.3000000e+00 1.1000000e+00 9.0000000e-01 5.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 8.0000000e-01 2.0000000e-01 4.0000000e-01 3.0000000e-01 4.0000000e-01 1.0000000e+00 2.0000000e-01 2.0000000e+00 1.1000000e+00 1.9000000e+00 1.6000000e+00 1.8000000e+00 2.6000000e+00 9.0000000e-01 2.3000000e+00 1.8000000e+00 2.1000000e+00 1.1000000e+00 1.3000000e+00 1.5000000e+00 1.0000000e+00 1.2000000e+00 1.3000000e+00 1.5000000e+00 2.7000000e+00 2.9000000e+00 1.0000000e+00 1.7000000e+00 9.0000000e-01 2.7000000e+00 9.0000000e-01 1.7000000e+00 2.0000000e+00 8.0000000e-01 9.0000000e-01 1.6000000e+00 1.8000000e+00 2.1000000e+00 2.4000000e+00 1.6000000e+00 1.1000000e+00 1.6000000e+00 2.1000000e+00 1.6000000e+00 1.5000000e+00 8.0000000e-01 1.4000000e+00 1.6000000e+00 1.1000000e+00 1.1000000e+00 1.9000000e+00 1.7000000e+00 1.2000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 1.1000000e+00 9.0000000e-01 9.0000000e-01 9.0000000e-01 1.2000000e+00 3.0000000e-01 8.0000000e-01 2.7000000e+00 1.8000000e+00 2.6000000e+00 2.3000000e+00 2.5000000e+00 3.3000000e+00 1.2000000e+00 3.0000000e+00 2.5000000e+00 2.8000000e+00 1.8000000e+00 2.0000000e+00 2.2000000e+00 1.7000000e+00 1.8000000e+00 2.0000000e+00 2.2000000e+00 3.4000000e+00 3.6000000e+00 1.7000000e+00 2.4000000e+00 1.6000000e+00 3.4000000e+00 1.6000000e+00 2.4000000e+00 2.7000000e+00 1.5000000e+00 1.6000000e+00 2.3000000e+00 2.5000000e+00 2.8000000e+00 3.1000000e+00 2.3000000e+00 1.8000000e+00 2.3000000e+00 2.8000000e+00 2.3000000e+00 2.2000000e+00 1.5000000e+00 2.1000000e+00 2.3000000e+00 1.9000000e+00 1.8000000e+00 2.6000000e+00 2.4000000e+00 1.9000000e+00 1.7000000e+00 1.9000000e+00 2.1000000e+00 1.8000000e+00 3.0000000e-01 2.0000000e-01 6.0000000e-01 1.2000000e+00 1.0000000e-01 1.8000000e+00 9.0000000e-01 1.7000000e+00 1.4000000e+00 1.6000000e+00 2.4000000e+00 7.0000000e-01 2.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 8.0000000e-01 1.1000000e+00 1.1000000e+00 1.3000000e+00 2.5000000e+00 2.7000000e+00 8.0000000e-01 1.5000000e+00 7.0000000e-01 2.5000000e+00 7.0000000e-01 1.5000000e+00 1.8000000e+00 6.0000000e-01 7.0000000e-01 1.4000000e+00 1.6000000e+00 1.9000000e+00 2.3000000e+00 1.4000000e+00 9.0000000e-01 1.4000000e+00 2.1000000e+00 1.4000000e+00 1.3000000e+00 6.0000000e-01 1.3000000e+00 1.4000000e+00 1.3000000e+00 9.0000000e-01 1.7000000e+00 1.5000000e+00 1.1000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 1.0000000e-01 5.0000000e-01 1.2000000e+00 2.0000000e-01 1.8000000e+00 9.0000000e-01 1.7000000e+00 1.4000000e+00 1.6000000e+00 2.4000000e+00 8.0000000e-01 2.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 8.0000000e-01 1.2000000e+00 1.1000000e+00 1.3000000e+00 2.5000000e+00 2.7000000e+00 8.0000000e-01 1.5000000e+00 8.0000000e-01 2.5000000e+00 7.0000000e-01 1.5000000e+00 1.8000000e+00 6.0000000e-01 7.0000000e-01 1.4000000e+00 1.6000000e+00 1.9000000e+00 2.2000000e+00 1.4000000e+00 9.0000000e-01 1.4000000e+00 2.0000000e+00 1.4000000e+00 1.3000000e+00 6.0000000e-01 1.2000000e+00 1.4000000e+00 1.2000000e+00 9.0000000e-01 1.7000000e+00 1.5000000e+00 1.1000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 5.0000000e-01 1.2000000e+00 1.0000000e-01 1.8000000e+00 9.0000000e-01 1.7000000e+00 1.4000000e+00 1.6000000e+00 2.4000000e+00 8.0000000e-01 2.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 8.0000000e-01 1.1000000e+00 1.1000000e+00 1.3000000e+00 2.5000000e+00 2.7000000e+00 8.0000000e-01 1.5000000e+00 7.0000000e-01 2.5000000e+00 7.0000000e-01 1.5000000e+00 1.8000000e+00 6.0000000e-01 7.0000000e-01 1.4000000e+00 1.6000000e+00 1.9000000e+00 2.2000000e+00 1.4000000e+00 9.0000000e-01 1.4000000e+00 2.0000000e+00 1.4000000e+00 1.3000000e+00 6.0000000e-01 1.2000000e+00 1.4000000e+00 1.2000000e+00 9.0000000e-01 1.7000000e+00 1.5000000e+00 1.0000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 9.0000000e-01 1.3000000e+00 5.0000000e-01 1.7000000e+00 8.0000000e-01 1.6000000e+00 1.3000000e+00 1.5000000e+00 2.3000000e+00 1.3000000e+00 2.0000000e+00 1.5000000e+00 1.8000000e+00 8.0000000e-01 1.0000000e+00 1.2000000e+00 7.0000000e-01 1.1000000e+00 1.0000000e+00 1.2000000e+00 2.4000000e+00 2.6000000e+00 7.0000000e-01 1.4000000e+00 7.0000000e-01 2.4000000e+00 6.0000000e-01 1.4000000e+00 1.7000000e+00 5.0000000e-01 6.0000000e-01 1.3000000e+00 1.5000000e+00 1.8000000e+00 2.1000000e+00 1.3000000e+00 8.0000000e-01 1.3000000e+00 1.8000000e+00 1.3000000e+00 1.2000000e+00 5.0000000e-01 1.1000000e+00 1.3000000e+00 1.0000000e+00 8.0000000e-01 1.6000000e+00 1.4000000e+00 1.0000000e+00 7.0000000e-01 9.0000000e-01 1.1000000e+00 8.0000000e-01 1.1000000e+00 3.0000000e+00 2.1000000e+00 2.9000000e+00 2.6000000e+00 2.8000000e+00 3.6000000e+00 1.5000000e+00 3.3000000e+00 2.8000000e+00 3.1000000e+00 2.1000000e+00 2.3000000e+00 2.5000000e+00 2.0000000e+00 2.1000000e+00 2.3000000e+00 2.5000000e+00 3.7000000e+00 3.9000000e+00 2.0000000e+00 2.7000000e+00 1.9000000e+00 3.7000000e+00 1.9000000e+00 2.7000000e+00 3.0000000e+00 1.8000000e+00 1.9000000e+00 2.6000000e+00 2.8000000e+00 3.1000000e+00 3.4000000e+00 2.6000000e+00 2.1000000e+00 2.6000000e+00 3.1000000e+00 2.6000000e+00 2.5000000e+00 1.8000000e+00 2.4000000e+00 2.6000000e+00 2.1000000e+00 2.1000000e+00 2.9000000e+00 2.7000000e+00 2.2000000e+00 2.0000000e+00 2.2000000e+00 2.4000000e+00 2.1000000e+00 1.9000000e+00 1.0000000e+00 1.8000000e+00 1.5000000e+00 1.7000000e+00 2.5000000e+00 8.0000000e-01 2.2000000e+00 1.7000000e+00 2.0000000e+00 1.0000000e+00 1.2000000e+00 1.4000000e+00 9.0000000e-01 1.1000000e+00 1.2000000e+00 1.4000000e+00 2.6000000e+00 2.8000000e+00 9.0000000e-01 1.6000000e+00 8.0000000e-01 2.6000000e+00 8.0000000e-01 1.6000000e+00 1.9000000e+00 7.0000000e-01 8.0000000e-01 1.5000000e+00 1.7000000e+00 2.0000000e+00 2.3000000e+00 1.5000000e+00 1.0000000e+00 1.5000000e+00 2.0000000e+00 1.5000000e+00 1.4000000e+00 7.0000000e-01 1.3000000e+00 1.5000000e+00 1.2000000e+00 1.0000000e+00 1.8000000e+00 1.6000000e+00 1.1000000e+00 9.0000000e-01 1.1000000e+00 1.3000000e+00 1.0000000e+00 9.0000000e-01 8.0000000e-01 7.0000000e-01 3.0000000e-01 1.3000000e+00 1.5000000e+00 1.0000000e+00 8.0000000e-01 9.0000000e-01 9.0000000e-01 7.0000000e-01 5.0000000e-01 1.0000000e+00 9.0000000e-01 7.0000000e-01 7.0000000e-01 1.4000000e+00 1.4000000e+00 1.1000000e+00 6.0000000e-01 1.1000000e+00 1.4000000e+00 1.1000000e+00 4.0000000e-01 9.0000000e-01 1.2000000e+00 1.1000000e+00 5.0000000e-01 9.0000000e-01 1.1000000e+00 1.6000000e+00 5.0000000e-01 1.0000000e+00 1.1000000e+00 1.4000000e+00 4.0000000e-01 7.0000000e-01 1.2000000e+00 6.0000000e-01 4.0000000e-01 9.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 8.0000000e-01 6.0000000e-01 9.0000000e-01 1.3000000e+00 5.0000000e-01 7.0000000e-01 1.8000000e+00 9.0000000e-01 1.5000000e+00 9.0000000e-01 1.4000000e+00 7.0000000e-01 6.0000000e-01 1.0000000e+00 2.0000000e-01 5.0000000e-01 6.0000000e-01 7.0000000e-01 1.9000000e+00 1.9000000e+00 5.0000000e-01 1.1000000e+00 2.0000000e-01 1.9000000e+00 5.0000000e-01 9.0000000e-01 1.4000000e+00 4.0000000e-01 3.0000000e-01 6.0000000e-01 1.4000000e+00 1.6000000e+00 2.1000000e+00 6.0000000e-01 5.0000000e-01 5.0000000e-01 1.9000000e+00 7.0000000e-01 6.0000000e-01 3.0000000e-01 1.1000000e+00 9.0000000e-01 1.1000000e+00 0.0000000e+00 1.0000000e+00 9.0000000e-01 9.0000000e-01 5.0000000e-01 7.0000000e-01 7.0000000e-01 3.0000000e-01 8.0000000e-01 6.0000000e-01 7.0000000e-01 2.2000000e+00 4.0000000e-01 5.0000000e-01 6.0000000e-01 8.0000000e-01 7.0000000e-01 4.0000000e-01 1.4000000e+00 1.3000000e+00 7.0000000e-01 6.0000000e-01 8.0000000e-01 1.0000000e+00 1.1000000e+00 2.0000000e-01 1.5000000e+00 8.0000000e-01 1.0000000e+00 4.0000000e-01 3.0000000e-01 1.1000000e+00 1.0000000e+00 7.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 7.0000000e-01 8.0000000e-01 1.0000000e+00 6.0000000e-01 8.0000000e-01 7.0000000e-01 1.1000000e+00 5.0000000e-01 4.0000000e-01 8.0000000e-01 1.3000000e+00 3.0000000e-01 4.0000000e-01 7.0000000e-01 9.0000000e-01 7.0000000e-01 9.0000000e-01 1.2000000e+00 4.0000000e-01 1.3000000e+00 1.4000000e+00 1.0000000e+00 4.0000000e-01 9.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 2.0000000e-01 1.4000000e+00 1.4000000e+00 7.0000000e-01 6.0000000e-01 7.0000000e-01 1.4000000e+00 7.0000000e-01 4.0000000e-01 9.0000000e-01 8.0000000e-01 7.0000000e-01 3.0000000e-01 9.0000000e-01 1.1000000e+00 1.6000000e+00 4.0000000e-01 5.0000000e-01 4.0000000e-01 1.4000000e+00 6.0000000e-01 2.0000000e-01 8.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 1.1000000e+00 1.6000000e+00 8.0000000e-01 5.0000000e-01 7.0000000e-01 7.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 7.0000000e-01 5.0000000e-01 4.0000000e-01 1.2000000e+00 1.2000000e+00 8.0000000e-01 4.0000000e-01 9.0000000e-01 1.2000000e+00 9.0000000e-01 3.0000000e-01 7.0000000e-01 1.0000000e+00 9.0000000e-01 2.0000000e-01 7.0000000e-01 9.0000000e-01 1.4000000e+00 2.0000000e-01 7.0000000e-01 8.0000000e-01 1.2000000e+00 4.0000000e-01 4.0000000e-01 1.0000000e+00 4.0000000e-01 2.0000000e-01 7.0000000e-01 7.0000000e-01 3.0000000e-01 3.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 2.7000000e+00 3.0000000e-01 9.0000000e-01 6.0000000e-01 1.5000000e+00 1.3000000e+00 1.1000000e+00 1.9000000e+00 1.8000000e+00 1.3000000e+00 1.1000000e+00 8.0000000e-01 4.0000000e-01 1.6000000e+00 9.0000000e-01 2.0000000e+00 2.0000000e-01 1.7000000e+00 9.0000000e-01 6.0000000e-01 1.8000000e+00 1.7000000e+00 1.2000000e+00 8.0000000e-01 5.0000000e-01 8.0000000e-01 1.2000000e+00 1.5000000e+00 1.5000000e+00 5.0000000e-01 1.3000000e+00 1.2000000e+00 1.8000000e+00 1.2000000e+00 1.0000000e+00 1.5000000e+00 1.8000000e+00 8.0000000e-01 9.0000000e-01 1.4000000e+00 1.6000000e+00 1.4000000e+00 1.4000000e+00 1.7000000e+00 2.4000000e+00 1.8000000e+00 2.3000000e+00 1.6000000e+00 1.5000000e+00 1.9000000e+00 8.0000000e-01 9.0000000e-01 1.5000000e+00 1.6000000e+00 2.8000000e+00 2.8000000e+00 1.1000000e+00 2.0000000e+00 7.0000000e-01 2.8000000e+00 1.4000000e+00 1.8000000e+00 2.3000000e+00 1.3000000e+00 1.2000000e+00 1.5000000e+00 2.3000000e+00 2.5000000e+00 3.0000000e+00 1.5000000e+00 1.4000000e+00 1.2000000e+00 2.8000000e+00 1.4000000e+00 1.5000000e+00 1.1000000e+00 2.0000000e+00 1.8000000e+00 2.0000000e+00 9.0000000e-01 1.9000000e+00 1.8000000e+00 1.8000000e+00 1.4000000e+00 1.6000000e+00 1.3000000e+00 1.0000000e+00 6.0000000e-01 7.0000000e-01 1.2000000e+00 1.0000000e+00 8.0000000e-01 1.6000000e+00 1.5000000e+00 1.0000000e+00 8.0000000e-01 9.0000000e-01 6.0000000e-01 1.3000000e+00 6.0000000e-01 1.7000000e+00 4.0000000e-01 1.4000000e+00 6.0000000e-01 3.0000000e-01 1.5000000e+00 1.4000000e+00 9.0000000e-01 5.0000000e-01 2.0000000e-01 9.0000000e-01 9.0000000e-01 1.2000000e+00 1.2000000e+00 5.0000000e-01 1.0000000e+00 9.0000000e-01 1.5000000e+00 9.0000000e-01 7.0000000e-01 1.2000000e+00 1.5000000e+00 5.0000000e-01 7.0000000e-01 1.1000000e+00 1.3000000e+00 1.1000000e+00 1.1000000e+00 1.4000000e+00 1.1000000e+00 7.0000000e-01 5.0000000e-01 5.0000000e-01 1.0000000e+00 9.0000000e-01 7.0000000e-01 5.0000000e-01 1.3000000e+00 1.1000000e+00 8.0000000e-01 7.0000000e-01 1.1000000e+00 1.0000000e+00 9.0000000e-01 8.0000000e-01 7.0000000e-01 1.0000000e+00 9.0000000e-01 3.0000000e-01 5.0000000e-01 7.0000000e-01 1.3000000e+00 4.0000000e-01 7.0000000e-01 6.0000000e-01 1.0000000e+00 9.0000000e-01 6.0000000e-01 1.0000000e+00 6.0000000e-01 6.0000000e-01 7.0000000e-01 9.0000000e-01 7.0000000e-01 8.0000000e-01 6.0000000e-01 8.0000000e-01 6.0000000e-01 9.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 6.0000000e-01 1.5000000e+00 1.4000000e+00 8.0000000e-01 7.0000000e-01 6.0000000e-01 1.0000000e+00 1.4000000e+00 4.0000000e-01 1.6000000e+00 8.0000000e-01 1.2000000e+00 5.0000000e-01 7.0000000e-01 1.3000000e+00 1.2000000e+00 8.0000000e-01 9.0000000e-01 8.0000000e-01 7.0000000e-01 8.0000000e-01 1.0000000e+00 1.1000000e+00 6.0000000e-01 9.0000000e-01 8.0000000e-01 1.3000000e+00 7.0000000e-01 5.0000000e-01 1.0000000e+00 1.4000000e+00 4.0000000e-01 5.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 1.0000000e+00 1.3000000e+00 5.0000000e-01 4.0000000e-01 8.0000000e-01 7.0000000e-01 3.0000000e-01 4.0000000e-01 1.6000000e+00 1.8000000e+00 1.0000000e+00 6.0000000e-01 9.0000000e-01 1.6000000e+00 5.0000000e-01 6.0000000e-01 9.0000000e-01 4.0000000e-01 4.0000000e-01 5.0000000e-01 7.0000000e-01 1.0000000e+00 1.4000000e+00 5.0000000e-01 5.0000000e-01 6.0000000e-01 1.2000000e+00 5.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 6.0000000e-01 3.0000000e-01 7.0000000e-01 2.0000000e-01 3.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 3.0000000e-01 1.4000000e+00 1.6000000e+00 5.0000000e-01 5.0000000e-01 8.0000000e-01 1.4000000e+00 4.0000000e-01 6.0000000e-01 8.0000000e-01 5.0000000e-01 4.0000000e-01 3.0000000e-01 8.0000000e-01 1.0000000e+00 1.5000000e+00 3.0000000e-01 4.0000000e-01 5.0000000e-01 1.3000000e+00 7.0000000e-01 4.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 6.0000000e-01 4.0000000e-01 3.0000000e-01 3.0000000e-01 7.0000000e-01 5.0000000e-01 1.1000000e+00 1.0000000e+00 4.0000000e-01 3.0000000e-01 1.2000000e+00 1.4000000e+00 8.0000000e-01 2.0000000e-01 1.2000000e+00 1.2000000e+00 6.0000000e-01 3.0000000e-01 5.0000000e-01 7.0000000e-01 7.0000000e-01 4.0000000e-01 5.0000000e-01 6.0000000e-01 1.1000000e+00 4.0000000e-01 6.0000000e-01 7.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e-01 3.0000000e-01 4.0000000e-01 1.0000000e+00 4.0000000e-01 4.0000000e-01 3.0000000e-01 5.0000000e-01 3.0000000e-01 6.0000000e-01 9.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 2.0000000e+00 2.0000000e+00 5.0000000e-01 1.2000000e+00 3.0000000e-01 2.0000000e+00 6.0000000e-01 1.0000000e+00 1.5000000e+00 5.0000000e-01 5.0000000e-01 7.0000000e-01 1.5000000e+00 1.7000000e+00 2.2000000e+00 7.0000000e-01 6.0000000e-01 6.0000000e-01 2.0000000e+00 9.0000000e-01 7.0000000e-01 5.0000000e-01 1.2000000e+00 1.0000000e+00 1.2000000e+00 2.0000000e-01 1.1000000e+00 1.0000000e+00 1.0000000e+00 6.0000000e-01 8.0000000e-01 9.0000000e-01 5.0000000e-01 6.0000000e-01 7.0000000e-01 1.9000000e+00 1.9000000e+00 9.0000000e-01 1.1000000e+00 4.0000000e-01 1.9000000e+00 6.0000000e-01 9.0000000e-01 1.4000000e+00 6.0000000e-01 6.0000000e-01 6.0000000e-01 1.4000000e+00 1.6000000e+00 2.1000000e+00 6.0000000e-01 9.0000000e-01 1.0000000e+00 1.9000000e+00 6.0000000e-01 6.0000000e-01 6.0000000e-01 1.1000000e+00 9.0000000e-01 1.1000000e+00 5.0000000e-01 1.0000000e+00 9.0000000e-01 9.0000000e-01 5.0000000e-01 7.0000000e-01 6.0000000e-01 6.0000000e-01 5.0000000e-01 1.4000000e+00 1.6000000e+00 1.0000000e+00 5.0000000e-01 8.0000000e-01 1.4000000e+00 5.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 4.0000000e-01 8.0000000e-01 1.0000000e+00 1.5000000e+00 4.0000000e-01 8.0000000e-01 9.0000000e-01 1.3000000e+00 3.0000000e-01 5.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 6.0000000e-01 4.0000000e-01 3.0000000e-01 7.0000000e-01 3.0000000e-01 2.0000000e-01 5.0000000e-01 1.2000000e+00 1.4000000e+00 8.0000000e-01 5.0000000e-01 9.0000000e-01 1.2000000e+00 6.0000000e-01 3.0000000e-01 7.0000000e-01 7.0000000e-01 6.0000000e-01 3.0000000e-01 7.0000000e-01 9.0000000e-01 1.4000000e+00 4.0000000e-01 4.0000000e-01 4.0000000e-01 1.2000000e+00 6.0000000e-01 1.0000000e-01 7.0000000e-01 4.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 1.2000000e+00 1.7000000e+00 1.0000000e+00 2.1000000e+00 1.0000000e+00 1.8000000e+00 1.0000000e+00 7.0000000e-01 1.9000000e+00 1.8000000e+00 1.3000000e+00 9.0000000e-01 1.0000000e+00 3.0000000e-01 1.3000000e+00 1.6000000e+00 1.6000000e+00 8.0000000e-01 1.4000000e+00 1.3000000e+00 1.9000000e+00 1.3000000e+00 1.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.0000000e+00 1.5000000e+00 1.7000000e+00 1.5000000e+00 1.5000000e+00 1.8000000e+00 1.9000000e+00 1.2000000e+00 2.1000000e+00 3.0000000e-01 2.0000000e+00 1.2000000e+00 9.0000000e-01 2.1000000e+00 2.0000000e+00 1.3000000e+00 1.1000000e+00 8.0000000e-01 1.2000000e+00 1.3000000e+00 1.8000000e+00 1.6000000e+00 8.0000000e-01 1.4000000e+00 1.4000000e+00 2.1000000e+00 1.5000000e+00 1.3000000e+00 1.8000000e+00 1.9000000e+00 1.0000000e+00 1.2000000e+00 1.7000000e+00 1.9000000e+00 1.7000000e+00 1.5000000e+00 1.8000000e+00 1.0000000e+00 6.0000000e-01 1.7000000e+00 5.0000000e-01 1.1000000e+00 1.2000000e+00 6.0000000e-01 8.0000000e-01 6.0000000e-01 1.2000000e+00 1.4000000e+00 1.9000000e+00 7.0000000e-01 6.0000000e-01 6.0000000e-01 1.7000000e+00 1.2000000e+00 9.0000000e-01 8.0000000e-01 9.0000000e-01 9.0000000e-01 9.0000000e-01 5.0000000e-01 1.0000000e+00 1.1000000e+00 8.0000000e-01 4.0000000e-01 8.0000000e-01 1.2000000e+00 8.0000000e-01 1.3000000e+00 1.0000000e+00 8.0000000e-01 2.0000000e-01 5.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 1.0000000e+00 5.0000000e-01 8.0000000e-01 9.0000000e-01 8.0000000e-01 6.0000000e-01 5.0000000e-01 9.0000000e-01 3.0000000e-01 2.0000000e-01 6.0000000e-01 1.1000000e+00 2.0000000e-01 2.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 7.0000000e-01 1.0000000e+00 2.1000000e+00 7.0000000e-01 1.1000000e+00 1.6000000e+00 6.0000000e-01 5.0000000e-01 8.0000000e-01 1.6000000e+00 1.8000000e+00 2.3000000e+00 8.0000000e-01 7.0000000e-01 7.0000000e-01 2.1000000e+00 7.0000000e-01 8.0000000e-01 4.0000000e-01 1.3000000e+00 1.1000000e+00 1.3000000e+00 2.0000000e-01 1.2000000e+00 1.1000000e+00 1.1000000e+00 7.0000000e-01 9.0000000e-01 6.0000000e-01 3.0000000e-01 1.8000000e+00 1.0000000e+00 7.0000000e-01 1.9000000e+00 1.8000000e+00 1.3000000e+00 9.0000000e-01 6.0000000e-01 1.0000000e+00 1.3000000e+00 1.6000000e+00 1.6000000e+00 6.0000000e-01 1.4000000e+00 1.3000000e+00 1.9000000e+00 1.3000000e+00 1.1000000e+00 1.6000000e+00 1.9000000e+00 9.0000000e-01 1.0000000e+00 1.5000000e+00 1.7000000e+00 1.5000000e+00 1.5000000e+00 1.8000000e+00 8.0000000e-01 1.1000000e+00 1.0000000e-01 3.0000000e-01 7.0000000e-01 9.0000000e-01 1.2000000e+00 1.6000000e+00 7.0000000e-01 3.0000000e-01 7.0000000e-01 1.4000000e+00 7.0000000e-01 6.0000000e-01 3.0000000e-01 6.0000000e-01 7.0000000e-01 6.0000000e-01 5.0000000e-01 1.0000000e+00 8.0000000e-01 5.0000000e-01 2.0000000e-01 3.0000000e-01 7.0000000e-01 4.0000000e-01 5.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 7.0000000e-01 1.2000000e+00 5.0000000e-01 6.0000000e-01 7.0000000e-01 1.0000000e+00 4.0000000e-01 3.0000000e-01 9.0000000e-01 3.0000000e-01 3.0000000e-01 6.0000000e-01 9.0000000e-01 2.0000000e-01 4.0000000e-01 5.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 8.0000000e-01 1.2000000e+00 1.1000000e+00 8.0000000e-01 2.0000000e-01 4.0000000e-01 7.0000000e-01 8.0000000e-01 9.0000000e-01 1.1000000e+00 5.0000000e-01 9.0000000e-01 8.0000000e-01 1.2000000e+00 6.0000000e-01 6.0000000e-01 9.0000000e-01 1.4000000e+00 5.0000000e-01 7.0000000e-01 8.0000000e-01 1.0000000e+00 8.0000000e-01 1.0000000e+00 1.3000000e+00 2.0000000e-01 8.0000000e-01 1.0000000e+00 1.3000000e+00 1.7000000e+00 8.0000000e-01 3.0000000e-01 8.0000000e-01 1.5000000e+00 8.0000000e-01 7.0000000e-01 2.0000000e-01 7.0000000e-01 8.0000000e-01 7.0000000e-01 4.0000000e-01 1.1000000e+00 9.0000000e-01 5.0000000e-01 3.0000000e-01 4.0000000e-01 6.0000000e-01 3.0000000e-01 7.0000000e-01 1.1000000e+00 1.3000000e+00 1.8000000e+00 7.0000000e-01 3.0000000e-01 7.0000000e-01 1.6000000e+00 7.0000000e-01 6.0000000e-01 1.0000000e-01 8.0000000e-01 7.0000000e-01 8.0000000e-01 3.0000000e-01 1.0000000e+00 8.0000000e-01 6.0000000e-01 5.0000000e-01 4.0000000e-01 5.0000000e-01 2.0000000e-01 8.0000000e-01 1.0000000e+00 1.5000000e+00 1.0000000e-01 6.0000000e-01 7.0000000e-01 1.3000000e+00 6.0000000e-01 3.0000000e-01 8.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 6.0000000e-01 5.0000000e-01 3.0000000e-01 8.0000000e-01 8.0000000e-01 9.0000000e-01 1.1000000e+00 7.0000000e-01 9.0000000e-01 8.0000000e-01 1.2000000e+00 5.0000000e-01 8.0000000e-01 7.0000000e-01 1.4000000e+00 7.0000000e-01 9.0000000e-01 7.0000000e-01 9.0000000e-01 7.0000000e-01 1.0000000e+00 1.3000000e+00 1.0000000e+00 1.0000000e+00 1.1000000e+00 1.3000000e+00 4.0000000e-01 1.1000000e+00 1.0000000e+00 1.4000000e+00 7.0000000e-01 7.0000000e-01 1.0000000e+00 1.6000000e+00 6.0000000e-01 7.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 1.2000000e+00 1.5000000e+00 1.5000000e+00 1.6000000e+00 1.8000000e+00 8.0000000e-01 1.6000000e+00 1.5000000e+00 1.9000000e+00 1.0000000e+00 1.2000000e+00 1.3000000e+00 2.1000000e+00 1.1000000e+00 1.2000000e+00 1.2000000e+00 1.6000000e+00 1.4000000e+00 1.7000000e+00 2.0000000e+00 7.0000000e-01 8.0000000e-01 1.3000000e+00 6.0000000e-01 4.0000000e-01 8.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 6.0000000e-01 5.0000000e-01 5.0000000e-01 1.4000000e+00 9.0000000e-01 4.0000000e-01 3.0000000e-01 6.0000000e-01 9.0000000e-01 8.0000000e-01 5.0000000e-01 8.0000000e-01 1.0000000e+00 8.0000000e-01 4.0000000e-01 5.0000000e-01 8.0000000e-01 4.0000000e-01 1.6000000e+00 1.0000000e+00 5.0000000e-01 8.0000000e-01 8.0000000e-01 1.0000000e+00 9.0000000e-01 5.0000000e-01 9.0000000e-01 1.1000000e+00 9.0000000e-01 6.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 1.4000000e+00 1.3000000e+00 1.7000000e+00 8.0000000e-01 1.0000000e+00 1.0000000e+00 1.9000000e+00 9.0000000e-01 1.0000000e+00 1.0000000e+00 1.4000000e+00 1.2000000e+00 1.5000000e+00 1.8000000e+00 6.0000000e-01 8.0000000e-01 6.0000000e-01 4.0000000e-01 6.0000000e-01 7.0000000e-01 5.0000000e-01 4.0000000e-01 4.0000000e-01 9.0000000e-01 4.0000000e-01 2.0000000e-01 6.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 6.0000000e-01 5.0000000e-01 7.0000000e-01 5.0000000e-01 6.0000000e-01 3.0000000e-01 5.0000000e-01 5.0000000e-01 9.0000000e-01 8.0000000e-01 9.0000000e-01 3.0000000e-01 1.1000000e+00 9.0000000e-01 7.0000000e-01 5.0000000e-01 5.0000000e-01 6.0000000e-01 3.0000000e-01 3.0000000e-01 3.0000000e-01 1.1000000e+00 5.0000000e-01 4.0000000e-01 2.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e+00 5.0000000e-01 9.0000000e-01 3.0000000e-01 2.0000000e-01 4.0000000e-01 6.0000000e-01 4.0000000e-01 5.0000000e-01 8.0000000e-01 1.1000000e+00 8.0000000e-01 6.0000000e-01 2.0000000e-01 6.0000000e-01 4.0000000e-01 7.0000000e-01 1.0000000e+00 1.0000000e+00 9.0000000e-01 9.0000000e-01 5.0000000e-01 7.0000000e-01 7.0000000e-01 3.0000000e-01 2.0000000e-01 7.0000000e-01 9.0000000e-01 7.0000000e-01 6.0000000e-01 9.0000000e-01 5.0000000e-01 8.0000000e-01 5.0000000e-01 5.0000000e-01 8.0000000e-01 5.0000000e-01 3.0000000e-01 5.0000000e-01 8.0000000e-01 5.0000000e-01 9.0000000e-01 5.0000000e-01 4.0000000e-01 6.0000000e-01 5.0000000e-01 Added: trunk/scipy/cluster/tests/pdist-chebychev-ml.txt =================================================================== --- trunk/scipy/cluster/tests/pdist-chebychev-ml.txt 2008-04-18 02:25:25 UTC (rev 4149) +++ trunk/scipy/cluster/tests/pdist-chebychev-ml.txt 2008-04-18 03:06:35 UTC (rev 4150) @@ -0,0 +1 @@ + 8.9084734e-01 9.3573853e-01 9.3507398e-01 9.6040691e-01 9.2918157e-01 9.6617342e-01 9.0430930e-01 9.5753424e-01 8.7106898e-01 9.2169905e-01 9.7401159e-01 8.9013416e-01 9.3956689e-01 9.0041896e-01 9.2588355e-01 9.3849417e-01 8.9713468e-01 9.1481804e-01 9.7500539e-01 9.0012586e-01 9.0962559e-01 8.5860091e-01 8.6981095e-01 8.9995771e-01 8.8070172e-01 9.1456657e-01 8.6711474e-01 9.2593917e-01 8.7560376e-01 8.5193121e-01 9.0898542e-01 8.7765302e-01 8.6555584e-01 8.6093485e-01 9.0447028e-01 8.7614405e-01 9.4803522e-01 8.4998062e-01 7.8398996e-01 8.9538612e-01 8.3902291e-01 9.9039470e-01 9.5480519e-01 8.9152195e-01 9.1623329e-01 7.9094921e-01 9.1777100e-01 9.8972335e-01 9.0429093e-01 8.7646362e-01 9.2136649e-01 9.7178177e-01 8.9610979e-01 9.4710327e-01 9.3612450e-01 9.0241499e-01 7.7992538e-01 8.7262126e-01 9.3325183e-01 8.5796531e-01 9.4267977e-01 6.7224167e-01 7.9568368e-01 8.6411267e-01 9.3311642e-01 9.0160114e-01 9.0698887e-01 8.5833256e-01 9.6902830e-01 9.5072298e-01 8.6808495e-01 9.7879599e-01 8.8060729e-01 8.2818573e-01 8.4366706e-01 8.4506700e-01 9.4532981e-01 9.1792306e-01 7.8917825e-01 9.8337805e-01 8.1751613e-01 9.3037855e-01 9.1618832e-01 8.6568874e-01 8.9751397e-01 8.7923710e-01 8.6814329e-01 9.0330164e-01 8.2426213e-01 9.4644643e-01 8.8431293e-01 8.8497426e-01 9.0633818e-01 9.5537161e-01 8.2167575e-01 8.7771053e-01 9.0681167e-01 8.7626143e-01 8.7463464e-01 9.8033940e-01 9.2920881e-01 9.5108549e-01 9.1287466e-01 8.0052218e-01 9.2409517e-01 8.8252650e-01 8.7873923e-01 9.2989402e-01 9.1985043e-01 9.6172646e-01 8.8223856e-01 9.4477822e-01 8.8310948e-01 9.4461306e-01 9.1875210e-01 9.1233363e-01 9.2124013e-01 9.5460897e-01 8.4640982e-01 9.0882657e-01 9.8169468e-01 9.7828355e-01 8.4150533e-01 8.6888923e-01 9.7138825e-01 8.7988144e-01 9.6720910e-01 8.9450147e-01 9.5331584e-01 8.8871809e-01 8.9736685e-01 8.6258146e-01 9.1331565e-01 9.0968870e-01 9.4833654e-01 9.0536967e-01 9.5099871e-01 8.0251958e-01 9.2526150e-01 9.8971957e-01 9.0340947e-01 9.4955892e-01 9.6838162e-01 8.7534901e-01 9.1178797e-01 9.2649154e-01 9.5260993e-01 9.3178143e-01 9.4943000e-01 8.7816171e-01 9.6506542e-01 8.3422958e-01 9.3443585e-01 9.3220084e-01 8.5706573e-01 8.4666325e-01 9.0474744e-01 9.1080644e-01 9.2406899e-01 8.7901768e-01 9.3265263e-01 9.5992829e-01 9.5696271e-01 9.1932272e-01 8.0937044e-01 9.0904917e-01 8.9516756e-01 9.4797906e-01 8.4159421e-01 9.6773901e-01 9.7099825e-01 9.6941820e-01 9.8174088e-01 9.7569951e-01 9.3655362e-01 8.4130333e-01 9.5994549e-01 8.4235414e-01 9.1429418e-01 9.3418117e-01 8.4600977e-01 8.8166496e-01 8.7594776e-01 8.8571112e-01 9.6308174e-01 9.5315927e-01 8.6997519e-01 8.9383032e-01 9.4686804e-01 9.4399596e-01 Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 02:25:25 UTC (rev 4149) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 03:06:35 UTC (rev 4150) @@ -62,7 +62,9 @@ "pdist-double-inp.txt", "pdist-spearman-ml.txt", "pdist-euclidean-ml.txt", - "pdist-euclidean-ml-iris.txt"] + "pdist-euclidean-ml-iris.txt", + "pdist-chebychev-ml.txt", + "pdist-chebychev-ml-iris.txt"] # A hashmap of expected output arrays for the tests. These arrays # come from a list of text files, which are read prior to testing. @@ -95,7 +97,7 @@ except TypeError: pass except: - fail("float32 matrices should generate an error in pdist.") + self.fail("float32 observation matrices should generate an error in pdist.") def test_pdist_raises_type_error_float96(self): "Testing whether passing a float96 observation array generates an exception." @@ -105,18 +107,18 @@ except TypeError: pass except: - fail("float96 matrices should generate an error in pdist.") + self.fail("float96 observation matrices should generate an error in pdist.") def test_pdist_var_raises_type_error_float32(self): "Testing whether passing a float32 variance matrix generates an exception." X = numpy.zeros((10, 10)) V = numpy.zeros((10, 10), dtype='float32') try: - pdist(X, 'seuclidean', V) + pdist(X, 'seuclidean', V=V) except TypeError: pass except: - fail("float32 matrices should generate an error in pdist.") + self.fail("float32 V matrices should generate an error in pdist('seuclidean').") def test_pdist_var_raises_type_error_float96(self): "Testing whether passing a float96 variance matrix generates an exception." @@ -124,12 +126,35 @@ V = numpy.zeros((10, 10), dtype='float96') try: - pdist(X, 'seuclidean', V) + pdist(X, 'seuclidean', V=V) except TypeError: pass except: - fail("float96 matrices should generate an error in pdist.") + self.fail("float96 matrices should generate an error in pdist('seuclidean').") + def test_pdist_ivar_raises_type_error_float32(self): + "Testing whether passing a float32 variance matrix generates an exception." + X = numpy.zeros((10, 10)) + VI = numpy.zeros((10, 10), dtype='float32') + try: + pdist(X, 'mahalanobis', VI=VI) + except TypeError: + pass + except: + self.fail("float32 matrices should generate an error in pdist('mahalanobis').") + + def test_pdist_ivar_raises_type_error_float96(self): + "Testing whether passing a float96 variance matrix generates an exception." + X = numpy.zeros((10, 10)) + VI = numpy.zeros((10, 10), dtype='float96') + + try: + pdist(X, 'mahalanobis', VI) + except TypeError: + pass + except: + self.fail("float96 matrices should generate an error in pdist('mahalanobis').") + ################### pdist: euclidean def test_pdist_euclidean_random(self): "Tests pdist(X, 'euclidean') on random data." @@ -415,6 +440,28 @@ #print "test-hamming", numpy.abs(Y_test2 - Y_right).max() self.failUnless(within_tol(Y_test2, Y_right, eps)) + ################### pdist: hamming (double) + def test_pdist_dhamming_random(self): + "Tests pdist(X, 'hamming') on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = numpy.float64(eo['pdist-boolean-inp']) + Y_right = eo['pdist-hamming'] + + Y_test1 = pdist(X, 'hamming') + #print "hamming", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_dhamming_random_nonC(self): + "Tests pdist(X, 'test_hamming') [the non-C implementation] on random data." + eps = 1e-07 + # Get the data: the input matrix and the right output. + X = numpy.float64(eo['pdist-boolean-inp']) + Y_right = eo['pdist-hamming'] + Y_test2 = pdist(X, 'test_hamming') + #print "test-hamming", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + ################### pdist: jaccard def test_pdist_jaccard_random(self): "Tests pdist(X, 'jaccard') on random data." @@ -425,7 +472,7 @@ Y_test1 = pdist(X, 'jaccard') #print "jaccard", numpy.abs(Y_test1 - Y_right).max() - #self.failUnless(within_tol(Y_test1, Y_right, eps)) + self.failUnless(within_tol(Y_test1, Y_right, eps)) def test_pdist_jaccard_random_nonC(self): "Tests pdist(X, 'test_jaccard') [the non-C implementation] on random data." @@ -437,6 +484,71 @@ #print "test-jaccard", numpy.abs(Y_test2 - Y_right).max() self.failUnless(within_tol(Y_test2, Y_right, eps)) + ################### pdist: jaccard (double) + def test_pdist_djaccard_random(self): + "Tests pdist(X, 'jaccard') on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = numpy.float64(eo['pdist-boolean-inp']) + Y_right = eo['pdist-jaccard'] + + Y_test1 = pdist(X, 'jaccard') + #print "jaccard", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_djaccard_random_nonC(self): + "Tests pdist(X, 'test_jaccard') [the non-C implementation] on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = numpy.float64(eo['pdist-boolean-inp']) + Y_right = eo['pdist-jaccard'] + Y_test2 = pdist(X, 'test_jaccard') + #print "test-jaccard", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + ################### pdist: chebychev + def test_pdist_chebychev_random(self): + "Tests pdist(X, 'chebychev') on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-chebychev'] + + Y_test1 = pdist(X, 'chebychev') + #print "chebychev", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_chebychev_random_nonC(self): + "Tests pdist(X, 'test_chebychev') [the non-C implementation] on random data." + eps = 1e-08 + # Get the data: the input matrix and the right output. + X = eo['pdist-double-inp'] + Y_right = eo['pdist-chebychev'] + Y_test2 = pdist(X, 'test_chebychev') + #print "test-chebychev", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + + def test_pdist_chebychev_iris(self): + "Tests pdist(X, 'chebychev') on the Iris data set." + eps = 1e-15 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-chebychev-iris'] + + Y_test1 = pdist(X, 'chebychev') + #print "chebychev-iris", numpy.abs(Y_test1 - Y_right).max() + self.failUnless(within_tol(Y_test1, Y_right, eps)) + + def test_pdist_chebychev_iris_nonC(self): + "Tests pdist(X, 'test_chebychev') [the non-C implementation] on the Iris data set." + eps = 1e-15 + # Get the data: the input matrix and the right output. + X = eo['iris'] + Y_right = eo['pdist-chebychev-iris'] + Y_test2 = pdist(X, 'test_chebychev') + #print "test-chebychev-iris", numpy.abs(Y_test2 - Y_right).max() + self.failUnless(within_tol(Y_test2, Y_right, eps)) + def within_tol(a, b, tol): return numpy.abs(a - b).max() < tol From scipy-svn at scipy.org Thu Apr 17 23:15:09 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 17 Apr 2008 22:15:09 -0500 (CDT) Subject: [Scipy-svn] r4151 - in trunk/scipy/cluster: . tests Message-ID: <20080418031509.C14E439C45C@new.scipy.org> Author: damian.eads Date: 2008-04-17 22:15:07 -0500 (Thu, 17 Apr 2008) New Revision: 4151 Modified: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/tests/test_hierarchy.py Log: Minor change to type checking in pdist('mahalanobis', ...) Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-18 03:06:35 UTC (rev 4150) +++ trunk/scipy/cluster/hierarchy.py 2008-04-18 03:15:07 UTC (rev 4151) @@ -1366,15 +1366,15 @@ _hierarchy_wrap.pdist_jaccard_bool_wrap(X, dm) else: raise TypeError('Invalid input array value type %s for jaccard.' % str(X.dtype)) - elif mstr in set(['chebyshev', 'cheby', 'cheb', 'ch']): + elif mstr in set(['chebychev', 'chebyshev', 'cheby', 'cheb', 'ch']): _hierarchy_wrap.pdist_chebyshev_wrap(X, dm) elif mstr in set(['minkowski', 'mi', 'm']): _hierarchy_wrap.pdist_minkowski_wrap(X, dm, p) elif mstr in set(['seuclidean', 'se', 's']): - if V: + if V is not None: if type(V) is not _array_type: raise TypeError('Variance vector V must be a numpy array') - if V.dtype != 'double': + if V.dtype != 'float64': raise TypeError('Variance vector V must contain doubles.') if len(V.shape) != 1: raise ValueError('Variance vector V must be one-dimensional.') @@ -1408,11 +1408,11 @@ norms = numpy.sqrt(numpy.sum(X2 * X2, axis=1)) _hierarchy_wrap.pdist_cosine_wrap(X2, dm, norms) elif mstr in set(['mahalanobis', 'mahal', 'mah']): - if VI: + if VI is not None: if type(VI) != _array_type: raise TypeError('VI must be a numpy array.') - if VI.dtype != 'double': - raise TypeError('The array must contain doubles.') + if VI.dtype != 'float64': + raise TypeError('The array must contain 64-bit floats.') [VI] = _copy_arrays_if_base_present([VI]) else: V = numpy.cov(X.T) @@ -1466,7 +1466,7 @@ dm = pdist(X, hamming) elif metric == 'test_jaccard': dm = pdist(X, jaccard) - elif metric == 'test_chebyshev': + elif metric == 'test_chebyshev' or metric == 'test_chebychev': dm = pdist(X, chebyshev) elif metric == 'test_yule': dm = pdist(X, yule) Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 03:06:35 UTC (rev 4150) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-18 03:15:07 UTC (rev 4151) @@ -149,7 +149,7 @@ VI = numpy.zeros((10, 10), dtype='float96') try: - pdist(X, 'mahalanobis', VI) + pdist(X, 'mahalanobis', VI=VI) except TypeError: pass except: From scipy-svn at scipy.org Fri Apr 18 15:03:33 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 18 Apr 2008 14:03:33 -0500 (CDT) Subject: [Scipy-svn] r4152 - trunk/scipy/sparse/sparsetools Message-ID: <20080418190333.EB77839C142@new.scipy.org> Author: wnbell Date: 2008-04-18 14:03:29 -0500 (Fri, 18 Apr 2008) New Revision: 4152 Modified: trunk/scipy/sparse/sparsetools/bsr.h trunk/scipy/sparse/sparsetools/csr.h Log: fixed memory access errors reported in ticket #616 Modified: trunk/scipy/sparse/sparsetools/bsr.h =================================================================== --- trunk/scipy/sparse/sparsetools/bsr.h 2008-04-18 03:15:07 UTC (rev 4151) +++ trunk/scipy/sparse/sparsetools/bsr.h 2008-04-18 19:03:29 UTC (rev 4152) @@ -468,11 +468,11 @@ I A_end = Ap[i+1]; I B_end = Bp[i+1]; - I A_j = Aj[A_pos]; - I B_j = Bj[B_pos]; - //while not finished with either row while(A_pos < A_end && B_pos < B_end){ + I A_j = Aj[A_pos]; + I B_j = Bj[B_pos]; + if(A_j == B_j){ for(I n = 0; n < RC; n++){ result[n] = op(Ax[RC*A_pos + n],Bx[RC*B_pos + n]); @@ -484,9 +484,8 @@ nnz++; } - A_j = Aj[++A_pos]; - B_j = Bj[++B_pos]; - + A_pos++; + B_pos++; } else if (A_j < B_j) { for(I n = 0; n < RC; n++){ result[n] = op(Ax[RC*A_pos + n],0); @@ -498,8 +497,7 @@ nnz++; } - A_j = Aj[++A_pos]; - + A_pos++; } else { //B_j < A_j for(I n = 0; n < RC; n++){ @@ -511,26 +509,23 @@ nnz++; } - B_j = Bj[++B_pos]; - + B_pos++; } } //tail while(A_pos < A_end){ - for(I n = 0; n < RC; n++){ result[n] = op(Ax[RC*A_pos + n],0); } if(is_nonzero_block(result,RC)){ - Cj[nnz] = A_j; + Cj[nnz] = Aj[A_pos]; result += RC; nnz++; } - A_j = Aj[++A_pos]; - + A_pos++; } while(B_pos < B_end){ for(I n = 0; n < RC; n++){ @@ -538,13 +533,12 @@ } if(is_nonzero_block(result,RC)){ - Cj[nnz] = B_j; + Cj[nnz] = Bj[B_pos]; result += RC; nnz++; } - B_j = Bj[++B_pos]; - + B_pos++; } Cp[i+1] = nnz; Modified: trunk/scipy/sparse/sparsetools/csr.h =================================================================== --- trunk/scipy/sparse/sparsetools/csr.h 2008-04-18 03:15:07 UTC (rev 4151) +++ trunk/scipy/sparse/sparsetools/csr.h 2008-04-18 19:03:29 UTC (rev 4152) @@ -630,11 +630,11 @@ I A_end = Ap[i+1]; I B_end = Bp[i+1]; - I A_j = Aj[A_pos]; - I B_j = Bj[B_pos]; - //while not finished with either row while(A_pos < A_end && B_pos < B_end){ + I A_j = Aj[A_pos]; + I B_j = Bj[B_pos]; + if(A_j == B_j){ T result = op(Ax[A_pos],Bx[B_pos]); if(result != 0){ @@ -642,8 +642,8 @@ Cx[nnz] = result; nnz++; } - A_j = Aj[++A_pos]; - B_j = Bj[++B_pos]; + A_pos++; + B_pos++; } else if (A_j < B_j) { T result = op(Ax[A_pos],0); if (result != 0){ @@ -651,7 +651,7 @@ Cx[nnz] = result; nnz++; } - A_j = Aj[++A_pos]; + A_pos++; } else { //B_j < A_j T result = op(0,Bx[B_pos]); @@ -660,7 +660,7 @@ Cx[nnz] = result; nnz++; } - B_j = Bj[++B_pos]; + B_pos++; } } @@ -759,7 +759,7 @@ I j = Aj[jj]; T x = Ax[jj]; jj++; - while( Aj[jj] == j && jj < row_end ){ + while( jj < row_end && Aj[jj] == j ){ x += Ax[jj]; jj++; } From scipy-svn at scipy.org Sun Apr 20 04:27:26 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 20 Apr 2008 03:27:26 -0500 (CDT) Subject: [Scipy-svn] r4153 - trunk/scipy/weave Message-ID: <20080420082726.DAFDB39C20E@new.scipy.org> Author: jarrod.millman Date: 2008-04-20 03:27:24 -0500 (Sun, 20 Apr 2008) New Revision: 4153 Modified: trunk/scipy/weave/LICENSE.txt Log: Todd Veldhuizen has permitted us to release blitz++ under the BSD license Modified: trunk/scipy/weave/LICENSE.txt =================================================================== --- trunk/scipy/weave/LICENSE.txt 2008-04-18 19:03:29 UTC (rev 4152) +++ trunk/scipy/weave/LICENSE.txt 2008-04-20 08:27:24 UTC (rev 4153) @@ -1,11 +1,57 @@ weave is distributed under the same license as SciPy which uses a BSD Style -license. weave also includes CXX by Paul Dubois, portions of SCXX by -Gordon McMillan, and blitz++ by Todd Veldhuizen. The licenses for all of -these packages are different, but allow free use for both commercial and -non-commercial purposes. The licenses for each are listed below: +license. weave includes blitz++ by Todd Veldhuizen who kindly granted us +permission to use blitz++ with the regular SciPy license (i.e., the revised +BSD license). For more details see the email exchange below: ------------------------------------------------------------------------- +Todd Veldhuizen Tue, Mar 25, 2008 at 11:55 AM +To: Jarrod Millman +Cc: Julian Cummings , Todd Veldhuizen + +I have no objections to releasing it under a BSD license. + +best +Todd + +On 21/03/2008, Jarrod Millman wrote: +> Julian and Todd, +> +> I'm writing to see if we can get an exception to the Blitz license so +> that it can be released with a BSD license within SciPy. Currently, +> the Fedora project is classifying the entire SciPy package as GPLed +> because one package, scipy.weave, uses blitz. (the rest of the code is +> all BSD). We were about to launch into the re-factoring step to make +> the blitz portion optional, when it occurred to us to just ask you +> guys first. :-) +> +> Blitz is included in the scipy.weave package which allows you to +> inline C/C++ within Python. Users have the option of converting NumPy +> arrays to blitz arrays for use in C++. There is also a function +> (weave.blitz) that will automatically convert NumPy expressions in +> Python to Blitz expressions in C++. Often this shows notable speed +> improvements. Our re-factoring step will require us to split the +> blitz code into the blitz and non-blitz portions. This is a bit of a +> pain, and ends up with more installation issues than if we didn't do +> it. +> +> Thanks for your consideration, +> +> -- +> Jarrod Millman +> Computational Infrastructure for Research Labs +> 10 Giannini Hall, UC Berkeley +> phone: 510.643.4014 +> http://cirl.berkeley.edu/ +------------------------------------------------------------------------- + +weave also includes CXX by Paul Dubois, portions of SCXX by Gordon McMillan. +The licenses for CXX and SCXX are different, but allow free use for +both commercial and non-commercial purposes. The licenses for each are +listed below: + +------------------------------------------------------------------------- + SciPy License Copyright (c) 2001, Enthought, Inc. @@ -81,93 +127,3 @@ copyright 1999 McMillan Enterprises, Inc. www.mcmillan-inc.com - -------------------------------------------------------------------------- - -Blitz License - -The `Blitz++ Artistic License' -(with thanks and apologies to authors of the Perl Artistic License) - -Preamble - -The intent of this document is to state the conditions under which -Blitz++ may be copied, such that the authors maintains some -semblance of artistic control over the development of the package, -while giving the users of the package the right to use and -distribute Blitz++ in a more-or-less customary fashion, plus the -right to make reasonable modifications. - -Definitions - -`Library' refers to the collection of files distributed by the -Copyright Holder, and derivatives of that collection of files -created through textual modification. - -`Standard Version' refers to such a Library if it has not been -modified, or has been modified in accordance with the wishes of the -Copyright Holder as specified below. - -Copyright Holder' is whoever is named in the copyright or -copyrights for the package. - -`You' is you, if you're thinking about copying, modifying or -distributing this Library. - -`Freely Available' means that no fee is charged for the item. -It also means that recipients of the item may redistribute it -under the same conditions they received it. - -``Reasonable copying fee'' is whatever you can justify on the basis -of media cost, duplication charges, time of people involved, and so -on. (You will not be required to justify it to the Copyright Holder, -but only to the computing community at large as a market that must -bear the fee.) - -1. You may make and give away verbatim copies of the -Standard Version of this Library without restriction, provided that -you duplicate all of the original copyright notices, this license, -and associated disclaimers. - -2. The Standard Version of the Library may be distributed as part -of a collection of software, provided no more than a reasonable -copying fee is charged for the software collection. - -3. You may apply bug fixes, portability fixes and other modifications -derived from the Public Domain or from the Copyright Holder. A -Library modified in such a way shall still be considered the -Standard Version. - -4. You may otherwise modify your copy of this Library in any way, -provided that you insert a prominent notice in each changed file -stating how and when you changed that file, and provided that you do -at least ONE of the following: - -a. place your modifications in the Public Domain or otherwise -make them Freely Available, such as by posting said -modifications to the Blitz++ development list, -and allowing the Copyright Holder to include -your modifications in the Standard Version of the Library. - -b. use the modified Library only within your corporation or -organization. - -c. make other distribution arrangements with the Copyright -Holder. - -5. You may distribute programs which use this Library -in object code or executable form without restriction. - -6. Any object code generated as a result of using this Library -does not fall under the copyright of this Library, but -belongs to whomever generated it, and may be sold commercially. - -7. The name of the Copyright Holder or the Library may not be used to -endorse or promote products derived from this software without -specific prior written permission. - -8. THIS PACKAGE IS PROVIDED `AS IS' AND WITHOUT ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED -WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - - From scipy-svn at scipy.org Sun Apr 20 08:16:11 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 20 Apr 2008 07:16:11 -0500 (CDT) Subject: [Scipy-svn] r4154 - in trunk/scipy: cluster cluster/tests fftpack integrate integrate/tests io io/arff io/arff/tests io/matlab io/matlab/tests io/tests lib lib/blas lib/lapack lib/lapack/tests linalg linalg/benchmarks linalg/tests ndimage ndimage/tests optimize sandbox/numexpr sparse sparse/linalg sparse/linalg/dsolve sparse/linalg/dsolve/tests sparse/linalg/dsolve/umfpack/tests sparse/linalg/eigen sparse/linalg/eigen/arpack sparse/linalg/eigen/arpack/tests sparse/linalg/eigen/lobpcg sparse/linalg/eigen/lobpcg/tests sparse/linalg/isolve sparse/linalg/isolve/tests sparse/linalg/tests sparse/sparsetools sparse/tests splinalg stats stats/models stats/models/tests stats/tests testing testing/examples weave weave/tests Message-ID: <20080420121611.9C1D439C336@new.scipy.org> Author: jarrod.millman Date: 2008-04-20 07:15:19 -0500 (Sun, 20 Apr 2008) New Revision: 4154 Modified: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/tests/test_hierarchy.py trunk/scipy/fftpack/setupscons.py trunk/scipy/integrate/ode.py trunk/scipy/integrate/tests/test_integrate.py trunk/scipy/io/__init__.py trunk/scipy/io/arff/arffread.py trunk/scipy/io/arff/tests/test_data.py trunk/scipy/io/data_store.py trunk/scipy/io/matlab/mio4.py trunk/scipy/io/matlab/tests/test_mio.py trunk/scipy/io/mmio.py trunk/scipy/io/npfile.py trunk/scipy/io/pickler.py trunk/scipy/io/tests/test_mmio.py trunk/scipy/io/tests/test_recaster.py trunk/scipy/lib/blas/scons_support.py trunk/scipy/lib/lapack/scons_support.py trunk/scipy/lib/lapack/tests/test_lapack.py trunk/scipy/lib/setupscons.py trunk/scipy/linalg/basic.py trunk/scipy/linalg/benchmarks/bench_decom.py trunk/scipy/linalg/blas.py trunk/scipy/linalg/decomp.py trunk/scipy/linalg/iterative.py trunk/scipy/linalg/matfuncs.py trunk/scipy/linalg/scons_support.py trunk/scipy/linalg/tests/test_decomp.py trunk/scipy/ndimage/_registration.py trunk/scipy/ndimage/_segmenter.py trunk/scipy/ndimage/tests/test_segment.py trunk/scipy/optimize/slsqp.py trunk/scipy/sandbox/numexpr/__init__.py trunk/scipy/sparse/base.py trunk/scipy/sparse/bsr.py trunk/scipy/sparse/compressed.py trunk/scipy/sparse/construct.py trunk/scipy/sparse/coo.py trunk/scipy/sparse/csc.py trunk/scipy/sparse/csr.py trunk/scipy/sparse/data.py trunk/scipy/sparse/dia.py trunk/scipy/sparse/dok.py trunk/scipy/sparse/info.py trunk/scipy/sparse/lil.py trunk/scipy/sparse/linalg/dsolve/linsolve.py trunk/scipy/sparse/linalg/dsolve/setupscons.py trunk/scipy/sparse/linalg/dsolve/tests/test_linsolve.py trunk/scipy/sparse/linalg/dsolve/umfpack/tests/test_umfpack.py trunk/scipy/sparse/linalg/eigen/arpack/arpack.py trunk/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py trunk/scipy/sparse/linalg/eigen/lobpcg/info.py trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py trunk/scipy/sparse/linalg/eigen/setup.py trunk/scipy/sparse/linalg/eigen/setupscons.py trunk/scipy/sparse/linalg/isolve/__init__.py trunk/scipy/sparse/linalg/isolve/iterative.py trunk/scipy/sparse/linalg/isolve/minres.py trunk/scipy/sparse/linalg/isolve/tests/test_iterative.py trunk/scipy/sparse/linalg/isolve/utils.py trunk/scipy/sparse/linalg/setup.py trunk/scipy/sparse/linalg/setupscons.py trunk/scipy/sparse/linalg/tests/test_interface.py trunk/scipy/sparse/setupscons.py trunk/scipy/sparse/sparsetools/__init__.py trunk/scipy/sparse/sparsetools/bsr.py trunk/scipy/sparse/sparsetools/coo.py trunk/scipy/sparse/sparsetools/csc.py trunk/scipy/sparse/sparsetools/csr.py trunk/scipy/sparse/sparsetools/dia.py trunk/scipy/sparse/sparsetools/setupscons.py trunk/scipy/sparse/spfuncs.py trunk/scipy/sparse/sputils.py trunk/scipy/sparse/tests/bench_sparse.py trunk/scipy/sparse/tests/test_base.py trunk/scipy/sparse/tests/test_construct.py trunk/scipy/sparse/tests/test_spfuncs.py trunk/scipy/sparse/tests/test_sputils.py trunk/scipy/splinalg/__init__.py trunk/scipy/stats/mmorestats.py trunk/scipy/stats/models/contrast.py trunk/scipy/stats/models/formula.py trunk/scipy/stats/models/tests/test_formula.py trunk/scipy/stats/mstats.py trunk/scipy/stats/stats.py trunk/scipy/stats/tests/test_mmorestats.py trunk/scipy/stats/tests/test_mstats.py trunk/scipy/testing/decorators.py trunk/scipy/testing/examples/test_foo.py trunk/scipy/testing/nosetester.py trunk/scipy/testing/nulltester.py trunk/scipy/testing/pkgtester.py trunk/scipy/testing/utils.py trunk/scipy/weave/size_check.py trunk/scipy/weave/tests/test_blitz_tools.py trunk/scipy/weave/tests/test_c_spec.py Log: ran reindent Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/cluster/hierarchy.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -106,7 +106,7 @@ The Wolfram Research, Inc. http://reference.wolfram.com/... ...mathematica/HierarchicalClustering/tutorial/... HierarchicalClustering.html. Accessed October 1, 2007. - + [3] Gower, JC and Ross, GJS. "Minimum Spanning Trees and Single Linkage Cluster Analysis." Applied Statistics. 18(1): pp. 54--64. 1969. @@ -209,7 +209,7 @@ return numpy.float64(a) else: return a - + def _copy_arrays_if_base_present(T): """ Accepts a tuple of arrays T. Copies the array T[i] if its base array @@ -219,8 +219,8 @@ """ l = [_copy_array_if_base_present(a) for a in T] return l - + def copying(): """ Displays the license for this package.""" print _copyingtxt @@ -286,7 +286,7 @@ def centroid(y): """ Z = centroid(y) - + Performs centroid/UPGMC linkage on the condensed distance matrix Z. See linkage for more information on the return structure and algorithm. @@ -297,7 +297,7 @@ Performs centroid/UPGMC linkage on the observation matrix X using Euclidean distance as the distance metric. See linkage for more - information on the return structure and algorithm. + information on the return structure and algorithm. """ return linkage(y, method='centroid', metric='euclidean') @@ -314,7 +314,7 @@ Performs median/WPGMC linkage on the observation matrix X using Euclidean distance as the distance metric. See linkage for more - information on the return structure and algorithm. + information on the return structure and algorithm. (a condensed alias for linkage) """ @@ -323,7 +323,7 @@ def ward(y): """ Z = ward(y) - + Performs Ward's linkage on the condensed distance matrix Z. See linkage for more information on the return structure and algorithm. @@ -331,13 +331,13 @@ Performs Ward's linkage on the observation matrix X using Euclidean distance as the distance metric. See linkage for more information - on the return structure and algorithm. + on the return structure and algorithm. (a condensed alias for linkage) """ return linkage(y, method='ward', metric='euclidean') - + def linkage(y, method='single', metric='euclidean'): """ Z = linkage(y, method) @@ -367,11 +367,11 @@ A distance matrix is maintained at each iteration. The d[i,j] entry corresponds to the distance between cluster i and j in the original forest. - + At each iteration, the algorithm must update the distance matrix to reflect the distance of the newly formed cluster u with the remaining clusters in the forest. - + Suppose there are |u| original observations u[0], ..., u[|u|-1] in cluster u and |v| original objects v[0], ..., v[|v|-1] in cluster v. Recall s and t are combined to form cluster @@ -380,7 +380,7 @@ The following are methods for calculating the distance between the newly formed cluster u and each v. - + * method='single' assigns dist(u,v) = MIN(dist(u[i],v[j]) for all points i in cluster u and j in cluster v. @@ -402,7 +402,7 @@ * method='weighted' assigns dist(u,v) = (dist(s,v) + dist(t,v))/2 - + where cluster u was formed with cluster s and t and v is a remaining cluster in the forest. (also called WPGMA) @@ -422,11 +422,11 @@ the Euclidean distance between the centroid of u and the centroid of a remaining cluster v in the forest. (also called UPGMC) - + * method='median' assigns dist(s,t) as above. When two clusters s and t are combined into a new cluster u, the average of centroids s and t give the new centroid u. (also called WPGMC) - + * method='ward' uses the Ward variance minimization algorithm. The new entry dist(u, v) is computed as follows, @@ -452,7 +452,7 @@ if type(y) != _array_type: raise TypeError("Argument 'y' must be a numpy array.") - + s = y.shape if len(s) == 1: is_valid_y(y, throw=True, name='y') @@ -517,7 +517,7 @@ def getId(self): """ i = nd.getId() - + Returns the id number of the node nd. For 0 <= i < n, i corresponds to original observation i. For n <= i < 2n - 1, i corresponds to non-singleton cluster formed at iteration i-n. @@ -560,24 +560,24 @@ def preOrder(self, func=(lambda x: x.id)): """ vlst = preOrder(func) - + Performs preorder traversal without recursive function calls. When a leaf node is first encountered, func is called with the leaf node as its argument, and its result is appended to the list vlst. - + For example, the statement - + ids = root.preOrder(lambda x: x.id) - + returns a list of the node ids corresponding to the leaf nodes of the tree as they appear from left to right. """ - + # Do a preorder traversal, caching the result. To avoid having to do # recursion, we'll store the previous index we've visited in a vector. n = self.count - + curNode = [None] * (2 * n) lvisited = numpy.zeros((2 * n,), dtype='bool') rvisited = numpy.zeros((2 * n,), dtype='bool') @@ -603,7 +603,7 @@ # node already, go up in the tree. else: k = k - 1 - + return preorder _cnode_bare = cnode(0) @@ -612,11 +612,11 @@ def totree(Z, rd=False): """ r = totree(Z) - + Converts a hierarchical clustering encoded in the matrix Z (by linkage) into an easy-to-use tree object. The reference r to the root cnode object is returned. - + Each cnode object has a left, right, dist, id, and count attribute. The left and right attributes point to cnode objects that were combined to generate the cluster. If @@ -638,7 +638,7 @@ """ is_valid_linkage(Z, throw=True, name='Z') - + # The number of original objects is equal to the number of rows minus # 1. n = Z.shape[0] + 1 @@ -690,7 +690,7 @@ ... = squareform(...) Converts a vector-form distance vector to a square-form distance - matrix, and vice-versa. + matrix, and vice-versa. v = squareform(X) @@ -719,7 +719,7 @@ ignored any way so they do not disrupt the squareform transformation. """ - + if type(X) is not _array_type: raise TypeError('The parameter passed must be an array.') @@ -739,7 +739,7 @@ # Check that v is of valid dimensions. if d * (d - 1) / 2 != int(s[0]): raise ValueError('Incompatible vector size. It must be a binomial coefficient n choose 2 for some integer n >= 2.') - + # Allocate memory for the distance matrix. M = numpy.zeros((d, d), 'double') @@ -766,7 +766,7 @@ # One-side of the dimensions is set here. d = s[0] - + # Create a vector. v = numpy.zeros(((d * (d - 1) / 2),), 'double') @@ -785,7 +785,7 @@ def minkowski(u, v, p): """ d = minkowski(u, v, p) - + Returns the Minkowski distance between two vectors u and v, ||u-v||_p = (\sum {|u_i - v_i|^p})^(1/p). @@ -797,7 +797,7 @@ def euclidean(u, v): """ d = euclidean(u, v) - + Computes the Euclidean distance between two n-vectors u and v, ||u-v||_2 """ q=numpy.matrix(u-v) @@ -825,7 +825,7 @@ def correlation(u, v): """ d = correlation(u, v) - + Computes the correlation distance between two n-vectors u and v, 1 - (u - n|u|_1)(v - n|v|_1)^T @@ -846,7 +846,7 @@ def hamming(u, v): """ d = hamming(u, v) - + Computes the Hamming distance between two n-vectors u and v, which is simply the proportion of disagreeing components in u and v. If u and v are boolean vectors, the hamming distance is @@ -904,7 +904,7 @@ def seuclidean(u, v, V): """ d = seuclidean(u, v, V) - + Returns the standardized Euclidean distance between two n-vectors u and v. V is a m-dimensional vector of component variances. It is usually computed among a larger collection vectors. @@ -925,7 +925,7 @@ def mahalanobis(u, v, VI): """ d = mahalanobis(u, v, VI) - + Computes the Mahalanobis distance between two n-vectors u and v, (u-v)VI(u-v)^T where VI is the inverse covariance matrix. @@ -937,7 +937,7 @@ def chebyshev(u, v): """ d = chebyshev(u, v) - + Computes the Chebyshev distance between two n-vectors u and v, \max {|u_i-v_i|}. """ @@ -946,7 +946,7 @@ def braycurtis(u, v): """ d = braycurtis(u, v) - + Computes the Bray-Curtis distance between two n-vectors u and v, \sum{|u_i-v_i|} / \sum{|u_i+v_i|}. """ @@ -1018,7 +1018,7 @@ def dice(u, v): """ d = dice(u, v) - + Computes the Dice dissimilarity between two boolean n-vectors u and v, which is @@ -1039,7 +1039,7 @@ def rogerstanimoto(u, v): """ d = rogerstanimoto(u, v) - + Computes the Rogers-Tanimoto dissimilarity between two boolean n-vectors u and v, @@ -1062,7 +1062,7 @@ def russellrao(u, v): """ d = russellrao(u, v) - + Computes the Russell-Rao dissimilarity between two boolean n-vectors u and v, (n - c_{TT}) / n where c_{ij} is the number of occurrences of u[k] == i and v[k] == j for k < n. @@ -1121,7 +1121,7 @@ def pdist(X, metric='euclidean', p=2, V=None, VI=None): """ Y = pdist(X, method='euclidean', p=2) - + Computes the distance between m original observations in n-dimensional space. Returns a condensed distance matrix Y. For each i and j (i= n correspond to non-singleton clusters. @@ -2618,7 +2618,7 @@ if show_leaf_counts: ivl.append("(" + str(int(Z[i-n, 3])) + ")") else: - ivl.append("") + ivl.append("") def _append_contraction_marks(Z, iv, i, n, contraction_marks): _append_contraction_marks_sub(Z, iv, Z[i-n, 0], n, contraction_marks) @@ -2629,8 +2629,8 @@ contraction_marks.append((iv, Z[i-n, 2])) _append_contraction_marks_sub(Z, iv, Z[i-n, 0], n, contraction_marks) _append_contraction_marks_sub(Z, iv, Z[i-n, 1], n, contraction_marks) - + def _dendrogram_calculate_info(Z, p, truncate_mode, \ colorthreshold=scipy.inf, get_leaves=True, \ orientation='top', labels=None, \ @@ -2649,7 +2649,7 @@ variable value to plot the left-most leaf node below the root node i (if orientation='top', this would be the left-most x value where the plotting of this root node i and its descendents should begin). - + ivl is a list to store the labels of the leaf nodes. The leaf_label_func is called whenever ivl != None, labels == None, and leaf_label_func != None. When ivl != None and labels != None, the @@ -2668,7 +2668,7 @@ * left is the independent variable coordinate of the center of the the U of the subtree - + * w is the amount of space used for the subtree (in independent variable units) @@ -2676,7 +2676,7 @@ * md is the max(Z[*,2]) for all nodes * below and including the target node. - + """ if n == 0: raise ValueError("Invalid singleton cluster count n.") @@ -2712,7 +2712,7 @@ elif truncate_mode in ('mlab',): pass - + # Otherwise, only truncate if we have a leaf node. # # If the truncate_mode is mlab, the linkage has been modified @@ -2900,7 +2900,7 @@ else: d[T1[i]] = T2[i] return True - + def maxdists(Z): """ MD = maxdists(Z) @@ -2910,12 +2910,12 @@ and including the node with index i. More specifically, MD[i] = Z[Q(i)-n, 2].max() where Q(i) is the set of all node indices below and including node i. - + Note that when Z[:,2] is monotonic, Z[:,2] and MD should not differ. See linkage for more information on this issue. """ is_valid_linkage(Z, throw=True, name='Z') - + n = Z.shape[0] + 1 MD = numpy.zeros((n-1,)) [Z] = _copy_arrays_if_base_present([Z]) @@ -2933,7 +2933,7 @@ """ is_valid_linkage(Z, throw=True, name='Z') is_valid_im(R, throw=True, name='R') - + n = Z.shape[0] + 1 MI = numpy.zeros((n-1,)) [Z, R] = _copy_arrays_if_base_present([Z, R]) @@ -2989,7 +2989,7 @@ is_valid_linkage(Z, throw=True, name='Z') if len(T) != Z.shape[0] + 1: raise ValueError('Mismatch: len(T)!=Z.shape[0] + 1.') - + Cl = numpy.unique(T) kk = len(Cl) L = numpy.zeros((kk,), dtype='int32') Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -368,7 +368,7 @@ Y_test1 = pdist(X, 'minkowski', 3.2) #print "minkowski", numpy.abs(Y_test1 - Y_right).max() self.failUnless(within_tol(Y_test1, Y_right, eps)) - + def test_pdist_minkowski_random_nonC(self): "Tests pdist(X, 'test_minkowski') [the non-C implementation] on random data." eps = 1e-05 @@ -388,7 +388,7 @@ Y_test1 = pdist(X, 'minkowski', 3.2) #print "minkowski-iris-3.2", numpy.abs(Y_test1 - Y_right).max() self.failUnless(within_tol(Y_test1, Y_right, eps)) - + def test_pdist_minkowski_iris_nonC(self): "Tests pdist(X, 'test_minkowski') [the non-C implementation] on iris data." eps = 1e-07 @@ -408,7 +408,7 @@ Y_test1 = pdist(X, 'minkowski', 5.8) #print "minkowski-iris-5.8", numpy.abs(Y_test1 - Y_right).max() self.failUnless(within_tol(Y_test1, Y_right, eps)) - + def test_pdist_minkowski_iris_nonC(self): "Tests pdist(X, 'test_minkowski') [the non-C implementation] on iris data." eps = 1e-07 Modified: trunk/scipy/fftpack/setupscons.py =================================================================== --- trunk/scipy/fftpack/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/fftpack/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -10,7 +10,7 @@ config.add_sconscript('SConstruct') config.add_data_dir('tests') - + return config if __name__ == '__main__': Modified: trunk/scipy/integrate/ode.py =================================================================== --- trunk/scipy/integrate/ode.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/integrate/ode.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -8,7 +8,7 @@ d y(t)[i] --------- = f(t,y(t))[i], d t - + y(t=0)[i] = y0[i], where:: @@ -20,7 +20,7 @@ A generic interface class to numeric integrators. It has the following methods:: - + integrator = ode(f,jac=None) integrator = integrator.set_integrator(name,**params) integrator = integrator.set_initial_value(y0,t0=0.0) @@ -108,22 +108,22 @@ # To wrap cvode to Python, one must write extension module by # hand. Its interface is too much 'advanced C' that using f2py # would be too complicated (or impossible). -# +# # How to define a new integrator: # =============================== -# +# # class myodeint(IntegratorBase): -# +# # runner = or None -# +# # def __init__(self,...): # required # -# +# # def reset(self,n,has_jac): # optional # # n - the size of the problem (number of equations) # # has_jac - whether user has supplied its own routine for Jacobian # -# +# # def run(self,f,jac,y0,t0,t1,f_params,jac_params): # required # # this method is called to integrate from t=t0 to t=t1 # # with initial condition y0. f and jac are user-supplied functions @@ -134,11 +134,11 @@ # if : # self.success = 0 # return t1,y1 -# +# # # In addition, one can define step() and run_relax() methods (they # # take the same arguments as run()) if the integrator can support # # these features (see IntegratorBase doc strings). -# +# # if myodeint.runner: # IntegratorBase.integrator_classes.append(myodeint) @@ -158,7 +158,7 @@ A generic interface class to numeric integrators. See also --------- +-------- odeint : an integrator with a simpler interface based on lsoda from ODEPACK quad : for finding the area under a curve @@ -533,7 +533,7 @@ rwork[5] = self.max_step rwork[6] = self.min_step self.rwork = rwork - + iwork = zeros((liw,), int32) if self.ml is not None: iwork[0] = self.ml @@ -543,7 +543,7 @@ iwork[5] = self.nsteps iwork[6] = 2 # mxhnil self.iwork = iwork - + self.call_args = [self.rtol,self.atol,1,1, self.zwork,self.rwork,self.iwork,mf] self.success = 1 Modified: trunk/scipy/integrate/tests/test_integrate.py =================================================================== --- trunk/scipy/integrate/tests/test_integrate.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/integrate/tests/test_integrate.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -35,7 +35,7 @@ Check integrate.ode """ def _do_problem(self, problem, integrator, method='adams'): - + # ode has callback arguments in different order than odeint f = lambda t, z: problem.f(z, t) jac = None Modified: trunk/scipy/io/__init__.py =================================================================== --- trunk/scipy/io/__init__.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/__init__.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -16,17 +16,17 @@ convert_objectarray fread = deprecate_with_doc(""" -scipy.io.fread is can be replaced with raw reading capabilities of NumPy -including fromfile as well as memory-mapping capabilities. +scipy.io.fread is can be replaced with raw reading capabilities of NumPy +including fromfile as well as memory-mapping capabilities. """)(fread) fwrite = deprecate_with_doc(""" scipy.io.fwrite can be replaced with raw writing capabilities of NumPy. Also, remember that files can be directly memory-mapped into NumPy -arrays which is often a better way of reading especially large files. +arrays which is often a better way of reading especially large files. Look at the tofile methods as well as save and savez for writing arrays into -easily transported files of data. +easily transported files of data. """)(fwrite) bswap = deprecate_with_doc(""" @@ -54,7 +54,7 @@ unpackbits = deprecate_with_doc(""" The functionality of scipy.io.unpackbits is now available in numpy.unpackbits The calling convention is different however as the 2-d case is no longer -specialized. +specialized. Thus, the scipy.unpackbits behavior must be simulated using numpy.unpackbits. Modified: trunk/scipy/io/arff/arffread.py =================================================================== --- trunk/scipy/io/arff/arffread.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/arff/arffread.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -12,7 +12,7 @@ __all__ = ['MetaData', 'loadarff', 'ArffError', 'ParseArffError'] -# An Arff file is basically two parts: +# An Arff file is basically two parts: # - header # - data # @@ -42,7 +42,7 @@ r_comattrval = re.compile(r"'(..+)'\s+(..+$)") # To get attributes name enclosed with '', possibly spread accross multilines r_mcomattrval = re.compile(r"'([..\n]+)'\s+(..+$)") -# To get normal attributes +# To get normal attributes r_wcomattrval = re.compile(r"(\S+)\s+(..+$)") #------------------------- @@ -61,7 +61,7 @@ # An attribute is defined as @attribute name value def parse_type(attrtype): """Given an arff attribute value (meta data), returns its type. - + Expect the value to be a name.""" uattribute = attrtype.lower().strip() if uattribute[0] == '{': @@ -83,7 +83,7 @@ def get_nominal(attribute): """If attribute is nominal, returns a list of the values""" return attribute.split(',') - + def read_data_list(ofile): """Read each line of the iterable and put it in a list.""" data = [ofile.next()] @@ -105,9 +105,9 @@ def maxnomlen(atrv): """Given a string contening a nominal type definition, returns the string len of the biggest component. - + A nominal type is defined as seomthing framed between brace ({}). - + Example: maxnomlen("{floup, bouga, fl, ratata}") returns 6 (the size of ratata, the longest nominal value).""" nomtp = get_nom_val(atrv) @@ -115,10 +115,10 @@ def get_nom_val(atrv): """Given a string contening a nominal type, returns a tuple of the possible - values. - + values. + A nominal type is defined as something framed between brace ({}). - + Example: get_nom_val("{floup, bouga, fl, ratata}") returns ("floup", "bouga", "fl", "ratata").""" r_nominal = re.compile('{(..+)}') @@ -130,7 +130,7 @@ def go_data(ofile): """Skip header. - + the first next() call of the returned iterator will be the @data line""" return itertools.dropwhile(lambda x : not r_datameta.match(x), ofile) @@ -139,18 +139,18 @@ #---------------- def tokenize_attribute(iterable, attribute): """Parse a raw string in header (eg starts by @attribute). - + Given a raw string attribute, try to get the name and type of the attribute. Constraints: - The first line must start with @attribute (case insensitive, and space like characters begore @attribute are allowed) - - Works also if the attribute is spread on multilines. + - Works also if the attribute is spread on multilines. - Works if empty lines or comments are in between - + :Parameters: attribute : str - the attribute string. - + the attribute string. + :Returns: name : str name of the attribute @@ -205,7 +205,7 @@ else: raise ValueError("Cannot parse attribute names spread over multi "\ "lines yet") - + def tokenize_single_comma(val): # XXX we match twice the same string (here and at the caller level). It is # stupid, but it is easier for now... @@ -299,7 +299,7 @@ class MetaData: """Small container to keep useful informations on a ARFF dataset. - + Knows about attributes names and types. :Example: @@ -318,7 +318,7 @@ Also maintains the list of attributes in order, i.e. doing for i in meta, where meta is an instance of MetaData, will return the different attribute names in the order they were defined. - + """ def __init__(self, rel, attr): self.name = rel @@ -343,7 +343,7 @@ msg += ", range is %s" % str(self._attributes[i][1]) msg += '\n' return msg - + def __iter__(self): return iter(self._attrnames) @@ -386,7 +386,7 @@ """ ofile = open(filename) - # Parse the header file + # Parse the header file try: rel, attr = read_header(ofile) except ValueError, e: @@ -459,9 +459,9 @@ def generator(row_iter, delim = ','): # TODO: this is where we are spending times (~80%). I think things - # could be made more efficiently: + # could be made more efficiently: # - We could for example "compile" the function, because some values - # do not change here. + # do not change here. # - The function to convert a line to dtyped values could also be # generated on the fly from a string and be executed instead of # looping. Modified: trunk/scipy/io/arff/tests/test_data.py =================================================================== --- trunk/scipy/io/arff/tests/test_data.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/arff/tests/test_data.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -11,8 +11,8 @@ test4 = os.path.join(data_path, 'test4.arff') test5 = os.path.join(data_path, 'test5.arff') -expect4_data = [(0.1, 0.2, 0.3, 0.4, 'class1'), - (-0.1, -0.2, -0.3, -0.4, 'class2'), +expect4_data = [(0.1, 0.2, 0.3, 0.4, 'class1'), + (-0.1, -0.2, -0.3, -0.4, 'class2'), (1, 2, 3, 4, 'class3')] missing = os.path.join(data_path, 'missing.arff') Modified: trunk/scipy/io/data_store.py =================================================================== --- trunk/scipy/io/data_store.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/data_store.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -15,7 +15,7 @@ 1 """ -__all__ = ['save_as_module', +__all__ = ['save_as_module', # The rest of these are all deprecated 'save', 'create_module', 'create_shelf', 'load'] Modified: trunk/scipy/io/matlab/mio4.py =================================================================== --- trunk/scipy/io/matlab/mio4.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/matlab/mio4.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -168,13 +168,13 @@ dims = res[-1,0:2] I = N.ascontiguousarray(tmp[:,0],dtype='intc') #fixes byte order also J = N.ascontiguousarray(tmp[:,1],dtype='intc') - I -= 1 # for 1-based indexing + I -= 1 # for 1-based indexing J -= 1 if res.shape[1] == 3: V = N.ascontiguousarray(tmp[:,2],dtype='float') else: V = N.ascontiguousarray(tmp[:,2],dtype='complex') - V.imag = tmp[:,3] + V.imag = tmp[:,3] if have_sparse: return scipy.sparse.coo_matrix((V,(I,J)), dims) return (dims, I, J, V) Modified: trunk/scipy/io/matlab/tests/test_mio.py =================================================================== --- trunk/scipy/io/matlab/tests/test_mio.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/matlab/tests/test_mio.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -238,5 +238,3 @@ expected = case['expected'] format = case in case_table4 and '4' or '5' yield _make_rt_check_case, name, expected, format - - Modified: trunk/scipy/io/mmio.py =================================================================== --- trunk/scipy/io/mmio.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/mmio.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -124,7 +124,7 @@ SYMMETRY_SYMMETRIC = 'symmetric' SYMMETRY_SKEW_SYMMETRIC = 'skew-symmetric' SYMMETRY_HERMITIAN = 'hermitian' - SYMMETRY_VALUES = ( SYMMETRY_GENERAL, SYMMETRY_SYMMETRIC, + SYMMETRY_VALUES = ( SYMMETRY_GENERAL, SYMMETRY_SYMMETRIC, SYMMETRY_SKEW_SYMMETRIC, SYMMETRY_HERMITIAN) @classmethod @@ -217,7 +217,7 @@ stream = bz2.BZ2File(filespec, 'r') else: stream = open(filespec, mode) - + # open for writing else: if filespec[-4:] != '.mtx': @@ -257,7 +257,7 @@ @staticmethod def _field_template(field, precision): return { - MMFile.FIELD_REAL: '%%.%ie\n' % precision, + MMFile.FIELD_REAL: '%%.%ie\n' % precision, MMFile.FIELD_INTEGER: '%i\n', MMFile.FIELD_COMPLEX: '%%.%ie %%.%ie\n' % (precision,precision) }.get(field, None) @@ -296,7 +296,7 @@ attrs = self.__class__.__slots__ public_attrs = [attr[1:] for attr in attrs] invalid_keys = set(kwargs.keys()) - set(public_attrs) - + if invalid_keys: raise ValueError, \ 'found %s invalid keyword arguments, please only use %s' % \ @@ -395,10 +395,10 @@ except: # fallback - fromfile fails for some file-like objects flat_data = fromstring(stream.read(), sep=' ') - + # TODO use iterator (e.g. xreadlines) to avoid reading # the whole file into memory - + if is_pattern: flat_data = flat_data.reshape(-1,2) I = ascontiguousarray(flat_data[:,0], dtype='intc') Modified: trunk/scipy/io/npfile.py =================================================================== --- trunk/scipy/io/npfile.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/npfile.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -225,8 +225,8 @@ npfile = N.deprecate_with_doc(""" You can achieve the same effect as using npfile, using ndarray.tofile -and numpy.fromfile. +and numpy.fromfile. -Even better you can use memory-mapped arrays and data-types to map out a +Even better you can use memory-mapped arrays and data-types to map out a file format for direct manipulation in NumPy. """)(npfile) Modified: trunk/scipy/io/pickler.py =================================================================== --- trunk/scipy/io/pickler.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/pickler.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -25,7 +25,7 @@ fid.close() @deprecate_with_doc(""" -Just use cPickle.load or numpy.load. +Just use cPickle.load or numpy.load. """) def objload(file, allglobals): """Load a previously pickled dictionary and insert into given dictionary. Modified: trunk/scipy/io/tests/test_mmio.py =================================================================== --- trunk/scipy/io/tests/test_mmio.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/tests/test_mmio.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -150,37 +150,37 @@ _skew_example = '''\ %%MatrixMarket matrix coordinate real skew-symmetric 5 5 7 - 1 1 1.0 - 2 2 10.5 - 4 2 250.5 - 3 3 1.5e-2 - 4 4 -2.8e2 - 5 5 12. - 5 4 0 + 1 1 1.0 + 2 2 10.5 + 4 2 250.5 + 3 3 1.5e-2 + 4 4 -2.8e2 + 5 5 12. + 5 4 0 ''' _symmetric_example = '''\ %%MatrixMarket matrix coordinate real symmetric 5 5 7 - 1 1 1.0 - 2 2 10.5 - 4 2 250.5 - 3 3 1.5e-2 - 4 4 -2.8e2 - 5 5 12. - 5 4 8 + 1 1 1.0 + 2 2 10.5 + 4 2 250.5 + 3 3 1.5e-2 + 4 4 -2.8e2 + 5 5 12. + 5 4 8 ''' _symmetric_pattern_example = '''\ %%MatrixMarket matrix coordinate pattern symmetric 5 5 7 - 1 1 - 2 2 - 4 2 - 3 3 - 4 4 - 5 5 - 5 4 + 1 1 + 2 2 + 4 2 + 3 3 + 4 4 + 5 5 + 5 4 ''' class TestMMIOCoordinate(TestCase): @@ -213,7 +213,7 @@ [0, 0, 0, 33.32j, 12]] b = mmread(fn).todense() assert_array_almost_equal(a,b) - + def test_read_skew(self): """read a skew-symmetric matrix""" fn = mktemp() @@ -228,7 +228,7 @@ [0, 0, 0, 0, 12]] b = mmread(fn).todense() assert_array_almost_equal(a,b) - + def test_read_symmetric(self): """read a symmetric matrix""" fn = mktemp() Modified: trunk/scipy/io/tests/test_recaster.py =================================================================== --- trunk/scipy/io/tests/test_recaster.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/io/tests/test_recaster.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -171,7 +171,6 @@ dtt = arr.dtype.type assert dtt is outp, \ 'Expected %s from %s, got %s' % (outp, inp, dtt) - + if __name__ == "__main__": nose.run(argv=['', __file__]) - Modified: trunk/scipy/lib/blas/scons_support.py =================================================================== --- trunk/scipy/lib/blas/scons_support.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/lib/blas/scons_support.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -15,7 +15,7 @@ # XXX handle skip names name = splitext(pbasename(target_name))[0] #generate_interface(name, source_name, target_name) - + f = open(target_name, 'w') f.write('python module '+name+'\n') f.write('usercode void empty_module(void) {}\n') @@ -27,4 +27,3 @@ f.close() return 0 - Modified: trunk/scipy/lib/lapack/scons_support.py =================================================================== --- trunk/scipy/lib/lapack/scons_support.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/lib/lapack/scons_support.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -15,7 +15,7 @@ # XXX handle skip names name = splitext(pbasename(target_name))[0] #generate_interface(name, source_name, target_name) - + f = open(target_name, 'w') f.write('python module '+name+'\n') f.write('usercode void empty_module(void) {}\n') @@ -27,4 +27,3 @@ f.close() return 0 - Modified: trunk/scipy/lib/lapack/tests/test_lapack.py =================================================================== --- trunk/scipy/lib/lapack/tests/test_lapack.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/lib/lapack/tests/test_lapack.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -11,7 +11,7 @@ method names. There are no subclasses of TestCase. Thus nose will pick up nothing but the final test_all_lapack generator function. This does the work of collecting the test methods and checking if they -can be run (see the isrunnable method). +can be run (see the isrunnable method). ''' import os @@ -137,4 +137,3 @@ methods += [getattr(o, n) for n in dir(o) if o.isrunnable(n) is True] for method in methods: yield (method, ) - Modified: trunk/scipy/lib/setupscons.py =================================================================== --- trunk/scipy/lib/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/lib/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -3,7 +3,7 @@ def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration - config = Configuration('lib',parent_package,top_path, + config = Configuration('lib',parent_package,top_path, setup_name = 'setupscons.py') config.add_subpackage('blas') config.add_subpackage('lapack') Modified: trunk/scipy/linalg/basic.py =================================================================== --- trunk/scipy/linalg/basic.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/basic.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -26,7 +26,7 @@ def lu_solve((lu, piv), b, trans=0, overwrite_b=0): """Solve an equation system, a x = b, given the LU factorization of a - + Parameters ---------- (lu, piv) @@ -52,7 +52,7 @@ See also -------- lu_factor : LU factorize a matrix - + """ b1 = asarray_chkfinite(b) overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__')) @@ -83,7 +83,7 @@ See also -------- cho_factor : Cholesky factorization of a matrix - + """ b1 = asarray_chkfinite(b) overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__')) @@ -114,14 +114,14 @@ Allow overwriting data in a (may enhance performance) overwrite_b : boolean Allow overwriting data in b (may enhance performance) - + Returns ------- x : array, shape (M,) or (M, N) depending on b Solution to the system a x = b Raises LinAlgError if a is singular - + """ a1, b1 = map(asarray_chkfinite,(a,b)) if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: @@ -164,8 +164,8 @@ * a01 a12 a23 a34 a45 a00 a11 a22 a33 a44 a55 - a10 a21 a32 a43 a54 * - a20 a31 a42 a53 * * + a10 a21 a32 a43 a54 * + a20 a31 a42 a53 * * Parameters ---------- @@ -184,7 +184,7 @@ ------- x : array, shape (M,) or (M, K) The solution to the system a x = b - + """ a1, b1 = map(asarray_chkfinite,(ab,b)) overwrite_b = overwrite_b or (b1 is not b and not hasattr(b,'__array__')) @@ -218,7 +218,7 @@ * * a02 a13 a24 a35 * a01 a12 a23 a34 a45 a00 a11 a22 a33 a44 a55 - + lower form: a00 a11 a22 a33 a44 a55 a10 a21 a32 a43 a54 * @@ -245,7 +245,7 @@ Cholesky factorization of a, in the same banded format as ab x : array, shape (M,) or (M, K) The solution to the system a x = b - + """ ab, b = map(asarray_chkfinite,(ab,b)) @@ -263,25 +263,25 @@ def cholesky_banded(ab, overwrite_ab=0, lower=0): """Cholesky decompose a banded Hermitian positive-definite matrix - + The matrix a is stored in ab either in lower diagonal or upper diagonal ordered form: - + ab[u + i - j, j] == a[i,j] (if upper form; i <= j) ab[ i - j, j] == a[i,j] (if lower form; i >= j) - + Example of ab (shape of a is (6,6), u=2):: - + upper form: * * a02 a13 a24 a35 * a01 a12 a23 a34 a45 a00 a11 a22 a33 a44 a55 - + lower form: a00 a11 a22 a33 a44 a55 a10 a21 a32 a43 a54 * a20 a31 a42 a53 * * - + Parameters ---------- ab : array, shape (M, u + 1) @@ -290,12 +290,12 @@ Discard data in ab (may enhance performance) lower : boolean Is the matrix in the lower form. (Default is upper form) - + Returns ------- c : array, shape (M, u+1) Cholesky factorization of a, in the same banded format as ab - + """ ab = asarray_chkfinite(ab) @@ -315,12 +315,12 @@ # matrix inversion def inv(a, overwrite_a=0): """Compute the inverse of a matrix. - + Parameters ---------- a : array-like, shape (M, M) Matrix to be inverted - + Returns ------- ainv : array-like, shape (M, M) @@ -409,7 +409,7 @@ -2 smallest singular value as below other - sum(abs(x)**ord)**(1./ord) ===== ============================ ========================== - + Returns ------- n : float @@ -420,7 +420,7 @@ For values ord < 0, the result is, strictly speaking, not a mathematical 'norm', but it may still be useful for numerical purposes. - + """ x = asarray_chkfinite(x) if ord is None: # check the default case first and handle it immediately @@ -472,7 +472,7 @@ ------- det : float or complex Determinant of a - + Notes ----- The determinant is computed via LU factorization, LAPACK routine z/dgetrf. @@ -491,9 +491,9 @@ def lstsq(a, b, cond=None, overwrite_a=0, overwrite_b=0): """Compute least-squares solution to equation :m:`a x = b` - + Compute a vector x such that the 2-norm :m:`|b - a x|` is minimised. - + Parameters ---------- a : array, shape (M, N) @@ -506,7 +506,7 @@ Discard data in a (may enhance performance) overwrite_b : boolean Discard data in b (may enhance performance) - + Returns ------- x : array, shape (N,) or (N, K) depending on shape of b @@ -519,9 +519,9 @@ Effective rank of matrix a s : array, shape (min(M,N),) Singular values of a. The condition number of a is abs(s[0]/s[-1]). - + Raises LinAlgError if computation does not converge - + """ a1, b1 = map(asarray_chkfinite,(a,b)) if len(a1.shape) != 2: @@ -562,10 +562,10 @@ def pinv(a, cond=None, rcond=None): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. - + Calculate a generalized inverse of a matrix using a least-squares solver. - + Parameters ---------- a : array, shape (M, N) @@ -574,11 +574,11 @@ Cutoff for 'small' singular values in the least-squares solver. Singular values smaller than rcond*largest_singular_value are considered zero. - + Returns ------- B : array, shape (N, M) - + Raises LinAlgError if computation does not converge Examples @@ -590,7 +590,7 @@ True >>> allclose(B, dot(B, dot(a, B))) True - + """ a = asarray_chkfinite(a) b = numpy.identity(a.shape[0], dtype=a.dtype) @@ -605,11 +605,11 @@ _array_precision = {'f': 0, 'd': 1, 'F': 0, 'D': 1} def pinv2(a, cond=None, rcond=None): """Compute the (Moore-Penrose) pseudo-inverse of a matrix. - + Calculate a generalized inverse of a matrix using its singular-value decomposition and including all 'large' singular values. - + Parameters ---------- a : array, shape (M, N) @@ -620,11 +620,11 @@ considered zero. If None or -1, suitable machine precision is used. - + Returns ------- B : array, shape (N, M) - + Raises LinAlgError if SVD computation does not converge Examples @@ -636,7 +636,7 @@ True >>> allclose(B, dot(B, dot(a, B))) True - + """ a = asarray_chkfinite(a) u, s, vh = decomp.svd(a) @@ -689,7 +689,7 @@ array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 1, 0, 0, 0]]) - + """ if M is None: M = N if type(M) == type('d'): @@ -705,7 +705,7 @@ def tril(m, k=0): """Construct a copy of a matrix with elements above the k-th diagonal zeroed. - + Parameters ---------- m : array @@ -717,7 +717,7 @@ Returns ------- A : array, shape m.shape, dtype m.dtype - + Examples -------- >>> from scipy.linalg import tril @@ -726,7 +726,7 @@ [ 4, 0, 0], [ 7, 8, 0], [10, 11, 12]]) - + """ svsp = getattr(m,'spacesaver',lambda:0)() m = asarray(m) @@ -736,7 +736,7 @@ def triu(m, k=0): """Construct a copy of a matrix with elements below the k-th diagonal zeroed. - + Parameters ---------- m : array @@ -748,7 +748,7 @@ Returns ------- A : array, shape m.shape, dtype m.dtype - + Examples -------- >>> from scipy.linalg import tril @@ -757,7 +757,7 @@ [ 4, 5, 6], [ 0, 8, 9], [ 0, 0, 12]]) - + """ svsp = getattr(m,'spacesaver',lambda:0)() m = asarray(m) @@ -767,23 +767,23 @@ def toeplitz(c,r=None): """Construct a Toeplitz matrix. - + The Toepliz matrix has constant diagonals, c as its first column, and r as its first row (if not given, r == c is assumed). - + Parameters ---------- c : array First column of the matrix r : array First row of the matrix. If None, r == c is assumed. - + Returns ------- A : array, shape (len(c), len(r)) Constructed Toeplitz matrix. dtype is the same as (c[0] + r[0]).dtype - + Examples -------- >>> from scipy.linalg import toeplitz @@ -791,11 +791,11 @@ array([[1, 4, 5, 6], [2, 1, 4, 5], [3, 2, 1, 4]]) - + See also -------- hankel : Hankel matrix - + """ isscalar = numpy.isscalar if isscalar(c) or isscalar(r): @@ -819,23 +819,23 @@ def hankel(c,r=None): """Construct a Hankel matrix. - + The Hankel matrix has constant anti-diagonals, c as its first column, and r as its last row (if not given, r == 0 os assumed). - + Parameters ---------- c : array First column of the matrix r : array Last row of the matrix. If None, r == 0 is assumed. - + Returns ------- A : array, shape (len(c), len(r)) Constructed Hankel matrix. dtype is the same as (c[0] + r[0]).dtype - + Examples -------- >>> from scipy.linalg import hankel @@ -844,11 +844,11 @@ [2, 3, 4, 7, 7], [3, 4, 7, 7, 8], [4, 7, 7, 8, 9]]) - + See also -------- toeplitz : Toeplitz matrix - + """ isscalar = numpy.isscalar if isscalar(c) or isscalar(r): @@ -889,14 +889,14 @@ ------- A : array, shape (M*P, N*Q) Kronecker product of a and b - + Examples -------- >>> from scipy import kron, array >>> kron(array([[1,2],[3,4]]), array([[1,1,1]])) array([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]]) - + """ if not a.flags['CONTIGUOUS']: a = reshape(a, a.shape) Modified: trunk/scipy/linalg/benchmarks/bench_decom.py =================================================================== --- trunk/scipy/linalg/benchmarks/bench_decom.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/benchmarks/bench_decom.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -20,16 +20,15 @@ print ' | contiguous '#'| non-contiguous ' print '----------------------------------------------' print ' size | scipy '#'| core | scipy | core ' - + for size,repeat in [(20,150),(100,7),(200,2)]: repeat *= 1 print '%5s' % size, sys.stdout.flush() - + a = random([size,size]) - + print '| %6.2f ' % measure('eigvals(a)',repeat), sys.stdout.flush() - - print ' (secs for %s calls)' % (repeat) + print ' (secs for %s calls)' % (repeat) Modified: trunk/scipy/linalg/blas.py =================================================================== --- trunk/scipy/linalg/blas.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/blas.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -29,7 +29,7 @@ """Return available BLAS function objects with names. arrays are used to determine the optimal prefix of BLAS routines. - + """ ordering = [] for i in range(len(arrays)): Modified: trunk/scipy/linalg/decomp.py =================================================================== --- trunk/scipy/linalg/decomp.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/decomp.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -101,12 +101,12 @@ """Solve an ordinary or generalized eigenvalue problem of a square matrix. Find eigenvalues w and right or left eigenvectors of a general matrix:: - + a vr[:,i] = w[i] b vr[:,i] a.H vl[:,i] = w[i].conj() b.H vl[:,i] - + where .H is the Hermitean conjugation. - + Parameters ---------- a : array, shape (M, M) @@ -119,12 +119,12 @@ Whether to calculate and return left eigenvectors right : boolean Whether to calculate and return right eigenvectors - + overwrite_a : boolean Whether to overwrite data in a (may improve performance) overwrite_b : boolean Whether to overwrite data in b (may improve performance) - + Returns ------- w : double or complex array, shape (M,) @@ -134,18 +134,18 @@ vl : double or complex array, shape (M, M) The normalized left eigenvector corresponding to the eigenvalue w[i] is the column v[:,i]. - + (if right == True) vr : double or complex array, shape (M, M) The normalized right eigenvector corresponding to the eigenvalue w[i] is the column vr[:,i]. - + Raises LinAlgError if eigenvalue computation does not converge See Also -------- eigh : eigenvalues and right eigenvectors for symmetric/Hermitian arrays - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: @@ -207,10 +207,10 @@ """Solve the eigenvalue problem for a Hermitian or real symmetric matrix. Find eigenvalues w and optionally right eigenvectors v of a:: - + a v[:,i] = w[i] v[:,i] v.H v = identity - + Parameters ---------- a : array, shape (M, M) @@ -224,24 +224,24 @@ (Default: both are calculated) overwrite_a : boolean Whether data in a is overwritten (may improve performance). - + Returns ------- w : double array, shape (M,) The eigenvalues, in ascending order, each repeated according to its multiplicity. - + (if eigvals_only == False) v : double or complex double array, shape (M, M) The normalized eigenvector corresponding to the eigenvalue w[i] is the column v[:,i]. - + Raises LinAlgError if eigenvalue computation does not converge See Also -------- eig : eigenvalues and right eigenvectors for non-symmetric arrays - + """ if eigvals_only or overwrite_a: a1 = asarray_chkfinite(a) @@ -299,10 +299,10 @@ """Solve real symmetric or complex hermetian band matrix eigenvalue problem. Find eigenvalues w and optionally right eigenvectors v of a:: - + a v[:,i] = w[i] v[:,i] v.H v = identity - + The matrix a is stored in ab either in lower diagonal or upper diagonal ordered form: @@ -315,7 +315,7 @@ * * a02 a13 a24 a35 * a01 a12 a23 a34 a45 a00 a11 a22 a33 a44 a55 - + lower form: a00 a11 a22 a33 a44 a55 a10 a21 a32 a43 a54 * @@ -349,7 +349,7 @@ max_ev : integer For select=='v', maximum number of eigenvalues expected. For other values of select, has no meaning. - + In doubt, leave this parameter untouched. Returns @@ -361,9 +361,9 @@ v : double or complex double array, shape (M, M) The normalized eigenvector corresponding to the eigenvalue w[i] is the column v[:,i]. - + Raises LinAlgError if eigenvalue computation does not converge - + """ if eigvals_only or overwrite_a_band: a1 = asarray_chkfinite(a_band) @@ -446,7 +446,7 @@ """Compute eigenvalues from an ordinary or generalized eigenvalue problem. Find eigenvalues of a general matrix:: - + a vr[:,i] = w[i] b vr[:,i] Parameters @@ -465,9 +465,9 @@ w : double or complex array, shape (M,) The eigenvalues, each repeated according to its multiplicity, but not in any specific order. - + Raises LinAlgError if eigenvalue computation does not converge - + See Also -------- eigvalsh : eigenvalues of symmetric or Hemitiean arrays @@ -481,10 +481,10 @@ """Solve the eigenvalue problem for a Hermitian or real symmetric matrix. Find eigenvalues w of a:: - + a v[:,i] = w[i] v[:,i] v.H v = identity - + Parameters ---------- a : array, shape (M, M) @@ -495,13 +495,13 @@ triangle of a. (Default: lower) overwrite_a : boolean Whether data in a is overwritten (may improve performance). - + Returns ------- w : double array, shape (M,) The eigenvalues, in ascending order, each repeated according to its multiplicity. - + Raises LinAlgError if eigenvalue computation does not converge See Also @@ -509,7 +509,7 @@ eigvals : eigenvalues of general arrays eigh : eigenvalues and right eigenvectors for symmetric/Hermitian arrays eig : eigenvalues and right eigenvectors for non-symmetric arrays - + """ return eigh(a,lower=lower,eigvals_only=1,overwrite_a=overwrite_a) @@ -518,10 +518,10 @@ """Solve real symmetric or complex hermetian band matrix eigenvalue problem. Find eigenvalues w of a:: - + a v[:,i] = w[i] v[:,i] v.H v = identity - + The matrix a is stored in ab either in lower diagonal or upper diagonal ordered form: @@ -534,7 +534,7 @@ * * a02 a13 a24 a35 * a01 a12 a23 a34 a45 a00 a11 a22 a33 a44 a55 - + lower form: a00 a11 a22 a33 a44 a55 a10 a21 a32 a43 a54 * @@ -570,14 +570,14 @@ multiplicity. Raises LinAlgError if eigenvalue computation does not converge - + See Also -------- eig_banded : eigenvalues and right eigenvectors for symmetric/Hermitian band matrices eigvals : eigenvalues of general arrays eigh : eigenvalues and right eigenvectors for symmetric/Hermitian arrays eig : eigenvalues and right eigenvectors for non-symmetric arrays - + """ return eig_banded(a_band,lower=lower,eigvals_only=1, overwrite_a_band=overwrite_a_band, select=select, @@ -585,14 +585,14 @@ def lu_factor(a, overwrite_a=0): """Compute pivoted LU decomposition of a matrix. - + The decomposition is:: A = P L U where P is a permutation matrix, L lower triangular with unit diagonal elements, and U upper triangular. - + Parameters ---------- a : array, shape (M, M) @@ -612,11 +612,11 @@ See also -------- lu_solve : solve an equation system using the LU factorization of a matrix - + Notes ----- This is a wrapper to the *GETRF routines from LAPACK. - + """ a1 = asarray(a) if len(a1.shape) != 2 or (a1.shape[0] != a1.shape[1]): @@ -632,7 +632,7 @@ def lu_solve(a_lu_pivots,b): """Solve an equation system, a x = b, given the LU factorization of a - + Parameters ---------- (lu, piv) @@ -676,7 +676,7 @@ where P is a permutation matrix, L lower triangular with unit diagonal elements, and U upper triangular. - + Parameters ---------- a : array, shape (M, N) @@ -696,18 +696,18 @@ K = min(M, N) u : array, shape (K, N) Upper triangular or trapezoidal matrix - + (If permute_l == True) pl : array, shape (M, K) Permuted L matrix. K = min(M, N) u : array, shape (K, N) Upper triangular or trapezoidal matrix - + Notes ----- This is a LU factorization routine written for Scipy. - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2: @@ -728,7 +728,7 @@ an 1d-array s of singular values (real, non-negative) such that a == U S Vh if S is an suitably shaped matrix of zeros whose main diagonal is s. - + Parameters ---------- a : array, shape (M, N) @@ -740,7 +740,7 @@ Whether to compute also U, Vh in addition to s (Default: true) overwrite_a : boolean Whether data in a is overwritten (may improve performance) - + Returns ------- U: array, shape (M,M) or (M,K) depending on full_matrices @@ -759,14 +759,14 @@ >>> U, s, Vh = linalg.svd(a) >>> U.shape, Vh.shape, s.shape ((9, 9), (6, 6), (6,)) - + >>> U, s, Vh = linalg.svd(a, full_matrices=False) >>> U.shape, Vh.shape, s.shape ((9, 6), (6, 6), (6,)) >>> S = linalg.diagsvd(s, 6, 6) >>> allclose(a, dot(U, dot(S, Vh))) True - + >>> s2 = linalg.svd(a, compute_uv=False) >>> allclose(s, s2) True @@ -775,7 +775,7 @@ -------- svdvals : return singular values of a matrix diagsvd : return the Sigma matrix, given the vector s - + """ # A hack until full_matrices == 0 support is fixed here. if full_matrices == 0: @@ -810,7 +810,7 @@ Matrix to decompose overwrite_a : boolean Whether data in a is overwritten (may improve performance) - + Returns ------- s: array, shape (K,) @@ -822,7 +822,7 @@ -------- svd : return the full singular value decomposition of a matrix diagsvd : return the Sigma matrix, given the vector s - + """ return svd(a,compute_uv=0,overwrite_a=overwrite_a) @@ -841,7 +841,7 @@ ------- S : array, shape (M, N) The S-matrix in the singular value decomposition - + """ part = diag(s) typ = part.dtype.char @@ -855,10 +855,10 @@ def cholesky(a,lower=0,overwrite_a=0): """Compute the Cholesky decomposition of a matrix. - + Returns the Cholesky decomposition, :lm:`A = L L^*` or :lm:`A = U^* U` of a Hermitian positive-definite matrix :lm:`A`. - + Parameters ---------- a : array, shape (M, M) @@ -868,14 +868,14 @@ (Default: upper-triangular) overwrite_a : boolean Whether to overwrite data in a (may improve performance) - + Returns ------- B : array, shape (M, M) Upper- or lower-triangular Cholesky factor of A - + Raises LinAlgError if decomposition fails - + Examples -------- >>> from scipy import array, linalg, dot @@ -887,7 +887,7 @@ >>> dot(L, L.T.conj()) array([[ 1.+0.j, 0.-2.j], [ 0.+2.j, 5.+0.j]]) - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: @@ -902,12 +902,12 @@ def cho_factor(a, lower=0, overwrite_a=0): """Compute the Cholesky decomposition of a matrix, to use in cho_solve - + Returns the Cholesky decomposition, :lm:`A = L L^*` or :lm:`A = U^* U` of a Hermitian positive-definite matrix :lm:`A`. The return value can be directly used as the first parameter to cho_solve. - + Parameters ---------- a : array, shape (M, M) @@ -917,16 +917,16 @@ (Default: upper-triangular) overwrite_a : boolean Whether to overwrite data in a (may improve performance) - + Returns ------- c : array, shape (M, M) Upper- or lower-triangular Cholesky factor of A lower : array, shape (M, M) Flag indicating whether the factor is lower or upper triangular - + Raises LinAlgError if decomposition fails - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]: @@ -955,7 +955,7 @@ The return value from cho_factor can be used. b : array Right-hand side of the equation system - + First input is a tuple (LorU, lower) which is the output to cho_factor. Second input is the right-hand side. @@ -963,7 +963,7 @@ ------- x : array Solution to the equation system - + """ c, lower = clow c = asarray_chkfinite(c) @@ -1000,7 +1000,7 @@ mode : {'qr', 'r'} Determines what information is to be returned: either both Q and R or only R. - + Returns ------- (if mode == 'qr') @@ -1029,11 +1029,11 @@ >>> r2 = linalg.qr(a, mode='r') >>> allclose(r, r2) - + >>> q3, r3 = linalg.qr(a, econ=True) >>> q3.shape, r3.shape ((9, 6), (6, 6)) - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2: @@ -1108,7 +1108,7 @@ lwork : integer Work array size, lwork >= a.shape[1]. If None or -1, an optimal size is computed. - + Returns ------- Q : double or complex array, shape (M, M) @@ -1116,7 +1116,7 @@ Size K = min(M, N) Raises LinAlgError if decomposition fails - + """ a1 = asarray_chkfinite(a) if len(a1.shape) != 2: @@ -1163,15 +1163,15 @@ Work array size, lwork >= a.shape[1]. If None or -1, an optimal size is computed. econ : boolean - + Returns ------- R : double array, shape (M, N) or (K, N) for econ==True Size K = min(M, N) Q : double or complex array, shape (M, M) or (M, K) for econ==True - + Raises LinAlgError if decomposition fails - + """ # TODO: implement support for non-square and complex arrays a1 = asarray_chkfinite(a) @@ -1211,16 +1211,16 @@ def schur(a,output='real',lwork=None,overwrite_a=0): """Compute Schur decomposition of a matrix. - + The Schur decomposition is - + A = Z T Z^H - + where Z is unitary and T is either upper-triangular, or for real Schur decomposition (output='real'), quasi-upper triangular. In the quasi-triangular form, 2x2 blocks describing complex-valued eigenvalue pairs may extrude from the diagonal. - + Parameters ---------- a : array, shape (M, M) @@ -1243,7 +1243,7 @@ See also -------- rsf2csf : Convert real Schur form to complex Schur form - + """ if not output in ['real','complex','r','c']: raise ValueError, "argument must be 'real', or 'complex'" @@ -1305,28 +1305,28 @@ def rsf2csf(T, Z): """Convert real Schur form to complex Schur form. - + Convert a quasi-diagonal real-valued Schur form to the upper triangular complex-valued Schur form. - + Parameters ---------- T : array, shape (M, M) Real Schur form of the original matrix Z : array, shape (M, M) Schur transformation matrix - + Returns ------- T : array, shape (M, M) Complex Schur form of the original matrix Z : array, shape (M, M) Schur transformation matrix corresponding to the complex form - + See also -------- schur : Schur decompose a matrix - + """ Z,T = map(asarray_chkfinite, (Z,T)) if len(Z.shape) !=2 or Z.shape[0] != Z.shape[1]: @@ -1366,21 +1366,21 @@ def orth(A): """Construct an orthonormal basis for the range of A using SVD - + Parameters ---------- A : array, shape (M, N) - + Returns ------- Q : array, shape (M, K) Orthonormal basis for the range of A. K = effective rank of A, as determined by automatic cutoff - + See also -------- svd : Singular value decomposition of a matrix - + """ u,s,vh = svd(A) M,N = A.shape @@ -1391,14 +1391,14 @@ def hessenberg(a,calc_q=0,overwrite_a=0): """Compute Hessenberg form of a matrix. - + The Hessenberg decomposition is - + A = Q H Q^H - + where Q is unitary/orthogonal and H has only zero elements below the first subdiagonal. - + Parameters ---------- a : array, shape (M,M) Modified: trunk/scipy/linalg/iterative.py =================================================================== --- trunk/scipy/linalg/iterative.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/iterative.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -7,7 +7,7 @@ for name in __all__: oldfn = getattr(isolve, name) - oldname='scipy.linalg.' + name + oldname='scipy.linalg.' + name newname='scipy.sparse.linalg.' + name newfn = deprecate(oldfn, oldname=oldname, newname=newname) exec(name + ' = newfn') Modified: trunk/scipy/linalg/matfuncs.py =================================================================== --- trunk/scipy/linalg/matfuncs.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/matfuncs.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -104,7 +104,7 @@ Matrix to be exponentiated q : integer Order of the Taylor series - + Returns ------- expA : array, shape(M,M) @@ -154,7 +154,7 @@ Parameters ---------- A : array, shape(M,M) - + Returns ------- cosA : array, shape(M,M) @@ -275,10 +275,10 @@ def funm(A,func,disp=1): """Evaluate a matrix function specified by a callable. - + Returns the value of matrix-valued function f at A. The function f is an extension of the scalar-valued function func to matrices. - + Parameters ---------- A : array, shape(M,M) @@ -350,9 +350,9 @@ def logm(A,disp=1): """Compute matrix logarithm. - + The matrix logarithm is the inverse of expm: expm(logm(A)) == A - + Parameters ---------- A : array, shape(M,M) @@ -401,9 +401,9 @@ def signm(a,disp=1): """Matrix sign function. - + Extension of the scalar sign(x) to matrices. - + Parameters ---------- A : array, shape(M,M) @@ -411,7 +411,7 @@ disp : boolean Print warning if error in the result is estimated large instead of returning estimated error. (Default: True) - + Returns ------- sgnA : array, shape(M,M) @@ -420,7 +420,7 @@ (if disp == False) errest : float 1-norm of the estimated error, ||err||_1 / ||A||_1 - + Examples -------- >>> from scipy.linalg import signm, eigvals @@ -429,7 +429,7 @@ array([ 4.12488542+0.j, -0.76155718+0.j, 0.63667176+0.j]) >>> eigvals(signm(a)) array([-1.+0.j, 1.+0.j, 1.+0.j]) - + """ def rounded_sign(x): rx = real(x) @@ -478,7 +478,7 @@ def sqrtm(A,disp=1): """Matrix square root. - + Parameters ---------- A : array, shape(M,M) @@ -486,7 +486,7 @@ disp : boolean Print warning if error in the result is estimated large instead of returning estimated error. (Default: True) - + Returns ------- sgnA : array, shape(M,M) @@ -499,7 +499,7 @@ Notes ----- Uses algorithm by Nicholas J. Higham - + """ A = asarray(A) if len(A.shape)!=2: Modified: trunk/scipy/linalg/scons_support.py =================================================================== --- trunk/scipy/linalg/scons_support.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/scons_support.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -28,7 +28,7 @@ # XXX handle skip names name = splitext(pbasename(target_name))[0] generate_interface(name, source_name, target_name) - + f = open(target_name, 'w') f.write('python module '+name+'\n') f.write('usercode void empty_module(void) {}\n') @@ -40,4 +40,3 @@ f.close() return 0 - Modified: trunk/scipy/linalg/tests/test_decomp.py =================================================================== --- trunk/scipy/linalg/tests/test_decomp.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/linalg/tests/test_decomp.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -11,7 +11,7 @@ Run tests if scipy is installed: python -c 'import scipy;scipy.linalg.test()' Run tests if linalg is not installed: - python tests/test_decomp.py + python tests/test_decomp.py """ import sys Modified: trunk/scipy/ndimage/_registration.py =================================================================== --- trunk/scipy/ndimage/_registration.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/ndimage/_registration.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -30,951 +30,951 @@ # def resize_image(imageG, imageF_mat): - """ - zoom_image = resize_image(source_image, reference_image[mat]) + """ + zoom_image = resize_image(source_image, reference_image[mat]) - Fractional resample source_image to reference_imagesize. The - resample is implemented with 3D cubic spline. The reference - image [mat] is the 4x4 voxel-to-physical conversion matrix. - - Parameters - ---------- + Fractional resample source_image to reference_imagesize. The + resample is implemented with 3D cubic spline. The reference + image [mat] is the 4x4 voxel-to-physical conversion matrix. + + Parameters + ---------- - imageG : {dictionary} - imageG is the source image to be resized. it is a dictionary with - the data as an ndarray in the ['data'] component. + imageG : {dictionary} + imageG is the source image to be resized. it is a dictionary with + the data as an ndarray in the ['data'] component. - reference_image[mat] : {ndarray} - refernce_image is the image whose sampling dimensions the source - image is to be remapped to. [mat] refers to the component - of the image dictionary, reference_image['mat'] that is the - sampling dimensions. + reference_image[mat] : {ndarray} + refernce_image is the image whose sampling dimensions the source + image is to be remapped to. [mat] refers to the component + of the image dictionary, reference_image['mat'] that is the + sampling dimensions. - Returns - ------- - zoom_image : {dictionary} + Returns + ------- + zoom_image : {dictionary} - Examples - -------- + Examples + -------- - >>> import _registration as reg - >>> measures, imageF_anat, fmri_series = reg.demo_MRI_coregistration() + >>> import _registration as reg + >>> measures, imageF_anat, fmri_series = reg.demo_MRI_coregistration() - >>> resampled_fmri = reg.resize_image(fmri_series[10], imageF_anat['mat']) + >>> resampled_fmri = reg.resize_image(fmri_series[10], imageF_anat['mat']) - image 10 in the fmri_series is resampled to imageF_anat coordinates + image 10 in the fmri_series is resampled to imageF_anat coordinates - """ + """ - Z = NP.zeros(3, dtype=NP.float64); - # get the zoom - Z[0] = imageG['mat'][0][0] / imageF_mat[0][0] - Z[1] = imageG['mat'][1][1] / imageF_mat[1][1] - Z[2] = imageG['mat'][2][2] / imageF_mat[2][2] + Z = NP.zeros(3, dtype=NP.float64); + # get the zoom + Z[0] = imageG['mat'][0][0] / imageF_mat[0][0] + Z[1] = imageG['mat'][1][1] / imageF_mat[1][1] + Z[2] = imageG['mat'][2][2] / imageF_mat[2][2] - # new volume dimensions (rounded) - D = NP.zeros(3, dtype=NP.int32); - D[0] = int(float(imageG['dim'][0])*Z[0]+0.5) - D[1] = int(float(imageG['dim'][1])*Z[1]+0.5) - D[2] = int(float(imageG['dim'][2])*Z[2]+0.5) + # new volume dimensions (rounded) + D = NP.zeros(3, dtype=NP.int32); + D[0] = int(float(imageG['dim'][0])*Z[0]+0.5) + D[1] = int(float(imageG['dim'][1])*Z[1]+0.5) + D[2] = int(float(imageG['dim'][2])*Z[2]+0.5) - M = NP.eye(4, dtype=NP.float64); - # for the test data, set the xyz voxel sizes for fMRI volume - M[0][0] = imageG['mat'][0][0]/Z[0] - M[1][1] = imageG['mat'][1][1]/Z[1] - M[2][2] = imageG['mat'][2][2]/Z[2] + M = NP.eye(4, dtype=NP.float64); + # for the test data, set the xyz voxel sizes for fMRI volume + M[0][0] = imageG['mat'][0][0]/Z[0] + M[1][1] = imageG['mat'][1][1]/Z[1] + M[2][2] = imageG['mat'][2][2]/Z[2] - image = NP.zeros(D[2]*D[1]*D[0], dtype=NP.uint8).reshape(D[2], D[0], D[1]) - mode = 2 - scale = 0 - R.register_volume_resample(imageG['data'], image, Z, scale, mode) - F = NP.zeros(3, dtype=NP.float64); - zoom_image = {'data' : image, 'mat' : M, 'dim' : D, 'fwhm' : F} + image = NP.zeros(D[2]*D[1]*D[0], dtype=NP.uint8).reshape(D[2], D[0], D[1]) + mode = 2 + scale = 0 + R.register_volume_resample(imageG['data'], image, Z, scale, mode) + F = NP.zeros(3, dtype=NP.float64); + zoom_image = {'data' : image, 'mat' : M, 'dim' : D, 'fwhm' : F} - return zoom_image + return zoom_image def remap_image(image, parm_vector, resample='linear'): - """ - remaped_image = remap_image(image, parm_vector, resample='linear') + """ + remaped_image = remap_image(image, parm_vector, resample='linear') - rotates and translates image using the 3 angles and 3 translations in the 6-dim - parm_vector. The mapping is stored in the 4x4 M_inverse matrix from the get_inverse_mapping - method. + rotates and translates image using the 3 angles and 3 translations in the 6-dim + parm_vector. The mapping is stored in the 4x4 M_inverse matrix from the get_inverse_mapping + method. - Parameters - ---------- - image : {dictionary} - image is the source image to be remapped. it is a dictionary with - the data as an ndarray in the ['data'] component. + Parameters + ---------- + image : {dictionary} + image is the source image to be remapped. it is a dictionary with + the data as an ndarray in the ['data'] component. - parm_vector : {ndarray} - parm_vector is the 6-dimensional vector (3 angles, 3 translations) - generated from the registration. + parm_vector : {ndarray} + parm_vector is the 6-dimensional vector (3 angles, 3 translations) + generated from the registration. - resample : {'linear', 'cubic'}, optional + resample : {'linear', 'cubic'}, optional - Returns - ------- - remaped_image : {dictionary} + Returns + ------- + remaped_image : {dictionary} - Examples - -------- - image = fmri_series[i] - x[0:6] = measures[i]['align_rotate'][0:6] - # overwrite the fMRI volume with the aligned volume - fmri_series[i] = remap_image(image, x, resample='cubic') + Examples + -------- + image = fmri_series[i] + x[0:6] = measures[i]['align_rotate'][0:6] + # overwrite the fMRI volume with the aligned volume + fmri_series[i] = remap_image(image, x, resample='cubic') - """ + """ - # - # remap imageG to coordinates of imageF (creates imageG') - # use the 6 dim parm_vector (3 angles, 3 translations) to remap - # - M_inverse = get_inverse_mappings(parm_vector) - (layers, rows, cols) = image['data'].shape - # allocate the zero image - remaped_image = NP.zeros(layers*rows*cols, dtype=NP.uint8).reshape(layers, rows, cols) - remaped_image = {'data' : remaped_image, 'mat' : image['mat'], - 'dim' : image['dim'], 'fwhm' : image['fwhm']} - imdata = build_structs() + # + # remap imageG to coordinates of imageF (creates imageG') + # use the 6 dim parm_vector (3 angles, 3 translations) to remap + # + M_inverse = get_inverse_mappings(parm_vector) + (layers, rows, cols) = image['data'].shape + # allocate the zero image + remaped_image = NP.zeros(layers*rows*cols, dtype=NP.uint8).reshape(layers, rows, cols) + remaped_image = {'data' : remaped_image, 'mat' : image['mat'], + 'dim' : image['dim'], 'fwhm' : image['fwhm']} + imdata = build_structs() - if resample == 'linear': - # trilinear interpolation mapping. - R.register_linear_resample(image['data'], remaped_image['data'], M_inverse, imdata['step']) - elif resample == 'cubic': - # tricubic convolve interpolation mapping. - R.register_cubic_resample(image['data'], remaped_image['data'], M_inverse, imdata['step']) + if resample == 'linear': + # trilinear interpolation mapping. + R.register_linear_resample(image['data'], remaped_image['data'], M_inverse, imdata['step']) + elif resample == 'cubic': + # tricubic convolve interpolation mapping. + R.register_cubic_resample(image['data'], remaped_image['data'], M_inverse, imdata['step']) - return remaped_image + return remaped_image def get_inverse_mappings(parm_vector): - """ - M_inverse = get_inverse_mappings(parm_vector) + """ + M_inverse = get_inverse_mappings(parm_vector) - takes the 6-dimensional rotation/translation vector and builds the inverse - 4x4 mapping matrix M_inverse that will map imageG to imageF orientation + takes the 6-dimensional rotation/translation vector and builds the inverse + 4x4 mapping matrix M_inverse that will map imageG to imageF orientation - Parameters - ---------- - parm_vector : {nd_array} + Parameters + ---------- + parm_vector : {nd_array} - Returns - ------- - M_inverse : {nd_array} + Returns + ------- + M_inverse : {nd_array} - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> array = NP.zeros(6, dtype=float) - >>> M = reg.get_inverse_mappings(array) - >>> M + >>> import numpy as NP + >>> import _registration as reg + >>> array = NP.zeros(6, dtype=float) + >>> M = reg.get_inverse_mappings(array) + >>> M - array([ - [ 1., 0., 0., 0.], - [ 0., 1., 0., 0.], - [ 0., 0., 1., 0.], - [ 0., 0., 0., 1.]]) + array([ + [ 1., 0., 0., 0.], + [ 0., 1., 0., 0.], + [ 0., 0., 1., 0.], + [ 0., 0., 0., 1.]]) - """ - # get the inverse mapping to rotate the G matrix to F space following registration - imdata = build_structs() - # inverse angles and translations - imdata['parms'][0] = -parm_vector[0] - imdata['parms'][1] = -parm_vector[1] - imdata['parms'][2] = -parm_vector[2] - imdata['parms'][3] = -parm_vector[3] - imdata['parms'][4] = -parm_vector[4] - imdata['parms'][5] = -parm_vector[5] - M_inverse = build_rotate_matrix(imdata['parms']) - return M_inverse + """ + # get the inverse mapping to rotate the G matrix to F space following registration + imdata = build_structs() + # inverse angles and translations + imdata['parms'][0] = -parm_vector[0] + imdata['parms'][1] = -parm_vector[1] + imdata['parms'][2] = -parm_vector[2] + imdata['parms'][3] = -parm_vector[3] + imdata['parms'][4] = -parm_vector[4] + imdata['parms'][5] = -parm_vector[5] + M_inverse = build_rotate_matrix(imdata['parms']) + return M_inverse def python_coreg(image1, image2, imdata, ftype=1, smimage=0, lite=0, smhist=0, - method='nmi', opt_method='powell'): - """ - parm_vector = python_coreg(image1, image2, imdata, ftype=1, smimage=0, lite=0, - smhist=0, method='nmi', opt_method='powell'): + method='nmi', opt_method='powell'): + """ + parm_vector = python_coreg(image1, image2, imdata, ftype=1, smimage=0, lite=0, + smhist=0, method='nmi', opt_method='powell'): - takes two images and the image data descriptor (imdata) and determines the optimal - alignment of the two images (measured by mutual information or cross correlation) - using optimization search of 3 angle and 3 translation parameters. The optimization - uses either the Powell or Conjugate Gradient methods in the scipy optimization - package. The optimal parameter is returned. + takes two images and the image data descriptor (imdata) and determines the optimal + alignment of the two images (measured by mutual information or cross correlation) + using optimization search of 3 angle and 3 translation parameters. The optimization + uses either the Powell or Conjugate Gradient methods in the scipy optimization + package. The optimal parameter is returned. - Parameters - ---------- - image1 : {dictionary} - image1 is the source image to be remapped during the registration. - it is a dictionary with the data as an ndarray in the ['data'] component. - image2 : {dictionary} - image2 is the reference image that image1 gets mapped to. - imdata : {dictionary} - image sampling and optimization information. - ftype : {0, 1}, optional - flag for type of low pass filter. 0 is Gauss-Spline - 1 is pure Gauss. Sigma determined from volume sampling info. - smimage : {0, 1}, optional - flag for volume 3D low pass filtering of image 2. - 0 for no filter, 1 for do filter. - lite : {0, 1}, optional - lite of 1 is to jitter both images during resampling. 0 - is to not jitter. jittering is for non-aliased volumes. - smhist: {0, 1}, optional - flag for joint histogram low pass filtering. 0 for no filter, - 1 for do filter. - method: {'nmi', 'mi', 'ncc', 'ecc'}, optional - flag for type of registration metric. nmi is normalized mutual - information; mi is mutual information; ecc is entropy cross - correlation; ncc is normalized cross correlation. - opt_method: {'powell', 'hybrid'}, optional - registration is two pass. Pass 1 is low res to get close to alignment - and pass 2 starts at the pass 1 optimal alignment. In powell pass 1 and - 2 are powell, in hybrid pass 2 is conjugate gradient. + Parameters + ---------- + image1 : {dictionary} + image1 is the source image to be remapped during the registration. + it is a dictionary with the data as an ndarray in the ['data'] component. + image2 : {dictionary} + image2 is the reference image that image1 gets mapped to. + imdata : {dictionary} + image sampling and optimization information. + ftype : {0, 1}, optional + flag for type of low pass filter. 0 is Gauss-Spline + 1 is pure Gauss. Sigma determined from volume sampling info. + smimage : {0, 1}, optional + flag for volume 3D low pass filtering of image 2. + 0 for no filter, 1 for do filter. + lite : {0, 1}, optional + lite of 1 is to jitter both images during resampling. 0 + is to not jitter. jittering is for non-aliased volumes. + smhist: {0, 1}, optional + flag for joint histogram low pass filtering. 0 for no filter, + 1 for do filter. + method: {'nmi', 'mi', 'ncc', 'ecc'}, optional + flag for type of registration metric. nmi is normalized mutual + information; mi is mutual information; ecc is entropy cross + correlation; ncc is normalized cross correlation. + opt_method: {'powell', 'hybrid'}, optional + registration is two pass. Pass 1 is low res to get close to alignment + and pass 2 starts at the pass 1 optimal alignment. In powell pass 1 and + 2 are powell, in hybrid pass 2 is conjugate gradient. - Returns - ------- - parm_vector : {nd_array} - this is the optimal alignment (6-dim) array with 3 angles and - 3 translations. + Returns + ------- + parm_vector : {nd_array} + this is the optimal alignment (6-dim) array with 3 angles and + 3 translations. - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg + >>> import numpy as NP + >>> import _registration as reg - >>> image1, image2, imdata = reg.demo_MRI_volume_align() - >>> parm_vector = python_coreg(image1, image2, imdata) + >>> image1, image2, imdata = reg.demo_MRI_volume_align() + >>> parm_vector = python_coreg(image1, image2, imdata) - """ - start = time.time() - # smooth of the images - if smimage: - image_F_xyz2 = filter_image_3D(image2['data'], image2['fwhm'], ftype) - image2['data'] = image_F_xyz2 - parm_vector = multires_registration(image1, image2, imdata, lite, smhist, method, opt_method) - stop = time.time() - print 'Total Optimizer Time is ', (stop-start) - return parm_vector + """ + start = time.time() + # smooth of the images + if smimage: + image_F_xyz2 = filter_image_3D(image2['data'], image2['fwhm'], ftype) + image2['data'] = image_F_xyz2 + parm_vector = multires_registration(image1, image2, imdata, lite, smhist, method, opt_method) + stop = time.time() + print 'Total Optimizer Time is ', (stop-start) + return parm_vector def multires_registration(image1, image2, imdata, lite, smhist, method, opt_method): - """ - x = multires_registration(image1, image2, imdata, lite, smhist, method, opt_method) + """ + x = multires_registration(image1, image2, imdata, lite, smhist, method, opt_method) - to be called by python_coreg() which optionally does 3D image filtering and - provies timing for registration. + to be called by python_coreg() which optionally does 3D image filtering and + provies timing for registration. - Parameters - ---------- + Parameters + ---------- - image1 : {dictionary} - image1 is the source image to be remapped during the registration. - it is a dictionary with the data as an ndarray in the ['data'] component. - image2 : {dictionary} - image2 is the reference image that image1 gets mapped to. - imdata : {dictionary} - image sampling and optimization information. - lite : {integer} - lite of 1 is to jitter both images during resampling. 0 - is to not jitter. jittering is for non-aliased volumes. - smhist: {integer} - flag for joint histogram low pass filtering. 0 for no filter, - 1 for do filter. - method: {'nmi', 'mi', 'ncc', 'ecc'} - flag for type of registration metric. nmi is normalized mutual - information; mi is mutual information; ecc is entropy cross - correlation; ncc is normalized cross correlation. - opt_method: {'powell', 'hybrid'} - registration is two pass. Pass 1 is low res to get close to alignment - and pass 2 starts at the pass 1 optimal alignment. In powell pass 1 and - 2 are powell, in hybrid pass 2 is conjugate gradient. + image1 : {dictionary} + image1 is the source image to be remapped during the registration. + it is a dictionary with the data as an ndarray in the ['data'] component. + image2 : {dictionary} + image2 is the reference image that image1 gets mapped to. + imdata : {dictionary} + image sampling and optimization information. + lite : {integer} + lite of 1 is to jitter both images during resampling. 0 + is to not jitter. jittering is for non-aliased volumes. + smhist: {integer} + flag for joint histogram low pass filtering. 0 for no filter, + 1 for do filter. + method: {'nmi', 'mi', 'ncc', 'ecc'} + flag for type of registration metric. nmi is normalized mutual + information; mi is mutual information; ecc is entropy cross + correlation; ncc is normalized cross correlation. + opt_method: {'powell', 'hybrid'} + registration is two pass. Pass 1 is low res to get close to alignment + and pass 2 starts at the pass 1 optimal alignment. In powell pass 1 and + 2 are powell, in hybrid pass 2 is conjugate gradient. - Returns - ------- - x : {nd_array} - this is the optimal alignment (6-dim) array with 3 angles and - 3 translations. + Returns + ------- + x : {nd_array} + this is the optimal alignment (6-dim) array with 3 angles and + 3 translations. - Examples - -------- + Examples + -------- - (calling this from python_coreg which optionally filters image2) - >>> import numpy as NP - >>> import _registration as reg - >>> image1, image2, imdata = reg.demo_MRI_volume_align() - >>> parm_vector = python_coreg(image1, image2, imdata) + (calling this from python_coreg which optionally filters image2) + >>> import numpy as NP + >>> import _registration as reg + >>> image1, image2, imdata = reg.demo_MRI_volume_align() + >>> parm_vector = python_coreg(image1, image2, imdata) - """ - ret_histo=0 - # zero out the start parameter; but this may be set to large values - # if the head is out of range and well off the optimal alignment skirt - imdata['parms'][0:5] = 0.0 - # make the step a scalar to can put in a multi-res loop - loop = range(imdata['sample'].size) - x = imdata['parms'] - for i in loop: - step = imdata['sample'][i] - imdata['step'][:] = step - optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, - method, ret_histo) - p_args = (optfunc_args,) - if opt_method=='powell': - print 'POWELL multi-res registration step size ', step - print 'vector ', x - x = OPT.fmin_powell(optimize_function, x, args=p_args, - callback=callback_powell) - elif opt_method=='cg': - print 'CG multi-res registration step size ', step - print 'vector ', x - x = OPT.fmin_cg(optimize_function, x, args=p_args, callback=callback_cg) - elif opt_method=='hybrid': - if i==0: - print 'Hybrid POWELL multi-res registration step size ', step - print 'vector ', x - lite = 0 - optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, - method, ret_histo) - p_args = (optfunc_args,) - x = OPT.fmin_powell(optimize_function, x, args=p_args, callback=callback_powell) - elif i==1: - print 'Hybrid CG multi-res registration step size ', step - print 'vector ', x - lite = 1 - optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, - smhist, method, ret_histo) - p_args = (optfunc_args,) - x = OPT.fmin_cg(optimize_function, x, args=p_args, callback=callback_cg) + """ + ret_histo=0 + # zero out the start parameter; but this may be set to large values + # if the head is out of range and well off the optimal alignment skirt + imdata['parms'][0:5] = 0.0 + # make the step a scalar to can put in a multi-res loop + loop = range(imdata['sample'].size) + x = imdata['parms'] + for i in loop: + step = imdata['sample'][i] + imdata['step'][:] = step + optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, + method, ret_histo) + p_args = (optfunc_args,) + if opt_method=='powell': + print 'POWELL multi-res registration step size ', step + print 'vector ', x + x = OPT.fmin_powell(optimize_function, x, args=p_args, + callback=callback_powell) + elif opt_method=='cg': + print 'CG multi-res registration step size ', step + print 'vector ', x + x = OPT.fmin_cg(optimize_function, x, args=p_args, callback=callback_cg) + elif opt_method=='hybrid': + if i==0: + print 'Hybrid POWELL multi-res registration step size ', step + print 'vector ', x + lite = 0 + optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, + method, ret_histo) + p_args = (optfunc_args,) + x = OPT.fmin_powell(optimize_function, x, args=p_args, callback=callback_powell) + elif i==1: + print 'Hybrid CG multi-res registration step size ', step + print 'vector ', x + lite = 1 + optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, + smhist, method, ret_histo) + p_args = (optfunc_args,) + x = OPT.fmin_cg(optimize_function, x, args=p_args, callback=callback_cg) - return x + return x def callback_powell(x): - """ - called by optimize.powell only. prints current parameter vector. - """ - print 'Parameter Vector from Powell: - ' - print x - return + """ + called by optimize.powell only. prints current parameter vector. + """ + print 'Parameter Vector from Powell: - ' + print x + return def callback_cg(x): - """ - called by optimize.cg only. prints current parameter vector. - """ - print 'Parameter Vector from Conjugate Gradient: - ' - print x - return + """ + called by optimize.cg only. prints current parameter vector. + """ + print 'Parameter Vector from Conjugate Gradient: - ' + print x + return def smooth_kernel(fwhm, x, ktype=1): - """ - kernel = smooth_kernel(fwhm, x, ktype=1) + """ + kernel = smooth_kernel(fwhm, x, ktype=1) - smooth_kernel creates filter kernel based on image sampling parameters. - provide domain of kernel and sampling parameters. + smooth_kernel creates filter kernel based on image sampling parameters. + provide domain of kernel and sampling parameters. - Parameters - ---------- - fwhm : {int} - used for kernel width - x : {nd_array} - domain of kernel - ktype: {1, 2}, optional - kernel type. 1 is Gauss convoled with spline, 2 is Gauss + Parameters + ---------- + fwhm : {int} + used for kernel width + x : {nd_array} + domain of kernel + ktype: {1, 2}, optional + kernel type. 1 is Gauss convoled with spline, 2 is Gauss - Returns - ------- - kernel : {nd_array} + Returns + ------- + kernel : {nd_array} - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> fwhm = 3 - >>> ftype = 2 - >>> p = NP.ceil(2*fwhm).astype(int) - >>> x = NP.array(range(-p, p+1)) - >>> kernel = reg.smooth_kernel(fwhm, x, ktype=ftype) - >>> kernel + >>> import numpy as NP + >>> import _registration as reg + >>> fwhm = 3 + >>> ftype = 2 + >>> p = NP.ceil(2*fwhm).astype(int) + >>> x = NP.array(range(-p, p+1)) + >>> kernel = reg.smooth_kernel(fwhm, x, ktype=ftype) + >>> kernel - array([ - 4.77853772e-06, 1.41575516e-04, 2.26516955e-03, - 1.95718875e-02, 9.13238336e-02, 2.30120330e-01, - 3.13144850e-01, 2.30120330e-01, 9.13238336e-02, - 1.95718875e-02, 2.26516955e-03, 1.41575516e-04, - 4.77853772e-06]) + array([ + 4.77853772e-06, 1.41575516e-04, 2.26516955e-03, + 1.95718875e-02, 9.13238336e-02, 2.30120330e-01, + 3.13144850e-01, 2.30120330e-01, 9.13238336e-02, + 1.95718875e-02, 2.26516955e-03, 1.41575516e-04, + 4.77853772e-06]) - """ - eps = 0.00001 - s = NP.square((fwhm/math.sqrt(8.0*math.log(2.0)))) + eps - if ktype==1: - # from SPM: Gauss kernel convolved with 1st degree B spline - w1 = 0.5 * math.sqrt(2.0/s) - w2 = -0.5 / s - w3 = math.sqrt((s*math.pi) /2.0) - kernel = 0.5*(SP.erf(w1*(x+1))*(x+1) + SP.erf(w1*(x-1))*(x-1) - 2.0*SP.erf(w1*(x))*(x) + - w3*(NP.exp(w2*NP.square(x+1))) + NP.exp(w2*(NP.square(x-1))) - 2.0*NP.exp(w2*NP.square(x))) - kernel[kernel<0] = 0 - kernel = kernel / kernel.sum() - else: - # Gauss kernel - kernel = (1.0/math.sqrt(2.0*math.pi*s)) * NP.exp(-NP.square(x)/(2.0*s)) - kernel = kernel / kernel.sum() + """ + eps = 0.00001 + s = NP.square((fwhm/math.sqrt(8.0*math.log(2.0)))) + eps + if ktype==1: + # from SPM: Gauss kernel convolved with 1st degree B spline + w1 = 0.5 * math.sqrt(2.0/s) + w2 = -0.5 / s + w3 = math.sqrt((s*math.pi) /2.0) + kernel = 0.5*(SP.erf(w1*(x+1))*(x+1) + SP.erf(w1*(x-1))*(x-1) - 2.0*SP.erf(w1*(x))*(x) + + w3*(NP.exp(w2*NP.square(x+1))) + NP.exp(w2*(NP.square(x-1))) - 2.0*NP.exp(w2*NP.square(x))) + kernel[kernel<0] = 0 + kernel = kernel / kernel.sum() + else: + # Gauss kernel + kernel = (1.0/math.sqrt(2.0*math.pi*s)) * NP.exp(-NP.square(x)/(2.0*s)) + kernel = kernel / kernel.sum() - return kernel + return kernel def filter_image_3D(imageRaw, fwhm, ftype=2): - """ - image_F_xyz = filter_image_3D(imageRaw, fwhm, ftype=2): - does 3D separable digital filtering using scipy.ndimage.correlate1d + """ + image_F_xyz = filter_image_3D(imageRaw, fwhm, ftype=2): + does 3D separable digital filtering using scipy.ndimage.correlate1d - Parameters - ---------- - imageRaw : {nd_array} - the unfiltered 3D volume image - fwhm : {int} - used for kernel width - ktype: {1, 2}, optional - kernel type. 1 is Gauss convoled with spline, 2 is Gauss + Parameters + ---------- + imageRaw : {nd_array} + the unfiltered 3D volume image + fwhm : {int} + used for kernel width + ktype: {1, 2}, optional + kernel type. 1 is Gauss convoled with spline, 2 is Gauss - Returns - ------- - image_F_xyz : {nd_array} - 3D filtered volume image + Returns + ------- + image_F_xyz : {nd_array} + 3D filtered volume image - Examples - -------- + Examples + -------- - >>> import _registration as reg - >>> image1, image2, imdata = reg.demo_MRI_volume_align() - >>> ftype = 1 - >>> image_Filter_xyz = filter_image_3D(image1['data'], image1['fwhm'], ftype) - >>> image1['data'] = image_Filter_xyz - """ + >>> import _registration as reg + >>> image1, image2, imdata = reg.demo_MRI_volume_align() + >>> ftype = 1 + >>> image_Filter_xyz = filter_image_3D(image1['data'], image1['fwhm'], ftype) + >>> image1['data'] = image_Filter_xyz + """ - p = NP.ceil(2*fwhm[0]).astype(int) - x = NP.array(range(-p, p+1)) - kernel_x = smooth_kernel(fwhm[0], x, ktype=ftype) - p = NP.ceil(2*fwhm[1]).astype(int) - x = NP.array(range(-p, p+1)) - kernel_y = smooth_kernel(fwhm[1], x, ktype=ftype) - p = NP.ceil(2*fwhm[2]).astype(int) - x = NP.array(range(-p, p+1)) - kernel_z = smooth_kernel(fwhm[2], x, ktype=ftype) - output=None - # 3D filter in 3 1D separable stages - axis = 0 - image_F_x = NDI.correlate1d(imageRaw, kernel_x, axis, output) - axis = 1 - image_F_xy = NDI.correlate1d(image_F_x, kernel_y, axis, output) - axis = 2 - image_F_xyz = NDI.correlate1d(image_F_xy, kernel_z, axis, output) - return image_F_xyz + p = NP.ceil(2*fwhm[0]).astype(int) + x = NP.array(range(-p, p+1)) + kernel_x = smooth_kernel(fwhm[0], x, ktype=ftype) + p = NP.ceil(2*fwhm[1]).astype(int) + x = NP.array(range(-p, p+1)) + kernel_y = smooth_kernel(fwhm[1], x, ktype=ftype) + p = NP.ceil(2*fwhm[2]).astype(int) + x = NP.array(range(-p, p+1)) + kernel_z = smooth_kernel(fwhm[2], x, ktype=ftype) + output=None + # 3D filter in 3 1D separable stages + axis = 0 + image_F_x = NDI.correlate1d(imageRaw, kernel_x, axis, output) + axis = 1 + image_F_xy = NDI.correlate1d(image_F_x, kernel_y, axis, output) + axis = 2 + image_F_xyz = NDI.correlate1d(image_F_xy, kernel_z, axis, output) + return image_F_xyz def build_fwhm(M, S): - """ - fwhm = build_fwhm(M, S) + """ + fwhm = build_fwhm(M, S) - builds the low pass filter kernel sigma value from the image pixel sampling + builds the low pass filter kernel sigma value from the image pixel sampling - Parameters - ---------- - M : {nd_array} - input 4x4 voxel to physical map matrix (called 'MAT') + Parameters + ---------- + M : {nd_array} + input 4x4 voxel to physical map matrix (called 'MAT') - S : {nd_array} - 1x3 sample increment array. should be = (1, 1, 1) + S : {nd_array} + 1x3 sample increment array. should be = (1, 1, 1) - Returns - ------- - fwhm : {nd_array} - the 3D Gaussian kernel width + Returns + ------- + fwhm : {nd_array} + the 3D Gaussian kernel width - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> anat_desc = reg.load_anatMRI_desc() - >>> image1 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') - >>> imdata = reg.build_structs() - >>> image1['fwhm'] = reg.build_fwhm(image1['mat'], imdata['step']) + >>> import numpy as NP + >>> import _registration as reg + >>> anat_desc = reg.load_anatMRI_desc() + >>> image1 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') + >>> imdata = reg.build_structs() + >>> image1['fwhm'] = reg.build_fwhm(image1['mat'], imdata['step']) - """ - view_3x3 = NP.square(M[0:3, 0:3]) - # sum the elements inn the first row - vxg = NP.sqrt(view_3x3.sum(axis=0)) - # assumes that sampling is the same for xyz - size = NP.array([1,1,1])*S[0] - x = NP.square(size) - NP.square(vxg) - # clip - x[x<0] = 0 - fwhm = NP.sqrt(x) / vxg - # pathology when stepsize = 1 for MAT equal to the identity matrix - fwhm[fwhm==0] = 1 - # return the 3D Gaussian kernel width (xyz) - return fwhm + """ + view_3x3 = NP.square(M[0:3, 0:3]) + # sum the elements inn the first row + vxg = NP.sqrt(view_3x3.sum(axis=0)) + # assumes that sampling is the same for xyz + size = NP.array([1,1,1])*S[0] + x = NP.square(size) - NP.square(vxg) + # clip + x[x<0] = 0 + fwhm = NP.sqrt(x) / vxg + # pathology when stepsize = 1 for MAT equal to the identity matrix + fwhm[fwhm==0] = 1 + # return the 3D Gaussian kernel width (xyz) + return fwhm def optimize_function(x, optfunc_args): - """ - cost = optimize_function(x, optfunc_args) --- OR --- - cost, joint_histogram = optimize_function(x, optfunc_args) + """ + cost = optimize_function(x, optfunc_args) --- OR --- + cost, joint_histogram = optimize_function(x, optfunc_args) - computes the alignment between 2 volumes using cross correlation or mutual - information metrics. In both the 8 bit joint histogram of the 2 images is - computed. The 8 bit scaling is done using an integrated histogram method and - is called prior to this. + computes the alignment between 2 volumes using cross correlation or mutual + information metrics. In both the 8 bit joint histogram of the 2 images is + computed. The 8 bit scaling is done using an integrated histogram method and + is called prior to this. - Parameters - ---------- - x : {nd_array} - this is the current (6-dim) array with 3 angles and 3 translations. + Parameters + ---------- + x : {nd_array} + this is the current (6-dim) array with 3 angles and 3 translations. - optfunc_args : {tuple} - this is a tuple of 8 elements that is formed in the scipy.optimize powell - and cg (conjugate gradient) functions. this is why the elements need to be - a tuple. The elements of optfunc_args are: + optfunc_args : {tuple} + this is a tuple of 8 elements that is formed in the scipy.optimize powell + and cg (conjugate gradient) functions. this is why the elements need to be + a tuple. The elements of optfunc_args are: - image_F : {dictionary} - image_F is the source image to be remapped during the registration. - it is a dictionary with the data as an ndarray in the ['data'] component. - image_G : {dictionary} - image_G is the reference image that image_F gets mapped to. - sample_vector : {nd_array} - sample in x,y,x. should be (1,1,1) - fwhm : {nd_array} - Gaussian sigma - do_lite : {0, 1} - lite of 1 is to jitter both images during resampling. - 0 is to not jitter. jittering is for non-aliased volumes. - smooth : {0, 1} - flag for joint histogram low pass filtering. 0 for no filter, - 1 for do filter. - method : {'nmi', 'mi', 'ncc', 'ecc', 'mse'} - flag for type of registration metric. nmi is normalized mutual - information; mi is mutual information; ecc is entropy cross - correlation; ncc is normalized cross correlation. mse is mean - square error. with mse there is no joint histogram. - ret_histo : {0, 1} - if 0 return is: cost - if 0 return is: cost, joint_histogram + image_F : {dictionary} + image_F is the source image to be remapped during the registration. + it is a dictionary with the data as an ndarray in the ['data'] component. + image_G : {dictionary} + image_G is the reference image that image_F gets mapped to. + sample_vector : {nd_array} + sample in x,y,x. should be (1,1,1) + fwhm : {nd_array} + Gaussian sigma + do_lite : {0, 1} + lite of 1 is to jitter both images during resampling. + 0 is to not jitter. jittering is for non-aliased volumes. + smooth : {0, 1} + flag for joint histogram low pass filtering. 0 for no filter, + 1 for do filter. + method : {'nmi', 'mi', 'ncc', 'ecc', 'mse'} + flag for type of registration metric. nmi is normalized mutual + information; mi is mutual information; ecc is entropy cross + correlation; ncc is normalized cross correlation. mse is mean + square error. with mse there is no joint histogram. + ret_histo : {0, 1} + if 0 return is: cost + if 0 return is: cost, joint_histogram - Returns - ------- - cost : {float} - the negative of one of the mutual information metrics - or negative cross correlation. use negative as the optimization - is minimization. + Returns + ------- + cost : {float} + the negative of one of the mutual information metrics + or negative cross correlation. use negative as the optimization + is minimization. - --- OR --- (if ret_histo = 1) + --- OR --- (if ret_histo = 1) - cost : {float} - the negative of one of the mutual information metrics - or negative cross correlation. use negative as the optimization - is minimization. + cost : {float} + the negative of one of the mutual information metrics + or negative cross correlation. use negative as the optimization + is minimization. - joint_histogram : {nd_array} - the 2D (256x256) joint histogram of the two volumes + joint_histogram : {nd_array} + the 2D (256x256) joint histogram of the two volumes - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> anat_desc = reg.load_anatMRI_desc() - >>> image1 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') - >>> image2 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') - >>> imdata = reg.build_structs() - >>> image1['fwhm'] = reg.build_fwhm(image1['mat'], imdata['step']) - >>> image2['fwhm'] = reg.build_fwhm(image2['mat'], imdata['step']) - >>> method = 'ncc' - >>> lite = 1 - >>> smhist = 0 - >>> ret_histo = 1 - >>> optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, method, ret_histo) - >>> x = NP.zeros(6, dtype=NP.float64) - >>> return cost, joint_histogram = reg.optimize_function(x, optfunc_args) + >>> import numpy as NP + >>> import _registration as reg + >>> anat_desc = reg.load_anatMRI_desc() + >>> image1 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') + >>> image2 = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img') + >>> imdata = reg.build_structs() + >>> image1['fwhm'] = reg.build_fwhm(image1['mat'], imdata['step']) + >>> image2['fwhm'] = reg.build_fwhm(image2['mat'], imdata['step']) + >>> method = 'ncc' + >>> lite = 1 + >>> smhist = 0 + >>> ret_histo = 1 + >>> optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, method, ret_histo) + >>> x = NP.zeros(6, dtype=NP.float64) + >>> return cost, joint_histogram = reg.optimize_function(x, optfunc_args) - """ + """ - image_F = optfunc_args[0] - image_G = optfunc_args[1] - sample_vector = optfunc_args[2] - fwhm = optfunc_args[3] - do_lite = optfunc_args[4] - smooth = optfunc_args[5] - method = optfunc_args[6] - ret_histo = optfunc_args[7] + image_F = optfunc_args[0] + image_G = optfunc_args[1] + sample_vector = optfunc_args[2] + fwhm = optfunc_args[3] + do_lite = optfunc_args[4] + smooth = optfunc_args[5] + method = optfunc_args[6] + ret_histo = optfunc_args[7] - rot_matrix = build_rotate_matrix(x) - cost = 0.0 - epsilon = 2.2e-16 - # image_G is base image - # image_F is the to-be-rotated image - # rot_matrix is the 4x4 constructed (current angles and translates) transform matrix - # sample_vector is the subsample vector for x-y-z + rot_matrix = build_rotate_matrix(x) + cost = 0.0 + epsilon = 2.2e-16 + # image_G is base image + # image_F is the to-be-rotated image + # rot_matrix is the 4x4 constructed (current angles and translates) transform matrix + # sample_vector is the subsample vector for x-y-z - F_inv = NP.linalg.inv(image_F['mat']) - composite = NP.dot(F_inv, image_G['mat']) - composite = NP.dot(composite, rot_matrix) + F_inv = NP.linalg.inv(image_F['mat']) + composite = NP.dot(F_inv, image_G['mat']) + composite = NP.dot(composite, rot_matrix) - if method == 'mse': - # - # mean squard error method - # + if method == 'mse': + # + # mean squard error method + # - (layers, rows, cols) = image_F['data'].shape - # allocate the zero image - remap_image_F = NP.zeros(layers*rows*cols, dtype=NP.uint8).reshape(layers, rows, cols) - imdata = build_structs() - # trilinear interpolation mapping. - R.register_linear_resample(image_F['data'], remap_image_F, composite, - imdata['step']) - cost = (NP.square(image_G['data']-remap_image_F)).mean() + (layers, rows, cols) = image_F['data'].shape + # allocate the zero image + remap_image_F = NP.zeros(layers*rows*cols, dtype=NP.uint8).reshape(layers, rows, cols) + imdata = build_structs() + # trilinear interpolation mapping. + R.register_linear_resample(image_F['data'], remap_image_F, composite, + imdata['step']) + cost = (NP.square(image_G['data']-remap_image_F)).mean() - return cost + return cost - else: - # - # histogram-based methods (nmi, ncc, mi, ecc) - # + else: + # + # histogram-based methods (nmi, ncc, mi, ecc) + # - # allocate memory for 2D histogram - joint_histogram = NP.zeros([256, 256], dtype=NP.float64); + # allocate memory for 2D histogram + joint_histogram = NP.zeros([256, 256], dtype=NP.float64); - if do_lite: - R.register_histogram_lite(image_F['data'], image_G['data'], composite, - sample_vector, joint_histogram) - else: - R.register_histogram(image_F['data'], image_G['data'], composite, - sample_vector, joint_histogram) + if do_lite: + R.register_histogram_lite(image_F['data'], image_G['data'], composite, + sample_vector, joint_histogram) + else: + R.register_histogram(image_F['data'], image_G['data'], composite, + sample_vector, joint_histogram) - # smooth the histogram - if smooth: - p = NP.ceil(2*fwhm[0]).astype(int) - x = NP.array(range(-p, p+1)) - kernel1 = smooth_kernel(fwhm[0], x) - p = NP.ceil(2*fwhm[1]).astype(int) - x = NP.array(range(-p, p+1)) - kernel2 = smooth_kernel(fwhm[1], x) - output=None - # 2D filter in 1D separable stages - axis = 0 - result = NDI.correlate1d(joint_histogram, kernel1, axis, output) - axis = 1 - joint_histogram = NDI.correlate1d(result, kernel1, axis, output) + # smooth the histogram + if smooth: + p = NP.ceil(2*fwhm[0]).astype(int) + x = NP.array(range(-p, p+1)) + kernel1 = smooth_kernel(fwhm[0], x) + p = NP.ceil(2*fwhm[1]).astype(int) + x = NP.array(range(-p, p+1)) + kernel2 = smooth_kernel(fwhm[1], x) + output=None + # 2D filter in 1D separable stages + axis = 0 + result = NDI.correlate1d(joint_histogram, kernel1, axis, output) + axis = 1 + joint_histogram = NDI.correlate1d(result, kernel1, axis, output) - joint_histogram += epsilon # prevent log(0) - # normalize the joint histogram - joint_histogram /= joint_histogram.sum() - # get the marginals - marginal_col = joint_histogram.sum(axis=0) - marginal_row = joint_histogram.sum(axis=1) + joint_histogram += epsilon # prevent log(0) + # normalize the joint histogram + joint_histogram /= joint_histogram.sum() + # get the marginals + marginal_col = joint_histogram.sum(axis=0) + marginal_row = joint_histogram.sum(axis=1) - if method == 'mi': - # mutual information - marginal_outer = NP.outer(marginal_col, marginal_row) - H = joint_histogram * NP.log(joint_histogram / marginal_outer) - mutual_information = H.sum() - cost = -mutual_information + if method == 'mi': + # mutual information + marginal_outer = NP.outer(marginal_col, marginal_row) + H = joint_histogram * NP.log(joint_histogram / marginal_outer) + mutual_information = H.sum() + cost = -mutual_information - elif method == 'ecc': - # entropy correlation coefficient - marginal_outer = NP.outer(marginal_col, marginal_row) - H = joint_histogram * NP.log(joint_histogram / marginal_outer) - mutual_information = H.sum() - row_entropy = marginal_row * NP.log(marginal_row) - col_entropy = marginal_col * NP.log(marginal_col) - ecc = -2.0*mutual_information/(row_entropy.sum() + col_entropy.sum()) - cost = -ecc + elif method == 'ecc': + # entropy correlation coefficient + marginal_outer = NP.outer(marginal_col, marginal_row) + H = joint_histogram * NP.log(joint_histogram / marginal_outer) + mutual_information = H.sum() + row_entropy = marginal_row * NP.log(marginal_row) + col_entropy = marginal_col * NP.log(marginal_col) + ecc = -2.0*mutual_information/(row_entropy.sum() + col_entropy.sum()) + cost = -ecc - elif method == 'nmi': - # normalized mutual information - row_entropy = marginal_row * NP.log(marginal_row) - col_entropy = marginal_col * NP.log(marginal_col) - H = joint_histogram * NP.log(joint_histogram) - nmi = (row_entropy.sum() + col_entropy.sum()) / (H.sum()) - cost = -nmi + elif method == 'nmi': + # normalized mutual information + row_entropy = marginal_row * NP.log(marginal_row) + col_entropy = marginal_col * NP.log(marginal_col) + H = joint_histogram * NP.log(joint_histogram) + nmi = (row_entropy.sum() + col_entropy.sum()) / (H.sum()) + cost = -nmi - elif method == 'ncc': - # cross correlation from the joint histogram - r, c = joint_histogram.shape - i = NP.array(range(1,c+1)) - j = NP.array(range(1,r+1)) - m1 = (marginal_row * i).sum() - m2 = (marginal_col * j).sum() - sig1 = NP.sqrt((marginal_row*(NP.square(i-m1))).sum()) - sig2 = NP.sqrt((marginal_col*(NP.square(j-m2))).sum()) - [a, b] = NP.mgrid[1:c+1, 1:r+1] - a = a - m1 - b = b - m2 - # element multiplies in the joint histogram and grids - H = ((joint_histogram * a) * b).sum() - ncc = H / (NP.dot(sig1, sig2)) - cost = -ncc + elif method == 'ncc': + # cross correlation from the joint histogram + r, c = joint_histogram.shape + i = NP.array(range(1,c+1)) + j = NP.array(range(1,r+1)) + m1 = (marginal_row * i).sum() + m2 = (marginal_col * j).sum() + sig1 = NP.sqrt((marginal_row*(NP.square(i-m1))).sum()) + sig2 = NP.sqrt((marginal_col*(NP.square(j-m2))).sum()) + [a, b] = NP.mgrid[1:c+1, 1:r+1] + a = a - m1 + b = b - m2 + # element multiplies in the joint histogram and grids + H = ((joint_histogram * a) * b).sum() + ncc = H / (NP.dot(sig1, sig2)) + cost = -ncc - if ret_histo: - return cost, joint_histogram - else: - return cost + if ret_histo: + return cost, joint_histogram + else: + return cost def build_structs(step=1): - """ - img_data = build_structs(step=1) + """ + img_data = build_structs(step=1) - builds the image data (imdata) dictionary for later use as parameter - storage in the co-registration. + builds the image data (imdata) dictionary for later use as parameter + storage in the co-registration. - Parameters - ---------- - step : {int} : optional - default is 1 and is the sample increment in voxels. This sets the sample - for x,y,z and is the same value in all 3 axes. only change the default for debug. + Parameters + ---------- + step : {int} : optional + default is 1 and is the sample increment in voxels. This sets the sample + for x,y,z and is the same value in all 3 axes. only change the default for debug. - Returns - ------- - img_data : {dictionary} + Returns + ------- + img_data : {dictionary} - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> imdata = reg.build_structs() + >>> import numpy as NP + >>> import _registration as reg + >>> imdata = reg.build_structs() - """ + """ - # build image data structures here - P = NP.zeros(6, dtype=NP.float64); - T = NP.zeros(6, dtype=NP.float64); - F = NP.zeros(2, dtype=NP.int32); - S = NP.ones(3, dtype=NP.int32); - sample = NP.zeros(2, dtype=NP.int32); - S[0] = step - S[1] = step - S[2] = step - # image/histogram smoothing - F[0] = 3 - F[1] = 3 - # subsample for multiresolution registration - sample[0] = 4 - sample[1] = 2 - # tolerances for angle (0-2) and translation (3-5) - T[0] = 0.02 - T[1] = 0.02 - T[2] = 0.02 - T[3] = 0.001 - T[4] = 0.001 - T[5] = 0.001 - # P[0] = alpha <=> pitch. + alpha is moving back in the sagittal plane - # P[1] = beta <=> roll. + beta is moving right in the coronal plane - # P[2] = gamma <=> yaw. + gamma is right turn in the transverse plane - # P[3] = Tx - # P[4] = Ty - # P[5] = Tz - img_data = {'parms' : P, 'step' : S, 'fwhm' : F, 'tol' : T, 'sample' : sample} - return img_data + # build image data structures here + P = NP.zeros(6, dtype=NP.float64); + T = NP.zeros(6, dtype=NP.float64); + F = NP.zeros(2, dtype=NP.int32); + S = NP.ones(3, dtype=NP.int32); + sample = NP.zeros(2, dtype=NP.int32); + S[0] = step + S[1] = step + S[2] = step + # image/histogram smoothing + F[0] = 3 + F[1] = 3 + # subsample for multiresolution registration + sample[0] = 4 + sample[1] = 2 + # tolerances for angle (0-2) and translation (3-5) + T[0] = 0.02 + T[1] = 0.02 + T[2] = 0.02 + T[3] = 0.001 + T[4] = 0.001 + T[5] = 0.001 + # P[0] = alpha <=> pitch. + alpha is moving back in the sagittal plane + # P[1] = beta <=> roll. + beta is moving right in the coronal plane + # P[2] = gamma <=> yaw. + gamma is right turn in the transverse plane + # P[3] = Tx + # P[4] = Ty + # P[5] = Tz + img_data = {'parms' : P, 'step' : S, 'fwhm' : F, 'tol' : T, 'sample' : sample} + return img_data def build_rotate_matrix(img_data_parms): - """ - rot_matrix = reg.build_rotate_matrix(img_data_parms) + """ + rot_matrix = reg.build_rotate_matrix(img_data_parms) - takes the 6 element vector (3 angles, 3 translations) and build the 4x4 mapping matrix + takes the 6 element vector (3 angles, 3 translations) and build the 4x4 mapping matrix - Parameters - ---------- - img_data_parms : {nd_array} - this is the current (6-dim) array with 3 angles and 3 translations. + Parameters + ---------- + img_data_parms : {nd_array} + this is the current (6-dim) array with 3 angles and 3 translations. - Returns - ------- - rot_matrix: {nd_array} - the 4x4 mapping matrix + Returns + ------- + rot_matrix: {nd_array} + the 4x4 mapping matrix - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> imdata = reg.build_structs() - >>> x = NP.zeros(6, dtype=NP.float64) - >>> M = reg.build_rotate_matrix(x) - >>> M - array([[ 1., 0., 0., 0.], - [ 0., 1., 0., 0.], - [ 0., 0., 1., 0.], - [ 0., 0., 0., 1.]]) + >>> import numpy as NP + >>> import _registration as reg + >>> imdata = reg.build_structs() + >>> x = NP.zeros(6, dtype=NP.float64) + >>> M = reg.build_rotate_matrix(x) + >>> M + array([[ 1., 0., 0., 0.], + [ 0., 1., 0., 0.], + [ 0., 0., 1., 0.], + [ 0., 0., 0., 1.]]) - """ + """ - R1 = NP.zeros([4,4], dtype=NP.float64); - R2 = NP.zeros([4,4], dtype=NP.float64); - R3 = NP.zeros([4,4], dtype=NP.float64); - T = NP.eye(4, dtype=NP.float64); + R1 = NP.zeros([4,4], dtype=NP.float64); + R2 = NP.zeros([4,4], dtype=NP.float64); + R3 = NP.zeros([4,4], dtype=NP.float64); + T = NP.eye(4, dtype=NP.float64); - alpha = math.radians(img_data_parms[0]) - beta = math.radians(img_data_parms[1]) - gamma = math.radians(img_data_parms[2]) + alpha = math.radians(img_data_parms[0]) + beta = math.radians(img_data_parms[1]) + gamma = math.radians(img_data_parms[2]) - R1[0][0] = 1.0 - R1[1][1] = math.cos(alpha) - R1[1][2] = math.sin(alpha) - R1[2][1] = -math.sin(alpha) - R1[2][2] = math.cos(alpha) - R1[3][3] = 1.0 + R1[0][0] = 1.0 + R1[1][1] = math.cos(alpha) + R1[1][2] = math.sin(alpha) + R1[2][1] = -math.sin(alpha) + R1[2][2] = math.cos(alpha) + R1[3][3] = 1.0 - R2[0][0] = math.cos(beta) - R2[0][2] = math.sin(beta) - R2[1][1] = 1.0 - R2[2][0] = -math.sin(beta) - R2[2][2] = math.cos(beta) - R2[3][3] = 1.0 + R2[0][0] = math.cos(beta) + R2[0][2] = math.sin(beta) + R2[1][1] = 1.0 + R2[2][0] = -math.sin(beta) + R2[2][2] = math.cos(beta) + R2[3][3] = 1.0 - R3[0][0] = math.cos(gamma) - R3[0][1] = math.sin(gamma) - R3[1][0] = -math.sin(gamma) - R3[1][1] = math.cos(gamma) - R3[2][2] = 1.0 - R3[3][3] = 1.0 + R3[0][0] = math.cos(gamma) + R3[0][1] = math.sin(gamma) + R3[1][0] = -math.sin(gamma) + R3[1][1] = math.cos(gamma) + R3[2][2] = 1.0 + R3[3][3] = 1.0 - T[0][0] = 1.0 - T[1][1] = 1.0 - T[2][2] = 1.0 - T[3][3] = 1.0 - T[0][3] = img_data_parms[3] - T[1][3] = img_data_parms[4] - T[2][3] = img_data_parms[5] + T[0][0] = 1.0 + T[1][1] = 1.0 + T[2][2] = 1.0 + T[3][3] = 1.0 + T[0][3] = img_data_parms[3] + T[1][3] = img_data_parms[4] + T[2][3] = img_data_parms[5] - rot_matrix = NP.dot(T, R1); - rot_matrix = NP.dot(rot_matrix, R2); - rot_matrix = NP.dot(rot_matrix, R3); + rot_matrix = NP.dot(T, R1); + rot_matrix = NP.dot(rot_matrix, R2); + rot_matrix = NP.dot(rot_matrix, R3); - return rot_matrix + return rot_matrix def load_volume(imagedesc, imagename=None, threshold=0.999, debug=0): - """ - image = load_volume(imagedesc, imagename=None, threshold=0.999, debug=0) --- OR --- - image, h, ih, index = load_volume(imagedesc, imagename=None, threshold=0.999, debug=0) + """ + image = load_volume(imagedesc, imagename=None, threshold=0.999, debug=0) --- OR --- + image, h, ih, index = load_volume(imagedesc, imagename=None, threshold=0.999, debug=0) - gets an image descriptor and optional filename and returns a scaled 8 bit volume. The - scaling is designed to make full use of the 8 bits (ignoring high amplitude outliers). - The current method uses numpy fromfile and will be replaced by neuroimage nifti load. + gets an image descriptor and optional filename and returns a scaled 8 bit volume. The + scaling is designed to make full use of the 8 bits (ignoring high amplitude outliers). + The current method uses numpy fromfile and will be replaced by neuroimage nifti load. - Parameters - ---------- - imagedesc : {dictionary} - imagedesc is the descriptor of the image to be read. + Parameters + ---------- + imagedesc : {dictionary} + imagedesc is the descriptor of the image to be read. - imagename : {string} : optional - name of image file. No name creates a blank image that is used for creating - a rotated test image or image rescaling. + imagename : {string} : optional + name of image file. No name creates a blank image that is used for creating + a rotated test image or image rescaling. - threshold : {float} : optional - this is the threshold for upper cutoff in the 8 bit scaling. The volume histogram - and integrated histogram is computed and the upper amplitude cutoff is where the - integrated histogram crosses the value set in the threshold. setting threshold to - 1.0 means the scaling is done over the min to max amplitude range. + threshold : {float} : optional + this is the threshold for upper cutoff in the 8 bit scaling. The volume histogram + and integrated histogram is computed and the upper amplitude cutoff is where the + integrated histogram crosses the value set in the threshold. setting threshold to + 1.0 means the scaling is done over the min to max amplitude range. - debug : {0, 1} : optional - when debug=1 the method returns the volume histogram, integrated histogram and the - amplitude index where the provided threshold occured. + debug : {0, 1} : optional + when debug=1 the method returns the volume histogram, integrated histogram and the + amplitude index where the provided threshold occured. - Returns - ------- - image : {dictionary} - the volume data assoicated with the filename or a blank volume of the same - dimensions as specified in imagedesc. + Returns + ------- + image : {dictionary} + the volume data assoicated with the filename or a blank volume of the same + dimensions as specified in imagedesc. - --- OR --- (if debug = 1) + --- OR --- (if debug = 1) - image : {dictionary} - the volume data assoicated with the filename or a blank volume of the same - dimensions as specified in imagedesc. + image : {dictionary} + the volume data assoicated with the filename or a blank volume of the same + dimensions as specified in imagedesc. - h : {nd_array} - the volume 1D amplitude histogram + h : {nd_array} + the volume 1D amplitude histogram - ih : {nd_array} - the volume 1D amplitude integrated histogram + ih : {nd_array} + the volume 1D amplitude integrated histogram - index : {int} - the amplitude (histogram index) where the integrated histogram - crosses the 'threshold' provided. + index : {int} + the amplitude (histogram index) where the integrated histogram + crosses the 'threshold' provided. - Examples - -------- + Examples + -------- - >>> import numpy as NP - >>> import _registration as reg - >>> anat_desc = reg.load_anatMRI_desc() - >>> image_anat, h, ih, index = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img', debug=1) - >>> index - 210 + >>> import numpy as NP + >>> import _registration as reg + >>> anat_desc = reg.load_anatMRI_desc() + >>> image_anat, h, ih, index = reg.load_volume(anat_desc, imagename='ANAT1_V0001.img', debug=1) + >>> index + 210 - """ + """ - # load MRI or fMRI volume and return an autoscaled 8 bit image. - # autoscale is using integrated histogram to deal with outlier high amplitude voxels - if imagename == None: - # imagename of none means to create a blank image - ImageVolume = NP.zeros(imagedesc['layers']*imagedesc['rows']*imagedesc['cols'], - dtype=NP.uint16).reshape(imagedesc['layers'], imagedesc['rows'], imagedesc['cols']) - else: - ImageVolume = NP.fromfile(imagename, - dtype=NP.uint16).reshape(imagedesc['layers'], imagedesc['rows'], imagedesc['cols']); + # load MRI or fMRI volume and return an autoscaled 8 bit image. + # autoscale is using integrated histogram to deal with outlier high amplitude voxels + if imagename == None: + # imagename of none means to create a blank image + ImageVolume = NP.zeros(imagedesc['layers']*imagedesc['rows']*imagedesc['cols'], + dtype=NP.uint16).reshape(imagedesc['layers'], imagedesc['rows'], imagedesc['cols']) + else: + ImageVolume = NP.fromfile(imagename, + dtype=NP.uint16).reshape(imagedesc['layers'], imagedesc['rows'], imagedesc['cols']); - # the mat (voxel to physical) matrix - M = NP.eye(4, dtype=NP.float64); - # for now just the sample size (mm units) in x, y and z - M[0][0] = imagedesc['sample_x'] - M[1][1] = imagedesc['sample_y'] - M[2][2] = imagedesc['sample_z'] - # dimensions - D = NP.zeros(3, dtype=NP.int32); - # Gaussian kernel - fill in with build_fwhm() - F = NP.zeros(3, dtype=NP.float64); - D[0] = imagedesc['rows'] - D[1] = imagedesc['cols'] - D[2] = imagedesc['layers'] + # the mat (voxel to physical) matrix + M = NP.eye(4, dtype=NP.float64); + # for now just the sample size (mm units) in x, y and z + M[0][0] = imagedesc['sample_x'] + M[1][1] = imagedesc['sample_y'] + M[2][2] = imagedesc['sample_z'] + # dimensions + D = NP.zeros(3, dtype=NP.int32); + # Gaussian kernel - fill in with build_fwhm() + F = NP.zeros(3, dtype=NP.float64); + D[0] = imagedesc['rows'] + D[1] = imagedesc['cols'] + D[2] = imagedesc['layers'] - if imagename == None: - # no voxels to scale to 8 bits - ImageVolume = ImageVolume.astype(NP.uint8) - image = {'data' : ImageVolume, 'mat' : M, 'dim' : D, 'fwhm' : F} - return image + if imagename == None: + # no voxels to scale to 8 bits + ImageVolume = ImageVolume.astype(NP.uint8) + image = {'data' : ImageVolume, 'mat' : M, 'dim' : D, 'fwhm' : F} + return image - # 8 bit scale with threshold clip of the volume integrated histogram - max = ImageVolume.max() - min = ImageVolume.min() - ih = NP.zeros(max-min+1, dtype=NP.float64); - h = NP.zeros(max-min+1, dtype=NP.float64); - if threshold <= 0: - threshold = 0.999 - elif threshold > 1.0: - threshold = 1.0 - # get the integrated histogram of the volume and get max from - # the threshold crossing in the integrated histogram - index = R.register_image_threshold(ImageVolume, h, ih, threshold) - scale = 255.0 / (index-min) - # generate the scaled 8 bit image - images = (scale*(ImageVolume.astype(NP.float)-min)) - images[images>255] = 255 - image = {'data' : images.astype(NP.uint8), 'mat' : M, 'dim' : D, 'fwhm' : F} - if debug == 1: - return image, h, ih, index - else: - return image + # 8 bit scale with threshold clip of the volume integrated histogram + max = ImageVolume.max() + min = ImageVolume.min() + ih = NP.zeros(max-min+1, dtype=NP.float64); + h = NP.zeros(max-min+1, dtype=NP.float64); + if threshold <= 0: + threshold = 0.999 + elif threshold > 1.0: + threshold = 1.0 + # get the integrated histogram of the volume and get max from + # the threshold crossing in the integrated histogram + index = R.register_image_threshold(ImageVolume, h, ih, threshold) + scale = 255.0 / (index-min) + # generate the scaled 8 bit image + images = (scale*(ImageVolume.astype(NP.float)-min)) + images[images>255] = 255 + image = {'data' : images.astype(NP.uint8), 'mat' : M, 'dim' : D, 'fwhm' : F} + if debug == 1: + return image, h, ih, index + else: + return image @@ -983,274 +983,274 @@ # def load_anatMRI_desc(): - # this is for demo on the test MRI and fMRI volumes - rows = 256 - cols = 256 - layers = 90 - xsamp = 0.9375 - ysamp = 0.9375 - zsamp = 1.5 - desc = {'rows' : rows, 'cols' : cols, 'layers' : layers, - 'sample_x' : xsamp, 'sample_y' : ysamp, 'sample_z' : zsamp} - return desc + # this is for demo on the test MRI and fMRI volumes + rows = 256 + cols = 256 + layers = 90 + xsamp = 0.9375 + ysamp = 0.9375 + zsamp = 1.5 + desc = {'rows' : rows, 'cols' : cols, 'layers' : layers, + 'sample_x' : xsamp, 'sample_y' : ysamp, 'sample_z' : zsamp} + return desc def load_fMRI_desc(): - # this is for demo on the test MRI and fMRI volumes - rows = 64 - cols = 64 - layers = 28 - xsamp = 3.75 - ysamp = 3.75 - zsamp = 5.0 - desc = {'rows' : rows, 'cols' : cols, 'layers' : layers, - 'sample_x' : xsamp, 'sample_y' : ysamp, 'sample_z' : zsamp} - return desc + # this is for demo on the test MRI and fMRI volumes + rows = 64 + cols = 64 + layers = 28 + xsamp = 3.75 + ysamp = 3.75 + zsamp = 5.0 + desc = {'rows' : rows, 'cols' : cols, 'layers' : layers, + 'sample_x' : xsamp, 'sample_y' : ysamp, 'sample_z' : zsamp} + return desc def read_fMRI_directory(path): - files_fMRI = glob.glob(path) - return files_fMRI + files_fMRI = glob.glob(path) + return files_fMRI def check_alignment(image1, image2, imdata, method='ncc', lite=0, smhist=0, - alpha=0.0, beta=0.0, gamma=0.0, Tx=0, Ty=0, Tz=0, ret_histo=0): - - # - # to test the cost function and view the joint histogram - # for 2 images. used for debug - # - imdata['parms'][0] = alpha - imdata['parms'][1] = beta - imdata['parms'][2] = gamma - imdata['parms'][3] = Tx - imdata['parms'][4] = Ty - imdata['parms'][5] = Tz - M = build_rotate_matrix(imdata['parms']) - optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, method, ret_histo) + alpha=0.0, beta=0.0, gamma=0.0, Tx=0, Ty=0, Tz=0, ret_histo=0): + + # + # to test the cost function and view the joint histogram + # for 2 images. used for debug + # + imdata['parms'][0] = alpha + imdata['parms'][1] = beta + imdata['parms'][2] = gamma + imdata['parms'][3] = Tx + imdata['parms'][4] = Ty + imdata['parms'][5] = Tz + M = build_rotate_matrix(imdata['parms']) + optfunc_args = (image1, image2, imdata['step'], imdata['fwhm'], lite, smhist, method, ret_histo) - if ret_histo: - cost, joint_histogram = optimize_function(imdata['parms'], optfunc_args) - return cost, joint_histogram - else: - cost = optimize_function(imdata['parms'], optfunc_args) - return cost + if ret_histo: + cost, joint_histogram = optimize_function(imdata['parms'], optfunc_args) + return cost, joint_histogram + else: + cost = optimize_function(imdata['parms'], optfunc_args) + return cost def build_scale_image(image, scale): - # - # rescale the 'mat' (voxel to physical mapping matrix) - # - (layers, rows, cols) = image['data'].shape - M = image['mat'] * scale - # dimensions - D = NP.zeros(3, dtype=NP.int32); - # Gaussian kernel - fill in with build_fwhm() - F = NP.zeros(3, dtype=NP.float64); - Z = NP.zeros(3, dtype=NP.float64); - D[0] = rows/scale - D[1] = cols/scale - D[2] = layers/scale - image2 = NP.zeros(D[2]*D[1]*D[0], dtype=NP.uint8).reshape(D[2], D[0], D[1]); - mode = 1; - R.register_volume_resample(image['data'], image2, Z, scale, mode) - scaled_image = {'data' : image2, 'mat' : M, 'dim' : D, 'fwhm' : F} - return scaled_image + # + # rescale the 'mat' (voxel to physical mapping matrix) + # + (layers, rows, cols) = image['data'].shape + M = image['mat'] * scale + # dimensions + D = NP.zeros(3, dtype=NP.int32); + # Gaussian kernel - fill in with build_fwhm() + F = NP.zeros(3, dtype=NP.float64); + Z = NP.zeros(3, dtype=NP.float64); + D[0] = rows/scale + D[1] = cols/scale + D[2] = layers/scale + image2 = NP.zeros(D[2]*D[1]*D[0], dtype=NP.uint8).reshape(D[2], D[0], D[1]); + mode = 1; + R.register_volume_resample(image['data'], image2, Z, scale, mode) + scaled_image = {'data' : image2, 'mat' : M, 'dim' : D, 'fwhm' : F} + return scaled_image def demo_MRI_volume_align(scale=2, alpha=3.0, beta=4.0, gamma=5.0, Tx = 0.0, Ty = 0.0, Tz = 0.0): - """ - demo with (must have file ANAT1_V0001.img) + """ + demo with (must have file ANAT1_V0001.img) - image1, image2, imdata = reg.demo_MRI_volume_align() - x = reg.python_coreg(image1, image2, imdata, method='ncc', lite=1) - image2r = reg.remap_image(image2, x, resample='cubic') - image2rz = reg.resize_image(image2r, image1['mat']) + image1, image2, imdata = reg.demo_MRI_volume_align() + x = reg.python_coreg(image1, image2, imdata, method='ncc', lite=1) + image2r = reg.remap_image(image2, x, resample='cubic') + image2rz = reg.resize_image(image2r, image1['mat']) - slice1 = image1['data'][45, :, :] - slice2 = image2['data'][45/2, :, :] - slice2r = image2r['data'][45/2, :, :] - slice2rz = image2rz['data'][45, :, :] + slice1 = image1['data'][45, :, :] + slice2 = image2['data'][45/2, :, :] + slice2r = image2r['data'][45/2, :, :] + slice2rz = image2rz['data'][45, :, :] - pylab.figure(1) - pylab.bone() - pylab.imshow(slice1) - pylab.imshow(slice1) - pylab.figure(2) - pylab.imshow(slice2) - pylab.figure(3) - pylab.imshow(slice2r) - pylab.figure(4) - pylab.imshow(slice2rz) - pylab.show() + pylab.figure(1) + pylab.bone() + pylab.imshow(slice1) + pylab.imshow(slice1) + pylab.figure(2) + pylab.imshow(slice2) + pylab.figure(3) + pylab.imshow(slice2r) + pylab.figure(4) + pylab.imshow(slice2rz) + pylab.show() - """ - # - # this is for coreg MRI / fMRI scale test. The volume is anatomical MRI. - # the image is rotated in 3D. after rotation the image is scaled. - # + """ + # + # this is for coreg MRI / fMRI scale test. The volume is anatomical MRI. + # the image is rotated in 3D. after rotation the image is scaled. + # - anat_desc = load_anatMRI_desc() - image1 = load_volume(anat_desc, imagename='ANAT1_V0001.img') - image2 = load_volume(anat_desc, imagename=None) - imdata = build_structs() - image1['fwhm'] = build_fwhm(image1['mat'], imdata['step']) - image2['fwhm'] = build_fwhm(image2['mat'], imdata['step']) - imdata['parms'][0] = alpha - imdata['parms'][1] = beta - imdata['parms'][2] = gamma - imdata['parms'][3] = Tx - imdata['parms'][4] = Ty - imdata['parms'][5] = Tz - M = build_rotate_matrix(imdata['parms']) - # rotate volume. linear interpolation means the volume is low pass filtered - R.register_linear_resample(image1['data'], image2['data'], M, imdata['step']) - # subsample volume - image3 = build_scale_image(image2, scale) - return image1, image3, imdata + anat_desc = load_anatMRI_desc() + image1 = load_volume(anat_desc, imagename='ANAT1_V0001.img') + image2 = load_volume(anat_desc, imagename=None) + imdata = build_structs() + image1['fwhm'] = build_fwhm(image1['mat'], imdata['step']) + image2['fwhm'] = build_fwhm(image2['mat'], imdata['step']) + imdata['parms'][0] = alpha + imdata['parms'][1] = beta + imdata['parms'][2] = gamma + imdata['parms'][3] = Tx + imdata['parms'][4] = Ty + imdata['parms'][5] = Tz + M = build_rotate_matrix(imdata['parms']) + # rotate volume. linear interpolation means the volume is low pass filtered + R.register_linear_resample(image1['data'], image2['data'], M, imdata['step']) + # subsample volume + image3 = build_scale_image(image2, scale) + return image1, image3, imdata def demo_rotate_fMRI_volume(fMRIVol, x): - # - # return rotated fMRIVol. the fMRIVol is already loaded, and gets rotated - # + # + # return rotated fMRIVol. the fMRIVol is already loaded, and gets rotated + # - desc = load_fMRI_desc() - image = load_volume(desc, imagename=None) - imdata = build_structs() - image['fwhm'] = build_fwhm(image['mat'], imdata['step']) - imdata['parms'][0] = x[0] # alpha - imdata['parms'][1] = x[1] # beta - imdata['parms'][2] = x[2] # gamma - imdata['parms'][3] = x[3] # Tx - imdata['parms'][4] = x[4] # Ty - imdata['parms'][5] = x[5] # Tz - M = build_rotate_matrix(imdata['parms']) - # rotate volume. cubic spline interpolation means the volume is NOT low pass filtered - R.register_cubic_resample(fMRIVol['data'], image['data'], M, imdata['step']) - return image + desc = load_fMRI_desc() + image = load_volume(desc, imagename=None) + imdata = build_structs() + image['fwhm'] = build_fwhm(image['mat'], imdata['step']) + imdata['parms'][0] = x[0] # alpha + imdata['parms'][1] = x[1] # beta + imdata['parms'][2] = x[2] # gamma + imdata['parms'][3] = x[3] # Tx + imdata['parms'][4] = x[4] # Ty + imdata['parms'][5] = x[5] # Tz + M = build_rotate_matrix(imdata['parms']) + # rotate volume. cubic spline interpolation means the volume is NOT low pass filtered + R.register_cubic_resample(fMRIVol['data'], image['data'], M, imdata['step']) + return image def demo_MRI_coregistration(optimizer_method='powell', histo_method=1, smooth_histo=0, smooth_image=0, ftype=1): - """ - demo with (must have file ANAT1_V0001.img and fMRI directory fMRIData) + """ + demo with (must have file ANAT1_V0001.img and fMRI directory fMRIData) - measures, imageF_anat, fmri_series = reg.demo_MRI_coregistration() + measures, imageF_anat, fmri_series = reg.demo_MRI_coregistration() - show results with + show results with - In [59]: measures[25]['cost'] - Out[59]: -0.48607185 + In [59]: measures[25]['cost'] + Out[59]: -0.48607185 - In [60]: measures[25]['align_cost'] - Out[60]: -0.99514639 + In [60]: measures[25]['align_cost'] + Out[60]: -0.99514639 - In [61]: measures[25]['align_rotate'] - Out[61]: - array([ 1.94480181, 5.64703989, 5.35002136, -5.00544405, -2.2712214, -1.42249691], dtype=float32) + In [61]: measures[25]['align_rotate'] + Out[61]: + array([ 1.94480181, 5.64703989, 5.35002136, -5.00544405, -2.2712214, -1.42249691], dtype=float32) - In [62]: measures[25]['rotate'] - Out[62]: - array([ 1.36566341, 4.70644331, 4.68198586, -4.32256889, -2.47607017, -2.39173937], dtype=float32) + In [62]: measures[25]['rotate'] + Out[62]: + array([ 1.36566341, 4.70644331, 4.68198586, -4.32256889, -2.47607017, -2.39173937], dtype=float32) - """ + """ - # demo of alignment of fMRI series with anatomical MRI - # in this demo, each fMRI volume is first perturbed (rotated, translated) - # by a random value. The initial registration is measured, then the optimal - # alignment is computed and the registration measure made following the volume remap. - # The fMRI registration is done with the first fMRI volume using normalized cross-correlation. - # Each fMRI volume is rotated to the fMRI-0 volume and the series is ensemble averaged. - # The ensemble averaged is then registered with the anatomical MRI volume using normalized mutual information. - # The fMRI series is then rotated with this parameter. The alignments are done with 3D cubic splines. + # demo of alignment of fMRI series with anatomical MRI + # in this demo, each fMRI volume is first perturbed (rotated, translated) + # by a random value. The initial registration is measured, then the optimal + # alignment is computed and the registration measure made following the volume remap. + # The fMRI registration is done with the first fMRI volume using normalized cross-correlation. + # Each fMRI volume is rotated to the fMRI-0 volume and the series is ensemble averaged. + # The ensemble averaged is then registered with the anatomical MRI volume using normalized mutual information. + # The fMRI series is then rotated with this parameter. The alignments are done with 3D cubic splines. - # read the anatomical MRI volume - anat_desc = load_anatMRI_desc() - imageF_anat = load_volume(anat_desc, imagename='ANAT1_V0001.img') - # the sampling structure - imdata = build_structs() - # the volume filter - imageF_anat['fwhm'] = build_fwhm(imageF_anat['mat'], imdata['step']) + # read the anatomical MRI volume + anat_desc = load_anatMRI_desc() + imageF_anat = load_volume(anat_desc, imagename='ANAT1_V0001.img') + # the sampling structure + imdata = build_structs() + # the volume filter + imageF_anat['fwhm'] = build_fwhm(imageF_anat['mat'], imdata['step']) - # read in the file list of the fMRI data - metric_test = NP.dtype([('cost', 'f'), - ('align_cost', 'f'), - ('rotate', 'f', 6), - ('align_rotate', 'f', 6)]) + # read in the file list of the fMRI data + metric_test = NP.dtype([('cost', 'f'), + ('align_cost', 'f'), + ('rotate', 'f', 6), + ('align_rotate', 'f', 6)]) - fMRIdata = read_fMRI_directory('fMRIData\*.img') - fmri_desc = load_fMRI_desc() - fmri_series = {} - ave_fMRI_volume = NP.zeros(fmri_desc['layers']*fmri_desc['rows']*fmri_desc['cols'], - dtype=NP.float64).reshape(fmri_desc['layers'], fmri_desc['rows'], fmri_desc['cols']) - count = 0 - number_volumes = len(fMRIdata) - measures = NP.zeros(number_volumes, dtype=metric_test) - # load and perturb (rotation, translation) the fMRI volumes - for i in fMRIdata: - image = load_volume(fmri_desc, i) - # random perturbation of angle, translation for each volume beyond the first - if count == 0: - image['fwhm'] = build_fwhm(image['mat'], imdata['step']) - fmri_series[count] = image - count = count + 1 - else: - x = NP.random.random(6) - 0.5 - x = 10.0 * x - fmri_series[count] = demo_rotate_fMRI_volume(image, x) - measures[count]['rotate'][0:6] = x[0:6] - count = count + 1 + fMRIdata = read_fMRI_directory('fMRIData\*.img') + fmri_desc = load_fMRI_desc() + fmri_series = {} + ave_fMRI_volume = NP.zeros(fmri_desc['layers']*fmri_desc['rows']*fmri_desc['cols'], + dtype=NP.float64).reshape(fmri_desc['layers'], fmri_desc['rows'], fmri_desc['cols']) + count = 0 + number_volumes = len(fMRIdata) + measures = NP.zeros(number_volumes, dtype=metric_test) + # load and perturb (rotation, translation) the fMRI volumes + for i in fMRIdata: + image = load_volume(fmri_desc, i) + # random perturbation of angle, translation for each volume beyond the first + if count == 0: + image['fwhm'] = build_fwhm(image['mat'], imdata['step']) + fmri_series[count] = image + count = count + 1 + else: + x = NP.random.random(6) - 0.5 + x = 10.0 * x + fmri_series[count] = demo_rotate_fMRI_volume(image, x) + measures[count]['rotate'][0:6] = x[0:6] + count = count + 1 - # load and register the fMRI volumes with volume_0 using normalized cross correlation metric - imageF = fmri_series[0] - if smooth_image: - image_F_xyz = filter_image_3D(imageF['data'], imageF['fwhm'], ftype) - imageF['data'] = image_F_xyz - for i in range(1, number_volumes): - imageG = fmri_series[i] - # the measure prior to alignment - measures[i]['cost'] = check_alignment(imageF, imageG, imdata, method='ncc', - lite=histo_method, smhist=smooth_histo) - x = python_coreg(imageF, imageG, imdata, lite=histo_method, method='ncc', - opt_method=optimizer_method, smhist=smooth_histo, smimage=smooth_image) - measures[i]['align_rotate'][0:6] = x[0:6] - measures[i]['align_cost'] = check_alignment(imageF, imageG, imdata, method='ncc', - lite=histo_method, smhist=smooth_histo, - alpha=x[0], beta=x[1], gamma=x[2], Tx=x[3], Ty=x[4], Tz=x[5]) + # load and register the fMRI volumes with volume_0 using normalized cross correlation metric + imageF = fmri_series[0] + if smooth_image: + image_F_xyz = filter_image_3D(imageF['data'], imageF['fwhm'], ftype) + imageF['data'] = image_F_xyz + for i in range(1, number_volumes): + imageG = fmri_series[i] + # the measure prior to alignment + measures[i]['cost'] = check_alignment(imageF, imageG, imdata, method='ncc', + lite=histo_method, smhist=smooth_histo) + x = python_coreg(imageF, imageG, imdata, lite=histo_method, method='ncc', + opt_method=optimizer_method, smhist=smooth_histo, smimage=smooth_image) + measures[i]['align_rotate'][0:6] = x[0:6] + measures[i]['align_cost'] = check_alignment(imageF, imageG, imdata, method='ncc', + lite=histo_method, smhist=smooth_histo, + alpha=x[0], beta=x[1], gamma=x[2], Tx=x[3], Ty=x[4], Tz=x[5]) - # align the volumes and average them for co-registration with the anatomical MRI - ave_fMRI_volume = fmri_series[0]['data'].astype(NP.float64) - for i in range(1, number_volumes): - image = fmri_series[i] - x[0:6] = measures[i]['align_rotate'][0:6] - # overwrite the fMRI volume with the aligned volume - fmri_series[i] = remap_image(image, x, resample='cubic') - ave_fMRI_volume = ave_fMRI_volume + fmri_series[i]['data'].astype(NP.float64) + # align the volumes and average them for co-registration with the anatomical MRI + ave_fMRI_volume = fmri_series[0]['data'].astype(NP.float64) + for i in range(1, number_volumes): + image = fmri_series[i] + x[0:6] = measures[i]['align_rotate'][0:6] + # overwrite the fMRI volume with the aligned volume + fmri_series[i] = remap_image(image, x, resample='cubic') + ave_fMRI_volume = ave_fMRI_volume + fmri_series[i]['data'].astype(NP.float64) - ave_fMRI_volume = (ave_fMRI_volume / float(number_volumes)).astype(NP.uint8) - ave_fMRI_volume = {'data' : ave_fMRI_volume, 'mat' : imageF['mat'], - 'dim' : imageF['dim'], 'fwhm' : imageF['fwhm']} - # register (using normalized mutual information) with the anatomical MRI - if smooth_image: - image_F_anat_xyz = filter_image_3D(imageF_anat['data'], imageF_anat['fwhm'], ftype) - imageF_anat['data'] = image_F_anat_xyz - x = python_coreg(imageF_anat, ave_fMRI_volume, imdata, lite=histo_method, - method='nmi', opt_method=optimizer_method, smhist=smooth_histo, smimage=smooth_image) - print 'functional-anatomical align parameters ' - print x - for i in range(number_volumes): - image = fmri_series[i] - # overwrite the fMRI volume with the anatomical-aligned volume - fmri_series[i] = remap_image(image, x, resample='cubic') + ave_fMRI_volume = (ave_fMRI_volume / float(number_volumes)).astype(NP.uint8) + ave_fMRI_volume = {'data' : ave_fMRI_volume, 'mat' : imageF['mat'], + 'dim' : imageF['dim'], 'fwhm' : imageF['fwhm']} + # register (using normalized mutual information) with the anatomical MRI + if smooth_image: + image_F_anat_xyz = filter_image_3D(imageF_anat['data'], imageF_anat['fwhm'], ftype) + imageF_anat['data'] = image_F_anat_xyz + x = python_coreg(imageF_anat, ave_fMRI_volume, imdata, lite=histo_method, + method='nmi', opt_method=optimizer_method, smhist=smooth_histo, smimage=smooth_image) + print 'functional-anatomical align parameters ' + print x + for i in range(number_volumes): + image = fmri_series[i] + # overwrite the fMRI volume with the anatomical-aligned volume + fmri_series[i] = remap_image(image, x, resample='cubic') - return measures, imageF_anat, fmri_series + return measures, imageF_anat, fmri_series def demo_fMRI_resample(imageF_anat, fmri_series): - resampled_fmri_series = {} - number_volumes = len(fmri_series) - for i in range(number_volumes): - resampled_fmri_series[i] = resize_image(fmri_series[i], imageF_anat['mat']) + resampled_fmri_series = {} + number_volumes = len(fmri_series) + for i in range(number_volumes): + resampled_fmri_series[i] = resize_image(fmri_series[i], imageF_anat['mat']) - return resampled_fmri_series + return resampled_fmri_series Modified: trunk/scipy/ndimage/_segmenter.py =================================================================== --- trunk/scipy/ndimage/_segmenter.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/ndimage/_segmenter.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -57,10 +57,10 @@ return edge_image def canny_nonmax_supress(horz_DGFilter, vert_DGFilter, img_means, thres=0.5, - mode=1, canny_l=0.5, canny_h=0.8): + mode=1, canny_l=0.5, canny_h=0.8): """ magnitude, canny_stats = canny_nonmax_supress(horz_DGFilter, vert_DGFilter, img_means, - thres=0.5, mode=1, canny_l=0.5, canny_h=0.8) + thres=0.5, mode=1, canny_l=0.5, canny_h=0.8) non-max supression stage of Canny filter @@ -69,11 +69,11 @@ horz_DGFilter : {nd_array} the horizonal filtered image using the derivative of Gaussian kernel filter. - this is the output of the canny_filter method + this is the output of the canny_filter method vert_DGFilter : {nd_array} the vertical filtered image using the derivative of Gaussian kernel filter. - this is the output of the canny_filter method + this is the output of the canny_filter method img_means : {dictionary} mean X and Y values of edge signals determined from canny_filter @@ -103,8 +103,8 @@ [rows, cols] = horz_DGFilter.shape magnitude = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) aveMag, canny_low, canny_high = S.canny_nonmax_supress(horz_DGFilter, vert_DGFilter, - magnitude, mode, img_means['x-dg']*thres, - img_means['y-dg']*thres, canny_l, canny_h) + magnitude, mode, img_means['x-dg']*thres, + img_means['y-dg']*thres, canny_l, canny_h) canny_stats = {'mean' : aveMag, 'low' : canny_low, 'high' : canny_high} @@ -144,7 +144,7 @@ horz_DGFilter = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) vert_DGFilter = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) aveX, aveY = S.canny_filter(slice, horz_DGFilter, vert_DGFilter, - dg_kernel['coefficients'], dg_kernel['kernelSize']) + dg_kernel['coefficients'], dg_kernel['kernelSize']) img_means = {'x-dg' : aveX, 'y-dg' : aveY} @@ -181,30 +181,30 @@ number_regions = ROI.size indices = range(0, number_regions) for i in indices: - left = ROI[i]['Left']-2 - right = ROI[i]['Right']+2 - bottom = ROI[i]['Bottom']-2 - top = ROI[i]['Top']+2 - Label = ROI[i]['Label'] - if left < 0: - left = 0 - if bottom < 0: - bottom = 0 - if right > cols-1: - right = cols-1 - if top > rows-1: - top = rows-1 + left = ROI[i]['Left']-2 + right = ROI[i]['Right']+2 + bottom = ROI[i]['Bottom']-2 + top = ROI[i]['Top']+2 + Label = ROI[i]['Label'] + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 - roi_rows = top-bottom - roi_cols = right-left + roi_rows = top-bottom + roi_cols = right-left label_region = NP.zeros(roi_rows*roi_cols, dtype=NP.uint16).reshape(roi_rows, roi_cols) input = NP.zeros(roi_rows*roi_cols, dtype=NP.uint16).reshape(roi_rows, roi_cols) - # load the labeled region - label_region[0:roi_rows, 0:roi_cols][label_image[bottom:top, left:right]==Label] = 1 - S.binary_edge(label_region, input) - input[0:roi_rows,0:roi_cols][input[0:roi_rows,0:roi_cols]==1] = Label - binary_edge_image[bottom:top,left:right] = binary_edge_image[bottom:top,left:right] + \ - input[0:roi_rows,0:roi_cols] + # load the labeled region + label_region[0:roi_rows, 0:roi_cols][label_image[bottom:top, left:right]==Label] = 1 + S.binary_edge(label_region, input) + input[0:roi_rows,0:roi_cols][input[0:roi_rows,0:roi_cols]==1] = Label + binary_edge_image[bottom:top,left:right] = binary_edge_image[bottom:top,left:right] + \ + input[0:roi_rows,0:roi_cols] return binary_edge_image @@ -239,7 +239,7 @@ ROI : {dictionary} Region of Interest structure that has blob bounding boxes. The largest - 2D target bounding box is extracted. + 2D target bounding box is extracted. Returns @@ -247,7 +247,7 @@ co_occurence_images : {dictionary} contains 4 joint histogram images for each ROI - returned if verbose=1 + returned if verbose=1 """ @@ -268,50 +268,50 @@ Label = ROI[i]['Label'] rows = top-bottom cols = right-left - # copy the mask to section image + # copy the mask to section image section = NP.zeros(rows*cols, dtype=label_image.dtype).reshape(rows, cols) section[0:rows, 0:cols][label_image[bottom:top, left:right]==Label] = 1 source_region = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) cocm_block = NP.zeros(num_bits*num_bits, dtype=NP.int32).reshape(num_bits, num_bits) - source_region[0:rows, 0:cols] = copy_image[bottom:top, left:right] + source_region[0:rows, 0:cols] = copy_image[bottom:top, left:right] # scale segment to 8 bits. this needs to be smarter (e.g. use integrated histogram method) max_value = source_region.max() min_value = source_region.min() scale = 255.0 / (max_value-min_value) image_roi = (scale*(source_region-min_value)).astype(NP.int16) - # image_roi is short type - S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) + # image_roi is short type + S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) co_occurence_image_list[i] = cocm_block - # normalize the joint histogram prior to feature extraction - joint_histogram = cocm_block.astype(NP.float64) - joint_histogram = joint_histogram / joint_histogram.sum() - # to prevent log(0) - joint_histogram += epsilon - # compute the com features - energy = joint_histogram.std() - H = joint_histogram * NP.log(joint_histogram) - entropy = H.sum() - r, c = joint_histogram.shape - [a, b] = NP.mgrid[1:c+1, 1:r+1] - contrast = ((NP.square(a-b))*joint_histogram).sum() - d = 1.0 + NP.abs(a-b) - homogeneity = (joint_histogram / d).sum() - ROI[i]['COM'][0] = distance - ROI[i]['COM'][1] = orientation - ROI[i]['COM'][2] = energy - ROI[i]['COM'][3] = entropy - ROI[i]['COM'][4] = contrast - ROI[i]['COM'][5] = homogeneity + # normalize the joint histogram prior to feature extraction + joint_histogram = cocm_block.astype(NP.float64) + joint_histogram = joint_histogram / joint_histogram.sum() + # to prevent log(0) + joint_histogram += epsilon + # compute the com features + energy = joint_histogram.std() + H = joint_histogram * NP.log(joint_histogram) + entropy = H.sum() + r, c = joint_histogram.shape + [a, b] = NP.mgrid[1:c+1, 1:r+1] + contrast = ((NP.square(a-b))*joint_histogram).sum() + d = 1.0 + NP.abs(a-b) + homogeneity = (joint_histogram / d).sum() + ROI[i]['COM'][0] = distance + ROI[i]['COM'][1] = orientation + ROI[i]['COM'][2] = energy + ROI[i]['COM'][3] = entropy + ROI[i]['COM'][4] = contrast + ROI[i]['COM'][5] = homogeneity if verbose == 1: return co_occurence_image_list else: - return + return def region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, - low_thresh=0.5, high_thresh=1.5, N_connectivity=3, debug=0): + low_thresh=0.5, high_thresh=1.5, N_connectivity=3, debug=0): """ region_grow(label_image, raw_image, ROI, roi_index, roi_inflate, stop_thresh) @@ -329,33 +329,33 @@ ROI : {dictionary} Region of Interest structure that has blob bounding boxes. The largest - 2D target bounding box is extracted. + 2D target bounding box is extracted. roi_index : {int} the single ROI element to apply region growing to. roi_inflate : {list} the maximum increase in the ROI bounding box. For 3D the tuple is [layers, rows, cols] - and for 2D it is [rows, cols]. + and for 2D it is [rows, cols]. low_thresh : {float} this is the percent of the voxel mean that the growing region must be GREATER than. - region growing terminates when the raw_image is BELOW this value. + region growing terminates when the raw_image is BELOW this value. high_thresh : {float} this is the percent of the voxel mean that the growing region must be LESS than. - region growing terminates when the raw_image is ABOVE this value. + region growing terminates when the raw_image is ABOVE this value. N_connectivity : {int} for growing this indicates how connected in a 3x3 or 3x3x3 window the un-labeled - sample is. Make less than full connected for growing boundaries + sample is. Make less than full connected for growing boundaries Returns ---------- label : {nd_array} the label image with the selected ROI after region growing. only returned - in debug mode. + in debug mode. """ @@ -394,25 +394,25 @@ Label = ROI[roi_index]['Label'] lcutoff = low_thresh * ROI[roi_index]['voxelMean'] hcutoff = high_thresh * ROI[roi_index]['voxelMean'] - if left < 0: - left = 0 - if bottom < 0: + if left < 0: + left = 0 + if bottom < 0: bottom = 0 - if right > cols-1: + if right > cols-1: right = cols-1 - if top > rows-1: + if top > rows-1: top = rows-1 expanded_ROI['Left'] = left expanded_ROI['Right'] = right expanded_ROI['Top'] = top expanded_ROI['Bottom'] = bottom expanded_ROI['Label'] = Label - rows = top-bottom - cols = right-left + rows = top-bottom + cols = right-left label = NP.zeros(rows*cols, dtype=NP.int16).reshape(rows, cols) section = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) - label = label_image[bottom:top, left:right].copy() - section = (raw_image[bottom:top, left:right].astype(NP.float64)).copy() + label = label_image[bottom:top, left:right].copy() + section = (raw_image[bottom:top, left:right].astype(NP.float64)).copy() elif dimensions == 3: left = ROI[roi_index]['Left']-x_ext right = ROI[roi_index]['Right']+x_ext @@ -423,17 +423,17 @@ Label = ROI[roi_index]['Label'] lcutoff = low_thresh * ROI[roi_index]['voxelMean'] hcutoff = high_thresh * ROI[roi_index]['voxelMean'] - if left < 0: + if left < 0: left = 0 - if bottom < 0: + if bottom < 0: bottom = 0 - if right > cols-1: + if right > cols-1: right = cols-1 - if top > rows-1: + if top > rows-1: top = rows-1 - if front < 0: + if front < 0: front = 0 - if back > layers-1: + if back > layers-1: back = layers-1 expanded_ROI['Left'] = left expanded_ROI['Right'] = right @@ -442,13 +442,13 @@ expanded_ROI['Back'] = back expanded_ROI['Front'] = front expanded_ROI['Label'] = Label - rows = top-bottom - cols = right-left - layers = back-front + rows = top-bottom + cols = right-left + layers = back-front label = NP.zeros(layers*rows*cols, dtype=NP.int16).reshape(layers, rows, cols) - label = label_image[front:back, bottom:top, left:right].copy() + label = label_image[front:back, bottom:top, left:right].copy() section = NP.zeros(layers*rows*cols, dtype=NP.float64).reshape(layers, rows, cols) - section = (raw_image[front:back, bottom:top, left:right].astype(NP.float64)).copy() + section = (raw_image[front:back, bottom:top, left:right].astype(NP.float64)).copy() # # this newgrow_ROI gets filled in and the label image is grown @@ -458,27 +458,27 @@ S.region_grow(section, label, expanded_ROI, newgrow_ROI, lcutoff, hcutoff, Label, N_connectivity) if debug==1: - # - # do not update ROI for index and the label_image - # + # + # do not update ROI for index and the label_image + # return label else: - # - # update (overwrite) ROI for index and the label_image - # + # + # update (overwrite) ROI for index and the label_image + # if dimensions == 2: - ROI[roi_index]['Left'] = newgrow_ROI['Left'] - ROI[roi_index]['Right'] = newgrow_ROI['Right'] - ROI[roi_index]['Top'] = newgrow_ROI['Top'] - ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] - left = ROI[roi_index]['Left'] - right = ROI[roi_index]['Right'] - top = ROI[roi_index]['Top'] - bottom = ROI[roi_index]['Bottom'] - rows = top-bottom - cols = right-left - label_image[bottom:top,left:right] = label[0:rows,0:cols] + ROI[roi_index]['Left'] = newgrow_ROI['Left'] + ROI[roi_index]['Right'] = newgrow_ROI['Right'] + ROI[roi_index]['Top'] = newgrow_ROI['Top'] + ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] + left = ROI[roi_index]['Left'] + right = ROI[roi_index]['Right'] + top = ROI[roi_index]['Top'] + bottom = ROI[roi_index]['Bottom'] + rows = top-bottom + cols = right-left + label_image[bottom:top,left:right] = label[0:rows,0:cols] elif dimensions == 3: ROI[roi_index]['Left'] = newgrow_ROI['Left'] ROI[roi_index]['Right'] = newgrow_ROI['Right'] @@ -486,17 +486,17 @@ ROI[roi_index]['Bottom'] = newgrow_ROI['Bottom'] ROI[roi_index]['Front'] = newgrow_ROI['Front'] ROI[roi_index]['Back'] = newgrow_ROI['Back'] - left = expanded_ROI['Left'] - right = expanded_ROI['Right'] - top = expanded_ROI['Top'] - bottom = expanded_ROI['Bottom'] - front = expanded_ROI['Front'] - back = expanded_ROI['Back'] - rows = top-bottom - cols = right-left - layers = back-front - label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] - + left = expanded_ROI['Left'] + right = expanded_ROI['Right'] + top = expanded_ROI['Top'] + bottom = expanded_ROI['Bottom'] + front = expanded_ROI['Front'] + back = expanded_ROI['Back'] + rows = top-bottom + cols = right-left + layers = back-front + label_image[front:back,bottom:top,left:right] = label[0:layers,0:rows,0:cols] + return @@ -525,8 +525,8 @@ window : {int} integer value of moving 2D window. Window slides in 2D over image and is the - region-of-interest from which co-occurence texture features are extracted. The - window is 2D square so only a single value is entered. Default window is 32x32. + region-of-interest from which co-occurence texture features are extracted. The + window is 2D square so only a single value is entered. Default window is 32x32. distance : {int} integer value of pixel offset in forming joint histogram. default value 2 @@ -539,8 +539,8 @@ cocm_images : {dictionary} - co_occurence_feature_images. contains 4 normalized feature - windows with keys: energy, entropy, contrast and homogeneity. + co_occurence_feature_images. contains 4 normalized feature + windows with keys: energy, entropy, contrast and homogeneity. """ @@ -571,34 +571,34 @@ for j in col_indices: left = j - window right = j + window - source_region[0:2*window, 0:2*window] = copy_image[bottom:top, left:right] + source_region[0:2*window, 0:2*window] = copy_image[bottom:top, left:right] # scale segment to 8 bits. this needs to be smarter (e.g. use integrated histogram method) max_value = source_region.max() min_value = source_region.min() scale = 255.0 / (max_value-min_value) image_roi = (scale*(source_region-min_value)).astype(NP.int16) - # image_roi is short type - cocm_block[:] = 0.0 - S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) - # normalize the joint histogram prior to feature extraction - joint_histogram = cocm_block.astype(NP.float64) - joint_histogram = joint_histogram / joint_histogram.sum() - # to prevent log(0) - joint_histogram += epsilon - # compute the com features - energy = joint_histogram.std() - H = joint_histogram * NP.log(joint_histogram) - entropy = H.sum() - r, c = joint_histogram.shape - [a, b] = NP.mgrid[1:c+1, 1:r+1] - contrast = ((NP.square(a-b))*joint_histogram).sum() - d = 1.0 + NP.abs(a-b) - homogeneity = (joint_histogram / d).sum() - # store the feature pixel for the 4 images - energy_image[i, j] = energy - entropy_image[i, j] = entropy - contrast_image[i, j] = contrast - homogeneity_image[i, j] = homogeneity + # image_roi is short type + cocm_block[:] = 0.0 + S.roi_co_occurence(section, image_roi, cocm_block, distance, orientation) + # normalize the joint histogram prior to feature extraction + joint_histogram = cocm_block.astype(NP.float64) + joint_histogram = joint_histogram / joint_histogram.sum() + # to prevent log(0) + joint_histogram += epsilon + # compute the com features + energy = joint_histogram.std() + H = joint_histogram * NP.log(joint_histogram) + entropy = H.sum() + r, c = joint_histogram.shape + [a, b] = NP.mgrid[1:c+1, 1:r+1] + contrast = ((NP.square(a-b))*joint_histogram).sum() + d = 1.0 + NP.abs(a-b) + homogeneity = (joint_histogram / d).sum() + # store the feature pixel for the 4 images + energy_image[i, j] = energy + entropy_image[i, j] = entropy + contrast_image[i, j] = contrast + homogeneity_image[i, j] = homogeneity scale_energy = 1.0 / max(energy_image.max(), abs(energy_image.min())) scale_entropy = 1.0 / max(entropy_image.max(), abs(entropy_image.min())) @@ -635,7 +635,7 @@ ROI : {dictionary} Region of Interest structure that has blob bounding boxes. The largest - 2D target bounding box is extracted. + 2D target bounding box is extracted. Returns ---------- @@ -686,7 +686,7 @@ [label_image[bottom:top, left:right]==Label] = 1 # thin this region S.thin_filter(thin_kernel['jmask'], thin_kernel['kmask'], thin_kernel['number3x3Masks'], - roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) + roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) # accumulate the images (do not over-write). for overlapping regions input[inflate:rgrows+inflate,inflate:rgcols+inflate] \ @@ -724,7 +724,7 @@ """ if ROI==None: ROIList = NP.zeros(1, dtype=_objstruct) - [rows, cols] = label_image.shape + [rows, cols] = label_image.shape ROIList['Left'] = 2 ROIList['Right'] = cols-3 ROIList['Bottom'] = 2 @@ -746,39 +746,39 @@ indices = range(0, number_regions) inflate = 1 for i in indices: - left = ROI[i]['Left']-1 - right = ROI[i]['Right']+1 - bottom = ROI[i]['Bottom']-1 - top = ROI[i]['Top']+1 - Label = ROI[i]['Label'] - if left < 0: - left = 0 - if bottom < 0: - bottom = 0 - if right > cols-1: - right = cols-1 - if top > rows-1: - top = rows-1 + left = ROI[i]['Left']-1 + right = ROI[i]['Right']+1 + bottom = ROI[i]['Bottom']-1 + top = ROI[i]['Top']+1 + Label = ROI[i]['Label'] + if left < 0: + left = 0 + if bottom < 0: + bottom = 0 + if right > cols-1: + right = cols-1 + if top > rows-1: + top = rows-1 - roi_rows = top-bottom+2*inflate - roi_cols = right-left+2*inflate - rgrows = top-bottom - rgcols = right-left - # clear the memory - input[0:roi_rows, 0:roi_cols] = 0 - # load the labeled region - input[inflate:inflate+rgrows, inflate:inflate+rgcols] \ - [label_image[bottom:top, left:right]==Label] = 1 - # thin this region + roi_rows = top-bottom+2*inflate + roi_cols = right-left+2*inflate + rgrows = top-bottom + rgcols = right-left + # clear the memory + input[0:roi_rows, 0:roi_cols] = 0 + # load the labeled region + input[inflate:inflate+rgrows, inflate:inflate+rgcols] \ + [label_image[bottom:top, left:right]==Label] = 1 + # thin this region S.thin_filter(thin_kernel['jmask'], thin_kernel['kmask'], thin_kernel['number3x3Masks'], - roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) + roi_rows, roi_cols, cols, input, cinput, erosion, dialation, hmt, copy) - # accumulate the images (do not over-write). for overlapping regions - input[inflate:rgrows+inflate,inflate:rgcols+inflate] \ - [input[inflate:rgrows+inflate,inflate:rgcols+inflate]==1] = Label - thin_edge_image[bottom:top,left:right] = thin_edge_image[bottom:top,left:right] + \ - input[inflate:rgrows+inflate,inflate:rgcols+inflate] - + # accumulate the images (do not over-write). for overlapping regions + input[inflate:rgrows+inflate,inflate:rgcols+inflate] \ + [input[inflate:rgrows+inflate,inflate:rgcols+inflate]==1] = Label + thin_edge_image[bottom:top,left:right] = thin_edge_image[bottom:top,left:right] + \ + input[inflate:rgrows+inflate,inflate:rgcols+inflate] + # accumulate overlaps set back to binary at later date mat_image[:, :] = thin_edge_image[:, :] @@ -787,7 +787,7 @@ def laws_texture_filter(raw_image, label_image, laws_kernel, ROI=None, dc_thres=1.0, - mean_feature=1, verbose=0): + mean_feature=1, verbose=0): """ texture_images = laws_texture_filter(raw_image, label_image, laws_kernel, ROI=None, verbose=1) . @@ -812,13 +812,13 @@ dc_thres : {float} used as a filter. Sets texture feature to 0.0 when the - mean level is above this. Removes the low frequency, high amplitude - image regions from the feature list + mean level is above this. Removes the low frequency, high amplitude + image regions from the feature list mean_feature : {0, 1}, optional when set to 1, the feature is the mean value of the - selected Law's texture filter. When 0 the feature is - the standard deviation. + selected Law's texture filter. When 0 the feature is + the standard deviation. verbose : {0, 1}, optional determines if return is to include Law's filter images @@ -828,13 +828,13 @@ laws_image : {dictionary} contains 21 Laws filtered regions for each ROI - returned if verbose=1 + returned if verbose=1 """ if ROI==None: ROI= NP.zeros(1, dtype=_objstruct) - [rows, cols] = label_image.shape + [rows, cols] = label_image.shape ROI['Left'] = 2 ROI['Right'] = cols-3 ROI['Bottom'] = 2 @@ -846,46 +846,46 @@ indices = range(0, number_regions) filters = range(0, layers) for i in indices: - left = ROI[i]['Left'] - right = ROI[i]['Right'] - bottom = ROI[i]['Bottom'] - top = ROI[i]['Top'] - Label = ROI[i]['Label'] - rows = top-bottom - cols = right-left + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + Label = ROI[i]['Label'] + rows = top-bottom + cols = right-left label_region = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) source_region = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) laws_block = NP.zeros(layers*rows*cols, dtype=NP.float32).reshape(layers, rows, cols) - # load the labeled region - label_region[0:rows, 0:cols][label_image[bottom:top, left:right]==Label] = 1 - source_region[0:rows, 0:cols] = raw_image[bottom:top, left:right] + # load the labeled region + label_region[0:rows, 0:cols][label_image[bottom:top, left:right]==Label] = 1 + source_region[0:rows, 0:cols] = raw_image[bottom:top, left:right] - S.laws_texture_metric(label_region, source_region, laws_block, laws_kernel['numKernels'], - laws_kernel['kernelSize'], laws_kernel['filters'], - laws_kernel['coefficients'][0], laws_kernel['coefficients'][1], - laws_kernel['coefficients'][2], laws_kernel['coefficients'][3], - laws_kernel['coefficients'][4], laws_kernel['coefficients'][5]) + S.laws_texture_metric(label_region, source_region, laws_block, laws_kernel['numKernels'], + laws_kernel['kernelSize'], laws_kernel['filters'], + laws_kernel['coefficients'][0], laws_kernel['coefficients'][1], + laws_kernel['coefficients'][2], laws_kernel['coefficients'][3], + laws_kernel['coefficients'][4], laws_kernel['coefficients'][5]) for j in filters: - # compute the energy measure for each filter in the ROI - mask_image = laws_block[j, :, :][label_region[:, :]>0] - mean = abs(mask_image.mean()) - std = mask_image.std() - if mean > dc_thres: - mean = 0.0 - std = 0.0 - if mean_feature == 1: - ROI[i]['TEM'][j] = mean + # compute the energy measure for each filter in the ROI + mask_image = laws_block[j, :, :][label_region[:, :]>0] + mean = abs(mask_image.mean()) + std = mask_image.std() + if mean > dc_thres: + mean = 0.0 + std = 0.0 + if mean_feature == 1: + ROI[i]['TEM'][j] = mean else: - ROI[i]['TEM'][j] = std + ROI[i]['TEM'][j] = std - ROI[i]['TEM'][:] = ROI[i]['TEM'][:] / ROI[i]['TEM'][:].max() + ROI[i]['TEM'][:] = ROI[i]['TEM'][:] / ROI[i]['TEM'][:].max() # accumulate the 21 Law's filtered ROI's and optional - # return as image (3D) + # return as image (3D) laws_image_list[i] = laws_block if verbose == 1: - return laws_image_list + return laws_image_list else: return @@ -923,13 +923,13 @@ if ROI==None: ROIList = NP.zeros(1, dtype=_objstruct) if dimensions == 2: - [rows, cols] = label_image.shape + [rows, cols] = label_image.shape ROIList['Left'] = 1 ROIList['Right'] = cols-1 ROIList['Bottom'] = 1 ROIList['Top'] = rows-1 elif dimensions == 3: - [layers, rows, cols] = label_image.shape + [layers, rows, cols] = label_image.shape ROIList['Left'] = 1 ROIList['Right'] = cols-1 ROIList['Bottom'] = 1 @@ -942,34 +942,34 @@ inflate = 1 for i in indices: if dimensions == 2: - left = ROI[i]['Left'] - right = ROI[i]['Right'] - bottom = ROI[i]['Bottom'] - top = ROI[i]['Top'] - Label = ROI[i]['Label'] - rows = top-bottom-1 - cols = right-left-1 + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + Label = ROI[i]['Label'] + rows = top-bottom-1 + cols = right-left-1 section= NP.zeros(rows*cols, dtype=raw_image.dtype).reshape(rows, cols) - section = raw_image[bottom:top, left:right] \ - [label_image[bottom:top, left:right]==Label] + section = raw_image[bottom:top, left:right] \ + [label_image[bottom:top, left:right]==Label] elif dimensions == 3: - left = ROI[i]['Left'] - right = ROI[i]['Right'] - bottom = ROI[i]['Bottom'] - top = ROI[i]['Top'] - front = ROI[i]['Front'] - back = ROI[i]['Back'] - Label = ROI[i]['Label'] - rows = top-bottom-1 - cols = right-left-1 - layers = back-front-1 + left = ROI[i]['Left'] + right = ROI[i]['Right'] + bottom = ROI[i]['Bottom'] + top = ROI[i]['Top'] + front = ROI[i]['Front'] + back = ROI[i]['Back'] + Label = ROI[i]['Label'] + rows = top-bottom-1 + cols = right-left-1 + layers = back-front-1 section= NP.zeros(layers*rows*cols, dtype=raw_image.dtype).reshape(layers, rows, cols) - section = raw_image[front:back, bottom:top, left:right] \ - [label_image[front:back, bottom:top, left:right]==Label] + section = raw_image[front:back, bottom:top, left:right] \ + [label_image[front:back, bottom:top, left:right]==Label] - mask = section[section>0] - ROI[i]['voxelMean'] = mask.mean() - ROI[i]['voxelVar'] = mask.std() + mask = section[section>0] + ROI[i]['voxelMean'] = mask.mean() + ROI[i]['voxelVar'] = mask.std() return @@ -1021,17 +1021,17 @@ indices = range(0, groups) for i in indices: - ROIList[i]['Left'] = c_ext_ROI[i]['Left'] - ROIList[i]['Right'] = c_ext_ROI[i]['Right'] - ROIList[i]['Bottom'] = c_ext_ROI[i]['Bottom'] - ROIList[i]['Top'] = c_ext_ROI[i]['Top'] - ROIList[i]['Front'] = c_ext_ROI[i]['Front'] - ROIList[i]['Back'] = c_ext_ROI[i]['Back'] - ROIList[i]['Label'] = c_ext_ROI[i]['Label'] - ROIList[i]['Mass'] = c_ext_ROI[i]['Mass'] - ROIList[i]['cX'] = c_ext_ROI[i]['cX'] - ROIList[i]['cY'] = c_ext_ROI[i]['cY'] - ROIList[i]['cZ'] = c_ext_ROI[i]['cZ'] + ROIList[i]['Left'] = c_ext_ROI[i]['Left'] + ROIList[i]['Right'] = c_ext_ROI[i]['Right'] + ROIList[i]['Bottom'] = c_ext_ROI[i]['Bottom'] + ROIList[i]['Top'] = c_ext_ROI[i]['Top'] + ROIList[i]['Front'] = c_ext_ROI[i]['Front'] + ROIList[i]['Back'] = c_ext_ROI[i]['Back'] + ROIList[i]['Label'] = c_ext_ROI[i]['Label'] + ROIList[i]['Mass'] = c_ext_ROI[i]['Mass'] + ROIList[i]['cX'] = c_ext_ROI[i]['cX'] + ROIList[i]['cY'] = c_ext_ROI[i]['cY'] + ROIList[i]['cZ'] = c_ext_ROI[i]['cZ'] return ROIList[ROIList['Mass']>dust] @@ -1052,8 +1052,8 @@ mask : {int} the size of the 2D or 3D connectivity mask. For 2D this is 1, 4 or 8. - For 3D this is 1, 6, 14 or 28. Mask = 1 is ANY connection in 3x3 - or 3x3x3 mask for 2D or 3D, respectively. + For 3D this is 1, 6, 14 or 28. Mask = 1 is ANY connection in 3x3 + or 3x3x3 mask for 2D or 3D, respectively. Returns ---------- @@ -1069,17 +1069,17 @@ dimensions = binary_edge_image.ndim if dimensions == 2: if mask != 1 and mask != 4 and mask != 8: - mask = 1 + mask = 1 [rows, cols] = binary_edge_image.shape labeled_edge_image_or_vol = NP.zeros(rows*cols, dtype=NP.uint16).reshape(rows, cols) elif dimensions == 3: if mask != 1 and mask != 6 and mask != 14 and mask != 28: - mask = 1 + mask = 1 [layers, rows, cols] = binary_edge_image.shape labeled_edge_image_or_vol = NP.zeros(layers*rows*cols, dtype=NP.uint16).reshape(layers, rows, cols) else: labeled_edge_image_or_vol = None - groups = 0 + groups = 0 return labeled_edge_image_or_vol, groups groups = S.get_blobs(binary_edge_image, labeled_edge_image_or_vol, mask) @@ -1182,7 +1182,7 @@ conv_binary : {0, 1}, optional flag to convert edge_filter image to binary valued. default - is binary conversion off + is binary conversion off Returns ---------- @@ -1194,14 +1194,14 @@ # make sure the input is 16 bits. this is input to edge machine # so can handle raw and 8 bit scaled inputs if high_threshold==0: - # default to the maximum value of the image + # default to the maximum value of the image high_threshold = slice.max() slice = slice.astype(NP.int16) [rows, cols] = slice.shape edge_image = NP.zeros(rows*cols, dtype=NP.float64).reshape(rows, cols) S.edge_prefilter(low_threshold, high_threshold, filter['kernelSize'], filter['kernel'], - slice, edge_image) + slice, edge_image) if conv_binary == 1: edge_image[edge_image>0] = 1 @@ -1220,7 +1220,7 @@ ROI : {dictionary} the ROI is the automatically extracted blob regions of interest - and contains the rectangular bounding box of each blob. + and contains the rectangular bounding box of each blob. Returns ---------- @@ -1231,8 +1231,8 @@ """ max_index = ROI[:]['Mass'].argmax() bounding_box = {'Left' : ROI[max_index]['Left'], 'Right' : ROI[max_index]['Right'], - 'Top' : ROI[max_index]['Top'], 'Bottom' : ROI[max_index]['Bottom'], - 'Label' : ROI[max_index]['Label']} + 'Top' : ROI[max_index]['Top'], 'Bottom' : ROI[max_index]['Bottom'], + 'Label' : ROI[max_index]['Label']} return bounding_box @@ -1247,7 +1247,7 @@ ROI : {dictionary} the ROI is the automatically extracted blob regions of interest - and contains the rectangular bounding box of each blob. + and contains the rectangular bounding box of each blob. Returns ---------- @@ -1265,10 +1265,10 @@ ('bottom', 'i')]) measures = NP.zeros(number, dtype=_shortstruct) for i in indices: - measures[i]['left'] = ROI[i]['Left'] - measures[i]['right'] = ROI[i]['Right'] - measures[i]['top'] = ROI[i]['Top'] - measures[i]['bottom'] = ROI[i]['Bottom'] + measures[i]['left'] = ROI[i]['Left'] + measures[i]['right'] = ROI[i]['Right'] + measures[i]['top'] = ROI[i]['Top'] + measures[i]['bottom'] = ROI[i]['Bottom'] return measures @@ -1338,11 +1338,11 @@ ---------- gWdith : {int}, optional width of derivative of Gaussian kernel. - default value is 20 + default value is 20 sigma : {float}, optional sigma term of derivative of Gaussian kernel - default value is 1.0 + default value is 1.0 Returns ---------- @@ -1515,7 +1515,7 @@ coefficients[5, :] = (-1.0, 6.0, -15.0, 20.0, -15.0, 6.0, -1.0) LAWSFilter= {'numKernels' : 6, 'kernelSize' : 7, 'filters' : 21, - 'coefficients': coefficients, 'names': names} + 'coefficients': coefficients, 'names': names} return LAWSFilter @@ -1561,17 +1561,17 @@ mask_array = {} count = 0 for i in outer_indices: - rowFilter = LAWSFilter['coefficients'][i] - colFilter = LAWSFilter['coefficients'][i] - matrix = NP.outer(rowFilter, colFilter) - mask_array[count] = 2.0*matrix - count = count + 1 + rowFilter = LAWSFilter['coefficients'][i] + colFilter = LAWSFilter['coefficients'][i] + matrix = NP.outer(rowFilter, colFilter) + mask_array[count] = 2.0*matrix + count = count + 1 inner_indices = range(i+1, LAWSFilter['numKernels']) for j in inner_indices: - colFilter = LAWSFilter['coefficients'][j] - matrix = NP.outer(rowFilter, colFilter) + NP.outer(colFilter, rowFilter) - mask_array[count] = matrix - count = count + 1 + colFilter = LAWSFilter['coefficients'][j] + matrix = NP.outer(rowFilter, colFilter) + NP.outer(colFilter, rowFilter) + mask_array[count] = matrix + count = count + 1 return mask_array @@ -1640,12 +1640,12 @@ center_y = cols / 4 for i in y_indices: - x = math.sqrt(float(radius)**2 - float(i)**2) - # different raw mean levels - test_image[1*center_y+i, 1*center_x-x:1*center_x+x] = 80 - test_image[1*center_y+i, 3*center_x-x:3*center_x+x] = 90 - test_image[3*center_y+i, 1*center_x-x:1*center_x+x] = 100 - test_image[3*center_y+i, 3*center_x-x:3*center_x+x] = 110 + x = math.sqrt(float(radius)**2 - float(i)**2) + # different raw mean levels + test_image[1*center_y+i, 1*center_x-x:1*center_x+x] = 80 + test_image[1*center_y+i, 3*center_x-x:3*center_x+x] = 90 + test_image[3*center_y+i, 1*center_x-x:1*center_x+x] = 100 + test_image[3*center_y+i, 3*center_x-x:3*center_x+x] = 110 return test_image @@ -1676,10 +1676,10 @@ center_y = cols / 4 for i in y_indices: - x = math.sqrt(float(radius)**2 - float(i)**2) - # different raw mean levels - test_image[1*center_y+i, 1*center_x-x:1*center_x+x] = 100 - test_image[3*center_y+i, 3*center_x-x:3*center_x+x] = 100 + x = math.sqrt(float(radius)**2 - float(i)**2) + # different raw mean levels + test_image[1*center_y+i, 1*center_x-x:1*center_x+x] = 100 + test_image[3*center_y+i, 3*center_x-x:3*center_x+x] = 100 return test_image Modified: trunk/scipy/ndimage/tests/test_segment.py =================================================================== --- trunk/scipy/ndimage/tests/test_segment.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/ndimage/tests/test_segment.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -37,13 +37,13 @@ filter = seg.build_2d_kernel(hiFilterCutoff=60.0) img = seg.build_test_discs() disc_mask = seg.pre_filter(img, filter, low_threshold=50, high_threshold=255, - conv_binary=1) + conv_binary=1) label_disc_mask, disc_mask_groups = seg.get_blobs(disc_mask) disc_ROI = seg.get_blob_regions(label_disc_mask, disc_mask_groups) laws_kernel = seg.build_laws_kernel() impulse = seg.build_test_impulses() calib = seg.laws_texture_filter(impulse, label_disc_mask, laws_kernel, - ROI=disc_ROI, verbose=1) + ROI=disc_ROI, verbose=1) kernels = calib[0] x = laws_kernel['coefficients'][0] m = NP.outer(x, x) @@ -57,13 +57,13 @@ img = seg.build_test_unit_discs() disc = seg.pre_filter(img, filter, low_threshold=50, high_threshold=255) disc_mask = seg.pre_filter(img, filter, low_threshold=50, high_threshold=255, - conv_binary=1) + conv_binary=1) label_disc_mask, disc_mask_groups = seg.get_blobs(disc_mask) disc_ROI = seg.get_blob_regions(label_disc_mask, disc_mask_groups) laws_kernel = seg.build_laws_kernel() texture_img = seg.build_test_texture_discs() seg.laws_texture_filter(texture_img, label_disc_mask, laws_kernel, ROI=disc_ROI, - mean_feature=1, verbose=0) + mean_feature=1, verbose=0) tem = disc_ROI['TEM'] return tem @@ -87,72 +87,72 @@ truth[3] = (332, 435, 435, 333) match = (truth==measures).all() assert_equal(match, True) - # load the ground truth for the bounding box test image mean value - voxel_truth = NP.zeros(number, dtype=NP.float64) - voxel_truth = (80.0, 90.0, 100.0, 110.0) - match = (voxel_truth==voxel_means).all() - assert_equal(match, True) + # load the ground truth for the bounding box test image mean value + voxel_truth = NP.zeros(number, dtype=NP.float64) + voxel_truth = (80.0, 90.0, 100.0, 110.0) + match = (voxel_truth==voxel_means).all() + assert_equal(match, True) return def test_canny(self): # generate 4 discs, find the bounding boxes and # confirm the bounding boxes are at the true position - measures, voxel_means = run_canny() - number = measures.size - _shortstruct = NP.dtype([('left', 'i'), - ('right', 'i'), - ('top', 'i'), - ('bottom', 'i')]) + measures, voxel_means = run_canny() + number = measures.size + _shortstruct = NP.dtype([('left', 'i'), + ('right', 'i'), + ('top', 'i'), + ('bottom', 'i')]) - assert_equal(number, 4) - # load the ground truth for the bounding box - truth = NP.zeros(number, dtype=_shortstruct) - truth[0] = (78, 177, 177, 79) - truth[1] = (334, 433, 177, 79) - truth[2] = (78, 177, 433, 335) - truth[3] = (334, 433, 433, 335) - match = (truth==measures).all() - assert_equal(match, True) - # load the ground truth for the bounding box test image mean value - voxel_truth = NP.zeros(number, dtype=NP.float64) - voxel_truth = (80.0, 90.0, 100.0, 110.0) - match = (voxel_truth==voxel_means).all() - assert_equal(match, True) + assert_equal(number, 4) + # load the ground truth for the bounding box + truth = NP.zeros(number, dtype=_shortstruct) + truth[0] = (78, 177, 177, 79) + truth[1] = (334, 433, 177, 79) + truth[2] = (78, 177, 433, 335) + truth[3] = (334, 433, 433, 335) + match = (truth==measures).all() + assert_equal(match, True) + # load the ground truth for the bounding box test image mean value + voxel_truth = NP.zeros(number, dtype=NP.float64) + voxel_truth = (80.0, 90.0, 100.0, 110.0) + match = (voxel_truth==voxel_means).all() + assert_equal(match, True) - return + return def test_texture1(self): - # [1] texture1 is delta functions and confirm the - # filter result is outer product of the L kernel - M, Laws_LL = run_texture1() - match = (Laws_LL==M).all() - assert_equal(match, True) - return + # [1] texture1 is delta functions and confirm the + # filter result is outer product of the L kernel + M, Laws_LL = run_texture1() + match = (Laws_LL==M).all() + assert_equal(match, True) + return def test_texture2(self): - # [2] texture2 is 2 plane waves and assert the 20-element feature - # vector for each disc is correct - tem = run_texture2() - tem0 = tem[0] - tem1 = tem[1] - truth_tem0 = NP.array( - [ 0. , 0. , 0. , 0. , 0. , + # [2] texture2 is 2 plane waves and assert the 20-element feature + # vector for each disc is correct + tem = run_texture2() + tem0 = tem[0] + tem1 = tem[1] + truth_tem0 = NP.array( + [ 0. , 0. , 0. , 0. , 0. , 0. , 0.13306101, 0.08511007, 0.05084148, 0.07550675, 0.4334695 , 0.03715914, 0.00289055, 0.02755581, 0.48142046, 0.03137803, 0.00671277, 0.51568902, 0.01795249, 0.49102375, 1. ], dtype=NP.float32) - truth_tem1 = NP.array( + truth_tem1 = NP.array( [ 0. , 0. , 0. , 0. , 0. , 0. , 0.02970393, 0.00164266, 0.00922416, 0.01221788, 0.51485199, 0.03298925, 0.02212243, 0.01912871, 0.48350537, 0.01125561, 0.00826189, 0.49437219, 0.00526817, 0.49736592, 1. ], dtype=NP.float32) - assert_array_almost_equal(tem0, truth_tem0, decimal=6) - assert_array_almost_equal(tem1, truth_tem1, decimal=6) + assert_array_almost_equal(tem0, truth_tem0, decimal=6) + assert_array_almost_equal(tem1, truth_tem1, decimal=6) - return + return if __name__ == "__main__": inittest.main() Modified: trunk/scipy/optimize/slsqp.py =================================================================== --- trunk/scipy/optimize/slsqp.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/optimize/slsqp.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,5 +1,5 @@ """This module implements the Sequential Least SQuares Programming optimization -algorithm (SLSQP), orginally developed by Dieter Kraft. +algorithm (SLSQP), orginally developed by Dieter Kraft. See http://www.netlib.org/toms/733 @@ -18,37 +18,37 @@ def approx_jacobian(x,func,epsilon,*args): """Approximate the Jacobian matrix of callable function func - + *Parameters*: - x - The state vector at which the Jacobian matrix is desired + x - The state vector at which the Jacobian matrix is desired func - A vector-valued function of the form f(x,*args) epsilon - The peturbation used to determine the partial derivatives *args - Additional arguments passed to func - + *Returns*: - An array of dimensions (lenf, lenx) where lenf is the length - of the outputs of func, and lenx is the number of - + An array of dimensions (lenf, lenx) where lenf is the length + of the outputs of func, and lenx is the number of + *Notes*: The approximation is done using forward differences - + """ x0 = asfarray(x) f0 = func(*((x0,)+args)) jac = zeros([len(x0),len(f0)]) dx = zeros(len(x0)) for i in range(len(x0)): - dx[i] = epsilon - jac[i] = (func(*((x0+dx,)+args)) - f0)/epsilon - dx[i] = 0.0 + dx[i] = epsilon + jac[i] = (func(*((x0+dx,)+args)) - f0)/epsilon + dx[i] = 0.0 return jac.transpose() def fmin_slsqp( func, x0 , eqcons=[], f_eqcons=None, ieqcons=[], f_ieqcons=None, - bounds = [], fprime = None, fprime_eqcons=None, - fprime_ieqcons=None, args = (), iter = 100, acc = 1.0E-6, + bounds = [], fprime = None, fprime_eqcons=None, + fprime_ieqcons=None, args = (), iter = 100, acc = 1.0E-6, iprint = 1, full_output = 0, epsilon = _epsilon ): """ Minimize a function using Sequential Least SQuares Programming @@ -86,12 +86,12 @@ A function of the form f(x, *args) that returns the m by n array of equality constraint normals. If not provided, the normals will be approximated. The array returned by - fprime_eqcons should be sized as ( len(eqcons), len(x0) ). + fprime_eqcons should be sized as ( len(eqcons), len(x0) ). fprime_ieqcons : callable f(x,*args) A function of the form f(x, *args) that returns the m by n array of inequality constraint normals. If not provided, the normals will be approximated. The array returned by - fprime_ieqcons should be sized as ( len(ieqcons), len(x0) ). + fprime_ieqcons should be sized as ( len(ieqcons), len(x0) ). args : sequence Additional arguments passed to func and fprime. iter : int @@ -150,9 +150,9 @@ 7 : "Rank-deficient equality constraint subproblem HFTI", 8 : "Positive directional derivative for linesearch", 9 : "Iteration limit exceeded" } - - # Now do a lot of function wrapping + # Now do a lot of function wrapping + # Wrap func feval, func = wrap_function(func, args) # Wrap fprime, if provided, or approx_fprime if not @@ -160,7 +160,7 @@ geval, fprime = wrap_function(fprime,args) else: geval, fprime = wrap_function(approx_fprime,(func,epsilon)) - + if f_eqcons: # Equality constraints provided via f_eqcons ceval, f_eqcons = wrap_function(f_eqcons,args) @@ -179,8 +179,8 @@ if eqcons[i]: # Wrap eqcons and eqcons_prime ceval, eqcons[i] = wrap_function(eqcons[i],args) - geval, eqcons_prime[i] = wrap_function(approx_fprime, - (eqcons[i],epsilon)) + geval, eqcons_prime[i] = wrap_function(approx_fprime, + (eqcons[i],epsilon)) if f_ieqcons: # Inequality constraints provided via f_ieqcons @@ -200,29 +200,29 @@ if ieqcons[i]: # Wrap ieqcons and ieqcons_prime ceval, ieqcons[i] = wrap_function(ieqcons[i],args) - geval, ieqcons_prime[i] = wrap_function(approx_fprime, - (ieqcons[i],epsilon)) - + geval, ieqcons_prime[i] = wrap_function(approx_fprime, + (ieqcons[i],epsilon)) + # Transform x0 into an array. x = asfarray(x0).flatten() # Set the parameters that SLSQP will need # meq = The number of equality constraints if f_eqcons: - meq = len(f_eqcons(x)) + meq = len(f_eqcons(x)) else: - meq = len(eqcons) + meq = len(eqcons) if f_ieqcons: - mieq = len(f_ieqcons(x)) + mieq = len(f_ieqcons(x)) else: - mieq = len(ieqcons) + mieq = len(ieqcons) # m = The total number of constraints - m = meq + mieq + m = meq + mieq # la = The number of constraints, or 1 if there are no constraints - la = array([1,m]).max() + la = array([1,m]).max() # n = The number of independent variables - n = len(x) + n = len(x) # Define the workspaces for SLSQP n1 = n+1 @@ -232,7 +232,7 @@ len_jw = mineq w = zeros(len_w) jw = zeros(len_jw) - + # Decompose bounds into xl and xu if len(bounds) == 0: bounds = [(-1.0E12, 1.0E12) for i in range(n)] @@ -241,15 +241,15 @@ 'SLSQP Error: If bounds is specified, len(bounds) == len(x0)' else: for i in range(len(bounds)): - if bounds[i][0] > bounds[i][1]: - raise ValueError, \ - 'SLSQP Error: lb > ub in bounds[' + str(i) +'] ' + str(bounds[4]) - + if bounds[i][0] > bounds[i][1]: + raise ValueError, \ + 'SLSQP Error: lb > ub in bounds[' + str(i) +'] ' + str(bounds[4]) + xl = array( [ b[0] for b in bounds ] ) - xu = array( [ b[1] for b in bounds ] ) - - + xu = array( [ b[1] for b in bounds ] ) + + # Initialize the iteration counter and the mode value mode = array(0,int) acc = array(acc,float) @@ -261,26 +261,26 @@ print "%5s %5s %16s %16s" % ("NIT","FC","OBJFUN","GNORM") while 1: - + if mode == 0 or mode == 1: # objective and constraint evaluation requird - + # Compute objective function fx = func(x) # Compute the constraints if f_eqcons: - c_eq = f_eqcons(x) + c_eq = f_eqcons(x) else: - c_eq = array([ eqcons[i](x) for i in range(meq) ]) + c_eq = array([ eqcons[i](x) for i in range(meq) ]) if f_ieqcons: - c_ieq = f_ieqcons(x) + c_ieq = f_ieqcons(x) else: - c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ]) - + c_ieq = array([ ieqcons[i](x) for i in range(len(ieqcons)) ]) + # Now combine c_eq and c_ieq into a single matrix if m == 0: # no constraints c = zeros([la]) - else: + else: # constraints exist if meq > 0 and mieq == 0: # only equality constraints @@ -290,29 +290,29 @@ c = c_ieq if meq > 0 and mieq > 0: # both equality and inequality constraints exist - c = append(c_eq, c_ieq) - + c = append(c_eq, c_ieq) + if mode == 0 or mode == -1: # gradient evaluation required - + # Compute the derivatives of the objective function # For some reason SLSQP wants g dimensioned to n+1 g = append(fprime(x),0.0) - # Compute the normals of the constraints + # Compute the normals of the constraints if fprime_eqcons: a_eq = fprime_eqcons(x) - else: + else: a_eq = zeros([meq,n]) for i in range(meq): - a_eq[i] = eqcons_prime[i](x) - + a_eq[i] = eqcons_prime[i](x) + if fprime_ieqcons: a_ieq = fprime_ieqcons(x) else: a_ieq = zeros([mieq,n]) for i in range(mieq): a_ieq[i] = ieqcons_prime[i](x) - + # Now combine a_eq and a_ieq into a single a matrix if m == 0: # no constraints @@ -325,9 +325,9 @@ a = a_ieq elif meq > 0 and mieq > 0: # both equality and inequality constraints exist - a = vstack((a_eq,a_ieq)) - a = concatenate((a,zeros([la,1])),1) - + a = vstack((a_eq,a_ieq)) + a = concatenate((a,zeros([la,1])),1) + # Call SLSQP slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw) Modified: trunk/scipy/sandbox/numexpr/__init__.py =================================================================== --- trunk/scipy/sandbox/numexpr/__init__.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sandbox/numexpr/__init__.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,4 +1,3 @@ from scipy.sandbox.numexpr.info import __doc__ from scipy.sandbox.numexpr.expressions import E from scipy.sandbox.numexpr.compiler import numexpr, disassemble, evaluate - Modified: trunk/scipy/sparse/base.py =================================================================== --- trunk/scipy/sparse/base.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/base.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -170,10 +170,10 @@ return '\n'.join( [ (' %s\t%s' % t) for t in triples] ) if nnz > maxprint: - half = maxprint // 2 + half = maxprint // 2 out = tostr(A.row[:half], A.col[:half], A.data[:half]) out += "\n :\t:\n" - half = maxprint - maxprint//2 + half = maxprint - maxprint//2 out += tostr(A.row[-half:], A.col[-half:], A.data[-half:]) else: out = tostr(A.row, A.col, A.data) @@ -230,7 +230,7 @@ def __rsub__(self, other): # other - self return self.tocsr().__rsub__(other) - + def multiply(self, other): """Point-wise multiplication by another matrix """ @@ -251,7 +251,7 @@ def __div__(self, other): # Always do true division return self.__truediv__(other) - + def __neg__(self): return -self.tocsr() @@ -278,7 +278,7 @@ other = int(other) if other < 0: raise ValueError,'exponent must be >= 0' - + if other == 0: from construct import identity return identity( self.shape[0], dtype=self.dtype ) @@ -391,12 +391,12 @@ def rmatvec(self, other, conjugate=True): """Multiplies the vector 'other' by the sparse matrix, returning a dense vector as a result. - + If 'conjugate' is True: - returns A.transpose().conj() * other Otherwise: - returns A.transpose() * other. - + """ return self.tocsr().rmatvec(other, conjugate=conjugate) @@ -420,7 +420,7 @@ def todok(self): return self.tocoo().todok() - + def tocoo(self): return self.tocsr().tocoo() @@ -429,10 +429,10 @@ def todia(self): return self.tocoo().todia() - + def tobsr(self,blocksize=None): return self.tocsr().tobsr(blocksize=blocksize) - + def copy(self): return self.__class__(self,copy=True) @@ -472,7 +472,7 @@ return self.sum(None) * 1.0 / (self.shape[0]*self.shape[1]) else: raise ValueError, "axis out of bounds" - + def diagonal(self): """Returns the main diagonal of the matrix """ @@ -526,4 +526,3 @@ return _isinstance(x, spmatrix) issparse = isspmatrix - Modified: trunk/scipy/sparse/bsr.py =================================================================== --- trunk/scipy/sparse/bsr.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/bsr.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -36,9 +36,9 @@ where ``data`` and ``ij`` satisfy ``a[ij[0, k], ij[1, k]] = data[k]`` bsr_matrix((data, indices, indptr), [shape=(M, N)]) - is the standard BSR representation where the block column - indices for row i are stored in ``indices[indptr[i]:indices[i+1]]`` - and their corresponding block values are stored in + is the standard BSR representation where the block column + indices for row i are stored in ``indices[indptr[i]:indices[i+1]]`` + and their corresponding block values are stored in ``data[ indptr[i]: indptr[i+1] ]``. If the shape parameter is not supplied, the matrix dimensions are inferred from the index arrays. @@ -49,20 +49,20 @@ - The Block Compressed Row (BSR) format is very similar to the Compressed Sparse Row (CSR) format. BSR is appropriate for sparse matrices with dense sub matrices like the last example - below. Block matrices often arise in vector-valued finite + below. Block matrices often arise in vector-valued finite element discretizations. In such cases, BSR is considerably more efficient than CSR and CSC for many sparse arithmetic operations. Blocksize - - The blocksize (R,C) must evenly divide the shape of + - The blocksize (R,C) must evenly divide the shape of the matrix (M,N). That is, R and C must satisfy the relationship M % R = 0 and N % C = 0. - If no blocksize is specified, a simple heuristic is applied to determine an appropriate blocksize. - + Examples -------- @@ -80,7 +80,7 @@ matrix([[1, 0, 2], [0, 0, 3], [4, 5, 6]]) - + >>> indptr = array([0,2,3,6]) >>> indices = array([0,2,2,0,1,2]) >>> data = array([1,2,3,4,5,6]).repeat(4).reshape(6,2,2) @@ -91,19 +91,19 @@ [0, 0, 0, 0, 3, 3], [4, 4, 5, 5, 6, 6], [4, 4, 5, 5, 6, 6]]) - + """ def __init__(self, arg1, shape=None, dtype=None, copy=False, blocksize=None): _data_matrix.__init__(self) - + if isspmatrix(arg1): if arg1.format == self.format and copy: arg1 = arg1.copy() else: arg1 = getattr(arg1,'to' + self.format)(blocksize=blocksize) self._set_self( arg1 ) - + elif isinstance(arg1,tuple): if isshape(arg1): #it's a tuple of matrix dimensions (M,N) @@ -118,13 +118,13 @@ blocksize = tuple(blocksize) self.data = zeros( (0,) + blocksize, getdtype(dtype, default=float) ) self.indices = zeros( 0, dtype=intc ) - + R,C = blocksize if (M % R) != 0 or (N % C) != 0: raise ValueError, 'shape must be multiple of blocksize' self.indptr = zeros(M/R + 1, dtype=intc ) - + elif len(arg1) == 2: # (data,(row,col)) format from coo import coo_matrix @@ -241,12 +241,12 @@ def _get_blocksize(self): return self.data.shape[1:] blocksize = property(fget=_get_blocksize) - + def getnnz(self): R,C = self.blocksize return self.indptr[-1] * R * C nnz = property(fget=getnnz) - + def __repr__(self): nnz = self.getnnz() format = self.getformat() @@ -275,7 +275,7 @@ def __getitem__(self,key): raise NotImplementedError - + def __setitem__(self,key,val): raise NotImplementedError @@ -286,13 +286,13 @@ def matvec(self, other, output=None): """Sparse matrix vector product (self * other) - 'other' may be a rank 1 array of length N or a rank 2 array - or matrix with shape (N,1). - + 'other' may be a rank 1 array of length N or a rank 2 array + or matrix with shape (N,1). + If the optional 'output' parameter is defined, it will be used to store the result. Otherwise, a new vector will be allocated. - + """ if isdense(other): M,N = self.shape @@ -300,7 +300,7 @@ if other.shape != (N,) and other.shape != (N,1): raise ValueError, "dimension mismatch" - + #output array if output is None: y = zeros( self.shape[0], dtype=upcast(self.dtype,other.dtype) ) @@ -314,8 +314,8 @@ "dtype=%s is required" % \ (output.dtype,upcast(self.dtype,other.dtype)) y = output - - + + bsr_matvec(M/R, N/C, R, C, \ self.indptr, self.indices, ravel(self.data), ravel(other), y) @@ -343,9 +343,9 @@ raise ValueError, "shape mismatch error" indptr = empty_like( self.indptr ) - + R,n = self.blocksize - + #convert to this format if isspmatrix_bsr(other): C = other.blocksize[1] @@ -373,7 +373,7 @@ self.indptr, self.indices, ravel(self.data), \ other.indptr, other.indices, ravel(other.data), \ indptr, indices, data) - + data = data.reshape(-1,R,C) #TODO eliminate zeros @@ -386,11 +386,11 @@ else: raise TypeError, "need a dense or sparse matrix" - + ###################### # Conversion methods # ###################### - + def tobsr(self,blocksize=None,copy=False): if blocksize not in [None, self.blocksize]: return self.tocsr().tobsr(blocksize=blocksize) @@ -412,14 +412,14 @@ When copy=False the data array will be shared between this matrix and the resultant coo_matrix. """ - + M,N = self.shape R,C = self.blocksize row = (R * arange(M/R)).repeat(diff(self.indptr)) row = row.repeat(R*C).reshape(-1,R,C) row += tile( arange(R).reshape(-1,1), (1,C) ) - row = row.reshape(-1) + row = row.reshape(-1) col = (C * self.indices).repeat(R*C).reshape(-1,R,C) col += tile( arange(C), (R,1) ) @@ -435,11 +435,11 @@ def transpose(self): - + R,C = self.blocksize M,N = self.shape NBLK = self.nnz/(R*C) - + if self.nnz == 0: return bsr_matrix((N,M),blocksize=(C,R)) @@ -452,18 +452,18 @@ indptr, indices, data.ravel()) return bsr_matrix( (data,indices,indptr), shape=(N,M) ) - - - ############################################################## + + + ############################################################## # methods that examine or modify the internal data structure # ############################################################## - + def eliminate_zeros(self): R,C = self.blocksize M,N = self.shape mask = (self.data != 0).reshape(-1,R*C).sum(axis=1) #nonzero blocks - + nonzero_blocks = mask.nonzero()[0] if len(nonzero_blocks) == 0: @@ -476,7 +476,7 @@ # modifies self.indptr and self.indices *in place* proxy = csr_matrix((mask,self.indices,self.indptr),shape=(M/R,N/C)) proxy.eliminate_zeros() - + self.prune() @@ -505,17 +505,17 @@ if len(self.indptr) != M/R + 1: raise ValueError, "index pointer has invalid length" - + bnnz = self.indptr[-1] - if len(self.indices) < bnnz: + if len(self.indices) < bnnz: raise ValueError, "indices array has too few elements" if len(self.data) < bnnz: raise ValueError, "data array has too few elements" self.data = self.data[:bnnz] self.indices = self.indices[:bnnz] - + # utility functions def _binopt(self, other, op, in_shape=None, out_shape=None): """apply the binary operation fn to two sparse matrices""" @@ -525,15 +525,15 @@ in_shape = self.shape if out_shape is None: out_shape = self.shape - + self.sort_indices() other.sort_indices() # e.g. bsr_plus_bsr, etc. fn = getattr(sparsetools, self.format + op + self.format) - - R,C = self.blocksize + R,C = self.blocksize + max_bnnz = len(self.data) + len(other.data) indptr = empty_like(self.indptr) indices = empty( max_bnnz, dtype=intc ) @@ -543,7 +543,7 @@ self.indptr, self.indices, ravel(self.data), other.indptr, other.indices, ravel(other.data), indptr, indices, data) - + actual_bnnz = indptr[-1] indices = indices[:actual_bnnz] data = data[:R*C*actual_bnnz] @@ -570,7 +570,7 @@ shape=self.shape,dtype=data.dtype) - + # # these functions are used by the parent class # # to remove redudancy between bsc_matrix and bsr_matrix # def _swap(self,x): @@ -583,4 +583,3 @@ def isspmatrix_bsr(x): return _isinstance(x, bsr_matrix) - Modified: trunk/scipy/sparse/compressed.py =================================================================== --- trunk/scipy/sparse/compressed.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/compressed.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,4 +1,4 @@ -"""Base class for sparse matrix formats using compressed storage +"""Base class for sparse matrix formats using compressed storage """ __all__ = [] @@ -20,14 +20,14 @@ class _cs_matrix(_data_matrix): """base matrix class for compressed row and column oriented matrices""" - + def __init__(self, arg1, shape=None, dtype=None, copy=False, dims=None, nzmax=None): _data_matrix.__init__(self) if dims is not None: warn("dims= is deprecated, use shape= instead", DeprecationWarning) shape=dims - + if nzmax is not None: warn("nzmax= is deprecated", DeprecationWarning) @@ -93,8 +93,8 @@ def getnnz(self): return self.indptr[-1] nnz = property(fget=getnnz) - - + + def _set_self(self, other, copy=False): """take the member variables of other and assign them to self""" @@ -105,7 +105,7 @@ self.indices = other.indices self.indptr = other.indptr self.shape = other.shape - + def check_format(self, full_check=True): """check whether the matrix format is valid @@ -186,7 +186,7 @@ elif isspmatrix(other): if (other.shape != self.shape): raise ValueError, "inconsistent shapes" - + return self._binopt(other,'_plus_') elif isdense(other): # Convert this matrix to a dense matrix and add them @@ -254,12 +254,12 @@ elif isspmatrix(other): if (other.shape != self.shape): raise ValueError, "inconsistent shapes" - + return self._binopt(other,'_eldiv_') else: raise NotImplementedError - + def multiply(self, other): """Point-wise multiplication by another matrix """ @@ -281,15 +281,15 @@ #return self._binopt(other,'mu',in_shape=(M,N),out_shape=(M,N)) - major_axis = self._swap((M,N))[0] + major_axis = self._swap((M,N))[0] indptr = empty( major_axis + 1, dtype=intc ) - + other = self.__class__(other) #convert to this format fn = getattr(sparsetools, self.format + '_matmat_pass1') fn( M, N, self.indptr, self.indices, \ other.indptr, other.indices, \ indptr) - + nnz = indptr[-1] indices = empty( nnz, dtype=intc) data = empty( nnz, dtype=upcast(self.dtype,other.dtype)) @@ -298,7 +298,7 @@ fn( M, N, self.indptr, self.indices, self.data, \ other.indptr, other.indices, other.data, \ indptr, indices, data) - + return self.__class__((data,indices,indptr),shape=(M,N)) @@ -313,9 +313,9 @@ def matvec(self, other, output=None): """Sparse matrix vector product (self * other) - 'other' may be a rank 1 array of length N or a rank 2 array - or matrix with shape (N,1). - + 'other' may be a rank 1 array of length N or a rank 2 array + or matrix with shape (N,1). + """ #If the optional 'output' parameter is defined, it will #be used to store the result. Otherwise, a new vector @@ -329,7 +329,7 @@ # csrmux, cscmux fn = getattr(sparsetools,self.format + '_matvec') - + #output array y = zeros( self.shape[0], dtype=upcast(self.dtype,other.dtype) ) @@ -367,12 +367,12 @@ def rmatvec(self, other, conjugate=True): """Multiplies the vector 'other' by the sparse matrix, returning a dense vector as a result. - + If 'conjugate' is True: - returns A.transpose().conj() * other Otherwise: - returns A.transpose() * other. - + """ if conjugate: return self.transpose().conj().matvec( other ) @@ -382,7 +382,7 @@ @deprecate def getdata(self, ind): return self.data[ind] - + def diagonal(self): """Returns the main diagonal of the matrix """ @@ -407,12 +407,12 @@ ####################### # Getting and Setting # ####################### - + def __getitem__(self, key): if isinstance(key, tuple): row = key[0] col = key[1] - + #TODO implement CSR[ [1,2,3], X ] with sparse matmat #TODO make use of sorted indices @@ -434,8 +434,8 @@ return self[key, :] else: raise IndexError, "invalid index" - + def _get_single_element(self,row,col): M, N = self.shape if (row < 0): @@ -444,7 +444,7 @@ col += N if not (0<=row 0 - the k-th upper diagonal - k < 0 - the k-th lower diagonal - m, n : dimensions of the result - format : format of the result (e.g. "csr") - - By default (format=None) an appropriate sparse matrix + - By default (format=None) an appropriate sparse matrix format is returned. This choice is subject to change. See Also @@ -76,7 +76,7 @@ return identity( n, dtype=dtype, format='csr').asformat(format) def eye(m, n, k=0, dtype='d', format=None): - """eye(m, n) returns a sparse (m x n) matrix where the k-th diagonal + """eye(m, n) returns a sparse (m x n) matrix where the k-th diagonal is all ones and everything else is zeros. """ diags = ones((1, m), dtype=dtype) @@ -114,21 +114,21 @@ """ B = coo_matrix(B) - + if (format is None or format == "bsr") and 2*B.nnz >= B.shape[0] * B.shape[1]: #B is fairly dense, use BSR A = csr_matrix(A,copy=True) - + output_shape = (A.shape[0]*B.shape[0],A.shape[1]*B.shape[1]) if A.nnz == 0 or B.nnz == 0: # kronecker product is the zero matrix return coo_matrix( output_shape ) - + B = B.toarray() data = A.data.repeat(B.size).reshape(-1,B.shape[0],B.shape[1]) data = data * B - + return bsr_matrix((data,A.indices,A.indptr),shape=output_shape) else: #use COO @@ -162,9 +162,9 @@ def kronsum(A, B, format=None): """kronecker sum of sparse matrices A and B - Kronecker sum of two sparse matrices is a sum of two Kronecker + Kronecker sum of two sparse matrices is a sum of two Kronecker products kron(I_n,A) + kron(B,I_m) where A has shape (m,m) - and B has shape (n,n) and I_m and I_n are identity matrices + and B has shape (n,n) and I_m and I_n are identity matrices of shape (m,m) and (n,n) respectively. Parameters @@ -179,20 +179,20 @@ Examples ======== - + """ A = coo_matrix(A) B = coo_matrix(B) if A.shape[0] != A.shape[1]: raise ValueError('A is not square') - + if B.shape[0] != B.shape[1]: raise ValueError('B is not square') dtype = upcast(A.dtype,B.dtype) - L = kron(identity(B.shape[0],dtype=dtype), A, format=format) + L = kron(identity(B.shape[0],dtype=dtype), A, format=format) R = kron(B, identity(A.shape[0],dtype=dtype), format=format) return (L+R).asformat(format) #since L + R is not always same format @@ -204,12 +204,12 @@ Parameters ---------- - blocks + blocks sequence of sparse matrices with compatible shapes format : sparse format of the result (e.g. "csr") by default an appropriate sparse matrix format is returned. This choice is subject to change. - + Example ------- @@ -235,7 +235,7 @@ format : sparse format of the result (e.g. "csr") by default an appropriate sparse matrix format is returned. This choice is subject to change. - + Example ------- @@ -263,7 +263,7 @@ format : sparse format of the result (e.g. "csr") by default an appropriate sparse matrix format is returned. This choice is subject to change. - + Example ------- @@ -275,7 +275,7 @@ matrix([[1, 2, 5], [3, 4, 6], [0, 0, 7]]) - + >>> bmat( [[A,None],[None,C]] ).todense() matrix([[1, 2, 0], [3, 4, 0], @@ -283,7 +283,7 @@ """ - + blocks = asarray(blocks, dtype='object') if rank(blocks) != 2: @@ -321,8 +321,8 @@ raise ValueError('blocks[%d,:] is all None' % brow_lengths.argmin() ) if bcol_lengths.min() == 0: raise ValueError('blocks[:,%d] is all None' % bcol_lengths.argmin() ) - - nnz = sum([ A.nnz for A in blocks[block_mask] ]) + + nnz = sum([ A.nnz for A in blocks[block_mask] ]) if dtype is None: dtype = upcast( *tuple([A.dtype for A in blocks[block_mask]]) ) @@ -344,10 +344,10 @@ row[nnz:nnz + A.nnz] += row_offsets[i] col[nnz:nnz + A.nnz] += col_offsets[j] - + nnz += A.nnz - shape = (sum(brow_lengths),sum(bcol_lengths)) + shape = (sum(brow_lengths),sum(bcol_lengths)) return coo_matrix( (data, (row, col)), shape=shape ).asformat(format) @@ -371,7 +371,7 @@ Parameters ---------- - + r,c : int row and column-dimensions of the output. k : int @@ -434,4 +434,3 @@ out.rows[c-k].append(c) out.data[c-k].append(diag[ix]) return out - Modified: trunk/scipy/sparse/coo.py =================================================================== --- trunk/scipy/sparse/coo.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/coo.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -5,7 +5,7 @@ __all__ = ['coo_matrix', 'isspmatrix_coo'] from itertools import izip -from warnings import warn +from warnings import warn from numpy import array, asarray, empty, intc, zeros, \ unique, searchsorted, atleast_2d, empty_like, rank, \ @@ -39,7 +39,7 @@ 2. ij[0][:] the row indices of the matrix entries 3. ij[1][:] the column indices of the matrix entries - Where ``A[ij[0][k], ij[1][k] = data[k]``. When shape is + Where ``A[ij[0][k], ij[1][k] = data[k]``. When shape is not specified, it is inferred from the index arrays @@ -50,7 +50,7 @@ - facilitates fast conversion among sparse formats - permits duplicate entries (see example) - very fast conversion to and from CSR/CSC formats - + Disadvantages of the COO format - does not directly support: + arithmetic operations @@ -62,10 +62,10 @@ -------------- - COO is a fast format for constructing sparse matrices - - Once a matrix has been constructed, convert to CSR or + - Once a matrix has been constructed, convert to CSR or CSC format for fast arithmetic and matrix vector operations - - By default when converting to CSR or CSC format, duplicate (i,j) - entries will be summed together. This facilitates efficient + - By default when converting to CSR or CSC format, duplicate (i,j) + entries will be summed together. This facilitates efficient construction of finite element matrices and the like. (see example) @@ -97,7 +97,7 @@ [0, 2, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]) - + """ def __init__(self, arg1, shape=None, dtype=None, copy=False, dims=None): @@ -170,7 +170,7 @@ M = atleast_2d(asarray(arg1)) except: raise TypeError, "invalid input format" - + if len(M.shape) != 2: raise TypeError, "expected rank <= 2 array or matrix" self.shape = M.shape @@ -202,7 +202,7 @@ if self.col.dtype.kind != 'i': warn("col index array has non-integer dtype (%s) " \ % self.col.dtype.name ) - + # only support 32-bit ints for now self.row = asarray(self.row,dtype=intc) self.col = asarray(self.col,dtype=intc) @@ -228,7 +228,7 @@ @deprecate def getdata(self, num): return self.data[num] - + def transpose(self,copy=False): M,N = self.shape return coo_matrix((self.data,(self.col,self.row)),(N,M),copy=copy) @@ -242,7 +242,7 @@ def tocsc(self,sum_duplicates=True): """Return a copy of this matrix in Compressed Sparse Column format - By default sum_duplicates=True and any duplicate + By default sum_duplicates=True and any duplicate matrix entries are added together. """ @@ -266,7 +266,7 @@ def tocsr(self,sum_duplicates=True): """Return a copy of this matrix in Compressed Sparse Row format - By default sum_duplicates=True and any duplicate + By default sum_duplicates=True and any duplicate matrix entries are added together. """ @@ -286,8 +286,8 @@ if sum_duplicates: A.sum_duplicates() return A - + def tocoo(self, copy=False): if copy: return self.copy() @@ -297,7 +297,7 @@ def todia(self): from dia import dia_matrix - ks = self.col - self.row #the diagonal for each nonzero + ks = self.col - self.row #the diagonal for each nonzero diags = unique(ks) if len(diags) > 100: @@ -316,7 +316,7 @@ dok = dok_matrix((self.shape),dtype=self.dtype) - dok.update( izip(izip(self.row,self.col),self.data) ) + dok.update( izip(izip(self.row,self.col),self.data) ) return dok @@ -339,4 +339,3 @@ def isspmatrix_coo( x ): return _isinstance(x, coo_matrix) - Modified: trunk/scipy/sparse/csc.py =================================================================== --- trunk/scipy/sparse/csc.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/csc.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -37,8 +37,8 @@ where ``data`` and ``ij`` satisfy ``a[ij[0, k], ij[1, k]] = data[k]`` csc_matrix((data, indices, indptr), [shape=(M, N)]) - is the standard CSC representation where the row indices for - column i are stored in ``indices[indptr[i]:indices[i+1]]`` and their + is the standard CSC representation where the row indices for + column i are stored in ``indices[indptr[i]:indices[i+1]]`` and their corresponding values are stored in ``data[indptr[i]:indptr[i+1]]``. If the shape parameter is not supplied, the matrix dimensions are inferred from the index arrays. @@ -49,7 +49,7 @@ - efficient arithmetic operations CSC + CSC, CSC * CSC, etc. - efficient column slicing - fast matrix vector products (CSR, BSR may be faster) - + Disadvantages of the CSC format ------------------------------- - slow row slicing operations (consider CSR) @@ -114,7 +114,7 @@ return self.copy() else: return self - + def tocsr(self): indptr = empty(self.shape[0] + 1, dtype=intc) indices = empty(self.nnz, dtype=intc) @@ -137,11 +137,11 @@ col = key[1] if isintlike(row) or isinstance(row, slice): - return self.T[col,row].T - else: + return self.T[col,row].T + else: #[[1,2],??] or [[[1],[2]],??] if isintlike(col) or isinstance(col,slice): - return self.T[col,row].T + return self.T[col,row].T else: row = asarray(row, dtype='intc') col = asarray(col, dtype='intc') @@ -150,10 +150,10 @@ elif len(row.shape) == 2: row = row.reshape(-1) col = col.reshape(-1,1) - return self.T[col,row].T + return self.T[col,row].T else: raise NotImplementedError('unsupported indexing') - + return self.T[col,row].T elif isintlike(key) or isinstance(key,slice): return self.T[:,key].T #[i] or [1:2] @@ -173,4 +173,3 @@ def isspmatrix_csc(x): return _isinstance(x, csc_matrix) - Modified: trunk/scipy/sparse/csr.py =================================================================== --- trunk/scipy/sparse/csr.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/csr.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -39,8 +39,8 @@ where ``data`` and ``ij`` satisfy ``a[ij[0, k], ij[1, k]] = data[k]`` csr_matrix((data, indices, indptr), [shape=(M, N)]) - is the standard CSR representation where the column indices for - row i are stored in ``indices[indptr[i]:indices[i+1]]`` and their + is the standard CSR representation where the column indices for + row i are stored in ``indices[indptr[i]:indices[i+1]]`` and their corresponding values are stored in ``data[indptr[i]:indptr[i+1]]``. If the shape parameter is not supplied, the matrix dimensions are inferred from the index arrays. @@ -51,7 +51,7 @@ - efficient arithmetic operations CSR + CSR, CSR * CSR, etc. - efficient row slicing - fast matrix vector products - + Disadvantages of the CSR format - slow column slicing operations (consider CSC) - changes to the sparsity structure are expensive (consider LIL or DOK) @@ -73,7 +73,7 @@ matrix([[1, 0, 2], [0, 0, 3], [4, 5, 6]]) - + >>> indptr = array([0,2,3,6]) >>> indices = array([0,2,2,0,1,2]) >>> data = array([1,2,3,4,5,6]) @@ -108,9 +108,9 @@ def tolil(self): from lil import lil_matrix lil = lil_matrix(self.shape,dtype=self.dtype) - + self.sort_indices() #lil_matrix needs sorted rows - + ptr,ind,dat = self.indptr,self.indices,self.data rows, data = lil.rows, lil.data @@ -149,7 +149,7 @@ from spfuncs import estimate_blocksize return self.tobsr(blocksize=estimate_blocksize(self)) elif blocksize == (1,1): - arg1 = (self.data.reshape(-1,1,1),self.indices,self.indptr) + arg1 = (self.data.reshape(-1,1,1),self.indices,self.indptr) return bsr_matrix( arg1, shape=self.shape, copy=copy ) else: R,C = blocksize @@ -168,7 +168,7 @@ indptr, indices, data.ravel() ) return bsr_matrix( (data,indices,indptr), shape=self.shape ) - + # these functions are used by the parent class (_cs_matrix) # to remove redudancy between csc_matrix and csr_matrix def _swap(self,x): @@ -191,7 +191,7 @@ slicing of the form self[[1,2,3],:] """ indices = asindices(indices) - + max_indx = indices.max() if max_indx >= N: @@ -200,7 +200,7 @@ min_indx = indices.min() if min_indx < -N: raise IndexError('index (%d) out of range' % (N + min_indx)) - + if min_indx < 0: indices = indices.copy() indices[indices < 0] += N @@ -210,8 +210,8 @@ shape = (len(indices),N) return csr_matrix( (data,indices,indptr), shape=shape) - + if isinstance(key, tuple): row = key[0] col = key[1] @@ -225,7 +225,7 @@ else: P = extractor(col,self.shape[1]).T #[i,[1,2]] return self[row,:]*P - + elif isinstance(row, slice): #[1:2,??] if isintlike(col) or isinstance(col, slice): @@ -233,16 +233,16 @@ else: P = extractor(col,self.shape[1]).T #[1:2,[1,2]] return self[row,:]*P - - else: + + else: #[[1,2],??] or [[[1],[2]],??] if isintlike(col) or isinstance(col,slice): - P = extractor(row, self.shape[0]) #[[1,2],j] or [[1,2],1:2] - return (P*self)[:,col] + P = extractor(row, self.shape[0]) #[[1,2],j] or [[1,2],1:2] + return (P*self)[:,col] else: - row = asindices(row) - col = asindices(col) + row = asindices(row) + col = asindices(col) if len(row.shape) == 1: if len(row) != len(col): #[[1,2],[1,2]] raise IndexError('number of row and column indices differ') @@ -250,23 +250,23 @@ for i,j in zip(row,col): val.append(self._get_single_element(i,j)) return asmatrix(val) - + elif len(row.shape) == 2: row = ravel(row) #[[[1],[2]],[1,2]] - P = extractor(row, self.shape[0]) - return (P*self)[:,col] + P = extractor(row, self.shape[0]) + return (P*self)[:,col] else: raise NotImplementedError('unsupported indexing') - + elif isintlike(key) or isinstance(key,slice): return self[key,:] #[i] or [1:2] else: return self[asindices(key),:] #[[1,2]] - + def _get_single_element(self,row,col): - """Returns the single element self[row, col] + """Returns the single element self[row, col] """ M, N = self.shape if (row < 0): @@ -275,9 +275,9 @@ col += N if not (0<=row= self.shape[0]: - raise IndexError('index (%d) out of range' % i ) + raise IndexError('index (%d) out of range' % i ) start, stop, stride = cslice.indices(self.shape[1]) @@ -375,4 +375,3 @@ def isspmatrix_csr(x): return _isinstance(x, csr_matrix) - Modified: trunk/scipy/sparse/data.py =================================================================== --- trunk/scipy/sparse/data.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/data.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,5 +1,5 @@ """Base class for sparse matrice with a .data attribute - + subclasses must provide a _with_data() method that creates a new matrix with the same sparsity pattern as self but with a different data array @@ -31,7 +31,7 @@ def _imag(self): return self._with_data(self.data.imag) - + def __neg__(self): return self._with_data(-self.data) @@ -41,7 +41,7 @@ return self else: raise NotImplementedError - + def __itruediv__(self, other): #self /= other if isscalarlike(other): recip = 1.0 / other @@ -55,7 +55,6 @@ def conj(self, copy=False): return self._with_data(self.data.conj(),copy=copy) - + def copy(self): return self._with_data(self.data.copy(),copy=True) - Modified: trunk/scipy/sparse/dia.py =================================================================== --- trunk/scipy/sparse/dia.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/dia.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -42,7 +42,7 @@ matrix([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], dtype=int8) - + >>> data = array([[1,2,3,4]]).repeat(3,axis=0) >>> diags = array([0,-1,2]) >>> dia_matrix( (data,diags), shape=(4,4)).todense() @@ -66,7 +66,7 @@ if isspmatrix_dia(arg1) and copy: A = arg1.copy() else: - A = arg1.todia() + A = arg1.todia() self.data = A.data self.diags = A.diags self.shape = A.shape @@ -114,7 +114,7 @@ raise ValueError,'number of diagonals (%d) ' \ 'does not match the number of diags (%d)' \ % (self.data.shape[0], len(self.diags)) - + if len(unique(self.diags)) != len(self.diags): raise ValueError,'offset array contains duplicate values' @@ -178,9 +178,9 @@ L = self.data.shape[1] M,N = self.shape - + dia_matvec(M,N, len(self.diags), L, self.diags, self.data, x.ravel(), y.ravel()) - + if isinstance(other, matrix): y = asmatrix(y) @@ -207,20 +207,20 @@ def tocoo(self): num_data = len(self.data) len_data = self.data.shape[1] - + row = arange(len_data).reshape(1,-1).repeat(num_data,axis=0) col = row.copy() for i,k in enumerate(self.diags): row[i,:] -= k - - mask = (row >= 0) - mask &= (row < self.shape[0]) + + mask = (row >= 0) + mask &= (row < self.shape[0]) mask &= (col < self.shape[1]) mask &= self.data != 0 row,col,data = row[mask],col[mask],self.data[mask] row,col,data = row.reshape(-1),col.reshape(-1),data.reshape(-1) - + from coo import coo_matrix return coo_matrix((data,(row,col)),shape=self.shape) @@ -240,5 +240,3 @@ def isspmatrix_dia(x): return _isinstance(x, dia_matrix) - - Modified: trunk/scipy/sparse/dok.py =================================================================== --- trunk/scipy/sparse/dok.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/dok.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -14,7 +14,7 @@ class dok_matrix(spmatrix, dict): """Dictionary Of Keys based matrix. This is an efficient - structure for constructing sparse matrices + structure for constructing sparse matrices """ def __init__(self, A=None, shape=None, dtype=None, copy=False): """ Create a new dictionary-of-keys sparse matrix. An optional @@ -565,4 +565,3 @@ def isspmatrix_dok(x): return _isinstance(x, dok_matrix) - Modified: trunk/scipy/sparse/info.py =================================================================== --- trunk/scipy/sparse/info.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/info.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -88,8 +88,8 @@ --------------- CSR column indices are not necessarily sorted. Likewise for CSC row -indices. Use the .sorted_indices() and .sort_indices() methods when -sorted indices are required (e.g. when passing data to other libraries). +indices. Use the .sorted_indices() and .sort_indices() methods when +sorted indices are required (e.g. when passing data to other libraries). """ Modified: trunk/scipy/sparse/lil.py =================================================================== --- trunk/scipy/sparse/lil.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/lil.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,4 +1,4 @@ -"""LInked List sparse matrix class +"""LInked List sparse matrix class """ __docformat__ = "restructuredtext en" @@ -18,7 +18,7 @@ class lil_matrix(spmatrix): """Row-based linked list matrix - + This can be instantiated in several ways: csc_matrix(D) with a dense matrix or rank-2 ndarray D @@ -39,21 +39,21 @@ Advantages of the LIL format - supports flexible slicing - changes to the matrix sparsity structure are efficient - + Disadvantages of the LIL format - arithmetic operations LIL + LIL are slow (consider CSR or CSC) - slow column slicing (consider CSC) - matrix vector products are slower than CSR/CSC - + Intended Usage - - LIL is a convenient format for constructing sparse matrices - - once a matrix has been constructed, convert to CSR or + - LIL is a convenient format for constructing sparse matrices + - once a matrix has been constructed, convert to CSR or CSC format for fast arithmetic and matrix vector operations - consider using the COO format when constructing large matrices - + Data Structure - An array (``self.rows``) of rows, each of which is a sorted - list of column indices of non-zero elements. + list of column indices of non-zero elements. - The corresponding nonzero values are stored in similar fashion in ``self.data``. @@ -80,7 +80,7 @@ for i in range(M): self.rows[i] = [] self.data[i] = [] - elif isspmatrix(A): + elif isspmatrix(A): if isspmatrix_lil(A) and copy: A = A.copy() else: @@ -111,7 +111,7 @@ else: from csr import csr_matrix A = csr_matrix(A).tolil() - + self.shape = A.shape self.dtype = A.dtype self.rows = A.rows @@ -427,12 +427,12 @@ def tocsr(self): """ Return Compressed Sparse Row format arrays for this matrix. """ - + indptr = asarray([len(x) for x in self.rows], dtype=intc) indptr = concatenate( ( array([0],dtype=intc), cumsum(indptr) ) ) - + nnz = indptr[-1] - + indices = [] for x in self.rows: indices.extend(x) @@ -456,4 +456,3 @@ def isspmatrix_lil( x ): return _isinstance(x, lil_matrix) - Modified: trunk/scipy/sparse/linalg/dsolve/linsolve.py =================================================================== --- trunk/scipy/sparse/linalg/dsolve/linsolve.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/dsolve/linsolve.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -78,7 +78,7 @@ if A.dtype.char not in 'dD': raise ValueError, "convert matrix data to double, please, using"\ " .astype(), or set linsolve.useUmfpack = False" - + b = asarray(b, dtype=A.dtype).reshape(-1) family = {'d' : 'di', 'D' : 'zi'} @@ -116,7 +116,7 @@ A.sort_indices() A = A.asfptype() #upcast to a floating point format - + M, N = A.shape if (M != N): raise ValueError, "can only factor square matrices" #is this true? @@ -160,4 +160,3 @@ return solve else: return splu( A ).solve - Modified: trunk/scipy/sparse/linalg/dsolve/setupscons.py =================================================================== --- trunk/scipy/sparse/linalg/dsolve/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/dsolve/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -6,7 +6,7 @@ from numpy.distutils.misc_util import Configuration from numpy.distutils.system_info import get_info - config = Configuration('dsolve',parent_package,top_path, + config = Configuration('dsolve',parent_package,top_path, setup_name = 'setupscons.py') config.add_sconscript('SConstruct') Modified: trunk/scipy/sparse/linalg/dsolve/tests/test_linsolve.py =================================================================== --- trunk/scipy/sparse/linalg/dsolve/tests/test_linsolve.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/dsolve/tests/test_linsolve.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -29,16 +29,15 @@ for t in ['f','d','F','D']: eps = finfo(t).eps #floating point epsilon - b = b.astype(t) + b = b.astype(t) for format in ['csc','csr']: Asp = A.astype(t).asformat(format) x = spsolve(Asp,b) - + assert( norm(b - Asp*x) < 10 * cond_A * eps ) - + if __name__ == "__main__": nose.run(argv=['', __file__]) - Modified: trunk/scipy/sparse/linalg/dsolve/umfpack/tests/test_umfpack.py =================================================================== --- trunk/scipy/sparse/linalg/dsolve/umfpack/tests/test_umfpack.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/dsolve/umfpack/tests/test_umfpack.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -25,7 +25,7 @@ _have_umfpack = False else: _have_umfpack = um.umfpack._um is not None - + # Allow disabling of nose tests if umfpack not present # See end of file for application _umfpack_skip = dec.skipif(not _have_umfpack, Modified: trunk/scipy/sparse/linalg/eigen/arpack/arpack.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/arpack.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/arpack/arpack.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -9,26 +9,26 @@ # # ARPACK Entry Points # ------------------- -# The entry points to ARPACK are +# The entry points to ARPACK are # - (s,d)seupd : single and double precision symmetric matrix # - (s,d,c,z)neupd: single,double,complex,double complex general matrix -# This wrapper puts the *neupd (general matrix) interfaces in eigen() -# and the *seupd (symmetric matrix) in eigen_symmetric(). +# This wrapper puts the *neupd (general matrix) interfaces in eigen() +# and the *seupd (symmetric matrix) in eigen_symmetric(). # There is no Hermetian complex/double complex interface. # To find eigenvalues of a Hermetian matrix you # must use eigen() and not eigen_symmetric() # It might be desirable to handle the Hermetian case differently -# and, for example, return real eigenvalues. +# and, for example, return real eigenvalues. # Number of eigenvalues returned and complex eigenvalues # ------------------------------------------------------ # The ARPACK nonsymmetric real and double interface (s,d)naupd return -# eigenvalues and eigenvectors in real (float,double) arrays. +# eigenvalues and eigenvectors in real (float,double) arrays. # Since the eigenvalues and eigenvectors are, in general, complex # ARPACK puts the real and imaginary parts in consecutive entries # in real-valued arrays. This wrapper puts the real entries # into complex data types and attempts to return the requested eigenvalues -# and eigenvectors. +# and eigenvectors. # Solver modes @@ -52,7 +52,7 @@ def eigen(A, k=6, M=None, sigma=None, which='LM', v0=None, - ncv=None, maxiter=None, tol=0, + ncv=None, maxiter=None, tol=0, return_eigenvectors=True): """Find k eigenvalues and eigenvectors of the square matrix A. @@ -76,7 +76,7 @@ Array of k eigenvalues v : array - An array of k eigenvectors + An array of k eigenvectors The v[i] is the eigenvector corresponding to the eigenvector w[i] Other Parameters @@ -92,10 +92,10 @@ Find eigenvalues near sigma. Shift spectrum by sigma. v0 : array - Starting vector for iteration. + Starting vector for iteration. ncv : integer - The number of Lanczos vectors generated + The number of Lanczos vectors generated ncv must be greater than k; it is recommended that ncv > 2*k which : string @@ -107,7 +107,7 @@ - 'LI' : largest imaginary part - 'SI' : smallest imaginary part - maxiter : integer + maxiter : integer Maximum number of Arnoldi update iterations allowed tol : float @@ -117,7 +117,7 @@ Return eigenvectors (True) in addition to eigenvalues See Also - -------- + -------- eigen_symmetric : eigenvalues and eigenvectors for symmetric matrix A Notes @@ -149,7 +149,7 @@ ncv=min(ncv,n) if maxiter==None: maxiter=n*10 - # assign starting vector + # assign starting vector if v0 is not None: resid=v0 info=1 @@ -244,12 +244,12 @@ workd,workl,info) # The ARPACK nonsymmetric real and double interface (s,d)naupd return - # eigenvalues and eigenvectors in real (float,double) arrays. + # eigenvalues and eigenvectors in real (float,double) arrays. # Build complex eigenvalues from real and imaginary parts d=dr+1.0j*di - # Arrange the eigenvectors: complex eigenvectors are stored as + # Arrange the eigenvectors: complex eigenvectors are stored as # real,imaginary in consecutive columns z=zr.astype(typ.upper()) eps=np.finfo(typ).eps @@ -263,7 +263,7 @@ z[:,i+1]=z[:,i].conjugate() i+=1 i+=1 - + # Now we have k+1 possible eigenvalues and eigenvectors # Return the ones specified by the keyword "which" nreturned=iparam[4] # number of good eigenvalues returned @@ -274,10 +274,10 @@ # cut at approx precision for sorting rd=np.round(d,decimals=_ndigits[typ]) if which in ['LR','SR']: - ind=np.argsort(rd.real) + ind=np.argsort(rd.real) elif which in ['LI','SI']: # for LI,SI ARPACK returns largest,smallest abs(imaginary) why? - ind=np.argsort(abs(rd.imag)) + ind=np.argsort(abs(rd.imag)) else: ind=np.argsort(abs(rd)) if which in ['LR','LM','LI']: @@ -306,9 +306,9 @@ def eigen_symmetric(A, k=6, M=None, sigma=None, which='LM', v0=None, - ncv=None, maxiter=None, tol=0, + ncv=None, maxiter=None, tol=0, return_eigenvectors=True): - """Find k eigenvalues and eigenvectors of the real symmetric + """Find k eigenvalues and eigenvectors of the real symmetric square matrix A. Solves A * x[i] = w[i] * x[i], the standard eigenvalue problem for @@ -331,7 +331,7 @@ Array of k eigenvalues v : array - An array of k eigenvectors + An array of k eigenvectors The v[i] is the eigenvector corresponding to the eigenvector w[i] Other Parameters @@ -345,12 +345,12 @@ sigma : real (Not implemented) Find eigenvalues near sigma. Shift spectrum by sigma. - + v0 : array - Starting vector for iteration. + Starting vector for iteration. ncv : integer - The number of Lanczos vectors generated + The number of Lanczos vectors generated ncv must be greater than k; it is recommended that ncv > 2*k which : string @@ -359,10 +359,10 @@ - 'SA' : Smallest (algebraic) eigenvalues - 'LM' : Largest (in magnitude) eigenvalues - 'SM' : Smallest (in magnitude) eigenvalues - - 'BE' : Half (k/2) from each end of the spectrum + - 'BE' : Half (k/2) from each end of the spectrum When k is odd, return one more (k/2+1) from the high end - maxiter : integer + maxiter : integer Maximum number of Arnoldi update iterations allowed tol : float @@ -372,7 +372,7 @@ Return eigenvectors (True) in addition to eigenvalues See Also - -------- + -------- eigen : eigenvalues and eigenvectors for a general (nonsymmetric) matrix A Notes @@ -401,7 +401,7 @@ ncv=min(ncv,n) if maxiter==None: maxiter=n*10 - # assign starting vector + # assign starting vector if v0 is not None: resid=v0 info=1 Modified: trunk/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/arpack/tests/test_arpack.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -30,7 +30,7 @@ -# precision for tests +# precision for tests _ndigits = {'f':4, 'd':12, 'F':4, 'D':12} class TestArpack(TestCase): @@ -70,7 +70,7 @@ self.nonsymmetric.append(N1) - + class TestEigenSymmetric(TestArpack): def get_exact_eval(self,d,typ,k,which): @@ -82,7 +82,7 @@ if which=='SM': return eval[:k] if which=='BE': - # one ev from each end - if k is odd, extra ev on high end + # one ev from each end - if k is odd, extra ev on high end l=k/2 h=k/2+k%2 low=range(len(eval))[:l] @@ -114,8 +114,8 @@ n=A.shape[0] v0 = random.rand(n).astype(typ) self.eval_evec(self.symmetric[0],typ,k,which='LM',v0=v0) - - + + class TestEigenComplexSymmetric(TestArpack): def sort_choose(self,eval,typ,k,which): @@ -156,17 +156,17 @@ # self.eval_evec(self.symmetric[0],typ,k,which) - + class TestEigenNonSymmetric(TestArpack): def sort_choose(self,eval,typ,k,which): reval=round(eval,decimals=_ndigits[typ]) if which in ['LR','SR']: - ind=argsort(reval.real) + ind=argsort(reval.real) elif which in ['LI','SI']: # for LI,SI ARPACK returns largest,smallest abs(imaginary) why? - ind=argsort(abs(reval.imag)) + ind=argsort(abs(reval.imag)) else: ind=argsort(abs(reval)) @@ -222,7 +222,7 @@ eps=finfo(typ).eps reval=round(eval,decimals=_ndigits[typ]) if which in ['LR','SR']: - ind=argsort(reval) + ind=argsort(reval) elif which in ['LI','SI']: ind=argsort(reval.imag) else: Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/info.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/info.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -36,14 +36,14 @@ y = invA * x if sp.issparse( y ): y = y.toarray() - + return as2d( y ) >>> >>> # Alternative way of providing the same preconditioner. >>> #precond = spdiags( ivals, 0, n, n ) ->>> +>>> >>> tt = time.clock() >>> eigs, vecs = lobpcg( X, operatorA, operatorB, blockVectorY = Y, >>> operatorT = precond, @@ -57,20 +57,20 @@ Notes ----- -In the following ``n`` denotes the matrix size and ``m`` the number +In the following ``n`` denotes the matrix size and ``m`` the number of required eigenvalues (smallest or largest). The LOBPCG code internally solves eigenproblems of the size 3``m`` on every -iteration by calling the "standard" dense eigensolver, so if ``m`` is not -small enough compared to ``n``, it does not make sense to call the LOBPCG -code, but rather one should use the "standard" eigensolver, e.g. scipy or symeig -function in this case. If one calls the LOBPCG algorithm for 5``m``>``n``, +iteration by calling the "standard" dense eigensolver, so if ``m`` is not +small enough compared to ``n``, it does not make sense to call the LOBPCG +code, but rather one should use the "standard" eigensolver, e.g. scipy or symeig +function in this case. If one calls the LOBPCG algorithm for 5``m``>``n``, it will most likely break internally, so the code tries to call the standard function instead. It is not that n should be large for the LOBPCG to work, but rather the ratio ``n``/``m`` should be large. It you call the LOBPCG code with ``m``=1 -and ``n``=10, it should work, though ``n`` is small. The method is intended +and ``n``=10, it should work, though ``n`` is small. The method is intended for extremely large ``n``/``m``, see e.g., reference [28] in http://arxiv.org/abs/0705.2626 @@ -81,9 +81,9 @@ 2. How well conditioned the problem is. This can be changed by using proper preconditioning. For example, a rod vibration test problem (under tests - directory) is ill-conditioned for large ``n``, so convergence will be + directory) is ill-conditioned for large ``n``, so convergence will be slow, unless efficient preconditioning is used. For this specific problem, - a good simple preconditioner function would be a linear solve for A, which + a good simple preconditioner function would be a linear solve for A, which is easy to code since A is tridiagonal. Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/lobpcg.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -83,8 +83,8 @@ return aux def makeOperator( operatorInput, expectedShape ): - """Internal. Takes a dense numpy array or a sparse matrix or - a function and makes an operator performing matrix * blockvector + """Internal. Takes a dense numpy array or a sparse matrix or + a function and makes an operator performing matrix * blockvector products. Example @@ -102,7 +102,7 @@ if operator.shape != expectedShape: raise ValueError('operator has invalid shape') - + operator.__call__ = operator.matmat return operator @@ -146,14 +146,14 @@ retLambdaHistory = False, retResidualNormsHistory = False ): """Solve symmetric partial eigenproblems with optional preconditioning - This function implements the Locally Optimal Block Preconditioned + This function implements the Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG). TODO write in terms of Ax=lambda B x Parameters ---------- - blockVectorX : array_like + blockVectorX : array_like initial approximation to eigenvectors shape=(n,blockSize) A : {dense matrix, sparse matrix, LinearOperator} the linear operator of the problem, usually a sparse matrix @@ -163,7 +163,7 @@ ------- (lambda,blockVectorV) : tuple of arrays blockVectorX and lambda are computed blockSize eigenpairs, where - blockSize=size(blockVectorX,2) for the initial guess blockVectorX + blockSize=size(blockVectorX,2) for the initial guess blockVectorX if it is full rank. Optional Parameters @@ -177,7 +177,7 @@ M should approximate the inverse of A blockVectorY : array_like n-by-sizeY matrix of constraints, sizeY < n - The iterations will be performed in the B-orthogonal complement + The iterations will be performed in the B-orthogonal complement of the column-space of blockVectorY. blockVectorY must be full rank. Other Parameters Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/lobpcg/tests/test_lobpcg.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -7,7 +7,7 @@ from scipy import array, arange, ones, sort, cos, pi, rand, \ set_printoptions, r_, diag, linalg -from scipy.linalg import eig +from scipy.linalg import eig from scipy.sparse.linalg.eigen import lobpcg @@ -29,7 +29,7 @@ return A,B def MikotaPair(n): - # Mikota pair acts as a nice test since the eigenvalues + # Mikota pair acts as a nice test since the eigenvalues # are the squares of the integers n, n=1,2,... x = arange(1,n+1) B = diag(1./x) @@ -46,10 +46,10 @@ V = rand(n,m) X = linalg.orth(V) - + eigs,vecs = lobpcg.lobpcg(X,A,B,residualTolerance=1e-5, maxIterations=30) eigs.sort() - + #w,v = symeig(A,B) w,v = eig(A,b=B) w.sort() @@ -65,19 +65,19 @@ #show() def test_Small(): - A,B = ElasticRod(10) + A,B = ElasticRod(10) compare_solutions(A,B,10) - A,B = MikotaPair(10) + A,B = MikotaPair(10) compare_solutions(A,B,10) def test_ElasticRod(): - A,B = ElasticRod(100) + A,B = ElasticRod(100) compare_solutions(A,B,20) def test_MikotaPair(): - A,B = MikotaPair(100) + A,B = MikotaPair(100) compare_solutions(A,B,20) - + if __name__ == "__main__": nose.run(argv=['', __file__]) Modified: trunk/scipy/sparse/linalg/eigen/setup.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/setup.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -2,12 +2,12 @@ def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration - + config = Configuration('eigen',parent_package,top_path) - + config.add_subpackage(('arpack')) config.add_subpackage(('lobpcg')) - + return config if __name__ == '__main__': Modified: trunk/scipy/sparse/linalg/eigen/setupscons.py =================================================================== --- trunk/scipy/sparse/linalg/eigen/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/eigen/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -2,12 +2,12 @@ def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration - + config = Configuration('eigen',parent_package,top_path, setup_name = 'setupscons.py') - + config.add_subpackage(('arpack')) config.add_subpackage(('lobpcg')) - + return config if __name__ == '__main__': Modified: trunk/scipy/sparse/linalg/isolve/__init__.py =================================================================== --- trunk/scipy/sparse/linalg/isolve/__init__.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/isolve/__init__.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -8,4 +8,3 @@ from scipy.testing.pkgtester import Tester test = Tester().test bench = Tester().bench - Modified: trunk/scipy/sparse/linalg/isolve/iterative.py =================================================================== --- trunk/scipy/sparse/linalg/isolve/iterative.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/isolve/iterative.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -322,7 +322,7 @@ n = len(b) if maxiter is None: maxiter = n*10 - + matvec = A.matvec psolve = M.matvec ltr = _type_conv[x.dtype.char] Modified: trunk/scipy/sparse/linalg/isolve/minres.py =================================================================== --- trunk/scipy/sparse/linalg/isolve/minres.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/isolve/minres.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -7,8 +7,8 @@ def minres(A, b, x0=None, shift=0.0, tol=1e-5, maxiter=None, xtype=None, M=None, callback=None, show=False, check=False): - """Use the Minimum Residual Method (MINRES) to solve Ax=b - + """Use the Minimum Residual Method (MINRES) to solve Ax=b + MINRES minimizes norm(A*x - b) for the symmetric matrix A. Unlike the Conjugate Gradient method, A can be indefinite or singular. @@ -21,7 +21,7 @@ References ========== - + Solution of sparse indefinite systems of linear equations, C. C. Paige and M. A. Saunders (1975), SIAM J. Numer. Anal. 12(4), pp. 617-629. @@ -30,7 +30,7 @@ This file is a translation of the following MATLAB implementation: http://www.stanford.edu/group/SOL/software/minres/matlab/ - """ + """ A,M,x,b,postprocess = make_system(A,M,x0,b,xtype) matvec = A.matvec @@ -57,38 +57,38 @@ ' M does not define a symmetric matrix ', # 8 ' M does not define a pos-def preconditioner '] # 9 - + if show: print first + 'Solution of symmetric Ax = b' print first + 'n = %3g shift = %23.14e' % (n,shift) print first + 'itnlim = %3g rtol = %11.2e' % (maxiter,tol) print - + istop = 0; itn = 0; Anorm = 0; Acond = 0; - rnorm = 0; ynorm = 0; + rnorm = 0; ynorm = 0; xtype = A.dtype #TODO update - eps = finfo(xtype).eps + eps = finfo(xtype).eps x = zeros( n, dtype=xtype ) # Set up y and v for the first Lanczos vector v1. # y = beta1 P' v1, where P = C**(-1). # v is really P' v1. - + y = b r1 = b y = psolve(b) - + beta1 = inner(b,y) if beta1 < 0: raise ValueError('indefinite preconditioner') elif beta1 == 0: return (postprocess(x), 0) - + beta1 = sqrt( beta1 ) if check: @@ -112,8 +112,8 @@ epsa = (s + eps) * eps**(1.0/3.0) if z > epsa: raise ValueError('non-symmetric preconditioner') - + # Initialize other quantities oldb = 0; beta = beta1; dbar = 0; epsln = 0; qrnorm = beta1; phibar = beta1; rhs1 = beta1; @@ -124,22 +124,22 @@ r2 = r1 if show: - print - print - print ' Itn x(1) Compatible LS norm(A) cond(A) gbar/|A|' + print + print + print ' Itn x(1) Compatible LS norm(A) cond(A) gbar/|A|' while itn < maxiter: itn += 1 - s = 1.0/beta + s = 1.0/beta v = s*y - + y = matvec(v) y = y - shift * v if itn >= 2: y = y - (beta/oldb)*r1 - + alfa = inner(v,y) y = y - (alfa/beta)*r2 r1 = r2 @@ -149,11 +149,11 @@ beta = inner(r2,y) if beta < 0: raise ValueError('non-symmetric matrix') - beta = sqrt(beta) + beta = sqrt(beta) tnorm2 += alfa**2 + oldb**2 + beta**2 if itn == 1: - if beta/beta1 <= 10*eps: + if beta/beta1 <= 10*eps: istop = -1 # Terminate later #tnorm2 = alfa**2 ?? gmax = abs(alfa) @@ -172,33 +172,33 @@ Arnorm = phibar * root # Compute the next plane rotation Qk - + gamma = norm([gbar, beta]) # gammak - gamma = max(gamma, eps) + gamma = max(gamma, eps) cs = gbar / gamma # ck sn = beta / gamma # sk phi = cs * phibar # phik phibar = sn * phibar # phibark+1 - + # Update x. - + denom = 1.0/gamma w1 = w2 w2 = w w = (v - oldeps*w1 - delta*w2) * denom x = x + phi*w - + # Go round again. - + gmax = max(gmax, gamma) gmin = min(gmin, gamma) z = rhs1 / gamma ynorm2 = z**2 + ynorm2 rhs1 = rhs2 - delta*z rhs2 = - epsln*z - + # Estimate various norms and test for convergence. - + Anorm = sqrt( tnorm2 ) ynorm = sqrt( ynorm2 ) epsa = Anorm * eps @@ -207,7 +207,7 @@ diag = gbar if diag == 0: diag = epsa - + qrnorm = phibar rnorm = qrnorm test1 = rnorm / (Anorm*ynorm) # ||r|| / (||A|| ||x||) @@ -218,18 +218,18 @@ # factorization of the lower Hessenberg matrix, Q * H = R, # where H is the tridiagonal matrix from Lanczos with one # extra row, beta(k+1) e_k^T. - + Acond = gmax/gmin - + # See if any of the stopping criteria are satisfied. # In rare cases, istop is already -1 from above (Abar = const*I). - + if istop == 0: t1 = 1 + test1 # These tests work if tol < eps t2 = 1 + test2 if t2 <= 1 : istop = 2 if t1 <= 1 : istop = 1 - + if itn >= maxiter : istop = 6 if Acond >= 0.1/eps : istop = 4 if epsx >= beta1 : istop = 3 @@ -237,9 +237,9 @@ #if rnorm <= epsr : istop = 1 if test2 <= tol : istop = 2 if test1 <= tol : istop = 1 - + # See if it is time to print something. - + prnt = False if n <= 40 : prnt = True if itn <= 10 : prnt = True @@ -249,25 +249,25 @@ if qrnorm <= 10*epsr : prnt = True if Acond <= 1e-2/eps : prnt = True if istop != 0 : prnt = True - + if show and prnt: str1 = '%6g %12.5e %10.3e' % (itn, x[0], test1) str2 = ' %10.3e' % (test2,) str3 = ' %8.1e %8.1e %8.1e' % (Anorm, Acond, gbar/Anorm) print str1 + str2 + str3 - + if itn % 10 == 0: print if callback is not None: callback(x) if istop != 0: break #TODO check this - + if show: print - print last + ' istop = %3g itn =%5g' % (istop,itn) + print last + ' istop = %3g itn =%5g' % (istop,itn) print last + ' Anorm = %12.4e Acond = %12.4e' % (Anorm,Acond) print last + ' rnorm = %12.4e ynorm = %12.4e' % (rnorm,ynorm) print last + ' Arnorm = %12.4e' % (Arnorm,) @@ -297,4 +297,3 @@ b = 0*ones( A.shape[0] ) x = minres(A,b,tol=1e-12,maxiter=None,callback=cb) #x = cg(A,b,x0=b,tol=1e-12,maxiter=None,callback=cb)[0] - Modified: trunk/scipy/sparse/linalg/isolve/tests/test_iterative.py =================================================================== --- trunk/scipy/sparse/linalg/isolve/tests/test_iterative.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/isolve/tests/test_iterative.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -41,7 +41,7 @@ self.solvers.append( (gmres, False, False) ) self.solvers.append( (qmr, False, False) ) self.solvers.append( (minres, True, False) ) - + # list of tuples (A, symmetric, positive_definite ) self.cases = [] @@ -51,7 +51,7 @@ # Symmetric and Negative Definite self.cases.append( (-Poisson1D,True,False) ) - # Symmetric and Indefinite + # Symmetric and Indefinite self.cases.append( (RandDiag,True,False) ) # Non-symmetric and Positive Definite @@ -78,12 +78,12 @@ x0 = 0*b x, info = solver(A, b, x0=x0, tol=tol) - + assert_array_equal(x0, 0*b) #ensure that x0 is not overwritten assert_equal(info,0) assert( norm(b - A*x) < tol*norm(b) ) - + def test_precond(self): """test whether all methods accept a preconditioner""" @@ -107,7 +107,7 @@ x0 = 0*b x, info = solver(A, b, x0=x0, tol=tol) - + assert_equal(info,0) assert( norm(b - A*x) < tol*norm(b) ) @@ -127,7 +127,7 @@ L = spdiags([-dat/2, dat], [-1,0], n, n) U = spdiags([4*dat, -dat], [ 0,1], n, n) - + L_solver = splu(L) U_solver = splu(U) @@ -144,7 +144,7 @@ M2 = LinearOperator( (n,n), matvec=U_solve, rmatvec=UT_solve ) x,info = qmr(A, b, tol=1e-8, maxiter=15, M1=M1, M2=M2) - + assert_equal(info,0) assert( norm(b - A*x) < 1e-8*norm(b) ) Modified: trunk/scipy/sparse/linalg/isolve/utils.py =================================================================== --- trunk/scipy/sparse/linalg/isolve/utils.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/isolve/utils.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -23,7 +23,7 @@ def make_system(A, M, x0, b, xtype=None): """Make a linear system Ax=b - + Parameters: A - LinearOperator - sparse or dense matrix (or any valid input to aslinearoperator) @@ -39,7 +39,7 @@ Returns: (A, M, x, b, postprocess) where: - - A is a LinearOperator + - A is a LinearOperator - M is a LinearOperator - x is the initial guess (rank 1 array) - b is the rhs (rank 1 array) @@ -54,7 +54,7 @@ raise ValueError('expected square matrix (shape=%s)' % shape) N = A.shape[0] - + b = asanyarray(b) if not (b.shape == (N,1) or b.shape == (N,)): @@ -111,5 +111,3 @@ raise ValueError('matrix and preconditioner have different shapes') return A, M, x, b, postprocess - - Modified: trunk/scipy/sparse/linalg/setup.py =================================================================== --- trunk/scipy/sparse/linalg/setup.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/setup.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -2,15 +2,15 @@ def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration - + config = Configuration('linalg',parent_package,top_path) - + config.add_subpackage(('isolve')) config.add_subpackage(('dsolve')) config.add_subpackage(('eigen')) - + config.add_data_dir('tests') - + return config if __name__ == '__main__': Modified: trunk/scipy/sparse/linalg/setupscons.py =================================================================== --- trunk/scipy/sparse/linalg/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -2,16 +2,16 @@ def configuration(parent_package='',top_path=None): from numpy.distutils.misc_util import Configuration - - config = Configuration('linalg',parent_package,top_path, + + config = Configuration('linalg',parent_package,top_path, setup_name = 'setupscons.py') - + config.add_subpackage(('isolve')) config.add_subpackage(('dsolve')) config.add_subpackage(('eigen')) - + config.add_data_dir('tests') - + return config if __name__ == '__main__': Modified: trunk/scipy/sparse/linalg/tests/test_interface.py =================================================================== --- trunk/scipy/sparse/linalg/tests/test_interface.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/linalg/tests/test_interface.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -34,7 +34,7 @@ return array([ 1*x[0] + 4*x[1], 2*x[0] + 5*x[1], 3*x[0] + 6*x[1]]) - + cases.append( matlike() ) Modified: trunk/scipy/sparse/setupscons.py =================================================================== --- trunk/scipy/sparse/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -7,7 +7,7 @@ import numpy from numpy.distutils.misc_util import Configuration - config = Configuration('sparse',parent_package,top_path, + config = Configuration('sparse',parent_package,top_path, setup_name = 'setupscons.py') config.add_data_dir('tests') Modified: trunk/scipy/sparse/sparsetools/__init__.py =================================================================== --- trunk/scipy/sparse/sparsetools/__init__.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/__init__.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -6,4 +6,3 @@ from coo import * from dia import * from bsr import * - Modified: trunk/scipy/sparse/sparsetools/bsr.py =================================================================== --- trunk/scipy/sparse/sparsetools/bsr.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/bsr.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -51,442 +51,441 @@ def bsr_diagonal(*args): - """ - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax, signed char Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax, unsigned char Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax, short Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax, unsigned short Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax, int Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax, unsigned int Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax, long long Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax, unsigned long long Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax, float Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax, double Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax, long double Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, npy_cfloat_wrapper Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, npy_cdouble_wrapper Yx) - bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Yx) """ - return _bsr.bsr_diagonal(*args) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax, signed char Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax, unsigned char Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax, short Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax, unsigned short Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax, int Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax, unsigned int Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax, long long Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax, unsigned long long Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax, float Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax, double Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax, long double Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, npy_cfloat_wrapper Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, npy_cdouble_wrapper Yx) + bsr_diagonal(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Yx) + """ + return _bsr.bsr_diagonal(*args) def bsr_scale_rows(*args): - """ - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax, signed char Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax, unsigned char Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax, short Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax, unsigned short Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax, int Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax, unsigned int Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax, long long Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax, unsigned long long Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax, float Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax, double Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax, long double Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx) - bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx) """ - return _bsr.bsr_scale_rows(*args) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax, signed char Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax, unsigned char Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax, short Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax, unsigned short Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax, int Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax, unsigned int Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax, long long Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax, unsigned long long Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax, float Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax, double Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax, long double Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx) + bsr_scale_rows(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx) + """ + return _bsr.bsr_scale_rows(*args) def bsr_scale_columns(*args): - """ - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax, signed char Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax, unsigned char Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax, short Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax, unsigned short Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax, int Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax, unsigned int Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax, long long Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax, unsigned long long Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax, float Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax, double Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax, long double Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx) - bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx) """ - return _bsr.bsr_scale_columns(*args) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax, signed char Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax, unsigned char Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax, short Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax, unsigned short Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax, int Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax, unsigned int Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax, long long Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax, unsigned long long Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax, float Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax, double Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax, long double Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx) + bsr_scale_columns(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx) + """ + return _bsr.bsr_scale_columns(*args) def bsr_transpose(*args): - """ - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx) - bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx) """ - return _bsr.bsr_transpose(*args) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx) + bsr_transpose(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx) + """ + return _bsr.bsr_transpose(*args) def bsr_matmat_pass2(*args): - """ - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, signed char Ax, int Bp, int Bj, signed char Bx, - int Cp, int Cj, signed char Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, unsigned char Ax, int Bp, int Bj, unsigned char Bx, - int Cp, int Cj, unsigned char Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, short Ax, int Bp, int Bj, short Bx, - int Cp, int Cj, short Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, unsigned short Ax, int Bp, int Bj, - unsigned short Bx, int Cp, int Cj, unsigned short Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, int Ax, int Bp, int Bj, int Bx, int Cp, - int Cj, int Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, unsigned int Ax, int Bp, int Bj, unsigned int Bx, - int Cp, int Cj, unsigned int Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, long long Ax, int Bp, int Bj, long long Bx, - int Cp, int Cj, long long Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, unsigned long long Ax, int Bp, int Bj, - unsigned long long Bx, int Cp, int Cj, unsigned long long Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, float Ax, int Bp, int Bj, float Bx, - int Cp, int Cj, float Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, double Ax, int Bp, int Bj, double Bx, - int Cp, int Cj, double Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, long double Ax, int Bp, int Bj, long double Bx, - int Cp, int Cj, long double Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, npy_cfloat_wrapper Ax, int Bp, int Bj, - npy_cfloat_wrapper Bx, int Cp, int Cj, npy_cfloat_wrapper Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, npy_cdouble_wrapper Ax, int Bp, int Bj, - npy_cdouble_wrapper Bx, int Cp, int Cj, - npy_cdouble_wrapper Cx) - bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, - int Aj, npy_clongdouble_wrapper Ax, int Bp, - int Bj, npy_clongdouble_wrapper Bx, int Cp, - int Cj, npy_clongdouble_wrapper Cx) """ - return _bsr.bsr_matmat_pass2(*args) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, signed char Ax, int Bp, int Bj, signed char Bx, + int Cp, int Cj, signed char Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, unsigned char Ax, int Bp, int Bj, unsigned char Bx, + int Cp, int Cj, unsigned char Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, short Ax, int Bp, int Bj, short Bx, + int Cp, int Cj, short Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, unsigned short Ax, int Bp, int Bj, + unsigned short Bx, int Cp, int Cj, unsigned short Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, int Ax, int Bp, int Bj, int Bx, int Cp, + int Cj, int Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, unsigned int Ax, int Bp, int Bj, unsigned int Bx, + int Cp, int Cj, unsigned int Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, long long Ax, int Bp, int Bj, long long Bx, + int Cp, int Cj, long long Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, unsigned long long Ax, int Bp, int Bj, + unsigned long long Bx, int Cp, int Cj, unsigned long long Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, float Ax, int Bp, int Bj, float Bx, + int Cp, int Cj, float Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, double Ax, int Bp, int Bj, double Bx, + int Cp, int Cj, double Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, long double Ax, int Bp, int Bj, long double Bx, + int Cp, int Cj, long double Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, npy_cfloat_wrapper Ax, int Bp, int Bj, + npy_cfloat_wrapper Bx, int Cp, int Cj, npy_cfloat_wrapper Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, npy_cdouble_wrapper Ax, int Bp, int Bj, + npy_cdouble_wrapper Bx, int Cp, int Cj, + npy_cdouble_wrapper Cx) + bsr_matmat_pass2(int n_brow, int n_bcol, int R, int C, int N, int Ap, + int Aj, npy_clongdouble_wrapper Ax, int Bp, + int Bj, npy_clongdouble_wrapper Bx, int Cp, + int Cj, npy_clongdouble_wrapper Cx) + """ + return _bsr.bsr_matmat_pass2(*args) def bsr_matvec(*args): - """ - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax, signed char Xx, signed char Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax, unsigned char Xx, unsigned char Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax, short Xx, short Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax, unsigned short Xx, unsigned short Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax, int Xx, int Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax, unsigned int Xx, unsigned int Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax, long long Xx, long long Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax, unsigned long long Xx, - unsigned long long Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax, float Xx, float Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax, double Xx, double Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax, long double Xx, long double Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx, - npy_cfloat_wrapper Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx, - npy_cdouble_wrapper Yx) - bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx, - npy_clongdouble_wrapper Yx) """ - return _bsr.bsr_matvec(*args) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax, signed char Xx, signed char Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax, unsigned char Xx, unsigned char Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax, short Xx, short Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax, unsigned short Xx, unsigned short Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax, int Xx, int Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax, unsigned int Xx, unsigned int Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax, long long Xx, long long Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax, unsigned long long Xx, + unsigned long long Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax, float Xx, float Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax, double Xx, double Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax, long double Xx, long double Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, npy_cfloat_wrapper Xx, + npy_cfloat_wrapper Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, npy_cdouble_wrapper Xx, + npy_cdouble_wrapper Yx) + bsr_matvec(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, npy_clongdouble_wrapper Xx, + npy_clongdouble_wrapper Yx) + """ + return _bsr.bsr_matvec(*args) def bsr_elmul_bsr(*args): - """ - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx, - int Cp, int Cj, signed char Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx, - int Cp, int Cj, unsigned char Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx, int Cp, - int Cj, short Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx, - int Cp, int Cj, unsigned short Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, - int Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx, - int Cp, int Cj, unsigned int Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx, - int Cp, int Cj, long long Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx, int Cp, - int Cj, float Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx, int Cp, - int Cj, double Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx, - int Cp, int Cj, long double Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _bsr.bsr_elmul_bsr(*args) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx, + int Cp, int Cj, signed char Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx, + int Cp, int Cj, unsigned char Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx, int Cp, + int Cj, short Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx, + int Cp, int Cj, unsigned short Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, + int Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx, + int Cp, int Cj, unsigned int Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx, + int Cp, int Cj, long long Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx, int Cp, + int Cj, float Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx, int Cp, + int Cj, double Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx, + int Cp, int Cj, long double Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + bsr_elmul_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _bsr.bsr_elmul_bsr(*args) def bsr_eldiv_bsr(*args): - """ - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx, - int Cp, int Cj, signed char Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx, - int Cp, int Cj, unsigned char Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx, int Cp, - int Cj, short Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx, - int Cp, int Cj, unsigned short Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, - int Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx, - int Cp, int Cj, unsigned int Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx, - int Cp, int Cj, long long Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx, int Cp, - int Cj, float Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx, int Cp, - int Cj, double Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx, - int Cp, int Cj, long double Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _bsr.bsr_eldiv_bsr(*args) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx, + int Cp, int Cj, signed char Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx, + int Cp, int Cj, unsigned char Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx, int Cp, + int Cj, short Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx, + int Cp, int Cj, unsigned short Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, + int Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx, + int Cp, int Cj, unsigned int Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx, + int Cp, int Cj, long long Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx, int Cp, + int Cj, float Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx, int Cp, + int Cj, double Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx, + int Cp, int Cj, long double Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + bsr_eldiv_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _bsr.bsr_eldiv_bsr(*args) def bsr_plus_bsr(*args): - """ - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx, - int Cp, int Cj, signed char Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx, - int Cp, int Cj, unsigned char Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx, int Cp, - int Cj, short Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx, - int Cp, int Cj, unsigned short Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, - int Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx, - int Cp, int Cj, unsigned int Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx, - int Cp, int Cj, long long Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx, int Cp, - int Cj, float Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx, int Cp, - int Cj, double Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx, - int Cp, int Cj, long double Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _bsr.bsr_plus_bsr(*args) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx, + int Cp, int Cj, signed char Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx, + int Cp, int Cj, unsigned char Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx, int Cp, + int Cj, short Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx, + int Cp, int Cj, unsigned short Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, + int Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx, + int Cp, int Cj, unsigned int Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx, + int Cp, int Cj, long long Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx, int Cp, + int Cj, float Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx, int Cp, + int Cj, double Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx, + int Cp, int Cj, long double Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + bsr_plus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _bsr.bsr_plus_bsr(*args) def bsr_minus_bsr(*args): - """ - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx, - int Cp, int Cj, signed char Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx, - int Cp, int Cj, unsigned char Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx, int Cp, - int Cj, short Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx, - int Cp, int Cj, unsigned short Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, - int Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx, - int Cp, int Cj, unsigned int Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx, - int Cp, int Cj, long long Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx, int Cp, - int Cj, float Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx, int Cp, - int Cj, double Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx, - int Cp, int Cj, long double Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _bsr.bsr_minus_bsr(*args) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx, + int Cp, int Cj, signed char Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx, + int Cp, int Cj, unsigned char Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx, int Cp, + int Cj, short Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx, + int Cp, int Cj, unsigned short Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx, int Cp, int Cj, + int Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx, + int Cp, int Cj, unsigned int Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx, + int Cp, int Cj, long long Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx, int Cp, + int Cj, float Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx, int Cp, + int Cj, double Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx, + int Cp, int Cj, long double Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + bsr_minus_bsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx, int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _bsr.bsr_minus_bsr(*args) def bsr_sort_indices(*args): - """ - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - signed char Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned char Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - short Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned short Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - int Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned int Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long long Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - unsigned long long Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - float Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - double Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - long double Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax) - bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax) """ - return _bsr.bsr_sort_indices(*args) - + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + signed char Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned char Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + short Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned short Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + int Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned int Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long long Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + unsigned long long Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + float Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + double Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + long double Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax) + bsr_sort_indices(int n_brow, int n_bcol, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax) + """ + return _bsr.bsr_sort_indices(*args) Modified: trunk/scipy/sparse/sparsetools/coo.py =================================================================== --- trunk/scipy/sparse/sparsetools/coo.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/coo.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -51,101 +51,100 @@ def coo_tocsr(*args): - """ - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, - int Bp, int Bj, short Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, - int Bp, int Bj, int Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, - int Bp, int Bj, long long Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, - int Bp, int Bj, float Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, - int Bp, int Bj, double Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, - int Bp, int Bj, long double Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx) - coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx) """ - return _coo.coo_tocsr(*args) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, + int Bp, int Bj, short Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, + int Bp, int Bj, int Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, + int Bp, int Bj, long long Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, + int Bp, int Bj, float Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, + int Bp, int Bj, double Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, + int Bp, int Bj, long double Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx) + coo_tocsr(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx) + """ + return _coo.coo_tocsr(*args) def coo_tocsc(*args): - """ - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, - int Bp, int Bi, signed char Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, - int Bp, int Bi, unsigned char Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, - int Bp, int Bi, short Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, - int Bp, int Bi, unsigned short Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, - int Bp, int Bi, int Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, - int Bp, int Bi, unsigned int Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, - int Bp, int Bi, long long Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, - int Bp, int Bi, float Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, - int Bp, int Bi, double Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, - int Bp, int Bi, long double Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx) - coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx) """ - return _coo.coo_tocsc(*args) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, + int Bp, int Bi, signed char Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, + int Bp, int Bi, unsigned char Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, + int Bp, int Bi, short Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, + int Bp, int Bi, unsigned short Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, + int Bp, int Bi, int Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, + int Bp, int Bi, unsigned int Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, + int Bp, int Bi, long long Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, + int Bp, int Bi, float Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, + int Bp, int Bi, double Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, + int Bp, int Bi, long double Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx) + coo_tocsc(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx) + """ + return _coo.coo_tocsc(*args) def coo_todense(*args): - """ - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, - signed char Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, - unsigned char Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, - short Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, - unsigned short Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, - int Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, - unsigned int Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, - long long Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, - unsigned long long Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, - float Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, - double Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, - long double Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Bx) - coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Bx) """ - return _coo.coo_todense(*args) - + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, signed char Ax, + signed char Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned char Ax, + unsigned char Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, short Ax, + short Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned short Ax, + unsigned short Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, int Ax, + int Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned int Ax, + unsigned int Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, long long Ax, + long long Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, unsigned long long Ax, + unsigned long long Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, float Ax, + float Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, double Ax, + double Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, long double Ax, + long double Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Bx) + coo_todense(int n_row, int n_col, int nnz, int Ai, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Bx) + """ + return _coo.coo_todense(*args) Modified: trunk/scipy/sparse/sparsetools/csc.py =================================================================== --- trunk/scipy/sparse/sparsetools/csc.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/csc.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -50,320 +50,319 @@ def csc_matmat_pass1(*args): - """ - csc_matmat_pass1(int n_row, int n_col, int Ap, int Ai, int Bp, int Bi, - int Cp) """ - return _csc.csc_matmat_pass1(*args) + csc_matmat_pass1(int n_row, int n_col, int Ap, int Ai, int Bp, int Bi, + int Cp) + """ + return _csc.csc_matmat_pass1(*args) def csc_diagonal(*args): - """ - csc_diagonal(int n_row, int n_col, int Ap, int Aj, signed char Ax, - signed char Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - unsigned char Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, short Ax, short Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - unsigned short Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, int Ax, int Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - unsigned int Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, long long Ax, - long long Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - unsigned long long Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, float Ax, float Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, double Ax, double Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, long double Ax, - long double Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Yx) - csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Yx) """ - return _csc.csc_diagonal(*args) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, signed char Ax, + signed char Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + unsigned char Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, short Ax, short Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + unsigned short Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, int Ax, int Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + unsigned int Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, long long Ax, + long long Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + unsigned long long Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, float Ax, float Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, double Ax, double Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, long double Ax, + long double Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Yx) + csc_diagonal(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Yx) + """ + return _csc.csc_diagonal(*args) def csc_tocsr(*args): - """ - csc_tocsr(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bj, signed char Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bj, unsigned char Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bj, short Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bj, unsigned short Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bj, int Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bj, unsigned int Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bj, long long Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bj, float Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bj, double Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bj, long double Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx) - csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx) """ - return _csc.csc_tocsr(*args) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bj, signed char Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bj, unsigned char Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bj, short Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bj, unsigned short Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bj, int Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bj, unsigned int Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bj, long long Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bj, float Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bj, double Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bj, long double Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx) + csc_tocsr(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx) + """ + return _csc.csc_tocsr(*args) def csc_matmat_pass2(*args): - """ - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bi, signed char Bx, int Cp, int Ci, - signed char Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bi, unsigned char Bx, int Cp, - int Ci, unsigned char Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bi, short Bx, int Cp, int Ci, short Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bi, unsigned short Bx, int Cp, - int Ci, unsigned short Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bi, int Bx, int Cp, int Ci, int Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bi, unsigned int Bx, int Cp, - int Ci, unsigned int Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bi, long long Bx, int Cp, int Ci, - long long Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx, - int Cp, int Ci, unsigned long long Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bi, float Bx, int Cp, int Ci, float Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bi, double Bx, int Cp, int Ci, double Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bi, long double Bx, int Cp, int Ci, - long double Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx, - int Cp, int Ci, npy_cfloat_wrapper Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx, - int Cp, int Ci, npy_cdouble_wrapper Cx) - csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx, - int Cp, int Ci, npy_clongdouble_wrapper Cx) """ - return _csc.csc_matmat_pass2(*args) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bi, signed char Bx, int Cp, int Ci, + signed char Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bi, unsigned char Bx, int Cp, + int Ci, unsigned char Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bi, short Bx, int Cp, int Ci, short Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bi, unsigned short Bx, int Cp, + int Ci, unsigned short Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bi, int Bx, int Cp, int Ci, int Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bi, unsigned int Bx, int Cp, + int Ci, unsigned int Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bi, long long Bx, int Cp, int Ci, + long long Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx, + int Cp, int Ci, unsigned long long Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bi, float Bx, int Cp, int Ci, float Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bi, double Bx, int Cp, int Ci, double Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bi, long double Bx, int Cp, int Ci, + long double Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx, + int Cp, int Ci, npy_cfloat_wrapper Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx, + int Cp, int Ci, npy_cdouble_wrapper Cx) + csc_matmat_pass2(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx, + int Cp, int Ci, npy_clongdouble_wrapper Cx) + """ + return _csc.csc_matmat_pass2(*args) def csc_matvec(*args): - """ - csc_matvec(int n_row, int n_col, int Ap, int Ai, signed char Ax, - signed char Xx, signed char Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - unsigned char Xx, unsigned char Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, short Ax, short Xx, - short Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - unsigned short Xx, unsigned short Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, int Ax, int Xx, - int Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - unsigned int Xx, unsigned int Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, long long Ax, - long long Xx, long long Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - unsigned long long Xx, unsigned long long Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, float Ax, float Xx, - float Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, double Ax, double Xx, - double Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, long double Ax, - long double Xx, long double Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Xx, npy_cfloat_wrapper Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Xx, npy_cdouble_wrapper Yx) - csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Xx, npy_clongdouble_wrapper Yx) """ - return _csc.csc_matvec(*args) + csc_matvec(int n_row, int n_col, int Ap, int Ai, signed char Ax, + signed char Xx, signed char Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + unsigned char Xx, unsigned char Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, short Ax, short Xx, + short Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + unsigned short Xx, unsigned short Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, int Ax, int Xx, + int Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + unsigned int Xx, unsigned int Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, long long Ax, + long long Xx, long long Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + unsigned long long Xx, unsigned long long Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, float Ax, float Xx, + float Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, double Ax, double Xx, + double Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, long double Ax, + long double Xx, long double Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Xx, npy_cfloat_wrapper Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Xx, npy_cdouble_wrapper Yx) + csc_matvec(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Xx, npy_clongdouble_wrapper Yx) + """ + return _csc.csc_matvec(*args) def csc_elmul_csc(*args): - """ - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bi, signed char Bx, int Cp, int Ci, - signed char Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bi, unsigned char Bx, int Cp, - int Ci, unsigned char Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bi, short Bx, int Cp, int Ci, short Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bi, unsigned short Bx, int Cp, - int Ci, unsigned short Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bi, int Bx, int Cp, int Ci, int Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bi, unsigned int Bx, int Cp, - int Ci, unsigned int Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bi, long long Bx, int Cp, int Ci, - long long Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx, - int Cp, int Ci, unsigned long long Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bi, float Bx, int Cp, int Ci, float Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bi, double Bx, int Cp, int Ci, double Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bi, long double Bx, int Cp, int Ci, - long double Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx, - int Cp, int Ci, npy_cfloat_wrapper Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx, - int Cp, int Ci, npy_cdouble_wrapper Cx) - csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx, - int Cp, int Ci, npy_clongdouble_wrapper Cx) """ - return _csc.csc_elmul_csc(*args) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bi, signed char Bx, int Cp, int Ci, + signed char Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bi, unsigned char Bx, int Cp, + int Ci, unsigned char Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bi, short Bx, int Cp, int Ci, short Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bi, unsigned short Bx, int Cp, + int Ci, unsigned short Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bi, int Bx, int Cp, int Ci, int Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bi, unsigned int Bx, int Cp, + int Ci, unsigned int Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bi, long long Bx, int Cp, int Ci, + long long Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx, + int Cp, int Ci, unsigned long long Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bi, float Bx, int Cp, int Ci, float Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bi, double Bx, int Cp, int Ci, double Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bi, long double Bx, int Cp, int Ci, + long double Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx, + int Cp, int Ci, npy_cfloat_wrapper Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx, + int Cp, int Ci, npy_cdouble_wrapper Cx) + csc_elmul_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx, + int Cp, int Ci, npy_clongdouble_wrapper Cx) + """ + return _csc.csc_elmul_csc(*args) def csc_eldiv_csc(*args): - """ - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bi, signed char Bx, int Cp, int Ci, - signed char Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bi, unsigned char Bx, int Cp, - int Ci, unsigned char Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bi, short Bx, int Cp, int Ci, short Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bi, unsigned short Bx, int Cp, - int Ci, unsigned short Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bi, int Bx, int Cp, int Ci, int Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bi, unsigned int Bx, int Cp, - int Ci, unsigned int Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bi, long long Bx, int Cp, int Ci, - long long Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx, - int Cp, int Ci, unsigned long long Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bi, float Bx, int Cp, int Ci, float Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bi, double Bx, int Cp, int Ci, double Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bi, long double Bx, int Cp, int Ci, - long double Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx, - int Cp, int Ci, npy_cfloat_wrapper Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx, - int Cp, int Ci, npy_cdouble_wrapper Cx) - csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx, - int Cp, int Ci, npy_clongdouble_wrapper Cx) """ - return _csc.csc_eldiv_csc(*args) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bi, signed char Bx, int Cp, int Ci, + signed char Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bi, unsigned char Bx, int Cp, + int Ci, unsigned char Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bi, short Bx, int Cp, int Ci, short Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bi, unsigned short Bx, int Cp, + int Ci, unsigned short Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bi, int Bx, int Cp, int Ci, int Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bi, unsigned int Bx, int Cp, + int Ci, unsigned int Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bi, long long Bx, int Cp, int Ci, + long long Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx, + int Cp, int Ci, unsigned long long Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bi, float Bx, int Cp, int Ci, float Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bi, double Bx, int Cp, int Ci, double Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bi, long double Bx, int Cp, int Ci, + long double Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx, + int Cp, int Ci, npy_cfloat_wrapper Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx, + int Cp, int Ci, npy_cdouble_wrapper Cx) + csc_eldiv_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx, + int Cp, int Ci, npy_clongdouble_wrapper Cx) + """ + return _csc.csc_eldiv_csc(*args) def csc_plus_csc(*args): - """ - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bi, signed char Bx, int Cp, int Ci, - signed char Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bi, unsigned char Bx, int Cp, - int Ci, unsigned char Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bi, short Bx, int Cp, int Ci, short Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bi, unsigned short Bx, int Cp, - int Ci, unsigned short Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bi, int Bx, int Cp, int Ci, int Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bi, unsigned int Bx, int Cp, - int Ci, unsigned int Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bi, long long Bx, int Cp, int Ci, - long long Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx, - int Cp, int Ci, unsigned long long Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bi, float Bx, int Cp, int Ci, float Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bi, double Bx, int Cp, int Ci, double Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bi, long double Bx, int Cp, int Ci, - long double Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx, - int Cp, int Ci, npy_cfloat_wrapper Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx, - int Cp, int Ci, npy_cdouble_wrapper Cx) - csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx, - int Cp, int Ci, npy_clongdouble_wrapper Cx) """ - return _csc.csc_plus_csc(*args) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bi, signed char Bx, int Cp, int Ci, + signed char Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bi, unsigned char Bx, int Cp, + int Ci, unsigned char Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bi, short Bx, int Cp, int Ci, short Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bi, unsigned short Bx, int Cp, + int Ci, unsigned short Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bi, int Bx, int Cp, int Ci, int Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bi, unsigned int Bx, int Cp, + int Ci, unsigned int Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bi, long long Bx, int Cp, int Ci, + long long Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx, + int Cp, int Ci, unsigned long long Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bi, float Bx, int Cp, int Ci, float Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bi, double Bx, int Cp, int Ci, double Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bi, long double Bx, int Cp, int Ci, + long double Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx, + int Cp, int Ci, npy_cfloat_wrapper Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx, + int Cp, int Ci, npy_cdouble_wrapper Cx) + csc_plus_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx, + int Cp, int Ci, npy_clongdouble_wrapper Cx) + """ + return _csc.csc_plus_csc(*args) def csc_minus_csc(*args): - """ - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, - int Bp, int Bi, signed char Bx, int Cp, int Ci, - signed char Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, - int Bp, int Bi, unsigned char Bx, int Cp, - int Ci, unsigned char Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, - int Bi, short Bx, int Cp, int Ci, short Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, - int Bp, int Bi, unsigned short Bx, int Cp, - int Ci, unsigned short Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, - int Bi, int Bx, int Cp, int Ci, int Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, - int Bp, int Bi, unsigned int Bx, int Cp, - int Ci, unsigned int Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, - int Bp, int Bi, long long Bx, int Cp, int Ci, - long long Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx, - int Cp, int Ci, unsigned long long Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, - int Bi, float Bx, int Cp, int Ci, float Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, - int Bi, double Bx, int Cp, int Ci, double Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, - int Bp, int Bi, long double Bx, int Cp, int Ci, - long double Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx, - int Cp, int Ci, npy_cfloat_wrapper Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx, - int Cp, int Ci, npy_cdouble_wrapper Cx) - csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx, - int Cp, int Ci, npy_clongdouble_wrapper Cx) """ - return _csc.csc_minus_csc(*args) - + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, signed char Ax, + int Bp, int Bi, signed char Bx, int Cp, int Ci, + signed char Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned char Ax, + int Bp, int Bi, unsigned char Bx, int Cp, + int Ci, unsigned char Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, short Ax, int Bp, + int Bi, short Bx, int Cp, int Ci, short Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned short Ax, + int Bp, int Bi, unsigned short Bx, int Cp, + int Ci, unsigned short Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, int Ax, int Bp, + int Bi, int Bx, int Cp, int Ci, int Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned int Ax, + int Bp, int Bi, unsigned int Bx, int Cp, + int Ci, unsigned int Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, long long Ax, + int Bp, int Bi, long long Bx, int Cp, int Ci, + long long Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx, + int Cp, int Ci, unsigned long long Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, float Ax, int Bp, + int Bi, float Bx, int Cp, int Ci, float Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, double Ax, int Bp, + int Bi, double Bx, int Cp, int Ci, double Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, long double Ax, + int Bp, int Bi, long double Bx, int Cp, int Ci, + long double Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx, + int Cp, int Ci, npy_cfloat_wrapper Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx, + int Cp, int Ci, npy_cdouble_wrapper Cx) + csc_minus_csc(int n_row, int n_col, int Ap, int Ai, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx, + int Cp, int Ci, npy_clongdouble_wrapper Cx) + """ + return _csc.csc_minus_csc(*args) Modified: trunk/scipy/sparse/sparsetools/csr.py =================================================================== --- trunk/scipy/sparse/sparsetools/csr.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/csr.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -50,532 +50,531 @@ def expandptr(*args): - """expandptr(int n_row, int Ap, int Bi)""" - return _csr.expandptr(*args) + """expandptr(int n_row, int Ap, int Bi)""" + return _csr.expandptr(*args) def csr_count_blocks(*args): - """csr_count_blocks(int n_row, int n_col, int R, int C, int Ap, int Aj) -> int""" - return _csr.csr_count_blocks(*args) + """csr_count_blocks(int n_row, int n_col, int R, int C, int Ap, int Aj) -> int""" + return _csr.csr_count_blocks(*args) def csr_matmat_pass1(*args): - """ - csr_matmat_pass1(int n_row, int n_col, int Ap, int Aj, int Bp, int Bj, - int Cp) """ - return _csr.csr_matmat_pass1(*args) + csr_matmat_pass1(int n_row, int n_col, int Ap, int Aj, int Bp, int Bj, + int Cp) + """ + return _csr.csr_matmat_pass1(*args) def csr_has_sorted_indices(*args): - """csr_has_sorted_indices(int n_row, int Ap, int Aj) -> bool""" - return _csr.csr_has_sorted_indices(*args) + """csr_has_sorted_indices(int n_row, int Ap, int Aj) -> bool""" + return _csr.csr_has_sorted_indices(*args) def csr_diagonal(*args): - """ - csr_diagonal(int n_row, int n_col, int Ap, int Aj, signed char Ax, - signed char Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - unsigned char Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, short Ax, short Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - unsigned short Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, int Ax, int Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - unsigned int Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, long long Ax, - long long Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - unsigned long long Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, float Ax, float Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, double Ax, double Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, long double Ax, - long double Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Yx) - csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Yx) """ - return _csr.csr_diagonal(*args) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, signed char Ax, + signed char Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + unsigned char Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, short Ax, short Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + unsigned short Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, int Ax, int Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + unsigned int Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, long long Ax, + long long Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + unsigned long long Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, float Ax, float Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, double Ax, double Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, long double Ax, + long double Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Yx) + csr_diagonal(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Yx) + """ + return _csr.csr_diagonal(*args) def csr_scale_rows(*args): - """ - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, signed char Ax, - signed char Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - unsigned char Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - unsigned short Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - unsigned int Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, long long Ax, - long long Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - unsigned long long Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, long double Ax, - long double Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Xx) - csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Xx) """ - return _csr.csr_scale_rows(*args) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, signed char Ax, + signed char Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + unsigned char Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + unsigned short Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + unsigned int Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, long long Ax, + long long Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + unsigned long long Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, long double Ax, + long double Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Xx) + csr_scale_rows(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Xx) + """ + return _csr.csr_scale_rows(*args) def csr_scale_columns(*args): - """ - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, signed char Ax, - signed char Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - unsigned char Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - unsigned short Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - unsigned int Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, long long Ax, - long long Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - unsigned long long Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, long double Ax, - long double Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Xx) - csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Xx) """ - return _csr.csr_scale_columns(*args) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, signed char Ax, + signed char Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + unsigned char Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + unsigned short Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + unsigned int Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, long long Ax, + long long Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + unsigned long long Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, long double Ax, + long double Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Xx) + csr_scale_columns(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Xx) + """ + return _csr.csr_scale_columns(*args) def csr_tocsc(*args): - """ - csr_tocsc(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bi, signed char Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bi, unsigned char Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bi, short Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bi, unsigned short Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bi, int Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bi, unsigned int Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bi, long long Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bi, unsigned long long Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bi, float Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bi, double Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bi, long double Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bi, npy_cfloat_wrapper Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bi, npy_cdouble_wrapper Bx) - csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bi, npy_clongdouble_wrapper Bx) """ - return _csr.csr_tocsc(*args) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bi, signed char Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bi, unsigned char Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bi, short Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bi, unsigned short Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bi, int Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bi, unsigned int Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bi, long long Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bi, unsigned long long Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bi, float Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bi, double Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bi, long double Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bi, npy_cfloat_wrapper Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bi, npy_cdouble_wrapper Bx) + csr_tocsc(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bi, npy_clongdouble_wrapper Bx) + """ + return _csr.csr_tocsc(*args) def csr_tobsr(*args): - """ - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - signed char Ax, int Bp, int Bj, signed char Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned char Ax, int Bp, int Bj, unsigned char Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - short Ax, int Bp, int Bj, short Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned short Ax, int Bp, int Bj, unsigned short Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - int Ax, int Bp, int Bj, int Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned int Ax, int Bp, int Bj, unsigned int Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long long Ax, int Bp, int Bj, long long Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - unsigned long long Ax, int Bp, int Bj, unsigned long long Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - float Ax, int Bp, int Bj, float Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - double Ax, int Bp, int Bj, double Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - long double Ax, int Bp, int Bj, long double Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx) - csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, - npy_clongdouble_wrapper Ax, int Bp, int Bj, - npy_clongdouble_wrapper Bx) """ - return _csr.csr_tobsr(*args) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + signed char Ax, int Bp, int Bj, signed char Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned char Ax, int Bp, int Bj, unsigned char Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + short Ax, int Bp, int Bj, short Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned short Ax, int Bp, int Bj, unsigned short Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + int Ax, int Bp, int Bj, int Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned int Ax, int Bp, int Bj, unsigned int Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long long Ax, int Bp, int Bj, long long Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + unsigned long long Ax, int Bp, int Bj, unsigned long long Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + float Ax, int Bp, int Bj, float Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + double Ax, int Bp, int Bj, double Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + long double Ax, int Bp, int Bj, long double Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cfloat_wrapper Ax, int Bp, int Bj, npy_cfloat_wrapper Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_cdouble_wrapper Ax, int Bp, int Bj, npy_cdouble_wrapper Bx) + csr_tobsr(int n_row, int n_col, int R, int C, int Ap, int Aj, + npy_clongdouble_wrapper Ax, int Bp, int Bj, + npy_clongdouble_wrapper Bx) + """ + return _csr.csr_tobsr(*args) def csr_matmat_pass2(*args): - """ - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx, int Cp, int Cj, - signed char Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx, int Cp, - int Cj, unsigned char Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bj, short Bx, int Cp, int Cj, short Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx, int Cp, - int Cj, unsigned short Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bj, int Bx, int Cp, int Cj, int Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx, int Cp, - int Cj, unsigned int Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bj, long long Bx, int Cp, int Cj, - long long Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bj, float Bx, int Cp, int Cj, float Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bj, double Bx, int Cp, int Cj, double Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bj, long double Bx, int Cp, int Cj, - long double Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx, - int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _csr.csr_matmat_pass2(*args) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx, int Cp, int Cj, + signed char Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx, int Cp, + int Cj, unsigned char Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bj, short Bx, int Cp, int Cj, short Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx, int Cp, + int Cj, unsigned short Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bj, int Bx, int Cp, int Cj, int Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx, int Cp, + int Cj, unsigned int Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bj, long long Bx, int Cp, int Cj, + long long Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bj, float Bx, int Cp, int Cj, float Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bj, double Bx, int Cp, int Cj, double Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bj, long double Bx, int Cp, int Cj, + long double Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + csr_matmat_pass2(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx, + int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _csr.csr_matmat_pass2(*args) def csr_matvec(*args): - """ - csr_matvec(int n_row, int n_col, int Ap, int Aj, signed char Ax, - signed char Xx, signed char Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - unsigned char Xx, unsigned char Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx, - short Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - unsigned short Xx, unsigned short Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx, - int Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - unsigned int Xx, unsigned int Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, long long Ax, - long long Xx, long long Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - unsigned long long Xx, unsigned long long Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx, - float Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx, - double Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, long double Ax, - long double Xx, long double Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - npy_cfloat_wrapper Xx, npy_cfloat_wrapper Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - npy_cdouble_wrapper Xx, npy_cdouble_wrapper Yx) - csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - npy_clongdouble_wrapper Xx, npy_clongdouble_wrapper Yx) """ - return _csr.csr_matvec(*args) + csr_matvec(int n_row, int n_col, int Ap, int Aj, signed char Ax, + signed char Xx, signed char Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + unsigned char Xx, unsigned char Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, short Ax, short Xx, + short Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + unsigned short Xx, unsigned short Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, int Ax, int Xx, + int Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + unsigned int Xx, unsigned int Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, long long Ax, + long long Xx, long long Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + unsigned long long Xx, unsigned long long Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, float Ax, float Xx, + float Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, double Ax, double Xx, + double Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, long double Ax, + long double Xx, long double Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + npy_cfloat_wrapper Xx, npy_cfloat_wrapper Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + npy_cdouble_wrapper Xx, npy_cdouble_wrapper Yx) + csr_matvec(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + npy_clongdouble_wrapper Xx, npy_clongdouble_wrapper Yx) + """ + return _csr.csr_matvec(*args) def csr_elmul_csr(*args): - """ - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx, int Cp, int Cj, - signed char Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx, int Cp, - int Cj, unsigned char Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bj, short Bx, int Cp, int Cj, short Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx, int Cp, - int Cj, unsigned short Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bj, int Bx, int Cp, int Cj, int Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx, int Cp, - int Cj, unsigned int Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bj, long long Bx, int Cp, int Cj, - long long Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bj, float Bx, int Cp, int Cj, float Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bj, double Bx, int Cp, int Cj, double Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bj, long double Bx, int Cp, int Cj, - long double Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx, - int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _csr.csr_elmul_csr(*args) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx, int Cp, int Cj, + signed char Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx, int Cp, + int Cj, unsigned char Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bj, short Bx, int Cp, int Cj, short Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx, int Cp, + int Cj, unsigned short Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bj, int Bx, int Cp, int Cj, int Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx, int Cp, + int Cj, unsigned int Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bj, long long Bx, int Cp, int Cj, + long long Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bj, float Bx, int Cp, int Cj, float Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bj, double Bx, int Cp, int Cj, double Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bj, long double Bx, int Cp, int Cj, + long double Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + csr_elmul_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx, + int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _csr.csr_elmul_csr(*args) def csr_eldiv_csr(*args): - """ - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx, int Cp, int Cj, - signed char Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx, int Cp, - int Cj, unsigned char Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bj, short Bx, int Cp, int Cj, short Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx, int Cp, - int Cj, unsigned short Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bj, int Bx, int Cp, int Cj, int Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx, int Cp, - int Cj, unsigned int Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bj, long long Bx, int Cp, int Cj, - long long Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bj, float Bx, int Cp, int Cj, float Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bj, double Bx, int Cp, int Cj, double Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bj, long double Bx, int Cp, int Cj, - long double Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx, - int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _csr.csr_eldiv_csr(*args) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx, int Cp, int Cj, + signed char Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx, int Cp, + int Cj, unsigned char Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bj, short Bx, int Cp, int Cj, short Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx, int Cp, + int Cj, unsigned short Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bj, int Bx, int Cp, int Cj, int Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx, int Cp, + int Cj, unsigned int Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bj, long long Bx, int Cp, int Cj, + long long Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bj, float Bx, int Cp, int Cj, float Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bj, double Bx, int Cp, int Cj, double Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bj, long double Bx, int Cp, int Cj, + long double Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + csr_eldiv_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx, + int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _csr.csr_eldiv_csr(*args) def csr_plus_csr(*args): - """ - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx, int Cp, int Cj, - signed char Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx, int Cp, - int Cj, unsigned char Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bj, short Bx, int Cp, int Cj, short Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx, int Cp, - int Cj, unsigned short Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bj, int Bx, int Cp, int Cj, int Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx, int Cp, - int Cj, unsigned int Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bj, long long Bx, int Cp, int Cj, - long long Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bj, float Bx, int Cp, int Cj, float Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bj, double Bx, int Cp, int Cj, double Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bj, long double Bx, int Cp, int Cj, - long double Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx, - int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _csr.csr_plus_csr(*args) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx, int Cp, int Cj, + signed char Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx, int Cp, + int Cj, unsigned char Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bj, short Bx, int Cp, int Cj, short Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx, int Cp, + int Cj, unsigned short Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bj, int Bx, int Cp, int Cj, int Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx, int Cp, + int Cj, unsigned int Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bj, long long Bx, int Cp, int Cj, + long long Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bj, float Bx, int Cp, int Cj, float Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bj, double Bx, int Cp, int Cj, double Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bj, long double Bx, int Cp, int Cj, + long double Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + csr_plus_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx, + int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _csr.csr_plus_csr(*args) def csr_minus_csr(*args): - """ - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int Bp, int Bj, signed char Bx, int Cp, int Cj, - signed char Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int Bp, int Bj, unsigned char Bx, int Cp, - int Cj, unsigned char Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, - int Bj, short Bx, int Cp, int Cj, short Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int Bp, int Bj, unsigned short Bx, int Cp, - int Cj, unsigned short Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, - int Bj, int Bx, int Cp, int Cj, int Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int Bp, int Bj, unsigned int Bx, int Cp, - int Cj, unsigned int Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, - int Bp, int Bj, long long Bx, int Cp, int Cj, - long long Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int Bp, int Bj, unsigned long long Bx, - int Cp, int Cj, unsigned long long Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, - int Bj, float Bx, int Cp, int Cj, float Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, - int Bj, double Bx, int Cp, int Cj, double Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, - int Bp, int Bj, long double Bx, int Cp, int Cj, - long double Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int Bp, int Bj, npy_cfloat_wrapper Bx, - int Cp, int Cj, npy_cfloat_wrapper Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int Bp, int Bj, npy_cdouble_wrapper Bx, - int Cp, int Cj, npy_cdouble_wrapper Cx) - csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int Bp, int Bj, npy_clongdouble_wrapper Bx, - int Cp, int Cj, npy_clongdouble_wrapper Cx) """ - return _csr.csr_minus_csr(*args) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int Bp, int Bj, signed char Bx, int Cp, int Cj, + signed char Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int Bp, int Bj, unsigned char Bx, int Cp, + int Cj, unsigned char Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, short Ax, int Bp, + int Bj, short Bx, int Cp, int Cj, short Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int Bp, int Bj, unsigned short Bx, int Cp, + int Cj, unsigned short Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, int Ax, int Bp, + int Bj, int Bx, int Cp, int Cj, int Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int Bp, int Bj, unsigned int Bx, int Cp, + int Cj, unsigned int Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, long long Ax, + int Bp, int Bj, long long Bx, int Cp, int Cj, + long long Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int Bp, int Bj, unsigned long long Bx, + int Cp, int Cj, unsigned long long Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, float Ax, int Bp, + int Bj, float Bx, int Cp, int Cj, float Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, double Ax, int Bp, + int Bj, double Bx, int Cp, int Cj, double Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, long double Ax, + int Bp, int Bj, long double Bx, int Cp, int Cj, + long double Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int Bp, int Bj, npy_cfloat_wrapper Bx, + int Cp, int Cj, npy_cfloat_wrapper Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int Bp, int Bj, npy_cdouble_wrapper Bx, + int Cp, int Cj, npy_cdouble_wrapper Cx) + csr_minus_csr(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int Bp, int Bj, npy_clongdouble_wrapper Bx, + int Cp, int Cj, npy_clongdouble_wrapper Cx) + """ + return _csr.csr_minus_csr(*args) def csr_sort_indices(*args): - """ - csr_sort_indices(int n_row, int Ap, int Aj, signed char Ax) - csr_sort_indices(int n_row, int Ap, int Aj, unsigned char Ax) - csr_sort_indices(int n_row, int Ap, int Aj, short Ax) - csr_sort_indices(int n_row, int Ap, int Aj, unsigned short Ax) - csr_sort_indices(int n_row, int Ap, int Aj, int Ax) - csr_sort_indices(int n_row, int Ap, int Aj, unsigned int Ax) - csr_sort_indices(int n_row, int Ap, int Aj, long long Ax) - csr_sort_indices(int n_row, int Ap, int Aj, unsigned long long Ax) - csr_sort_indices(int n_row, int Ap, int Aj, float Ax) - csr_sort_indices(int n_row, int Ap, int Aj, double Ax) - csr_sort_indices(int n_row, int Ap, int Aj, long double Ax) - csr_sort_indices(int n_row, int Ap, int Aj, npy_cfloat_wrapper Ax) - csr_sort_indices(int n_row, int Ap, int Aj, npy_cdouble_wrapper Ax) - csr_sort_indices(int n_row, int Ap, int Aj, npy_clongdouble_wrapper Ax) """ - return _csr.csr_sort_indices(*args) + csr_sort_indices(int n_row, int Ap, int Aj, signed char Ax) + csr_sort_indices(int n_row, int Ap, int Aj, unsigned char Ax) + csr_sort_indices(int n_row, int Ap, int Aj, short Ax) + csr_sort_indices(int n_row, int Ap, int Aj, unsigned short Ax) + csr_sort_indices(int n_row, int Ap, int Aj, int Ax) + csr_sort_indices(int n_row, int Ap, int Aj, unsigned int Ax) + csr_sort_indices(int n_row, int Ap, int Aj, long long Ax) + csr_sort_indices(int n_row, int Ap, int Aj, unsigned long long Ax) + csr_sort_indices(int n_row, int Ap, int Aj, float Ax) + csr_sort_indices(int n_row, int Ap, int Aj, double Ax) + csr_sort_indices(int n_row, int Ap, int Aj, long double Ax) + csr_sort_indices(int n_row, int Ap, int Aj, npy_cfloat_wrapper Ax) + csr_sort_indices(int n_row, int Ap, int Aj, npy_cdouble_wrapper Ax) + csr_sort_indices(int n_row, int Ap, int Aj, npy_clongdouble_wrapper Ax) + """ + return _csr.csr_sort_indices(*args) def csr_eliminate_zeros(*args): - """ - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, signed char Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned char Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, short Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned short Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, int Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned int Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, long long Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, float Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, double Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, long double Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax) - csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax) """ - return _csr.csr_eliminate_zeros(*args) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, signed char Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned char Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, short Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned short Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, int Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned int Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, long long Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, float Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, double Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, long double Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax) + csr_eliminate_zeros(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax) + """ + return _csr.csr_eliminate_zeros(*args) def csr_sum_duplicates(*args): - """ - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, signed char Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned char Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, short Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned short Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, int Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned int Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, long long Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, float Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, double Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, long double Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax) - csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax) """ - return _csr.csr_sum_duplicates(*args) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, signed char Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned char Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, short Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned short Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, int Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned int Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, long long Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, float Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, double Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, long double Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax) + csr_sum_duplicates(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax) + """ + return _csr.csr_sum_duplicates(*args) def get_csr_submatrix(*args): - """ - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, signed char Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(signed char)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(unsigned char)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, short Ax, int ir0, - int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(short)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(unsigned short)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, int Ax, int ir0, - int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(int)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(unsigned int)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, long long Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(long long)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, - int ir0, int ir1, int ic0, int ic1, - std::vector<(int)> Bp, std::vector<(int)> Bj, - std::vector<(unsigned long long)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, float Ax, int ir0, - int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(float)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, double Ax, int ir0, - int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(double)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, long double Ax, - int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, - std::vector<(int)> Bj, std::vector<(long double)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, - int ir0, int ir1, int ic0, int ic1, - std::vector<(int)> Bp, std::vector<(int)> Bj, - std::vector<(npy_cfloat_wrapper)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, - int ir0, int ir1, int ic0, int ic1, - std::vector<(int)> Bp, std::vector<(int)> Bj, - std::vector<(npy_cdouble_wrapper)> Bx) - get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, - int ir0, int ir1, int ic0, int ic1, - std::vector<(int)> Bp, std::vector<(int)> Bj, - std::vector<(npy_clongdouble_wrapper)> Bx) """ - return _csr.get_csr_submatrix(*args) - + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, signed char Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(signed char)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned char Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(unsigned char)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, short Ax, int ir0, + int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(short)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned short Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(unsigned short)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, int Ax, int ir0, + int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(int)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned int Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(unsigned int)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, long long Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(long long)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, unsigned long long Ax, + int ir0, int ir1, int ic0, int ic1, + std::vector<(int)> Bp, std::vector<(int)> Bj, + std::vector<(unsigned long long)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, float Ax, int ir0, + int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(float)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, double Ax, int ir0, + int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(double)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, long double Ax, + int ir0, int ir1, int ic0, int ic1, std::vector<(int)> Bp, + std::vector<(int)> Bj, std::vector<(long double)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_cfloat_wrapper Ax, + int ir0, int ir1, int ic0, int ic1, + std::vector<(int)> Bp, std::vector<(int)> Bj, + std::vector<(npy_cfloat_wrapper)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_cdouble_wrapper Ax, + int ir0, int ir1, int ic0, int ic1, + std::vector<(int)> Bp, std::vector<(int)> Bj, + std::vector<(npy_cdouble_wrapper)> Bx) + get_csr_submatrix(int n_row, int n_col, int Ap, int Aj, npy_clongdouble_wrapper Ax, + int ir0, int ir1, int ic0, int ic1, + std::vector<(int)> Bp, std::vector<(int)> Bj, + std::vector<(npy_clongdouble_wrapper)> Bx) + """ + return _csr.get_csr_submatrix(*args) Modified: trunk/scipy/sparse/sparsetools/dia.py =================================================================== --- trunk/scipy/sparse/sparsetools/dia.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/dia.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -51,40 +51,39 @@ def dia_matvec(*args): - """ - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - signed char diags, signed char Xx, signed char Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - unsigned char diags, unsigned char Xx, unsigned char Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - short diags, short Xx, short Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - unsigned short diags, unsigned short Xx, - unsigned short Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - int diags, int Xx, int Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - unsigned int diags, unsigned int Xx, unsigned int Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - long long diags, long long Xx, long long Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - unsigned long long diags, unsigned long long Xx, - unsigned long long Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - float diags, float Xx, float Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - double diags, double Xx, double Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - long double diags, long double Xx, long double Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - npy_cfloat_wrapper diags, npy_cfloat_wrapper Xx, - npy_cfloat_wrapper Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - npy_cdouble_wrapper diags, npy_cdouble_wrapper Xx, - npy_cdouble_wrapper Yx) - dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, - npy_clongdouble_wrapper diags, npy_clongdouble_wrapper Xx, - npy_clongdouble_wrapper Yx) """ - return _dia.dia_matvec(*args) - + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + signed char diags, signed char Xx, signed char Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + unsigned char diags, unsigned char Xx, unsigned char Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + short diags, short Xx, short Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + unsigned short diags, unsigned short Xx, + unsigned short Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + int diags, int Xx, int Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + unsigned int diags, unsigned int Xx, unsigned int Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + long long diags, long long Xx, long long Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + unsigned long long diags, unsigned long long Xx, + unsigned long long Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + float diags, float Xx, float Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + double diags, double Xx, double Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + long double diags, long double Xx, long double Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + npy_cfloat_wrapper diags, npy_cfloat_wrapper Xx, + npy_cfloat_wrapper Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + npy_cdouble_wrapper diags, npy_cdouble_wrapper Xx, + npy_cdouble_wrapper Yx) + dia_matvec(int n_row, int n_col, int n_diags, int L, int offsets, + npy_clongdouble_wrapper diags, npy_clongdouble_wrapper Xx, + npy_clongdouble_wrapper Yx) + """ + return _dia.dia_matvec(*args) Modified: trunk/scipy/sparse/sparsetools/setupscons.py =================================================================== --- trunk/scipy/sparse/sparsetools/setupscons.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sparsetools/setupscons.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -7,7 +7,7 @@ import numpy from numpy.distutils.misc_util import Configuration - config = Configuration('sparsetools',parent_package,top_path, + config = Configuration('sparsetools',parent_package,top_path, setup_name = 'setupscons.py') config.add_sconscript('SConstruct') Modified: trunk/scipy/sparse/spfuncs.py =================================================================== --- trunk/scipy/sparse/spfuncs.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/spfuncs.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -82,12 +82,12 @@ elif e33 > efficiency: return (3,3) elif e22 > efficiency: - return (2,2) + return (2,2) else: return (1,1) def count_blocks(A,blocksize): - """For a given blocksize=(r,c) count the number of occupied + """For a given blocksize=(r,c) count the number of occupied blocks in a sparse matrix A """ r,c = blocksize @@ -101,4 +101,3 @@ return count_blocks(A.T,(c,r)) else: return count_blocks(csr_matrix(A),blocksize) - Modified: trunk/scipy/sparse/sputils.py =================================================================== --- trunk/scipy/sparse/sputils.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/sputils.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -16,14 +16,14 @@ supported_dtypes = [ np.typeDict[x] for x in supported_dtypes] def upcast(*args): - """Returns the nearest supported sparse dtype for the + """Returns the nearest supported sparse dtype for the combination of one or more types. upcast(t0, t1, ..., tn) -> T where T is a supported dtype Examples -------- - + >>> upcast('int32') >>> upcast('bool') @@ -38,12 +38,12 @@ for t in args[1:]: sample = sample + np.array([0],dtype=t) - upcast = sample.dtype + upcast = sample.dtype for t in supported_dtypes: if np.can_cast(sample.dtype,t): return t - + raise TypeError,'no supported conversion for types: %s' % args @@ -118,4 +118,3 @@ def isdense(x): return _isinstance(x, np.ndarray) - Modified: trunk/scipy/sparse/tests/bench_sparse.py =================================================================== --- trunk/scipy/sparse/tests/bench_sparse.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/tests/bench_sparse.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -50,7 +50,7 @@ #matrices.append( ('A','Identity', sparse.identity(500**2,format='csr')) ) matrices.append( ('A','Poisson5pt', poisson2d(500,format='csr')) ) matrices.append( ('B','Poisson5pt^2', poisson2d(500,format='csr')**2) ) - + print print ' Sparse Matrix Arithmetic' print '====================================================================' @@ -64,7 +64,7 @@ dtype = mat.dtype.name.center(9) print fmt % (var,name,shape,dtype,mat.nnz) - space = ' ' * 10 + space = ' ' * 10 print print space+' Timings' print space+'==========================================' @@ -91,7 +91,7 @@ operation = (X + '.' + op + '(' + Y + ')').center(17) print fmt % (format,operation,msec_per_it) - + def bench_sort(self): """sort CSR column indices""" matrices = [] @@ -109,14 +109,14 @@ fmt = ' %3s | %12s | %20s | %8d | %6.2f ' for name,N,K in matrices: - N = int(N) + N = int(N) A = random_sparse(N,N,K) - + start = time.clock() iter = 0 while iter < 5 and time.clock() - start < 1: A.has_sorted_indices = False - A.sort_indices() + A.sort_indices() iter += 1 end = time.clock() @@ -136,7 +136,7 @@ A = sparse.kron(poisson2d(150),ones((2,2))).tobsr(blocksize=(2,2)) matrices.append( ('Block2x2', A.tocsr()) ) matrices.append( ('Block2x2', A) ) - + A = sparse.kron(poisson2d(100),ones((3,3))).tobsr(blocksize=(3,3)) matrices.append( ('Block3x3', A.tocsr()) ) matrices.append( ('Block3x3', A) ) @@ -172,14 +172,14 @@ MFLOPs = (2*A.nnz*iter/(end-start))/float(1e6) print fmt % (A.format,name,shape,A.nnz,MFLOPs) - + def bench_construction(self): """build matrices by inserting single values""" matrices = [] matrices.append( ('Empty',csr_matrix((10000,10000))) ) matrices.append( ('Identity',sparse.identity(10000)) ) matrices.append( ('Poisson5pt', poisson2d(100)) ) - + print print ' Sparse Matrix Construction' print '====================================================================' @@ -189,11 +189,11 @@ for name,A in matrices: A = A.tocoo() - - for format in ['lil','dok']: + for format in ['lil','dok']: + start = time.clock() - + iter = 0 while time.clock() < start + 0.5: T = eval(format + '_matrix')(A.shape) @@ -212,16 +212,16 @@ A = poisson2d(100) formats = ['csr','csc','coo','lil','dok'] - + print print ' Sparse Matrix Conversion' print '==========================================================' print ' format | tocsr() | tocsc() | tocoo() | tolil() | todok() ' print '----------------------------------------------------------' - + for fromfmt in formats: base = getattr(A,'to' + fromfmt)() - + times = [] for tofmt in formats: @@ -237,7 +237,7 @@ x = fn() iter += 1 end = time.clock() - del x + del x times.append( (end - start)/float(iter)) output = " %3s " % fromfmt @@ -245,7 +245,7 @@ if t is None: output += '| n/a ' else: - output += '| %5.1fms ' % (1000*t) + output += '| %5.1fms ' % (1000*t) print output @@ -278,4 +278,3 @@ if __name__ == "__main__": nose.run(argv=['', __file__]) - Modified: trunk/scipy/sparse/tests/test_base.py =================================================================== --- trunk/scipy/sparse/tests/test_base.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/tests/test_base.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -43,7 +43,7 @@ def setUp(self): self.dat = matrix([[1,0,0,2],[3,0,1,0],[0,2,0,0]],'d') self.datsp = self.spmatrix(self.dat) - + def test_repr(self): repr(self.datsp) @@ -79,7 +79,7 @@ D = matrix([[1 + 3j, 2 - 4j]]) A = self.spmatrix(D) assert_equal(A.real.todense(),D.real) - + def test_imag(self): D = matrix([[1 + 3j, 2 - 4j]]) A = self.spmatrix(D) @@ -103,7 +103,7 @@ for m in mats: assert_equal(self.spmatrix(m).diagonal(),diag(m)) - + def test_sum(self): """Does the matrix's .sum(axis=...) method work? """ @@ -156,13 +156,13 @@ assert_array_equal(dense_dot_dense, check2) def test_asfptype(self): - A = self.spmatrix( arange(6,dtype='int32').reshape(2,3) ) + A = self.spmatrix( arange(6,dtype='int32').reshape(2,3) ) assert_equal( A.dtype , 'int32' ) assert_equal( A.asfptype().dtype, 'float64' ) assert_equal( A.astype('int16').asfptype().dtype , 'float32' ) assert_equal( A.astype('complex128').asfptype().dtype , 'complex128' ) - + B = A.asfptype() C = B.asfptype() assert( B is C ) @@ -171,7 +171,7 @@ def test_mul_scalar(self): assert_array_equal(self.dat*2,(self.datsp*2).todense()) assert_array_equal(self.dat*17.3,(self.datsp*17.3).todense()) - + def test_rmul_scalar(self): assert_array_equal(2*self.dat,(2*self.datsp).todense()) assert_array_equal(17.3*self.dat,(17.3*self.datsp).todense()) @@ -215,13 +215,13 @@ assert_array_equal(c.todense(),[[1,0,0,4],[9,0,1,0],[0,4,0,0]]) def test_eldiv(self): - expected = [[1,0,0,1],[1,0,1,0],[0,1,0,0]] + expected = [[1,0,0,1],[1,0,1,0],[0,1,0,0]] assert_array_equal((self.datsp / self.datsp).todense(),expected) denom = self.spmatrix(matrix([[1,0,0,4],[-1,0,0,0],[0,8,0,-5]],'d')) res = matrix([[1,0,0,0.5],[-3,0,numpy.inf,0],[0,0.25,0,0]],'d') assert_array_equal((self.datsp / denom).todense(),res) - + def test_pow(self): A = matrix([[1,0,2,0],[0,3,4,0],[0,5,0,0],[0,6,7,8]]) B = self.spmatrix( A ) @@ -257,8 +257,8 @@ #check result type assert(isinstance( M * array([1,2,3]), ndarray)) assert(isinstance( M * matrix([1,2,3]).T, matrix)) - + #ensure exception is raised for improper dimensions bad_vecs = [array([1,2]), array([1,2,3,4]), array([[1],[2]]), matrix([1,2,3]), matrix([[1],[2]])] @@ -363,7 +363,7 @@ a = A.asformat(format) assert_equal(a.format,format) assert_array_equal(a.todense(), D) - + b = self.spmatrix(D+3j).asformat(format) assert_equal(b.format,format) assert_array_equal(b.todense(), D+3j) @@ -373,11 +373,11 @@ assert_array_equal(c.todense(), D) - + def test_todia(self): #TODO, add and test .todia(maxdiags) pass - + def test_tocompressedblock(self): x = array([[1,0,2,0],[0,0,0,0],[0,0,4,5]]) y = array([[0,1,2],[3,0,5]]) @@ -385,7 +385,7 @@ Asp = self.spmatrix(A) for format in ['bsr']: fn = getattr(Asp, 'to' + format ) - + for X in [ 1, 2, 3, 6 ]: for Y in [ 1, 2, 3, 4, 6, 12]: assert_equal( fn(blocksize=(X,Y)).todense(), A) @@ -396,7 +396,7 @@ b = self.dat.transpose() assert_array_equal(a.todense(), b) assert_array_equal(a.transpose().todense(), self.dat) - + assert_array_equal( self.spmatrix((3,4)).T.todense(), zeros((4,3)) ) @@ -426,7 +426,7 @@ assert_equal(A.copy().format, A.format) assert_equal(A.__class__(A,copy=True).format, A.format) assert_equal(A.__class__(A,copy=False).format, A.format) - + assert_equal(A.copy().todense(), A.todense()) assert_equal(A.__class__(A,copy=True).todense(), A.todense()) assert_equal(A.__class__(A,copy=False).todense(), A.todense()) @@ -436,12 +436,12 @@ assert_equal(toself().format, A.format) assert_equal(toself(copy=True).format, A.format) assert_equal(toself(copy=False).format, A.format) - + assert_equal(toself().todense(), A.todense()) assert_equal(toself(copy=True).todense(), A.todense()) assert_equal(toself(copy=False).todense(), A.todense()) - + #TODO how can we check whether the data is copied? pass @@ -483,16 +483,16 @@ class _TestMatvecOutput: """test using the matvec() output parameter""" - def test_matvec_output(self): + def test_matvec_output(self): pass #Currently disabled # #flat array # x = array([1.25, -6.5, 0.125, -3.75],dtype='d') # y = zeros(3,dtype='d') -# +# # self.datsp.matvec(x,y) # assert_array_equal(self.datsp*x,y) -# +# # #column vector # x = array([1.25, -6.5, 0.125, -3.75],dtype='d') # x = x.reshape(4,1) @@ -500,24 +500,24 @@ # # self.datsp.matvec(x,y) # assert_array_equal(self.datsp*x,y) -# +# # # improper output type # x = array([1.25, -6.5, 0.125, -3.75],dtype='d') # y = zeros(3,dtype='i') -# +# # self.assertRaises( ValueError, self.datsp.matvec, x, y ) -# +# # # improper output shape # x = array([1.25, -6.5, 0.125, -3.75],dtype='d') # y = zeros(2,dtype='d') -# +# # self.assertRaises( ValueError, self.datsp.matvec, x, y ) # # # proper upcast output type # x = array([1.25, -6.5, 0.125, -3.75],dtype='complex64') # x.imag = [1,2,3,4] # y = zeros(3,dtype='complex128') -# +# # self.datsp.matvec(x,y) # assert_array_equal(self.datsp*x,y) # assert_equal((self.datsp*x).dtype,y.dtype) @@ -638,7 +638,7 @@ B = asmatrix(arange(50.).reshape(5,10)) A = self.spmatrix(B) assert_array_equal(A[2:5,0:3].todense(), B[2:5,0:3]) - assert_array_equal(A[1:,:-1].todense(), B[1:,:-1]) + assert_array_equal(A[1:,:-1].todense(), B[1:,:-1]) assert_array_equal(A[:-1,1:].todense(), B[:-1,1:]) # Now test slicing when a column contains only zeros @@ -663,7 +663,7 @@ # [i,1:2] assert_equal(A[2,:].todense(),B[2,:]) assert_equal(A[2,5:-2].todense(),B[2,5:-2]) - + # [i,[1,2]] assert_equal(A[3,[1,3]].todense(),B[3,[1,3]]) assert_equal(A[-1,[2,-5]].todense(),B[-1,[2,-5]]) @@ -681,15 +681,15 @@ # [[1,2],j] assert_equal(A[[1,3],3].todense(),B[[1,3],3]) assert_equal(A[[2,-5],-4].todense(),B[[2,-5],-4]) - + # [[1,2],1:2] assert_equal(A[[1,3],:].todense(),B[[1,3],:]) assert_equal(A[[2,-5],8:-1].todense(),B[[2,-5],8:-1]) - + # [[1,2],[1,2]] assert_equal(A[[1,3],[2,4]],B[[1,3],[2,4]]) assert_equal(A[[-1,-3],[2,-4]],B[[-1,-3],[2,-4]]) - + # [[[1],[2]],[1,2]] assert_equal(A[[[1],[3]],[2,4]].todense(),B[[[1],[3]],[2,4]]) assert_equal(A[[[-1],[-3],[-2]],[2,-4]].todense(),B[[[-1],[-3],[-2]],[2,-4]]) @@ -882,8 +882,8 @@ data = array([1,2,3,4]) csr = csr_matrix((data, indices, indptr)) assert_array_equal(csr.shape,(3,6)) - + def test_sort_indices(self): data = arange( 5 ) indices = array( [7, 2, 1, 5, 4] ) @@ -956,7 +956,7 @@ data = array([1,2,3,4]) csc = csc_matrix((data, indices, indptr)) assert_array_equal(csc.shape,(6,3)) - + def test_eliminate_zeros(self): data = array( [1, 0, 0, 0, 2, 0, 3, 0] ) indices = array( [1, 2, 3, 4, 5, 6, 7, 8] ) @@ -967,14 +967,14 @@ assert_array_equal(asp.nnz, 3) assert_array_equal(asp.data,[1, 2, 3]) assert_array_equal(asp.todense(),bsp.todense()) - + def test_sort_indices(self): data = arange( 5 ) row = array( [7, 2, 1, 5, 4] ) ptr = [0, 3, 5] asp = csc_matrix( (data, row, ptr), shape=(10,2) ) bsp = asp.copy() - asp.sort_indices() + asp.sort_indices() assert_array_equal(asp.indices,[1, 2, 7, 4, 5]) assert_array_equal(asp.todense(),bsp.todense()) @@ -1086,7 +1086,7 @@ assert_equal(caught,5) -class TestLIL( _TestCommon, _TestHorizSlicing, _TestVertSlicing, +class TestLIL( _TestCommon, _TestHorizSlicing, _TestVertSlicing, _TestBothSlicing, _TestGetSet, _TestSolve, _TestArithmetic, _TestInplaceArithmetic, TestCase): @@ -1288,15 +1288,15 @@ def test_constructor1(self): pass #TODO add test - + class TestBSR(_TestCommon, _TestArithmetic, _TestInplaceArithmetic, _TestMatvecOutput, TestCase): spmatrix = bsr_matrix def test_constructor1(self): """check native BSR format constructor""" - indptr = array([0,2,2,4]) + indptr = array([0,2,2,4]) indices = array([0,2,2,3]) data = zeros((4,2,3)) @@ -1312,14 +1312,14 @@ A = numpy.kron( [[1,0,2,0],[0,0,0,0],[0,0,4,5]], [[0,1,2],[3,0,5]] ) Asp = bsr_matrix((data,indices,indptr),shape=(6,12)) assert_equal(Asp.todense(),A) - + #infer shape from arrays Asp = bsr_matrix((data,indices,indptr)) assert_equal(Asp.todense(),A) def test_constructor2(self): """construct from dense""" - + #test zero mats for shape in [ (1,1), (5,1), (1,10), (10,4), (3,7), (2,1)]: A = zeros(shape) @@ -1337,10 +1337,10 @@ assert_equal(bsr_matrix(A,blocksize=(2,12)).todense(),A) assert_equal(bsr_matrix(A,blocksize=(3,12)).todense(),A) assert_equal(bsr_matrix(A,blocksize=(6,12)).todense(),A) - + A = numpy.kron( [[1,0,2,0],[0,1,0,0],[0,0,0,0]], [[0,1,2],[3,0,5]] ) assert_equal(bsr_matrix(A,blocksize=(2,3)).todense(),A) - + def test_eliminate_zeros(self): data = numpy.kron([1, 0, 0, 0, 2, 0, 3, 0], [[1,1],[1,1]]).T data = data.reshape(-1,2,2) @@ -1352,6 +1352,6 @@ assert_array_equal(asp.nnz, 3*4) assert_array_equal(asp.todense(),bsp.todense()) - + if __name__ == "__main__": nose.run(argv=['', __file__]) Modified: trunk/scipy/sparse/tests/test_construct.py =================================================================== --- trunk/scipy/sparse/tests/test_construct.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/tests/test_construct.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -19,7 +19,7 @@ diags3 = array( [[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9,10], [11,12,13,14,15]] ) - + cases = [] cases.append( (diags1, 0, 1, 1, [[1]]) ) cases.append( (diags1, [0], 1, 1, [[1]]) ) @@ -58,8 +58,8 @@ for d,o,m,n,result in cases: assert_equal( spdiags(d,o,m,n).todense(), result ) - - + + def test_identity(self): a = identity(3) b = array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype='d') @@ -98,7 +98,7 @@ cases.append(array([[5,4,4],[1,0,0],[6,0,8]])) cases.append(array([[0,1,0,2,0,5,8]])) cases.append(array([[0.5,0.125,0,3.25],[0,2.5,0,0]])) - + for a in cases: for b in cases: result = kron(csr_matrix(a),csr_matrix(b)).todense() @@ -116,7 +116,7 @@ cases.append(array([[0,2],[5,0]])) cases.append(array([[0,2,-6],[8,0,14],[0,3,0]])) cases.append(array([[1,0,0],[0,5,-1],[4,-2,8]])) - + for a in cases: for b in cases: result = kronsum(csr_matrix(a),csr_matrix(b)).todense() @@ -133,7 +133,7 @@ [3, 4], [5, 6]]) assert_equal( vstack( [A,B] ).todense(), expected ) - + def test_hstack(self): A = coo_matrix([[1,2],[3,4]]) @@ -154,17 +154,17 @@ [0, 0, 7]]) assert_equal( bmat( [[A,B],[None,C]] ).todense(), expected ) - + expected = matrix([[1, 2, 0], [3, 4, 0], [0, 0, 7]]) assert_equal( bmat( [[A,None],[None,C]] ).todense(), expected ) - + expected = matrix([[0, 5], [0, 6], [7, 0]]) assert_equal( bmat( [[None,B],[C,None]] ).todense(), expected ) - + #TODO test failure cases def test_lil_diags(self): @@ -200,4 +200,3 @@ if __name__ == "__main__": nose.run(argv=['', __file__]) - Modified: trunk/scipy/sparse/tests/test_spfuncs.py =================================================================== --- trunk/scipy/sparse/tests/test_spfuncs.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/tests/test_spfuncs.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -11,8 +11,8 @@ D = matrix([[1,0,0,2,3], [0,4,0,5,0], [0,0,6,7,0]]) - - + + #TODO expose through function S = csr_matrix(D) v = array([1,2,3]) @@ -35,7 +35,7 @@ v = array([1,2,3,4,5,6,7,8,9,10]) bsr_scale_columns(3,5,2,2,S.indptr,S.indices,S.data,v) assert_equal(S.todense(), E*diag(v) ) - + E = kron(D,[[1,2,3],[4,5,6]]) S = bsr_matrix(E,blocksize=(2,3)) v = array([1,2,3,4,5,6]) @@ -49,15 +49,15 @@ - + def test_estimate_blocksize(self): mats = [] mats.append( [[0,1],[1,0]] ) mats.append( [[1,1,0],[0,0,1],[1,0,1]] ) mats.append( [[0],[0],[1]] ) mats = [array(x) for x in mats] - + blks = [] blks.append( [[1]] ) blks.append( [[1,1],[1,1]] ) @@ -77,12 +77,12 @@ R,C = bs I,J = A.nonzero() return len( set( zip(I/R,J/C) ) ) - + mats = [] - mats.append( [[0]] ) - mats.append( [[1]] ) - mats.append( [[1,0]] ) - mats.append( [[1,1]] ) + mats.append( [[0]] ) + mats.append( [[1]] ) + mats.append( [[1,0]] ) + mats.append( [[1,1]] ) mats.append( [[0,1],[1,0]] ) mats.append( [[1,1,0],[0,0,1],[1,0,1]] ) mats.append( [[0],[0],[1]] ) @@ -94,7 +94,7 @@ for R in range(1,6): for C in range(1,6): assert_equal(count_blocks(Y,(R,C)),gold(X,(R,C))) - + X = kron([[1,1,0],[0,0,1],[1,0,1]],[[1,1]]) Y = csc_matrix(X) assert_equal(count_blocks(X,(1,2)),gold(X,(1,2))) @@ -103,4 +103,3 @@ if __name__ == "__main__": nose.run(argv=['', __file__]) - Modified: trunk/scipy/sparse/tests/test_sputils.py =================================================================== --- trunk/scipy/sparse/tests/test_sputils.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/sparse/tests/test_sputils.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -58,15 +58,13 @@ assert_equal(issequence( [1] ),True) assert_equal(issequence( [1,2,3] ),True) assert_equal(issequence( np.array([1,2,3]) ),True) - + assert_equal(issequence( np.array([[1],[2],[3]]) ),False) assert_equal(issequence( 3 ),False) def test_isdense(self): assert_equal(isdense( np.array([1]) ),True) assert_equal(isdense( np.matrix([1]) ),True) - + if __name__ == "__main__": nose.run(argv=['', __file__]) - - Modified: trunk/scipy/splinalg/__init__.py =================================================================== --- trunk/scipy/splinalg/__init__.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/splinalg/__init__.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -3,4 +3,3 @@ warn('scipy.splinalg has moved to scipy.sparse.linalg', DeprecationWarning) from scipy.sparse.linalg import * - Modified: trunk/scipy/stats/mmorestats.py =================================================================== --- trunk/scipy/stats/mmorestats.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/stats/mmorestats.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -58,7 +58,7 @@ Notes ----- The function is restricted to 2D arrays. - + """ def _hd_1D(data,prob,var): "Computes the HD quantiles for a 1D array. Returns nan for invalid data." @@ -113,7 +113,7 @@ Axis along which to compute the quantiles. If None, use a flattened array. var : boolean Whether to return the variance of the estimate. - + """ result = hdquantiles(data,[0.5], axis=axis, var=var) return result.squeeze() @@ -136,7 +136,7 @@ Notes ----- The function is restricted to 2D arrays. - + """ def _hdsd_1D(data,prob): "Computes the std error for 1D arrays." @@ -176,7 +176,7 @@ #---- --- Confidence intervals --- #####-------------------------------------------------------------------------- -def trimmed_mean_ci(data, limits=(0.2,0.2), inclusive=(True,True), +def trimmed_mean_ci(data, limits=(0.2,0.2), inclusive=(True,True), alpha=0.05, axis=None): """Returns the selected confidence interval of the trimmed mean along the given axis. @@ -191,13 +191,13 @@ alpha : float Confidence level of the intervals. inclusive : tuple of boolean - If relative==False, tuple indicating whether values exactly equal to the + If relative==False, tuple indicating whether values exactly equal to the absolute limits are allowed. If relative==True, tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). axis : int Axis along which to cut. If None, uses a flattened version of the input. - + """ data = ma.array(data, copy=False) trimmed = mstats.trimr(data, limits=limits, inclusive=inclusive, axis=axis) @@ -220,7 +220,7 @@ Sequence of quantiles to compute. axis : int Axis along which to compute the quantiles. If None, use a flattened array. - + """ def _mjci_1D(data, p): data = np.sort(data.compressed()) @@ -340,7 +340,7 @@ def idealfourths(data, axis=None): - """Returns an estimate of the lower and upper quartiles of the data along + """Returns an estimate of the lower and upper quartiles of the data along the given axis, as computed with the ideal fourths. """ def _idf(data): @@ -383,8 +383,7 @@ h = 1.2 * (r[-1]-r[0]) / n**(1./5) nhi = (data[:,None] <= points[None,:] + h).sum(0) nlo = (data[:,None] < points[None,:] - h).sum(0) - return (nhi-nlo) / (2.*n*h) + return (nhi-nlo) / (2.*n*h) ############################################################################### - Modified: trunk/scipy/stats/models/contrast.py =================================================================== --- trunk/scipy/stats/models/contrast.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/stats/models/contrast.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -127,7 +127,7 @@ L = N.asarray(L) D = N.asarray(D) - + n, p = D.shape if L.shape[0] != n and L.shape[1] != p: @@ -141,12 +141,12 @@ else: C = L C = N.dot(pseudo, N.dot(D, C.T)).T - + Lp = N.dot(D, C.T) if len(Lp.shape) == 1: Lp.shape = (n, 1) - + if utils.rank(Lp) != Lp.shape[1]: Lp = utils.fullrank(Lp) C = N.dot(pseudo, Lp).T Modified: trunk/scipy/stats/models/formula.py =================================================================== --- trunk/scipy/stats/models/formula.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/stats/models/formula.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -27,10 +27,10 @@ ---------------------------------------------------- By default, the namespace is empty, which means it must be - specified before evaluating the design matrix. + specified before evaluating the design matrix. When it is unambiguous, the namespaces of objects are derived from the - context. + context. Rules: ------ @@ -256,12 +256,12 @@ def main_effect(self, reference=None): """ Return the 'main effect' columns of a factor, choosing - an optional reference key. + an optional reference key. - The reference key can be one of the keys of the Factor, + The reference key can be one of the keys of the Factor, or an integer, representing which column to remove. It defaults to 0. - + """ names = self.names() @@ -295,10 +295,10 @@ def __getitem__(self, key): """ Retrieve the column corresponding to key in a Formula. - + :Parameters: key : one of the Factor's keys - + :Returns: ndarray corresponding to key, when evaluated in current namespace """ @@ -704,7 +704,7 @@ is an integer, it is changed to range(1,order+1), so order=3 is equivalent to order=[1,2,3], generating all one, two and three-way interactions. - + If any entry of order is greater than len(terms), it is effectively treated as len(terms). @@ -731,7 +731,7 @@ for m in range(I.shape[1]): # only keep combinations that have unique entries - + if (N.unique(I[:,m]).shape == I[:,m].shape and N.alltrue(N.equal(N.sort(I[:,m]), I[:,m]))): ll = [terms[j] for j in I[:,m]] @@ -742,7 +742,7 @@ key = values.keys()[0] value = values[key]; del(values[key]) - + for v in values.values(): value += v return value Modified: trunk/scipy/stats/models/tests/test_formula.py =================================================================== --- trunk/scipy/stats/models/tests/test_formula.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/stats/models/tests/test_formula.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -306,7 +306,7 @@ f = formula.interactions([formula.Term(l) for l in ['a', 'b', 'c']]) ff = f - f['a*b'] assert_equal(set(ff.termnames()), set(['a', 'b', 'c', 'a*c', 'b*c'])) - + ff = f - f['a*b'] - f['a*c'] assert_equal(set(ff.termnames()), set(['a', 'b', 'c', 'b*c'])) Modified: trunk/scipy/stats/mstats.py =================================================================== --- trunk/scipy/stats/mstats.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/stats/mstats.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -1,5 +1,5 @@ """ -An extension of scipy.stats.stats to support masked arrays +An extension of scipy.stats.stats to support masked arrays :author: Pierre GF Gerard-Marchant :contact: pierregm_at_uga_edu @@ -56,7 +56,7 @@ genmissingvaldoc = """ Notes ----- - Missing values are considered pair-wise: if a value is missing in x, + Missing values are considered pair-wise: if a value is missing in x, the corresponding value in y is masked. """ #------------------------------------------------------------------------------ @@ -92,7 +92,7 @@ def argstoarray(*args): """Constructs a 2D array from a sequence of sequences. Sequences are filled with missing values to match the length of the longest sequence. - + Returns ------- output : MaskedArray @@ -120,19 +120,19 @@ def find_repeats(arr): """Find repeats in arr and return a tuple (repeats, repeat_count). Masked values are discarded. - + Parameters ---------- arr : sequence Input array. The array is flattened if it is not 1D. - + Returns ------- repeats : ndarray Array of repeated values. counts : ndarray Array of counts. - + """ marr = ma.compressed(arr) if not marr.size: @@ -142,22 +142,22 @@ def count_tied_groups(x, use_missing=False): - """Counts the number of tied values in x, and returns a dictionary + """Counts the number of tied values in x, and returns a dictionary (nb of ties: nb of groups). - + Parameters ---------- x : sequence Sequence of data on which to counts the ties use_missing : boolean Whether to consider missing values as tied. - + Example ------- >>>z = [0, 0, 0, 2, 2, 2, 3, 3, 4, 5, 6] >>>count_tied_groups(z) >>>{2:1, 3:2} - >>># The ties were 0 (3x), 2 (3x) and 3 (2x) + >>># The ties were 0 (3x), 2 (3x) and 3 (2x) >>>z = ma.array([0, 0, 1, 2, 2, 2, 3, 3, 4, 5, 6]) >>>count_tied_groups(z) >>>{2:2, 3:1} @@ -181,14 +181,14 @@ except KeyError: nties[nmasked] = 1 return nties - + def rankdata(data, axis=None, use_missing=False): """Returns the rank (also known as order statistics) of each data point along the given axis. If some values are tied, their rank is averaged. - If some values are masked, their rank is set to 0 if use_missing is False, + If some values are masked, their rank is set to 0 if use_missing is False, or set to the average rank of the unmasked values if use_missing is True. Parameters @@ -196,8 +196,8 @@ data : sequence Input data. The data is transformed to a masked array axis : {None,int} optional - Axis along which to perform the ranking. - If None, the array is first flattened. An exception is raised if + Axis along which to perform the ranking. + If None, the array is first flattened. An exception is raised if the axis is specified for arrays with a dimension larger than 2 use_missing : {boolean} optional Whether the masked values have a rank of 0 (False) or equal to the @@ -325,7 +325,7 @@ common_mask = ma.mask_or(ma.getmask(x), ma.getmask(y)) if allow_masked: x.unshare_mask() - y.unshare_mask() + y.unshare_mask() x._mask = y._mask = common_mask elif common_mask is not nomask: raise ValueError("Cannot process masked data...") @@ -362,7 +362,7 @@ If True, then each row is a variable with obersvations in columns. If False, each column is a variable and the observations are in the rows. bias : {False, True} optional - Whether to use a biased (True) or unbiased (False) estimate of the + Whether to use a biased (True) or unbiased (False) estimate of the covariance. If True, then the normalization is by N, the number of observations. Otherwise, the normalization is by (N-1). @@ -420,7 +420,7 @@ return (masked, masked) # (mx, my) = (x.mean(), y.mean()) - (xm, ym) = (x-mx, y-my) + (xm, ym) = (x-mx, y-my) # r_num = n*(ma.add.reduce(xm*ym)) r_den = n*ma.sqrt(ma.dot(xm,xm)*ma.dot(ym,ym)) @@ -437,8 +437,8 @@ else: prob = betai(0.5*df,0.5,df/(df+t*t)) return (r,prob) - + def spearmanr(x, y, use_ties=True): """Calculates a Spearman rank-order correlation coefficient and the p-value to test for non-correlation. @@ -451,8 +451,8 @@ +1 imply an exact linear relationship. Positive correlations imply that as x increases, so does y. Negative correlations imply that as x increases, y decreases. - - Missing values are discarded pair-wise: if a value is missing in x, the + + Missing values are discarded pair-wise: if a value is missing in x, the corresponding value in y is masked. The p-value roughly indicates the probability of an uncorrelated system @@ -517,9 +517,9 @@ def kendalltau(x, y, use_ties=True, use_missing=False): """Computes Kendall's rank correlation tau on two variables *x* and *y*. - + Parameters ----------- +---------- xdata: sequence First data list (for example, time). ydata: sequence @@ -527,7 +527,7 @@ use_ties: {True, False} optional Whether ties correction should be performed. use_missing: {False, True} optional - Whether missing data should be allocated a rank of 0 (False) or the + Whether missing data should be allocated a rank of 0 (False) or the average rank (True) """ (x, y, n) = _chk_size(x, y) @@ -542,9 +542,9 @@ ry = ma.masked_equal(rankdata(y, use_missing=use_missing),0) idx = rx.argsort() (rx, ry) = (rx[idx], ry[idx]) - C = np.sum((((ry[i+1:]>ry[i])*(rx[i+1:]>rx[i])).filled(0).sum() + C = np.sum((((ry[i+1:]>ry[i])*(rx[i+1:]>rx[i])).filled(0).sum() for i in range(len(ry)-1))) - D = np.sum((((ry[i+1:]rx[i])).filled(0).sum() + D = np.sum((((ry[i+1:]rx[i])).filled(0).sum() for i in range(len(ry)-1))) if use_ties: xties = count_tied_groups(x) @@ -575,12 +575,12 @@ return (tau,prob) -def kendalltau_seasonal(x): +def kendalltau_seasonal(x): """Computes a multivariate extension Kendall's rank correlation tau, designed for seasonal data. - + Parameters ----------- +---------- x: 2D array Array of seasonal data, with seasons in columns. """ @@ -606,7 +606,7 @@ corr_j = np.sum(v*k*(k-1) for (k,v) in ties_j.iteritems()) cmb = n_p[j]*(n_p[j]-1) for k in range(j,m,1): - K[j,k] = np.sum(msign((x[i:,j]-x[i,j])*(x[i:,k]-x[i,k])).sum() + K[j,k] = np.sum(msign((x[i:,j]-x[i,j])*(x[i:,k]-x[i,k])).sum() for i in range(n)) covmat[j,k] = (K[j,k] +4*(R[:,j]*R[:,k]).sum() - \ n*(n_p[j]+1)*(n_p[k]+1))/3. @@ -693,7 +693,7 @@ r = 0.0 else: r = Sxy / r_den - if (r > 1.0): + if (r > 1.0): r = 1.0 # from numerical error #z = 0.5*log((1.0+r+TINY)/(1.0-r+TINY)) df = n-2 @@ -709,7 +709,7 @@ def theilslopes(y, x=None, alpha=0.05): """Computes the Theil slope over the dataset (x,y), as the median of all slopes between paired values. - + Parameters ---------- y : sequence @@ -718,7 +718,7 @@ Independent variable. If None, use arange(len(y)) instead. alpha : float Confidence degree. - + """ y = ma.asarray(y).flatten() y[-1] = masked @@ -736,7 +736,7 @@ slopes = ma.hstack([(y[i+1:]-y[i])/(x[i+1:]-x[i]) for i in range(n-1)]) slopes.sort() medslope = ma.median(slopes) - medinter = ma.median(y) - medslope*ma.median(x) + medinter = ma.median(y) - medslope*ma.median(x) # if alpha > 0.5: alpha = 1.-alpha @@ -748,7 +748,7 @@ sigsq -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in xties.iteritems()) sigsq -= np.sum(v*k*(k-1)*(2*k+5) for (k,v) in yties.iteritems()) sigma = np.sqrt(sigsq) - + Ru = np.round((nt - z*sigma)/2. + 1) Rl = np.round((nt + z*sigma)/2.) delta = slopes[[Rl,Ru]] @@ -759,7 +759,7 @@ x = ma.array(x, subok=True, copy=False, ndmin=2) (n,_) = x.shape # Get list of slopes per season - szn_slopes = ma.vstack([(x[i+1:]-x[i])/np.arange(1,n-i)[:,None] + szn_slopes = ma.vstack([(x[i+1:]-x[i])/np.arange(1,n-i)[:,None] for i in range(n)]) szn_medslopes = ma.median(szn_slopes, axis=0) medslope = ma.median(szn_slopes, axis=None) @@ -830,21 +830,21 @@ def mannwhitneyu(x,y, use_continuity=True): """Computes the Mann-Whitney on samples x and y. Missing values in x and/or y are discarded. - + Parameters ---------- x : sequence y : sequence use_continuity : {True, False} optional Whether a continuity correction (1/2.) should be taken into account. - + Returns ------- u : float The Mann-Whitney statistics prob : float Approximate p-value assuming a normal distribution. - + """ x = ma.asarray(x).compressed().view(ndarray) y = ma.asarray(y).compressed().view(ndarray) @@ -860,7 +860,7 @@ ties = count_tied_groups(ranks) sigsq -= np.sum(v*(k**3-k) for (k,v) in ties.iteritems())/12. sigsq *= nx*ny/float(nt*(nt-1)) - # + # if use_continuity: z = (U - 1/2. - mu) / ma.sqrt(sigsq) else: @@ -903,11 +903,11 @@ + (n-j) * np.log(1-x-j/float(n)) + (j-1) * np.log(x+j/float(n)))) - + def ks_twosamp(data1, data2, alternative="two_sided"): - """Computes the Kolmogorov-Smirnov test on two samples. + """Computes the Kolmogorov-Smirnov test on two samples. Missing values are discarded. - + Parameters ---------- data1 : sequence @@ -915,15 +915,15 @@ data2 : sequence Second data set alternative : {'two_sided', 'less', 'greater'} optional - Indicates the alternative hypothesis. - + Indicates the alternative hypothesis. + Returns ------- d : float Value of the Kolmogorov Smirnov test p : float Corresponding p-value. - + """ (data1, data2) = (ma.asarray(data1), ma.asarray(data2)) (n1, n2) = (data1.count(), data2.count()) @@ -997,23 +997,23 @@ return a -def trima(a, limits=None, inclusive=(True,True)): +def trima(a, limits=None, inclusive=(True,True)): """Trims an array by masking the data outside some given limits. Returns a masked version of the input array. - + Parameters ---------- a : sequence Input array. limits : {None, tuple} optional - Tuple of (lower limit, upper limit) in absolute values. - Values of the input array lower (greater) than the lower (upper) limit + Tuple of (lower limit, upper limit) in absolute values. + Values of the input array lower (greater) than the lower (upper) limit will be masked. A limit is None indicates an open interval. inclusive : {(True,True) tuple} optional Tuple of (lower flag, upper flag), indicating whether values exactly equal to the lower (upper) limit are allowed. - - """ + + """ a = ma.asarray(a) a.unshare_mask() if limits is None: @@ -1033,20 +1033,20 @@ condition |= (a >= upper_lim) a[condition.filled(True)] = masked return a - + def trimr(a, limits=None, inclusive=(True, True), axis=None): """Trims an array by masking some proportion of the data on each end. Returns a masked version of the input array. - + Parameters ---------- a : sequence Input array. limits : {None, tuple} optional - Tuple of the percentages to cut on each side of the array, with respect + Tuple of the percentages to cut on each side of the array, with respect to the number of unmasked data, as floats between 0. and 1. - Noting n the number of unmasked data before trimming, the (n*limits[0])th + Noting n the number of unmasked data before trimming, the (n*limits[0])th smallest data and the (n*limits[1])th largest data are masked, and the total number of unmasked data after trimming is n*(1.-sum(limits)) The value of one limit can be set to None to indicate an open interval. @@ -1054,9 +1054,9 @@ Tuple of flags indicating whether the number of data being masked on the left (right) end should be truncated (True) or rounded (False) to integers. axis : {None,int} optional - Axis along which to trim. If None, the whole array is trimmed, but its + Axis along which to trim. If None, the whole array is trimmed, but its shape is maintained. - + """ def _trimr1D(a, low_limit, up_limit, low_inclusive, up_inclusive): n = a.count() @@ -1096,26 +1096,26 @@ return _trimr1D(a.ravel(),lolim,uplim,loinc,upinc).reshape(shp) else: return ma.apply_along_axis(_trimr1D, axis, a, lolim,uplim,loinc,upinc) - + trimdoc = """ Parameters ---------- a : sequence Input array limits : {None, tuple} optional - If relative == False, tuple (lower limit, upper limit) in absolute values. - Values of the input array lower (greater) than the lower (upper) limit are + If relative == False, tuple (lower limit, upper limit) in absolute values. + Values of the input array lower (greater) than the lower (upper) limit are masked. - If relative == True, tuple (lower percentage, upper percentage) to cut - on each side of the array, with respect to the number of unmasked data. - Noting n the number of unmasked data before trimming, the (n*limits[0])th + If relative == True, tuple (lower percentage, upper percentage) to cut + on each side of the array, with respect to the number of unmasked data. + Noting n the number of unmasked data before trimming, the (n*limits[0])th smallest data and the (n*limits[1])th largest data are masked, and the total number of unmasked data after trimming is n*(1.-sum(limits)) In each case, the value of one limit can be set to None to indicate an open interval. If limits is None, no trimming is performed inclusive : {(True, True) tuple} optional - If relative==False, tuple indicating whether values exactly equal to the + If relative==False, tuple indicating whether values exactly equal to the absolute limits are allowed. If relative==True, tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). @@ -1124,14 +1124,14 @@ to cut (True). axis : {None, integer}, optional Axis along which to trim. -""" - - +""" + + def trim(a, limits=None, inclusive=(True,True), relative=False, axis=None): """Trims an array by masking the data outside some given limits. Returns a masked version of the input array. %s - + Examples -------- >>>z = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10] @@ -1139,19 +1139,19 @@ [--,--, 3, 4, 5, 6, 7, 8,--,--] >>>trim(z,(0.1,0.2),relative=True) [--, 2, 3, 4, 5, 6, 7, 8,--,--] - - + + """ if relative: - return trimr(a, limits=limits, inclusive=inclusive, axis=axis) + return trimr(a, limits=limits, inclusive=inclusive, axis=axis) else: - return trima(a, limits=limits, inclusive=inclusive) + return trima(a, limits=limits, inclusive=inclusive) trim.__doc__ = trim.__doc__ % trimdoc def trimboth(data, proportiontocut=0.2, inclusive=(True,True), axis=None): - """Trims the data by masking the int(proportiontocut*n) smallest and - int(proportiontocut*n) largest values of data along the given axis, where n + """Trims the data by masking the int(proportiontocut*n) smallest and + int(proportiontocut*n) largest values of data along the given axis, where n is the number of unmasked values before trimming. Parameters @@ -1159,25 +1159,25 @@ data : ndarray Data to trim. proportiontocut : {0.2, float} optional - Percentage of trimming (as a float between 0 and 1). - If n is the number of unmasked values before trimming, the number of + Percentage of trimming (as a float between 0 and 1). + If n is the number of unmasked values before trimming, the number of values after trimming is: (1-2*proportiontocut)*n. inclusive : {(True, True) tuple} optional - Tuple indicating whether the number of data being masked on each side + Tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). axis : {None, integer}, optional - Axis along which to perform the trimming. + Axis along which to perform the trimming. If None, the input array is first flattened. """ - return trimr(data, limits=(proportiontocut,proportiontocut), + return trimr(data, limits=(proportiontocut,proportiontocut), inclusive=inclusive, axis=axis) - + #.............................................................................. -def trimtail(data, proportiontocut=0.2, tail='left', inclusive=(True,True), +def trimtail(data, proportiontocut=0.2, tail='left', inclusive=(True,True), axis=None): - """Trims the data by masking int(trim*n) values from ONE tail of the + """Trims the data by masking int(trim*n) values from ONE tail of the data along the given axis, where n is the number of unmasked values. Parameters @@ -1185,17 +1185,17 @@ data : {ndarray} Data to trim. proportiontocut : {0.2, float} optional - Percentage of trimming. If n is the number of unmasked values - before trimming, the number of values after trimming is + Percentage of trimming. If n is the number of unmasked values + before trimming, the number of values after trimming is (1-proportiontocut)*n. tail : {'left','right'} optional If left (right), the ``proportiontocut`` lowest (greatest) values will - be masked. + be masked. inclusive : {(True, True) tuple} optional - Tuple indicating whether the number of data being masked on each side + Tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). axis : {None, integer}, optional - Axis along which to perform the trimming. + Axis along which to perform the trimming. If None, the input array is first flattened. """ @@ -1205,14 +1205,14 @@ elif tail == 'r': limits = (None, proportiontocut) else: - raise TypeError("The tail argument should be in ('left','right')") + raise TypeError("The tail argument should be in ('left','right')") return trimr(data, limits=limits, axis=axis, inclusive=inclusive) trim1 = trimtail -def trimmed_mean(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, +def trimmed_mean(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, axis=None): - """Returns the trimmed mean of the data along the given axis. + """Returns the trimmed mean of the data along the given axis. %s @@ -1225,9 +1225,9 @@ return trima(a,limits=limits,inclusive=inclusive).mean(axis=axis) -def trimmed_var(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, +def trimmed_var(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, axis=None, ddof=0): - """Returns the trimmed variance of the data along the given axis. + """Returns the trimmed variance of the data along the given axis. %s ddof : {0,integer}, optional @@ -1245,9 +1245,9 @@ return out.var(axis=axis, ddof=ddof) -def trimmed_std(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, +def trimmed_std(a, limits=(0.1,0.1), inclusive=(1,1), relative=True, axis=None, ddof=0): - """Returns the trimmed standard deviation of the data along the given axis. + """Returns the trimmed standard deviation of the data along the given axis. %s ddof : {0,integer}, optional @@ -1273,16 +1273,16 @@ a : sequence Input array limits : {(0.1,0.1), tuple of float} optional - tuple (lower percentage, upper percentage) to cut on each side of the - array, with respect to the number of unmasked data. - Noting n the number of unmasked data before trimming, the (n*limits[0])th + tuple (lower percentage, upper percentage) to cut on each side of the + array, with respect to the number of unmasked data. + Noting n the number of unmasked data before trimming, the (n*limits[0])th smallest data and the (n*limits[1])th largest data are masked, and the total number of unmasked data after trimming is n*(1.-sum(limits)) In each case, the value of one limit can be set to None to indicate an open interval. If limits is None, no trimming is performed inclusive : {(True, True) tuple} optional - Tuple indicating whether the number of data being masked on each side + Tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). axis : {None, integer}, optional Axis along which to trim. @@ -1369,31 +1369,31 @@ def winsorize(a, limits=None, inclusive=(True,True), inplace=False, axis=None): """Returns a Winsorized version of the input array. - - The (limits[0])th lowest values are set to the (limits[0])th percentile, - and the (limits[1])th highest values are set to the (limits[1])th + + The (limits[0])th lowest values are set to the (limits[0])th percentile, + and the (limits[1])th highest values are set to the (limits[1])th percentile. Masked values are skipped. - - + + Parameters ---------- a : sequence Input array. limits : {None, tuple of float} optional - Tuple of the percentages to cut on each side of the array, with respect + Tuple of the percentages to cut on each side of the array, with respect to the number of unmasked data, as floats between 0. and 1. - Noting n the number of unmasked data before trimming, the (n*limits[0])th + Noting n the number of unmasked data before trimming, the (n*limits[0])th smallest data and the (n*limits[1])th largest data are masked, and the total number of unmasked data after trimming is n*(1.-sum(limits)) The value of one limit can be set to None to indicate an open interval. inclusive : {(True, True) tuple} optional - Tuple indicating whether the number of data being masked on each side + Tuple indicating whether the number of data being masked on each side should be rounded (True) or truncated (False). inplace : {False, True} optional Whether to winsorize in place (True) or to use a copy (False) axis : {None, int} optional - Axis along which to trim. If None, the whole array is trimmed, but its + Axis along which to trim. If None, the whole array is trimmed, but its shape is maintained. """ @@ -1437,8 +1437,8 @@ return _winsorize1D(a.ravel(),lolim,uplim,loinc,upinc).reshape(shp) else: return ma.apply_along_axis(_winsorize1D, axis,a,lolim,uplim,loinc,upinc) - + #####-------------------------------------------------------------------------- #---- --- Moments --- #####-------------------------------------------------------------------------- @@ -1540,7 +1540,7 @@ data : ndarray Data to trim. axis : {None,int} optional - Axis along which to perform the trimming. + Axis along which to perform the trimming. If None, the input array is first flattened. """ @@ -1603,7 +1603,7 @@ term2 = ma.power((1-2.0/A)/denom,1/3.0) Z = ( term1 - term2 ) / np.sqrt(2/(9.0*A)) return Z, (1.0-stats.zprob(Z))*2 -kurtosistest.__doc__ = stats.kurtosistest.__doc__ +kurtosistest.__doc__ = stats.kurtosistest.__doc__ def normaltest(a, axis=0): @@ -1658,7 +1658,7 @@ beta : {0.4, float} optional Plotting positions parameter. axis : {None, int} optional - Axis along which to perform the trimming. + Axis along which to perform the trimming. If None, the input array is first flattened. limit : tuple Tuple of (lower, upper) values. Values of a outside this closed interval @@ -1679,8 +1679,8 @@ # Initialization & checks --------- data = ma.array(data, copy=False) if limit: - condition = (limit[0]>> def func_with_test_in_name(arg1, arg2): pass ... >>> - + This decorator cannot use the nose namespace, because it can be called from a non-test module. See also istest and nottest in nose.tools Modified: trunk/scipy/testing/examples/test_foo.py =================================================================== --- trunk/scipy/testing/examples/test_foo.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/testing/examples/test_foo.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -40,7 +40,7 @@ """A regular unittest, with the extra Numpy features.""" def test_1(self): print 'First test' - + def test_2(self): print 'Second test' @@ -99,8 +99,7 @@ def test_warn(): "A simple test that prints a warning." warn('Bad things are happening...') - + def test_error(): "A simple test that prints an error message." error('Really bad things are happening...') - Modified: trunk/scipy/testing/nosetester.py =================================================================== --- trunk/scipy/testing/nosetester.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/testing/nosetester.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -13,20 +13,20 @@ """ Nose test runner. Usage: NoseTester().test() - + is package path or module Default for package is None. A value of None finds calling module path. Typical call is from module __init__, and corresponds to this: - + >>> test = NoseTester().test - + In practice, because nose may not be importable, the __init__ files actually have: - + >>> from scipy.testing.pkgtester import Tester >>> test = Tester().test - + The pkgtester module checks for the presence of nose on the path, returning this class if nose is present, and a null class otherwise. @@ -50,7 +50,7 @@ elif isinstance(package, type(os)): package = os.path.dirname(package.__file__) self.package_path = package - + def _add_doc(testtype): ''' Decorator to add docstring to functions using test labels @@ -73,9 +73,9 @@ 'not slow'. 'full' - fast (as above) and slow %(testtype)s as in no -A option to nosetests - same as '' - None or '' - run all %(testtype)ss + None or '' - run all %(testtype)ss attribute_identifier - string passed directly to - nosetests as '-A' + nosetests as '-A' verbose : integer verbosity value for test outputs, 1-10 extra_argv : list @@ -103,11 +103,11 @@ if extra_argv: argv += extra_argv return argv - - @_add_doc('test') + + @_add_doc('test') def test(self, label='fast', verbose=1, extra_argv=None, doctests=False): ''' Run tests for module using nose - + %(test_header)s doctests : boolean If True, run doctests in module, default False @@ -116,7 +116,7 @@ if doctests: argv+=['--with-doctest'] nose.run(argv=argv) - + @_add_doc('benchmark') def bench(self, label='fast', verbose=1, extra_argv=None): ''' Run benchmarks for module using nose @@ -125,4 +125,3 @@ argv = self._test_argv(label, verbose, extra_argv) argv += ['--match', r'(?:^|[\\b_\\.%s-])[Bb]ench' % os.sep] nose.run(argv=argv) - Modified: trunk/scipy/testing/nulltester.py =================================================================== --- trunk/scipy/testing/nulltester.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/testing/nulltester.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -13,4 +13,3 @@ 'Need nose >=0.10 for tests - see %s' % \ 'http://somethingaboutorange.com/mrl/projects/nose' bench = test - Modified: trunk/scipy/testing/pkgtester.py =================================================================== --- trunk/scipy/testing/pkgtester.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/testing/pkgtester.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -20,7 +20,7 @@ nose_version = nose.__versioninfo__ if nose_version[0] < 1 and nose_version[1] < 10: fine_nose = False - + if fine_nose: from scipy.testing.nosetester import NoseTester as Tester else: Modified: trunk/scipy/testing/utils.py =================================================================== --- trunk/scipy/testing/utils.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/testing/utils.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -95,4 +95,3 @@ if testmatch.search(funcname) and not funcname.startswith('_'): setattr(cls, funcname, decorator(function)) return - Modified: trunk/scipy/weave/size_check.py =================================================================== --- trunk/scipy/weave/size_check.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/weave/size_check.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -278,4 +278,3 @@ # so this is gonna take some thought (probably some tree manipulation). def take(ary,axis=0): raise NotImplemented # and all the rest - Modified: trunk/scipy/weave/tests/test_blitz_tools.py =================================================================== --- trunk/scipy/weave/tests/test_blitz_tools.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/weave/tests/test_blitz_tools.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -142,7 +142,7 @@ expr = "result[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1]" \ "+ b[1:-1,2:] + b[1:-1,:-2]) / 5." self.generic_2d(expr,float32) - + @dec.slow def test_5point_avg_2d_double(self): """ result[1:-1,1:-1] = (b[1:-1,1:-1] + b[2:,1:-1] + b[:-2,1:-1] Modified: trunk/scipy/weave/tests/test_c_spec.py =================================================================== --- trunk/scipy/weave/tests/test_c_spec.py 2008-04-20 08:27:24 UTC (rev 4153) +++ trunk/scipy/weave/tests/test_c_spec.py 2008-04-20 12:15:19 UTC (rev 4154) @@ -62,8 +62,8 @@ # print "Probably don't have Compiler: %s"%c # else: # compilers.append(c) - + class IntConverter(TestCase): compiler = '' @dec.slow @@ -650,73 +650,73 @@ # compiler = '' # class TestGccIntConverter(TestIntConverter): # compiler = 'gcc' -# +# # class TestMsvcFloatConverter(TestFloatConverter): # compiler = 'msvc' -# +# # class TestMsvcFloatConverter(TestFloatConverter): # compiler = 'msvc' # class TestUnixFloatConverter(TestFloatConverter): # compiler = '' # class TestGccFloatConverter(TestFloatConverter): # compiler = 'gcc' -# +# # class TestMsvcComplexConverter(TestComplexConverter): # compiler = 'msvc' # class TestUnixComplexConverter(TestComplexConverter): # compiler = '' # class TestGccComplexConverter(TestComplexConverter): # compiler = 'gcc' -# +# # class TestMsvcFileConverter(TestFileConverter): # compiler = 'msvc' # class TestUnixFileConverter(TestFileConverter): # compiler = '' # class TestGccFileConverter(TestFileConverter): # compiler = 'gcc' -# +# # class TestMsvcCallableConverter(TestCallableConverter): # compiler = 'msvc' # class TestUnixCallableConverter(TestCallableConverter): # compiler = '' # class TestGccCallableConverter(TestCallableConverter): # compiler = 'gcc' -# +# # class TestMsvcSequenceConverter(TestSequenceConverter): # compiler = 'msvc' # class TestUnixSequenceConverter(TestSequenceConverter): # compiler = '' # class TestGccSequenceConverter(TestSequenceConverter): # compiler = 'gcc' -# +# # class TestMsvcStringConverter(TestStringConverter): # compiler = 'msvc' # class TestUnixStringConverter(TestStringConverter): # compiler = '' # class TestGccStringConverter(TestStringConverter): # compiler = 'gcc' -# +# # class TestMsvcListConverter(TestListConverter): # compiler = 'msvc' # class TestUnixListConverter(TestListConverter): # compiler = '' # class TestGccListConverter(TestListConverter): # compiler = 'gcc' -# +# # class TestMsvcTupleConverter(TestTupleConverter): # compiler = 'msvc' # class TestUnixTupleConverter(TestTupleConverter): # compiler = '' # class TestGccTupleConverter(TestTupleConverter): # compiler = 'gcc' -# +# # class TestMsvcDictConverter(TestDictConverter): # compiler = 'msvc' # class TestUnixDictConverter(TestDictConverter): # compiler = '' # class TestGccDictConverter(TestDictConverter): # compiler = 'gcc' -# +# # class TestMsvcInstanceConverter(TestInstanceConverter): # compiler = 'msvc' # class TestUnixInstanceConverter(TestInstanceConverter): @@ -751,10 +751,10 @@ # else: # for _n in dir(): # if _n[:8]=='TestUnix': exec 'del '+_n -# +# # if not (gcc_exists() and msvc_exists() and sys.platform == 'win32'): # for _n in dir(): # if _n[:7]=='TestGcc': exec 'del '+_n -# +# if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Sun Apr 20 14:24:43 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 20 Apr 2008 13:24:43 -0500 (CDT) Subject: [Scipy-svn] r4155 - trunk/scipy/cluster/tests Message-ID: <20080420182443.04C3A39C01B@new.scipy.org> Author: stefan Date: 2008-04-20 13:24:29 -0500 (Sun, 20 Apr 2008) New Revision: 4155 Modified: trunk/scipy/cluster/tests/test_hierarchy.py Log: Use dtype instead of 'dtype'. Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-20 12:15:19 UTC (rev 4154) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-20 18:24:29 UTC (rev 4155) @@ -91,7 +91,7 @@ def test_pdist_raises_type_error_float32(self): "Testing whether passing a float32 observation array generates an exception." - X = numpy.zeros((10, 10), dtype='float32') + X = numpy.zeros((10, 10), dtype=numpy.float32) try: pdist(X, 'euclidean') except TypeError: @@ -101,7 +101,7 @@ def test_pdist_raises_type_error_float96(self): "Testing whether passing a float96 observation array generates an exception." - X = numpy.zeros((10, 10), dtype='float96') + X = numpy.zeros((10, 10), dtype=numpy.float96) try: pdist(X, 'euclidean') except TypeError: @@ -112,7 +112,7 @@ def test_pdist_var_raises_type_error_float32(self): "Testing whether passing a float32 variance matrix generates an exception." X = numpy.zeros((10, 10)) - V = numpy.zeros((10, 10), dtype='float32') + V = numpy.zeros((10, 10), dtype=numpy.float32) try: pdist(X, 'seuclidean', V=V) except TypeError: @@ -123,7 +123,7 @@ def test_pdist_var_raises_type_error_float96(self): "Testing whether passing a float96 variance matrix generates an exception." X = numpy.zeros((10, 10)) - V = numpy.zeros((10, 10), dtype='float96') + V = numpy.zeros((10, 10), dtype=numpy.float96) try: pdist(X, 'seuclidean', V=V) @@ -135,7 +135,7 @@ def test_pdist_ivar_raises_type_error_float32(self): "Testing whether passing a float32 variance matrix generates an exception." X = numpy.zeros((10, 10)) - VI = numpy.zeros((10, 10), dtype='float32') + VI = numpy.zeros((10, 10), dtype=numpy.float32) try: pdist(X, 'mahalanobis', VI=VI) except TypeError: @@ -146,7 +146,7 @@ def test_pdist_ivar_raises_type_error_float96(self): "Testing whether passing a float96 variance matrix generates an exception." X = numpy.zeros((10, 10)) - VI = numpy.zeros((10, 10), dtype='float96') + VI = numpy.zeros((10, 10), dtype=numpy.float96) try: pdist(X, 'mahalanobis', VI=VI) From scipy-svn at scipy.org Sun Apr 20 15:31:22 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 20 Apr 2008 14:31:22 -0500 (CDT) Subject: [Scipy-svn] r4156 - trunk/scipy/cluster Message-ID: <20080420193122.86CA239C13A@new.scipy.org> Author: stefan Date: 2008-04-20 14:31:15 -0500 (Sun, 20 Apr 2008) New Revision: 4156 Modified: trunk/scipy/cluster/hierarchy.py Log: Use np.dtype instead of 'dtype'. Import numpy as np. Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-20 18:24:29 UTC (rev 4155) +++ trunk/scipy/cluster/hierarchy.py 2008-04-20 19:31:15 UTC (rev 4156) @@ -175,12 +175,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -import _hierarchy_wrap, scipy, numpy, types, math, sys, scipy.stats +import numpy as np +import _hierarchy_wrap, scipy, types, math, sys, scipy.stats -_cpy_non_euclid_methods = {'single': 0, 'complete': 1, 'average': 2, 'weighted': 6} +_cpy_non_euclid_methods = {'single': 0, 'complete': 1, 'average': 2, + 'weighted': 6} _cpy_euclid_methods = {'centroid': 3, 'median': 4, 'ward': 5} -_cpy_linkage_methods = set(_cpy_non_euclid_methods.keys()).union(set(_cpy_euclid_methods.keys())) -_array_type = type(numpy.array([])) +_cpy_linkage_methods = set(_cpy_non_euclid_methods.keys()).union( + set(_cpy_euclid_methods.keys())) +_array_type = np.ndarray try: import warnings @@ -196,7 +199,7 @@ observation vectors, represented by a matrix where the rows are the observations. """ - #n = numpy.double(X.shape[1]) + #n = np.double(X.shape[1]) return scipy.stats.var(X, axis=0) # * n / (n - 1.0) def _copy_array_if_base_present(a): @@ -205,8 +208,8 @@ """ if a.base is not None: return a.copy() - elif (a.dtype == 'float32'): - return numpy.float64(a) + elif (a.dtype == np.float32): + return np.float64(a) else: return a @@ -231,7 +234,7 @@ pnts * (pnts - 1) / 2 sized vector is returned. """ if pnts >= 2: - D = numpy.random.rand(pnts * (pnts - 1) / 2) + D = np.random.rand(pnts * (pnts - 1) / 2) else: raise ValueError("The number of points in the distance matrix must be at least 2.") return D @@ -456,13 +459,13 @@ s = y.shape if len(s) == 1: is_valid_y(y, throw=True, name='y') - d = numpy.ceil(numpy.sqrt(s[0] * 2)) + d = np.ceil(np.sqrt(s[0] * 2)) if method not in _cpy_non_euclid_methods.keys(): raise ValueError("Valid methods when the raw observations are omitted are 'single', 'complete', 'weighted', and 'average'.") # Since the C code does not support striding using strides. [y] = _copy_arrays_if_base_present([y]) - Z = numpy.zeros((d - 1, 4)) + Z = np.zeros((d - 1, 4)) _hierarchy_wrap.linkage_wrap(y, Z, int(d), \ int(_cpy_non_euclid_methods[method])) elif len(s) == 2: @@ -473,14 +476,14 @@ raise ValueError('Invalid method: %s' % method) if method in _cpy_non_euclid_methods.keys(): dm = pdist(X, metric) - Z = numpy.zeros((n - 1, 4)) + Z = np.zeros((n - 1, 4)) _hierarchy_wrap.linkage_wrap(dm, Z, n, \ int(_cpy_non_euclid_methods[method])) elif method in _cpy_euclid_methods.keys(): if metric != 'euclidean': raise ValueError('Method %s requires the distance metric to be euclidean' % s) dm = pdist(X, metric) - Z = numpy.zeros((n - 1, 4)) + Z = np.zeros((n - 1, 4)) _hierarchy_wrap.linkage_euclid_wrap(dm, Z, X, m, n, int(_cpy_euclid_methods[method])) return Z @@ -579,8 +582,8 @@ n = self.count curNode = [None] * (2 * n) - lvisited = numpy.zeros((2 * n,), dtype='bool') - rvisited = numpy.zeros((2 * n,), dtype='bool') + lvisited = np.zeros((2 * n,), dtype=bool) + rvisited = np.zeros((2 * n,), dtype=bool) curNode[0] = self k = 0 preorder = [] @@ -648,7 +651,7 @@ # If we encounter a cluster being combined more than once, the matrix # must be corrupt. - if len(numpy.unique(Z[:, 0:2].reshape((2 * (n - 1),)))) != 2 * (n - 1): + if len(np.unique(Z[:, 0:2].reshape((2 * (n - 1),)))) != 2 * (n - 1): raise ValueError('Corrupt matrix Z. Some clusters are more than once.') # If a cluster index is out of bounds, report an error. if (Z[:, 0:2] >= 2 * n - 1).any(): @@ -723,7 +726,7 @@ if type(X) is not _array_type: raise TypeError('The parameter passed must be an array.') - if X.dtype != 'double': + if X.dtype != np.double: raise TypeError('A double array must be passed.') s = X.shape @@ -733,7 +736,7 @@ # Grab the closest value to the square root of the number # of elements times 2 to see if the number of elements # is indeed a binomial coefficient. - d = int(numpy.ceil(numpy.sqrt(X.shape[0] * 2))) + d = int(np.ceil(np.sqrt(X.shape[0] * 2))) print d, s[0] # Check that v is of valid dimensions. @@ -741,7 +744,7 @@ raise ValueError('Incompatible vector size. It must be a binomial coefficient n choose 2 for some integer n >= 2.') # Allocate memory for the distance matrix. - M = numpy.zeros((d, d), 'double') + M = np.zeros((d, d), 'double') # Since the C code does not support striding using strides. # The dimensions are used instead. @@ -759,7 +762,7 @@ if s[0] != s[1]: raise ValueError('The matrix argument must be square.') if checks: - if numpy.sum(numpy.sum(X == X.transpose())) != numpy.product(X.shape): + if np.sum(np.sum(X == X.transpose())) != np.product(X.shape): raise ValueError('The distance matrix must be symmetrical.') if (X.diagonal() != 0).any(): raise ValueError('The distance matrix must have zeros along the diagonal.') @@ -768,7 +771,7 @@ d = s[0] # Create a vector. - v = numpy.zeros(((d * (d - 1) / 2),), 'double') + v = np.zeros(((d * (d - 1) / 2),), 'double') # Since the C code does not support striding using strides. # The dimensions are used instead. @@ -800,8 +803,8 @@ Computes the Euclidean distance between two n-vectors u and v, ||u-v||_2 """ - q=numpy.matrix(u-v) - return numpy.sqrt((q*q.T).sum()) + q=np.matrix(u-v) + return np.sqrt((q*q.T).sum()) def sqeuclidean(u, v): """ @@ -820,7 +823,7 @@ (1-uv^T)/(||u||_2 * ||v||_2). """ return (1.0 - (scipy.dot(u, v.T) / \ - (numpy.sqrt(scipy.dot(u, u.T)) * numpy.sqrt(scipy.dot(v, v.T))))) + (np.sqrt(scipy.dot(u, u.T)) * np.sqrt(scipy.dot(v, v.T))))) def correlation(u, v): """ @@ -840,8 +843,8 @@ um = u - umu vm = v - vmu return 1.0 - (scipy.dot(um, vm) / - (numpy.sqrt(scipy.dot(um, um)) \ - * numpy.sqrt(scipy.dot(vm, vm)))) + (np.sqrt(scipy.dot(um, um)) \ + * np.sqrt(scipy.dot(vm, vm)))) def hamming(u, v): """ @@ -878,7 +881,7 @@ for k < n. """ - return numpy.double(scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0)).sum()) / numpy.double(scipy.bitwise_or(u != 0, v != 0).sum()) + return np.double(scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0)).sum()) / np.double(scipy.bitwise_or(u != 0, v != 0).sum()) def kulsinski(u, v): """ @@ -911,7 +914,7 @@ """ if type(V) is not _array_type or len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]: raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') - return numpy.sqrt(((u-v)**2 / V).sum()) + return np.sqrt(((u-v)**2 / V).sum()) def cityblock(u, v): """ @@ -932,7 +935,7 @@ """ if type(V) is not _array_type: raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') - return numpy.sqrt(scipy.dot(scipy.dot((u-v),VI),(u-v).T).sum()) + return np.sqrt(scipy.dot(scipy.dot((u-v),VI),(u-v).T).sum()) def chebyshev(u, v): """ @@ -1276,7 +1279,7 @@ Euclidean distance between the vectors could be computed as follows, - dm = pdist(X, (lambda u, v: numpy.sqrt(((u-v)*(u-v).T).sum()))) + dm = pdist(X, (lambda u, v: np.sqrt(((u-v)*(u-v).T).sum()))) Note that you should avoid passing a reference to one of the distance functions defined in this library. For example, @@ -1301,7 +1304,7 @@ if type(X) is not _array_type: raise TypeError('The parameter passed must be an array.') - if X.dtype == 'float32' or X.dtype == 'float96': + if X.dtype == np.float32 or X.dtype == np.float96: raise TypeError('Floating point arrays must be 64-bit.') # The C code doesn't do striding. @@ -1314,7 +1317,7 @@ m = s[0] n = s[1] - dm = numpy.zeros((m * (m - 1) / 2,), dtype='double') + dm = np.zeros((m * (m - 1) / 2,), dtype=np.double) mtype = type(metric) if mtype is types.FunctionType: @@ -1343,7 +1346,8 @@ elif mtype is types.StringType: mstr = metric.lower() - if X.dtype != 'double' and (mstr != 'hamming' and mstr != 'jaccard'): + if X.dtype != np.double and \ + (mstr != 'hamming' and mstr != 'jaccard'): TypeError('A double array must be passed.') if mstr in set(['euclidean', 'euclid', 'eu', 'e']): _hierarchy_wrap.pdist_euclidean_wrap(X, dm) @@ -1353,19 +1357,21 @@ elif mstr in set(['cityblock', 'cblock', 'cb', 'c']): _hierarchy_wrap.pdist_city_block_wrap(X, dm) elif mstr in set(['hamming', 'hamm', 'ha', 'h']): - if X.dtype == 'double': + if X.dtype == np.double: _hierarchy_wrap.pdist_hamming_wrap(X, dm) - elif X.dtype == 'bool': + elif X.dtype == bool: _hierarchy_wrap.pdist_hamming_bool_wrap(X, dm) else: - raise TypeError('Invalid input array value type %s for hamming.' % str(X.dtype)) + raise TypeError('Invalid input array value type %s ' + 'for hamming.' % str(X.dtype)) elif mstr in set(['jaccard', 'jacc', 'ja', 'j']): - if X.dtype == 'double': + if X.dtype == np.double: _hierarchy_wrap.pdist_jaccard_wrap(X, dm) - elif X.dtype == 'bool': + elif X.dtype == np.bool: _hierarchy_wrap.pdist_jaccard_bool_wrap(X, dm) else: - raise TypeError('Invalid input array value type %s for jaccard.' % str(X.dtype)) + raise TypeError('Invalid input array value type %s for ' + 'jaccard.' % str(X.dtype)) elif mstr in set(['chebychev', 'chebyshev', 'cheby', 'cheb', 'ch']): _hierarchy_wrap.pdist_chebyshev_wrap(X, dm) elif mstr in set(['minkowski', 'mi', 'm']): @@ -1374,7 +1380,7 @@ if V is not None: if type(V) is not _array_type: raise TypeError('Variance vector V must be a numpy array') - if V.dtype != 'float64': + if V.dtype != np.float64: raise TypeError('Variance vector V must contain doubles.') if len(V.shape) != 1: raise ValueError('Variance vector V must be one-dimensional.') @@ -1390,33 +1396,33 @@ # subtract matrices in a similar way to multiplying them? # Need to get rid of as much unnecessary C code as possible. elif mstr in set(['cosine_old', 'cos_old']): - norms = numpy.sqrt(numpy.sum(X * X, axis=1)) + norms = np.sqrt(np.sum(X * X, axis=1)) _hierarchy_wrap.pdist_cosine_wrap(X, dm, norms) elif mstr in set(['cosine', 'cos']): - norms = numpy.sqrt(numpy.sum(X * X, axis=1)) + norms = np.sqrt(np.sum(X * X, axis=1)) nV = norms.reshape(m, 1) # The numerator u * v - nm = numpy.dot(X, X.T) + nm = np.dot(X, X.T) # The denom. ||u||*||v|| - de = numpy.dot(nV, nV.T); + de = np.dot(nV, nV.T); dm = 1 - (nm / de) dm[xrange(0,m),xrange(0,m)] = 0 dm = squareform(dm) elif mstr in set(['correlation', 'co']): - X2 = X - X.mean(1)[:,numpy.newaxis] - #X2 = X - numpy.matlib.repmat(numpy.mean(X, axis=1).reshape(m, 1), 1, n) - norms = numpy.sqrt(numpy.sum(X2 * X2, axis=1)) + X2 = X - X.mean(1)[:,np.newaxis] + #X2 = X - np.matlib.repmat(np.mean(X, axis=1).reshape(m, 1), 1, n) + norms = np.sqrt(np.sum(X2 * X2, axis=1)) _hierarchy_wrap.pdist_cosine_wrap(X2, dm, norms) elif mstr in set(['mahalanobis', 'mahal', 'mah']): if VI is not None: if type(VI) != _array_type: raise TypeError('VI must be a numpy array.') - if VI.dtype != 'float64': + if VI.dtype != np.float64: raise TypeError('The array must contain 64-bit floats.') [VI] = _copy_arrays_if_base_present([VI]) else: - V = numpy.cov(X.T) - VI = numpy.linalg.inv(V).T.copy() + V = np.cov(X.T) + VI = np.linalg.inv(V).T.copy() # (u-v)V^(-1)(u-v)^T _hierarchy_wrap.pdist_mahalanobis_wrap(X, VI, dm) elif mstr == 'canberra': @@ -1449,8 +1455,8 @@ dm = pdist(X, braycurtis) elif metric == 'test_mahalanobis': if VI is None: - V = numpy.cov(X.T) - VI = numpy.linalg.inv(V) + V = np.cov(X.T) + VI = np.linalg.inv(V) [VI] = _copy_arrays_if_base_present([VI]) # (u-v)V^(-1)(u-v)^T dm = pdist(X, (lambda u, v: mahalanobis(u, v, VI))) @@ -1523,7 +1529,7 @@ Zs = Z.shape n = Zs[0] + 1 - zz = numpy.zeros((n*(n-1)/2,), dtype='double') + zz = np.zeros((n*(n-1)/2,), dtype=np.double) # Since the C code does not support striding using strides. # The dimensions are used instead. [Z] = _copy_arrays_if_base_present([Z]) @@ -1544,7 +1550,7 @@ numerator = (Yy * Zz) denomA = Yy ** 2 denomB = Zz ** 2 - c = numerator.sum() / numpy.sqrt((denomA.sum() * denomB.sum())) + c = numerator.sum() / np.sqrt((denomA.sum() * denomB.sum())) #print c, numerator.sum() if nargs == 2: return c @@ -1573,7 +1579,7 @@ Zs = Z.shape is_valid_linkage(Z, throw=True, name='Z') - if (not d == numpy.floor(d)) or d < 0: + if (not d == np.floor(d)) or d < 0: raise ValueError('The second argument d must be a nonnegative integer value.') # if d == 0: # d = 1 @@ -1583,7 +1589,7 @@ [Z] = _copy_arrays_if_base_present([Z]) n = Zs[0] + 1 - R = numpy.zeros((n - 1, 4), dtype='double') + R = np.zeros((n - 1, 4), dtype=np.double) _hierarchy_wrap.inconsistent_wrap(Z, R, int(n), int(d)); return R @@ -1608,12 +1614,12 @@ Zd = Z[:,2].reshape(Zs[0], 1) if Zpart.min() != 1.0 and Zpart.max() != 2 * Zs[0]: raise ValueError('The format of the indices is not 1..N'); - CS = numpy.zeros((Zs[0], 1), dtype='double') + CS = np.zeros((Zs[0], 1), dtype=np.double) Zpart = Zpart - 1 - _hierarchy_wrap.calculate_cluster_sizes_wrap(numpy.hstack([Zpart, \ + _hierarchy_wrap.calculate_cluster_sizes_wrap(np.hstack([Zpart, \ Zd]).copy(), \ CS, int(Zs[0]) + 1) - return numpy.hstack([Zpart, Zd, CS]).copy() + return np.hstack([Zpart, Zd, CS]).copy() def to_mlab_linkage(Z): """ @@ -1626,7 +1632,7 @@ """ is_valid_linkage(Z, throw=True, name='Z') - return numpy.hstack([Z[:,0:2] + 1, Z[:,2]]) + return np.hstack([Z[:,0:2] + 1, Z[:,2]]) def is_monotonic(Z): """ @@ -1657,7 +1663,7 @@ raise TypeError('Variable \'%s\' passed as inconsistency matrix is not a numpy array.' % name) else: raise TypeError('Variable passed as inconsistency matrix is not a numpy array.') - if R.dtype != 'double': + if R.dtype != np.double: if name: raise TypeError('Inconsistency matrix \'%s\' must contain doubles (float64).' % name) else: @@ -1716,7 +1722,7 @@ raise TypeError('\'%s\' passed as a linkage is not a valid array.' % name) else: raise TypeError('Variable is not a valid array.') - if Z.dtype != 'double': + if Z.dtype != np.double: if name: raise TypeError('Linkage matrix \'%s\' must contain doubles (float64).' % name) else: @@ -1776,7 +1782,7 @@ raise TypeError('\'%s\' passed as a condensed distance matrix is not a numpy array.' % name) else: raise TypeError('Variable is not a numpy array.') - if y.dtype != 'double': + if y.dtype != np.double: if name: raise TypeError('Condensed distance matrix \'%s\' must contain doubles (float64).' % name) else: @@ -1787,7 +1793,7 @@ else: raise ValueError('Condensed distance matrix must have shape=1 (i.e. be one-dimensional).') n = y.shape[0] - d = int(numpy.ceil(numpy.sqrt(n * 2))) + d = int(np.ceil(np.sqrt(n * 2))) if (d*(d-1)/2) != n: if name: raise ValueError('Length n of condensed distance matrix \'%s\' must be a binomial coefficient, i.e. there must be a k such that (k \choose 2)=n)!' % name) @@ -1838,7 +1844,7 @@ raise TypeError('\'%s\' passed as a distance matrix is not a numpy array.' % name) else: raise TypeError('Variable is not a numpy array.') - if D.dtype != 'double': + if D.dtype != np.double: if name: raise TypeError('Distance matrix \'%s\' must contain doubles (float64).' % name) else: @@ -1904,7 +1910,7 @@ condensed distance matrix Y. """ is_valid_y(y, throw=True, name='Y') - d = int(numpy.ceil(numpy.sqrt(y.shape[0] * 2))) + d = int(np.ceil(np.sqrt(y.shape[0] * 2))) return d def Z_y_correspond(Z, Y): @@ -1979,7 +1985,7 @@ is_valid_linkage(Z, throw=True, name='Z') n = Z.shape[0] + 1 - T = numpy.zeros((n,), dtype='int32') + T = np.zeros((n,), dtype=np.int32) # Since the C code does not support striding using strides. # The dimensions are used instead. @@ -2078,7 +2084,7 @@ """ is_valid_linkage(Z, throw=True, name='Z') n = Z.shape[0] + 1 - ML = numpy.zeros((n,), dtype='int32') + ML = np.zeros((n,), dtype=np.int32) [Z] = _copy_arrays_if_base_present([Z]) _hierarchy_wrap.prelist_wrap(Z, ML, int(n)) return ML @@ -2917,7 +2923,7 @@ is_valid_linkage(Z, throw=True, name='Z') n = Z.shape[0] + 1 - MD = numpy.zeros((n-1,)) + MD = np.zeros((n-1,)) [Z] = _copy_arrays_if_base_present([Z]) _hierarchy_wrap.get_max_dist_for_each_hierarchy_wrap(Z, MD, int(n)) return MD @@ -2935,7 +2941,7 @@ is_valid_im(R, throw=True, name='R') n = Z.shape[0] + 1 - MI = numpy.zeros((n-1,)) + MI = np.zeros((n-1,)) [Z, R] = _copy_arrays_if_base_present([Z, R]) _hierarchy_wrap.get_max_Rfield_for_each_hierarchy_wrap(Z, R, MI, int(n), 3) return MI @@ -2957,7 +2963,7 @@ return ValueError('i must be an integer between 0 and 3 inclusive.') n = Z.shape[0] + 1 - MR = numpy.zeros((n-1,)) + MR = np.zeros((n-1,)) [Z, R] = _copy_arrays_if_base_present([Z, R]) _hierarchy_wrap.get_max_Rfield_for_each_hierarchy_wrap(Z, R, MR, int(n), i) return MR @@ -2984,16 +2990,16 @@ i < n, i corresponds to an original observation, otherwise it corresponds to a non-singleton cluster. """ - if type(T) != _array_type or T.dtype != 'int': + if type(T) != _array_type or T.dtype != np.int: raise TypeError('T must be a one-dimensional numpy array of integers.') is_valid_linkage(Z, throw=True, name='Z') if len(T) != Z.shape[0] + 1: raise ValueError('Mismatch: len(T)!=Z.shape[0] + 1.') - Cl = numpy.unique(T) + Cl = np.unique(T) kk = len(Cl) - L = numpy.zeros((kk,), dtype='int32') - M = numpy.zeros((kk,), dtype='int32') + L = np.zeros((kk,), dtype=np.int32) + M = np.zeros((kk,), dtype=np.int32) n = Z.shape[0] + 1 [Z, T] = _copy_arrays_if_base_present([Z, T]) s = _hierarchy_wrap.leaders_wrap(Z, T, L, M, int(kk), int(n)) From scipy-svn at scipy.org Sun Apr 20 15:34:22 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 20 Apr 2008 14:34:22 -0500 (CDT) Subject: [Scipy-svn] r4157 - trunk/scipy/linalg Message-ID: <20080420193422.4C46E39C13A@new.scipy.org> Author: stefan Date: 2008-04-20 14:34:08 -0500 (Sun, 20 Apr 2008) New Revision: 4157 Modified: trunk/scipy/linalg/setup.py Log: Include cgesv in clapack. Modified: trunk/scipy/linalg/setup.py =================================================================== --- trunk/scipy/linalg/setup.py 2008-04-20 19:31:15 UTC (rev 4156) +++ trunk/scipy/linalg/setup.py 2008-04-20 19:34:08 UTC (rev 4157) @@ -63,7 +63,7 @@ if skip_single_routines: target_dir = 'dbl' skip_names['clapack'].extend(\ - 'sgesv cgesv sgetrf cgetrf sgetrs cgetrs sgetri cgetri'\ + 'sgesv sgetrf cgetrf sgetrs cgetrs sgetri cgetri'\ ' sposv cposv spotrf cpotrf spotrs cpotrs spotri cpotri'\ ' slauum clauum strtri ctrtri'.split()) skip_names['flapack'].extend(skip_names['clapack']) From scipy-svn at scipy.org Mon Apr 21 06:01:50 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 05:01:50 -0500 (CDT) Subject: [Scipy-svn] r4158 - trunk/scipy/integrate Message-ID: <20080421100150.E602A39C0B9@new.scipy.org> Author: cdavid Date: 2008-04-21 05:01:45 -0500 (Mon, 21 Apr 2008) New Revision: 4158 Modified: trunk/scipy/integrate/SConstruct Log: Fail scons build of integrate when no BLAS is found. Modified: trunk/scipy/integrate/SConstruct =================================================================== --- trunk/scipy/integrate/SConstruct 2008-04-20 19:34:08 UTC (rev 4157) +++ trunk/scipy/integrate/SConstruct 2008-04-21 10:01:45 UTC (rev 4158) @@ -15,7 +15,7 @@ if not config.CheckF77Clib(): raise Exception("Could not check F77 runtime, needed for interpolate") if not config.CheckF77BLAS(): - warnings.warn("Could not find F77 BLAS") + raise Exception("Could not find F77 BLAS, needed for integrate package") config.Finish() From scipy-svn at scipy.org Mon Apr 21 23:16:26 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 22:16:26 -0500 (CDT) Subject: [Scipy-svn] r4159 - in trunk/scipy: interpolate optimize sparse/linalg/eigen/arpack Message-ID: <20080422031626.01A8739C6A8@new.scipy.org> Author: cdavid Date: 2008-04-21 22:16:19 -0500 (Mon, 21 Apr 2008) New Revision: 4159 Modified: trunk/scipy/interpolate/SConstruct trunk/scipy/optimize/SConstruct trunk/scipy/sparse/linalg/eigen/arpack/SConstruct Log: scons build: remove explicit target for F2py builders when not needed (.pyf sources). Modified: trunk/scipy/interpolate/SConstruct =================================================================== --- trunk/scipy/interpolate/SConstruct 2008-04-21 10:01:45 UTC (rev 4158) +++ trunk/scipy/interpolate/SConstruct 2008-04-22 03:16:19 UTC (rev 4159) @@ -1,4 +1,4 @@ -# Last Change: Wed Mar 05 03:00 PM 2008 J +# Last Change: Tue Apr 22 11:00 AM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -27,6 +27,5 @@ env.NumpyPythonExtension('_fitpack', source = '_fitpackmodule.c') # Build dfitpack -dfitpack_wrap = env.F2py(pjoin(env['build_dir'], 'dfitpack'), - pjoin(env['build_dir'], 'fitpack.pyf')) +dfitpack_wrap = env.F2py(pjoin(env['build_dir'], 'fitpack.pyf')) env.NumpyPythonExtension('dfitpack', source = dfitpack_wrap) Modified: trunk/scipy/optimize/SConstruct =================================================================== --- trunk/scipy/optimize/SConstruct 2008-04-21 10:01:45 UTC (rev 4158) +++ trunk/scipy/optimize/SConstruct 2008-04-22 03:16:19 UTC (rev 4159) @@ -1,4 +1,4 @@ -# Last Change: Wed Mar 05 11:00 PM 2008 J +# Last Change: Tue Apr 22 11:00 AM 2008 J # vim:syntax=python import os @@ -66,22 +66,19 @@ # _lbfgsb pyextension src = pjoin('lbfgsb', 'routines.f') -lbfgsb_src = env.F2py(pjoin(env['build_dir'], '_lbfgsbmodule.c'), - pjoin(env['build_dir'], 'lbfgsb', 'lbfgsb.pyf')) +lbfgsb_src = env.F2py(pjoin(env['build_dir'], 'lbfgsb', 'lbfgsb.pyf')) env.NumpyPythonExtension('_lbfgsb', source = [src] + lbfgsb_src, LINKFLAGSEND = env['F77_LDFLAGS']) # _cobyla pyextension src = [pjoin('cobyla', i) for i in ['cobyla2.f', 'trstlp.f']] -wrap_src = env.F2py(pjoin(env['build_dir'], 'cobyla', '_cobylamodule.c'), - pjoin(env['build_dir'], 'cobyla', 'cobyla.pyf')) +wrap_src = env.F2py(pjoin(env['build_dir'], 'cobyla', 'cobyla.pyf')) env.NumpyPythonExtension('_cobyla', source = src + wrap_src, LINKFLAGSEND = env['F77_LDFLAGS']) # _minpack2 pyextension src = [pjoin('minpack2', i) for i in ['dcsrch.f', 'dcstep.f']] -wrap_src = env.F2py(pjoin(env['build_dir'], 'minpack2', 'minpack2module.c'), - pjoin(env['build_dir'], 'minpack2', 'minpack2.pyf')) +wrap_src = env.F2py(pjoin(env['build_dir'], 'minpack2', 'minpack2.pyf')) env.NumpyPythonExtension('minpack2', source = src + wrap_src, LINKFLAGSEND = env['F77_LDFLAGS']) @@ -92,8 +89,7 @@ # _slsqp pyextension src = pjoin('slsqp', 'slsqp_optmz.f') -slsqp_src = env.F2py(pjoin(env['build_dir'], '_slsqpmodule.c'), - pjoin(env['build_dir'], 'slsqp', 'slsqp.pyf')) +slsqp_src = env.F2py(pjoin(env['build_dir'], 'slsqp', 'slsqp.pyf')) env.NumpyPythonExtension('_slsqp', source = [src] + slsqp_src, LINKFLAGSEND = env['F77_LDFLAGS']) Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-21 10:01:45 UTC (rev 4158) +++ trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-22 03:16:19 UTC (rev 4159) @@ -42,7 +42,6 @@ env.AppendUnique(CPPPATH = get_numpy_include_dirs()) env.NumpyFromFTemplate('arpack.pyf', 'arpack.pyf.src') -wsrc = env.F2py(pjoin(env['build_dir'], '_arpackmodule.c'), - pjoin(env['build_dir'], 'arpack.pyf')) +wsrc = env.F2py(pjoin(env['build_dir'], 'arpack.pyf')) env.Prepend(LIBS = 'arpack') env.NumpyPythonExtension('_arpack', source = wsrc) From scipy-svn at scipy.org Tue Apr 22 00:10:44 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 23:10:44 -0500 (CDT) Subject: [Scipy-svn] r4160 - trunk/scipy/fftpack Message-ID: <20080422041044.86C6839C1C9@new.scipy.org> Author: cdavid Date: 2008-04-21 23:10:40 -0500 (Mon, 21 Apr 2008) New Revision: 4160 Modified: trunk/scipy/fftpack/SConstruct Log: scons build: use NumpyF2py instead of F2py in fftpack. Modified: trunk/scipy/fftpack/SConstruct =================================================================== --- trunk/scipy/fftpack/SConstruct 2008-04-22 03:16:19 UTC (rev 4159) +++ trunk/scipy/fftpack/SConstruct 2008-04-22 04:10:40 UTC (rev 4160) @@ -1,4 +1,4 @@ -# Last Change: Fri Mar 07 09:00 PM 2008 J +# Last Change: Tue Apr 22 12:00 PM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -36,10 +36,10 @@ # Build _fftpack src = ['src/zfft.c','src/drfft.c','src/zrfft.c', 'src/zfftnd.c'] -wsrc = env.F2py(pjoin(env['build_dir'], 'fftpack.pyf')) +wsrc = env.NumpyF2py('fftpack.pyf') env.NumpyPythonExtension('_fftpack', source = src + wsrc) # Build convolve src = ['src/convolve.c'] -wsrc = env.F2py(pjoin(env['build_dir'], 'convolve.pyf')) +wsrc = env.NumpyF2py('convolve.pyf') env.NumpyPythonExtension('convolve', source = src + wsrc) From scipy-svn at scipy.org Tue Apr 22 00:12:19 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 23:12:19 -0500 (CDT) Subject: [Scipy-svn] r4161 - trunk/scipy/interpolate Message-ID: <20080422041219.EF9A139C1C9@new.scipy.org> Author: cdavid Date: 2008-04-21 23:12:09 -0500 (Mon, 21 Apr 2008) New Revision: 4161 Modified: trunk/scipy/interpolate/SConstruct Log: scons build: use NumpyF2py instead of F2py in interpolate. Modified: trunk/scipy/interpolate/SConstruct =================================================================== --- trunk/scipy/interpolate/SConstruct 2008-04-22 04:10:40 UTC (rev 4160) +++ trunk/scipy/interpolate/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) @@ -1,4 +1,4 @@ -# Last Change: Tue Apr 22 11:00 AM 2008 J +# Last Change: Tue Apr 22 12:00 PM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -27,5 +27,5 @@ env.NumpyPythonExtension('_fitpack', source = '_fitpackmodule.c') # Build dfitpack -dfitpack_wrap = env.F2py(pjoin(env['build_dir'], 'fitpack.pyf')) +dfitpack_wrap = env.NumpyF2py('fitpack.pyf') env.NumpyPythonExtension('dfitpack', source = dfitpack_wrap) From scipy-svn at scipy.org Tue Apr 22 00:29:04 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 23:29:04 -0500 (CDT) Subject: [Scipy-svn] r4162 - in trunk/scipy: lib/lapack linalg optimize sparse/linalg/eigen/arpack stats Message-ID: <20080422042904.7A2D539C6B1@new.scipy.org> Author: cdavid Date: 2008-04-21 23:28:52 -0500 (Mon, 21 Apr 2008) New Revision: 4162 Modified: trunk/scipy/lib/lapack/SConstruct trunk/scipy/linalg/SConstruct trunk/scipy/optimize/SConstruct trunk/scipy/sparse/linalg/eigen/arpack/SConstruct trunk/scipy/stats/SConstruct Log: scons build: use NumpyF2py instead of F2py everywhere. Modified: trunk/scipy/lib/lapack/SConstruct =================================================================== --- trunk/scipy/lib/lapack/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) +++ trunk/scipy/lib/lapack/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) @@ -1,4 +1,4 @@ -# Last Change: Wed Mar 05 03:00 PM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python import os @@ -83,8 +83,8 @@ #---------------- # calc_lwork: #---------------- -calc_src = env.F2py(pjoin(env['build_dir'], 'calc_lworkmodule.c'), - source = pjoin(env['build_dir'], 'calc_lwork.f')) +calc_src = env.NumpyF2py(pjoin('calc_lworkmodule.c'), + source = pjoin('calc_lwork.f')) env.NumpyPythonExtension('calc_lwork', source = calc_src + ['calc_lwork.f'], LINKFLAGSEND = env['F77_LDFLAGS']) Modified: trunk/scipy/linalg/SConstruct =================================================================== --- trunk/scipy/linalg/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) +++ trunk/scipy/linalg/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) @@ -1,4 +1,4 @@ -# Last Change: Fri Mar 07 07:00 PM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python import os @@ -138,9 +138,8 @@ # _flinalg #---------------- _flinalg_fsrc = ['det.f', 'lu.f'] -_flinalg_src = fenv.F2py( - pjoin(fenv['build_dir'], 'src', '_flinalgmodule.c'), - source = [pjoin(fenv['build_dir'], 'src', i) for i in _flinalg_fsrc]) +_flinalg_src = fenv.NumpyF2py(pjoin('src', '_flinalgmodule.c'), + source = [pjoin('src', i) for i in _flinalg_fsrc]) fenv.NumpyPythonExtension( '_flinalg', source = _flinalg_src + [pjoin('src', i) for i in _flinalg_fsrc]) @@ -148,8 +147,8 @@ #---------------- # calc_lwork: #---------------- -calc_src = env.F2py(pjoin(env['build_dir'], 'src', 'calc_lworkmodule.c'), - source = pjoin(env['build_dir'], 'src', 'calc_lwork.f')) +calc_src = env.NumpyF2py(pjoin('src', 'calc_lworkmodule.c'), + source = pjoin('src', 'calc_lwork.f')) fenv.NumpyPythonExtension('calc_lwork', source = calc_src + [pjoin('src', 'calc_lwork.f')]) Modified: trunk/scipy/optimize/SConstruct =================================================================== --- trunk/scipy/optimize/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) +++ trunk/scipy/optimize/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) @@ -1,4 +1,4 @@ -# Last Change: Tue Apr 22 11:00 AM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python import os @@ -66,19 +66,19 @@ # _lbfgsb pyextension src = pjoin('lbfgsb', 'routines.f') -lbfgsb_src = env.F2py(pjoin(env['build_dir'], 'lbfgsb', 'lbfgsb.pyf')) +lbfgsb_src = env.NumpyF2py(pjoin('lbfgsb', 'lbfgsb.pyf')) env.NumpyPythonExtension('_lbfgsb', source = [src] + lbfgsb_src, LINKFLAGSEND = env['F77_LDFLAGS']) # _cobyla pyextension src = [pjoin('cobyla', i) for i in ['cobyla2.f', 'trstlp.f']] -wrap_src = env.F2py(pjoin(env['build_dir'], 'cobyla', 'cobyla.pyf')) +wrap_src = env.NumpyF2py(pjoin('cobyla', 'cobyla.pyf')) env.NumpyPythonExtension('_cobyla', source = src + wrap_src, LINKFLAGSEND = env['F77_LDFLAGS']) # _minpack2 pyextension src = [pjoin('minpack2', i) for i in ['dcsrch.f', 'dcstep.f']] -wrap_src = env.F2py(pjoin(env['build_dir'], 'minpack2', 'minpack2.pyf')) +wrap_src = env.NumpyF2py(pjoin('minpack2', 'minpack2.pyf')) env.NumpyPythonExtension('minpack2', source = src + wrap_src, LINKFLAGSEND = env['F77_LDFLAGS']) @@ -89,7 +89,6 @@ # _slsqp pyextension src = pjoin('slsqp', 'slsqp_optmz.f') -slsqp_src = env.F2py(pjoin(env['build_dir'], 'slsqp', 'slsqp.pyf')) +slsqp_src = env.NumpyF2py(pjoin('slsqp', 'slsqp.pyf')) env.NumpyPythonExtension('_slsqp', source = [src] + slsqp_src, LINKFLAGSEND = env['F77_LDFLAGS']) - Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) +++ trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) @@ -42,6 +42,6 @@ env.AppendUnique(CPPPATH = get_numpy_include_dirs()) env.NumpyFromFTemplate('arpack.pyf', 'arpack.pyf.src') -wsrc = env.F2py(pjoin(env['build_dir'], 'arpack.pyf')) +wsrc = env.NumpyF2py('arpack.pyf') env.Prepend(LIBS = 'arpack') env.NumpyPythonExtension('_arpack', source = wsrc) Modified: trunk/scipy/stats/SConstruct =================================================================== --- trunk/scipy/stats/SConstruct 2008-04-22 04:12:09 UTC (rev 4161) +++ trunk/scipy/stats/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) @@ -1,4 +1,4 @@ -# Last Change: Wed Mar 05 09:00 PM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -28,8 +28,7 @@ LINKFLAGSEND = env['F77_LDFLAGS']) # futil extension -futil_src = env.F2py(pjoin(env['build_dir'], 'futilmodule.c'), - pjoin(env['build_dir'], 'futil.f')) +futil_src = env.NumpyF2py(pjoin('futilmodule.c'), pjoin('futil.f')) env.NumpyPythonExtension('futil', source = futil_src + ['futil.f'], LINKFLAGSEND = env['F77_LDFLAGS']) From scipy-svn at scipy.org Tue Apr 22 00:42:06 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 23:42:06 -0500 (CDT) Subject: [Scipy-svn] r4163 - in trunk/scipy: fftpack interpolate optimize sparse/linalg/eigen/arpack Message-ID: <20080422044206.533CD39C685@new.scipy.org> Author: cdavid Date: 2008-04-21 23:41:53 -0500 (Mon, 21 Apr 2008) New Revision: 4163 Modified: trunk/scipy/fftpack/SConstruct trunk/scipy/interpolate/SConstruct trunk/scipy/optimize/SConstruct trunk/scipy/sparse/linalg/eigen/arpack/SConstruct Log: Do not explictly use NumpyF2py builder on .pyf files: .pyf are registered and handled automatically now. Modified: trunk/scipy/fftpack/SConstruct =================================================================== --- trunk/scipy/fftpack/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) +++ trunk/scipy/fftpack/SConstruct 2008-04-22 04:41:53 UTC (rev 4163) @@ -1,4 +1,4 @@ -# Last Change: Tue Apr 22 12:00 PM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -35,11 +35,9 @@ env.PrependUnique(LIBPATH = env['build_dir']) # Build _fftpack -src = ['src/zfft.c','src/drfft.c','src/zrfft.c', 'src/zfftnd.c'] -wsrc = env.NumpyF2py('fftpack.pyf') -env.NumpyPythonExtension('_fftpack', source = src + wsrc) +src = ['src/zfft.c','src/drfft.c','src/zrfft.c', 'src/zfftnd.c', 'fftpack.pyf'] +env.NumpyPythonExtension('_fftpack', src) # Build convolve -src = ['src/convolve.c'] -wsrc = env.NumpyF2py('convolve.pyf') -env.NumpyPythonExtension('convolve', source = src + wsrc) +src = ['src/convolve.c', 'convolve.pyf'] +env.NumpyPythonExtension('convolve', src) Modified: trunk/scipy/interpolate/SConstruct =================================================================== --- trunk/scipy/interpolate/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) +++ trunk/scipy/interpolate/SConstruct 2008-04-22 04:41:53 UTC (rev 4163) @@ -1,4 +1,4 @@ -# Last Change: Tue Apr 22 12:00 PM 2008 J +# Last Change: Tue Apr 22 01:00 PM 2008 J # vim:syntax=python from os.path import join as pjoin @@ -27,5 +27,4 @@ env.NumpyPythonExtension('_fitpack', source = '_fitpackmodule.c') # Build dfitpack -dfitpack_wrap = env.NumpyF2py('fitpack.pyf') -env.NumpyPythonExtension('dfitpack', source = dfitpack_wrap) +env.NumpyPythonExtension('dfitpack', source = 'fitpack.pyf') Modified: trunk/scipy/optimize/SConstruct =================================================================== --- trunk/scipy/optimize/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) +++ trunk/scipy/optimize/SConstruct 2008-04-22 04:41:53 UTC (rev 4163) @@ -65,21 +65,18 @@ env.NumpyPythonExtension('_zeros', 'zeros.c') # _lbfgsb pyextension -src = pjoin('lbfgsb', 'routines.f') -lbfgsb_src = env.NumpyF2py(pjoin('lbfgsb', 'lbfgsb.pyf')) -env.NumpyPythonExtension('_lbfgsb', source = [src] + lbfgsb_src, +src = [pjoin('lbfgsb', i) for i in ['lbfgsb.pyf', 'routines.f']] +env.NumpyPythonExtension('_lbfgsb', source = src, LINKFLAGSEND = env['F77_LDFLAGS']) # _cobyla pyextension -src = [pjoin('cobyla', i) for i in ['cobyla2.f', 'trstlp.f']] -wrap_src = env.NumpyF2py(pjoin('cobyla', 'cobyla.pyf')) -env.NumpyPythonExtension('_cobyla', source = src + wrap_src, +src = [pjoin('cobyla', i) for i in ['cobyla2.f', 'trstlp.f', 'cobyla.pyf']] +env.NumpyPythonExtension('_cobyla', source = src, LINKFLAGSEND = env['F77_LDFLAGS']) # _minpack2 pyextension -src = [pjoin('minpack2', i) for i in ['dcsrch.f', 'dcstep.f']] -wrap_src = env.NumpyF2py(pjoin('minpack2', 'minpack2.pyf')) -env.NumpyPythonExtension('minpack2', source = src + wrap_src, +src = [pjoin('minpack2', i) for i in ['dcsrch.f', 'dcstep.f', 'minpack2.pyf']] +env.NumpyPythonExtension('minpack2', source = src, LINKFLAGSEND = env['F77_LDFLAGS']) # moduleTNC pyextension @@ -88,7 +85,6 @@ ['moduleTNC.c', 'tnc.c']]) # _slsqp pyextension -src = pjoin('slsqp', 'slsqp_optmz.f') -slsqp_src = env.NumpyF2py(pjoin('slsqp', 'slsqp.pyf')) -env.NumpyPythonExtension('_slsqp', source = [src] + slsqp_src, +src = [pjoin('slsqp', i) for i in ['slsqp_optmz.f', 'slsqp.pyf']] +env.NumpyPythonExtension('_slsqp', source = src, LINKFLAGSEND = env['F77_LDFLAGS']) Modified: trunk/scipy/sparse/linalg/eigen/arpack/SConstruct =================================================================== --- trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-22 04:28:52 UTC (rev 4162) +++ trunk/scipy/sparse/linalg/eigen/arpack/SConstruct 2008-04-22 04:41:53 UTC (rev 4163) @@ -42,6 +42,5 @@ env.AppendUnique(CPPPATH = get_numpy_include_dirs()) env.NumpyFromFTemplate('arpack.pyf', 'arpack.pyf.src') -wsrc = env.NumpyF2py('arpack.pyf') env.Prepend(LIBS = 'arpack') -env.NumpyPythonExtension('_arpack', source = wsrc) +env.NumpyPythonExtension('_arpack', 'arpack.pyf') From scipy-svn at scipy.org Tue Apr 22 00:54:08 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 21 Apr 2008 23:54:08 -0500 (CDT) Subject: [Scipy-svn] r4164 - trunk/scipy/linalg Message-ID: <20080422045408.13E3E39C562@new.scipy.org> Author: cdavid Date: 2008-04-21 23:54:04 -0500 (Mon, 21 Apr 2008) New Revision: 4164 Modified: trunk/scipy/linalg/SConstruct Log: Scons build: clean up scipy.linalg scons script. Modified: trunk/scipy/linalg/SConstruct =================================================================== --- trunk/scipy/linalg/SConstruct 2008-04-22 04:41:53 UTC (rev 4163) +++ trunk/scipy/linalg/SConstruct 2008-04-22 04:54:04 UTC (rev 4164) @@ -123,7 +123,7 @@ yop = fenv.haha('flapack', 'generic_flapack.pyf') # XXX: automatically scan dependency on flapack_user_routines.pyf ? fenv.Depends(yop, pjoin(env['build_dir'], 'flapack_user_routines.pyf')) -fenv.NumpyPythonExtension('flapack', source = ['flapack.pyf']) +fenv.NumpyPythonExtension('flapack', 'flapack.pyf') #------------ # clapack @@ -137,20 +137,17 @@ #---------------- # _flinalg #---------------- -_flinalg_fsrc = ['det.f', 'lu.f'] -_flinalg_src = fenv.NumpyF2py(pjoin('src', '_flinalgmodule.c'), - source = [pjoin('src', i) for i in _flinalg_fsrc]) +flinalg_fsrc = [pjoin('src', i) for i in ['det.f', 'lu.f']] +flinalg_src = fenv.NumpyF2py(pjoin('src', '_flinalgmodule.c'), flinalg_fsrc) -fenv.NumpyPythonExtension( - '_flinalg', source = _flinalg_src + [pjoin('src', i) for i in _flinalg_fsrc]) +fenv.NumpyPythonExtension('_flinalg', source = flinalg_src + flinalg_fsrc) #---------------- # calc_lwork: #---------------- -calc_src = env.NumpyF2py(pjoin('src', 'calc_lworkmodule.c'), - source = pjoin('src', 'calc_lwork.f')) -fenv.NumpyPythonExtension('calc_lwork', - source = calc_src + [pjoin('src', 'calc_lwork.f')]) +calc_fsrc = [pjoin('src', 'calc_lwork.f')] +calc_src = env.NumpyF2py(pjoin('src', 'calc_lworkmodule.c'), calc_fsrc) +fenv.NumpyPythonExtension('calc_lwork', calc_src + calc_fsrc) #-------------- # Atlas version From scipy-svn at scipy.org Tue Apr 22 04:37:27 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 22 Apr 2008 03:37:27 -0500 (CDT) Subject: [Scipy-svn] r4165 - in trunk/scipy/ndimage/src: register segment Message-ID: <20080422083727.D887A39C25E@new.scipy.org> Author: cdavid Date: 2008-04-22 03:37:22 -0500 (Tue, 22 Apr 2008) New Revision: 4165 Modified: trunk/scipy/ndimage/src/register/Register_EXT.c trunk/scipy/ndimage/src/segment/Segmenter_EXT.c Log: Fix visibility of init functions for register and segment modules: use PyMODINIT_FUNC instead of void. Modified: trunk/scipy/ndimage/src/register/Register_EXT.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-22 04:54:04 UTC (rev 4164) +++ trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-22 08:37:22 UTC (rev 4165) @@ -352,7 +352,7 @@ { NULL, NULL, 0, NULL}, }; -void init_register(void) +PyMODINIT_FUNC init_register(void) { Py_InitModule("_register", RegisterMethods); import_array(); Modified: trunk/scipy/ndimage/src/segment/Segmenter_EXT.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-22 04:54:04 UTC (rev 4164) +++ trunk/scipy/ndimage/src/segment/Segmenter_EXT.c 2008-04-22 08:37:22 UTC (rev 4165) @@ -670,7 +670,7 @@ { NULL, NULL, 0, NULL}, }; -void init_segment(void) +PyMODINIT_FUNC init_segment(void) { Py_InitModule("_segment", SegmenterMethods); import_array(); From scipy-svn at scipy.org Tue Apr 22 04:45:30 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 22 Apr 2008 03:45:30 -0500 (CDT) Subject: [Scipy-svn] r4166 - trunk/scipy/ndimage/src/segment Message-ID: <20080422084530.E168939C130@new.scipy.org> Author: cdavid Date: 2008-04-22 03:45:27 -0500 (Tue, 22 Apr 2008) New Revision: 4166 Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c Log: Do not use C99-style declaration after first statement: VS 2003 does not support it for C files. Modified: trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-22 08:37:22 UTC (rev 4165) +++ trunk/scipy/ndimage/src/segment/Segmenter_IMPL.c 2008-04-22 08:45:27 UTC (rev 4166) @@ -1372,10 +1372,11 @@ int number_kernels; int kernel_size; int filters; + int aperature; number_kernels = lawsFilter.numberKernels; kernel_size = lawsFilter.kernelLength; filters = lawsFilter.numberFilterLayers; - int aperature = (kernel_size-1)/2; + aperature = (kernel_size-1)/2; computeLaws(lawsFilter, aperature, rows, cols, mask, lawsImage, src_image); From scipy-svn at scipy.org Tue Apr 22 04:52:47 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 22 Apr 2008 03:52:47 -0500 (CDT) Subject: [Scipy-svn] r4167 - in trunk/scipy/sparse/linalg/eigen/lobpcg: . tests Message-ID: <20080422085247.4FF3239C130@new.scipy.org> Author: cdavid Date: 2008-04-22 03:52:42 -0500 (Tue, 22 Apr 2008) New Revision: 4167 Modified: trunk/scipy/sparse/linalg/eigen/lobpcg/ trunk/scipy/sparse/linalg/eigen/lobpcg/tests/ Log: Ignore python byte-compiled and vim junk in scipy.sparse.linalg.eigen.lobpcg Property changes on: trunk/scipy/sparse/linalg/eigen/lobpcg ___________________________________________________________________ Name: svn:ignore + *.pyc *.swp *.pyd *.so Property changes on: trunk/scipy/sparse/linalg/eigen/lobpcg/tests ___________________________________________________________________ Name: svn:ignore + *.pyc *.swp *.pyd *.so From scipy-svn at scipy.org Wed Apr 23 20:31:40 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 23 Apr 2008 19:31:40 -0500 (CDT) Subject: [Scipy-svn] r4168 - trunk/scipy/ndimage/src/register Message-ID: <20080424003140.9492A39C77D@new.scipy.org> Author: tom.waite Date: 2008-04-23 19:31:38 -0500 (Wed, 23 Apr 2008) New Revision: 4168 Modified: trunk/scipy/ndimage/src/register/Register_EXT.c Log: added resample_with_gradient for affine xform part of elastic registration. Modified: trunk/scipy/ndimage/src/register/Register_EXT.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-22 08:52:42 UTC (rev 4167) +++ trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-24 00:31:38 UTC (rev 4168) @@ -341,14 +341,95 @@ } + +static PyObject *Register_ResampleWithGradient(PyObject *self, PyObject *args) +{ + + int num; + int nd; + int type; + int itype; + int nd_rotmatrix; + int nd_S; + npy_intp *dimsScale; + npy_intp *dimsOffset; + npy_intp *dimsS; + npy_intp *dimsD; + npy_intp *dims_rotmatrix; + npy_intp *dims_S; + unsigned char *imageS; + unsigned char *imageD; + double *M; + int *S; + double *scale; + int *offset; + double *gradientX; + double *gradientY; + double *gradientZ; + PyObject *imgArrayS = NULL; + PyObject *imgArrayD = NULL; + PyObject *rotArray = NULL; + PyObject *SArray = NULL; + PyObject *scaleArray = NULL; + PyObject *offsetArray = NULL; + PyObject *gradXArray = NULL; + PyObject *gradYArray = NULL; + PyObject *gradZArray = NULL; + + if(!PyArg_ParseTuple(args, "OOOOOOOOO", &imgArrayS, &imgArrayD, &rotArray, &SArray, &scaleArray, + &offsetArray, &gradXArray, &gradYArray, &gradZArray)) + goto exit; + + /* check in the Python code that S and D are the same dims, type */ + imageS = (unsigned char *)PyArray_DATA(imgArrayS); + imageD = (unsigned char *)PyArray_DATA(imgArrayD); + /* reads dims as 0 = layers, 1 = rows, 2 = cols */ + nd = PyArray_NDIM(imgArrayS); + dimsS = PyArray_DIMS(imgArrayS); + dimsD = PyArray_DIMS(imgArrayD); + type = PyArray_TYPE(imgArrayS); + num = PyArray_SIZE(imgArrayS); + + M = (double *)PyArray_DATA(rotArray); + nd_rotmatrix = PyArray_NDIM(rotArray); + dims_rotmatrix = PyArray_DIMS(rotArray); + + S = (int *)PyArray_DATA(SArray); + nd_S = PyArray_NDIM(SArray); + dims_S = PyArray_DIMS(SArray); + + scale = (double *)PyArray_DATA(scaleArray); + offset = (int *)PyArray_DATA(offsetArray); + dimsScale = PyArray_DIMS(scaleArray); + dimsOffset = PyArray_DIMS(offsetArray); + + gradientX = (double *)PyArray_DATA(gradXArray); + gradientY = (double *)PyArray_DATA(gradYArray); + gradientZ = (double *)PyArray_DATA(gradZArray); + + if(!NI_ResampleWithGradient((int)dimsS[0], (int)dimsS[1], (int)dimsS[2], + (int)dimsD[0], (int)dimsD[1], (int)dimsD[2], + S, M, imageD, imageS, scale, offset, gradientX, + gradientY, gradientZ)) + goto exit; + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + + + static PyMethodDef RegisterMethods[] = { - { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, - { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, - { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, - { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, - { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, - { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, + { "register_resample_w_gradient", Register_ResampleWithGradient, METH_VARARGS, NULL }, + { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, + { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, + { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, + { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, + { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, + { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL}, }; From scipy-svn at scipy.org Wed Apr 23 20:32:00 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 23 Apr 2008 19:32:00 -0500 (CDT) Subject: [Scipy-svn] r4169 - trunk/scipy/ndimage/src/register Message-ID: <20080424003200.A798039C77D@new.scipy.org> Author: tom.waite Date: 2008-04-23 19:31:58 -0500 (Wed, 23 Apr 2008) New Revision: 4169 Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c Log: added resample_with_gradient for affine xform part of elastic registration. Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-24 00:31:38 UTC (rev 4168) +++ trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-24 00:31:58 UTC (rev 4169) @@ -784,3 +784,171 @@ } +int NI_ResampleWithGradient(int layersS, int rowsS, int colsS, int layersD, int rowsD, + int colsD, int *dimSteps, double *M, unsigned char *imageD, + unsigned char *imageS, double *scale, int *offset, double *gradientX, + double *gradientY, double *gradientZ) +{ + + int i; + int seed; + int status; + int sliceD; + int rowD; + int sliceSizeD; + int dimsS[3]; + int dimsD[3]; + int dims[2]; + float vs; + float x, y, z; + float xp, yp, zp; + float dx1, dy1, dz1; + float dx2, dy2, dz2; + float ran_x, ran_y, ran_z; + float dx, dy, dz; + double gradX, gradY, gradZ; + + int ptr_x0; + int ptr_y0; + int ptr_z0; + int ptr_x1; + int ptr_y1; + int ptr_z1; + // + // Vxyz for [0,1] values of x, y, z + // + int V000; + int V100; + int V010; + int V001; + int V011; + int V101; + int V110; + int V111; + float valueXYZ; + + sliceSizeD = rowsD * colsD; + dimsD[0] = colsD; + dimsD[1] = rowsD; + dimsD[2] = layersD; + dimsS[0] = colsS; + dimsS[1] = rowsS; + dimsS[2] = layersS; + + dims[0] = dimsS[0]; + dims[1] = dimsS[0]*dimsS[1]; + + seed = 1000; + srand(seed); + + for(z = 0.0; z < layersD-dimSteps[2]-1; z += dimSteps[2]){ + sliceD = (int)z * sliceSizeD; + for(y = 0.0; y < rowsD-dimSteps[1]-1; y += dimSteps[1]){ + rowD = (int)y * colsD; + for(x = 0.0; x < colsD-dimSteps[0]-1; x += dimSteps[0]){ + + /* jitter the coordinates to prevent aliasing */ + ran_x = 1.0 * rand()/((float)RAND_MAX); + ran_y = 1.0 * rand()/((float)RAND_MAX); + ran_z = 1.0 * rand()/((float)RAND_MAX); + + dx = x + ran_x; + dy = y + ran_y; + dz = z + ran_z; + + // get the 'from' coordinates + xp = M[0]*dx + M[1]*dy + M[2]*dz + M[3]; + yp = M[4]*dx + M[5]*dy + M[6]*dz + M[7]; + zp = M[8]*dx + M[9]*dy + M[10]*dz + M[11]; + // clip the resample window + if((zp >= 0.0 && zp < layersS-dimSteps[2]) && + (yp >= 0.0 && yp < rowsS-dimSteps[1]) && + (xp >= 0.0 && xp < colsS-dimSteps[0])){ + + // corners of the 3D unit volume cube + ptr_z0 = (int)zp * dims[1]; + ptr_z1 = ptr_z0 + dims[1]; + ptr_y0 = (int)yp * dims[0]; + ptr_y1 = ptr_y0 + dims[0]; + ptr_x0 = (int)xp; + ptr_x1 = ptr_x0 + 1; + + dx1 = xp - (int)xp; + dy1 = yp - (int)yp; + dz1 = zp - (int)zp; + dx2 = 1.0 - dx1; + dy2 = 1.0 - dy1; + dz2 = 1.0 - dz1; + + V000 = imageS[ptr_x0+ptr_y0+ptr_z0]; + V100 = imageS[ptr_x1+ptr_y0+ptr_z0]; + V010 = imageS[ptr_x0+ptr_y1+ptr_z0]; + V001 = imageS[ptr_x0+ptr_y0+ptr_z1]; + V011 = imageS[ptr_x0+ptr_y1+ptr_z1]; + V101 = imageS[ptr_x1+ptr_y0+ptr_z1]; + V110 = imageS[ptr_x1+ptr_y1+ptr_z0]; + V111 = imageS[ptr_x1+ptr_y1+ptr_z1]; + + vs = V000 * (dx2) * (dy2) * (dz2) + + V100 * (dx1) * (dy2) * (dz2) + + V010 * (dx2) * (dy1) * (dz2) + + V001 * (dx2) * (dy2) * (dz1) + + V101 * (dx1) * (dy2) * (dz1) + + V011 * (dx2) * (dy1) * (dz1) + + V110 * (dx1) * (dy1) * (dz2) + + V111 * (dx1) * (dy1) * (dz1); + + /* resampled voxel */ + imageD[sliceD+rowD+(int)x] = (int)(vs*scale[(int)zp]) + offset[(int)zp]; + + /* + * x gradient voxel. for no resample dz1, dy1 = 0.0 and + * dy2, dz2 = 1.0 so gradX = V100 - V000 + */ + + /* d/d(dx1) = 1.0, d/d(dx2) = -1.0 */ + gradX = V000 * (-1.0) * (dy2) * (dz2) + + V100 * (1.0) * (dy2) * (dz2) + + V010 * (-1.0) * (dy1) * (dz2) + + V001 * (-1.0) * (dy2) * (dz1) + + V101 * (1.0) * (dy2) * (dz1) + + V011 * (-1.0) * (dy1) * (dz1) + + V110 * (1.0) * (dy1) * (dz2) + + V111 * (1.0) * (dy1) * (dz1); + + /* d/d(dy1) = 1.0, d/d(dy2) = -1.0 */ + gradY = V000 * (dx2) * (-1.0) * (dz2) + + V100 * (dx1) * (-1.0) * (dz2) + + V010 * (dx2) * (1.0) * (dz2) + + V001 * (dx2) * (-1.0) * (dz1) + + V101 * (dx1) * (-1.0) * (dz1) + + V011 * (dx2) * (1.0) * (dz1) + + V110 * (dx1) * (1.0) * (dz2) + + V111 * (dx1) * (1.0) * (dz1); + + /* d/d(dz1) = 1.0, d/d(dz2) = -1.0 */ + gradZ = V000 * (dx2) * (dy2) * (-1.0) + + V100 * (dx1) * (dy2) * (-1.0) + + V010 * (dx2) * (dy1) * (-1.0) + + V001 * (dx2) * (dy2) * (1.0) + + V101 * (dx1) * (dy2) * (1.0) + + V011 * (dx2) * (dy1) * (1.0) + + V110 * (dx1) * (dy1) * (-1.0) + + V111 * (dx1) * (dy1) * (1.0); + + gradientX[sliceD+rowD+(int)x] = (int)(gradX*scale[(int)zp]); + gradientY[sliceD+rowD+(int)x] = (int)(gradY*scale[(int)zp]); + gradientZ[sliceD+rowD+(int)x] = (int)(gradZ*scale[(int)zp]); + + } + } + } + } + + status = 1; + + return status; + +} + + From scipy-svn at scipy.org Wed Apr 23 21:20:15 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Wed, 23 Apr 2008 20:20:15 -0500 (CDT) Subject: [Scipy-svn] r4170 - in trunk/scipy/interpolate: . tests Message-ID: <20080424012015.3BE9739C3ED@new.scipy.org> Author: peridot Date: 2008-04-23 20:19:57 -0500 (Wed, 23 Apr 2008) New Revision: 4170 Modified: trunk/scipy/interpolate/info.py trunk/scipy/interpolate/interpolate.py trunk/scipy/interpolate/tests/test_interpolate.py Log: Fix, test, and publicize polynomial interpolation code Modified: trunk/scipy/interpolate/info.py =================================================================== --- trunk/scipy/interpolate/info.py 2008-04-24 00:31:58 UTC (rev 4169) +++ trunk/scipy/interpolate/info.py 2008-04-24 01:19:57 UTC (rev 4170) @@ -31,6 +31,11 @@ interp2d -- Create a class whose instances can interpolate to compute unknown values of a bivariate function. Rbf -- Apply Radial Basis Functions to interpolate scattered N-D data. + +Additional tools + + lagrange -- Compute the Lagrange interpolating polynomial + """ postpone_import = 1 Modified: trunk/scipy/interpolate/interpolate.py =================================================================== --- trunk/scipy/interpolate/interpolate.py 2008-04-24 00:31:58 UTC (rev 4169) +++ trunk/scipy/interpolate/interpolate.py 2008-04-24 01:19:57 UTC (rev 4170) @@ -8,7 +8,7 @@ from numpy import shape, sometrue, rank, array, transpose, \ swapaxes, searchsorted, clip, take, ones, putmask, less, greater, \ - logical_or, atleast_1d, atleast_2d, meshgrid, ravel, dot + logical_or, atleast_1d, atleast_2d, meshgrid, ravel, dot, poly1d import numpy as np import scipy.linalg as slin import scipy.special as spec Modified: trunk/scipy/interpolate/tests/test_interpolate.py =================================================================== --- trunk/scipy/interpolate/tests/test_interpolate.py 2008-04-24 00:31:58 UTC (rev 4169) +++ trunk/scipy/interpolate/tests/test_interpolate.py 2008-04-24 01:19:57 UTC (rev 4170) @@ -1,8 +1,8 @@ from scipy.testing import * -from numpy import mgrid, pi, sin, ogrid +from numpy import mgrid, pi, sin, ogrid, poly1d import numpy as np -from scipy.interpolate import interp1d, interp2d +from scipy.interpolate import interp1d, interp2d, lagrange class TestInterp2D(TestCase): @@ -198,6 +198,14 @@ [[4.8, 5.8], [15.6, 16.6]]]), ) +class TestLagrange(TestCase): + def test_lagrange(self): + p = poly1d([5,2,1,4,3]) + xs = np.arange(len(p.coeffs)) + ys = p(xs) + pl = lagrange(xs,ys) + assert_array_almost_equal(p.coeffs,pl.coeffs) + if __name__ == "__main__": nose.run(argv=['', __file__]) From scipy-svn at scipy.org Thu Apr 24 01:03:13 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 00:03:13 -0500 (CDT) Subject: [Scipy-svn] r4171 - in trunk/scipy/special: . c_misc Message-ID: <20080424050313.420C139C0F2@new.scipy.org> Author: cookedm Date: 2008-04-24 00:03:09 -0500 (Thu, 24 Apr 2008) New Revision: 4171 Added: trunk/scipy/special/c_misc/fsolve.c trunk/scipy/special/c_misc/gammaincinv.c Modified: trunk/scipy/special/_cephesmodule.c trunk/scipy/special/basic.py trunk/scipy/special/c_misc/misc.h trunk/scipy/special/setup.py Log: scipy.special: Fix for #299 (gammaincinv gives incorrect answers) - implement a gammaincinv(a,y) routine in C that inverts gammainc when y < 0.25 instead of using gammainccinv(a,1-y). - add a generic robust root-finding routine using false position for the above Modified: trunk/scipy/special/_cephesmodule.c =================================================================== --- trunk/scipy/special/_cephesmodule.c 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/_cephesmodule.c 2008-04-24 05:03:09 UTC (rev 4171) @@ -1,16 +1,15 @@ - /* Cephes module version 1.5 * This module defines the functions in the cephes and amos libraries as - * Numerical python ufunc objects so that they can operate on arbitrary + * Numerical python ufunc objects so that they can operate on arbitrary * NumPy arrays with broadcasting and typecasting rules implemented. - * + * * Copyright 1999 Travis E. Oliphant * Revisions 2002 (added functions from cdflib) */ #include "Python.h" #include "numpy/arrayobject.h" -#include "numpy/ufuncobject.h" +#include "numpy/ufuncobject.h" #include "ufunc_extras.h" #include "abstract.h" #include "cephes.h" @@ -22,10 +21,9 @@ /* Defined in mtherr in the cephes library */ extern int scipy_special_print_error_messages; - + #include "cephes_doc.h" - static PyUFuncGenericFunction cephes1_functions[] = { NULL, NULL, }; static PyUFuncGenericFunction cephes1rc_functions[] = { NULL, NULL, NULL, NULL}; static PyUFuncGenericFunction cephes1_2_functions[] = { NULL, NULL, NULL, NULL,}; @@ -145,6 +143,8 @@ static void * igamc_data[] = { (void *)igamc, (void *)igamc, }; static void * igam_data[] = { (void *)igam, (void *)igam, }; static void * igami_data[] = { (void *)igami, (void *)igami, }; +static void * gammaincinv_data[] = { (void *)gammaincinv, + (void *)gammaincinv, }; static void * iv_data[] = { (void *)iv, (void *)iv, (void *)cbesi_wrap, (void *)cbesi_wrap,}; static void * ive_data[] = { (void *)cbesi_wrap_e, (void *)cbesi_wrap_e, (void *)cbesi_wrap_e, (void *)cbesi_wrap_e, }; @@ -306,7 +306,7 @@ static char cephes_1c_types[] = { PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, }; -/* Some functions needed from ufunc object, so that Py_complex's aren't being returned +/* Some functions needed from ufunc object, so that Py_complex's aren't being returned between code possibly compiled with different compilers. */ @@ -397,7 +397,7 @@ cephes4a_2_functions[1] = PyUFunc_dddd_dd_As_dddi_dd; cephes5_2_functions[0] = PyUFunc_fffff_ff_As_ddddd_dd; cephes5_2_functions[1] = PyUFunc_ddddd_dd; - + /* Create function objects for each function call and insert them in the dictionary */ f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtrc", bdtrc_doc, 0); @@ -424,7 +424,7 @@ Py_DECREF(f); f = PyUFunc_FromFuncAndData(cephes3_functions, fdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtri", fdtri_doc, 0); PyDict_SetItemString(dictionary, "fdtri", f); - Py_DECREF(f); + Py_DECREF(f); f = PyUFunc_FromFuncAndData(cephes3_functions, gdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "gdtrc", gdtrc_doc, 0); PyDict_SetItemString(dictionary, "gdtrc", f); @@ -545,7 +545,13 @@ f = PyUFunc_FromFuncAndData(cephes2_functions, igami_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "gammainccinv", gammainccinv_doc, 0); PyDict_SetItemString(dictionary, "gammainccinv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "iv", iv_doc, 0); + f = PyUFunc_FromFuncAndData(cephes2_functions, gammaincinv_data, + cephes_3_types, 2, 2, 1, PyUFunc_None, + "gammaincinv", gammaincinv_doc, 0); + PyDict_SetItemString(dictionary, "gammaincinv", f); + Py_DECREF(f); + + f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "iv", iv_doc, 0); PyDict_SetItemString(dictionary, "iv", f); Py_DECREF(f); f = PyUFunc_FromFuncAndData(cephes2cp_functions, ive_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "ive", ive_doc, 0); @@ -580,7 +586,7 @@ PyDict_SetItemString(dictionary, "pdtri", f); Py_DECREF(f); /* Use the student t library from cdflib (it supports doubles for - degrees of freedom + degrees of freedom f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "stdtr", stdtr_doc, 0); PyDict_SetItemString(dictionary, "stdtr", f); Py_DECREF(f); @@ -812,7 +818,7 @@ PyDict_SetItemString(dictionary, "kolmogi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, 2, 1, 1, PyUFunc_None, "wofz", wofz_doc, 0); + f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, 2, 1, 1, PyUFunc_None, "wofz", wofz_doc, 0); PyDict_SetItemString(dictionary, "wofz", f); Py_DECREF(f); @@ -858,14 +864,14 @@ Py_DECREF(f); f = PyUFunc_FromFuncAndData(cephes3_functions, cdff2_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtrix", fdtri_doc, 0); PyDict_SetItemString(dictionary, "fdtrix", f); - Py_DECREF(f); + Py_DECREF(f); */ - + /* The Fortran code for this one seems not to be working properly. f = PyUFunc_FromFuncAndData(cephes3_functions, cdff3_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtridfn", "", 0); PyDict_SetItemString(dictionary, "fdtridfn", f); Py_DECREF(f); - */ + */ f = PyUFunc_FromFuncAndData(cephes3_functions, cdff4_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtridfd", "", 0); PyDict_SetItemString(dictionary, "fdtridfd", f); Py_DECREF(f); @@ -947,7 +953,7 @@ PyDict_SetItemString(dictionary, "tklmbda", f); Py_DECREF(f); - + f = PyUFunc_FromFuncAndData(cephes2_functions, mathieu_a_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "mathieu_a", mathieu_a_doc, 0); PyDict_SetItemString(dictionary, "mathieu_a", f); Py_DECREF(f); @@ -1059,14 +1065,14 @@ int oldflag = 0; if (!PyArg_ParseTuple ( args, "|i;cephes.errprint", &inflag)) return NULL; - oldflag = scipy_special_print_error_messages; + oldflag = scipy_special_print_error_messages; if (inflag != -37) { scipy_special_print_error_messages = (inflag != 0); } return PyInt_FromLong((long) oldflag); } - + static struct PyMethodDef methods[] = { {"errprint", errprint_func, METH_VARARGS, errprint_doc}, {NULL, NULL, 0} /* sentinel */ @@ -1075,9 +1081,9 @@ PyMODINIT_FUNC init_cephes(void) { PyObject *m, *d, *s; - + /* Create the module and add the functions */ - m = Py_InitModule("_cephes", methods); + m = Py_InitModule("_cephes", methods); /* Import the ufunc objects */ import_array(); @@ -1094,10 +1100,9 @@ /* No, instead acessible through errprint */ /* Load the cephes operators into the array module's namespace */ - Cephes_InitOperators(d); - + Cephes_InitOperators(d); + /* Check for errors */ if (PyErr_Occurred()) Py_FatalError("can't initialize module _cephes"); } - Modified: trunk/scipy/special/basic.py =================================================================== --- trunk/scipy/special/basic.py 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/basic.py 2008-04-24 05:03:09 UTC (rev 4171) @@ -394,12 +394,6 @@ raise ValueError, "Argument must be positive scalar integer." return specfun.fcszo(2,nt), specfun.fcszo(1,nt) -def gammaincinv(a,y): - """returns the inverse of the incomplete gamma integral in that it - finds x such that gammainc(a,x)=y - """ - return gammainccinv(a,1-y) - def hyp0f1(v,z): """Confluent hypergeometric limit function 0F1. Limit as q->infinity of 1F1(q;a;z/q) Added: trunk/scipy/special/c_misc/fsolve.c =================================================================== --- trunk/scipy/special/c_misc/fsolve.c 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/c_misc/fsolve.c 2008-04-24 05:03:09 UTC (rev 4171) @@ -0,0 +1,159 @@ +#include "misc.h" +#include + +static inline double +max(double a, double b) +{ + return (a > b ? a : b); +} + +/* + Use a combination of bisection and false position to find a root + of a function within a given interval. This is guaranteed to converge, + and always keeps a bounding interval, unlike Newton's method. + + The false position steps are either unmodified, or modified with + the Anderson-Bjorck method as appropiate. Theoretically, this has + a "speed of convergence" of 1.7 (bisection is 1, Newton is 2). + + Input + ----- + a, b: initial bounding interval + fa, fb: value of f() at a and b + f, f_extra: function to find root of is f(x, f_extra) + abserr, relerr: absolute and relative errors on the bounding interval + bisect_til: If > 0.0, perform bisection until the width of the + bounding interval is less than this. + + Output + ------ + a, b, fa, fb: Final bounding interval and function values + best_x, best_f: Best root approximation and the function value there + + Returns + ------- + FSOLVE_CONVERGED: Bounding interval is smaller than required error. + FSOLVE_NOT_BRACKET: Initial interval is not a bounding interval. + FSOLVE_EXACT: An exact root was found (best_f = 0) + + + Note that this routine was designed initially to work with gammaincinv, so + it may not be tuned right for other problems. Don't use it blindly. + */ +fsolve_result_t +false_position(double *a, double *fa, double *b, double *fb, + objective_function f, void *f_extra, + double abserr, double relerr, double bisect_til, + double *best_x, double *best_f) +{ + double x1=*a, f1=*fa, x2=*b, f2=*fb; + fsolve_result_t r = FSOLVE_CONVERGED; + double gamma = 1.0; + enum {bisect, falsep} state = bisect; + int n_falsep = 0; + double x3, f3; + double w, last_bisect_width; + double tol; + + if (f1*f2 >= 0.0) { + return FSOLVE_NOT_BRACKET; + } + if (bisect_til > 0.0) { + state = bisect; + } else { + state = falsep; + } + w = fabs(x2 - x1); + last_bisect_width = w; + while (1) { + switch (state) { + case bisect: { + x3 = 0.5 * (x1 + x2); + if (x3 == x1 || x3 == x2) { + /* i.e., x1 and x2 are successive floating-point numbers. */ + *best_x = x3; + *best_f = (x3==x1) ? f1 : f2; + goto finish; + } + f3 = f(x3, f_extra); + if (f3 == 0.0) { + goto exact_soln; + } + if (f3*f2 < 0.0) { + x1 = x2; f1 = f2; + } + x2 = x3; f2 = f3; + w = fabs(x2 - x1); + last_bisect_width = w; + if (bisect_til > 0.0) { + if (w < bisect_til) { + bisect_til = -1.0; + gamma = 1.0; + n_falsep = 0; + state = falsep; + } + } else { + gamma = 1.0; + n_falsep = 0; + state = falsep; + } + break; + } + case falsep: { + double s12 = (f2 - gamma*f1) / (x2 - x1); + x3 = x2 - f2/s12; + f3 = f(x3, f_extra); + if (f3 == 0.0) { + goto exact_soln; + } + n_falsep += 1; + if (f3*f2 < 0.0) { + gamma = 1.0; + x1 = x2; f1 = f2; + } else { + /* Anderson-Bjorck method */ + double g = 1.0 - f3 / f2; + if (g <= 0.0) { g = 0.5; } + /* It's not really clear from the sources I've looked at, + but I believe this is *= instead of =. */ + gamma *= g; + } + x2 = x3; f2 = f3; + w = fabs(x2 - x1); + /* Sanity check. For every 4 false position checks, see if we + really are decreasing the interval by comparing to what + bisection would have achieved (or, rather, a bit more lenient + than that -- interval decreased by 4 instead of by 16, as + the fp could be decreasing gamma for a bit). + + Note that this should guarantee convergence, as it makes + sure that we always end up decreasing the interval width + with a bisection. + */ + if (n_falsep > 4) { + if (w*4 > last_bisect_width) { + state = bisect; + } + n_falsep = 0; + last_bisect_width = w; + } + break; + } + } + tol = abserr + relerr*max(max(fabs(x1), fabs(x2)), 1.0); + if (w <= tol) { + if (fabs(f1) < fabs(f2)) { + *best_x = x1; *best_f = f1; + } else { + *best_x = x2; *best_f = f2; + } + goto finish; + } + } +exact_soln: + *best_x = x3; *best_f = 0.0; + r = FSOLVE_EXACT; +finish: + *a = x1; *fa = f1; *b = x2; *fb = f2; + return r; +} Added: trunk/scipy/special/c_misc/gammaincinv.c =================================================================== --- trunk/scipy/special/c_misc/gammaincinv.c 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/c_misc/gammaincinv.c 2008-04-24 05:03:09 UTC (rev 4171) @@ -0,0 +1,52 @@ +#include +#include +#include "../cephes.h" +#undef fabs +#include "misc.h" + +/* + Inverse of the (regularised) incomplete Gamma integral. + + Given a, find x such that igam(a, x) = y. + For y not small, we just use igami(a, 1-y) (inverse of the complemented + incomplete Gamma integral). For y small, however, 1-y is about 1, and we + lose digits. + +*/ + +extern double MACHEP; + +static double +gammainc(double x, double params[2]) +{ + return cephes_igam(params[0], x) - params[1]; +} + +double +gammaincinv(double a, double y) +{ + if (a <= 0.0 || y <= 0.0 || y > 0.25) { + return cephes_igami(a, 1-y); + } + + /* I found Newton to be unreliable. Also, after we generate a small + interval by bisection above, false position will do a large step + from an interval of width ~1e-4 to ~1e-14 in one step (a=10, x=0.05, + but similiar for other values). + */ + + double lo = 0.0, hi = cephes_igami(a, 0.75); + double flo = -y, fhi = 0.25 - y; + double params[2] = {a, y}; + double best_x, best_f; + fsolve_result_t r; + + r = false_position(&lo, &flo, &hi, &fhi, + (objective_function)gammainc, params, + MACHEP, MACHEP, 1e-2*a, + &best_x, &best_f); + if (r == FSOLVE_NOT_BRACKET) { + best_x = 0.0; + } + return best_x; +} Modified: trunk/scipy/special/c_misc/misc.h =================================================================== --- trunk/scipy/special/c_misc/misc.h 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/c_misc/misc.h 2008-04-24 05:03:09 UTC (rev 4171) @@ -1,6 +1,26 @@ +#ifndef C_MISC_MISC_H +#define C_MISC_MISC_H -double besselpoly(double a, double lambda, double nu); +typedef enum { + /* An exact solution was found, in which case the first point + on the interval is the value */ + FSOLVE_EXACT, + /* Interval width is less than the tolerance */ + FSOLVE_CONVERGED, + /* Not a bracket */ + FSOLVE_NOT_BRACKET, +} fsolve_result_t; +typedef double (*objective_function)(double, void *); +fsolve_result_t false_position(double *a, double *fa, double *b, double *fb, + objective_function f, void *f_extra, + double abserr, double relerr, double bisect_til, + double *best_x, double *best_f); +double besselpoly(double a, double lambda, double nu); +double gammaincinv(double a, double x); +#define gammaincinv_doc """gammaincinv(a, y) returns x such that gammainc(a, x) = y.""" + +#endif /* C_MISC_MISC_H */ Modified: trunk/scipy/special/setup.py =================================================================== --- trunk/scipy/special/setup.py 2008-04-24 01:19:57 UTC (rev 4170) +++ trunk/scipy/special/setup.py 2008-04-24 05:03:09 UTC (rev 4171) @@ -42,8 +42,8 @@ "cephes/mconf.h", "cephes/cephes_names.h"], define_macros = define_macros ) + # Extension specfun - config.add_extension('specfun', sources=['specfun.pyf'], f2py_options=['--no-wrap-functions'], From scipy-svn at scipy.org Thu Apr 24 17:41:31 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 16:41:31 -0500 (CDT) Subject: [Scipy-svn] r4172 - in trunk/scipy/cluster: . tests Message-ID: <20080424214131.87C2539C2A0@new.scipy.org> Author: cookedm Date: 2008-04-24 16:41:27 -0500 (Thu, 24 Apr 2008) New Revision: 4172 Modified: trunk/scipy/cluster/hierarchy.py trunk/scipy/cluster/tests/test_hierarchy.py Log: scipy.cluster: float96 is not guaranteed to exist. * If you're testing if a an array, if floating-point, is of doubles, check the dtype against floating and double. * Use longdouble instead of float96 in the tests * Fix some other dtype uses Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-24 05:03:09 UTC (rev 4171) +++ trunk/scipy/cluster/hierarchy.py 2008-04-24 21:41:27 UTC (rev 4172) @@ -208,8 +208,8 @@ """ if a.base is not None: return a.copy() - elif (a.dtype == np.float32): - return np.float64(a) + elif np.issubsctype(a, np.float32): + return array(a, dtype=np.double) else: return a @@ -450,11 +450,10 @@ same minimum distance. This implementation may chose a different minimum than the MATLAB(TM) version. """ - if type(method) != types.StringType: + if not isinstance(method, str): raise TypeError("Argument 'method' must be a string.") - if type(y) != _array_type: - raise TypeError("Argument 'y' must be a numpy array.") + y = np.asarray(y) s = y.shape if len(s) == 1: @@ -723,10 +722,9 @@ transformation. """ - if type(X) is not _array_type: - raise TypeError('The parameter passed must be an array.') + X = np.asarray(X) - if X.dtype != np.double: + if not np.issubsctype(X, np.double): raise TypeError('A double array must be passed.') s = X.shape @@ -744,7 +742,7 @@ raise ValueError('Incompatible vector size. It must be a binomial coefficient n choose 2 for some integer n >= 2.') # Allocate memory for the distance matrix. - M = np.zeros((d, d), 'double') + M = np.zeros((d, d), dtype=np.double) # Since the C code does not support striding using strides. # The dimensions are used instead. @@ -771,7 +769,7 @@ d = s[0] # Create a vector. - v = np.zeros(((d * (d - 1) / 2),), 'double') + v = np.zeros(((d * (d - 1) / 2),), dtype=np.double) # Since the C code does not support striding using strides. # The dimensions are used instead. @@ -881,7 +879,9 @@ for k < n. """ - return np.double(scipy.bitwise_and((u != v), scipy.bitwise_or(u != 0, v != 0)).sum()) / np.double(scipy.bitwise_or(u != 0, v != 0).sum()) + return (np.double(np.bitwise_and((u != v), + np.bitwise_or(u != 0, v != 0)).sum()) + / np.double(np.bitwise_or(u != 0, v != 0).sum())) def kulsinski(u, v): """ @@ -912,8 +912,9 @@ n-vectors u and v. V is a m-dimensional vector of component variances. It is usually computed among a larger collection vectors. """ - if type(V) is not _array_type or len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]: - raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') + V = np.asarray(V) + if len(V.shape) != 1 or V.shape[0] != u.shape[0] or u.shape[0] != v.shape[0]: + raise TypeError('V must be a 1-D array of the same dimension as u and v.') return np.sqrt(((u-v)**2 / V).sum()) def cityblock(u, v): @@ -933,9 +934,8 @@ (u-v)VI(u-v)^T where VI is the inverse covariance matrix. """ - if type(V) is not _array_type: - raise TypeError('V must be a 1-D numpy array of doubles of the same dimension as u and v.') - return np.sqrt(scipy.dot(scipy.dot((u-v),VI),(u-v).T).sum()) + V = np.asarray(V) + return np.sqrt(np.dot(np.dot((u-v),VI),(u-v).T).sum()) def chebyshev(u, v): """ @@ -1301,11 +1301,11 @@ # verifiable, but less efficient implementation. - if type(X) is not _array_type: - raise TypeError('The parameter passed must be an array.') + X = np.asarray(X) - if X.dtype == np.float32 or X.dtype == np.float96: - raise TypeError('Floating point arrays must be 64-bit.') + if np.issubsctype(X, np.floating) and not np.issubsctype(X, np.double): + raise TypeError('Floating point arrays must be 64-bit (got %r).' % + (X.dtype.type,)) # The C code doesn't do striding. [X] = _copy_arrays_if_base_present([X]) @@ -1380,7 +1380,7 @@ if V is not None: if type(V) is not _array_type: raise TypeError('Variance vector V must be a numpy array') - if V.dtype != np.float64: + if V.dtype != np.double: raise TypeError('Variance vector V must contain doubles.') if len(V.shape) != 1: raise ValueError('Variance vector V must be one-dimensional.') @@ -1417,7 +1417,7 @@ if VI is not None: if type(VI) != _array_type: raise TypeError('VI must be a numpy array.') - if VI.dtype != np.float64: + if VI.dtype != np.double: raise TypeError('The array must contain 64-bit floats.') [VI] = _copy_arrays_if_base_present([VI]) else: Modified: trunk/scipy/cluster/tests/test_hierarchy.py =================================================================== --- trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-24 05:03:09 UTC (rev 4171) +++ trunk/scipy/cluster/tests/test_hierarchy.py 2008-04-24 21:41:27 UTC (rev 4172) @@ -99,15 +99,15 @@ except: self.fail("float32 observation matrices should generate an error in pdist.") - def test_pdist_raises_type_error_float96(self): - "Testing whether passing a float96 observation array generates an exception." - X = numpy.zeros((10, 10), dtype=numpy.float96) + def test_pdist_raises_type_error_longdouble(self): + "Testing whether passing a longdouble observation array generates an exception." + X = numpy.zeros((10, 10), dtype=numpy.longdouble) try: pdist(X, 'euclidean') except TypeError: pass except: - self.fail("float96 observation matrices should generate an error in pdist.") + self.fail("longdouble observation matrices should generate an error in pdist.") def test_pdist_var_raises_type_error_float32(self): "Testing whether passing a float32 variance matrix generates an exception." @@ -120,17 +120,17 @@ except: self.fail("float32 V matrices should generate an error in pdist('seuclidean').") - def test_pdist_var_raises_type_error_float96(self): - "Testing whether passing a float96 variance matrix generates an exception." + def test_pdist_var_raises_type_error_longdouble(self): + "Testing whether passing a longdouble variance matrix generates an exception." X = numpy.zeros((10, 10)) - V = numpy.zeros((10, 10), dtype=numpy.float96) + V = numpy.zeros((10, 10), dtype=numpy.longdouble) try: pdist(X, 'seuclidean', V=V) except TypeError: pass except: - self.fail("float96 matrices should generate an error in pdist('seuclidean').") + self.fail("longdouble matrices should generate an error in pdist('seuclidean').") def test_pdist_ivar_raises_type_error_float32(self): "Testing whether passing a float32 variance matrix generates an exception." @@ -143,17 +143,17 @@ except: self.fail("float32 matrices should generate an error in pdist('mahalanobis').") - def test_pdist_ivar_raises_type_error_float96(self): - "Testing whether passing a float96 variance matrix generates an exception." + def test_pdist_ivar_raises_type_error_longdouble(self): + "Testing whether passing a longdouble variance matrix generates an exception." X = numpy.zeros((10, 10)) - VI = numpy.zeros((10, 10), dtype=numpy.float96) + VI = numpy.zeros((10, 10), dtype=numpy.longdouble) try: pdist(X, 'mahalanobis', VI=VI) except TypeError: pass except: - self.fail("float96 matrices should generate an error in pdist('mahalanobis').") + self.fail("longdouble matrices should generate an error in pdist('mahalanobis').") ################### pdist: euclidean def test_pdist_euclidean_random(self): From scipy-svn at scipy.org Thu Apr 24 18:53:31 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 17:53:31 -0500 (CDT) Subject: [Scipy-svn] r4173 - trunk/scipy/ndimage/src/register Message-ID: <20080424225331.8B04A39C8D9@new.scipy.org> Author: tom.waite Date: 2008-04-24 17:53:28 -0500 (Thu, 24 Apr 2008) New Revision: 4173 Modified: trunk/scipy/ndimage/src/register/Register_EXT.c Log: resample_with_gradient to work with numpy.mgrid coordinates Modified: trunk/scipy/ndimage/src/register/Register_EXT.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-24 21:41:27 UTC (rev 4172) +++ trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-24 22:53:28 UTC (rev 4173) @@ -421,15 +421,110 @@ +static PyObject *Register_ResampleWGradientWCoords(PyObject *self, PyObject *args) +{ + + int num; + int size; + int nd; + int type; + int itype; + int nd_rotmatrix; + int nd_S; + npy_intp *dimsScale; + npy_intp *dimsOffset; + npy_intp *dimsS; + npy_intp *dimsD; + npy_intp *dims_rotmatrix; + npy_intp *dims_S; + npy_intp *dims_Coords; + unsigned char *imageS; + unsigned char *imageD; + double *M; + double *X; + double *Y; + double *Z; + int *S; + double *scale; + int *offset; + double *gradientX; + double *gradientY; + double *gradientZ; + PyObject *imgArrayS = NULL; + PyObject *imgArrayD = NULL; + PyObject *rotArray = NULL; + PyObject *SArray = NULL; + PyObject *scaleArray = NULL; + PyObject *offsetArray = NULL; + PyObject *gradXArray = NULL; + PyObject *gradYArray = NULL; + PyObject *gradZArray = NULL; + PyObject *coordXArray = NULL; + PyObject *coordYArray = NULL; + PyObject *coordZArray = NULL; + + if(!PyArg_ParseTuple(args, "OOOOOOOOOOOO", &coordZArray, &coordYArray, &coordXArray, + &imgArrayS, &imgArrayD, &rotArray, &SArray, &scaleArray, + &offsetArray, &gradXArray, &gradYArray, &gradZArray)) + goto exit; + + /* check in the Python code that S and D are the same dims, type */ + imageS = (unsigned char *)PyArray_DATA(imgArrayS); + imageD = (unsigned char *)PyArray_DATA(imgArrayD); + /* reads dims as 0 = layers, 1 = rows, 2 = cols */ + nd = PyArray_NDIM(imgArrayS); + dimsS = PyArray_DIMS(imgArrayS); + dimsD = PyArray_DIMS(imgArrayD); + type = PyArray_TYPE(imgArrayS); + num = PyArray_SIZE(imgArrayS); + + M = (double *)PyArray_DATA(rotArray); + nd_rotmatrix = PyArray_NDIM(rotArray); + dims_rotmatrix = PyArray_DIMS(rotArray); + + S = (int *)PyArray_DATA(SArray); + nd_S = PyArray_NDIM(SArray); + dims_S = PyArray_DIMS(SArray); + + scale = (double *)PyArray_DATA(scaleArray); + offset = (int *)PyArray_DATA(offsetArray); + dimsScale = PyArray_DIMS(scaleArray); + dimsOffset = PyArray_DIMS(offsetArray); + + gradientX = (double *)PyArray_DATA(gradXArray); + gradientY = (double *)PyArray_DATA(gradYArray); + gradientZ = (double *)PyArray_DATA(gradZArray); + + X = (double *)PyArray_DATA(coordXArray); + Y = (double *)PyArray_DATA(coordYArray); + Z = (double *)PyArray_DATA(coordZArray); + + dims_Coords = PyArray_DIMS(coordXArray); + size = PyArray_SIZE(coordXArray); + + if(!NI_ResampleWGradientWCoords(size, (int)dimsS[0], (int)dimsS[1], (int)dimsS[2], (int)dimsD[0], + (int)dimsD[1], (int)dimsD[2], S, X, Y, Z, M, imageD, imageS, scale, + offset, gradientX, gradientY, gradientZ)) + goto exit; + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + + + static PyMethodDef RegisterMethods[] = { - { "register_resample_w_gradient", Register_ResampleWithGradient, METH_VARARGS, NULL }, - { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, - { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, - { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, - { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, - { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, - { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, + { "register_resample_w_gradient_w_coords", Register_ResampleWGradientWCoords, METH_VARARGS, NULL }, + { "register_resample_w_gradient", Register_ResampleWithGradient, METH_VARARGS, NULL }, + { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, + { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, + { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, + { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, + { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, + { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL}, }; From scipy-svn at scipy.org Thu Apr 24 18:53:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 17:53:46 -0500 (CDT) Subject: [Scipy-svn] r4174 - trunk/scipy/ndimage/src/register Message-ID: <20080424225346.D843A39C8E8@new.scipy.org> Author: tom.waite Date: 2008-04-24 17:53:44 -0500 (Thu, 24 Apr 2008) New Revision: 4174 Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c Log: resample_with_gradient to work with numpy.mgrid coordinates Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-24 22:53:28 UTC (rev 4173) +++ trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-24 22:53:44 UTC (rev 4174) @@ -952,3 +952,156 @@ } +int NI_ResampleWGradientWCoords(int size, int layersS, int rowsS, int colsS, int layersD, int rowsD, + int colsD, int *dimSteps, double *X, double *Y, double *Z, double *M, + unsigned char *imageD, unsigned char *imageS, double *scale, int *offset, + double *gradientX, double *gradientY, double *gradientZ) +{ + + int i; + int status; + int sliceD; + int rowD; + int sliceSizeD; + int dimsS[3]; + int dimsD[3]; + int dims[2]; + float vs; + float x, y, z; + float xp, yp, zp; + float dx1, dy1, dz1; + float dx2, dy2, dz2; + double gradX, gradY, gradZ; + + int ptr_x0; + int ptr_y0; + int ptr_z0; + int ptr_x1; + int ptr_y1; + int ptr_z1; + // + // Vxyz for [0,1] values of x, y, z + // + int V000; + int V100; + int V010; + int V001; + int V011; + int V101; + int V110; + int V111; + float valueXYZ; + + sliceSizeD = rowsD * colsD; + dimsD[0] = colsD; + dimsD[1] = rowsD; + dimsD[2] = layersD; + dimsS[0] = colsS; + dimsS[1] = rowsS; + dimsS[2] = layersS; + + dims[0] = dimsS[0]; + dims[1] = dimsS[0]*dimsS[1]; + + for(i = 0; i < size; ++i){ + z = Z[i]; + y = Y[i]; + x = X[i]; + + sliceD = (int)z * sliceSizeD; + rowD = (int)y * colsD; + + // get the 'from' coordinates + xp = M[0]*x + M[1]*y + M[2]*z + M[3]; + yp = M[4]*x + M[5]*y + M[6]*z + M[7]; + zp = M[8]*x + M[9]*y + M[10]*z + M[11]; + // clip the resample window + if((zp >= 0.0 && zp < layersS-dimSteps[2]) && + (yp >= 0.0 && yp < rowsS-dimSteps[1]) && + (xp >= 0.0 && xp < colsS-dimSteps[0])){ + + // corners of the 3D unit volume cube + ptr_z0 = (int)zp * dims[1]; + ptr_z1 = ptr_z0 + dims[1]; + ptr_y0 = (int)yp * dims[0]; + ptr_y1 = ptr_y0 + dims[0]; + ptr_x0 = (int)xp; + ptr_x1 = ptr_x0 + 1; + + dx1 = xp - (int)xp; + dy1 = yp - (int)yp; + dz1 = zp - (int)zp; + dx2 = 1.0 - dx1; + dy2 = 1.0 - dy1; + dz2 = 1.0 - dz1; + + V000 = imageS[ptr_x0+ptr_y0+ptr_z0]; + V100 = imageS[ptr_x1+ptr_y0+ptr_z0]; + V010 = imageS[ptr_x0+ptr_y1+ptr_z0]; + V001 = imageS[ptr_x0+ptr_y0+ptr_z1]; + V011 = imageS[ptr_x0+ptr_y1+ptr_z1]; + V101 = imageS[ptr_x1+ptr_y0+ptr_z1]; + V110 = imageS[ptr_x1+ptr_y1+ptr_z0]; + V111 = imageS[ptr_x1+ptr_y1+ptr_z1]; + + vs = V000 * (dx2) * (dy2) * (dz2) + + V100 * (dx1) * (dy2) * (dz2) + + V010 * (dx2) * (dy1) * (dz2) + + V001 * (dx2) * (dy2) * (dz1) + + V101 * (dx1) * (dy2) * (dz1) + + V011 * (dx2) * (dy1) * (dz1) + + V110 * (dx1) * (dy1) * (dz2) + + V111 * (dx1) * (dy1) * (dz1); + + /* resampled voxel */ + imageD[sliceD+rowD+(int)x] = (int)(vs*scale[(int)zp]) + offset[(int)zp]; + + /* + * x gradient voxel. for no resample dz1, dy1 = 0.0 and + * dy2, dz2 = 1.0 so gradX = V100 - V000 + */ + + /* d/d(dx1) = 1.0, d/d(dx2) = -1.0 */ + gradX = V000 * (-1.0) * (dy2) * (dz2) + + V100 * (1.0) * (dy2) * (dz2) + + V010 * (-1.0) * (dy1) * (dz2) + + V001 * (-1.0) * (dy2) * (dz1) + + V101 * (1.0) * (dy2) * (dz1) + + V011 * (-1.0) * (dy1) * (dz1) + + V110 * (1.0) * (dy1) * (dz2) + + V111 * (1.0) * (dy1) * (dz1); + + /* d/d(dy1) = 1.0, d/d(dy2) = -1.0 */ + gradY = V000 * (dx2) * (-1.0) * (dz2) + + V100 * (dx1) * (-1.0) * (dz2) + + V010 * (dx2) * (1.0) * (dz2) + + V001 * (dx2) * (-1.0) * (dz1) + + V101 * (dx1) * (-1.0) * (dz1) + + V011 * (dx2) * (1.0) * (dz1) + + V110 * (dx1) * (1.0) * (dz2) + + V111 * (dx1) * (1.0) * (dz1); + + /* d/d(dz1) = 1.0, d/d(dz2) = -1.0 */ + gradZ = V000 * (dx2) * (dy2) * (-1.0) + + V100 * (dx1) * (dy2) * (-1.0) + + V010 * (dx2) * (dy1) * (-1.0) + + V001 * (dx2) * (dy2) * (1.0) + + V101 * (dx1) * (dy2) * (1.0) + + V011 * (dx2) * (dy1) * (1.0) + + V110 * (dx1) * (dy1) * (-1.0) + + V111 * (dx1) * (dy1) * (1.0); + + gradientX[sliceD+rowD+(int)x] = (int)(gradX*scale[(int)zp]); + gradientY[sliceD+rowD+(int)x] = (int)(gradY*scale[(int)zp]); + gradientZ[sliceD+rowD+(int)x] = (int)(gradZ*scale[(int)zp]); + + } + } + + status = 1; + + return status; + +} + + From scipy-svn at scipy.org Thu Apr 24 20:11:36 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 19:11:36 -0500 (CDT) Subject: [Scipy-svn] r4175 - in trunk/scipy/interpolate: . tests Message-ID: <20080425001136.EE76E39C04D@new.scipy.org> Author: peridot Date: 2008-04-24 19:11:33 -0500 (Thu, 24 Apr 2008) New Revision: 4175 Added: trunk/scipy/interpolate/polyint.py trunk/scipy/interpolate/tests/test_polyint.py Modified: trunk/scipy/interpolate/__init__.py trunk/scipy/interpolate/info.py trunk/scipy/interpolate/interpolate.py Log: Polynomial interpolation classes. (Python-only implementation.) Modified: trunk/scipy/interpolate/__init__.py =================================================================== --- trunk/scipy/interpolate/__init__.py 2008-04-24 22:53:44 UTC (rev 4174) +++ trunk/scipy/interpolate/__init__.py 2008-04-25 00:11:33 UTC (rev 4175) @@ -12,6 +12,8 @@ from rbf import Rbf +from polyint import * + __all__ = filter(lambda s:not s.startswith('_'),dir()) from scipy.testing.pkgtester import Tester test = Tester().test Modified: trunk/scipy/interpolate/info.py =================================================================== --- trunk/scipy/interpolate/info.py 2008-04-24 22:53:44 UTC (rev 4174) +++ trunk/scipy/interpolate/info.py 2008-04-25 00:11:33 UTC (rev 4175) @@ -24,18 +24,27 @@ SmoothBivariateSpline -Interpolation Class +Interpolation Classes (univariate) interp1d -- Create a class whose instances can linearly interpolate to compute unknown values of a univariate function. + BarycentricInterpolator -- Compute with a numerically-stable version + of the Lagrange interpolating polynomial. + KroghInterpolator -- Compute with the Hermite interpolating polynomial + (allows the specification of derivatives at some points). + PiecewisePolynomial -- Spline that is specified by giving positions and + derivatives at every knot; allows high orders and + efficient appending. + +Interpolation Classes (multivariate) + interp2d -- Create a class whose instances can interpolate to compute unknown values of a bivariate function. Rbf -- Apply Radial Basis Functions to interpolate scattered N-D data. Additional tools - lagrange -- Compute the Lagrange interpolating polynomial - + lagrange -- Compute the Lagrange interpolating polynomial. """ postpone_import = 1 Modified: trunk/scipy/interpolate/interpolate.py =================================================================== --- trunk/scipy/interpolate/interpolate.py 2008-04-24 22:53:44 UTC (rev 4174) +++ trunk/scipy/interpolate/interpolate.py 2008-04-25 00:11:33 UTC (rev 4175) @@ -25,6 +25,9 @@ def lagrange(x, w): """Return the Lagrange interpolating polynomial of the data-points (x,w) + + Warning: This implementation is numerically unstable; do not expect to + be able to use more than about 20 points even if they are chosen optimally. """ M = len(x) p = poly1d(0.0) Added: trunk/scipy/interpolate/polyint.py =================================================================== --- trunk/scipy/interpolate/polyint.py 2008-04-24 22:53:44 UTC (rev 4174) +++ trunk/scipy/interpolate/polyint.py 2008-04-25 00:11:33 UTC (rev 4175) @@ -0,0 +1,618 @@ +import numpy as np +from scipy import factorial +from numpy import poly1d + +__all__ = ["KroghInterpolator", "BarycentricInterpolator", "PiecewisePolynomial"] + +class KroghInterpolator: + """The interpolating polynomial for a set of points + + Constructs a polynomial that passes through a given set of points, + optionally with specified derivatives at those points. + Allows evaluation of the polynomial and all its derivatives. + For reasons of numerical stability, this function does not compute + the coefficients of the polynomial, although they can be obtained + by evaluating all the derivatives. + + Be aware that the algorithms implemented here are not necessarily + the most numerically stable known. Moreover, even in a world of + exact computation, unless the x coordinates are chosen very + carefully - Chebyshev zeros (e.g. cos(i*pi/n)) are a good choice - + polynomial interpolation itself is a very ill-conditioned process + due to the Runge phenomenon. In general, even with well-chosen + x values, degrees higher than about thirty cause problems with + numerical instability in this code. + + Based on Krogh 1970, "Efficient Algorithms for Polynomial Interpolation + and Numerical Differentiation" + """ + def __init__(self, xi, yi): + """Construct an interpolator passing through the specified points + + The polynomial passes through all the pairs (xi,yi). One may additionally + specify a number of derivatives at each point xi; this is done by + repeating the value xi and specifying the derivatives as successive + yi values. + + Parameters + ---------- + xi : array-like, length N + known x-coordinates + yi : array-like, N by R + known y-coordinates, interpreted as vectors of length R, + or scalars if R=1 + + Example + ------- + To produce a polynomial that is zero at 0 and 1 and has + derivative 2 at 0, call + + >>> KroghInterpolator([0,0,1],[0,2,0]) + """ + self.xi = np.asarray(xi) + self.yi = np.asarray(yi) + if len(self.yi.shape)==1: + self.vector_valued = False + self.yi = self.yi[:,np.newaxis] + elif len(self.yi.shape)>2: + raise ValueError, "y coordinates must be either scalars or vectors" + else: + self.vector_valued = True + + n = len(xi) + self.n = n + nn, r = self.yi.shape + if nn!=n: + raise ValueError, "%d x values provided and %d y values; must be equal" % (n, nn) + self.r = r + + c = np.zeros((n+1,r)) + c[0] = yi[0] + Vk = np.zeros((n,r)) + for k in xrange(1,n): + s = 0 + while s<=k and xi[k-s]==xi[k]: + s += 1 + s -= 1 + Vk[0] = yi[k]/float(factorial(s)) + for i in xrange(k-s): + assert xi[i]!=xi[k] + if s==0: + Vk[i+1] = (c[i]-Vk[i])/(xi[i]-xi[k]) + else: + Vk[i+1] = (Vk[i+1]-Vk[i])/(xi[i]-xi[k]) + c[k] = Vk[k-s] + self.c = c + + def __call__(self,x): + """Evaluate the polynomial at the point x + + Parameters + ---------- + x : scalar or array-like of length N + + Returns + ------- + y : scalar, array of length R, array of length N, or array of length N by R + If x is a scalar, returns either a vector or a scalar depending on + whether the interpolator is vector-valued or scalar-valued. + If x is a vector, returns a vector of values. + """ + if np.isscalar(x): + scalar = True + m = 1 + else: + scalar = False + m = len(x) + x = np.asarray(x) + + n = self.n + pi = 1 + p = np.zeros((m,self.r)) + p += self.c[0,np.newaxis,:] + for k in xrange(1,n): + w = x - self.xi[k-1] + pi = w*pi + p = p + np.multiply.outer(pi,self.c[k]) + if not self.vector_valued: + if scalar: + return p[0,0] + else: + return p[:,0] + else: + if scalar: + return p[0] + else: + return p + + def derivatives(self,x,der=None): + """Evaluate many derivatives of the polynomial at the point x + + Produce an array of all derivative values at the point x. + + Parameters + ---------- + x : scalar or array-like of length N + Point or points at which to evaluate the derivatives + der : None or integer + How many derivatives to extract; None for all potentially + nonzero derivatives (that is a number equal to the number + of points). This number includes the function value as 0th + derivative. + Returns + ------- + d : array + If the interpolator's values are R-dimensional then the + returned array will be der by N by R. If x is a scalar, + the middle dimension will be dropped; if R is 1 then the + last dimension will be dropped. + + Example + ------- + >>> KroghInterpolator([0,0,0],[1,2,3]).derivatives(0) + array([1.0,2.0,3.0]) + >>> KroghInterpolator([0,0,0],[1,2,3]).derivatives([0,0]) + array([[1.0,1.0], + [2.0,2.0], + [3.0,3.0]]) + """ + if np.isscalar(x): + scalar = True + m = 1 + else: + scalar = False + m = len(x) + x = np.asarray(x) + + n = self.n + r = self.r + + if der is None: + der = self.n + dern = min(self.n,der) + pi = np.zeros((n,m)) + w = np.zeros((n,m)) + pi[0] = 1 + p = np.zeros((m,self.r)) + p += self.c[0,np.newaxis,:] + + for k in xrange(1,n): + w[k-1] = x - self.xi[k-1] + pi[k] = w[k-1]*pi[k-1] + p += np.multiply.outer(pi[k],self.c[k]) + + cn = np.zeros((max(der,n+1),m,r)) + cn[:n+1,...] += self.c[:n+1,np.newaxis,:] + cn[0] = p + for k in xrange(1,n): + for i in xrange(1,n-k+1): + pi[i] = w[k+i-1]*pi[i-1]+pi[i] + cn[k] = cn[k]+pi[i,:,np.newaxis]*cn[k+i] + cn[k]*=factorial(k) + + cn[n,...] = 0 + if not self.vector_valued: + if scalar: + return cn[:der,0,0] + else: + return cn[:der,:,0] + else: + if scalar: + return cn[:der,0] + else: + return cn[:der] + def derivative(self,x,der): + """Evaluate one derivative of the polynomial at the point x + + Parameters + ---------- + x : scalar or array-like of length N + Point or points at which to evaluate the derivatives + der : None or integer + Which derivative to extract. This number includes the + function value as 0th derivative. + Returns + ------- + d : array + If the interpolator's values are R-dimensional then the + returned array will be N by R. If x is a scalar, + the middle dimension will be dropped; if R is 1 then the + last dimension will be dropped. + + Notes + ----- + This is computed by evaluating all derivatives up to the desired + one and then discarding the rest. + """ + return self.derivatives(x,der=der+1)[der] + + +class BarycentricInterpolator: + """The interpolating polynomial for a set of points + + Constructs a polynomial that passes through a given set of points. + Allows evaluation of the polynomial, efficient changing of the y + values to be interpolated, and updating by adding more x values. + For reasons of numerical stability, this function does not compute + the coefficients of the polynomial. + + This class uses a "barycentric interpolation" method that treats + the problem as a special case of rational function interpolation. + This algorithm is quite stable, numerically, but even in a world of + exact computation, unless the x coordinates are chosen very + carefully - Chebyshev zeros (e.g. cos(i*pi/n)) are a good choice - + polynomial interpolation itself is a very ill-conditioned process + due to the Runge phenomenon. + + Based on Berrut and Trefethen 2004, "Barycentric Lagrange Interpolation". + """ + def __init__(self, xi, yi=None): + """Construct an object capable of interpolating functions sampled at xi + + The values yi need to be provided before the function is evaluated, + but none of the preprocessing depends on them, so rapid updates + are possible. + + Parameters + ---------- + xi : array-like of length N + The x coordinates of the points the polynomial should pass through + yi : array-like N by R or None + The y coordinates of the points the polynomial should pass through; + if R>1 the polynomial is vector-valued. If None the y values + will be supplied later. + """ + self.n = len(xi) + self.xi = np.asarray(xi) + if yi is not None and len(yi)!=len(self.xi): + raise ValueError, "yi dimensions do not match xi dimensions" + self.set_yi(yi) + self.wi = np.zeros(self.n) + self.wi[0] = 1 + for j in xrange(1,self.n): + self.wi[:j]*=(self.xi[j]-self.xi[:j]) + self.wi[j] = np.multiply.reduce(self.xi[:j]-self.xi[j]) + self.wi**=-1 + + def set_yi(self, yi): + """Update the y values to be interpolated + + The barycentric interpolation algorithm requires the calculation + of weights, but these depend only on the xi. The yi can be changed + at any time. + + Parameters + ---------- + yi : array-like N by R + The y coordinates of the points the polynomial should pass through; + if R>1 the polynomial is vector-valued. If None the y values + will be supplied later. + """ + if yi is None: + self.yi = None + return + yi = np.asarray(yi) + if len(yi.shape)==1: + self.vector_valued = False + yi = yi[:,np.newaxis] + elif len(yi.shape)>2: + raise ValueError, "y coordinates must be either scalars or vectors" + else: + self.vector_valued = True + + n, r = yi.shape + if n!=len(self.xi): + raise ValueError, "yi dimensions do not match xi dimensions" + self.yi = yi + self.r = r + + + def add_xi(self, xi, yi=None): + """Add more x values to the set to be interpolated + + The barycentric interpolation algorithm allows easy updating by + adding more points for the polynomial to pass through. + + Parameters + ---------- + xi : array-like of length N1 + The x coordinates of the points the polynomial should pass through + yi : array-like N1 by R or None + The y coordinates of the points the polynomial should pass through; + if R>1 the polynomial is vector-valued. If None the y values + will be supplied later. The yi should be specified if and only if + the interpolator has y values specified. + """ + if yi is not None: + if self.yi is None: + raise ValueError, "No previous yi value to update!" + yi = np.asarray(yi) + if len(yi.shape)==1: + if self.vector_valued: + raise ValueError, "Cannot extend dimension %d y vectors with scalars" % self.r + yi = yi[:,np.newaxis] + elif len(yi.shape)>2: + raise ValueError, "y coordinates must be either scalars or vectors" + else: + n, r = yi.shape + if r!=self.r: + raise ValueError, "Cannot extend dimension %d y vectors with dimension %d y vectors" % (self.r, r) + + self.yi = np.vstack((self.yi,yi)) + else: + if self.yi is not None: + raise ValueError, "No update to yi provided!" + old_n = self.n + self.xi = np.concatenate((self.xi,xi)) + self.n = len(self.xi) + self.wi**=-1 + old_wi = self.wi + self.wi = np.zeros(self.n) + self.wi[:old_n] = old_wi + for j in xrange(old_n,self.n): + self.wi[:j]*=(self.xi[j]-self.xi[:j]) + self.wi[j] = np.multiply.reduce(self.xi[:j]-self.xi[j]) + self.wi**=-1 + + def __call__(self, x): + """Evaluate the interpolating polynomial at the points x + + Parameters + ---------- + x : scalar or array-like of length M + + Returns + ------- + y : scalar or array-like of length R or length M or M by R + The shape of y depends on the shape of x and whether the + interpolator is vector-valued or scalar-valued. + + Notes + ----- + Currently the code computes an outer product between x and the + weights, that is, it constructs an intermediate array of size + N by M, where N is the degree of the polynomial. + """ + scalar = np.isscalar(x) + x = np.atleast_1d(x) + c = np.subtract.outer(x,self.xi) + z = c==0 + c[z] = 1 + c = self.wi/c + p = np.dot(c,self.yi)/np.sum(c,axis=-1)[:,np.newaxis] + i, j = np.nonzero(z) + p[i] = self.yi[j] + if not self.vector_valued: + if scalar: + return p[0,0] + else: + return p[:,0] + else: + if scalar: + return p[0] + else: + return p + + +class PiecewisePolynomial: + """Piecewise polynomial curve specified by points and derivatives + + This class represents a curve that is a piecewise polynomial. It + passes through a list of points and has specified derivatives at + each point. The degree of the polynomial may very from segment to + segment, as may the number of derivatives available. The degree + should not exceed about thirty. + + Appending points to the end of the curve is efficient. + """ + def __init__(self, xi, yi, orders=None, direction=None): + """Construct a piecewise polynomial + + Parameters + ---------- + xi : array-like of length N + a sorted list of x-coordinates + yi : list of lists of length N + yi[i] is the list of derivatives known at xi[i] + orders : list of integers, or integer + a list of polynomial orders, or a single universal order + direction : {None, 1, -1} + indicates whether the xi are increasing or decreasing + +1 indicates increasing + -1 indicates decreasing + None indicates that it should be deduced from the first two xi + + Notes + ----- + If orders is None, or orders[i] is None, then the degree of the + polynomial segment is exactly the degree required to match all i + available derivatives at both endpoints. If orders[i] is not None, + then some derivatives will be ignored. The code will try to use an + equal number of derivatives from each end; if the total number of + derivatives needed is odd, it will prefer the rightmost endpoint. If + not enough derivatives are available, an exception is raised. + """ + self.xi = [xi[0]] + self.yi = [yi[0]] + self.n = 1 + + try: + self.r = len(yi[0][0]) + except TypeError: + self.r = 1 + + self.n = 1 + self.direction = direction + self.orders = [] + self.polynomials = [] + self.extend(xi[1:],yi[1:],orders) + + def _make_polynomial(self,x1,y1,x2,y2,order,direction): + """Construct the interpolating polynomial object + + Deduces the number of derivatives to match at each end + from order and the number of derivatives available. If + possible it uses the same number of derivatives from + each end; if the number is odd it tries to take the + extra one from y2. In any case if not enough derivatives + are available at one end or another it draws enough to + make up the total from the other end. + """ + n = order+1 + n1 = min(n//2,len(y1)) + n2 = min(n-n1,len(y2)) + n1 = min(n-n2,len(y1)) + if n1+n2!=n: + raise ValueError, "Point %g has %d derivatives, point %g has %d derivatives, but order %d requested" % (x1, len(y1), x2, len(y2), order) + assert n1<=len(y1) + assert n2<=len(y2) + + xi = np.zeros(n) + if self.r==1: + yi = np.zeros(n) + else: + yi = np.zeros((n,self.r)) + xi[:n1] = x1 + yi[:n1] = y1[:n1] + xi[n1:] = x2 + yi[n1:] = y2[:n2] + + return KroghInterpolator(xi,yi) + + def append(self, xi, yi, order=None): + """Append a single point with derivatives to the PiecewisePolynomial + + Parameters + ---------- + xi : float + yi : array-like + yi is the list of derivatives known at xi + order : integer or None + a polynomial order, or instructions to use the highest + possible order + """ + if self.direction is None: + self.direction = np.sign(xi-self.xi[-1]) + elif (xi-self.xi[-1])*self.direction < 0: + raise ValueError, "x coordinates must be in the %d direction: %s" % (self.direction, self.xi) + self.xi.append(xi) + self.yi.append(yi) + + if order is None: + n1 = len(self.yi[-2]) + n2 = len(self.yi[-1]) + n = n1+n2 + order = n-1 + + self.orders.append(order) + self.polynomials.append(self._make_polynomial( + self.xi[-2], self.yi[-2], + self.xi[-1], self.yi[-1], + order, self.direction)) + self.n += 1 + + + def extend(self, xi, yi, orders=None): + """Extend the PiecewisePolynomial by a list of points + + Parameters + ---------- + xi : array-like of length N1 + a sorted list of x-coordinates + yi : list of lists of length N1 + yi[i] is the list of derivatives known at xi[i] + orders : list of integers, or integer + a list of polynomial orders, or a single universal order + direction : {None, 1, -1} + indicates whether the xi are increasing or decreasing + +1 indicates increasing + -1 indicates decreasing + None indicates that it should be deduced from the first two xi + """ + + for i in xrange(len(xi)): + if orders is None or np.isscalar(orders): + self.append(xi[i],yi[i],orders) + else: + self.append(xi[i],yi[i],orders[i]) + + def __call__(self, x): + """Evaluate the piecewise polynomial + + Parameters + ---------- + x : scalar or array-like of length N + + Returns + ------- + y : scalar or array-like of length R or length N or N by R + """ + if np.isscalar(x): + pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) + y = self.polynomials[pos](x) + else: + x = np.asarray(x) + m = len(x) + pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) + if self.r>1: + y = np.zeros((m,self.r)) + else: + y = np.zeros(m) + for i in xrange(self.n-1): + c = pos==i + y[c] = self.polynomials[i](x[c]) + return y + + def derivative(self, x, der): + """Evaluate a derivative of the piecewise polynomial + + Parameters + ---------- + x : scalar or array-like of length N + der : integer + which single derivative to extract + + Returns + ------- + y : scalar or array-like of length R or length N or N by R + + Notes + ----- + This currently computes all derivatives of the curve segment + containing each x but returns only one. This is because the + number of nonzero derivatives that a segment can have depends + on the degree of the segment, which may vary. + """ + return self.derivatives(x,der=der+1)[der] + + def derivatives(self, x, der): + """Evaluate a derivative of the piecewise polynomial + + Parameters + ---------- + x : scalar or array-like of length N + der : integer + how many derivatives (including the function value as + 0th derivative) to extract + + Returns + ------- + y : array-like of shape der by R or der by N or der by N by R + + """ + if np.isscalar(x): + pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) + y = self.polynomials[pos].derivatives(x,der=der) + else: + x = np.asarray(x) + m = len(x) + pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) + if self.r>1: + y = np.zeros((der,m,self.r)) + else: + y = np.zeros((der,m)) + for i in xrange(self.n-1): + c = pos==i + y[:,c] = self.polynomials[i].derivatives(x[c],der=der) + return y + # FIXME: provide multiderivative finder Added: trunk/scipy/interpolate/tests/test_polyint.py =================================================================== --- trunk/scipy/interpolate/tests/test_polyint.py 2008-04-24 22:53:44 UTC (rev 4174) +++ trunk/scipy/interpolate/tests/test_polyint.py 2008-04-25 00:11:33 UTC (rev 4175) @@ -0,0 +1,231 @@ + +from scipy.testing import * +from scipy.interpolate import KroghInterpolator, \ + BarycentricInterpolator, PiecewisePolynomial +import scipy +import numpy as np +from scipy.interpolate import splrep, splev + +class CheckKrogh(TestCase): + def setUp(self): + self.true_poly = scipy.poly1d([-2,3,1,5,-4]) + self.test_xs = np.linspace(-1,1,100) + self.xs = np.linspace(-1,1,5) + self.ys = self.true_poly(self.xs) + + def test_lagrange(self): + P = KroghInterpolator(self.xs,self.ys) + assert_almost_equal(self.true_poly(self.test_xs),P(self.test_xs)) + def test_scalar(self): + P = KroghInterpolator(self.xs,self.ys) + assert_almost_equal(self.true_poly(7),P(7)) + + def test_derivatives(self): + P = KroghInterpolator(self.xs,self.ys) + D = P.derivatives(self.test_xs) + for i in xrange(D.shape[0]): + assert_almost_equal(self.true_poly.deriv(i)(self.test_xs), + D[i]) + def test_low_derivatives(self): + P = KroghInterpolator(self.xs,self.ys) + D = P.derivatives(self.test_xs,len(self.xs)+2) + for i in xrange(D.shape[0]): + assert_almost_equal(self.true_poly.deriv(i)(self.test_xs), + D[i]) + def test_derivative(self): + P = KroghInterpolator(self.xs,self.ys) + m = 10 + r = P.derivatives(self.test_xs,m) + for i in xrange(m): + assert_almost_equal(P.derivative(self.test_xs,i),r[i]) + def test_high_derivative(self): + P = KroghInterpolator(self.xs,self.ys) + for i in xrange(len(self.xs),2*len(self.xs)): + assert_almost_equal(P.derivative(self.test_xs,i), + np.zeros(len(self.test_xs))) + def test_hermite(self): + xs = [0,0,0,1,1,1,2] + ys = [self.true_poly(0), + self.true_poly.deriv(1)(0), + self.true_poly.deriv(2)(0), + self.true_poly(1), + self.true_poly.deriv(1)(1), + self.true_poly.deriv(2)(1), + self.true_poly(2)] + P = KroghInterpolator(self.xs,self.ys) + assert_almost_equal(self.true_poly(self.test_xs),P(self.test_xs)) + + def test_vector(self): + xs = [0, 1, 2] + ys = np.array([[0,1],[1,0],[2,1]]) + P = KroghInterpolator(xs,ys) + Pi = [KroghInterpolator(xs,ys[:,i]) for i in xrange(ys.shape[1])] + test_xs = np.linspace(-1,3,100) + assert_almost_equal(P(test_xs), + np.rollaxis(np.asarray([p(test_xs) for p in Pi]),-1)) + assert_almost_equal(P.derivatives(test_xs), + np.transpose(np.asarray([p.derivatives(test_xs) for p in Pi]), + (1,2,0))) + + def test_empty(self): + P = KroghInterpolator(self.xs,self.ys) + assert_array_equal(P([]), []) + def test_shapes_scalarvalue(self): + P = KroghInterpolator(self.xs,self.ys) + assert_array_equal(np.shape(P(0)), ()) + assert_array_equal(np.shape(P([0])), (1,)) + assert_array_equal(np.shape(P([0,1])), (2,)) + + def test_shapes_scalarvalue_derivative(self): + P = KroghInterpolator(self.xs,self.ys) + n = P.n + assert_array_equal(np.shape(P.derivatives(0)), (n,)) + assert_array_equal(np.shape(P.derivatives([0])), (n,1)) + assert_array_equal(np.shape(P.derivatives([0,1])), (n,2)) + + def test_shapes_vectorvalue(self): + P = KroghInterpolator(self.xs,np.outer(self.ys,np.arange(3))) + assert_array_equal(np.shape(P(0)), (3,)) + assert_array_equal(np.shape(P([0])), (1,3)) + assert_array_equal(np.shape(P([0,1])), (2,3)) + + def test_shapes_1d_vectorvalue(self): + P = KroghInterpolator(self.xs,np.outer(self.ys,[1])) + assert_array_equal(np.shape(P(0)), (1,)) + assert_array_equal(np.shape(P([0])), (1,1)) + assert_array_equal(np.shape(P([0,1])), (2,1)) + + def test_shapes_vectorvalue_derivative(self): + P = KroghInterpolator(self.xs,np.outer(self.ys,np.arange(3))) + n = P.n + assert_array_equal(np.shape(P.derivatives(0)), (n,3)) + assert_array_equal(np.shape(P.derivatives([0])), (n,1,3)) + assert_array_equal(np.shape(P.derivatives([0,1])), (n,2,3)) + + + +class CheckBarycentric(TestCase): + def setUp(self): + self.true_poly = scipy.poly1d([-2,3,1,5,-4]) + self.test_xs = np.linspace(-1,1,100) + self.xs = np.linspace(-1,1,5) + self.ys = self.true_poly(self.xs) + + def test_lagrange(self): + P = BarycentricInterpolator(self.xs,self.ys) + assert_almost_equal(self.true_poly(self.test_xs),P(self.test_xs)) + def test_scalar(self): + P = BarycentricInterpolator(self.xs,self.ys) + assert_almost_equal(self.true_poly(7),P(7)) + + def test_delayed(self): + P = BarycentricInterpolator(self.xs) + P.set_yi(self.ys) + assert_almost_equal(self.true_poly(self.test_xs),P(self.test_xs)) + + def test_append(self): + P = BarycentricInterpolator(self.xs[:3],self.ys[:3]) + P.add_xi(self.xs[3:],self.ys[3:]) + assert_almost_equal(self.true_poly(self.test_xs),P(self.test_xs)) + + def test_vector(self): + xs = [0, 1, 2] + ys = np.array([[0,1],[1,0],[2,1]]) + P = BarycentricInterpolator(xs,ys) + Pi = [BarycentricInterpolator(xs,ys[:,i]) for i in xrange(ys.shape[1])] + test_xs = np.linspace(-1,3,100) + assert_almost_equal(P(test_xs), + np.rollaxis(np.asarray([p(test_xs) for p in Pi]),-1)) + + def test_shapes_scalarvalue(self): + P = BarycentricInterpolator(self.xs,self.ys) + assert_array_equal(np.shape(P(0)), ()) + assert_array_equal(np.shape(P([0])), (1,)) + assert_array_equal(np.shape(P([0,1])), (2,)) + + def test_shapes_vectorvalue(self): + P = BarycentricInterpolator(self.xs,np.outer(self.ys,np.arange(3))) + assert_array_equal(np.shape(P(0)), (3,)) + assert_array_equal(np.shape(P([0])), (1,3)) + assert_array_equal(np.shape(P([0,1])), (2,3)) + def test_shapes_1d_vectorvalue(self): + P = BarycentricInterpolator(self.xs,np.outer(self.ys,[1])) + assert_array_equal(np.shape(P(0)), (1,)) + assert_array_equal(np.shape(P([0])), (1,1)) + assert_array_equal(np.shape(P([0,1])), (2,1)) + + +class CheckPiecewise(TestCase): + def setUp(self): + self.tck = splrep([0,1,2,3,4,5],[0,10,-1,3,7,2],s=0) + self.test_xs = np.linspace(-1,6,100) + self.spline_ys = splev(self.test_xs, self.tck) + self.spline_yps = splev(self.test_xs, self.tck, der=1) + self.xi = np.unique(self.tck[0]) + self.yi = [[splev(x,self.tck,der=j) for j in xrange(3)] for x in self.xi] + + def test_construction(self): + P = PiecewisePolynomial(self.xi,self.yi,3) + assert_almost_equal(P(self.test_xs),self.spline_ys) + def test_scalar(self): + P = PiecewisePolynomial(self.xi,self.yi,3) + assert_almost_equal(P(self.test_xs[0]),self.spline_ys[0]) + assert_almost_equal(P.derivative(self.test_xs[0],1),self.spline_yps[0]) + def test_derivative(self): + P = PiecewisePolynomial(self.xi,self.yi,3) + assert_almost_equal(P.derivative(self.test_xs,1),self.spline_yps) + def test_derivatives(self): + P = PiecewisePolynomial(self.xi,self.yi,3) + m = 4 + r = P.derivatives(self.test_xs,m) + #print r.shape, r + for i in xrange(m): + assert_almost_equal(P.derivative(self.test_xs,i),r[i]) + def test_vector(self): + xs = [0, 1, 2] + ys = [[[0,1]],[[1,0],[-1,-1]],[[2,1]]] + P = PiecewisePolynomial(xs,ys) + Pi = [PiecewisePolynomial(xs,[[yd[i] for yd in y] for y in ys]) + for i in xrange(len(ys[0][0]))] + test_xs = np.linspace(-1,3,100) + assert_almost_equal(P(test_xs), + np.rollaxis(np.asarray([p(test_xs) for p in Pi]),-1)) + assert_almost_equal(P.derivative(test_xs,1), + np.transpose(np.asarray([p.derivative(test_xs,1) for p in Pi]), + (1,0))) + def test_incremental(self): + P = PiecewisePolynomial([self.xi[0]], [self.yi[0]], 3) + for i in xrange(1,len(self.xi)): + P.append(self.xi[i],self.yi[i],3) + assert_almost_equal(P(self.test_xs),self.spline_ys) + + def test_shapes_scalarvalue(self): + P = PiecewisePolynomial(self.xi,self.yi,4) + assert_array_equal(np.shape(P(0)), ()) + assert_array_equal(np.shape(P([0])), (1,)) + assert_array_equal(np.shape(P([0,1])), (2,)) + + def test_shapes_scalarvalue_derivative(self): + P = PiecewisePolynomial(self.xi,self.yi,4) + n = 4 + assert_array_equal(np.shape(P.derivative(0,1)), ()) + assert_array_equal(np.shape(P.derivative([0],1)), (1,)) + assert_array_equal(np.shape(P.derivative([0,1],1)), (2,)) + + def test_shapes_vectorvalue(self): + yi = np.multiply.outer(np.asarray(self.yi),np.arange(3)) + P = PiecewisePolynomial(self.xi,yi,4) + assert_array_equal(np.shape(P(0)), (3,)) + assert_array_equal(np.shape(P([0])), (1,3)) + assert_array_equal(np.shape(P([0,1])), (2,3)) + + def test_shapes_vectorvalue_derivative(self): + P = PiecewisePolynomial(self.xi,np.multiply.outer(self.yi,np.arange(3)),4) + n = 4 + assert_array_equal(np.shape(P.derivative(0,1)), (3,)) + assert_array_equal(np.shape(P.derivative([0],1)), (1,3)) + assert_array_equal(np.shape(P.derivative([0,1],1)), (2,3)) + + +if __name__=='__main__': + nose.run(argv=['', __file__]) From scipy-svn at scipy.org Thu Apr 24 20:26:07 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Thu, 24 Apr 2008 19:26:07 -0500 (CDT) Subject: [Scipy-svn] r4176 - in trunk/scipy/sparse: . tests Message-ID: <20080425002607.BFD7239C0A0@new.scipy.org> Author: wnbell Date: 2008-04-24 19:26:05 -0500 (Thu, 24 Apr 2008) New Revision: 4176 Modified: trunk/scipy/sparse/base.py trunk/scipy/sparse/tests/test_base.py Log: fix getrow/getcol error added unittests Modified: trunk/scipy/sparse/base.py =================================================================== --- trunk/scipy/sparse/base.py 2008-04-25 00:11:33 UTC (rev 4175) +++ trunk/scipy/sparse/base.py 2008-04-25 00:26:05 UTC (rev 4176) @@ -341,6 +341,7 @@ # Spmatrix subclasses should override this method for efficiency. # Post-multiply by a (n x 1) column vector 'a' containing all zeros # except for a_j = 1 + from csc import csc_matrix n = self.shape[1] a = csc_matrix((n, 1), dtype=self.dtype) a[j, 0] = 1 @@ -353,6 +354,7 @@ # Spmatrix subclasses should override this method for efficiency. # Pre-multiply by a (1 x m) row vector 'a' containing all zeros # except for a_i = 1 + from csr import csr_matrix m = self.shape[0] a = csr_matrix((1, m), dtype=self.dtype) a[0, i] = 1 Modified: trunk/scipy/sparse/tests/test_base.py =================================================================== --- trunk/scipy/sparse/tests/test_base.py 2008-04-25 00:11:33 UTC (rev 4175) +++ trunk/scipy/sparse/tests/test_base.py 2008-04-25 00:26:05 UTC (rev 4176) @@ -104,6 +104,13 @@ for m in mats: assert_equal(self.spmatrix(m).diagonal(),diag(m)) + + def test_getrow(self): + assert_array_equal(self.datsp.getrow(1).todense(), self.dat[1,:]) + + def test_getcol(self): + assert_array_equal(self.datsp.getcol(1).todense(), self.dat[:,1]) + def test_sum(self): """Does the matrix's .sum(axis=...) method work? """ From scipy-svn at scipy.org Fri Apr 25 13:45:52 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 25 Apr 2008 12:45:52 -0500 (CDT) Subject: [Scipy-svn] r4177 - trunk/scipy/linalg Message-ID: <20080425174552.15EA239C4F4@new.scipy.org> Author: stefan Date: 2008-04-25 12:45:42 -0500 (Fri, 25 Apr 2008) New Revision: 4177 Modified: trunk/scipy/linalg/setup.py Log: Revert r4157. Modified: trunk/scipy/linalg/setup.py =================================================================== --- trunk/scipy/linalg/setup.py 2008-04-25 00:26:05 UTC (rev 4176) +++ trunk/scipy/linalg/setup.py 2008-04-25 17:45:42 UTC (rev 4177) @@ -63,7 +63,7 @@ if skip_single_routines: target_dir = 'dbl' skip_names['clapack'].extend(\ - 'sgesv sgetrf cgetrf sgetrs cgetrs sgetri cgetri'\ + 'sgesv cgesv sgetrf cgetrf sgetrs cgetrs sgetri cgetri'\ ' sposv cposv spotrf cpotrf spotrs cpotrs spotri cpotri'\ ' slauum clauum strtri ctrtri'.split()) skip_names['flapack'].extend(skip_names['clapack']) From scipy-svn at scipy.org Fri Apr 25 14:48:04 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 25 Apr 2008 13:48:04 -0500 (CDT) Subject: [Scipy-svn] r4178 - trunk/scipy/sparse Message-ID: <20080425184804.2EC3839C05E@new.scipy.org> Author: wnbell Date: 2008-04-25 13:48:01 -0500 (Fri, 25 Apr 2008) New Revision: 4178 Modified: trunk/scipy/sparse/dok.py Log: small edit to dok.matvec() Modified: trunk/scipy/sparse/dok.py =================================================================== --- trunk/scipy/sparse/dok.py 2008-04-25 17:45:42 UTC (rev 4177) +++ trunk/scipy/sparse/dok.py 2008-04-25 18:48:01 UTC (rev 4178) @@ -488,7 +488,7 @@ raise ValueError, "dimensions do not match" new = [0] * self.shape[0] for key in self.keys(): - new[int(key[0])] += self[key] * other[int(key[1]), ...] + new[int(key[0])] += self[key] * other[int(key[1])] new = array(new) if isinstance(other, matrix): new = asmatrix(new) @@ -505,7 +505,7 @@ raise ValueError, "dimensions do not match" new = [0] * self.shape[1] for key in self.keys(): - new[int(key[1])] += other[..., int(key[0])] * conj(self[key]) + new[int(key[1])] += other[int(key[0])] * conj(self[key]) new = array(new) if isinstance(other, matrix): new = asmatrix(new) From scipy-svn at scipy.org Fri Apr 25 23:08:12 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Fri, 25 Apr 2008 22:08:12 -0500 (CDT) Subject: [Scipy-svn] r4179 - trunk/scipy/cluster/src Message-ID: <20080426030812.C013739C097@new.scipy.org> Author: damian.eads Date: 2008-04-25 22:08:04 -0500 (Fri, 25 Apr 2008) New Revision: 4179 Modified: trunk/scipy/cluster/src/hierarchy.c trunk/scipy/cluster/src/hierarchy_wrap.c Log: Got rid of gcc34 warnings. Modified: trunk/scipy/cluster/src/hierarchy.c =================================================================== --- trunk/scipy/cluster/src/hierarchy.c 2008-04-25 18:48:01 UTC (rev 4178) +++ trunk/scipy/cluster/src/hierarchy.c 2008-04-26 03:08:04 UTC (rev 4179) @@ -293,7 +293,7 @@ double jaccard_distance_bool(const char *u, const char *v, int n) { int i = 0; - double s = 0.0, num = 0.0, denom = 0.0; + double num = 0.0, denom = 0.0; for (i = 0; i < n; i++) { num += (u[i] != v[i]) && ((u[i] != 0) || (v[i] != 0)); denom += (u[i] != 0) || (v[i] != 0); Modified: trunk/scipy/cluster/src/hierarchy_wrap.c =================================================================== --- trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-25 18:48:01 UTC (rev 4178) +++ trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-26 03:08:04 UTC (rev 4179) @@ -248,7 +248,6 @@ extern PyObject *cluster_maxclust_monocrit_wrap(PyObject *self, PyObject *args) { int n, mc; - double cutoff; PyArrayObject *Z, *MC, *T; if (!PyArg_ParseTuple(args, "O!O!O!ii", &PyArray_Type, &Z, @@ -903,8 +902,7 @@ {NULL, NULL} /* Sentinel - marks the end of this structure */ }; -void init_hierarchy_wrap() { +void init_hierarchy_wrap(void) { (void) Py_InitModule("_hierarchy_wrap", _hierarchyWrapMethods); import_array(); // Must be present for NumPy. Called first after above line. } - From scipy-svn at scipy.org Sat Apr 26 19:33:36 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sat, 26 Apr 2008 18:33:36 -0500 (CDT) Subject: [Scipy-svn] r4180 - trunk/scipy/special/c_misc Message-ID: <20080426233336.D069A39C0B9@new.scipy.org> Author: cookedm Date: 2008-04-26 18:33:30 -0500 (Sat, 26 Apr 2008) New Revision: 4180 Modified: trunk/scipy/special/c_misc/fsolve.c trunk/scipy/special/c_misc/misc.h Log: scipy.special: Fix for #655: gammaincinv never ends This shouldn't happen, as I constructed the root-finding routine to guarantee convergence. I added a maximum number of iterations nevertheless. Modified: trunk/scipy/special/c_misc/fsolve.c =================================================================== --- trunk/scipy/special/c_misc/fsolve.c 2008-04-26 03:08:04 UTC (rev 4179) +++ trunk/scipy/special/c_misc/fsolve.c 2008-04-26 23:33:30 UTC (rev 4180) @@ -1,6 +1,10 @@ #include "misc.h" #include +#define MAX_ITERATIONS 100 +#define FP_CMP_WITH_BISECT_NITER 4 +#define FP_CMP_WITH_BISECT_WIDTH 4.0 + static inline double max(double a, double b) { @@ -54,6 +58,7 @@ double x3, f3; double w, last_bisect_width; double tol; + int niter; if (f1*f2 >= 0.0) { return FSOLVE_NOT_BRACKET; @@ -65,7 +70,7 @@ } w = fabs(x2 - x1); last_bisect_width = w; - while (1) { + for (niter=0; niter < MAX_ITERATIONS; niter++) { switch (state) { case bisect: { x3 = 0.5 * (x1 + x2); @@ -130,8 +135,8 @@ sure that we always end up decreasing the interval width with a bisection. */ - if (n_falsep > 4) { - if (w*4 > last_bisect_width) { + if (n_falsep > FP_CMP_WITH_BISECT_NITER) { + if (w*FP_CMP_WITH_BISECT_WIDTH > last_bisect_width) { state = bisect; } n_falsep = 0; @@ -150,6 +155,9 @@ goto finish; } } + r = FSOLVE_MAX_ITERATIONS; + *best_x = x3; *best_f = f3; + goto finish; exact_soln: *best_x = x3; *best_f = 0.0; r = FSOLVE_EXACT; Modified: trunk/scipy/special/c_misc/misc.h =================================================================== --- trunk/scipy/special/c_misc/misc.h 2008-04-26 03:08:04 UTC (rev 4179) +++ trunk/scipy/special/c_misc/misc.h 2008-04-26 23:33:30 UTC (rev 4180) @@ -9,6 +9,8 @@ FSOLVE_CONVERGED, /* Not a bracket */ FSOLVE_NOT_BRACKET, + /* Root-finding didn't converge in a set number of iterations. */ + FSOLVE_MAX_ITERATIONS } fsolve_result_t; typedef double (*objective_function)(double, void *); From scipy-svn at scipy.org Sun Apr 27 01:13:10 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 00:13:10 -0500 (CDT) Subject: [Scipy-svn] r4181 - trunk/scipy/interpolate Message-ID: <20080427051310.5D84739C240@new.scipy.org> Author: peridot Date: 2008-04-27 00:13:08 -0500 (Sun, 27 Apr 2008) New Revision: 4181 Modified: trunk/scipy/interpolate/polyint.py Log: Improved exception raising for misshapen derivatives, and a fix for return-value shape. PiecewisePolynomial still doesn't distinguish between scalar and one-dimensional vector results, though. Modified: trunk/scipy/interpolate/polyint.py =================================================================== --- trunk/scipy/interpolate/polyint.py 2008-04-26 23:33:30 UTC (rev 4180) +++ trunk/scipy/interpolate/polyint.py 2008-04-27 05:13:08 UTC (rev 4181) @@ -468,10 +468,7 @@ assert n2<=len(y2) xi = np.zeros(n) - if self.r==1: - yi = np.zeros(n) - else: - yi = np.zeros((n,self.r)) + yi = np.zeros((n,self.r)) xi[:n1] = x1 yi[:n1] = y1[:n1] xi[n1:] = x2 @@ -498,6 +495,13 @@ self.xi.append(xi) self.yi.append(yi) + for y in yi: + if np.shape(y) != (self.r,): + if self.r>1: + raise ValueError, "Each derivative must be a vector of length %d" % self.r + else: + raise ValueError, "Each derivative must be a scalar" + if order is None: n1 = len(self.yi[-2]) n2 = len(self.yi[-1]) From scipy-svn at scipy.org Sun Apr 27 05:05:14 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 04:05:14 -0500 (CDT) Subject: [Scipy-svn] r4182 - trunk/scipy/cluster Message-ID: <20080427090514.9C87339C0A1@new.scipy.org> Author: damian.eads Date: 2008-04-27 04:05:12 -0500 (Sun, 27 Apr 2008) New Revision: 4182 Modified: trunk/scipy/cluster/hierarchy.py Log: Updated file header. Modified: trunk/scipy/cluster/hierarchy.py =================================================================== --- trunk/scipy/cluster/hierarchy.py 2008-04-27 05:13:08 UTC (rev 4181) +++ trunk/scipy/cluster/hierarchy.py 2008-04-27 09:05:12 UTC (rev 4182) @@ -2,7 +2,6 @@ ----------------------------------------- Hierarchical Clustering Library for Scipy Copyright (C) Damian Eads, 2007-2008. - All Rights Reserved. New BSD License ----------------------------------------- From scipy-svn at scipy.org Sun Apr 27 05:27:19 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 04:27:19 -0500 (CDT) Subject: [Scipy-svn] r4183 - trunk/scipy/cluster Message-ID: <20080427092719.91A9839C0A1@new.scipy.org> Author: damian.eads Date: 2008-04-27 04:27:17 -0500 (Sun, 27 Apr 2008) New Revision: 4183 Modified: trunk/scipy/cluster/SConstruct trunk/scipy/cluster/__init__.py Log: Added import for hierarchy to __init__.py. Updated SConstruct. Modified: trunk/scipy/cluster/SConstruct =================================================================== --- trunk/scipy/cluster/SConstruct 2008-04-27 09:05:12 UTC (rev 4182) +++ trunk/scipy/cluster/SConstruct 2008-04-27 09:27:17 UTC (rev 4183) @@ -10,3 +10,6 @@ env.AppendUnique(CPPPATH = get_numpy_include_dirs()) env.NumpyPythonExtension('_vq', source = [join('src', 'vq_module.c'), join('src', 'vq.c')]) + +env.NumpyPythonExtension('_hierarchy_wrap', source = [join('src', 'hierarchy_wrap.c'), + join('src', 'hierarchy.c')]) Modified: trunk/scipy/cluster/__init__.py =================================================================== --- trunk/scipy/cluster/__init__.py 2008-04-27 09:05:12 UTC (rev 4182) +++ trunk/scipy/cluster/__init__.py 2008-04-27 09:27:17 UTC (rev 4183) @@ -4,8 +4,8 @@ from info import __doc__ -__all__ = ['vq'] +__all__ = ['vq', 'hierarchy'] -import vq +import vq, hierarchy from scipy.testing.pkgtester import Tester test = Tester().test From scipy-svn at scipy.org Sun Apr 27 05:38:39 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 04:38:39 -0500 (CDT) Subject: [Scipy-svn] r4184 - trunk/scipy/cluster Message-ID: <20080427093839.AEE9339C187@new.scipy.org> Author: damian.eads Date: 2008-04-27 04:38:37 -0500 (Sun, 27 Apr 2008) New Revision: 4184 Modified: trunk/scipy/cluster/info.py Log: Added description for the hierarchy module. Changed English for vq module. Modified: trunk/scipy/cluster/info.py =================================================================== --- trunk/scipy/cluster/info.py 2008-04-27 09:27:17 UTC (rev 4183) +++ trunk/scipy/cluster/info.py 2008-04-27 09:38:37 UTC (rev 4184) @@ -2,9 +2,18 @@ Vector Quantization / Kmeans ============================ - Clustering Algorithms are useful in Information Theory, target detection, - communications, compression, and other areas. Currently only Vector - Quantization and the KMeans algorithm are supported by the vq module. - Self Organized Feature Maps (SOM) and other approaches are also scheduled - to appear at a theater near you. + Clustering algorithms are useful in information theory, target detection, + communications, compression, and other areas. The vq module only + supports vector quantization and the k-means algorithms. Development + of self-organizing maps (SOM) and other approaches is underway. + +Hierarchical Clustering +======================= + + The hierarchy module provides functions for hierarchical and agglomerative + clustering. Its features include generating hierarchical clusters from + distance matrices, computing distance matrices from observation vectors, + calculating statistics on clusters, cutting linkages to generate flat + clusters, and visualizing clusters with dendrograms. + """ From scipy-svn at scipy.org Sun Apr 27 05:39:53 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 04:39:53 -0500 (CDT) Subject: [Scipy-svn] r4185 - trunk/scipy/cluster Message-ID: <20080427093953.76FE739C0F7@new.scipy.org> Author: damian.eads Date: 2008-04-27 04:39:47 -0500 (Sun, 27 Apr 2008) New Revision: 4185 Modified: trunk/scipy/cluster/__init__.py Log: Updated header to include description of hierarchy. Modified: trunk/scipy/cluster/__init__.py =================================================================== --- trunk/scipy/cluster/__init__.py 2008-04-27 09:38:37 UTC (rev 4184) +++ trunk/scipy/cluster/__init__.py 2008-04-27 09:39:47 UTC (rev 4185) @@ -1,5 +1,5 @@ # -# cluster - Vector Quantization / Kmeans +# cluster - Vector Quantization / K-means / Hierarchical Clustering # from info import __doc__ From scipy-svn at scipy.org Sun Apr 27 08:18:50 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 07:18:50 -0500 (CDT) Subject: [Scipy-svn] r4186 - trunk/scipy/cluster Message-ID: <20080427121850.372E639C424@new.scipy.org> Author: damian.eads Date: 2008-04-27 07:18:48 -0500 (Sun, 27 Apr 2008) New Revision: 4186 Modified: trunk/scipy/cluster/vq.py Log: Cleaned up documentation. Removed cerrtain references to optimal/minimal distortion solutions, which cannot be claimed. Made terminology more consistent. Improved grammar and usage. Wrote summary of k-means and quantization. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 09:39:47 UTC (rev 4185) +++ trunk/scipy/cluster/vq.py 2008-04-27 12:18:48 UTC (rev 4186) @@ -1,18 +1,60 @@ -""" Vector Quantization Module +""" K-means Clustering and Vector Quantization Module - Provides several routines used in creating a code book from a set of - observations and comparing a set of observations to a code book. + Provides routines for performing k-means clustering and vector + quantization. + The k-means algorithm takes as input the number of clusters to + generate k and a set of observation vectors to cluster. It + returns as its model a set of centroids, one for each of the k + clusters. An observation vector is classified with the cluster + number or centroid index of the centroid closest to it. The + cluster is defined as the set of all points closest to the + centroid of the cluster. + + Since vector quantization is a natural application for k-means, + and vector quantization is often a subject of information theory, + the terminology for the latter two are often used in describing + k-means. The centroid or cluster index is often referred to as + a "code" and the mapping table from codes to centroids is often + referred to as a "code book". + + The result of k-means, a set of centroids, is often used to + quantize vectors. Quantization aims to find an encoding that + reduces information loss or distortion. The centroids represent + the center of mass of the clusters they define. Each step of + the k-means algorithm refines the choices of centroids to + reduce distortion. When change in distortion is lower than + a threshold, the k-means algorithm has converged. + + For example, suppose we wish to compress a 24-bit per pixel color + image before sending it over the web. Each pixel value is + represented by three bytes, one each for red, green, and blue. By + using a smaller 8-bit encoding, we can reduce the data to send by + two thirds. Ideally, the colors for each of the 256 possible 8-bit + encoding values should be chosen to minimize distortion of the + color. By running k-means with k=256, we generate a code book of + 256 codes, one for every 8-bit sequence. Instead of sending a + 3-byte value for each pixel, the centroid index (or code word) of + the centroid closest to it is is transmitted. The code book is + also sent over the wire so each received pixel value, represented + as a centroid index, can be translated back into its 24-bit + representation. + + This module provides routines for k-means clustering, generating + code books from k-means, and quantizing vectors by comparing + them to centroids in a code book. + All routines expect an "observation vector" to be stored in each - row of the obs matrix. Similarly the codes are stored row wise - in the code book matrix. + row of the obs matrix. Similarly the centroids corresponding to + the codes are stored as rows of the code_book matrix. The i'th + index is the code corresponding to the code_book[i] centroid. whiten(obs) -- - Normalize a group of observations on a per feature basis + Normalize a group of observations so each feature has unit variance. vq(obs,code_book) -- - Calculate code book membership of obs + Calculate code book membership of obs. kmeans(obs,k_or_guess,iter=20,thresh=1e-5) -- - Train a codebook for mimimum distortion using the kmeans algorithm + Train a codebook for mimimum distortion using the k-means algorithm. kmeans2 Similar to kmeans, but with several initialization methods. @@ -22,7 +64,7 @@ __all__ = ['whiten', 'vq', 'kmeans', 'kmeans2'] # TODO: -# - implements high level method for running several times kmeans with +# - implements high level method for running several times k-means with # different initialialization # - warning: what happens if different number of clusters ? For now, emit a # warning, but it is not great, because I am not sure it really make sense to @@ -41,15 +83,15 @@ def whiten(obs): """ Normalize a group of observations on a per feature basis. - Before running kmeans algorithms, it is beneficial to "whiten", or - scale, the observation data on a per feature basis. This is done - by dividing each feature by its standard deviation across all - observations. + Before running k-means, it is beneficial to rescale each feature + dimension of the observation set with whitening. Each feature is + divided by its standard deviation across all observations to give + it unit variance. :Parameters: obs : ndarray Each row of the array is an observation. The - columns are the "features" seen during each observation + columns are the features seen during each observation. :: # f0 f1 f2 @@ -83,23 +125,25 @@ return obs / std_dev def vq(obs, code_book): - """ Vector Quantization: assign features sets to codes in a code book. + """ Vector Quantization: assign codes from a code book to observations. - Vector quantization determines which code in the code book best represents - an observation of a target. The features of each observation are compared - to each code in the book, and assigned the one closest to it. The - observations are contained in the obs array. These features should be - "whitened," or nomalized by the standard deviation of all the features - before being quantized. The code book can be created using the kmeans - algorithm or something similar. + Assigns a code from a code book to each observation. Each + observation vector in the MxN obs array is compared with the + centroids in the code book and assigned the code of the closest + centroid. + The features in obs should have unit variance, which can be + acheived by passing them through the whiten function. The code + book can be created with the k-means algorithm or a different + encoding algorithm. + :Parameters: obs : ndarray - Each row of the array is an observation. The columns are the - "features" seen during each observation The features must be + Each row of the NxM array is an observation. The columns are the + "features" seen during each observation. The features must be whitened first using the whiten function or something equivalent. code_book : ndarray. - The code book is usually generated using the kmeans algorithm. + The code book is usually generated using the k-means algorithm. Each row of the array holds a different code, and the columns are the features of the code. @@ -112,15 +156,14 @@ :Returns: code : ndarray - If obs is a NxM array, then a length N array is returned that holds - the selected code book index for each observation. + A length N array holding the code book index for each observation. dist : ndarray The distortion (distance) between the observation and its nearest - code + code. Notes ----- - This currently forces 32 bit math precision for speed. Anyone know + This currently forces 32-bit math precision for speed. Anyone know of a situation where this undermines the accuracy of the algorithm? Examples @@ -154,7 +197,7 @@ def py_vq(obs, code_book): """ Python version of vq algorithm. - The algorithm simply computes the euclidian distance between each + The algorithm computes the euclidian distance between each observation and every frame in the code_book. :Parameters: @@ -165,11 +208,11 @@ features (eg columns) than obs. :Note: - This function is slower than the C versions, but it works for + This function is slower than the C version but works for all input types. If the inputs have the wrong types for the C versions of the function, this one is called as a last resort. - Its about 20 times slower than the C versions. + It is about 20 times slower than the C version. :Returns: code : ndarray @@ -284,7 +327,7 @@ return code, min_dist def _kmeans(obs, guess, thresh=1e-5): - """ "raw" version of kmeans. + """ "raw" version of k-means. :Returns: code_book : @@ -294,7 +337,7 @@ Lower means the code_book matches the data better. :SeeAlso: - - kmeans : wrapper around kmeans + - kmeans : wrapper around k-means XXX should have an axis variable here. @@ -341,34 +384,55 @@ return code_book, avg_dist[-1] def kmeans(obs, k_or_guess, iter=20, thresh=1e-5): - """Generate a code book with minimum distortion. + """Performs k-means on a set of observations for a specified number of + iterations. This yields a code book mapping centroids to codes + and vice versa. The k-means algorithm adjusts the centroids + until the change in distortion caused by quantizing the + observation is less than some threshold. :Parameters: obs : ndarray - Each row of the array is an observation. The columns are the - "features" seen during each observation The features must be - whitened first using the whiten function or something equivalent. + Each row of the M by N array is an observation. The columns are the + "features" seen during each observation. The features must be + whitened first with the whiten function. k_or_guess : int or ndarray - If integer, it is the number of code book elements. If a 2D array, - the array is used as the intial guess for the code book. The array - should have k rows, and the same number of columns (features) as - the obs array. + The number of centroids to generate. One code will be assigned + to each centroid, and it will be the row index in the code_book + matrix generated. + + The initial k centroids will be chosen by randomly + selecting observations from the observation + matrix. Alternatively, passing a k by N array specifies + the initial values of the k means. + iter : int - The number of times to restart the kmeans algorithm with a new - initial guess. If k_or_guess is a 2D array (codebook), this - argument is ignored and only 1 iteration is run. + The number of times to run k-means, returning the codebook + with the lowest distortion. This argument is ignored if + initial mean values are specified with an array for the + k_or_guess paramter. This parameter does not represent the + number of iterations of the k-means algorithm. + thresh : float - Terminate each kmeans run when the distortion change from one - iteration to the next is less than this value. + Terminates the k-means algorithm if the change in + distortion since the last k-means iteration is less than + thresh. + :Returns: - codesbook : ndarray - The codes that best fit the observation + codebook : ndarray + A k by N array of k centroids. The i'th centroid + codebook[i] is represented with the code i. The centroids + and codes generated represent the lowest distortion seen, + not necessarily the global minimum distortion. + distortion : float - The distortion between the observations and the codes. + The distortion between the observations passed and the + centroids generated. :SeeAlso: - kmeans2: similar function, but with more options for initialization, and returns label of each observation + - whiten: must be called prior to passing an observation matrix + to kmeans. Examples -------- @@ -499,46 +563,51 @@ def kmeans2(data, k, iter = 10, thresh = 1e-5, minit = 'random', missing = 'warn'): - """Classify a set of points into k clusters using kmean algorithm. + """Classify a set of observations into k clusters using the k-means + algorithm. - The algorithm works by minimizing the euclidian distance between data points - of cluster means. This version is more complete than kmean (has several - initialisation methods). + The algorithm attempts to minimize the Euclidian distance between + observations and centroids. Several initialization methods are + included. :Parameters: data : ndarray - Expect a rank 1 or 2 array. Rank 1 are assumed to describe one - dimensional data, rank 2 multidimensional data, in which case one - row is one observation. + A M by N array of M observations in N dimensions or a length + M array of M one-dimensional observations. k : int or ndarray - Number of clusters. If minit arg is 'matrix', or if a ndarray is - given instead, it is interpreted as initial cluster to use instead. + The number of clusters to form as well as the number of + centroids to generate. If minit initialization string is + 'matrix', or if a ndarray is given instead, it is + interpreted as initial cluster to use instead. niter : int - Number of iterations to run. + Number of iterations of k-means to run. Note that this + differs in meaning from the iters parameter to the kmeans + function. thresh : float (not used yet). minit : string - Method for initialization. Available methods are random, points and - uniform: + Method for initialization. Available methods are 'random', + 'points', 'uniform', and 'matrix': - random uses k points drawn from a Gaussian random generator which - mean and variances are estimated from the data. + 'random': generate k centroids from a Gaussian with mean and + variance estimated from the data. - points choses k points at random from the points in data. + 'points': choose k observations (rows) at random from data for + the initial centroids. - uniform choses k points from the data such are they form a uniform - grid od the dataset (not supported yet). + 'uniform': generate k observations from the data from a uniform + distribution defined by the data set (unsupported). - matrix means that k has to be interpreted as initial clusters - (format is the same than data). + 'matrix': interpret the k parameter as a k by M (or length k + array for one-dimensional data) array of initial centroids. :Returns: - clusters : ndarray - the found clusters (one cluster per row). + centroid : ndarray + A k by N array of centroids found at the last iteration of + k-means. label : ndarray - label[i] gives the label of the ith obversation, that its centroid is - cluster[label[i]]. - + label[i] is the code or index of the centroid the + i'th observation is closest to. """ if missing not in _valid_miss_meth.keys(): raise ValueError("Unkown missing method: %s" % str(missing)) @@ -581,7 +650,7 @@ def _kmeans2(data, code, niter, nc, missing): """ "raw" version of kmeans2. Do not use directly. - Run kmeans with a given initial codebook. """ + Run k-means with a given initial codebook. """ for i in range(niter): # Compute the nearest neighbour for each obs # using the current code book From scipy-svn at scipy.org Sun Apr 27 08:48:27 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 07:48:27 -0500 (CDT) Subject: [Scipy-svn] r4187 - trunk/scipy/cluster Message-ID: <20080427124827.1ED2739C1C9@new.scipy.org> Author: damian.eads Date: 2008-04-27 07:48:25 -0500 (Sun, 27 Apr 2008) New Revision: 4187 Modified: trunk/scipy/cluster/vq.py Log: Tightening up the language of vq's module summary. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 12:18:48 UTC (rev 4186) +++ trunk/scipy/cluster/vq.py 2008-04-27 12:48:25 UTC (rev 4187) @@ -1,54 +1,54 @@ """ K-means Clustering and Vector Quantization Module - Provides routines for performing k-means clustering and vector - quantization. + Provides routines for k-means clustering, generating code books + from k-means models, and quantizing vectors by comparing them with + centroids in a code book. The k-means algorithm takes as input the number of clusters to generate k and a set of observation vectors to cluster. It returns as its model a set of centroids, one for each of the k clusters. An observation vector is classified with the cluster - number or centroid index of the centroid closest to it. The - cluster is defined as the set of all points closest to the - centroid of the cluster. + number or centroid index of the centroid closest to it. + Most variants of k-means try to minimize distortion, which is + defined as the sum of the distances between each observation and + its dominating centroid. A vector belongs to a cluster i if it is + closer to centroid i than the other centroids. Each step of the + k-means algorithm refines the choices of centroids to reduce + distortion. The change in distortion is often used as a stopping + criterion: when the change is lower than a threshold, the k-means + algorithm is not making progress and terminates. + Since vector quantization is a natural application for k-means, - and vector quantization is often a subject of information theory, - the terminology for the latter two are often used in describing - k-means. The centroid or cluster index is often referred to as - a "code" and the mapping table from codes to centroids is often - referred to as a "code book". + information theory terminology is often used. The centroid index + or cluster index is also referred to as a "code" and the table + mapping codes to centroids and vice versa is often referred as a + "code book". The result of k-means, a set of centroids, can be + used to quantize vectors. Quantization aims to find an encoding of + vectors that reduces the expected distortion. - The result of k-means, a set of centroids, is often used to - quantize vectors. Quantization aims to find an encoding that - reduces information loss or distortion. The centroids represent - the center of mass of the clusters they define. Each step of - the k-means algorithm refines the choices of centroids to - reduce distortion. When change in distortion is lower than - a threshold, the k-means algorithm has converged. - - For example, suppose we wish to compress a 24-bit per pixel color - image before sending it over the web. Each pixel value is - represented by three bytes, one each for red, green, and blue. By - using a smaller 8-bit encoding, we can reduce the data to send by - two thirds. Ideally, the colors for each of the 256 possible 8-bit + For example, suppose we wish to compress a 24-bit color image + (each pixel is represented by one byte for red, one for blue, and + one for green) before sending it over the web. By using a smaller + 8-bit encoding, we can reduce the data to send by two + thirds. Ideally, the colors for each of the 256 possible 8-bit encoding values should be chosen to minimize distortion of the - color. By running k-means with k=256, we generate a code book of - 256 codes, one for every 8-bit sequence. Instead of sending a - 3-byte value for each pixel, the centroid index (or code word) of - the centroid closest to it is is transmitted. The code book is - also sent over the wire so each received pixel value, represented - as a centroid index, can be translated back into its 24-bit - representation. + color. Running k-means with k=256 generates a code book of 256 + codes, which fills up all possible 8-bit sequences. Instead of + sending a 3-byte value for each pixel, the 8-bit centroid index + (or code word) of the dominating centroid is transmitted. The code + book is also sent over the wire so each 8-bit code can be + translated back to a 24-bit pixel value representation. If the + image of interest was of an ocean, we would expect many 24-bit + blues to be represented by 8-bit codes. If it was an image of a + human face, more flesh tone colors would be represented in the + code book. - This module provides routines for k-means clustering, generating - code books from k-means, and quantizing vectors by comparing - them to centroids in a code book. + All routines expect the observation vectors to be stored as rows + in the obs matrix. Similarly the centroids corresponding to the + codes are stored as rows of the code_book matrix. The i'th index + is the code corresponding to the code_book[i] centroid. - All routines expect an "observation vector" to be stored in each - row of the obs matrix. Similarly the centroids corresponding to - the codes are stored as rows of the code_book matrix. The i'th - index is the code corresponding to the code_book[i] centroid. - whiten(obs) -- Normalize a group of observations so each feature has unit variance. vq(obs,code_book) -- From scipy-svn at scipy.org Sun Apr 27 08:52:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 07:52:46 -0500 (CDT) Subject: [Scipy-svn] r4188 - trunk/scipy/cluster Message-ID: <20080427125246.A294C39C1C9@new.scipy.org> Author: damian.eads Date: 2008-04-27 07:52:45 -0500 (Sun, 27 Apr 2008) New Revision: 4188 Modified: trunk/scipy/cluster/vq.py Log: Tightening up the language of vq's module summary. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 12:48:25 UTC (rev 4187) +++ trunk/scipy/cluster/vq.py 2008-04-27 12:52:45 UTC (rev 4188) @@ -10,11 +10,12 @@ clusters. An observation vector is classified with the cluster number or centroid index of the centroid closest to it. - Most variants of k-means try to minimize distortion, which is - defined as the sum of the distances between each observation and - its dominating centroid. A vector belongs to a cluster i if it is - closer to centroid i than the other centroids. Each step of the - k-means algorithm refines the choices of centroids to reduce + A vector v belongs to cluster i if it is closer to centroid i than + the other centroids. If v belongs to i, we say centroid i is the + dominating centroid of v. Most variants of k-means try to minimize + distortion, which is defined as the sum of the distances between + each observation vector and its dominating centroid. Each step of + the k-means algorithm refines the choices of centroids to reduce distortion. The change in distortion is often used as a stopping criterion: when the change is lower than a threshold, the k-means algorithm is not making progress and terminates. From scipy-svn at scipy.org Sun Apr 27 08:53:46 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 07:53:46 -0500 (CDT) Subject: [Scipy-svn] r4189 - trunk/scipy/cluster Message-ID: <20080427125346.DCC1539C185@new.scipy.org> Author: damian.eads Date: 2008-04-27 07:53:43 -0500 (Sun, 27 Apr 2008) New Revision: 4189 Modified: trunk/scipy/cluster/vq.py Log: Tightening up the language of vq's module summary. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 12:52:45 UTC (rev 4188) +++ trunk/scipy/cluster/vq.py 2008-04-27 12:53:43 UTC (rev 4189) @@ -12,13 +12,13 @@ A vector v belongs to cluster i if it is closer to centroid i than the other centroids. If v belongs to i, we say centroid i is the - dominating centroid of v. Most variants of k-means try to minimize - distortion, which is defined as the sum of the distances between - each observation vector and its dominating centroid. Each step of - the k-means algorithm refines the choices of centroids to reduce - distortion. The change in distortion is often used as a stopping - criterion: when the change is lower than a threshold, the k-means - algorithm is not making progress and terminates. + dominating centroid of v. Common variants of k-means try to + minimize distortion, which is defined as the sum of the distances + between each observation vector and its dominating centroid. Each + step of the k-means algorithm refines the choices of centroids to + reduce distortion. The change in distortion is often used as a + stopping criterion: when the change is lower than a threshold, the + k-means algorithm is not making progress and terminates. Since vector quantization is a natural application for k-means, information theory terminology is often used. The centroid index From scipy-svn at scipy.org Sun Apr 27 08:55:28 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 07:55:28 -0500 (CDT) Subject: [Scipy-svn] r4190 - trunk/scipy/cluster Message-ID: <20080427125528.19C4F39C192@new.scipy.org> Author: damian.eads Date: 2008-04-27 07:55:26 -0500 (Sun, 27 Apr 2008) New Revision: 4190 Modified: trunk/scipy/cluster/vq.py Log: Fixed typo. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 12:53:43 UTC (rev 4189) +++ trunk/scipy/cluster/vq.py 2008-04-27 12:55:26 UTC (rev 4190) @@ -56,7 +56,7 @@ Calculate code book membership of obs. kmeans(obs,k_or_guess,iter=20,thresh=1e-5) -- Train a codebook for mimimum distortion using the k-means algorithm. - kmeans2 + kmeans2 -- Similar to kmeans, but with several initialization methods. """ From scipy-svn at scipy.org Sun Apr 27 09:06:17 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 08:06:17 -0500 (CDT) Subject: [Scipy-svn] r4191 - trunk/scipy/cluster Message-ID: <20080427130617.AA5F739C46C@new.scipy.org> Author: damian.eads Date: 2008-04-27 08:06:16 -0500 (Sun, 27 Apr 2008) New Revision: 4191 Modified: trunk/scipy/cluster/vq.py Log: Tightened language in vq's module summary docstring. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 12:55:26 UTC (rev 4190) +++ trunk/scipy/cluster/vq.py 2008-04-27 13:06:16 UTC (rev 4191) @@ -51,13 +51,19 @@ is the code corresponding to the code_book[i] centroid. whiten(obs) -- - Normalize a group of observations so each feature has unit variance. + Normalize a group of observations so each feature has unit + variance. vq(obs,code_book) -- - Calculate code book membership of obs. + Calculate code book membership of a set of observation + vectors. kmeans(obs,k_or_guess,iter=20,thresh=1e-5) -- - Train a codebook for mimimum distortion using the k-means algorithm. + Clusters a set of observation vectors. Learns centroids with + the k-means algorithm, trying to minimize distortion. A code + book is generated that can be used to quantize vectors. kmeans2 -- - Similar to kmeans, but with several initialization methods. + A different implementation of k-means with more methods for + initializing centroids. Uses maximum number of iterations as + opposed to a distortion threshold as its stopping criterion. """ __docformat__ = 'restructuredtext' @@ -580,10 +586,10 @@ centroids to generate. If minit initialization string is 'matrix', or if a ndarray is given instead, it is interpreted as initial cluster to use instead. - niter : int - Number of iterations of k-means to run. Note that this - differs in meaning from the iters parameter to the kmeans - function. + iter : int + Number of iterations of the k-means algrithm to run. Note + that this differs in meaning from the iters parameter to + the kmeans function. thresh : float (not used yet). minit : string From scipy-svn at scipy.org Sun Apr 27 09:16:47 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 08:16:47 -0500 (CDT) Subject: [Scipy-svn] r4192 - trunk/scipy/cluster Message-ID: <20080427131647.EE66739C130@new.scipy.org> Author: damian.eads Date: 2008-04-27 08:16:46 -0500 (Sun, 27 Apr 2008) New Revision: 4192 Modified: trunk/scipy/cluster/vq.py Log: Tightened language in vq's module summary docstring. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 13:06:16 UTC (rev 4191) +++ trunk/scipy/cluster/vq.py 2008-04-27 13:16:46 UTC (rev 4192) @@ -45,11 +45,15 @@ human face, more flesh tone colors would be represented in the code book. - All routines expect the observation vectors to be stored as rows - in the obs matrix. Similarly the centroids corresponding to the - codes are stored as rows of the code_book matrix. The i'th index - is the code corresponding to the code_book[i] centroid. + All routines expect obs to be a M by N array where the rows are + the observation vectors. The codebook is an k by N array where + the i'th row is the centroid of code word i. The observation + vectors and centroids have the same feature dimension. + corresponding to + the codes are stored as rows of the code_book matrix. The i'th + index is the code corresponding to the code_book[i] centroid. + whiten(obs) -- Normalize a group of observations so each feature has unit variance. From scipy-svn at scipy.org Sun Apr 27 09:18:38 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 08:18:38 -0500 (CDT) Subject: [Scipy-svn] r4193 - trunk/scipy/cluster Message-ID: <20080427131838.E71CB39C130@new.scipy.org> Author: damian.eads Date: 2008-04-27 08:18:37 -0500 (Sun, 27 Apr 2008) New Revision: 4193 Modified: trunk/scipy/cluster/vq.py Log: Tightened language in vq's module summary docstring. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 13:16:46 UTC (rev 4192) +++ trunk/scipy/cluster/vq.py 2008-04-27 13:18:37 UTC (rev 4193) @@ -46,14 +46,10 @@ code book. All routines expect obs to be a M by N array where the rows are - the observation vectors. The codebook is an k by N array where + the observation vectors. The codebook is a k by N array where the i'th row is the centroid of code word i. The observation vectors and centroids have the same feature dimension. - corresponding to - the codes are stored as rows of the code_book matrix. The i'th - index is the code corresponding to the code_book[i] centroid. - whiten(obs) -- Normalize a group of observations so each feature has unit variance. From scipy-svn at scipy.org Sun Apr 27 09:29:08 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 08:29:08 -0500 (CDT) Subject: [Scipy-svn] r4194 - trunk/scipy/cluster Message-ID: <20080427132908.26F9B39C0AD@new.scipy.org> Author: damian.eads Date: 2008-04-27 08:29:06 -0500 (Sun, 27 Apr 2008) New Revision: 4194 Modified: trunk/scipy/cluster/vq.py Log: Tightened the language of the kmeans docstring more. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-27 13:18:37 UTC (rev 4193) +++ trunk/scipy/cluster/vq.py 2008-04-27 13:29:06 UTC (rev 4194) @@ -18,7 +18,7 @@ step of the k-means algorithm refines the choices of centroids to reduce distortion. The change in distortion is often used as a stopping criterion: when the change is lower than a threshold, the - k-means algorithm is not making progress and terminates. + k-means algorithm is not making sufficient progress and terminates. Since vector quantization is a natural application for k-means, information theory terminology is often used. The centroid index @@ -391,31 +391,34 @@ return code_book, avg_dist[-1] def kmeans(obs, k_or_guess, iter=20, thresh=1e-5): - """Performs k-means on a set of observations for a specified number of - iterations. This yields a code book mapping centroids to codes + """Performs k-means on a set of observation vectors forming k + clusters. This yields a code book mapping centroids to codes and vice versa. The k-means algorithm adjusts the centroids - until the change in distortion caused by quantizing the - observation is less than some threshold. + until the sufficient progress cannot be made, i.e. the change + in distortion since the last iteration is less than some + threshold. :Parameters: obs : ndarray - Each row of the M by N array is an observation. The columns are the - "features" seen during each observation. The features must be - whitened first with the whiten function. + Each row of the M by N array is an observation vector. The + columns are the features seen during each observation. + The features must be whitened first with the whiten + function. + k_or_guess : int or ndarray - The number of centroids to generate. One code will be assigned - to each centroid, and it will be the row index in the code_book - matrix generated. + The number of centroids to generate. One code will be + assigned to each centroid, and it will be the row index in + the code_book matrix generated. - The initial k centroids will be chosen by randomly - selecting observations from the observation - matrix. Alternatively, passing a k by N array specifies - the initial values of the k means. + The initial k centroids are chosen by randomly selecting + observations from the observation matrix. Alternatively, + passing a k by N array specifies the initial values of the + k centroids. iter : int The number of times to run k-means, returning the codebook with the lowest distortion. This argument is ignored if - initial mean values are specified with an array for the + initial centroids are specified with an array for the k_or_guess paramter. This parameter does not represent the number of iterations of the k-means algorithm. @@ -436,8 +439,9 @@ centroids generated. :SeeAlso: - - kmeans2: similar function, but with more options for initialization, - and returns label of each observation + - kmeans2: a different implementation of k-means clustering + with more methods for generating initial centroids but without + using the distortion change threshold as a stopping criterion. - whiten: must be called prior to passing an observation matrix to kmeans. From scipy-svn at scipy.org Mon Apr 28 00:59:05 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Sun, 27 Apr 2008 23:59:05 -0500 (CDT) Subject: [Scipy-svn] r4195 - in trunk/scipy/interpolate: . tests Message-ID: <20080428045905.BB096C7C027@new.scipy.org> Author: peridot Date: 2008-04-27 23:59:03 -0500 (Sun, 27 Apr 2008) New Revision: 4195 Modified: trunk/scipy/interpolate/polyint.py trunk/scipy/interpolate/tests/test_polyint.py Log: Fix bug introduced in r4181; also PiecewisePolynomial now correctly distinguishes between scalar values and vectors of length 1. Modified: trunk/scipy/interpolate/polyint.py =================================================================== --- trunk/scipy/interpolate/polyint.py 2008-04-27 13:29:06 UTC (rev 4194) +++ trunk/scipy/interpolate/polyint.py 2008-04-28 04:59:03 UTC (rev 4195) @@ -432,16 +432,20 @@ derivatives needed is odd, it will prefer the rightmost endpoint. If not enough derivatives are available, an exception is raised. """ + yi0 = np.asarray(yi[0]) + if len(yi0.shape)==2: + self.vector_valued = True + self.r = yi0.shape[1] + elif len(yi0.shape)==1: + self.vector_valued = False + self.r = 1 + else: + raise ValueError, "Each derivative must be a vector, not a higher-rank array" + self.xi = [xi[0]] - self.yi = [yi[0]] + self.yi = [yi0] self.n = 1 - try: - self.r = len(yi[0][0]) - except TypeError: - self.r = 1 - - self.n = 1 self.direction = direction self.orders = [] self.polynomials = [] @@ -468,7 +472,11 @@ assert n2<=len(y2) xi = np.zeros(n) - yi = np.zeros((n,self.r)) + if self.vector_valued: + yi = np.zeros((n,self.r)) + else: + yi = np.zeros((n,)) + xi[:n1] = x1 yi[:n1] = y1[:n1] xi[n1:] = x2 @@ -488,19 +496,23 @@ a polynomial order, or instructions to use the highest possible order """ + + yi = np.asarray(yi) + if self.vector_valued: + if (len(yi.shape)!=2 or yi.shape[1]!=self.r): + raise ValueError, "Each derivative must be a vector of length %d" % self.r + else: + if len(yi.shape)!=1: + raise ValueError, "Each derivative must be a scalar" + if self.direction is None: self.direction = np.sign(xi-self.xi[-1]) elif (xi-self.xi[-1])*self.direction < 0: raise ValueError, "x coordinates must be in the %d direction: %s" % (self.direction, self.xi) + self.xi.append(xi) self.yi.append(yi) - for y in yi: - if np.shape(y) != (self.r,): - if self.r>1: - raise ValueError, "Each derivative must be a vector of length %d" % self.r - else: - raise ValueError, "Each derivative must be a scalar" if order is None: n1 = len(self.yi[-2]) @@ -558,7 +570,7 @@ x = np.asarray(x) m = len(x) pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) - if self.r>1: + if self.vector_valued: y = np.zeros((m,self.r)) else: y = np.zeros(m) @@ -611,7 +623,7 @@ x = np.asarray(x) m = len(x) pos = np.clip(np.searchsorted(self.xi, x) - 1, 0, self.n-2) - if self.r>1: + if self.vector_valued: y = np.zeros((der,m,self.r)) else: y = np.zeros((der,m)) Modified: trunk/scipy/interpolate/tests/test_polyint.py =================================================================== --- trunk/scipy/interpolate/tests/test_polyint.py 2008-04-27 13:29:06 UTC (rev 4194) +++ trunk/scipy/interpolate/tests/test_polyint.py 2008-04-28 04:59:03 UTC (rev 4195) @@ -219,6 +219,13 @@ assert_array_equal(np.shape(P([0])), (1,3)) assert_array_equal(np.shape(P([0,1])), (2,3)) + def test_shapes_vectorvalue_1d(self): + yi = np.multiply.outer(np.asarray(self.yi),np.arange(1)) + P = PiecewisePolynomial(self.xi,yi,4) + assert_array_equal(np.shape(P(0)), (1,)) + assert_array_equal(np.shape(P([0])), (1,1)) + assert_array_equal(np.shape(P([0,1])), (2,1)) + def test_shapes_vectorvalue_derivative(self): P = PiecewisePolynomial(self.xi,np.multiply.outer(self.yi,np.arange(3)),4) n = 4 From scipy-svn at scipy.org Mon Apr 28 16:23:29 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Mon, 28 Apr 2008 15:23:29 -0500 (CDT) Subject: [Scipy-svn] r4196 - trunk/scipy/cluster/src Message-ID: <20080428202329.1B53439C199@new.scipy.org> Author: damian.eads Date: 2008-04-28 15:23:26 -0500 (Mon, 28 Apr 2008) New Revision: 4196 Modified: trunk/scipy/cluster/src/hierarchy_wrap.c Log: Changed prefixed underscores in variable names to postfix underscores to improve backwards compatibility with gcc-3.4. Thanks to John Hunter for the fix. Modified: trunk/scipy/cluster/src/hierarchy_wrap.c =================================================================== --- trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-28 04:59:03 UTC (rev 4195) +++ trunk/scipy/cluster/src/hierarchy_wrap.c 2008-04-28 20:23:26 UTC (rev 4196) @@ -114,14 +114,14 @@ extern PyObject *calculate_cluster_sizes_wrap(PyObject *self, PyObject *args) { int n; - PyArrayObject *Z, *CS; + PyArrayObject *Z, *CS_; if (!PyArg_ParseTuple(args, "O!O!i", &PyArray_Type, &Z, - &PyArray_Type, &CS, + &PyArray_Type, &CS_, &n)) { return 0; } - calculate_cluster_sizes((const double*)Z->data, (double*)CS->data, n); + calculate_cluster_sizes((const double*)Z->data, (double*)CS_->data, n); return Py_BuildValue("d", 0.0); } @@ -333,113 +333,113 @@ } extern PyObject *dot_product_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_d1, *_d2; + PyArrayObject *d1_, *d2_; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_d1, - &PyArray_Type, &_d2)) { + &PyArray_Type, &d1_, + &PyArray_Type, &d2_)) { return 0; } - return Py_BuildValue("d", dot_product((const double*)_d1->data, - (const double*)_d2->data, - _d1->dimensions[0])); + return Py_BuildValue("d", dot_product((const double*)d1_->data, + (const double*)d2_->data, + d1_->dimensions[0])); } extern PyObject *to_squareform_from_vector_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_M, *_v; + PyArrayObject *M_, *v_; int n; const double *v; double *M; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_M, - &PyArray_Type, &_v)) { + &PyArray_Type, &M_, + &PyArray_Type, &v_)) { return 0; } else { - M = (double*)_M->data; - v = (const double*)_v->data; - n = _M->dimensions[0]; + M = (double*)M_->data; + v = (const double*)v_->data; + n = M_->dimensions[0]; dist_to_squareform_from_vector(M, v, n); } return Py_BuildValue("d", 0.0); } extern PyObject *to_vector_from_squareform_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_M, *_v; + PyArrayObject *M_, *v_; int n; double *v; const double *M; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_M, - &PyArray_Type, &_v)) { + &PyArray_Type, &M_, + &PyArray_Type, &v_)) { return 0; } else { - M = (const double*)_M->data; - v = (double*)_v->data; - n = _M->dimensions[0]; + M = (const double*)M_->data; + v = (double*)v_->data; + n = M_->dimensions[0]; dist_to_vector_from_squareform(M, v, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_euclidean_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_euclidean(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_canberra_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_canberra(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_bray_curtis_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_bray_curtis(X, dm, m, n); } return Py_BuildValue("d", 0.0); @@ -447,24 +447,24 @@ extern PyObject *pdist_mahalanobis_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_covinv, *_dm; + PyArrayObject *X_, *covinv_, *dm_; int m, n; double *dm; const double *X; const double *covinv; if (!PyArg_ParseTuple(args, "O!O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_covinv, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &covinv_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - covinv = (const double*)_covinv->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + covinv = (const double*)covinv_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_mahalanobis(X, covinv, dm, m, n); } return Py_BuildValue("d", 0.0); @@ -472,21 +472,21 @@ extern PyObject *pdist_chebyshev_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_chebyshev(X, dm, m, n); } return Py_BuildValue("d", 0.0); @@ -494,173 +494,173 @@ extern PyObject *pdist_cosine_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm, *_norms; + PyArrayObject *X_, *dm_, *norms_; int m, n; double *dm; const double *X, *norms; if (!PyArg_ParseTuple(args, "O!O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm, - &PyArray_Type, &_norms)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_, + &PyArray_Type, &norms_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - norms = (const double*)_norms->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + norms = (const double*)norms_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_cosine(X, dm, m, n, norms); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_seuclidean_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm, *_var; + PyArrayObject *X_, *dm_, *var_; int m, n; double *dm; const double *X, *var; if (!PyArg_ParseTuple(args, "O!O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_var, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &var_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (double*)_X->data; - dm = (double*)_dm->data; - var = (double*)_var->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (double*)X_->data; + dm = (double*)dm_->data; + var = (double*)var_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_seuclidean(X, var, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_city_block_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_city_block(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_hamming_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_hamming(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_hamming_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_hamming_bool(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_jaccard_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const double *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_jaccard(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_jaccard_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_jaccard_bool(X, dm, m, n); } return Py_BuildValue("d", 0.0); } extern PyObject *pdist_minkowski_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm, *X; double p; if (!PyArg_ParseTuple(args, "O!O!d", - &PyArray_Type, &_X, - &PyArray_Type, &_dm, + &PyArray_Type, &X_, + &PyArray_Type, &dm_, &p)) { return 0; } else { - X = (double*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (double*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_minkowski(X, dm, m, n, p); } return Py_BuildValue("d", 0.0); @@ -668,187 +668,187 @@ extern PyObject *pdist_yule_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_yule_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_matching_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_matching_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_dice_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_dice_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_rogerstanimoto_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_rogerstanimoto_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_russellrao_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_russellrao_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_kulsinski_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_kulsinski_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_sokalmichener_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_sokalmichener_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *pdist_sokalsneath_bool_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_X, *_dm; + PyArrayObject *X_, *dm_; int m, n; double *dm; const char *X; if (!PyArg_ParseTuple(args, "O!O!", - &PyArray_Type, &_X, - &PyArray_Type, &_dm)) { + &PyArray_Type, &X_, + &PyArray_Type, &dm_)) { return 0; } else { - X = (const char*)_X->data; - dm = (double*)_dm->data; - m = _X->dimensions[0]; - n = _X->dimensions[1]; - + X = (const char*)X_->data; + dm = (double*)dm_->data; + m = X_->dimensions[0]; + n = X_->dimensions[1]; + pdist_sokalsneath_bool(X, dm, m, n); } return Py_BuildValue(""); } extern PyObject *leaders_wrap(PyObject *self, PyObject *args) { - PyArrayObject *_Z, *_T, *_L, *_M; + PyArrayObject *Z_, *T_, *L_, *M_; int kk, n, res; if (!PyArg_ParseTuple(args, "O!O!O!O!ii", - &PyArray_Type, &_Z, - &PyArray_Type, &_T, - &PyArray_Type, &_L, - &PyArray_Type, &_M, + &PyArray_Type, &Z_, + &PyArray_Type, &T_, + &PyArray_Type, &L_, + &PyArray_Type, &M_, &kk, &n)) { return 0; } else { - res = leaders((double*)_Z->data, (int*)_T->data, - (int*)_L->data, (int*)_M->data, kk, n); + res = leaders((double*)Z_->data, (int*)T_->data, + (int*)L_->data, (int*)M_->data, kk, n); } return Py_BuildValue("i", res); } From scipy-svn at scipy.org Tue Apr 29 14:27:04 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 29 Apr 2008 13:27:04 -0500 (CDT) Subject: [Scipy-svn] r4197 - trunk/scipy/special/specfun Message-ID: <20080429182704.3BC4F39C553@new.scipy.org> Author: cookedm Date: 2008-04-29 13:27:02 -0500 (Tue, 29 Apr 2008) New Revision: 4197 Modified: trunk/scipy/special/specfun/specfun.f Log: scipy/special/specfun/specfun.f: Convert to UTF-8 I don't know what the previous encoding was. This just affects the comments. Modified: trunk/scipy/special/specfun/specfun.f =================================================================== --- trunk/scipy/special/specfun/specfun.f 2008-04-28 20:23:26 UTC (rev 4196) +++ trunk/scipy/special/specfun/specfun.f 2008-04-29 18:27:02 UTC (rev 4197) @@ -21,7 +21,7 @@ C Input: z --- complex argument of D(z) C n --- Order of D(z) (n = 0,-1,-2,...) C Output: CDN --- Dn(z) -C Routine called: GAIH for computing ?(x), x=n/2 (n=1,2,...) +C Routine called: GAIH for computing ??(x), x=n/2 (n=1,2,...) C =========================================================== C IMPLICIT DOUBLE PRECISION (A-B,D-H,O-Y) @@ -136,8 +136,8 @@ C Purpose: Compute the associated Legendre functions of the C second kind, Qmn(x) and Qmn'(x) C Input : x --- Argument of Qmn(x) -C m --- Order of Qmn(x) ( m = 0,1,2,??? ) -C n --- Degree of Qmn(x) ( n = 0,1,2,??? ) +C m --- Order of Qmn(x) ( m = 0,1,2,??? ) +C n --- Degree of Qmn(x) ( n = 0,1,2,??? ) C mm --- Physical dimension of QM and QD C Output: QM(m,n) --- Qmn(x) C QD(m,n) --- Qmn'(x) @@ -294,7 +294,7 @@ C Input: x --- Argument C va --- Order C Output: PV --- Vv(x) -C Routine called : GAMMA2 for computing ?(x) +C Routine called : GAMMA2 for computing ??(x) C =================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -345,7 +345,7 @@ C Purpose: Compute the zeros of Bessel functions Jn(x) and C Jn'(x), and arrange them in the order of their C magnitudes -C Input : NT --- Number of total zeros ( NT ? 1200 ) +C Input : NT --- Number of total zeros ( NT ??? 1200 ) C Output: ZO(L) --- Value of the L-th zero of Jn(x) C and Jn'(x) C N(L) --- n, order of Jn(x) or Jn'(x) associated @@ -866,16 +866,16 @@ C C ===================================================== C Purpose: Compute the initial characteristic value of -C Mathieu functions for m ? 12 or q ? 300 or -C q ? m*m +C Mathieu functions for m ??? 12 or q ??? 300 or +C q ??? m*m C Input : m --- Order of Mathieu functions C q --- Parameter of Mathieu functions C Output: A0 --- Characteristic value C Routines called: C (1) CVQM for computing initial characteristic -C value for q ? 3*m +C value for q ??? 3*m C (2) CVQL for computing initial characteristic -C value for q ? m*m +C value for q ??? m*m C ==================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -1033,7 +1033,7 @@ C C ===================================================== C Purpose: Compute the characteristic value of Mathieu -C functions for q ? m*m +C functions for q ??? m*m C Input : m --- Order of Mathieu functions C q --- Parameter of Mathieu functions C Output: A0 --- Initial characteristic value @@ -1054,7 +1054,7 @@ C C ======================================================== C Purpose: Compute the characteristic value of Mathieu -C functions for q ? 3m +C functions for q ??? 3m C Input : m --- Order of Mathieu functions C q --- Parameter of Mathieu functions C Output: A0 --- Initial characteristic value @@ -1246,10 +1246,10 @@ C C ========================================================== C Purpose: Integrate [1-J0(t)]/t with respect to t from 0 -C to x, and Y0(t)/t with respect to t from x to ? -C Input : x --- Variable in the limits ( x ? 0 ) +C to x, and Y0(t)/t with respect to t from x to ??? +C Input : x --- Variable in the limits ( x ??? 0 ) C Output: TTJ --- Integration of [1-J0(t)]/t from 0 to x -C TTY --- Integration of Y0(t)/t from x to ? +C TTY --- Integration of Y0(t)/t from x to ??? C ========================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -1302,10 +1302,10 @@ C C ========================================================= C Purpose: Integrate [1-J0(t)]/t with respect to t from 0 -C to x, and Y0(t)/t with respect to t from x to ? -C Input : x --- Variable in the limits ( x ? 0 ) +C to x, and Y0(t)/t with respect to t from x to ??? +C Input : x --- Variable in the limits ( x ??? 0 ) C Output: TTJ --- Integration of [1-J0(t)]/t from 0 to x -C TTY --- Integration of Y0(t)/t from x to ? +C TTY --- Integration of Y0(t)/t from x to ??? C ========================================================= C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -1601,9 +1601,9 @@ C (2) CV0 for finding initial characteristic C values using polynomial approximation C (3) CVQM for computing initial characteristic -C values for q ? 3*m +C values for q ??? 3*m C (3) CVQL for computing initial characteristic -C values for q ? m*m +C values for q ??? m*m C ====================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -1917,9 +1917,9 @@ SUBROUTINE GAM0 (X,GA) C C ================================================ -C Purpose: Compute gamma function ?(x) -C Input : x --- Argument of ?(x) ( |x| ? 1 ) -C Output: GA --- ?(x) +C Purpose: Compute gamma function ??(x) +C Input : x --- Argument of ??(x) ( |x| ??? 1 ) +C Output: GA --- ??(x) C ================================================ C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -1950,7 +1950,7 @@ C C ============================================= C Purpose: Compute cosine and sine integrals -C Si(x) and Ci(x) ( x ? 0 ) +C Si(x) and Ci(x) ( x ??? 0 ) C Input : x --- Argument of Ci(x) and Si(x) C Output: CI --- Ci(x) C SI --- Si(x) @@ -2050,7 +2050,7 @@ C C ============================================= C Purpose: Compute cosine and sine integrals -C Si(x) and Ci(x) ( x ? 0 ) +C Si(x) and Ci(x) ( x ??? 0 ) C Input : x --- Argument of Ci(x) and Si(x) C Output: CI --- Ci(x) C SI --- Si(x) @@ -2134,7 +2134,7 @@ C =========================================================== C Purpose: Evaluate the integral of modified Struve function C L0(t) with respect to t from 0 to x -C Input : x --- Upper limit ( x ? 0 ) +C Input : x --- Upper limit ( x ??? 0 ) C Output: TL0 --- Integration of L0(t) from 0 to x C =========================================================== C @@ -2186,7 +2186,7 @@ C C ================================================ C Purpose: Compute modified Struve function L1(x) -C Input : x --- Argument of L1(x) ( x ? 0 ) +C Input : x --- Argument of L1(x) ( x ??? 0 ) C Output: SL1 --- L1(x) C ================================================ C @@ -2291,7 +2291,7 @@ C C ================================================ C Purpose: Compute modified Struve function L0(x) -C Input : x --- Argument of L0(x) ( x ? 0 ) +C Input : x --- Argument of L0(x) ( x ??? 0 ) C Output: SL0 --- L0(x) C ================================================ C @@ -2551,10 +2551,10 @@ C Input : M --- Maximum order of Mathieu functions C q --- Parameter of Mathieu functions C KD --- Case code -C KD=1 for cem(x,q) ( m = 0,2,4,??? ) -C KD=2 for cem(x,q) ( m = 1,3,5,??? ) -C KD=3 for sem(x,q) ( m = 1,3,5,??? ) -C KD=4 for sem(x,q) ( m = 2,4,6,??? ) +C KD=1 for cem(x,q) ( m = 0,2,4,??? ) +C KD=2 for cem(x,q) ( m = 1,3,5,??? ) +C KD=3 for sem(x,q) ( m = 1,3,5,??? ) +C KD=4 for sem(x,q) ( m = 2,4,6,??? ) C Output: CV(I) --- Characteristic values; I = 1,2,3,... C For KD=1, CV(1), CV(2), CV(3),..., correspond to C the characteristic values of cem for m = 0,2,4,... @@ -2663,10 +2663,10 @@ C C ========================================================= C Purpose: Integrate [I0(t)-1]/t with respect to t from 0 -C to x, and K0(t)/t with respect to t from x to ? -C Input : x --- Variable in the limits ( x ? 0 ) +C to x, and K0(t)/t with respect to t from x to ??? +C Input : x --- Variable in the limits ( x ??? 0 ) C Output: TTI --- Integration of [I0(t)-1]/t from 0 to x -C TTK --- Integration of K0(t)/t from x to ? +C TTK --- Integration of K0(t)/t from x to ??? C ========================================================= C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -2719,7 +2719,7 @@ C ==================================================== C Purpose: Compute Legendre functions Qn(x) & Qn'(x) C Input : x --- Argument of Qn(x) -C n --- Degree of Qn(x) ( n = 0,1,2,???) +C n --- Degree of Qn(x) ( n = 0,1,2,???) C Output: QN(n) --- Qn(x) C QD(n) --- Qn'(x) C ==================================================== @@ -2828,10 +2828,10 @@ C C ========================================================= C Purpose: Integrate [I0(t)-1]/t with respect to t from 0 -C to x, and K0(t)/t with respect to t from x to ? -C Input : x --- Variable in the limits ( x ? 0 ) +C to x, and K0(t)/t with respect to t from x to ??? +C Input : x --- Variable in the limits ( x ??? 0 ) C Output: TTI --- Integration of [I0(t)-1]/t from 0 to x -C TTK --- Integration of K0(t)/t from x to ? +C TTK --- Integration of K0(t)/t from x to ??? C ========================================================= C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -2906,7 +2906,7 @@ C Routines called: C (1) MSTA1 and MSTA2 for computing the starting C point for backward recurrence -C (2) GAM0 for computing gamma function (|x| ? 1) +C (2) GAM0 for computing gamma function (|x| ??? 1) C ========================================================= C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -3039,7 +3039,7 @@ C x --- Argument ( x > 0 ) C Output: HU --- U(a,b,z) C ID --- Estimated number of significant digits -C Routine called: GAMMA2 for computing ?(x) +C Routine called: GAMMA2 for computing ??(x) C ====================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -3223,7 +3223,7 @@ C C ========================================================= C Purpose : Compute the zeros of Laguerre polynomial Ln(x) -C in the interval [0,?], and the corresponding +C in the interval [0,???], and the corresponding C weighting coefficients for Gauss-Laguerre C integration C Input : n --- Order of the Laguerre polynomial @@ -3283,7 +3283,7 @@ C Output: PV --- Vv(x) C Routines called: C (1) DVLA for computing Dv(x) for large |x| -C (2) GAMMA2 for computing ?(x) +C (2) GAMMA2 for computing ??(x) C =================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -3320,7 +3320,7 @@ C derivatives for a complex argument C Input : z --- Complex argument C v --- Order of Jv(z) and Yv(z) -C ( v = n+v0, n = 0,1,2,..., 0 ? v0 < 1 ) +C ( v = n+v0, n = 0,1,2,..., 0 ??? v0 < 1 ) C Output: CBJ(n) --- Jn+v0(z) C CDJ(n) --- Jn+v0'(z) C CBY(n) --- Yn+v0(z) @@ -3576,7 +3576,7 @@ C derivatives for a complex argument C Input : z --- Complex argument C v --- Order of Jv(z) and Yv(z) -C ( v = n+v0, n = 0,1,2,..., 0 ? v0 < 1 ) +C ( v = n+v0, n = 0,1,2,..., 0 ??? v0 < 1 ) C Output: CBJ(n) --- Jn+v0(z) C CDJ(n) --- Jn+v0'(z) C CBY(n) --- Yn+v0(z) @@ -3736,7 +3736,7 @@ C ======================================================= C Purpose: Compute Bessel functions J0(x), J1(x), Y0(x), C Y1(x), and their derivatives -C Input : x --- Argument of Jn(x) & Yn(x) ( x ? 0 ) +C Input : x --- Argument of Jn(x) & Yn(x) ( x ??? 0 ) C Output: BJ0 --- J0(x) C DJ0 --- J0'(x) C BJ1 --- J1(x) @@ -3862,13 +3862,13 @@ C C =================================================== C Purpose: Compute the incomplete gamma function -C r(a,x), ?(a,x) and P(a,x) -C Input : a --- Parameter ( a ? 170 ) +C r(a,x), ??(a,x) and P(a,x) +C Input : a --- Parameter ( a ??? 170 ) C x --- Argument C Output: GIN --- r(a,x) -C GIM --- ?(a,x) +C GIM --- ??(a,x) C GIP --- P(a,x) -C Routine called: GAMMA2 for computing ?(x) +C Routine called: GAMMA2 for computing ??(x) C =================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -3915,7 +3915,7 @@ C ======================================================= C Purpose: Integrate Bessel functions I0(t) and K0(t) C with respect to t from 0 to x -C Input : x --- Upper limit of the integral ( x ? 0 ) +C Input : x --- Upper limit of the integral ( x ??? 0 ) C Output: TI --- Integration of I0(t) from 0 to x C TK --- Integration of K0(t) from 0 to x C ======================================================= @@ -3980,7 +3980,7 @@ C ======================================================= C Purpose: Integrate modified Bessel functions I0(t) and C K0(t) with respect to t from 0 to x -C Input : x --- Upper limit of the integral ( x ? 0 ) +C Input : x --- Upper limit of the integral ( x ??? 0 ) C Output: TI --- Integration of I0(t) from 0 to x C TK --- Integration of K0(t) from 0 to x C ======================================================= @@ -4055,7 +4055,7 @@ C and their derivatives C Input : x --- Argument of Jv(x) and Yv(x) C v --- Order of Jv(x) and Yv(x) -C ( v = n+v0, 0 ? v0 < 1, n = 0,1,2,... ) +C ( v = n+v0, 0 ??? v0 < 1, n = 0,1,2,... ) C Output: BJ(n) --- Jn+v0(x) C DJ(n) --- Jn+v0'(x) C BY(n) --- Yn+v0(x) @@ -4245,7 +4245,7 @@ C ===================================================== C Purpose: Compute Bessel functions Jn(x), Yn(x) and C their derivatives -C Input : x --- Argument of Jn(x) and Yn(x) ( x ? 0 ) +C Input : x --- Argument of Jn(x) and Yn(x) ( x ??? 0 ) C n --- Order of Jn(x) and Yn(x) C Output: BJ(n) --- Jn(x) C DJ(n) --- Jn'(x) @@ -4363,7 +4363,7 @@ C C ============================================= C Purpose: Compute Struve function H1(x) -C Input : x --- Argument of H1(x) ( x ? 0 ) +C Input : x --- Argument of H1(x) ( x ??? 0 ) C Output: SH1 --- H1(x) C ============================================= C @@ -4529,7 +4529,7 @@ C ========================================================== C Purpose: Compute Bessel functions Jn(x) & Yn(x) and C their derivatives -C Input : x --- Argument of Jn(x) & Yn(x) ( x ? 0 ) +C Input : x --- Argument of Jn(x) & Yn(x) ( x ??? 0 ) C n --- Order of Jn(x) & Yn(x) C Output: BJ(n) --- Jn(x) C DJ(n) --- Jn'(x) @@ -4622,7 +4622,7 @@ C Output: DV(na) --- Dn+v0(x) C DP(na) --- Dn+v0'(x) C ( na = |n|, v0 = v-n, |v0| < 1, -C n = 0,?1,?2,??? ) +C n = 0,??1,??2,??? ) C PDF --- Dv(x) C PDD --- Dv'(x) C Routines called: @@ -4733,7 +4733,7 @@ C =================================================== C Purpose: Evaluate the integral of Struve function C H0(t) with respect to t from 0 and x -C Input : x --- Upper limit ( x ? 0 ) +C Input : x --- Upper limit ( x ??? 0 ) C Output: TH0 --- Integration of H0(t) from 0 and x C =================================================== C @@ -4840,10 +4840,10 @@ SUBROUTINE GAMMA2(X,GA) C C ================================================== -C Purpose: Compute gamma function ?(x) -C Input : x --- Argument of ?(x) -C ( x is not equal to 0,-1,-2,???) -C Output: GA --- ?(x) +C Purpose: Compute gamma function ??(x) +C Input : x --- Argument of ??(x) +C ( x is not equal to 0,-1,-2,???) +C Output: GA --- ??(x) C ================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -5058,7 +5058,7 @@ C ================================================== C Purpose: Compute complete elliptic integrals K(k) C and E(k) -C Input : K --- Modulus k ( 0 ? k ? 1 ) +C Input : K --- Modulus k ( 0 ??? k ??? 1 ) C Output : CK --- K(k) C CE --- E(k) C ================================================== @@ -5092,7 +5092,7 @@ C Purpose: Compute the incomplete beta function Ix(a,b) C Input : a --- Parameter C b --- Parameter -C x --- Argument ( 0 ? x ? 1 ) +C x --- Argument ( 0 ??? x ??? 1 ) C Output: BIX --- Ix(a,b) C Routine called: BETA for computing beta function B(p,q) C ======================================================== @@ -5397,7 +5397,7 @@ C ================================================== C Purpose: Compute complete and incomplete elliptic C integrals F(k,phi) and E(k,phi) -C Input : HK --- Modulus k ( 0 ? k ? 1 ) +C Input : HK --- Modulus k ( 0 ??? k ??? 1 ) C Phi --- Argument ( in degrees ) C Output : FE --- F(k,phi) C EE --- E(k,phi) @@ -5455,8 +5455,8 @@ C Purpose: Compute the elliptic integral of the third kind C using Gauss-Legendre quadrature C Input : Phi --- Argument ( in degrees ) -C k --- Modulus ( 0 ? k ? 1.0 ) -C c --- Parameter ( 0 ? c ? 1.0 ) +C k --- Modulus ( 0 ??? k ??? 1.0 ) +C c --- Parameter ( 0 ??? c ??? 1.0 ) C Output: EL3 --- Value of the elliptic integral of the C third kind C ========================================================= @@ -5576,7 +5576,7 @@ C b --- Parameter ( b <> 0,-1,-2,... ) C x --- Argument C Output: HG --- M(a,b,x) -C Routine called: GAMMA2 for computing ?(x) +C Routine called: GAMMA2 for computing ??(x) C =================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -5672,7 +5672,7 @@ C C ============================================= C Purpose: Compute Struve function H0(x) -C Input : x --- Argument of H0(x) ( x ? 0 ) +C Input : x --- Argument of H0(x) ( x ??? 0 ) C Output: SH0 --- H0(x) C ============================================= C @@ -6322,7 +6322,7 @@ C C ====================================================== C Purpose: Compute the integrals of Airy fnctions with -C respect to t from 0 and x ( x ? 0 ) +C respect to t from 0 and x ( x ??? 0 ) C Input : x --- Upper limit of the integral C Output : APT --- Integration of Ai(t) from 0 and x C BPT --- Integration of Bi(t) from 0 and x @@ -6427,7 +6427,7 @@ C ======================================================== C Purpose: Compute modified Bessel functions In(x) and C Kn(x), and their derivatives -C Input: x --- Argument of In(x) and Kn(x) ( x ? 0 ) +C Input: x --- Argument of In(x) and Kn(x) ( x ??? 0 ) C n --- Order of In(x) and Kn(x) C Output: BI(n) --- In(x) C DI(n) --- In'(x) @@ -6796,7 +6796,7 @@ C ============================================================ C Purpose: Compute modified Bessel functions In(x) and Kn(x), C and their derivatives -C Input: x --- Argument of In(x) and Kn(x) ( 0 ? x ? 700 ) +C Input: x --- Argument of In(x) and Kn(x) ( 0 ??? x ??? 700 ) C n --- Order of In(x) and Kn(x) C Output: BI(n) --- In(x) C DI(n) --- In'(x) @@ -6949,7 +6949,7 @@ C C =============================================================== C Purpose: Compute Mathieu functions cem(x,q) and sem(x,q) -C and their derivatives ( q ? 0 ) +C and their derivatives ( q ??? 0 ) C Input : KF --- Function code C KF=1 for computing cem(x,q) and cem'(x,q) C KF=2 for computing sem(x,q) and sem'(x,q) @@ -7162,20 +7162,20 @@ SUBROUTINE FFK(KS,X,FR,FI,FM,FA,GR,GI,GM,GA) C C ======================================================= -C Purpose: Compute modified Fresnel integrals F?(x) -C and K?(x) -C Input : x --- Argument of F?(x) and K?(x) +C Purpose: Compute modified Fresnel integrals F??(x) +C and K??(x) +C Input : x --- Argument of F??(x) and K??(x) C KS --- Sign code C KS=0 for calculating F+(x) and K+(x) C KS=1 for calculating F_(x) and K_(x) -C Output: FR --- Re[F?(x)] -C FI --- Im[F?(x)] -C FM --- |F?(x)| -C FA --- Arg[F?(x)] (Degs.) -C GR --- Re[K?(x)] -C GI --- Im[K?(x)] -C GM --- |K?(x)| -C GA --- Arg[K?(x)] (Degs.) +C Output: FR --- Re[F??(x)] +C FI --- Im[F??(x)] +C FM --- |F??(x)| +C FA --- Arg[F??(x)] (Degs.) +C GR --- Re[K??(x)] +C GI --- Im[K??(x)] +C GM --- |K??(x)| +C GA --- Arg[K??(x)] (Degs.) C ====================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -7616,7 +7616,7 @@ C Purpose: Compute complex parabolic cylinder function Dn(z) C for large argument C Input: z --- Complex argument of Dn(z) -C n --- Order of Dn(z) (n = 0,?1,?2,???) +C n --- Order of Dn(z) (n = 0,??1,??2,???) C Output: CDN --- Dn(z) C =========================================================== C @@ -7730,7 +7730,7 @@ C Purpose: Compute the associated Legendre function C Pmv(x) with an integer order and an arbitrary C nonnegative degree v -C Input : x --- Argument of Pm(x) ( -1 ? x ? 1 ) +C Input : x --- Argument of Pm(x) ( -1 ??? x ??? 1 ) C m --- Order of Pmv(x) C v --- Degree of Pmv(x) C Output: PMV --- Pmv(x) @@ -7826,15 +7826,15 @@ SUBROUTINE CGAMA(X,Y,KF,GR,GI) C C ========================================================= -C Purpose: Compute the gamma function ?(z) or ln[?(z)] +C Purpose: Compute the gamma function ??(z) or ln[??(z)] C for a complex argument C Input : x --- Real part of z C y --- Imaginary part of z C KF --- Function code -C KF=0 for ln[?(z)] -C KF=1 for ?(z) -C Output: GR --- Real part of ln[?(z)] or ?(z) -C GI --- Imaginary part of ln[?(z)] or ?(z) +C KF=0 for ln[??(z)] +C KF=1 for ??(z) +C Output: GR --- Real part of ln[??(z)] or ??(z) +C GI --- Imaginary part of ln[??(z)] or ??(z) C ======================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -8010,7 +8010,7 @@ C =========================================================== C Purpose: Evaluate the integral H0(t)/t with respect to t C from x to infinity -C Input : x --- Lower limit ( x ? 0 ) +C Input : x --- Lower limit ( x ??? 0 ) C Output: TTH --- Integration of H0(t)/t from x to infinity C =========================================================== C @@ -8049,11 +8049,11 @@ SUBROUTINE LGAMA(KF,X,GL) C C ================================================== -C Purpose: Compute gamma function ?(x) or ln[?(x)] -C Input: x --- Argument of ?(x) ( x > 0 ) +C Purpose: Compute gamma function ??(x) or ln[??(x)] +C Input: x --- Argument of ??(x) ( x > 0 ) C KF --- Function code -C KF=1 for ?(x); KF=0 for ln[?(x)] -C Output: GL --- ?(x) or ln[?(x)] +C KF=1 for ??(x); KF=0 for ln[??(x)] +C Output: GL --- ??(x) or ln[??(x)] C ================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -8093,8 +8093,8 @@ C C ===================================================== C Purpose: Compute Legendre functions Qn(x) and Qn'(x) -C Input : x --- Argument of Qn(x) ( -1 ? x ? 1 ) -C n --- Degree of Qn(x) ( n = 0,1,2,??? ) +C Input : x --- Argument of Qn(x) ( -1 ??? x ??? 1 ) +C n --- Degree of Qn(x) ( n = 0,1,2,??? ) C Output: QN(n) --- Qn(x) C QD(n) --- Qn'(x) C ( 1.0D+300 stands for infinity ) @@ -8136,7 +8136,7 @@ C Output: PD --- Dv(x) C Routines called: C (1) VVLA for computing Vv(x) for large |x| -C (2) GAMMA2 for computing ?(x) +C (2) GAMMA2 for computing ??(x) C ==================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -8170,7 +8170,7 @@ C ========================================================= C Purpose: Compute modified Bessel functions I0(x), I1(1), C K0(x) and K1(x), and their derivatives -C Input : x --- Argument ( x ? 0 ) +C Input : x --- Argument ( x ??? 0 ) C Output: BI0 --- I0(x) C DI0 --- I0'(x) C BI1 --- I1(x) @@ -8280,7 +8280,7 @@ C Purpose: Compute the parabolic cylinder functions C Dn(z) and Dn'(z) for a complex argument C Input: z --- Complex argument of Dn(z) -C n --- Order of Dn(z) ( n=0,?1,?2,??? ) +C n --- Order of Dn(z) ( n=0,??1,??2,??? ) C Output: CPB(|n|) --- Dn(z) C CPD(|n|) --- Dn'(z) C Routines called: @@ -8373,7 +8373,7 @@ C ========================================================= C Purpose: Compute modified Bessel functions I0(x), I1(1), C K0(x) and K1(x), and their derivatives -C Input : x --- Argument ( x ? 0 ) +C Input : x --- Argument ( x ??? 0 ) C Output: BI0 --- I0(x) C DI0 --- I0'(x) C BI1 --- I1(x) @@ -8450,7 +8450,7 @@ C Input : p --- Parameter ( p > 0 ) C q --- Parameter ( q > 0 ) C Output: BT --- B(p,q) -C Routine called: GAMMA2 for computing ?(x) +C Routine called: GAMMA2 for computing ??(x) C ========================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -8755,10 +8755,10 @@ SUBROUTINE PBWA(A,X,W1F,W1D,W2F,W2D) C C ====================================================== -C Purpose: Compute parabolic cylinder functions W(a,?x) +C Purpose: Compute parabolic cylinder functions W(a,??x) C and their derivatives -C Input : a --- Parameter ( 0 ? |a| ? 5 ) -C x --- Argument of W(a,?x) ( 0 ? |x| ? 5 ) +C Input : a --- Parameter ( 0 ??? |a| ??? 5 ) +C x --- Argument of W(a,??x) ( 0 ??? |x| ??? 5 ) C Output : W1F --- W(a,x) C W1D --- W'(a,x) C W2F --- W(a,-x) @@ -8963,7 +8963,7 @@ C Input: x --- Argument C va --- Order C Output: PD --- Dv(x) -C Routine called: GAMMA2 for computing ?(x) +C Routine called: GAMMA2 for computing ??(x) C =================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -9050,7 +9050,7 @@ C C ======================================================= C Purpose: Integrate Bessel functions J0(t) and Y0(t) -C with respect to t from 0 to x ( x ? 0 ) +C with respect to t from 0 to x ( x ??? 0 ) C Input : x --- Upper limit of the integral C Output: TJ --- Integration of J0(t) from 0 to x C TY --- Integration of Y0(t) from 0 to x @@ -9264,8 +9264,8 @@ C ====================================================== C Purpose: Compute modified Struve function Lv(x) with C an arbitrary order v -C Input : v --- Order of Lv(x) ( |v| ? 20 ) -C x --- Argument of Lv(x) ( x ? 0 ) +C Input : v --- Order of Lv(x) ( |v| ??? 20 ) +C x --- Argument of Lv(x) ( x ??? 0 ) C Output: SLV --- Lv(x) C Routine called: GAMMA2 to compute the gamma function C ====================================================== @@ -9353,8 +9353,8 @@ C kind and their derivatives C Input: x --- Argument of Riccati-Bessel function C n --- Order of yn(x) -C Output: RY(n) --- x?yn(x) -C DY(n) --- [x?yn(x)]' +C Output: RY(n) --- x??yn(x) +C DY(n) --- [x??yn(x)]' C NM --- Highest order computed C ======================================================== C @@ -9598,14 +9598,14 @@ C C ====================================================== C Purpose: Compute confluent hypergeometric function -C U(a,b,x) with integer b ( b = ?1,?2,... ) +C U(a,b,x) with integer b ( b = ??1,??2,... ) C Input : a --- Parameter C b --- Parameter C x --- Argument C Output: HU --- U(a,b,x) C ID --- Estimated number of significant digits C Routines called: -C (1) GAMMA2 for computing gamma function ?(x) +C (1) GAMMA2 for computing gamma function ??(x) C (2) PSI_SPEC for computing psi function C ====================================================== C @@ -10052,8 +10052,8 @@ C C ===================================================== C Purpose: Compute Bessel functions Jn(x) and their -C first and second derivatives ( n= 0,1,??? ) -C Input: x --- Argument of Jn(x) ( x ? 0 ) +C first and second derivatives ( n= 0,1,??? ) +C Input: x --- Argument of Jn(x) ( x ??? 0 ) C n --- Order of Jn(x) C Output: BJ(n+1) --- Jn(x) C DJ(n+1) --- Jn'(x) @@ -10097,7 +10097,7 @@ C Purpose: Compute spherical Bessel functions jn(x) and C their derivatives C Input : x --- Argument of jn(x) -C n --- Order of jn(x) ( n = 0,1,??? ) +C n --- Order of jn(x) ( n = 0,1,??? ) C Output: SJ(n) --- jn(x) C DJ(n) --- jn'(x) C NM --- Highest order computed @@ -10289,7 +10289,7 @@ C Input : m --- Mode parameter, m = 0,1,2,... C n --- Mode parameter, n = m,m+1,m+2,... C c --- Spheroidal parameter -C x --- Argument (x ? 0) +C x --- Argument (x ??? 0) C cv --- Characteristic value C KF --- Function code C KF=1 for the first kind @@ -10404,7 +10404,7 @@ C ====================================================== C Purpose: Compute the zeros of Bessel functions Jn(x), C Yn(x), and their derivatives -C Input : n --- Order of Bessel functions ( n ? 101 ) +C Input : n --- Order of Bessel functions ( n ??? 101 ) C NT --- Number of zeros (roots) C Output: RJ0(L) --- L-th zero of Jn(x), L=1,2,...,NT C RJ1(L) --- L-th zero of Jn'(x), L=1,2,...,NT @@ -10485,9 +10485,9 @@ C ======================================================= C Purpose: Compute modified Bessel functions Iv(x) and C Kv(x), and their derivatives -C Input : x --- Argument ( x ? 0 ) +C Input : x --- Argument ( x ??? 0 ) C v --- Order of Iv(x) and Kv(x) -C ( v = n+v0, n = 0,1,2,..., 0 ? v0 < 1 ) +C ( v = n+v0, n = 0,1,2,..., 0 ??? v0 < 1 ) C Output: BI(n) --- In+v0(x) C DI(n) --- In+v0'(x) C BK(n) --- Kn+v0(x) @@ -10759,7 +10759,7 @@ C and modified Bessel functions Iv(x) and C Kv(x), and their derivatives with v=1/3,2/3 C Input : x --- Argument of Jv(x),Yv(x),Iv(x) and -C Kv(x) ( x ? 0 ) +C Kv(x) ( x ??? 0 ) C Output: VJ1 --- J1/3(x) C VJ2 --- J2/3(x) C VY1 --- Y1/3(x) @@ -10930,7 +10930,7 @@ C complex argument C Input : z --- Complex argument z C v --- Real order of Iv(z) and Kv(z) -C ( v =n+v0, n = 0,1,2,..., 0 ? v0 < 1 ) +C ( v =n+v0, n = 0,1,2,..., 0 ??? v0 < 1 ) C Output: CBI(n) --- In+v0(z) C CDI(n) --- In+v0'(z) C CBK(n) --- Kn+v0(z) @@ -11091,7 +11091,7 @@ C complex argument C Input : z --- Complex argument C v --- Real order of Iv(z) and Kv(z) -C ( v = n+v0, n = 0,1,2,???, 0 ? v0 < 1 ) +C ( v = n+v0, n = 0,1,2,???, 0 ??? v0 < 1 ) C Output: CBI(n) --- In+v0(z) C CDI(n) --- In+v0'(z) C CBK(n) --- Kn+v0(z) @@ -11401,8 +11401,8 @@ C kind and their derivatives C Input: x --- Argument of Riccati-Bessel function C n --- Order of jn(x) ( n = 0,1,2,... ) -C Output: RJ(n) --- x?jn(x) -C DJ(n) --- [x?jn(x)]' +C Output: RJ(n) --- x??jn(x) +C DJ(n) --- [x??jn(x)]' C NM --- Highest order computed C Routines called: C MSTA1 and MSTA2 for computing the starting @@ -11458,7 +11458,7 @@ C C ======================================================== C Purpose : Compute the zeros of Hermite polynomial Ln(x) -C in the interval [-?,?], and the corresponding +C in the interval [-???,???], and the corresponding C weighting coefficients for Gauss-Hermite C integration C Input : n --- Order of the Hermite polynomial @@ -11528,7 +11528,7 @@ C ======================================================= C Purpose: Compute Bessel functions J0(x), J1(x), Y0(x), C Y1(x), and their derivatives -C Input : x --- Argument of Jn(x) & Yn(x) ( x ? 0 ) +C Input : x --- Argument of Jn(x) & Yn(x) ( x ??? 0 ) C Output: BJ0 --- J0(x) C DJ0 --- J0'(x) C BJ1 --- J1(x) @@ -11661,7 +11661,7 @@ C ===================================================== C Purpose: Compute modified spherical Bessel functions C of the second kind, kn(x) and kn'(x) -C Input : x --- Argument of kn(x) ( x ? 0 ) +C Input : x --- Argument of kn(x) ( x ??? 0 ) C n --- Order of kn(x) ( n = 0,1,2,... ) C Output: SK(n) --- kn(x) C DK(n) --- kn'(x) @@ -11701,7 +11701,7 @@ C C ============================================ C Purpose: Compute exponential integral En(x) -C Input : x --- Argument of En(x) ( x ? 20 ) +C Input : x --- Argument of En(x) ( x ??? 20 ) C n --- Order of En(x) C Output: EN(n) --- En(x) C Routine called: E1XB for computing E1(x) @@ -11726,9 +11726,9 @@ SUBROUTINE GAIH(X,GA) C C ===================================================== -C Purpose: Compute gamma function ?(x) -C Input : x --- Argument of ?(x), x = n/2, n=1,2,??? -C Output: GA --- ?(x) +C Purpose: Compute gamma function ??(x) +C Input : x --- Argument of ??(x), x = n/2, n=1,2,??? +C Output: GA --- ??(x) C ===================================================== C IMPLICIT DOUBLE PRECISION (A-H,O-Z) @@ -11759,7 +11759,7 @@ C Output: VV(na) --- Vv(x) C VP(na) --- Vv'(x) C ( na = |n|, v = n+v0, |v0| < 1 -C n = 0,?1,?2,??? ) +C n = 0,??1,??2,??? ) C PVF --- Vv(x) C PVD --- Vv'(x) C Routines called: @@ -11881,8 +11881,8 @@ C complex argument C Input : x --- Real part of z C y --- Imaginary part of z -C m --- Order of Qmn(z) ( m = 0,1,2,??? ) -C n --- Degree of Qmn(z) ( n = 0,1,2,??? ) +C m --- Order of Qmn(z) ( m = 0,1,2,??? ) +C n --- Degree of Qmn(z) ( n = 0,1,2,??? ) C mm --- Physical dimension of CQM and CQD C Output: CQM(m,n) --- Qmn(z) C CQD(m,n) --- Qmn'(z) @@ -12270,7 +12270,7 @@ C KC=3 for computing both the first C and second kinds C m --- Order of Mathieu functions -C q --- Parameter of Mathieu functions ( q ? 0 ) +C q --- Parameter of Mathieu functions ( q ??? 0 ) C x --- Argument of Mathieu functions C Output: F1R --- Mcm(1)(x,q) or Msm(1)(x,q) C D1R --- Derivative of Mcm(1)(x,q) or Msm(1)(x,q) @@ -12575,8 +12575,8 @@ C ====================================================== C Purpose: Compute spherical Bessel functions yn(x) and C their derivatives -C Input : x --- Argument of yn(x) ( x ? 0 ) -C n --- Order of yn(x) ( n = 0,1,??? ) +C Input : x --- Argument of yn(x) ( x ??? 0 ) +C n --- Order of yn(x) ( n = 0,1,??? ) C Output: SY(n) --- yn(x) C DY(n) --- yn'(x) C NM --- Highest order computed @@ -12621,7 +12621,7 @@ C Purpose: Compute Jacobian elliptic functions sn u, cn u C and dn u C Input : u --- Argument of Jacobian elliptic fuctions -C Hk --- Modulus k ( 0 ? k ? 1 ) +C Hk --- Modulus k ( 0 ??? k ??? 1 ) C Output : ESN --- sn u C ECN --- cn u C EDN --- dn u @@ -12662,8 +12662,8 @@ C ===================================================== C Purpose: Compute Struve function Hv(x) with an C arbitrary order v -C Input : v --- Order of Hv(x) ( -8.0 ? v ? 12.5 ) -C x --- Argument of Hv(x) ( x ? 0 ) +C Input : v --- Order of Hv(x) ( -8.0 ??? v ??? 12.5 ) +C x --- Argument of Hv(x) ( x ??? 0 ) C Output: HV --- Hv(x) C Routine called: GAMMA2 to compute the gamma function C ===================================================== From scipy-svn at scipy.org Tue Apr 29 19:14:01 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 29 Apr 2008 18:14:01 -0500 (CDT) Subject: [Scipy-svn] r4198 - trunk/scipy/cluster Message-ID: <20080429231401.3547239C2A6@new.scipy.org> Author: damian.eads Date: 2008-04-29 18:13:58 -0500 (Tue, 29 Apr 2008) New Revision: 4198 Modified: trunk/scipy/cluster/vq.py Log: More grammar and usage edits to vq.py documentation. Thanks to Karen Glocer for her help doing a pass. Modified: trunk/scipy/cluster/vq.py =================================================================== --- trunk/scipy/cluster/vq.py 2008-04-29 18:27:02 UTC (rev 4197) +++ trunk/scipy/cluster/vq.py 2008-04-29 23:13:58 UTC (rev 4198) @@ -5,20 +5,21 @@ centroids in a code book. The k-means algorithm takes as input the number of clusters to - generate k and a set of observation vectors to cluster. It - returns as its model a set of centroids, one for each of the k - clusters. An observation vector is classified with the cluster - number or centroid index of the centroid closest to it. + generate, k, and a set of observation vectors to cluster. It + returns a set of centroids, one for each of the k clusters. An + observation vector is classified with the cluster number or + centroid index of the centroid closest to it. A vector v belongs to cluster i if it is closer to centroid i than - the other centroids. If v belongs to i, we say centroid i is the + any other centroids. If v belongs to i, we say centroid i is the dominating centroid of v. Common variants of k-means try to minimize distortion, which is defined as the sum of the distances between each observation vector and its dominating centroid. Each step of the k-means algorithm refines the choices of centroids to reduce distortion. The change in distortion is often used as a stopping criterion: when the change is lower than a threshold, the - k-means algorithm is not making sufficient progress and terminates. + k-means algorithm is not making sufficient progress and + terminates. Since vector quantization is a natural application for k-means, information theory terminology is often used. The centroid index @@ -31,7 +32,7 @@ For example, suppose we wish to compress a 24-bit color image (each pixel is represented by one byte for red, one for blue, and one for green) before sending it over the web. By using a smaller - 8-bit encoding, we can reduce the data to send by two + 8-bit encoding, we can reduce the amount of data by two thirds. Ideally, the colors for each of the 256 possible 8-bit encoding values should be chosen to minimize distortion of the color. Running k-means with k=256 generates a code book of 256 @@ -46,9 +47,9 @@ code book. All routines expect obs to be a M by N array where the rows are - the observation vectors. The codebook is a k by N array where - the i'th row is the centroid of code word i. The observation - vectors and centroids have the same feature dimension. + the observation vectors. The codebook is a k by N array where the + i'th row is the centroid of code word i. The observation vectors + and centroids have the same feature dimension. whiten(obs) -- Normalize a group of observations so each feature has unit @@ -135,7 +136,7 @@ """ Vector Quantization: assign codes from a code book to observations. Assigns a code from a code book to each observation. Each - observation vector in the MxN obs array is compared with the + observation vector in the M by N obs array is compared with the centroids in the code book and assigned the code of the closest centroid. @@ -303,9 +304,10 @@ features (eg columns) than obs. :Note: - This could be faster when number of codebooks is small, but it becomes - a real memory hog when codebook is large. It requires NxMxO storage - where N=number of obs, M = number of features, and O = number of codes. + This could be faster when number of codebooks is small, but it + becomes a real memory hog when codebook is large. It requires + N by M by O storage where N=number of obs, M = number of + features, and O = number of codes. :Returns: code : ndarray @@ -394,8 +396,8 @@ """Performs k-means on a set of observation vectors forming k clusters. This yields a code book mapping centroids to codes and vice versa. The k-means algorithm adjusts the centroids - until the sufficient progress cannot be made, i.e. the change - in distortion since the last iteration is less than some + until sufficient progress cannot be made, i.e. the change in + distortion since the last iteration is less than some threshold. :Parameters: @@ -406,14 +408,13 @@ function. k_or_guess : int or ndarray - The number of centroids to generate. One code will be - assigned to each centroid, and it will be the row index in - the code_book matrix generated. + The number of centroids to generate. A code is assigned to + each centroid, which is also the row index of the centroid + in the code_book matrix generated. The initial k centroids are chosen by randomly selecting observations from the observation matrix. Alternatively, - passing a k by N array specifies the initial values of the - k centroids. + passing a k by N array specifies the initial k centroids. iter : int The number of times to run k-means, returning the codebook @@ -432,7 +433,7 @@ A k by N array of k centroids. The i'th centroid codebook[i] is represented with the code i. The centroids and codes generated represent the lowest distortion seen, - not necessarily the global minimum distortion. + not necessarily the globally minimal distortion. distortion : float The distortion between the observations passed and the @@ -441,7 +442,7 @@ :SeeAlso: - kmeans2: a different implementation of k-means clustering with more methods for generating initial centroids but without - using the distortion change threshold as a stopping criterion. + using a distortion change threshold as a stopping criterion. - whiten: must be called prior to passing an observation matrix to kmeans. From scipy-svn at scipy.org Tue Apr 29 21:41:34 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 29 Apr 2008 20:41:34 -0500 (CDT) Subject: [Scipy-svn] r4199 - trunk/scipy/ndimage/src/register Message-ID: <20080430014134.9535F39C080@new.scipy.org> Author: tom.waite Date: 2008-04-29 20:41:32 -0500 (Tue, 29 Apr 2008) New Revision: 4199 Modified: trunk/scipy/ndimage/src/register/Register_EXT.c Log: added mask coordinates for resampling Modified: trunk/scipy/ndimage/src/register/Register_EXT.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-29 23:13:58 UTC (rev 4198) +++ trunk/scipy/ndimage/src/register/Register_EXT.c 2008-04-30 01:41:32 UTC (rev 4199) @@ -420,8 +420,57 @@ } +static PyObject *Register_Find_Mask(PyObject *self, PyObject *args) +{ -static PyObject *Register_ResampleWGradientWCoords(PyObject *self, PyObject *args) + int i; + int num; + int length; + double *X; + double *Y; + double *Z; + int *xLims; + int *yLims; + int *zLims; + int *mask; + PyObject *MArray = NULL; + PyObject *XArray = NULL; + PyObject *YArray = NULL; + PyObject *ZArray = NULL; + PyObject *XLimits = NULL; + PyObject *YLimits = NULL; + PyObject *ZLimits = NULL; + + if(!PyArg_ParseTuple(args, "OOOOOOO", &MArray, &XArray, &YArray, &ZArray, &XLimits, &YLimits, &ZLimits)) + goto exit; + + num = PyArray_SIZE(XArray); + X = (double *)PyArray_DATA(XArray); + Y = (double *)PyArray_DATA(YArray); + Z = (double *)PyArray_DATA(ZArray); + mask = (int *)PyArray_DATA(MArray); + xLims = (int *)PyArray_DATA(XLimits); + yLims = (int *)PyArray_DATA(YLimits); + zLims = (int *)PyArray_DATA(ZLimits); + + for(length = 0, i = 0; i < num; ++i){ + if( ((X[i] >= xLims[0]) && (X[i] <= xLims[1])) && + ((Y[i] >= yLims[0]) && (Y[i] <= yLims[1])) && + ((Z[i] >= zLims[0]) && (Z[i] <= zLims[1])) ){ + mask[length++] = i; + } + } + + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue("i", length); + +} + + + +static PyObject *Register_Resample_Gradient_Coords(PyObject *self, PyObject *args) { int num; @@ -429,18 +478,15 @@ int nd; int type; int itype; - int nd_rotmatrix; int nd_S; npy_intp *dimsScale; npy_intp *dimsOffset; npy_intp *dimsS; npy_intp *dimsD; - npy_intp *dims_rotmatrix; npy_intp *dims_S; npy_intp *dims_Coords; unsigned char *imageS; unsigned char *imageD; - double *M; double *X; double *Y; double *Z; @@ -452,7 +498,6 @@ double *gradientZ; PyObject *imgArrayS = NULL; PyObject *imgArrayD = NULL; - PyObject *rotArray = NULL; PyObject *SArray = NULL; PyObject *scaleArray = NULL; PyObject *offsetArray = NULL; @@ -463,9 +508,9 @@ PyObject *coordYArray = NULL; PyObject *coordZArray = NULL; - if(!PyArg_ParseTuple(args, "OOOOOOOOOOOO", &coordZArray, &coordYArray, &coordXArray, - &imgArrayS, &imgArrayD, &rotArray, &SArray, &scaleArray, - &offsetArray, &gradXArray, &gradYArray, &gradZArray)) + if(!PyArg_ParseTuple(args, "OOOOOOOOOOO", &coordZArray, &coordYArray, &coordXArray, + &imgArrayS, &imgArrayD, &SArray, &scaleArray, &offsetArray, + &gradXArray, &gradYArray, &gradZArray)) goto exit; /* check in the Python code that S and D are the same dims, type */ @@ -478,10 +523,6 @@ type = PyArray_TYPE(imgArrayS); num = PyArray_SIZE(imgArrayS); - M = (double *)PyArray_DATA(rotArray); - nd_rotmatrix = PyArray_NDIM(rotArray); - dims_rotmatrix = PyArray_DIMS(rotArray); - S = (int *)PyArray_DATA(SArray); nd_S = PyArray_NDIM(SArray); dims_S = PyArray_DIMS(SArray); @@ -502,9 +543,9 @@ dims_Coords = PyArray_DIMS(coordXArray); size = PyArray_SIZE(coordXArray); - if(!NI_ResampleWGradientWCoords(size, (int)dimsS[0], (int)dimsS[1], (int)dimsS[2], (int)dimsD[0], - (int)dimsD[1], (int)dimsD[2], S, X, Y, Z, M, imageD, imageS, scale, - offset, gradientX, gradientY, gradientZ)) + if(!NI_Resample_Gradient_Coords(size, (int)dimsS[0], (int)dimsS[1], (int)dimsS[2], (int)dimsD[0], + (int)dimsD[1], (int)dimsD[2], S, X, Y, Z, imageD, imageS, scale, + offset, gradientX, gradientY, gradientZ)) goto exit; exit: @@ -515,16 +556,92 @@ +static PyObject *Register_Resample_Coords(PyObject *self, PyObject *args) +{ + + int num; + int size; + int nd; + int type; + int itype; + int nd_S; + npy_intp *dimsScale; + npy_intp *dimsOffset; + npy_intp *dimsS; + npy_intp *dimsD; + npy_intp *dims_S; + npy_intp *dims_Coords; + unsigned char *imageS; + unsigned char *imageD; + double *X; + double *Y; + double *Z; + int *S; + double *scale; + int *offset; + PyObject *imgArrayS = NULL; + PyObject *imgArrayD = NULL; + PyObject *SArray = NULL; + PyObject *scaleArray = NULL; + PyObject *offsetArray = NULL; + PyObject *coordXArray = NULL; + PyObject *coordYArray = NULL; + PyObject *coordZArray = NULL; + + if(!PyArg_ParseTuple(args, "OOOOOOOO", &coordZArray, &coordYArray, &coordXArray, + &imgArrayS, &imgArrayD, &SArray, &scaleArray, &offsetArray)) + goto exit; + + /* check in the Python code that S and D are the same dims, type */ + imageS = (unsigned char *)PyArray_DATA(imgArrayS); + imageD = (unsigned char *)PyArray_DATA(imgArrayD); + /* reads dims as 0 = layers, 1 = rows, 2 = cols */ + nd = PyArray_NDIM(imgArrayS); + dimsS = PyArray_DIMS(imgArrayS); + dimsD = PyArray_DIMS(imgArrayD); + type = PyArray_TYPE(imgArrayS); + num = PyArray_SIZE(imgArrayS); + + S = (int *)PyArray_DATA(SArray); + nd_S = PyArray_NDIM(SArray); + dims_S = PyArray_DIMS(SArray); + + scale = (double *)PyArray_DATA(scaleArray); + offset = (int *)PyArray_DATA(offsetArray); + dimsScale = PyArray_DIMS(scaleArray); + dimsOffset = PyArray_DIMS(offsetArray); + + X = (double *)PyArray_DATA(coordXArray); + Y = (double *)PyArray_DATA(coordYArray); + Z = (double *)PyArray_DATA(coordZArray); + + dims_Coords = PyArray_DIMS(coordXArray); + size = PyArray_SIZE(coordXArray); + + if(!NI_Resample_Coords(size, (int)dimsS[0], (int)dimsS[1], (int)dimsS[2], (int)dimsD[0], + (int)dimsD[1], (int)dimsD[2], S, X, Y, Z, imageD, imageS, scale, offset)) + goto exit; + +exit: + + return PyErr_Occurred() ? NULL : (PyObject*)Py_BuildValue(""); + +} + + + static PyMethodDef RegisterMethods[] = { - { "register_resample_w_gradient_w_coords", Register_ResampleWGradientWCoords, METH_VARARGS, NULL }, - { "register_resample_w_gradient", Register_ResampleWithGradient, METH_VARARGS, NULL }, - { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, - { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, - { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, - { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, - { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, - { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, + { "register_find_mask", Register_Find_Mask, METH_VARARGS, NULL }, + { "register_resample_coords", Register_Resample_Coords, METH_VARARGS, NULL }, + { "register_resample_gradient_coords", Register_Resample_Gradient_Coords, METH_VARARGS, NULL }, + { "register_resample_w_gradient", Register_ResampleWithGradient, METH_VARARGS, NULL }, + { "register_histogram", Register_Histogram, METH_VARARGS, NULL }, + { "register_histogram_lite", Register_HistogramLite, METH_VARARGS, NULL }, + { "register_linear_resample", Register_LinearResample, METH_VARARGS, NULL }, + { "register_cubic_resample", Register_CubicResample, METH_VARARGS, NULL }, + { "register_volume_resample", Register_VolumeResample, METH_VARARGS, NULL }, + { "register_image_threshold", Register_ImageThreshold, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL}, }; From scipy-svn at scipy.org Tue Apr 29 21:41:51 2008 From: scipy-svn at scipy.org (scipy-svn at scipy.org) Date: Tue, 29 Apr 2008 20:41:51 -0500 (CDT) Subject: [Scipy-svn] r4200 - trunk/scipy/ndimage/src/register Message-ID: <20080430014151.43A6339C080@new.scipy.org> Author: tom.waite Date: 2008-04-29 20:41:48 -0500 (Tue, 29 Apr 2008) New Revision: 4200 Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c Log: added mask coordinates for resampling Modified: trunk/scipy/ndimage/src/register/Register_IMPL.c =================================================================== --- trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-30 01:41:32 UTC (rev 4199) +++ trunk/scipy/ndimage/src/register/Register_IMPL.c 2008-04-30 01:41:48 UTC (rev 4200) @@ -952,22 +952,19 @@ } -int NI_ResampleWGradientWCoords(int size, int layersS, int rowsS, int colsS, int layersD, int rowsD, - int colsD, int *dimSteps, double *X, double *Y, double *Z, double *M, - unsigned char *imageD, unsigned char *imageS, double *scale, int *offset, - double *gradientX, double *gradientY, double *gradientZ) +int NI_Resample_Gradient_Coords(int size, int layersS, int rowsS, int colsS, int layersD, int rowsD, + int colsD, int *dimSteps, double *X, double *Y, double *Z, + unsigned char *imageD, unsigned char *imageS, double *scale, + int *offset, double *gradientX, double *gradientY, double *gradientZ) { int i; int status; - int sliceD; - int rowD; int sliceSizeD; int dimsS[3]; int dimsD[3]; int dims[2]; float vs; - float x, y, z; float xp, yp, zp; float dx1, dy1, dz1; float dx2, dy2, dz2; @@ -1004,98 +1001,94 @@ dims[1] = dimsS[0]*dimsS[1]; for(i = 0; i < size; ++i){ - z = Z[i]; - y = Y[i]; - x = X[i]; + // get the 'from' unrolled coordinates + zp = Z[i]; + yp = Y[i]; + xp = X[i]; - sliceD = (int)z * sliceSizeD; - rowD = (int)y * colsD; - - // get the 'from' coordinates - xp = M[0]*x + M[1]*y + M[2]*z + M[3]; - yp = M[4]*x + M[5]*y + M[6]*z + M[7]; - zp = M[8]*x + M[9]*y + M[10]*z + M[11]; // clip the resample window if((zp >= 0.0 && zp < layersS-dimSteps[2]) && (yp >= 0.0 && yp < rowsS-dimSteps[1]) && (xp >= 0.0 && xp < colsS-dimSteps[0])){ - // corners of the 3D unit volume cube - ptr_z0 = (int)zp * dims[1]; - ptr_z1 = ptr_z0 + dims[1]; - ptr_y0 = (int)yp * dims[0]; - ptr_y1 = ptr_y0 + dims[0]; - ptr_x0 = (int)xp; - ptr_x1 = ptr_x0 + 1; + // corners of the 3D unit volume cube + ptr_z0 = (int)zp * dims[1]; + ptr_z1 = ptr_z0 + dims[1]; + ptr_y0 = (int)yp * dims[0]; + ptr_y1 = ptr_y0 + dims[0]; + ptr_x0 = (int)xp; + ptr_x1 = ptr_x0 + 1; - dx1 = xp - (int)xp; - dy1 = yp - (int)yp; - dz1 = zp - (int)zp; - dx2 = 1.0 - dx1; - dy2 = 1.0 - dy1; - dz2 = 1.0 - dz1; + dx1 = xp - (int)xp; + dy1 = yp - (int)yp; + dz1 = zp - (int)zp; + dx2 = 1.0 - dx1; + dy2 = 1.0 - dy1; + dz2 = 1.0 - dz1; - V000 = imageS[ptr_x0+ptr_y0+ptr_z0]; - V100 = imageS[ptr_x1+ptr_y0+ptr_z0]; - V010 = imageS[ptr_x0+ptr_y1+ptr_z0]; - V001 = imageS[ptr_x0+ptr_y0+ptr_z1]; - V011 = imageS[ptr_x0+ptr_y1+ptr_z1]; - V101 = imageS[ptr_x1+ptr_y0+ptr_z1]; - V110 = imageS[ptr_x1+ptr_y1+ptr_z0]; - V111 = imageS[ptr_x1+ptr_y1+ptr_z1]; + V000 = imageS[ptr_x0+ptr_y0+ptr_z0]; + V100 = imageS[ptr_x1+ptr_y0+ptr_z0]; + V010 = imageS[ptr_x0+ptr_y1+ptr_z0]; + V001 = imageS[ptr_x0+ptr_y0+ptr_z1]; + V011 = imageS[ptr_x0+ptr_y1+ptr_z1]; + V101 = imageS[ptr_x1+ptr_y0+ptr_z1]; + V110 = imageS[ptr_x1+ptr_y1+ptr_z0]; + V111 = imageS[ptr_x1+ptr_y1+ptr_z1]; vs = V000 * (dx2) * (dy2) * (dz2) + - V100 * (dx1) * (dy2) * (dz2) + - V010 * (dx2) * (dy1) * (dz2) + - V001 * (dx2) * (dy2) * (dz1) + - V101 * (dx1) * (dy2) * (dz1) + - V011 * (dx2) * (dy1) * (dz1) + - V110 * (dx1) * (dy1) * (dz2) + - V111 * (dx1) * (dy1) * (dz1); + V100 * (dx1) * (dy2) * (dz2) + + V010 * (dx2) * (dy1) * (dz2) + + V001 * (dx2) * (dy2) * (dz1) + + V101 * (dx1) * (dy2) * (dz1) + + V011 * (dx2) * (dy1) * (dz1) + + V110 * (dx1) * (dy1) * (dz2) + + V111 * (dx1) * (dy1) * (dz1); - /* resampled voxel */ - imageD[sliceD+rowD+(int)x] = (int)(vs*scale[(int)zp]) + offset[(int)zp]; + /* resampled voxel saved in the unrolled clipped volume */ + imageD[i] = (int)(vs*scale[(int)zp]) + offset[(int)zp]; - /* - * x gradient voxel. for no resample dz1, dy1 = 0.0 and - * dy2, dz2 = 1.0 so gradX = V100 - V000 - */ + /* + * x gradient voxel. for no resample dz1, dy1 = 0.0 and + * dy2, dz2 = 1.0 so gradX = V100 - V000 + */ - /* d/d(dx1) = 1.0, d/d(dx2) = -1.0 */ + /* d/d(dx1) = 1.0, d/d(dx2) = -1.0 */ gradX = V000 * (-1.0) * (dy2) * (dz2) + - V100 * (1.0) * (dy2) * (dz2) + - V010 * (-1.0) * (dy1) * (dz2) + - V001 * (-1.0) * (dy2) * (dz1) + - V101 * (1.0) * (dy2) * (dz1) + - V011 * (-1.0) * (dy1) * (dz1) + - V110 * (1.0) * (dy1) * (dz2) + - V111 * (1.0) * (dy1) * (dz1); + V100 * (1.0) * (dy2) * (dz2) + + V010 * (-1.0) * (dy1) * (dz2) + + V001 * (-1.0) * (dy2) * (dz1) + + V101 * (1.0) * (dy2) * (dz1) + + V011 * (-1.0) * (dy1) * (dz1) + + V110 * (1.0) * (dy1) * (dz2) + + V111 * (1.0) * (dy1) * (dz1); - /* d/d(dy1) = 1.0, d/d(dy2) = -1.0 */ + /* d/d(dy1) = 1.0, d/d(dy2) = -1.0 */ gradY = V000 * (dx2) * (-1.0) * (dz2) + - V100 * (dx1) * (-1.0) * (dz2) + - V010 * (dx2) * (1.0) * (dz2) + - V001 * (dx2) * (-1.0) * (dz1) + - V101 * (dx1) * (-1.0) * (dz1) + - V011 * (dx2) * (1.0) * (dz1) + - V110 * (dx1) * (1.0) * (dz2) + - V111 * (dx1) * (1.0) * (dz1); + V100 * (dx1) * (-1.0) * (dz2) + + V010 * (dx2) * (1.0) * (dz2) + + V001 * (dx2) * (-1.0) * (dz1) + + V101 * (dx1) * (-1.0) * (dz1) + + V011 * (dx2) * (1.0) * (dz1) + + V110 * (dx1) * (1.0) * (dz2) + + V111 * (dx1) * (1.0) * (dz1); - /* d/d(dz1) = 1.0, d/d(dz2) = -1.0 */ + /* d/d(dz1) = 1.0, d/d(dz2) = -1.0 */ gradZ = V000 * (dx2) * (dy2) * (-1.0) + - V100 * (dx1) * (dy2) * (-1.0) + - V010 * (dx2) * (dy1) * (-1.0) + - V001 * (dx2) * (dy2) * (1.0) + - V101 * (dx1) * (dy2) * (1.0) + - V011 * (dx2) * (dy1) * (1.0) + - V110 * (dx1) * (dy1) * (-1.0) + - V111 * (dx1) * (dy1) * (1.0); + V100 * (dx1) * (dy2) * (-1.0) + + V010 * (dx2) * (dy1) * (-1.0) + + V001 * (dx2) * (dy2) * (1.0) + + V101 * (dx1) * (dy2) * (1.0) + + V011 * (dx2) * (dy1) * (1.0) + + V110 * (dx1) * (dy1) * (-1.0) + + V111 * (dx1) * (dy1) * (1.0); - gradientX[sliceD+rowD+(int)x] = (int)(gradX*scale[(int)zp]); - gradientY[sliceD+rowD+(int)x] = (int)(gradY*scale[(int)zp]); - gradientZ[sliceD+rowD+(int)x] = (int)(gradZ*scale[(int)zp]); + /* gradients saved in the unrolled clipped gradient volume */ + gradientX[i] = (int)(gradX*scale[(int)zp]); + gradientY[i] = (int)(gradY*scale[(int)zp]); + gradientZ[i] = (int)(gradZ*scale[(int)zp]); } + } status = 1; @@ -1105,3 +1098,108 @@ } + +int NI_Resample_Coords(int size, int layersS, int rowsS, int colsS, int layersD, int rowsD, + int colsD, int *dimSteps, double *X, double *Y, double *Z, + unsigned char *imageD, unsigned char *imageS, double *scale, int *offset) +{ + + int i; + int status; + int sliceSizeD; + int dimsS[3]; + int dimsD[3]; + int dims[2]; + float vs; + float xp, yp, zp; + float dx1, dy1, dz1; + float dx2, dy2, dz2; + + int ptr_x0; + int ptr_y0; + int ptr_z0; + int ptr_x1; + int ptr_y1; + int ptr_z1; + // + // Vxyz for [0,1] values of x, y, z + // + int V000; + int V100; + int V010; + int V001; + int V011; + int V101; + int V110; + int V111; + float valueXYZ; + + sliceSizeD = rowsD * colsD; + dimsD[0] = colsD; + dimsD[1] = rowsD; + dimsD[2] = layersD; + dimsS[0] = colsS; + dimsS[1] = rowsS; + dimsS[2] = layersS; + + dims[0] = dimsS[0]; + dims[1] = dimsS[0]*dimsS[1]; + + for(i = 0; i < size; ++i){ + // get the 'from' unrolled coordinates + zp = Z[i]; + yp = Y[i]; + xp = X[i]; + + // clip the resample window + if((zp >= 0.0 && zp < layersS-dimSteps[2]) && + (yp >= 0.0 && yp < rowsS-dimSteps[1]) && + (xp >= 0.0 && xp < colsS-dimSteps[0])){ + + // corners of the 3D unit volume cube + ptr_z0 = (int)zp * dims[1]; + ptr_z1 = ptr_z0 + dims[1]; + ptr_y0 = (int)yp * dims[0]; + ptr_y1 = ptr_y0 + dims[0]; + ptr_x0 = (int)xp; + ptr_x1 = ptr_x0 + 1; + + dx1 = xp - (int)xp; + dy1 = yp - (int)yp; + dz1 = zp - (int)zp; + dx2 = 1.0 - dx1; + dy2 = 1.0 - dy1; + dz2 = 1.0 - dz1; + + V000 = imageS[ptr_x0+ptr_y0+ptr_z0]; + V100 = imageS[ptr_x1+ptr_y0+ptr_z0]; + V010 = imageS[ptr_x0+ptr_y1+ptr_z0]; + V001 = imageS[ptr_x0+ptr_y0+ptr_z1]; + V011 = imageS[ptr_x0+ptr_y1+ptr_z1]; + V101 = imageS[ptr_x1+ptr_y0+ptr_z1]; + V110 = imageS[ptr_x1+ptr_y1+ptr_z0]; + V111 = imageS[ptr_x1+ptr_y1+ptr_z1]; + + vs = V000 * (dx2) * (dy2) * (dz2) + + V100 * (dx1) * (dy2) * (dz2) + + V010 * (dx2) * (dy1) * (dz2) + + V001 * (dx2) * (dy2) * (dz1) + + V101 * (dx1) * (dy2) * (dz1) + + V011 * (dx2) * (dy1) * (dz1) + + V110 * (dx1) * (dy1) * (dz2) + + V111 * (dx1) * (dy1) * (dz1); + + /* resampled voxel saved in the unrolled clipped volume */ + imageD[i] = (int)(vs*scale[(int)zp]) + offset[(int)zp]; + } + + } + + status = 1; + + return status; + +} + + +