/** * histogram * * <p>Histogram overlap score worst-case = 0.0 and best-case = 1.0 */ public static void evaluateCircuitHistogramOverlap( LogicCircuit lc, GateLibrary gate_library, Args options) { // output gate _score (average) refreshGateAttributes(lc, gate_library); // if sequential if (options.get_circuit_type() == DNACompiler.CircuitType.sequential) { // set initial SequentialHelper.setInitialHistogramREUs(lc, gate_library); // track HashMap<String, ArrayList<ArrayList<double[]>>> track_reus = new HashMap<>(); for (Gate g : lc.get_Gates()) { track_reus.put(g.Name, new ArrayList<ArrayList<double[]>>()); ArrayList<double[]> copy_hist_reus = new ArrayList<double[]>(g.get_histogram_reus()); track_reus.get(g.Name).add(copy_hist_reus); track_reus.get(g.Name).add(copy_hist_reus); // looks for i-1 } // converge SequentialHelper.convergeHistogramREUs(lc, gate_library, options, track_reus); } // if combinational else if (options.get_circuit_type() == DNACompiler.CircuitType.combinational) { Evaluate.simulateHistogramREU(lc, gate_library, options); } double worst_out = Double.MAX_VALUE; for (int out = 0; out < lc.get_output_gates().size(); ++out) { Gate output = lc.get_output_gates().get(out); evaluateGateHistogramOverlap(output); if (output.get_scores().get_conv_overlap() < worst_out) { worst_out = output.get_scores().get_conv_overlap(); } } lc.get_scores().set_conv_overlap(worst_out); }