tensorflow_backend

class pyhf.tensor.tensorflow_backend.tensorflow_backend(**kwargs)[source]

Bases: object

TensorFlow backend for pyhf

__init__(**kwargs)[source]

Initialize self. See help(type(self)) for accurate signature.

Attributes

default_do_grad
dtypemap
name
precision

Methods

_setup()[source]

Run any global setups for the tensorflow lib.

abs(tensor)[source]
astensor(tensor_in, dtype='float')[source]

Convert to a TensorFlow Tensor.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> tensor = pyhf.tensorlib.astensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
>>> tensor
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[1., 2., 3.],
       [4., 5., 6.]], dtype=float32)>
>>> type(tensor)
<class 'tensorflow.python.framework.ops.EagerTensor'>
Parameters

tensor_in (Number or Tensor) – Tensor object

Returns

A symbolic handle to one of the outputs of a tf.Operation.

Return type

tf.Tensor

boolean_mask(tensor, mask)[source]
clip(tensor_in, min_value, max_value)[source]

Clips (limits) the tensor values to be within a specified min and max.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> a = pyhf.tensorlib.astensor([-2, -1, 0, 1, 2])
>>> t = pyhf.tensorlib.clip(a, -1, 1)
>>> print(t)
tf.Tensor([-1. -1.  0.  1.  1.], shape=(5,), dtype=float32)
Parameters
  • tensor_in (tensor) – The input tensor object

  • min_value (scalar or tensor or None) – The minimum value to be cliped to

  • max_value (scalar or tensor or None) – The maximum value to be cliped to

Returns

A clipped tensor

Return type

TensorFlow Tensor

concatenate(sequence, axis=0)[source]

Join a sequence of arrays along an existing axis.

Parameters
  • sequence – sequence of tensors

  • axis – dimension along which to concatenate

Returns

the concatenated tensor

Return type

output

conditional(predicate, true_callable, false_callable)[source]

Runs a callable conditional on the boolean value of the evaulation of a predicate

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> tensorlib = pyhf.tensorlib
>>> a = tensorlib.astensor([4])
>>> b = tensorlib.astensor([5])
>>> t = tensorlib.conditional((a < b)[0], lambda: a + b, lambda: a - b)
>>> print(t)
tf.Tensor([9.], shape=(1,), dtype=float32)
Parameters
  • predicate (scalar) – The logical condition that determines which callable to evaluate

  • true_callable (callable) – The callable that is evaluated when the predicate evalutes to true

  • false_callable (callable) – The callable that is evaluated when the predicate evalutes to false

Returns

The output of the callable that was evaluated

Return type

TensorFlow Tensor

divide(tensor_in_1, tensor_in_2)[source]
einsum(subscripts, *operands)[source]

A generalized contraction between tensors of arbitrary dimension.

This function returns a tensor whose elements are defined by equation, which is written in a shorthand form inspired by the Einstein summation convention.

Parameters
  • subscripts – str, specifies the subscripts for summation

  • operands – list of array_like, these are the tensors for the operation

Returns

the calculation based on the Einstein summation convention

Return type

TensorFlow Tensor

erf(tensor_in)[source]

The error function of complex argument.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> a = pyhf.tensorlib.astensor([-2., -1., 0., 1., 2.])
>>> t = pyhf.tensorlib.erf(a)
>>> print(t)
tf.Tensor([-0.9953223 -0.8427007  0.         0.8427007  0.9953223], shape=(5,), dtype=float32)
Parameters

tensor_in (tensor) – The input tensor object

Returns

The values of the error function at the given points.

Return type

TensorFlow Tensor

erfinv(tensor_in)[source]

The inverse of the error function of complex argument.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> a = pyhf.tensorlib.astensor([-2., -1., 0., 1., 2.])
>>> t = pyhf.tensorlib.erfinv(pyhf.tensorlib.erf(a))
>>> print(t)
tf.Tensor([-2.000001   -0.99999964  0.          0.99999964  1.9999981 ], shape=(5,), dtype=float32)
Parameters

tensor_in (tensor) – The input tensor object

Returns

The values of the inverse of the error function at the given points.

Return type

TensorFlow Tensor

exp(tensor_in)[source]
gather(tensor, indices)[source]
isfinite(tensor)[source]
log(tensor_in)[source]
normal(x, mu, sigma)[source]

