def test_outer_multiply(self): # Scalar - scalar scalars = tf.constant(2.0), tf.constant(3.0) vectors = tf.constant([1.0, 2.0]), tf.constant([3.0, 5.0, 1.0]) matrices = (tf.constant([[1., 2], [2., 3]]), tf.constant([[1., 2, 3], [4, 5, 6]])) result1 = self.evaluate(bm_utils.outer_multiply( scalars[0], scalars[1])) self.assertEqual(result1, 6) # Scalar - vector result2 = self.evaluate(bm_utils.outer_multiply( scalars[0], vectors[1])) np.testing.assert_allclose(result2, [6.0, 10.0, 2.0]) # Vector - scalar result3 = self.evaluate(bm_utils.outer_multiply( vectors[0], scalars[1])) np.testing.assert_allclose(result3, [3.0, 6.0]) # Vector - vector result4 = self.evaluate(bm_utils.outer_multiply( vectors[0], vectors[1])) np.testing.assert_allclose(result4, [[3.0, 5.0, 1.0], [6.0, 10.0, 2.0]]) # Vector - vector non commutative result5 = self.evaluate(bm_utils.outer_multiply( vectors[1], vectors[0])) np.testing.assert_allclose(result5, [[3.0, 6.0], [5.0, 10.0], [1.0, 2.0]]) # Vector - matrix result6 = self.evaluate( bm_utils.outer_multiply(vectors[0], matrices[0])) np.testing.assert_allclose(result6, [[[1., 2], [2, 3]], [[2, 4], [4, 6]]]) # Matrix - matrix result7 = self.evaluate( bm_utils.outer_multiply(matrices[1], matrices[0])) np.testing.assert_allclose( result7, [[[[1., 2], [2., 3]], [[2., 4], [4., 6]], [[3., 6], [6., 9]]], [[[4., 8], [8., 12]], [[5., 10], [10., 15]], [[6., 12], [12., 18]] ]])
def test_construct_vol_covar_and_vol_callables(self): dtype = np.float64 vol_matrix = np.array([[1.0, 0.21, -0.33], [0.61, 1.5, 1.77], [-0.3, 1.19, -0.55]]).astype(dtype) covar_matrix = np.matmul(vol_matrix, vol_matrix.transpose()) vol_fn = lambda time: bm_utils.outer_multiply(time, vol_matrix) def tc_fn(t1, t2): return bm_utils.outer_multiply((t2**2 - t1**2) / 2, covar_matrix) times = np.array([[0.12, 0.44], [0.48, 1.698]]).astype(dtype) actual_vol_fn, actual_tc_fn = bm_utils.construct_vol_data( vol_fn, tc_fn, 3, dtype) actual_vols = self.evaluate(actual_vol_fn(times)) np.testing.assert_array_equal(actual_vols.shape, [2, 2, 3, 3]) np.testing.assert_allclose(actual_vols, self.evaluate(vol_fn(times))) times2 = times + np.array([[0.12, 0.34], [0.56, 0.78]]).astype(dtype) actual_tc = self.evaluate(actual_tc_fn(times, times2)) np.testing.assert_array_equal(actual_tc.shape, [2, 2, 3, 3]) np.testing.assert_allclose(actual_tc, self.evaluate(actual_tc_fn(times, times2)))
def tc_fn(t1, t2): return bm_utils.outer_multiply((t2 - t1), covar_matrix)
def covar_fn(t1, t2): return bm_utils.outer_multiply(t2 - t1, covar_matrix)
def fn(t1, t2): return bm_utils.outer_multiply(t2 - t1, v * tf.ones([2], dtype=dtype))