| import torch | |
| def transform_targets(targets): | |
| """ | |
| Applies the log-transform used during training: | |
| y_trans = sign(y) * log(1 + |y|) | |
| Args: | |
| targets: torch.Tensor or float, raw returns (e.g. 1.5 for 150%) | |
| Returns: | |
| transformed targets in the same shape/type | |
| """ | |
| if isinstance(targets, torch.Tensor): | |
| return torch.sign(targets) * torch.log1p(torch.abs(targets)) | |
| else: | |
| # Handle float/numpy | |
| import numpy as np | |
| return np.sign(targets) * np.log1p(np.abs(targets)) | |
| def inverse_transform_targets(transformed_targets): | |
| """ | |
| Inverts the log-transform to get back raw returns: | |
| y = sign(y_trans) * (exp(|y_trans|) - 1) | |
| Args: | |
| transformed_targets: torch.Tensor, model outputs (logits) | |
| Returns: | |
| raw returns (e.g. 1.5 for 150%) | |
| """ | |
| if isinstance(transformed_targets, torch.Tensor): | |
| return torch.sign(transformed_targets) * (torch.exp(torch.abs(transformed_targets)) - 1) | |
| else: | |
| import numpy as np | |
| return np.sign(transformed_targets) * (np.exp(np.abs(transformed_targets)) - 1) | |