def test_invalid_arg_text_when_object_arg(): with experiment_testing_context(new_experiment_lib=True): @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=3)): return a.a + 2 record = my_unhashable_arg_test.run() assert record.get_result() == 5 assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' # --------------------- clear_all_experiments() @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=3)): return a.a + 2 assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' # --------------------- clear_all_experiments() @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=4)): return a.a + 2 assert get_record_invalid_arg_string( record, recursive=True) == 'Change: {a.a:3}->{a.a:4}'
def test_invalid_arg_text_when_object_arg(): with experiment_testing_context(new_experiment_lib=True): @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=3)): return a.a+2 record = my_unhashable_arg_test.run() assert record.get_result() == 5 assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' # --------------------- clear_all_experiments() @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=3)): return a.a+2 assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' # --------------------- clear_all_experiments() @experiment_function def my_unhashable_arg_test(a=MyArgumentObject(a=4)): return a.a+2 assert get_record_invalid_arg_string(record, recursive=True) == 'Change: a.a:3->4'
def test_invalid_arg_text(): with experiment_testing_context(new_experiment_lib=True): @experiment_function def my_invalid_arg_test(a=1, b={'c': 3, 'd': 4}): return a + b['c'] + b['d'] record = my_invalid_arg_test.run() assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' clear_all_experiments() @experiment_function def my_invalid_arg_test(a=2, b={'c': 3, 'd': 4}): return a + b['c'] + b['d'] assert get_record_invalid_arg_string( record, recursive=True) == 'Change: {a:1}->{a:2}' clear_all_experiments() @experiment_function def my_invalid_arg_test(a=2, b={'c': 3, 'd': 2}): return a + b['c'] + b['d'] assert get_record_invalid_arg_string( record, recursive=True) == "Change: {a:1,b['d']:4}->{a:2,b['d']:2}"
def get_record_table(records = None, headers = ('#', 'Identifier', 'Start Time', 'Duration', 'Status', 'Valid', 'Notes', 'Result'), raise_display_errors = False, result_truncation=100): d = { '#': lambda: i, 'Identifier': lambda: experiment_record.get_id(), 'Start Time': lambda: experiment_record.info.get_field_text(ExpInfoFields.TIMESTAMP, replacement_if_none='?'), 'Duration': lambda: experiment_record.info.get_field_text(ExpInfoFields.RUNTIME, replacement_if_none='?'), 'Status': lambda: experiment_record.info.get_field_text(ExpInfoFields.STATUS, replacement_if_none='?'), 'Args': lambda: experiment_record.info.get_field_text(ExpInfoFields.ARGS, replacement_if_none='?'), 'Valid': lambda: get_record_invalid_arg_string(experiment_record, note_version='short'), 'Notes': lambda: experiment_record.info.get_field_text(ExpInfoFields.NOTES, replacement_if_none='?'), 'Result': lambda: get_oneline_result_string(experiment_record, truncate_to=128) # experiment_record.get_experiment().get_oneline_result_string(truncate_to=result_truncation) if is_experiment_loadable(experiment_record.get_experiment_id()) else '<Experiment not loaded>' } def get_col_info(headers): info = [] for h in headers: try: info.append(d[h]()) except: info.append('<Error displaying info>') if raise_display_errors: raise return info rows = [] for i, experiment_record in enumerate(records): rows.append(get_col_info(headers)) assert all_equal([len(headers)] + [len(row) for row in rows]), 'Header length: {}, Row Lengths: \n {}'.format(len(headers), [len(row) for row in rows]) return tabulate(rows, headers=headers)
def get_record_table(records = None, headers = ('#', 'Identifier', 'Start Time', 'Duration', 'Status', 'Valid', 'Notes', 'Result'), raise_display_errors = False, result_truncation=100): d = { '#': lambda: i, 'Identifier': lambda: experiment_record.get_id(), 'Start Time': lambda: experiment_record.info.get_field_text(ExpInfoFields.TIMESTAMP, replacement_if_none='?'), 'Duration': lambda: experiment_record.info.get_field_text(ExpInfoFields.RUNTIME, replacement_if_none='?'), 'Status': lambda: experiment_record.info.get_field_text(ExpInfoFields.STATUS, replacement_if_none='?'), 'Args': lambda: experiment_record.info.get_field_text(ExpInfoFields.ARGS, replacement_if_none='?'), 'Valid': lambda: get_record_invalid_arg_string(experiment_record, note_version='short'), 'Notes': lambda: experiment_record.info.get_field_text(ExpInfoFields.NOTES, replacement_if_none='?'), 'Result': lambda: get_oneline_result_string(experiment_record, truncate_to=128) # experiment_record.get_experiment().get_oneline_result_string(truncate_to=result_truncation) if is_experiment_loadable(experiment_record.get_experiment_id()) else '<Experiment not loaded>' } def get_col_info(headers): info = [] for h in headers: try: info.append(d[h]()) except: info.append('<Error displaying info>') if raise_display_errors: raise return info rows = [] for i, experiment_record in enumerate(records): rows.append(get_col_info(headers)) assert all_equal([len(headers)] + [len(row) for row in rows]), 'Header length: {}, Row Lengths: \n {}'.format(len(headers), [len(row) for row in rows]) return tabulate(rows, headers=headers)
def test_invalid_arg_text(): with experiment_testing_context(new_experiment_lib=True): @experiment_function def my_invalid_arg_test(a=1, b={'c': 3, 'd': 4}): return a+b['c']+b['d'] record = my_invalid_arg_test.run() assert get_record_invalid_arg_string(record, recursive=True) == '<No Change>' clear_all_experiments() @experiment_function def my_invalid_arg_test(a=2, b={'c': 3, 'd': 4}): return a+b['c']+b['d'] assert get_record_invalid_arg_string(record, recursive=True) == 'Change: a:1->2' clear_all_experiments() @experiment_function def my_invalid_arg_test(a=2, b={'c': 3, 'd': 2}): return a+b['c']+b['d'] assert get_record_invalid_arg_string(record, recursive=True) == "Change: a:1->2, b['d']:4->2"
def get_field(header): try: return \ index if header=='#' else \ (str(i) if j==0 else '') if header == 'E#' else \ j if header == 'R#' else \ (name if j==0 else '') if header=='Name' else \ experiment_record.info.get_field_text(ExpInfoFields.TIMESTAMP) if header in ('Last Run', 'All Runs') else \ experiment_record.info.get_field_text(ExpInfoFields.RUNTIME) if header=='Duration' else \ experiment_record.info.get_field_text(ExpInfoFields.STATUS) if header=='Status' else \ get_record_invalid_arg_string(experiment_record) if header=='Valid' else \ oneliner_func(experiment_record.get_id(), truncate_to=truncate_result_to) if header=='Result' else \ '???' except: if raise_display_errors: raise return '<Display Error>'
@classmethod def get_setting(cls, name): return _DisplaySettings.SETTINGS[name] _exp_record_field_getters = { ExpRecordDisplayFields.RUNS: lambda rec: rec.info.get_field_text(ExpInfoFields.TIMESTAMP), ExpRecordDisplayFields.DURATION: lambda rec: format_duration(rec.info.get_field(ExpInfoFields.RUNTIME)), ExpRecordDisplayFields.STATUS: lambda rec: rec.info.get_field_text(ExpInfoFields.STATUS), ExpRecordDisplayFields.ARGS_CHANGED: lambda rec: get_record_invalid_arg_string( rec, ignore_valid_keys=_DisplaySettings.get_setting('ignore_valid_keys')), ExpRecordDisplayFields.RESULT_STR: get_oneline_result_string, ExpRecordDisplayFields.NOTES: _show_notes } def _get_record_rows(record_id, headers, raise_display_errors, truncate_to, ignore_valid_keys=()): rec = load_experiment_record(record_id)
def __enter__(self): self.old_settings = _DisplaySettings.SETTINGS _DisplaySettings.SETTINGS = self.settings_dict def __exit__(self, exc_type, exc_val, exc_tb): _DisplaySettings.SETTINGS = self.old_settings @classmethod def get_setting(cls, name): return _DisplaySettings.SETTINGS[name] _exp_record_field_getters = { ExpRecordDisplayFields.RUNS: lambda rec: format_time_stamp(rec.info.get_field(ExpInfoFields.TIMESTAMP)), ExpRecordDisplayFields.DURATION: lambda rec: format_duration(rec.info.get_field(ExpInfoFields.RUNTIME)) if rec.info.has_field(ExpInfoFields.RUNTIME) else '-', ExpRecordDisplayFields.ARGS_CHANGED: lambda rec: get_record_invalid_arg_string(rec, ignore_valid_keys=_DisplaySettings.get_setting('ignore_valid_keys'), note_version='short'), ExpRecordDisplayFields.RESULT_STR: get_oneline_result_string, ExpRecordDisplayFields.STATUS: lambda rec: rec.info.get_field_text(ExpInfoFields.STATUS), ExpRecordDisplayFields.NOTES: _show_notes } def _get_record_rows(record_id, headers, raise_display_errors, truncate_to, ignore_valid_keys = ()): rec = load_experiment_record(record_id) with _DisplaySettings(dict(ignore_valid_keys=ignore_valid_keys)): if not raise_display_errors: values = [] for h in headers: try: values.append(_exp_record_field_getters[h](rec))
def __enter__(self): self.old_settings = _DisplaySettings.SETTINGS _DisplaySettings.SETTINGS = self.settings_dict def __exit__(self, exc_type, exc_val, exc_tb): _DisplaySettings.SETTINGS = self.old_settings @classmethod def get_setting(cls, name): return _DisplaySettings.SETTINGS[name] _exp_record_field_getters = { ExpRecordDisplayFields.RUNS: lambda rec: format_time_stamp(rec.info.get_field(ExpInfoFields.TIMESTAMP)), ExpRecordDisplayFields.DURATION: lambda rec: format_duration(rec.info.get_field(ExpInfoFields.RUNTIME)) if rec.info.has_field(ExpInfoFields.RUNTIME) else '-', ExpRecordDisplayFields.ARGS_CHANGED: lambda rec: get_record_invalid_arg_string(rec, ignore_valid_keys=_DisplaySettings.get_setting('ignore_valid_keys')), ExpRecordDisplayFields.RESULT_STR: get_oneline_result_string, ExpRecordDisplayFields.STATUS: lambda rec: rec.info.get_field_text(ExpInfoFields.STATUS), ExpRecordDisplayFields.NOTES: _show_notes } def _get_record_rows(record_id, headers, raise_display_errors, truncate_to, ignore_valid_keys = ()): rec = load_experiment_record(record_id) with _DisplaySettings(dict(ignore_valid_keys=ignore_valid_keys)): if not raise_display_errors: values = [] for h in headers: try: values.append(_exp_record_field_getters[h](rec))