Source code for idmtools_calibra.resamplers.random_perturbation_resampler
import os
import pandas as pd
from idmtools_calibra.algorithms.fisher_inf_matrix import perturbed_points
from idmtools_calibra.resamplers.base_resampler import BaseResampler
from idmtools_calibra.resamplers.calibration_point import CalibrationPoint
[docs]class RandomPerturbationResampler(BaseResampler):
def __init__(self, calib_manager=None, **kwargs):
"""
:param kwargs: These are arguments passed directly to the perturbed points generation routine.
"""
super().__init__(calib_manager)
# TODO What are these? EEK
self.center_point = None
self.resampled_points_df: pd.DataFrame = None
# Will hold out transforms perturbed points to CalibrationPoint Objects
self.resampled_points = None
self.resample_kwargs = kwargs
[docs] def resample(self, calibrated_points, selection_values, initial_calibration_points):
"""
Takes in a list of 1+ Point objects and returns method-specific resampled points as a list of Point objects
The resultant Point objects should be copies of the input Points BUT with Value overridden on each, e.g.::
new_point = Point.copy(one_of_the_input_calibrated_points)
for param in new_point.list_params():
new_point.set_param_value(param, value=SOME_NEW_VALUE)
Args:
calibrated_points: input points for this resampling method
selection_values:
initial_calibration_points:
Returns:
A list of resampled Point objects
"""
# method-specific stuff here
n_calibrated_points = len(calibrated_points)
if n_calibrated_points != 1:
raise Exception('RandomPerturbationResampler requires there to be exactly one input point. There are %d'
% n_calibrated_points)
self.center_point = initial_calibration_points[0]
self.resampled_points_df = self.generate_perturbed_points(self.center_point)
# transform perturbed_points to CalibrationPoint objects
self.resampled_points = self._transform_df_points_to_calibrated_points(self.center_point,
self.resampled_points_df)
# this can be anything; will be made available for use in post_analysis() method in the from_resample argument
for_post_analysis = None
return self.resampled_points, for_post_analysis
[docs] def post_analysis(self, resampled_points, analyzer_results, from_resample=None):
"""
Args:
resampled_points:
analyzer_results:
from_resample:
Returns:
"""
super().post_analysis(resampled_points, analyzer_results, from_resample=from_resample)
# write the initial center point for later reference
output_filename = os.path.join(self.output_location, 'center.json')
self.center_point.write_point(output_filename)
# save new_points dataframe to csv file
output_filename = os.path.join(self.output_location, 'data.csv')
self.resampled_points_df.to_csv(output_filename)
# save perturbed_points with likelihood to file
resampled_points_df_ll = self.resampled_points_df.copy()
resampled_points_df_ll.insert(4, 'LL', analyzer_results)
output_filename = os.path.join(self.output_location, 'LLdata.csv')
resampled_points_df_ll.to_csv(output_filename)
[docs] def generate_perturbed_points(self, center_point) -> pd.DataFrame:
"""
given center and generate perturbed points
Args:
center_point: center point
Returns:
"""
as_type = CalibrationPoint.NUMPY
names = center_point.get_attribute('Name', parameter_type=CalibrationPoint.DYNAMIC)
center = center_point.get_attribute('Value', parameter_type=CalibrationPoint.DYNAMIC, as_type=as_type)
param_min = center_point.get_attribute('Min', parameter_type=CalibrationPoint.DYNAMIC, as_type=as_type)
param_max = center_point.get_attribute('Max', parameter_type=CalibrationPoint.DYNAMIC, as_type=as_type)
# get perturbed points
df_perturbed_points = perturbed_points(center, param_min, param_max, **self.resample_kwargs)
# re-name columns
self.selection_columns = ['i(1to4)', 'j(1toN)', 'k(1toM)',
'run_number'] # to be made available in the following resampling
df_perturbed_points.columns = self.selection_columns + names
# attach static parameters
names = center_point.get_attribute('Name', parameter_type=CalibrationPoint.STATIC)
values = center_point.get_attribute('Value', parameter_type=CalibrationPoint.STATIC)
for i in range(len(names)):
df_perturbed_points = df_perturbed_points.assign(**{str(names[i]): values[i]})
df_perturbed_points.sort_index(axis=1, inplace=True)
return df_perturbed_points