diff --git a/compiler/characterizer/regression_model.py b/compiler/characterizer/regression_model.py index 98e7afe3..4a45bade 100644 --- a/compiler/characterizer/regression_model.py +++ b/compiler/characterizer/regression_model.py @@ -168,6 +168,9 @@ class regression_model(simulation): def cross_validation(self): + """Wrapper for sklean cross validation function for OpenRAM regression models. + Returns the mean accuracy for each model/output.""" + from sklearn.model_selection import cross_val_score untrained_model = self.get_model() @@ -179,13 +182,15 @@ class regression_model(simulation): output_num = 0 models = {} debug.info(1, "Output name, mean_accuracy, std_dev") + model_scores = {} for o_name in self.output_names: output_label = labels[:,output_num] - scores = cross_val_score(untrained_model, features, output_label, cv=5) + scores = cross_val_score(untrained_model, features, output_label, cv=10) debug.info(1, "{}, {}, {}".format(o_name, scores.mean(), scores.std())) + model_scores[o_name] = scores.mean() output_num+=1 - + return model_scores # Fixme - only will work for sklearn regression models def save_model(self, model_name, model): diff --git a/compiler/tests/21_regression_model_test.py b/compiler/tests/21_regression_model_test.py index 2b2462c4..59665cab 100755 --- a/compiler/tests/21_regression_model_test.py +++ b/compiler/tests/21_regression_model_test.py @@ -30,6 +30,7 @@ class regression_model_test(openram_test): import characterizer reload(characterizer) from characterizer import linear_regression + from characterizer import neural_network from sram import sram from sram_config import sram_config c = sram_config(word_size=1, @@ -49,31 +50,11 @@ class regression_model_test(openram_test): corner = (OPTS.process_corners[0], OPTS.supply_voltages[0], OPTS.temperatures[0]) - m = linear_regression(s.s, tempspice, corner) - m.cross_validation() - - # Only compare the delays - # spice_delays = {key:value for key, value in spice_data.items() if 'delay' in key} - # spice_delays['min_period'] = spice_data['min_period'] - # model_delays = {key:value for key, value in model_data.items() if 'delay' in key} - # model_delays['min_period'] = model_data['min_period'] - # debug.info(1,"Spice Delays={}".format(spice_delays)) - # debug.info(1,"Model Delays={}".format(model_delays)) - - # if OPTS.tech_name == "freepdk45": - # error_tolerance = 0.25 - # elif OPTS.tech_name == "scn4m_subm": - # error_tolerance = 0.25 - # else: - # self.assertTrue(False) # other techs fail - - # print('spice_delays', spice_delays) - # print('model_delays', model_delays) - - # # Check if no too many or too few results - # self.assertTrue(len(spice_delays.keys())==len(model_delays.keys())) - - # self.assertTrue(self.check_golden_data(spice_delays,model_delays,error_tolerance)) + #m = linear_regression(s.s, tempspice, corner) + m = neural_network(s.s, tempspice, corner) + scores = m.cross_validation() + accuracy_requirement = 0.75 + self.assertTrue(scores['rise_delay'] >= accuracy_requirement) globals.end_openram()