import h5py
import os
from .misc import ten2mat
from .misc import mat2ten
from .Grid import Grid
from .Grid import Random
from .Computation import *
[docs]
class ValidationSet(object):
"""
ValidationSet object
Parameters
----------
grid : Grid object
Grid object containing the validation points (grid.coords, grid.coords_norm)
results : ndarray [n_grid x n_out]
Results of the model evaluation
gradient_results : ndarray [n_grid x n_out x dim], optional, default=None
Gradient of results of the model evaluations
gradient_idx : ndarray of int [n_grid]
Indices of grid points where the gradient was evaluated
problem : Problem instance, optional, default: None
GPC problem (needed to create a Validation set without GPC instance)
"""
def __init__(self, grid=None, results=None, gradient_results=None, gradient_idx=None, problem=None):
"""
Initializes ValidationSet
"""
self.grid = grid
self.results = results
self.gradient_results = gradient_results
self.gradient_idx = gradient_idx
self.problem = problem
[docs]
def create(self, grid=None, n_samples=None, n_cpu=1):
"""
Creates a Validation set; Calls model and evaluates results; Provide either grid or number of samples.
Parameters
----------
grid : Grid instance, optional, default: None
Grid instance the Validation set is computed with
n_samples : int, optional, default: None
Number of samples; if grid is provided, the validation set is created using the grid
n_cpu : int, optional, default: 1
Number of CPU cores to use to create validation set.
"""
if grid is not None:
self.grid = grid
if self.grid is None and n_samples is not None:
self.grid = Random(parameters_random=self.problem.parameters_random,
n_grid=n_samples)
else:
raise ValueError("Provide grid or n_samples to create a validation set.")
# Evaluate original model at grid points
com = Computation(n_cpu=n_cpu, matlab_model=self.problem.model.matlab_model)
self.results = com.run(model=self.problem.model, problem=self.problem, coords=self.grid.coords)
if self.results.ndim == 1:
self.results = self.results[:, np.newaxis]
[docs]
def write(self, fname, folder=None, overwrite=False):
"""
Save ValidationSet in .hdf5 format
Parameters
----------
fname : str
Filename of ValidationSet containing the grid points and the results data
folder : str, optional, default: None
Path in .hdf5 file containing the validation set
overwrite : bool, optional, default: False
Overwrite existing validation set
Returns
-------
<file> : .hdf5 file
File containing the grid points in grid/coords and grid/coords_norm
and the corresponding results in model_evaluations/results
"""
if folder is None:
folder = ""
with h5py.File(fname, 'a') as f:
try:
f.create_dataset(folder + "/grid/coords", data=self.grid.coords)
f.create_dataset(folder + "/grid/coords_norm", data=self.grid.coords_norm)
f.create_dataset(folder + "/model_evaluations/results", data=self.results)
if self.gradient_results is not None:
f.create_dataset(folder + "/model_evaluations/gradient_results",
data=ten2mat(self.gradient_results))
f.create_dataset(folder + "/model_evaluations/gradient_results_idx",
data=self.gradient_idx)
except RuntimeError:
if not overwrite:
pass
else:
if folder == "":
folder_read = "/"
for key in f[folder_read].keys():
del f[folder + key]
f.create_dataset(folder + "/grid/coords", data=self.grid.coords)
f.create_dataset(folder + "/grid/coords_norm", data=self.grid.coords_norm)
f.create_dataset(folder + "/model_evaluations/results", data=self.results)
if self.gradient_results is not None:
f.create_dataset(folder + "/model_evaluations/gradient_results",
data=ten2mat(self.gradient_results))
f.create_dataset(folder + "/model_evaluations/gradient_results_idx",
data=self.gradient_idx)
[docs]
def read(self, fname, folder=None, coords_key=None, coords_norm_key=None, results_key=None, gradient_results_key=None,
gradient_idx_key=None):
""" Load Validation set from .hdf5 format
Parameters
----------
fname : str
Filename of ValidationSet containing the grid points and the results data
folder : str
Path in .hdf5 file containing the validation set
coords_key : str, optional, default: "grid/coords"
Path of coords in .hdf5 file
coords_norm_key : str, optional, default: "grid/coords_norm"
Path of coords_norm in .hdf5 file
results_key : str, optional, default: "model_evaluations/results"
Path of results in .hdf5 file
gradient_results_key : str, optional, default: "model_evaluations/gradient_results"
Path of gradient_results in .hdf5 file
gradient_idx_key : str, optional, default: "model_evaluations/gradient_results_idx"
Path of gradient_results in .hdf5 file
Returns
-------
val : ValidationSet Object
ValidationSet object containing the grid points and the results data
"""
if folder is None:
folder = ""
if coords_key is None:
coords_key = folder + "/grid/coords"
if coords_norm_key is None:
coords_norm_key = folder + "/grid/coords_norm"
if results_key is None:
results_key = folder + "/model_evaluations/results"
if gradient_results_key is None:
gradient_results_key = folder + "/model_evaluations/gradient_results"
if gradient_idx_key is None:
gradient_idx_key = folder + "/model_evaluations/gradient_results_idx"
del self.results
del self.gradient_results
del self.gradient_idx
with h5py.File(fname, 'r') as f:
coords = f[coords_key][:]
coords_norm = f[coords_norm_key][:]
self.results = f[results_key][:]
try:
self.gradient_results = mat2ten(f[gradient_results_key][:])
self.gradient_idx = f[gradient_idx_key]
except KeyError:
pass
self.grid = Grid(parameters_random=[None]*coords.shape[1], coords=coords, coords_norm=coords_norm)
return self