from . import gaussian_diffusion as gd_orig from . import gaussian_diffusion_dual as gd_dual # from .respace import SpacedDiffusion, space_timesteps def create_diffusion( timestep_respacing, noise_schedule="linear", use_kl=False, sigma_small=False, predict_xstart=False, learn_sigma=True, rescale_learned_sigmas=False, diffusion_steps=1000, dual=False ): if dual: print("Using DUAL diffusion") from .respace_dual import SpacedDiffusion, space_timesteps gd_module = gd_dual else: print("Using SINGLE diffusion") from .respace import SpacedDiffusion, space_timesteps gd_module = gd_orig betas = gd_module.get_named_beta_schedule(noise_schedule, diffusion_steps) # betas = gd.get_named_beta_schedule(noise_schedule, diffusion_steps) if use_kl: loss_type = gd_module.LossType.RESCALED_KL elif rescale_learned_sigmas: loss_type = gd_module.LossType.RESCALED_MSE else: loss_type = gd_module.LossType.MSE if timestep_respacing is None or timestep_respacing == "": timestep_respacing = [diffusion_steps] return SpacedDiffusion( use_timesteps=space_timesteps(diffusion_steps, timestep_respacing), betas=betas, model_mean_type=( gd_module.ModelMeanType.EPSILON if not predict_xstart else gd_module.ModelMeanType.START_X ), model_var_type=( ( gd_module.ModelVarType.FIXED_LARGE if not sigma_small else gd_module.ModelVarType.FIXED_SMALL ) if not learn_sigma else gd_module.ModelVarType.LEARNED_RANGE ), loss_type=loss_type # rescale_timesteps=rescale_timesteps, )