diff options
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/analyze-log.py | 13 | ||||
-rwxr-xr-x | bin/workload.py | 66 |
2 files changed, 25 insertions, 54 deletions
diff --git a/bin/analyze-log.py b/bin/analyze-log.py index 0b66bdf..50b5648 100755 --- a/bin/analyze-log.py +++ b/bin/analyze-log.py @@ -301,7 +301,7 @@ def main(): if args.export_dot: dfatool.cli.export_dot(model, args.export_dot) - if args.export_dref: + if args.export_dref or args.export_pseudo_dref: dref = model.to_dref( static_quality, lut_quality, @@ -321,9 +321,14 @@ def main(): mutual_information[param] ) - dfatool.cli.export_dataref( - args.export_dref, dref, precision=args.dref_precision - ) + if args.export_pseudo_dref: + dfatool.cli.export_pseudo_dref( + args.export_pseudo_dref, dref, precision=args.dref_precision + ) + if args.export_dref: + dfatool.cli.export_dataref( + args.export_dref, dref, precision=args.dref_precision + ) if args.export_json: with open(args.export_json, "w") as f: diff --git a/bin/workload.py b/bin/workload.py index ee2df0d..72b66bb 100755 --- a/bin/workload.py +++ b/bin/workload.py @@ -6,6 +6,7 @@ import logging import sys import dfatool.cli import dfatool.utils +from dfatool.behaviour import EventSequenceModel from dfatool.model import AnalyticModel @@ -39,6 +40,11 @@ def main(): type=str, help="Path to model file (.json or .json.xz)", ) + parser.add_argument( + "--use-lut", + action="store_true", + help="Use LUT rather than performance model for prediction", + ) parser.add_argument("event", nargs="+", type=str) args = parser.parse_args() @@ -61,58 +67,18 @@ def main(): if args.info: for i in range(len(models)): print(f"""{args.models[i]}: {" ".join(models[i].parameters)}""") + _, param_info = models[i].get_fitted() for name in models[i].names: for attr in models[i].attributes(name): - print(f" {name}.{attr}") - - aggregate = args.aggregate_init - for event in args.event: - - event_normalizer = lambda p: p - if "/" in event: - v1, v2 = event.split("/") - if dfatool.utils.is_numeric(v1): - event = v2.strip() - event_normalizer = lambda p: dfatool.utils.soft_cast_float(v1) / p - elif dfatool.utils.is_numeric(v2): - event = v1.strip() - event_normalizer = lambda p: p / dfatool.utils.soft_cast_float(v2) - else: - raise RuntimeError(f"Cannot parse '{event}'") - - nn, param = event.split("(") - name, action = nn.split(".") - param_model = None - ref_model = None - for model in models: - if name in model.names and action in model.attributes(name): - ref_model = model - param_model, param_info = model.get_fitted() - break - assert param_model is not None - param = param.removesuffix(")") - if param == "": - param = dict() - else: - param = dfatool.utils.parse_conf_str(param) - - param_list = dfatool.utils.param_dict_to_list(param, ref_model.parameters) - - if not param_info(name, action).is_predictable(param_list): - logging.warning( - f"Cannot predict {name}.{action}({param}), falling back to static model" - ) - - event_output = event_normalizer( - param_model( - name, - action, - param=param_list, - ) - ) - - if args.aggregate == "sum": - aggregate += event_output + print(f" {name}.{attr} {param_info(name, attr)}") + + workload = EventSequenceModel(models) + aggregate = workload.eval_strs( + args.event, + aggregate=args.aggregate, + aggregate_init=args.aggregate_init, + use_lut=args.use_lut, + ) if args.normalize_output: sf = dfatool.cli.parse_shift_function( |