def __init__(self): self.connection_options = ConnectionOptions() self.estimation_options = RequestOptions() self.data_set_path = "" self.weights = {} self.denominators = {} self.polling_interval = 600
def _run_calculations( data_set: "PhysicalPropertyDataSet", force_field: "ForceField", polling_interval: int, request_options: "RequestOptions", server_config: EvaluatorServerConfig, ) -> "RequestResult": """Attempt to estimate the data set using the specified force field. Parameters ---------- data_set The data set to estimate. force_field The force field to estimate the data set with. polling_interval The interval with which to attempt to retrieve the results. request_options The options to use when estimating the data set. server_config The configuration to use for the evaluator server. """ from openff.evaluator.client import ConnectionOptions, EvaluatorClient calculation_backend = server_config.to_backend() with calculation_backend: evaluator_server = server_config.to_server(calculation_backend) with evaluator_server: # Request the estimates. client = EvaluatorClient( ConnectionOptions(server_port=server_config.port)) request, error = client.request_estimate( property_set=data_set, force_field_source=force_field, options=request_options, ) if error is not None: raise error # Wait for the results. results, error = request.results(True, polling_interval=polling_interval) if error is not None: raise error return results
def main(): setup_timestamp_logging() # Load in the force field force_field_path = "smirnoff99Frosst-1.1.0.offxml" force_field_source = SmirnoffForceFieldSource.from_path(force_field_path) # Load in the data set containing the pure and binary properties. data_set = PhysicalPropertyDataSet.from_json("pure_data_set.json") data_set.merge(PhysicalPropertyDataSet.from_json("binary_data_set.json")) # Set up a server object to run the calculations using. server = setup_server(backend_type=BackendType.LocalGPU, max_number_of_workers=1, port=8001) with server: # Request the estimates. property_estimator = EvaluatorClient( ConnectionOptions(server_port=8001)) for calculation_layer in ["SimulationLayer", "ReweightingLayer"]: options = RequestOptions() options.calculation_layers = [calculation_layer] parameter_gradient_keys = [ ParameterGradientKey(tag="vdW", smirks="[#6X4:1]", attribute="epsilon"), ParameterGradientKey(tag="vdW", smirks="[#6X4:1]", attribute="rmin_half"), ] request, _ = property_estimator.request_estimate( property_set=data_set, force_field_source=force_field_source, options=options, parameter_gradient_keys=parameter_gradient_keys, ) # Wait for the results. results, _ = request.results(True, 5) layer_name = re.sub(r"(?<!^)(?=[A-Z])", "_", calculation_layer).lower() results.json(f"pure_binary_{layer_name}.json", True)
def from_json(cls, json_source): """Creates this class from a JSON string. Parameters ------- json_source: str or file-like object The JSON representation of this class. """ if isinstance(json_source, str): with open(json_source, "r") as file: dictionary = json.load(file, cls=TypedJSONDecoder) else: dictionary = json.load(json_source, cls=TypedJSONDecoder) if "polling_interval" not in dictionary: dictionary["polling_interval"] = 600 assert ( "connection_options" in dictionary and "estimation_options" in dictionary and "data_set_path" in dictionary and "weights" in dictionary and "denominators" in dictionary and "polling_interval" in dictionary ) value = cls() value.connection_options = ConnectionOptions() value.connection_options.__setstate__(dictionary["connection_options"]) value.estimation_options = RequestOptions() value.estimation_options.__setstate__(dictionary["estimation_options"]) value.data_set_path = dictionary["data_set_path"] value.weights = { property_name: dictionary["weights"][property_name] for property_name in dictionary["weights"] } value.denominators = { property_name: dictionary["denominators"][property_name] for property_name in dictionary["denominators"] } value.polling_interval = dictionary["polling_interval"] return value
def main(): setup_timestamp_logging() # Load in the force field force_field_path = "smirnoff99Frosst-1.1.0.offxml" force_field_source = SmirnoffForceFieldSource.from_path(force_field_path) # Create a data set containing three solvation free energies. data_set = PhysicalPropertyDataSet.from_json("hydration_data_set.json") data_set.json("hydration_data_set.json", format=True) # Set up a server object to run the calculations using. server = setup_server(backend_type=BackendType.LocalGPU, max_number_of_workers=1, port=8002) with server: # Request the estimates. property_estimator = EvaluatorClient( ConnectionOptions(server_port=8002)) options = RequestOptions() options.calculation_layers = ["SimulationLayer"] options.add_schema("SimulationLayer", "SolvationFreeEnergy", _get_fixed_lambda_schema()) request, _ = property_estimator.request_estimate( property_set=data_set, force_field_source=force_field_source, options=options, ) # Wait for the results. results, _ = request.results(True, 60) # Save the result to file. results.json("results.json", True)
class OptionsFile: """Represents the set of options that a `Evaluator_SMIRNOFF` target will be run with. Attributes ---------- connection_options: openff.evaluator.client.ConnectionOptions The options for how the `evaluator` client should connect to a running server instance. estimation_options: openff.evaluator.client.RequestOptions The options for how properties should be estimated by the `evaluator` (e.g. the uncertainties to which properties should be estimated). data_set_path: str The path to a JSON serialized PhysicalPropertyDataSet which contains those physical properties which will be optimised against. weights: dict of float The weighting of each property which will be optimised against. denominators: dict of str and unit.Quantity The denominators will be used to remove units from the properties and scale their values. polling_interval: float The time interval with which to check whether the evaluator has finished fulfilling the request (in seconds). """ def __init__(self): self.connection_options = ConnectionOptions() self.estimation_options = RequestOptions() self.data_set_path = "" self.weights = {} self.denominators = {} self.polling_interval = 600 def to_json(self): """Converts this class into a JSON string. Returns ------- str The JSON representation of this class. """ value = { "connection_options": self.connection_options.__getstate__(), "estimation_options": self.estimation_options.__getstate__(), "data_set_path": self.data_set_path, "weights": { property_name: self.weights[property_name] for property_name in self.weights }, "denominators": { property_name: self.denominators[property_name] for property_name in self.denominators }, "polling_interval": self.polling_interval } return json.dumps( value, sort_keys=True, indent=4, separators=(",", ": "), cls=TypedJSONEncoder, ) @classmethod def from_json(cls, json_source): """Creates this class from a JSON string. Parameters ------- json_source: str or file-like object The JSON representation of this class. """ if isinstance(json_source, str): with open(json_source, "r") as file: dictionary = json.load(file, cls=TypedJSONDecoder) else: dictionary = json.load(json_source, cls=TypedJSONDecoder) if "polling_interval" not in dictionary: dictionary["polling_interval"] = 600 assert ( "connection_options" in dictionary and "estimation_options" in dictionary and "data_set_path" in dictionary and "weights" in dictionary and "denominators" in dictionary and "polling_interval" in dictionary ) value = cls() value.connection_options = ConnectionOptions() value.connection_options.__setstate__(dictionary["connection_options"]) value.estimation_options = RequestOptions() value.estimation_options.__setstate__(dictionary["estimation_options"]) value.data_set_path = dictionary["data_set_path"] value.weights = { property_name: dictionary["weights"][property_name] for property_name in dictionary["weights"] } value.denominators = { property_name: dictionary["denominators"][property_name] for property_name in dictionary["denominators"] } value.polling_interval = dictionary["polling_interval"] return value