From 7533553032de5a26a57dcd8698b839f930b1b276 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 28 May 2025 22:58:11 -0400 Subject: [PATCH 1/6] Fixes for vuln calculation and deprecations. --- pyfair/__init__.py | 2 +- pyfair/_version.py | 1 + pyfair/model/model_calc.py | 34 ++--- pyfair/model/model_input.py | 94 ++++++++------ pyfair/report/base_report.py | 221 +++++++++++++++++---------------- test_fair.py | 20 --- tests/model/test_model_calc.py | 46 +++---- tests/test_runner.py | 24 ++-- 8 files changed, 210 insertions(+), 232 deletions(-) create mode 100644 pyfair/_version.py delete mode 100644 test_fair.py diff --git a/pyfair/__init__.py b/pyfair/__init__.py index 08fd1e4..5dca5ad 100644 --- a/pyfair/__init__.py +++ b/pyfair/__init__.py @@ -1,6 +1,6 @@ """PyFair is an open source implementation of the FAIR methodology.""" -VERSION = '0.1-alpha.12' +from ._version import __version__ from . import model diff --git a/pyfair/_version.py b/pyfair/_version.py new file mode 100644 index 0000000..2a3adcf --- /dev/null +++ b/pyfair/_version.py @@ -0,0 +1 @@ +__version__ = "0.1-alpha.12" diff --git a/pyfair/model/model_calc.py b/pyfair/model/model_calc.py index b75511e..168ded9 100644 --- a/pyfair/model/model_calc.py +++ b/pyfair/model/model_calc.py @@ -13,16 +13,17 @@ class FairCalculations(object): 3) a multiplication function. """ + def __init__(self): # Lookup table for functions (no leaf nodes required) self._function_dict = { - 'Risk' : self._calculate_multiplication, - 'Loss Event Frequency' : self._calculate_multiplication, - 'Threat Event Frequency': self._calculate_multiplication, - 'Vulnerability' : self._calculate_step_average, - 'Loss Magnitude' : self._calculate_addition, - 'Primary Loss' : self._calculate_multiplication, - 'Secondary Loss' : self._calculate_multiplication, + "Risk": self._calculate_multiplication, + "Loss Event Frequency": self._calculate_multiplication, + "Threat Event Frequency": self._calculate_multiplication, + "Vulnerability": self._calculate_step_average, + "Loss Magnitude": self._calculate_addition, + "Primary Loss": self._calculate_multiplication, + "Secondary Loss": self._calculate_multiplication, } def calculate(self, parent_name, child_1_data, child_2_data): @@ -58,22 +59,11 @@ def calculate(self, parent_name, child_1_data, child_2_data): return calculated_result def _calculate_step_average(self, child_1_data, child_2_data): - """Get bool series based on step function, then average for vuln""" + """Return per-simulation boolean (as float) for Vulnerability: 1.0 if TC > CS, else 0.0""" # Get Trues (1) where child_2 (TCap) is greater than child_1 (CS) - # Otherwise False (0) - bool_series = child_1_data < child_2_data - # Treat those bools as 1 and 0 and get mean - bool_scalar_average = bool_series.mean() - # Create a long array of that mean - vuln_data = np.full( - len(bool_series), - bool_scalar_average - ) - # And put it in a series - vuln = pd.Series( - data=vuln_data, - index=bool_series.index - ) + bool_series = (child_1_data < child_2_data).astype(float) + # Return the per-simulation result as a Series + vuln = pd.Series(data=bool_series.values, index=bool_series.index) return vuln def _calculate_addition(self, child_1_data, child_2_data): diff --git a/pyfair/model/model_input.py b/pyfair/model/model_input.py index 769329f..bc2a3c1 100644 --- a/pyfair/model/model_input.py +++ b/pyfair/model/model_input.py @@ -29,26 +29,32 @@ class FairDataInput(object): is stored when converting to JSON or another serialization format. """ + def __init__(self): # These targets must be less than or equal to one - self._le_1_targets = ['Probability of Action', 'Vulnerability', 'Control Strength', 'Threat Capability'] - self._le_1_keywords = ['constant', 'high', 'mode', 'low', 'mean'] + self._le_1_targets = [ + "Probability of Action", + "Vulnerability", + "Control Strength", + "Threat Capability", + ] + self._le_1_keywords = ["constant", "high", "mode", "low", "mean"] # Parameter map associates parameters with functions self._parameter_map = { - 'constant': self._gen_constant, - 'high' : self._gen_pert, - 'mode' : self._gen_pert, - 'low' : self._gen_pert, - 'gamma' : self._gen_pert, - 'mean' : self._gen_normal, - 'stdev' : self._gen_normal, + "constant": self._gen_constant, + "high": self._gen_pert, + "mode": self._gen_pert, + "low": self._gen_pert, + "gamma": self._gen_pert, + "mean": self._gen_normal, + "stdev": self._gen_normal, } # List of keywords with function keys self._required_keywords = { - self._gen_constant: ['constant'], - self._gen_pert : ['low', 'mode', 'high'], - self._gen_normal : ['mean', 'stdev'], - } + self._gen_constant: ["constant"], + self._gen_pert: ["low", "mode", "high"], + self._gen_normal: ["mean", "stdev"], + } # Storage of inputs self._supplied_values = {} @@ -59,7 +65,7 @@ def get_supplied_values(self): ------- dict A dictionary of the values supplied to generate function. The - keys for the dict will be the target node as a string (e.g. + keys for the dict will be the target node as a string (e.g. 'Loss Event Frequency') and the values will be a sub-dictionary of keyword arguments ({'low': 50, 'mode}: 51, 'high': 52}). @@ -80,7 +86,11 @@ def _check_le_1(self, target, **kwargs): pass # If not, raise error else: - raise FairException('"{}" must have "{}" value between zero and one.'.format(target, key)) + raise FairException( + '"{}" must have "{}" value between zero and one.'.format( + target, key + ) + ) def _check_parameters(self, target_function, **kwargs): """Runs parameter checks @@ -94,7 +104,7 @@ def _check_parameters(self, target_function, **kwargs): for keyword, value in kwargs.items(): # Two conditions value_is_less_than_zero = value < 0 - keyword_is_relevant = keyword in ['mean', 'constant', 'low', 'mode', 'high'] + keyword_is_relevant = keyword in ["mean", "constant", "low", "mode", "high"] # Test conditions if keyword_is_relevant and value_is_less_than_zero: raise FairException('"{}" is less than zero.'.format(keyword)) @@ -104,7 +114,11 @@ def _check_parameters(self, target_function, **kwargs): if required_keyword in kwargs.keys(): pass else: - raise FairException('"{}" is missing "{}".'.format(str(target_function), required_keyword)) + raise FairException( + '"{}" is missing "{}".'.format( + str(target_function), required_keyword + ) + ) def generate(self, target, count, **kwargs): """Executes request, records parameters, and return random values @@ -123,7 +137,7 @@ def generate(self, target, count, **kwargs): The number of random numbers generated (or alternatively, the length of the Series returned). **kwargs - Keyword arguments with one of the following values: {`mean`, + Keyword arguments with one of the following values: {`mean`, `stdev`, `low`, `mode`, `high`, `gamma`, or `constant`}. Raises @@ -146,8 +160,8 @@ def generate(self, target, count, **kwargs): result = self._generate_single(target, count, **kwargs) # Explicitly insert optional keywords for model storage dict_keys = kwargs.keys() - if 'low' in dict_keys and 'gamma' not in dict_keys: - kwargs['gamma'] = 4 + if "low" in dict_keys and "gamma" not in dict_keys: + kwargs["gamma"] = 4 # Record and return self._supplied_values[target] = {**kwargs} return result @@ -192,16 +206,16 @@ def generate_multi(self, prefixed_target, count, kwargs_dict): { 'Reputational': { - 'Secondary Loss Event Frequency': {'constant': 4000}, + 'Secondary Loss Event Frequency': {'constant': 4000}, 'Secondary Loss Event Magnitude': { 'low': 10, 'mode': 20, 'high': 100 }, }, 'Legal': { - 'Secondary Loss Event Frequency': {'constant': 2000}, + 'Secondary Loss Event Frequency': {'constant': 2000}, 'Secondary Loss Event Magnitude': { 'low': 10, 'mode': 20, 'high': 100 - }, + }, } } @@ -242,7 +256,7 @@ def generate_multi(self, prefixed_target, count, kwargs_dict): """ # Remove prefix from target - final_target = prefixed_target.lstrip('multi_') + final_target = prefixed_target.lstrip("multi_") # Create a container for dataframes df_dict = {target: pd.DataFrame() for target in kwargs_dict.keys()} # For each target @@ -255,9 +269,9 @@ def generate_multi(self, prefixed_target, count, kwargs_dict): # Put in dict df_dict[target][column] = s # Get partial secondary losses and sum up all the values - summed = np.sum(df.prod(axis=1) for df in df_dict.values()) + summed = sum(df.prod(axis=1) for df in df_dict.values()) # Record params - new_target = 'multi_' + final_target + new_target = "multi_" + final_target self._supplied_values[new_target] = kwargs_dict return summed @@ -294,12 +308,12 @@ def supply_raw(self, target, array): s = pd.Series(clean_array) # Check numeric and not null if s.isnull().any(): - raise FairException('Supplied data contains null values') + raise FairException("Supplied data contains null values") # Ensure values are appropriate if target in self._le_1_targets: if s.max() > 1 or s.min() < 0: - raise FairException(f'{target} data greater or less than one') - self._supplied_values[target] = {'raw': s.values.tolist()} + raise FairException(f"{target} data greater or less than one") + self._supplied_values[target] = {"raw": s.values.tolist()} return s.values def _determine_func(self, **kwargs): @@ -309,24 +323,22 @@ def _determine_func(self, **kwargs): if key not in self._parameter_map.keys(): raise FairException('"{}"" is not a recognized keyword'.format(key)) # Check whether all keys go to same function via set comprension - functions = list(set([ - self._parameter_map[key] - for key - in kwargs.keys() - ])) + functions = list(set([self._parameter_map[key] for key in kwargs.keys()])) if len(functions) > 1: - raise FairException('"{}" mixes incompatible keywords.'.format(str(kwargs.keys()))) + raise FairException( + '"{}" mixes incompatible keywords.'.format(str(kwargs.keys())) + ) else: function = functions[0] return function def _gen_constant(self, count, **kwargs): """Generates constant array of size `count`""" - return np.full(count, kwargs['constant']) + return np.full(count, kwargs["constant"]) def _gen_normal(self, count, **kwargs): """Geneates random normally-distributed array of size `count`""" - normal = scipy.stats.norm(loc=kwargs['mean'], scale=kwargs['stdev']) + normal = scipy.stats.norm(loc=kwargs["mean"], scale=kwargs["stdev"]) rvs = normal.rvs(count) return rvs @@ -340,10 +352,12 @@ def _gen_pert(self, count, **kwargs): def _check_pert(self, **kwargs): """Does the work of ensuring BetaPert distribution is valid""" conditions = { - 'mode >= low' : kwargs['mode'] >= kwargs['low'], - 'high >= mode' : kwargs['high'] >= kwargs['mode'], + "mode >= low": kwargs["mode"] >= kwargs["low"], + "high >= mode": kwargs["high"] >= kwargs["mode"], } for condition_name, condition_value in conditions.items(): if condition_value == False: - err = 'Param "{}" fails PERT requirement "{}".'.format(kwargs, condition_name) + err = 'Param "{}" fails PERT requirement "{}".'.format( + kwargs, condition_name + ) raise FairException(err) diff --git a/pyfair/report/base_report.py b/pyfair/report/base_report.py index 73477d4..df9f601 100644 --- a/pyfair/report/base_report.py +++ b/pyfair/report/base_report.py @@ -11,61 +11,57 @@ import numpy as np import pandas as pd -from .. import VERSION +from .._version import __version__ from .tree_graph import FairTreeGraph from .distribution import FairDistributionCurve from .exceedence import FairExceedenceCurves from ..utility.fair_exception import FairException from .violin import FairViolinPlot +from ..model.meta_model import FairMetaModel +from ..utility.beta_pert import FairBetaPert class FairBaseReport(object): """A base class for creating FairModel and FairMetaModel reports This class exists to provide a common base for mutliple report types. - It carries with it formatting data, file paths, and a variety of + It carries with it formatting data, file paths, and a variety of methods for creating report components. It is not intended to be instantiated on its own. """ - def __init__(self, currency_prefix='$'): + + def __init__(self, currency_prefix="$"): # Add formatting strings self._currency_prefix = currency_prefix self._model_or_models = None - self._currency_format_string = currency_prefix + '{0:,.0f}' - self._float_format_string = '{0:.2f}' + self._currency_format_string = currency_prefix + "{0:,.0f}" + self._float_format_string = "{0:.2f}" self._format_strings = { - 'Risk' : self._currency_format_string, - 'Loss Event Frequency' : self._float_format_string, - 'Threat Event Frequency' : self._float_format_string, - 'Vulnerability' : self._float_format_string, - 'Contact Frequency' : self._float_format_string, - 'Probability of Action' : self._float_format_string, - 'Threat Capability' : self._float_format_string, - 'Control Strength' : self._float_format_string, - 'Loss Magnitude' : self._currency_format_string, - 'Primary Loss' : self._currency_format_string, - 'Secondary Loss' : self._currency_format_string, - 'Secondary Loss Event Frequency' : self._float_format_string, - 'Secondary Loss Event Magnitude' : self._currency_format_string, + "Risk": self._currency_format_string, + "Loss Event Frequency": self._float_format_string, + "Threat Event Frequency": self._float_format_string, + "Vulnerability": self._float_format_string, + "Contact Frequency": self._float_format_string, + "Probability of Action": self._float_format_string, + "Threat Capability": self._float_format_string, + "Control Strength": self._float_format_string, + "Loss Magnitude": self._currency_format_string, + "Primary Loss": self._currency_format_string, + "Secondary Loss": self._currency_format_string, + "Secondary Loss Event Frequency": self._float_format_string, + "Secondary Loss Event Magnitude": self._currency_format_string, } # Add locations self._fair_location = pathlib.Path(__file__).parent.parent - self._static_location = self._fair_location / 'static' - self._logo_location = self._static_location / 'white_python_logo.png' + self._static_location = self._fair_location / "static" + self._logo_location = self._static_location / "white_python_logo.png" self._template_paths = { - 'css' : self._static_location / 'fair.css', - 'simple': self._static_location / 'simple.html' + "css": self._static_location / "fair.css", + "simple": self._static_location / "simple.html", } - self._param_cols = [ - 'low', - 'most_likely', - 'high', - 'constant', - 'mean', - 'stdev' - ] + self._param_cols = ["low", "most_likely", "high", "constant", "mean", "stdev"] def _input_check(self, value): """Check input value for report is appropriate @@ -76,25 +72,29 @@ def _input_check(self, value): """ # If it's a model or metamodel, plug it in a dict. rv = {} - if value.__class__.__name__ in ['FairModel', 'FairMetaModel']: + if value.__class__.__name__ in ["FairModel", "FairMetaModel"]: rv[value.get_name()] = value return rv # Check for iterable. - if not hasattr(value, '__iter__'): - raise FairException('Input is not a FairModel, FairMetaModel, or an iterable.') + if not hasattr(value, "__iter__"): + raise FairException( + "Input is not a FairModel, FairMetaModel, or an iterable." + ) if len(value) == 0: - raise FairException('Empty iterable where iterable of models expected.') + raise FairException("Empty iterable where iterable of models expected.") # Iterate and process remainder. for proported_model in value: # Check if model - if proported_model.__class__.__name__ in ['FairModel', 'FairMetaModel']: + if proported_model.__class__.__name__ in ["FairModel", "FairMetaModel"]: # Check if calculated if proported_model.calculation_completed(): rv[proported_model.get_name()] = proported_model else: - raise FairException('Model or FairModel has not been calculated.') + raise FairException("Model or FairModel has not been calculated.") else: - raise FairException('Iterable member is not a FairModel or FairMetaModel') + raise FairException( + "Iterable member is not a FairModel or FairMetaModel" + ) return rv def get_format_strings(self): @@ -107,16 +107,16 @@ def get_format_strings(self): """ return self._format_strings - def base64ify(self, image, alternative_text='', options=''): + def base64ify(self, image, alternative_text="", options=""): """Binary data into embeddable tag with base64 data - + To avoid having separate image files, pyfair simply embeds report images as base64 image tags. base64ify() is a convenience function that creates these tags. image : [bytes, str, pathlib.Path] The binary data, path string, or pathlib.Path containing either the data itself or a file of data. - + alternative_text: str, optional Alternative text to be showed in the event the image does not properly render @@ -134,15 +134,15 @@ def base64ify(self, image, alternative_text='', options=''): """ # If path, open and read. if type(image) == str or isinstance(image, pathlib.Path): - with open(image, 'rb') as f: + with open(image, "rb") as f: binary_data = f.read() # If bytes, jsut write elif type(image) == bytes: binary_data = image else: - raise TypeError(str(image) + ' is not a string, path, or bytes.') + raise TypeError(str(image) + " is not a string, path, or bytes.") # Get base64 string - base64_string = base64.b64encode(binary_data).decode('utf8') + base64_string = base64.b64encode(binary_data).decode("utf8") # Create tag tag = f'{alternative_text}' return tag @@ -162,13 +162,13 @@ def to_html(self, output_path): The output path to which the HTML data is written """ output = self._construct_output() - with open(output_path, 'w+') as f: + with open(output_path, "w+") as f: f.write(output) def _fig_to_img_tag(self, fig): """Converts matplotlib fig to base64 encoded img tag""" data = io.BytesIO() - fig.savefig(data, format='png', transparent=True) + fig.savefig(data, format="png", transparent=True) data.seek(0) img_tag = self.base64ify(data.read()) return img_tag @@ -176,11 +176,7 @@ def _fig_to_img_tag(self, fig): def _get_data_table(self, model): """Takes model and gnerates HTML table from the model's results""" data = model.export_results().dropna(axis=1) - table = data.to_html( - border=0, - justify='left', - classes='fair_metadata_table' - ) + table = data.to_html(border=0, justify="left", classes="fair_metadata_table") return table def _get_parameter_table(self, model): @@ -197,14 +193,22 @@ def _get_metadata_table(self): username = getpass.getuser() # The exception this throws is not conspicuously documented except Exception: - username = 'Unknown' + username = "Unknown" # Add metadata - metadata = pd.Series({ - 'Author': username, - 'Created': str(datetime.datetime.now()).partition('.')[0], - 'PyFair Version': VERSION, - 'Type': type(self).__name__ - }).to_frame().to_html(border=0, header=False, justify='left', classes='fair_metadata_table') + metadata = ( + pd.Series( + { + "Author": username, + "Created": str(datetime.datetime.now()).partition(".")[0], + "PyFair Version": __version__, + "Type": type(self).__name__, + } + ) + .to_frame() + .to_html( + border=0, header=False, justify="left", classes="fair_metadata_table" + ) + ) return metadata def _get_tree(self, model): @@ -224,7 +228,7 @@ def _get_distribution(self, model_or_models, currency_prefix): def _get_distribution_icon(self, model, target): """Create base64 icon string using FairDistributionCurve""" fdc = FairDistributionCurve(model, self._currency_prefix) - fig, ax = fdc.generate_icon(model.get_name(), target) + fig, ax = fdc.generate_icon(model.get_name(), target) img_tag = self._fig_to_img_tag(fig) return img_tag @@ -246,28 +250,34 @@ def _get_overview_table(self, model_or_models): """Create a risk overview table using a model or list of models""" # Get final Risk vectors for all models try: - risk_results = pd.DataFrame({ - name: model.export_results()['Risk'] - for name, model - in model_or_models.items() - }) + risk_results = pd.DataFrame( + { + name: model.export_results()["Risk"] + for name, model in model_or_models.items() + } + ) except KeyError: raise FairException("No 'Risk' key. Model likely uncalculated.") # Get aggregate statistics and set titles - risk_results = risk_results.agg(['mean', 'std', 'min', 'max']) - risk_results.index = ['Mean', 'Stdev', 'Minimum', 'Maximum'] + risk_results = risk_results.agg(["mean", "std", "min", "max"]) + risk_results.index = ["Mean", "Stdev", "Minimum", "Maximum"] # Format risk results into dataframe - overview_df = risk_results.applymap(lambda x: self._format_strings['Risk'].format(x)) - overview_df.loc['Simulations'] = [ - '{0:,.0f}'.format(len(model.export_results())) - for model - in model_or_models.values() + overview_df = risk_results.map(lambda x: self._format_strings["Risk"].format(x)) + overview_df.loc["Simulations"] = [ + "{0:,.0f}".format(len(model.export_results())) + for model in model_or_models.values() ] # Add data - overview_df.loc['Identifier'] = [model.get_uuid() for model in model_or_models.values()] - overview_df.loc['Model Type'] = [model.__class__.__name__ for model in model_or_models.values()] + overview_df.loc["Identifier"] = [ + model.get_uuid() for model in model_or_models.values() + ] + overview_df.loc["Model Type"] = [ + model.__class__.__name__ for model in model_or_models.values() + ] # Export df to HTML and return - overview_html = overview_df.to_html(border=0, header=True, justify='left', classes='fair_table') + overview_html = overview_df.to_html( + border=0, header=True, justify="left", classes="fair_table" + ) return overview_html def _get_model_parameter_table(self, model): @@ -276,8 +286,7 @@ def _get_model_parameter_table(self, model): # Remove items we don't want. params = { key: value - for key, value - in params.items() + for key, value in params.items() if key in self._format_strings.keys() } # Set up alias and dataframe @@ -291,10 +300,10 @@ def _get_model_parameter_table(self, model): param_df[column] = np.nan # Create descriptive statistics from parameter df param_df = param_df[self._param_cols] - param_df['mean'] = model.export_results().mean(axis=0) - param_df['stdev'] = model.export_results().std(axis=0) - param_df['min'] = model.export_results().min(axis=0) - param_df['max'] = model.export_results().max(axis=0) + param_df["mean"] = model.export_results().mean(axis=0) + param_df["stdev"] = model.export_results().std(axis=0) + param_df["min"] = model.export_results().min(axis=0) + param_df["max"] = model.export_results().max(axis=0) # Transform param_df in place param_df = param_df.apply( lambda row: pd.Series( @@ -302,31 +311,25 @@ def _get_model_parameter_table(self, model): # ... by getting the format string and formatting fs[row.name].format(item) # For each item - for item - in row + for item in row ], # And keep the index - index=row.index.values + index=row.index.values, ), # On a column basis axis=1, ) - param_df = param_df.applymap(lambda x: '' if 'nan' in x else x) + param_df = param_df.map(lambda x: "" if "nan" in x else x) # Do not truncate our base64 images. - pd.set_option('display.max_colwidth', None) + pd.set_option("display.max_colwidth", None) # Create our distribution icons as strings in table - param_df['distribution'] = [ + param_df["distribution"] = [ self._get_distribution_icon(model, target) - for target - in param_df.index.values + for target in param_df.index.values ] # Export table to html detail_table = param_df.to_html( - border=0, - header=True, - justify='left', - classes='fair_table', - escape=False + border=0, header=True, justify="left", classes="fair_table", escape=False ) return detail_table @@ -334,30 +337,30 @@ def _get_metamodel_parameter_table(self, metamodel): """Create table for metamodel""" # Create our table, transpose it, get descriptive statistics risk_df = metamodel.export_results().T - risk_df = pd.DataFrame({ - 'mean' : risk_df.mean(axis=1), - 'stdev': risk_df.std(axis=1), - 'min' : risk_df.min(axis=1), - 'max' : risk_df.max(axis=1), - 'geo_mean': risk_df.apply(lambda x: np.exp(np.mean(np.log(x[x > 0]))), axis=1), - 'mode': risk_df.mode(axis=1)[0], - '90th_percentile': risk_df.quantile(0.90, axis=1), - '99th_percentile': risk_df.quantile(0.99, axis=1) - }) + risk_df = pd.DataFrame( + { + "mean": risk_df.mean(axis=1), + "stdev": risk_df.std(axis=1), + "min": risk_df.min(axis=1), + "max": risk_df.max(axis=1), + "geo_mean": risk_df.apply( + lambda x: np.exp(np.mean(np.log(x[x > 0]))), axis=1 + ), + "mode": risk_df.mode(axis=1)[0], + "90th_percentile": risk_df.quantile(0.90, axis=1), + "99th_percentile": risk_df.quantile(0.99, axis=1), + } + ) # Format the risk DF with the appropriate strings risk_df = risk_df.apply( lambda row: pd.Series( - [self._format_strings['Risk'].format(item) for item in row], - index=row.index.values + [self._format_strings["Risk"].format(item) for item in row], + index=row.index.values, ), axis=1, ) # Do not truncate our base64 images. detail_table = risk_df.to_html( - border=0, - header=True, - justify='left', - classes='fair_table', - escape=False + border=0, header=True, justify="left", classes="fair_table", escape=False ) return detail_table diff --git a/test_fair.py b/test_fair.py deleted file mode 100644 index d210961..0000000 --- a/test_fair.py +++ /dev/null @@ -1,20 +0,0 @@ -from pyfair import FairModel - -# Create a simple FAIR model -model = FairModel(name="Basic Model", n_simulations=10000) - -# Set parameters -model.input_data("Loss Event Frequency", mean=0.3, stdev=0.1) -model.input_data("Loss Magnitude", constant=5000000) - -# Calculate and display results -model.calculate_all() - -# Get results and print summary statistics -results = model.export_results() -print("\nModel Results Summary:") -print("-" * 20) -print(f"Risk Statistics:") -print(f"Mean: ${results['Risk'].mean():,.2f}") -print(f"Median: ${results['Risk'].median():,.2f}") -print(f"95th Percentile: ${results['Risk'].quantile(0.95):,.2f}") diff --git a/tests/model/test_model_calc.py b/tests/model/test_model_calc.py index 6d6794e..fca9f47 100644 --- a/tests/model/test_model_calc.py +++ b/tests/model/test_model_calc.py @@ -9,59 +9,47 @@ class TestFairModelCalc(unittest.TestCase): # Raw data - _CHILD_1_DATA = pd.Series([1,2,3,4,5]) - _CHILD_2_DATA = pd.Series([5,4,3,2,1]) - _MULT_OUTPUT = pd.Series([5,8,9,8,5]) - _ADD_OUTPUT = pd.Series([6,6,6,6,6]) - _STEP_OUTPUT = pd.Series([.4, .4, .4, .4, .4]) + _CHILD_1_DATA = pd.Series([1, 2, 3, 4, 5]) + _CHILD_2_DATA = pd.Series([5, 4, 3, 2, 1]) + _MULT_OUTPUT = pd.Series([5, 8, 9, 8, 5]) + _ADD_OUTPUT = pd.Series([6, 6, 6, 6, 6]) + _STEP_OUTPUT = pd.Series([1, 1, 0, 0, 0], dtype=float) # Keys _MULTIPLICATION_ITEMS = [ - 'Risk', - 'Loss Event Frequency', - 'Threat Event Frequency', - 'Primary Loss', - 'Secondary Loss', + "Risk", + "Loss Event Frequency", + "Threat Event Frequency", + "Primary Loss", + "Secondary Loss", ] - _ADDITION_ITEMS = ['Loss Magnitude'] - _STEP_ITEMS = ['Vulnerability'] + _ADDITION_ITEMS = ["Loss Magnitude"] + _STEP_ITEMS = ["Vulnerability"] def setUp(self): self._calc = FairCalculations() - + def tearDown(self): self._calc = None def test_multiplication(self): """Test multiplication keywords and functions""" for key in self._MULTIPLICATION_ITEMS: - result = self._calc.calculate( - key, - self._CHILD_1_DATA, - self._CHILD_2_DATA - ) + result = self._calc.calculate(key, self._CHILD_1_DATA, self._CHILD_2_DATA) self.assertTrue(result.equals(self._MULT_OUTPUT)) def test_addition(self): """Test addition keywords and functions""" for key in self._ADDITION_ITEMS: - result = self._calc.calculate( - key, - self._CHILD_1_DATA, - self._CHILD_2_DATA - ) + result = self._calc.calculate(key, self._CHILD_1_DATA, self._CHILD_2_DATA) self.assertTrue(result.equals(self._ADD_OUTPUT)) def test_step_average(self): """Test step function keywords and functions""" for key in self._STEP_ITEMS: - result = self._calc.calculate( - key, - self._CHILD_1_DATA, - self._CHILD_2_DATA - ) + result = self._calc.calculate(key, self._CHILD_1_DATA, self._CHILD_2_DATA) self.assertTrue(result.equals(self._STEP_OUTPUT)) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/tests/test_runner.py b/tests/test_runner.py index a11ab32..d2f368a 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -1,4 +1,5 @@ """Script to create and run a test suite.""" + import pathlib import sys import unittest @@ -54,16 +55,17 @@ utility.test_fair_exception, ] -# Create loader and suite -loader = unittest.TestLoader() -suite = unittest.TestSuite() +if __name__ == "__main__": + # Create loader and suite + loader = unittest.TestLoader() + suite = unittest.TestSuite() -# Add to suite -for test_module in test_modules: - loaded_test = loader.loadTestsFromModule(test_module) - suite.addTest(loaded_test) + # Add to suite + for test_module in test_modules: + loaded_test = loader.loadTestsFromModule(test_module) + suite.addTest(loaded_test) -# Create runner and run -runner = unittest.TextTestRunner(verbosity=5) -result = runner.run(suite) -sys.exit(0 if result.wasSuccessful() else 1) + # Create runner and run + runner = unittest.TextTestRunner(verbosity=5) + result = runner.run(suite) + sys.exit(0 if result.wasSuccessful() else 1) From 9488c40aaf685676acd4ba2e3e5d6d7feb129f26 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 28 May 2025 23:02:26 -0400 Subject: [PATCH 2/6] Fixes for vuln calculation and deprecations. --- pyfair/report/base_report.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyfair/report/base_report.py b/pyfair/report/base_report.py index df9f601..2692412 100644 --- a/pyfair/report/base_report.py +++ b/pyfair/report/base_report.py @@ -262,7 +262,9 @@ def _get_overview_table(self, model_or_models): risk_results = risk_results.agg(["mean", "std", "min", "max"]) risk_results.index = ["Mean", "Stdev", "Minimum", "Maximum"] # Format risk results into dataframe - overview_df = risk_results.map(lambda x: self._format_strings["Risk"].format(x)) + overview_df = risk_results.applymap( + lambda x: self._format_strings["Risk"].format(x) + ) overview_df.loc["Simulations"] = [ "{0:,.0f}".format(len(model.export_results())) for model in model_or_models.values() @@ -319,7 +321,7 @@ def _get_model_parameter_table(self, model): # On a column basis axis=1, ) - param_df = param_df.map(lambda x: "" if "nan" in x else x) + param_df = param_df.applymap(lambda x: "" if "nan" in x else x) # Do not truncate our base64 images. pd.set_option("display.max_colwidth", None) # Create our distribution icons as strings in table From 4ce40442b309525f3a67d13ccbf78711d1c555d0 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 28 May 2025 23:20:46 -0400 Subject: [PATCH 3/6] Clarified confusion between model identity (UUID) versus model name for database operations. store uses UUID for replacement, load by name fetches the first match. Creating FairModel('New Name') generates a new UUID and thus a new, distinct model. --- pyfair/utility/database.py | 83 ++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/pyfair/utility/database.py b/pyfair/utility/database.py index a85a110..53a6c92 100644 --- a/pyfair/utility/database.py +++ b/pyfair/utility/database.py @@ -35,6 +35,7 @@ class FairDatabase(object): >>> query_output_string = db2.query('SELECT uuid, json FROM model') """ + def __init__(self, path): self._path = pathlib.Path(path) self._initialize() @@ -42,21 +43,25 @@ def __init__(self, path): def _initialize(self): """Initialize database with tables if necessary.""" with sqlite3.connect(self._path) as conn: - conn.execute("""CREATE TABLE IF NOT EXISTS models ( + conn.execute( + """CREATE TABLE IF NOT EXISTS models ( uuid string, name string, creation_date text NOT NULL, json string NOT NULL, CONSTRAINT model_pk PRIMARY KEY (uuid)); - """) - conn.execute("""CREATE TABLE IF NOT EXISTS results ( + """ + ) + conn.execute( + """CREATE TABLE IF NOT EXISTS results ( uuid string, mean real NOT NULL, stdev real NOT NULL, min real NOT NULL, max real NOT NULL, CONSTRAINT results_pk PRIMARY KEY (uuid)); - """) + """ + ) def _dict_factory(self, cursor, row): """Convenience function for sqlite queries""" @@ -69,9 +74,16 @@ def _dict_factory(self, cursor, row): def load(self, name_or_uuid): """Loads a model from the database - This takes a name or UUID and looks up the model using a UUID - function using self._load_uuid(). If that fails, it attempts to - look of the funciton by name using self._load_name(). + This takes a name or UUID. It first attempts to interpret the input + as a UUID and load directly. If that fails (e.g., the input is not + in UUID format), it attempts to load by model name. + + If loading by name, the method retrieves the *first* model found + matching that name (based on internal database ordering). If multiple + distinct models (with different UUIDs) share the same name, this + may not be the most recent or a specific version unless names are + managed uniquely. For precise loading, using the model's UUID is + recommended. Parameters ---------- @@ -79,7 +91,7 @@ def load(self, name_or_uuid): The name model or its UUID string Returns - ------- + ------ FairModel or FairMetaModel The model or metamodel corresponding with the input UUID string or input name string. @@ -89,6 +101,9 @@ def load(self, name_or_uuid): FairException When the UUID or name does not exist in the database + See Also + -------- + store : Method for storing models. Note its behavior regarding UUIDs. """ # If it is a valid UUID try: @@ -110,9 +125,9 @@ def _load_name(self, name): cursor.execute("SELECT uuid FROM models WHERE name = ?", (name,)) result = cursor.fetchone() if not result: - raise FairException('Name for model not found.') + raise FairException("Name for model not found.") # Use model UUID query to load via _load_uuid function - model = self._load_uuid(result['uuid']) + model = self._load_uuid(result["uuid"]) return model def _load_uuid(self, uuid): @@ -125,17 +140,17 @@ def _load_uuid(self, uuid): cursor.execute("SELECT * FROM models WHERE uuid = ?", (uuid,)) model_data = cursor.fetchone() if not model_data: - raise FairException('UUID for model not found.') + raise FairException("UUID for model not found.") # Load model type based on json - json_data = model_data['json'] + json_data = model_data["json"] model_param_data = json.loads(json_data) - model_type = model_param_data['type'] - if model_type == 'FairMetaModel': + model_type = model_param_data["type"] + if model_type == "FairMetaModel": model = FairMetaModel.read_json(json_data) - elif model_type == 'FairModel': + elif model_type == "FairModel": model = FairModel.read_json(json_data) else: - raise FairException('Unrecognized model type.') + raise FairException("Unrecognized model type.") return model def store(self, model_or_metamodel): @@ -147,10 +162,31 @@ def store(self, model_or_metamodel): statistics about the risk are stored in the 'results' table, and 2) the model data is stored in the 'models' table. + The model's UUID (obtained via `model_or_metamodel.get_uuid()`) is used + as the primary key in the database. + + If a record with the same UUID already exists, `INSERT OR REPLACE` + semantics are used, meaning the existing record for that UUID will be + overwritten with the data from the model being stored. This is how + updates to an existing model (identified by its UUID) should be performed: + load the model, modify the loaded instance, then store that same instance. + + Creating a new `FairModel()` instance results in a new, unique UUID. + Storing such a new instance will always create a new record or replace + an existing record *only if that new UUID happened to match an old one* + (which is astronomically unlikely for standard UUIDs). + It does not replace based on model name. + + Parameters + ---------- + model_or_metamodel : FairModel or FairMetaModel + The model instance to store. + Raises ------ FairException If model or metamodel is not yet calculated + and thus not ready for storage. """ m = model_or_metamodel @@ -160,30 +196,25 @@ def store(self, model_or_metamodel): # Export from model meta = json.loads(m.to_json()) json_data = m.to_json() - results = m.export_results()['Risk'] + results = m.export_results()["Risk"] # Write to database with sqlite3.connect(self._path) as conn: cursor = conn.cursor() # Write model data cursor.execute( """INSERT OR REPLACE INTO models VALUES(?, ?, ?, ?)""", - ( - meta['model_uuid'], - meta['name'], - meta['creation_date'], - json_data - ) + (meta["model_uuid"], meta["name"], meta["creation_date"], json_data), ) # Write cached results cursor.execute( """INSERT OR REPLACE INTO results VALUES(?, ?, ?, ?, ?)""", ( - meta['model_uuid'], + meta["model_uuid"], results.mean(axis=0), results.std(axis=0), results.min(axis=0), - results.max(axis=0) - ) + results.max(axis=0), + ), ) # Vacuum database conn = sqlite3.connect(self._path) From 4a5d2199a833bac4421ea9d37980df4ab094cbc0 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 28 May 2025 23:26:42 -0400 Subject: [PATCH 4/6] Added 'Secondary Loss Event Frequency' to the self._le_1_targets list in FairDataInput.__init__. This will ensure that any parameters supplied for SLEF (e.g., low, mode, high, constant, mean) are checked to be within [0, 1]. It also ensures that the generated values for SLEF are clipped to [0, 1]. --- pyfair/model/model_input.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyfair/model/model_input.py b/pyfair/model/model_input.py index bc2a3c1..1e3e6ab 100644 --- a/pyfair/model/model_input.py +++ b/pyfair/model/model_input.py @@ -37,6 +37,7 @@ def __init__(self): "Vulnerability", "Control Strength", "Threat Capability", + "Secondary Loss Event Frequency", ] self._le_1_keywords = ["constant", "high", "mode", "low", "mean"] # Parameter map associates parameters with functions From bc9382abe9f8725f8c0204a5ccc6fb53c8478462 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 28 May 2025 23:48:56 -0400 Subject: [PATCH 5/6] Fixing mjxtex math runoff in docs page. --- docs/calculation_details.rst | 92 +++++++++++++++++------------------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/docs/calculation_details.rst b/docs/calculation_details.rst index 78bd103..989fbf4 100644 --- a/docs/calculation_details.rst +++ b/docs/calculation_details.rst @@ -45,8 +45,8 @@ Multiply the Loss Event Frequency vector by the Loss Magnitude vector Example ~~~~~~~ For a given year, if we have the number of times a particular event -occurs (Loss Event Frequency/LEF) and the dollar losses associated with -each of those events (Loss Magnitude/LM), we can multiply these +occurs (Loss Event Frequency/LEF) and the dollar losses associated with +each of those events (Loss Magnitude/LM), we can multiply these together to derive the ultimate dollar value amount lost (Risk/R). +------------+-----+--------+--------------+ @@ -64,7 +64,7 @@ together to derive the ultimate dollar value amount lost (Risk/R). Description ~~~~~~~~~~~ -A vector of elements which represent the number of times a particular +A vector of elements which represent the number of times a particular loss occurs during a given time frame (generally one year) Restrictions @@ -119,7 +119,7 @@ multiply these together to derive the number of losses that will occur .. note:: - Though intended to represent a discrete number of events, TEF and + Though intended to represent a discrete number of events, TEF and LEF are not rounded to the nearest integer. This allows for the modeling of events that happen infrequently. For instance, if we are running a simulation for a single year, one might model a @@ -130,7 +130,7 @@ multiply these together to derive the number of losses that will occur Description ~~~~~~~~~~~ -A vector of elements representing the number of times a particular +A vector of elements representing the number of times a particular threat occurs, whether or not it results in a loss Restrictions @@ -139,7 +139,7 @@ All elements must be positive Derivation ~~~~~~~~~~ -Supplied directly, or multiply the Contact Frequency vector and the +Supplied directly, or multiply the Contact Frequency vector and the Probability of Action vector .. math:: @@ -312,8 +312,8 @@ a control (Vulnerability/V). Description ~~~~~~~~~~~ -A vector with elements representing the number of threat -actor contacts that could potentially yield a threat within a given +A vector with elements representing the number of threat +actor contacts that could potentially yield a threat within a given timeframe Restrictions @@ -332,7 +332,7 @@ attack, and in turn can potentially yield a loss (Contact Frequency/C). +------------+-----------+ | Simulation | C | +============+===========+ -| 1 | 5,000,000 | +| 1 | 5,000,000 | +------------+-----------+ | 2 | 3,000,000 | +------------+-----------+ @@ -345,7 +345,7 @@ attack, and in turn can potentially yield a loss (Contact Frequency/C). Description ~~~~~~~~~~~ A vector with elements representing the probability that a threat actor -will proceed after coming into contact with an organization +will proceed after coming into contact with an organization Restrictions ------------ @@ -363,7 +363,7 @@ resource (Probability of Action/P) +------------+------+ | Simulation | P | +============+======+ -| 1 | 0.95 | +| 1 | 0.95 | +------------+------+ | 2 | 0.90 | +------------+------+ @@ -375,7 +375,7 @@ resource (Probability of Action/P) Description ~~~~~~~~~~~ -A vector of unitless elements that describe the relative +A vector of unitless elements that describe the relative level of expertise and resources of a threat actor (relative to a Control Strength) @@ -395,7 +395,7 @@ relates to the relative strength of the controls (Control Strength/CS) +------------+------+ | Simulation | TC | +============+======+ -| 1 | 0.75 | +| 1 | 0.75 | +------------+------+ | 2 | 0.60 | +------------+------+ @@ -407,7 +407,7 @@ relates to the relative strength of the controls (Control Strength/CS) Description ~~~~~~~~~~~ -A vector of unitless elements that describe the relative strength of a +A vector of unitless elements that describe the relative strength of a given control (relative to the Threat Capability of a given actor) Restrictions @@ -427,7 +427,7 @@ Capability/TC) +------------+------+ | Simulation | TC | +============+======+ -| 1 | 0.15 | +| 1 | 0.15 | +------------+------+ | 2 | 0.10 | +------------+------+ @@ -514,7 +514,7 @@ Loss/PL) +------------+------------+ | Simulation | PL | +============+============+ -| 1 | $5,000,000 | +| 1 | $5,000,000 | +------------+------------+ | 2 | $3,500,000 | +------------+------------+ @@ -540,43 +540,39 @@ multiplied together on an elementwise basis. .. math:: - \begin{bmatrix} - \text{SL}_{1} \\ - \text{SL}_{1} \\ - \vdots \\ - \text{SL}_{1} \\ - \end{bmatrix} - \quad - = - \quad - \sum\limits^n_{j=1} - \quad - \left( - \quad - \begin{bmatrix} - \text{SLEF}_{1,1} & \text{SLEF}_{1,2} & \dots & \text{SLEF}_{1,n} \\ - \text{SLEF}_{2,1} & \text{SLEF}_{2,2} & \dots & \text{SLEF}_{2,n} \\ - \vdots & \vdots & \ddots & \vdots \\ - \text{SLEF}_{m,1} & \text{SLEF}_{m,2} & \dots & \text{SLEF}_{m,n} \\ - \end{bmatrix} - \quad - \circ - \quad - \begin{bmatrix} - \text{SLEM}_{1,1} & \text{SLEM}_{1,2} & \dots & \text{SLEM}_{1,n} \\ - \text{SLEM}_{2,1} & \text{SLEM}_{2,2} & \dots & \text{SLEM}_{2,n} \\ - \vdots & \vdots & \ddots & \vdots \\ - \text{SLEM}_{m,1} & \text{SLEM}_{m,2} & \dots & \text{SLEM}_{m,n} \\ - \end{bmatrix} - \quad - \right) + \\begin{split} + \\mathbf{SL} &= + \\sum_{j=1}^{n} \\left( \\mathbf{SLEF} \\circ \\mathbf{SLEM} \\right)_{rowwise} \\\\ + \\text{where:} \\\\ + \\mathbf{SLEF} &= + \\begin{bmatrix} + \\text{SLEF}_{1,1} & \\text{SLEF}_{1,2} & \\dots & \\text{SLEF}_{1,n} \\\\ + \\text{SLEF}_{2,1} & \\text{SLEF}_{2,2} & \\dots & \\text{SLEF}_{2,n} \\\\ + \\vdots & \\vdots & \\ddots & \\vdots \\\\ + \\text{SLEF}_{m,1} & \\text{SLEF}_{m,2} & \\dots & \\text{SLEF}_{m,n} + \\end{bmatrix} \\\\ + \\mathbf{SLEM} &= + \\begin{bmatrix} + \\text{SLEM}_{1,1} & \\text{SLEM}_{1,2} & \\dots & \\text{SLEM}_{1,n} \\\\ + \\text{SLEM}_{2,1} & \\text{SLEM}_{2,2} & \\dots & \\text{SLEM}_{2,n} \\\\ + \\vdots & \\vdots & \\ddots & \\vdots \\\\ + \\text{SLEM}_{m,1} & \\text{SLEM}_{m,2} & \\dots & \\text{SLEM}_{m,n} + \\end{bmatrix} \\\\ + \\mathbf{SL} &= + \\begin{bmatrix} + \\text{SL}_{1} \\\\ + \\text{SL}_{2} \\\\ + \\vdots \\\\ + \\text{SL}_{m} + \\end{bmatrix} + \\end{split} Example ~~~~~~~ For a given model, we can have a matrix of secondary loss probabilities. Each row can represent a simulation and each column can -represent a loss type. In this example below we have three different -probability columns for different types of probability loss. E.g. the +represent a loss type. In this example below we have three different +probability columns for different types of probability loss. E.g. the probabilities of loss for simulation 1 are 0.95, 0.05, and 1.00. +------------+-------------+--------------+--------------+ From 54f2ec777b59d72ff9e6ea78134455c65f7444f6 Mon Sep 17 00:00:00 2001 From: coreyneskey Date: Wed, 25 Jun 2025 15:26:12 -0400 Subject: [PATCH 6/6] docs: update logo. --- static/logo.png | Bin 3836 -> 98248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/logo.png b/static/logo.png index 29cb9dbbf0fafdb1ed7393812fc38c413e0d45f7..f07a514e02676146c2bc6fe0639729f5d1762656 100644 GIT binary patch literal 98248 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