The probability density function of the Normal distribution evaluated at x given parameters of mean of mu and standard deviation of sigma.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.normal(0.5, 0., 1.)
>>> print(t)
tf.Tensor(0.35206532, shape=(), dtype=float32)
>>> values = pyhf.tensorlib.astensor([0.5, 2.0])
>>> means = pyhf.tensorlib.astensor([0., 2.3])
>>> sigmas = pyhf.tensorlib.astensor([1., 0.8])
>>> t = pyhf.tensorlib.normal(values, means, sigmas)
>>> print(t)
tf.Tensor([0.35206532 0.46481887], shape=(2,), dtype=float32)
Parameters
  • x (tensor or float) – The value at which to evaluate the Normal distribution p.d.f.

  • mu (tensor or float) – The mean of the Normal distribution

  • sigma (tensor or float) – The standard deviation of the Normal distribution

Returns

Value of Normal(x|mu, sigma)

Return type

TensorFlow Tensor

normal_cdf(x, mu=0.0, sigma=1)[source]

Compute the value of cumulative distribution function for the Normal distribution at x.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.normal_cdf(0.8)
>>> print(t)
tf.Tensor(0.7881446, shape=(), dtype=float32)
>>> values = pyhf.tensorlib.astensor([0.8, 2.0])
>>> t = pyhf.tensorlib.normal_cdf(values)
>>> print(t)
tf.Tensor([0.7881446  0.97724986], shape=(2,), dtype=float32)
Parameters
  • x (tensor or float) – The observed value of the random variable to evaluate the CDF for

  • mu (tensor or float) – The mean of the Normal distribution

  • sigma (tensor or float) – The standard deviation of the Normal distribution

Returns

The CDF

Return type

TensorFlow Tensor

normal_dist(mu, sigma)[source]

Construct a Normal distribution with mean mu and standard deviation sigma.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> means = pyhf.tensorlib.astensor([5, 8])
>>> stds = pyhf.tensorlib.astensor([1, 0.5])
>>> values = pyhf.tensorlib.astensor([4, 9])
>>> normals = pyhf.tensorlib.normal_dist(means, stds)
>>> t = normals.log_prob(values)
>>> print(t)
tf.Tensor([-1.4189385 -2.2257915], shape=(2,), dtype=float32)
Parameters
  • mu (tensor or float) – The mean of the Normal distribution

  • sigma (tensor or float) – The standard deviation of the Normal distribution

Returns

The Normal distribution class

Return type

TensorFlow Probability Normal distribution

normal_logpdf(x, mu, sigma)[source]

The log of the probability density function of the Normal distribution evaluated at x given parameters of mean of mu and standard deviation of sigma.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.normal_logpdf(0.5, 0., 1.)
>>> print(t)
tf.Tensor(-1.0439385, shape=(), dtype=float32)
>>> values = pyhf.tensorlib.astensor([0.5, 2.0])
>>> means = pyhf.tensorlib.astensor([0., 2.3])
>>> sigmas = pyhf.tensorlib.astensor([1., 0.8])
>>> t = pyhf.tensorlib.normal_logpdf(values, means, sigmas)
>>> print(t)
tf.Tensor([-1.0439385 -0.7661075], shape=(2,), dtype=float32)
Parameters
  • x (tensor or float) – The value at which to evaluate the Normal distribution p.d.f.

  • mu (tensor or float) – The mean of the Normal distribution

  • sigma (tensor or float) – The standard deviation of the Normal distribution

Returns

Value of log(Normal(x|mu, sigma))

Return type

TensorFlow Tensor

ones(shape)[source]
outer(tensor_in_1, tensor_in_2)[source]
poisson(n, lam)[source]

The continuous approximation, using \(n! = \Gamma\left(n+1\right)\), to the probability mass function of the Poisson distribution evaluated at n given the parameter lam.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.poisson(5., 6.)
>>> print(t)
tf.Tensor(0.16062315, shape=(), dtype=float32)
>>> values = pyhf.tensorlib.astensor([5., 9.])
>>> rates = pyhf.tensorlib.astensor([6., 8.])
>>> t = pyhf.tensorlib.poisson(values, rates)
>>> print(t)
tf.Tensor([0.16062315 0.12407687], shape=(2,), dtype=float32)
Parameters
  • n (tensor or float) – The value at which to evaluate the approximation to the Poisson distribution p.m.f. (the observed number of events)

  • lam (tensor or float) – The mean of the Poisson distribution p.m.f. (the expected number of events)

Returns

Value of the continuous approximation to Poisson(n|lam)

Return type

TensorFlow Tensor

poisson_dist(rate)[source]

Construct a Poisson distribution with rate parameter rate.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> rates = pyhf.tensorlib.astensor([5, 8])
>>> values = pyhf.tensorlib.astensor([4, 9])
>>> poissons = pyhf.tensorlib.poisson_dist(rates)
>>> t = poissons.log_prob(values)
>>> print(t)
tf.Tensor([-1.7403021 -2.086854 ], shape=(2,), dtype=float32)
Parameters

rate (tensor or float) – The mean of the Poisson distribution (the expected number of events)

Returns

The Poisson distribution class

