// Get dictionary of inputs and the error they produce
public static CellDict GenImportantErrors(AST.Address[] output_nodes,
CellDict inputs,
int k, // number of alternatives to consider
CellDict correct_outputs,
Excel.Application app,
Excel.Workbook wb,
Classification c,
DAG dag)
{
var eg = new ErrorGenerator();
var max_error_produced_dictionary = new Dictionary <AST.Address, Tuple <string, double> >();
foreach (KeyValuePair <AST.Address, string> pair in inputs)
{
AST.Address addr = pair.Key;
string orig_value = pair.Value;
//Load in the classification's dictionaries
double max_error_produced = 0.0;
string max_error_string = "";
// get k strings
string[] errorstrings = eg.GenerateErrorStrings(orig_value, c, k);
for (int i = 0; i < k; i++)
{
CellDict cd = new CellDict();
cd.Add(addr, errorstrings[i]);
//inject the typo
InjectValues(app, wb, cd);
// save function outputs
CellDict incorrect_outputs = SaveOutputs(output_nodes, dag);
//remove the typo that was introduced
cd.Clear();
cd.Add(addr, orig_value);
InjectValues(app, wb, cd);
double total_error = Utility.CalculateTotalError(correct_outputs, incorrect_outputs);
//keep track of the largest observed max error
if (total_error > max_error_produced)
{
max_error_produced = total_error;
max_error_string = errorstrings[i];
}
}
//Add entry for this TreeNode in our dictionary with its max_error_produced
max_error_produced_dictionary.Add(addr, new Tuple <string, double>(max_error_string, max_error_produced));
}
// sort by max_error_produced
var maxen = max_error_produced_dictionary.OrderByDescending(pair => pair.Value.Item2).Select(pair => new Tuple <AST.Address, string>(pair.Key, pair.Value.Item1)).ToList();
return(maxen.Take((int)Math.Ceiling(0.05 * inputs.Count)).ToDictionary(tup => tup.Item1, tup => tup.Item2));
}