def test_matrix_derivative_by_scalar(): assert A.diff(i) == ZeroMatrix(k, k) assert (A*(X + B)*c).diff(i) == ZeroMatrix(k, 1) assert x.diff(i) == ZeroMatrix(k, 1) assert (x.T*y).diff(i) == ZeroMatrix(1, 1) assert (x*x.T).diff(i) == ZeroMatrix(k, k) assert (x + y).diff(i) == ZeroMatrix(k, 1) assert hadamard_power(x, 2).diff(i) == ZeroMatrix(k, 1) assert hadamard_power(x, i).diff(i) == HadamardProduct(x.applyfunc(log), HadamardPower(x, i)) assert hadamard_product(x, y).diff(i) == ZeroMatrix(k, 1) assert hadamard_product(i*OneMatrix(k, 1), x, y).diff(i) == hadamard_product(x, y) assert (i*x).diff(i) == x assert (sin(i)*A*B*x).diff(i) == cos(i)*A*B*x assert x.applyfunc(sin).diff(i) == ZeroMatrix(k, 1) assert Trace(i**2*X).diff(i) == 2*i*Trace(X)
def test_hadamard_power(): m, n, p = symbols('m, n, p', integer=True) A = MatrixSymbol('A', m, n) B = MatrixSymbol('B', m, n) C = MatrixSymbol('C', m, p) assert hadamard_power(A, 1) == A assert isinstance(hadamard_power(A, 2), HadamardPower) assert hadamard_power(A, n).T == hadamard_power(A.T, n) assert hadamard_power(A, n)[0, 0] == A[0, 0]**n assert hadamard_power(m, n) == m**n raises(ValueError, lambda: hadamard_power(A, A)) # Testing printer: assert str(hadamard_power(A, n)) == "A.**n" assert str(hadamard_power(A, 1+n)) == "A.**(n + 1)" assert str(hadamard_power(A*B.T, 1+n)) == "(A*B.T).**(n + 1)"
def test_derivatives_of_hadamard_expressions(): # Hadamard Product expr = hadamard_product(a, x, b) assert expr.diff(x) == DiagonalizeVector(hadamard_product(b, a)) expr = a.T * hadamard_product(A, X, B) * b assert expr.diff(X) == DiagonalizeVector(a) * hadamard_product( B, A) * DiagonalizeVector(b) # Hadamard Power expr = hadamard_power(x, 2) assert expr.diff(x).doit() == 2 * DiagonalizeVector(x) expr = hadamard_power(x.T, 2) assert expr.diff(x).doit() == 2 * DiagonalizeVector(x) expr = hadamard_power(x, S.Half) assert expr.diff(x) == S.Half * DiagonalizeVector( hadamard_power(x, -S.Half)) expr = hadamard_power(a.T * X * b, 2) assert expr.diff(X) == 2 * a * a.T * X * b * b.T expr = hadamard_power(a.T * X * b, S.Half) assert expr.diff(X) == a / 2 * hadamard_power(a.T * X * b, -S.Half) * b.T
def test_derivatives_of_hadamard_expressions(): # Hadamard Product expr = hadamard_product(a, x, b) assert expr.diff(x) == DiagonalizeVector(hadamard_product(b, a)) expr = a.T*hadamard_product(A, X, B)*b assert expr.diff(X) == DiagonalizeVector(a)*hadamard_product(B, A)*DiagonalizeVector(b) # Hadamard Power expr = hadamard_power(x, 2) assert expr.diff(x).doit() == 2*DiagonalizeVector(x) expr = hadamard_power(x.T, 2) assert expr.diff(x).doit() == 2*DiagonalizeVector(x) expr = hadamard_power(x, S.Half) assert expr.diff(x) == S.Half*DiagonalizeVector(hadamard_power(x, -S.Half)) expr = hadamard_power(a.T*X*b, 2) assert expr.diff(X) == 2*a*a.T*X*b*b.T expr = hadamard_power(a.T*X*b, S.Half) assert expr.diff(X) == a/2*hadamard_power(a.T*X*b, -S.Half)*b.T
def test_matrix_derivative_by_scalar(): assert A.diff(i) == ZeroMatrix(k, k) assert (A*(X + B)*c).diff(i) == ZeroMatrix(k, 1) assert x.diff(i) == ZeroMatrix(k, 1) assert (x.T*y).diff(i) == ZeroMatrix(1, 1) assert (x*x.T).diff(i) == ZeroMatrix(k, k) assert (x + y).diff(i) == ZeroMatrix(k, 1) assert hadamard_power(x, 2).diff(i) == ZeroMatrix(k, 1) assert hadamard_power(x, i).diff(i).dummy_eq( HadamardProduct(x.applyfunc(log), HadamardPower(x, i))) assert hadamard_product(x, y).diff(i) == ZeroMatrix(k, 1) assert hadamard_product(i*OneMatrix(k, 1), x, y).diff(i) == hadamard_product(x, y) assert (i*x).diff(i) == x assert (sin(i)*A*B*x).diff(i) == cos(i)*A*B*x assert x.applyfunc(sin).diff(i) == ZeroMatrix(k, 1) assert Trace(i**2*X).diff(i) == 2*i*Trace(X) mu = symbols("mu") expr = (2*mu*x) assert expr.diff(x) == 2*mu*Identity(k)
def test_hadamard_power(): m, n, p = symbols('m, n, p', integer=True) A = MatrixSymbol('A', m, n) assert hadamard_power(A, 1) == A assert isinstance(hadamard_power(A, 2), HadamardPower) assert hadamard_power(A, n).T == hadamard_power(A.T, n) assert hadamard_power(A, n)[0, 0] == A[0, 0]**n assert hadamard_power(m, n) == m**n raises(ValueError, lambda: hadamard_power(A, A))
def test_derivatives_of_hadamard_expressions(): # Hadamard Product expr = hadamard_product(a, x, b) assert expr.diff(x) == DiagMatrix(hadamard_product(b, a)) expr = a.T * hadamard_product(A, X, B) * b assert expr.diff(X) == HadamardProduct(a * b.T, A, B) # Hadamard Power expr = hadamard_power(x, 2) assert expr.diff(x).doit() == 2 * DiagMatrix(x) expr = hadamard_power(x.T, 2) assert expr.diff(x).doit() == 2 * DiagMatrix(x) expr = hadamard_power(x, S.Half) assert expr.diff(x) == S.Half * DiagMatrix( hadamard_power(x, Rational(-1, 2))) expr = hadamard_power(a.T * X * b, 2) assert expr.diff(X) == 2 * a * a.T * X * b * b.T expr = hadamard_power(a.T * X * b, S.Half) assert expr.diff(X) == a / (2 * sqrt(a.T * X * b)) * b.T