Return type

TensorFlow Probability Poisson distribution

poisson_logpdf(n, lam)[source]

The log of the continuous approximation, using \(n! = \Gamma\left(n+1\right)\), to the probability mass function of the Poisson distribution evaluated at n given the parameter lam.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.poisson_logpdf(5., 6.)
>>> print(t)
tf.Tensor(-1.8286943, shape=(), dtype=float32)
>>> values = pyhf.tensorlib.astensor([5., 9.])
>>> rates = pyhf.tensorlib.astensor([6., 8.])
>>> t = pyhf.tensorlib.poisson_logpdf(values, rates)
>>> print(t)
tf.Tensor([-1.8286943 -2.086854 ], shape=(2,), dtype=float32)
Parameters
  • n (tensor or float) – The value at which to evaluate the approximation to the Poisson distribution p.m.f. (the observed number of events)

  • lam (tensor or float) – The mean of the Poisson distribution p.m.f. (the expected number of events)

Returns

Value of the continuous approximation to log(Poisson(n|lam))

Return type

TensorFlow Tensor

power(tensor_in_1, tensor_in_2)[source]
product(tensor_in, axis=None)[source]
ravel(tensor)[source]

Return a flattened view of the tensor, not a copy.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> tensor = pyhf.tensorlib.astensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
>>> t_ravel = pyhf.tensorlib.ravel(tensor)
>>> print(t_ravel)
tf.Tensor([1. 2. 3. 4. 5. 6.], shape=(6,), dtype=float32)
Parameters

tensor (Tensor) – Tensor object

Returns

A flattened array.

Return type

tf.Tensor

reshape(tensor, newshape)[source]
shape(tensor)[source]
simple_broadcast(*args)[source]

Broadcast a sequence of 1 dimensional arrays.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> b = pyhf.tensorlib.simple_broadcast(
...   pyhf.tensorlib.astensor([1]),
...   pyhf.tensorlib.astensor([2, 3, 4]),
...   pyhf.tensorlib.astensor([5, 6, 7]))
>>> print([str(t) for t in b]) 
['tf.Tensor([1. 1. 1.], shape=(3,), dtype=float32)',
 'tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)',
 'tf.Tensor([5. 6. 7.], shape=(3,), dtype=float32)']
Parameters

args (Array of Tensors) – Sequence of arrays

Returns

The sequence broadcast together.

Return type

list of Tensors

sqrt(tensor_in)[source]
stack(sequence, axis=0)[source]
sum(tensor_in, axis=None)[source]
tile(tensor_in, repeats)[source]

Repeat tensor data along a specific dimension

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> a = pyhf.tensorlib.astensor([[1.0], [2.0]])
>>> t = pyhf.tensorlib.tile(a, (1, 2))
>>> print(t)
tf.Tensor(
[[1. 1.]
 [2. 2.]], shape=(2, 2), dtype=float32)
Parameters
  • tensor_in (tensor) – The tensor to be repeated

  • repeats (tensor) – The tuple of multipliers for each dimension

Returns

The tensor with repeated axes

Return type

TensorFlow Tensor

to_numpy(tensor_in)[source]

Convert the TensorFlow tensor to a numpy.ndarray.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> tensor = pyhf.tensorlib.astensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
>>> print(tensor)
tf.Tensor(
[[1. 2. 3.]
 [4. 5. 6.]], shape=(2, 3), dtype=float32)
>>> numpy_ndarray = pyhf.tensorlib.to_numpy(tensor)
>>> numpy_ndarray
array([[1., 2., 3.],
       [4., 5., 6.]], dtype=float32)
>>> type(numpy_ndarray)
<class 'numpy.ndarray'>
Parameters

tensor_in (tensor) – The input tensor object.

Returns

The tensor converted to a NumPy ndarray.

Return type

numpy.ndarray

tolist(tensor_in)[source]
where(mask, tensor_in_1, tensor_in_2)[source]

Apply a boolean selection mask to the elements of the input tensors.

Example

>>> import pyhf
>>> pyhf.set_backend("tensorflow")
>>> t = pyhf.tensorlib.where(
...     pyhf.tensorlib.astensor([1, 0, 1], dtype='bool'),
...     pyhf.tensorlib.astensor([1, 1, 1]),
...     pyhf.tensorlib.astensor([2, 2, 2]),
... )
>>> print(t)
tf.Tensor([1. 2. 1.], shape=(3,), dtype=float32)
Parameters
  • mask (bool) – Boolean mask (boolean or tensor object of booleans)

  • tensor_in_1 (Tensor) – Tensor object

  • tensor_in_2 (Tensor) – Tensor object

Returns

The result of the mask being applied to the tensors.

Return type

TensorFlow Tensor

zeros(shape)[source]