def transform(C, X, *Y): """ Transform the covariance nmatrix C at point X to the variables Y(X) >>> X = 1 , 2 >>> C = Ostap.SymMatrix(2)() >>> C [ 0 , 0 ] = 0.20 >>> C [ 0 , 1 ] = 0.05 >>> C [ 1 , 1 ] = 0.30 >>> r = lambda x , y : (x*x+y*y)**2 >>> phi = lambda x , y : math.atan2 ( y , x ) >>> C_polar = transform ( C , X , r , phi ) """ ny = len(Y) assert 1 <= ny, 'Invalid size of Y!' nx = len(X) if C is None and 1 <= nx: C = Ostap.SymMatrix(nx)() for i, x in enumerate(X): xx = VE(x) C[i, i] = xx.cov2() shape = C.shape assert shape[0] == shape[1] and shape[0] == nx, 'Invalid shape of matrix C!' CC = Ostap.SymMatrix(nx)() for i in range(CC.kRows): CC[i, i] = C(i, i) for j in range(i + 1, CC.kCols): v = 0.5 * (C(i, j) + C(j, i)) CC[i, j] = v XX = Ostap.Vector(nx)() for i, x in enumerate(X): XX[i] = float(x) ## get vector-with-errors XX = Ostap.VectorE(nx)(XX, CC) R = XX.transform(*Y) return R.cov2()
def test_linalg2() : """The main function to test linear algebra """ logger.info('Test Linaear Algebra: ') LA3 = Ostap.Vector(3) l1 = LA3(0,1,2) l2 = LA3(3,4,5) logger.info ( 'l1 , l2 : %s %s ' % ( l1 , l2 ) ) logger.info ( 'l1 + l2 : %s ' % ( l1 + l2 ) ) logger.info ( 'l1 - l2 : %s ' % ( l1 - l2 ) ) logger.info ( 'l1 * l2 : %s ' % ( l1 * l2 ) ) logger.info ( 'l1 * 2 : %s ' % ( l1 * 2 ) ) logger.info ( ' 2 * l2 : %s ' % ( 2 * l2 ) ) logger.info ( 'l1 / 2 : %s ' % ( l1 / 2 ) ) l1 /= 2 logger.info ( 'l1 /= 2 : %s ' % l1 ) l1 *= 2 logger.info ( 'l1 *= 2 : %s ' % l1 ) ## if ( 3 , 5 ) <= python_version : ## logger.info ( 'l1 @ l2 : %s ' % ( l1 @ l2 ) ) ## logger.info ( 'l1 @ 2 : %s ' % ( l1 @ 2 ) ) ## logger.info ( ' 2 @ l2 : %s ' % ( 2 @ l2 ) ) logger.info('TEST matrices: ') m22 = Ostap.Math.Matrix(2,2) () m23 = Ostap.Math.Matrix(2,3) () s22 = Ostap.Math.SymMatrix(2)() l2 = Ostap.Math.Vector(2)() l3 = Ostap.Math.Vector(3)() l2[0] = 1 l2[1] = 2 l3[0] = 1 l3[1] = 2 l3[1] = 3 logger.info ( 'l2 , l3 : %s %s ' % ( l2 , l3 ) ) m22[0,0] = 1 m22[0,1] = 1 m22[1,1] = 1 m23[0,0] = 1 m23[1,1] = 1 m23[0,2] = 1 s22[0,0] = 2 s22[1,0] = 1 s22[1,1] = 3 logger.info ( 'm22\n%s' % m22 ) logger.info ( 's22\n%s' % s22 ) logger.info ( 'm23\n%s' % m23 ) logger.info ( 'm22/3\n%s' % (m22/3) ) logger.info ( 'm23*3\n%s' % (m23*3) ) logger.info ( 'm22**3\n%s' % m22**3 ) logger.info ( 's22**4\n%s' % s22**4 ) logger.info ( 'm22 * m23 :\n%s' % ( m22 * m23 ) ) logger.info ( 'm22 * l2 : %s ' % ( m22 * l2 ) ) logger.info ( 'l2 * m22 : %s ' % ( l2 * m22 ) ) logger.info ( 'm23 * l3 : %s ' % ( m23 * l3 ) ) logger.info ( 'l2 * m23 : %s ' % ( l2 * m23 ) ) logger.info ( 'm22 * s22 + 2 * m22 :\n%s ' % ( m22*s22 + 2*m22 ) ) logger.info ( 'm22 == m22*1.0 : %s ' % ( m22 == m22 * 1.0 ) ) logger.info ( 'm22 != m22*1.1 : %s ' % ( m22 != m22 * 1.1 ) ) logger.info ( 'm23 == m23*1.0 : %s ' % ( m23 == m23 * 1.0 ) ) logger.info ( 'm23 != m23*1.1 : %s ' % ( m23 != m23 * 1.1 ) ) logger.info ( 'l1 == l1 *1.0 : %s ' % ( l1 == l1 * 1.0 ) ) logger.info ( 'l1 != l1 *1.1 : %s ' % ( l1 != l1 * 1.1 ) ) logger.info ( 's22 == s22*1.0 : %s ' % ( s22 == s22 * 1.0 ) ) logger.info ( 's22 != s22*1.1 : %s ' % ( s22 != s22 * 1.1 ) ) logger.info ( ' l1 == (0,1,2) : %s ' % ( l1 == ( 0 , 1 , 2 ) ) ) logger.info ( ' l1 == [0,1,2] : %s ' % ( l1 == [ 0 , 1 , 2 ] ) ) ## if ( 3 , 5 ) <= python_version : ## logger.info ( 'm23 @ 3 :\n%s' % ( m23 @ 3 ) ) ## logger.info ( 'm22 @ m23 :\n%s' % ( m22 @ m23 ) ) ## logger.info ( 'm22 @ l2 : %s ' % ( m22 @ l2 ) ) ## logger.info ( 'm23 @ l3 : %s ' % ( m23 @ l3 ) ) m22[0,0] = 1 m22[0,1] = 2 m22[1,0] = 2 m22[1,1] = 3 s22[0,0] = 1 s22[0,1] = 2 s22[1,1] = 3 logger.info ( ' m22 == s22 : %s ' % ( m22 == s22 ) ) logger.info ( ' m22 == s22*1.0 : %s ' % ( m22 == s22 * 1.0 ) ) logger.info ( ' m22 != s22*1.1 : %s ' % ( m22 != s22 * 1.1 ) ) m22 += m22 logger.info ( ' m22 += m22 :\n%s ' % m22 ) m22 -= m22*2 logger.info ( ' m22 += m22*2 :\n%s ' % m22 ) m22 += s22*0 logger.info ( ' m22 += s22*0 :\n%s ' % m22 ) m22 -= s22*2 logger.info ( ' m22 -= s22*2 :\n%s ' % m22 ) s22 += s22*2 logger.info ( ' s22 += s22*2 :\n%s ' % s22 ) s22 -= s22*2 logger.info ( ' s22 -= s22*2 :\n%s ' % s22 ) if np : logger.info ( 'Operations with numpy objects') v2 = np.array ( [1.0,2.0] ) v3 = np.array ( [1.0,2.0,3.0 ] ) logger.info ( 'v2 * l2 : %s' % ( v2 * l2 ) ) logger.info ( 'l3 * v3 : %s' % ( l3 * v3 ) ) logger.info ( 's22 * v2 : %s' % ( s22 * v2 ) ) logger.info ( 'm22 * v2 : %s' % ( m22 * v2 ) ) logger.info ( 'm23 * v3 : %s' % ( m23 * v3 ) ) logger.info ( 'm22 * m22(np) :\n%s' % ( m22 * m22.to_numpy() ) ) logger.info ( 's22 * s22(np) :\n%s' % ( s22 * s22.to_numpy() ) ) logger.info ( 's22 * m23(np) :\n%s' % ( s22 * m23.to_numpy() ) ) logger.info ( 'l2 * m22(np) :\n%s' % ( l2 * m22.to_numpy() ) ) logger.info ( 'SVector with errors') v2 = Ostap.Math.VectorE (2)() v2 [ 0 ] = 3 v2 [ 1 ] = 4 v2 . cov2 () [ 0 , 0 ] = 0.10 v2 . cov2 () [ 0 , 1 ] = 0.05 v2 . cov2 () [ 1 , 1 ] = 0.20 rho = lambda x,y : ( x * x + y * y ) ** 0.5 phi = lambda x,y : math.atan2 ( y , x ) r1 = v2.transform ( rho , phi ) logger.info ( " -> rho, phi %s " % r1 ) r2 = v2.transform ( rho ) logger.info ( " -> rho %s " % r2 )