Source code for aequilibrae.distribution.synthetic_gravity_model
import yaml
valid_functions = ["EXPO", "GAMMA", "POWER"]
members = ["function", "alpha", "beta"]
model_type = "SyntheticGravityModel"
[docs]
class SyntheticGravityModel:
"""Simple class object to represent synthetic gravity models"""
[docs]
def __init__(self):
self.function = None
self.alpha = None
self.beta = None
def __setattr__(self, key, value):
if value is None and key in ["function", "alpha", "beta"]:
self.__dict__[key] = value
else:
if key == "function":
self.alpha = None
self.beta = None
if value not in self.valid_functions:
raise ValueError("Function needs to be one of these: " + ", ".join(self.valid_functions))
else:
if isinstance(value, float) or isinstance(value, int):
if key == "alpha":
if self.__dict__.get("function") == "EXPO":
raise ValueError("Exponential function does not have an alpha parameter")
if key == "beta":
if self.function == "POWER":
raise ValueError("Inverse power function does not have a beta parameter")
else:
raise ValueError("Parameter needs to be numeric")
self.__dict__[key] = value
def __getattr__(self, key):
if key == "valid_functions":
return valid_functions
elif key == "members":
return members
elif key == "model_type":
return model_type
else:
return self.__dict__[key]
[docs]
def load(self, file_name):
"""Loads model from disk. Extension is \\*.mod"""
try:
with open(file_name, "r") as f:
model = yaml.safe_load(f)[self.model_type]
for key, value in model.items():
if key in self.members:
self.__dict__[key] = value
else:
raise ValueError("Model has unknown parameters: " + str(key))
except ValueError as err:
raise ValueError("File provided is not a valid Synthetic Gravity Model - {}".format(err.__str__())) from err
[docs]
def save(self, file_name):
"""Saves model to disk in yaml format. Extension is \\*.mod"""
file_name = str(file_name)
if file_name[-4:].upper() != ".MOD":
file_name += ".mod"
model = {model_type: {"function": self.function, "alpha": self.alpha, "beta": self.beta}}
mod = open(file_name, "w")
yaml.dump(model, mod, default_flow_style=False)
mod.flush()
mod.close()