Spaces:
Runtime error
Runtime error
| 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 |