def testAsserts(self): with self.assertRaisesOpError('Argument `scale` must be positive.'): b = tfb.WeibullCDF(concentration=1., scale=-1., validate_args=True) self.evaluate(b.forward(3.)) with self.assertRaisesOpError( 'Argument `concentration` must be positive.'): b = tfb.WeibullCDF(concentration=-1., scale=1., validate_args=True) self.evaluate(b.inverse(0.5))
def testScalarCongruency(self): bijector_test_util.assert_scalar_congruency(tfb.WeibullCDF( scale=20., concentration=0.3), lower_x=1., upper_x=100., eval_func=self.evaluate, rtol=0.05)
def testBijectorConcentration1LogDetJacobianFiniteAtZero(self): # When concentration = 1., forward_log_det_jacobian should be finite at # zero. scale = np.logspace(0.1, 10., num=20).astype(np.float32) bijector = tfb.WeibullCDF(scale, concentration=1.) fldj = self.evaluate(bijector.forward_log_det_jacobian(0., event_ndims=0)) self.assertAllEqual(np.ones_like(fldj, dtype=np.bool_), np.isfinite(fldj))
def testBijectiveAndFinite(self): bijector = tfb.WeibullCDF(scale=20., concentration=2., validate_args=True) x = np.linspace(1., 8., num=10).astype(np.float32) y = np.linspace( -np.expm1(-1 / 400.), -np.expm1(-16), num=10).astype(np.float32) bijector_test_util.assert_bijective_and_finite( bijector, x, y, eval_func=self.evaluate, event_ndims=0, rtol=1e-3)
def testVariableAssertsScale(self): concentration = tf.Variable(1.) scale = tf.Variable(1.) b = tfb.WeibullCDF( concentration=concentration, scale=scale, validate_args=True) self.evaluate([concentration.initializer, scale.initializer]) with self.assertRaisesOpError('Argument `scale` must be positive.'): with tf.control_dependencies([scale.assign(-1.)]): self.evaluate(b.forward(3.))
def testVariableAssertsScale(self): concentration = tf.Variable(1.) scale = tf.Variable(1.) b = tfb.WeibullCDF(concentration=concentration, scale=scale, validate_args=True) # Use identities so that static asserts don't catch the error earlier # and raise 'Forward transformation input must be at least 0' minus_1 = tf.identity(tf.convert_to_tensor(-1.)) minus_3 = tf.identity(tf.convert_to_tensor(-3.)) self.evaluate([concentration.initializer, scale.initializer]) with self.assertRaisesOpError('Argument `scale` must be positive.'): with tf.control_dependencies([scale.assign(minus_1)]): self.evaluate(b.forward(minus_3))
def testBijector(self): scale = 5. concentration = 0.3 bijector = tfb.WeibullCDF( scale=scale, concentration=concentration, validate_args=True) self.assertStartsWith(bijector.name, 'weibull') x = np.array([[[0.], [1.], [14.], [20.], [100.]]], dtype=np.float32) # Weibull distribution weibull_dist = stats.weibull_min(c=concentration, scale=scale) y = weibull_dist.cdf(x).astype(np.float32) self.assertAllClose(y, self.evaluate(bijector.forward(x))) self.assertAllClose(x, self.evaluate(bijector.inverse(y))) self.assertAllClose( weibull_dist.logpdf(x), self.evaluate(bijector.forward_log_det_jacobian(x, event_ndims=0))) self.assertAllClose( self.evaluate(-bijector.inverse_log_det_jacobian(y, event_ndims=0)), self.evaluate(bijector.forward_log_det_jacobian(x, event_ndims=0)), rtol=1e-4, atol=0.)