Source code for tensorwaves.data.tf_phasespace

"""Phase space generation using tensorflow."""

import numpy as np
import phasespace
import tensorflow as tf

from tensorwaves.interfaces import (
    PhaseSpaceGenerator,
    UniformRealNumberGenerator,
)
from tensorwaves.physics.helicity_formalism.kinematics import (
    ParticleReactionKinematicsInfo,
)


[docs]class TFPhaseSpaceGenerator(PhaseSpaceGenerator): """Implements a phase space generator using tensorflow.""" def __init__( self, reaction_kinematics_info: ParticleReactionKinematicsInfo ) -> None: self.phsp_gen = phasespace.nbody_decay( reaction_kinematics_info.total_invariant_mass, reaction_kinematics_info.final_state_masses, )
[docs] def generate( self, size: int, random_generator: UniformRealNumberGenerator ) -> np.ndarray: weights, particles = self.phsp_gen.generate(n_events=size) particles = np.array( tuple(particles[x].numpy() for x in particles.keys()) ) return particles, weights
[docs]class TFUniformRealNumberGenerator(UniformRealNumberGenerator): """Implements a uniform real random number generator using tensorflow.""" def __init__(self, seed: int): self.__seed = seed self.generator = tf.random.Generator.from_seed(self.seed) self.dtype = tf.float64
[docs] def __call__( self, size: int, min_value: float = 0.0, max_value: float = 1.0 ) -> np.ndarray: return self.generator.uniform( shape=[size], minval=min_value, maxval=max_value, dtype=self.dtype, )
@property def seed(self) -> int: return self.__seed @seed.setter def seed(self, value: int) -> None: self.__seed = value