Source code for medipt.utils.random_float

import numpy as np
import random
from typing import Union, Tuple, List, Any, Callable, Optional
from types import ModuleType


[docs]def initialize_rand_state( seed: Union[np.random.RandomState, np.random.Generator, np.random.BitGenerator, int, None] = None, legacy_random_state: bool = True, ) -> Union[ModuleType, np.random.Generator, np.random.BitGenerator]: if seed is not None: if isinstance(seed, int): if legacy_random_state: np.random.seed(seed) random.seed(seed) else: ran_gen = np.random.default_rng(seed) random.seed(seed) elif isinstance(seed, np.random.RandomState): np.random.set_state(np.random.get_state()) random.setstate(random.getstate()) elif isinstance(seed, (np.random.Generator, np.random.BitGenerator)): ran_gen = np.random.default_rng(seed) else: if legacy_random_state: np.random.set_state(np.random.get_state()) random.setstate(random.getstate()) else: ran_gen = np.random.default_rng() if legacy_random_state: rand_init = np.random else: rand_init = ran_gen return rand_init
[docs]def random_binomial( n: Union[int, float, np.integer, np.floating], p: Union[int, float, np.integer, np.floating], output_size: Union[List[Union[int, float]], Tuple[Union[int, float]], int, float, np.integer, np.floating] = None, ignore_axis: Union[None, List[int], Tuple[int], int] = None, seed: Union[np.random.RandomState, np.random.Generator, np.random.BitGenerator, int, None] = None, legacy_random_state: bool = True, rand_init: Union[ModuleType, np.random.Generator, np.random.BitGenerator] = None) -> Union[np.ndarray, int]: ''' :param n: :param p: :param output_size: :param ignore_axis: Ignores the axis specified. If None, then no axis is ignored. Works only for 1D right now. :param seed: :param legacy_random_state: :return: ''' if rand_init is None: rand_init = initialize_rand_state(seed=seed, legacy_random_state=legacy_random_state) binomial_out = rand_init.binomial(n=n, p=p, size=output_size) if (output_size is not None) and (ignore_axis is not None): if isinstance(ignore_axis, int): binomial_out[ignore_axis] = 1 elif isinstance(ignore_axis, (list, tuple)): for idx in ignore_axis: binomial_out[idx] = 1 else: raise ValueError('ignore_axis must be an int, list, or tuple.') return binomial_out
[docs]def random_uniform_float( low_value: Union[float, int, List[Union[int, float]], Tuple[Union[int, float], ...], np.integer, np.floating, np.ndarray], high_value: Union[float, int, List[Union[int, float]], Tuple[Union[int, float], ...], np.integer, np.floating, np.ndarray], output_size: Union[float, int, List[Union[int, float]], Tuple[Union[int, float], ...], np.integer, np.floating, np.ndarray, None] = None, dim: Union[int, None] = None, seed: Union[np.random.RandomState, np.random.Generator, np.random.BitGenerator, int, None] = None, legacy_random_state: bool = True, rand_init: Union[ModuleType, np.random.Generator, np.random.BitGenerator] = None ) -> Union[float, List[float], np.ndarray]: if rand_init is None: rand_init = initialize_rand_state(seed=seed, legacy_random_state=legacy_random_state) # if seed is not None: # if isinstance(seed, int): # if legacy_random_state: # np.random.seed(seed) # random.seed(seed) # # else: # ran_gen = np.random.default_rng(seed) # random.seed(seed) # # elif isinstance(seed, np.random.RandomState): # np.random.set_state(np.random.get_state()) # random.setstate(random.getstate()) # # elif isinstance(seed, (np.random.Generator, np.random.BitGenerator)): # ran_gen = np.random.default_rng(seed) # # else: # if legacy_random_state: # np.random.set_state(np.random.get_state()) # random.setstate(random.getstate()) # # else: # ran_gen = np.random.default_rng() # # # if legacy_random_state: # rand_init = np.random # # else: # rand_init = ran_gen if (output_size is not None) and (dim is not None): if isinstance(output_size, (int, float, np.integer, np.floating)): output_size = (output_size, dim) elif isinstance(output_size, (list, tuple, np.ndarray)): output_size = *output_size, dim else: raise ValueError('output_size must be a number, list, tuple, or numpy array.') if isinstance(low_value, np.ndarray) or (isinstance(high_value, np.ndarray)): if isinstance(low_value, np.ndarray) and (isinstance(high_value, np.ndarray)): if low_value.shape != high_value.shape: raise ValueError('shape of low_value must be equal to shape of high_value.') else: if output_size is None: random_uniform = [float(rand_init.uniform(low=l, high=h)) for l, h in zip(low_value, high_value)] return random_uniform else: random_uniform = rand_init.uniform(low=low_value, high=high_value, size=output_size) return random_uniform elif isinstance(low_value, np.ndarray) and (isinstance(high_value, (int, float, np.integer, np.floating))): if len(low_value) > 1: raise ValueError('size of low_value must be equal to size of high_value.') else: low_value = low_value[0] random_uniform = float(rand_init.uniform(low=low_value, high=high_value)) return random_uniform elif isinstance(low_value, (int, float, np.integer, np.floating)) and (isinstance(high_value, np.ndarray)): if len(high_value) > 1: raise ValueError('size of low_value must be equal to size of high_value.') else: high_value = high_value[0] random_uniform = float(rand_init.uniform(low=low_value, high=high_value)) return random_uniform # if output_size is None: # random_uniform = np.random.uniform(low=low_value, high=high_value) # return random_uniform # # else: # random_uniform = np.random.uniform(low=low_value, hig elif (isinstance(low_value, (int, float, np.integer, np.floating)) is False) and ( isinstance(high_value, (int, float, np.integer, np.floating)) is False): if len(low_value) != len(high_value): raise ValueError('size of low_value must be equal to size of high_value.') elif (isinstance(low_value, (int, float, np.integer, np.floating)) is False) and ( isinstance(high_value, (int, float, np.integer, np.floating))): high_value = [high_value] * len(low_value) elif (isinstance(low_value, (int, float, np.integer, np.floating))) and ( isinstance(high_value, (int, float, np.integer, np.floating)) is False): low_value = [low_value] * len(high_value) else: random_uniform = rand_init.uniform(low=low_value, high=high_value, size=output_size) return random_uniform if output_size is None: random_uniform = [float(rand_init.uniform(low=l, high=h)) for l, h in zip(low_value, high_value)] return random_uniform else: random_uniform = np.stack( [rand_init.uniform(low=l, high=h, size=output_size) for l, h in zip(low_value, high_value)]) return random_uniform
# random_val_list = None # output_size_no_channel = None # if output_size: # if len(output_size) > dim: # output_size_no_channel = output_size[:dim] # # if isinstance(value, (int, float)): # if output_size is not None: # random_val_list = np.random.uniform(low=-value, high=value, size=output_size) # else: # random_val_list = list(np.random.uniform(low=-value, high=value, size=dim)) # # elif isinstance(value, (tuple, list)): # if isinstance(value[0], (float, int)): # if len(value) == 1: # if output_size is None: # random_val_list = list(np.random.uniform(low=-value[0], high=value[0], size=dim)) # # else: # random_val_list = np.zeros(tuple(output_size)) # random_val_list[..., 0] = np.random.uniform(low=-value[0], high=value[0], # size=output_size_no_channel) # elif len(value) == dim: # if output_size is None: # random_val_list = [np.random.uniform(low=-val, high=val) for val in value] # # else: # random_val_list = np.zeros(tuple(output_size)) # for val_idx, val in enumerate(value): # random_val_list[..., val_idx] = np.random.uniform(low=-val, high=val, # size=output_size_no_channel) # # # elif len(value) == 2: # if output_size is not None: # random_val_list = np.random.uniform(low=value[0], high=value[1], size=output_size) # else: # random_val_list = list(np.random.uniform(low=value[0], high=value[1], size=dim)) # # elif len(value) == dim * 2: # val_reshape = [] # counter = 0 # for v in value: # if counter == 0: # v_hold = [] # v_hold.append(v) # counter = 1 # elif counter == 1: # v_hold.append(v) # val_reshape.append(v_hold) # counter = 0 # # if output_size is None: # random_val_list = [np.random.uniform(low=val[0], high=val[1]) for val in val_reshape] # # else: # random_val_list = np.zeros(tuple(output_size)) # for val_idx, value in enumerate(value): # random_val_list[..., val_idx] = np.random.uniform(low=value[val_idx][0], high=value[val_idx][1], # size=output_size_no_channel) # # elif isinstance(value[0], (tuple, list)): # random_val_list = [np.random.uniform(low=val[0], high=val[1]) for val in value] # # elif isinstance(value[0], np.ndarray): # raise ValueError('Numpy arrays are not currently supported. Please use list or tuples.') # else: # raise ValueError('value was found to have an incorrect shape') # # # elif isinstance(value, np.ndarray): # raise ValueError('Numpy arrays are not currently supported. Please use list, tuples, floats or ints') # else: # raise ValueError('value was found to have an incorrect shape') # # # return random_val_list