DI-PCG / core /utils /math_utils.py
thuzhaowang's picture
init
b6a9b6d
raw
history blame
3.15 kB
import math
import numpy as np
def norm_pdf(x, mean, sd):
var = float(sd)**2
denom = (2 * math.pi * var)**.5
num = math.exp(-(float(x) - float(mean))**2 / (2 * var))
return num / denom
def norm_cdf(x, mean, sd):
# calculate the cumulative distribution function for the normal distribution
return (1. + math.erf((x - mean) / (math.sqrt(2) * sd))) / 2.
def normalize_params(params, params_dict):
# 1. normalize the GT params into [-1, 1] range 2. convert discrete params into continuous
keys_p, keys_d = params.keys(), params_dict.keys()
assert set(keys_p) == set(keys_d)
for key in params.keys():
param_type = params_dict[key][0]
if param_type == "discrete":
# assume discrete params are represented as continuous integers
choices = params_dict[key][1]
leng = len(choices)
if choices[0].__class__ == float:
# TODO: this is to fix float discrete params
idx = np.where(np.array(choices) == float(params[key]))[0][0]
else:
idx = np.where(np.array(choices) == float(int(params[key])))[0][0]
# uniformly partition the target [-1, 1] range into equal parts
# set the discrete value as the middle point of the partition
params[key] = 2.0 / leng * (idx + 0.5) - 1
elif param_type == "continuous":
# uniformly project the parameter value into [-1, 1] range
min_v, max_v = params_dict[key][1]
params[key] = ((params[key] - min_v) / (max_v - min_v)) * 2 - 1
elif param_type == "normal":
mean, std = params_dict[key][1]
# clamp the normal distribution to [mean-3\sigma, mean+3\sigma],
# and then uniformly project the value into [-1, 1] range
min_v, max_v = mean - 3 * std, mean + 3 * std
params[key] = ((params[key] - min_v) / (max_v - min_v)) * 2 - 1
else:
raise NotImplementedError
return params
def unnormalize_params(params, params_dict):
# project the parameters back to the original range
# TODO: assume the params is ordered in the same order as params_dict keys
keys = params_dict.keys()
params_u = {}
for i, key in enumerate(keys):
param_type = params_dict[key][0]
# do the clamp to the predicted params into [-1, 1]
params_i = np.clip(params[i], -1, 1)
if param_type == "discrete":
choices = params_dict[key][1]
leng = len(choices)
idx = (params_i + 1) // (2 / leng)
if idx > leng - 1:
idx = leng - 1
params_u[key] = choices[int(idx)]
elif param_type == "continuous":
min_v, max_v = params_dict[key][1]
params_u[key] = ((params_i + 1) / 2) * (max_v - min_v) + min_v
elif param_type == "normal":
mean, std = params_dict[key][1]
min_v, max_v = mean - 3 * std, mean + 3 * std
params_u[key] = ((params_i + 1) / 2) * (max_v - min_v) + min_v
else:
raise NotImplementedError
return params_u