Format string depend on used type.
[libfirm] / heuristical_co.c
index f05bdb9..d5eb0f4 100644 (file)
 #include "plist.h"
 #include "timing.h"
 
+static void apply_RN_co(pbqp *pbqp, plist_t *rpeo)
+{
+       pbqp_node   *node         = NULL;
+       unsigned     min_index    = 0;
+
+       assert(pbqp);
+
+       /* We want to reduce the first node in reverse perfect elimination order. */
+       do {
+               /* get first element from reverse perfect elimination order */
+               node = plist_first(rpeo)->data;
+               /* remove element from reverse perfect elimination order */
+               plist_erase(rpeo, plist_first(rpeo));
+               /* insert node at the end of rpeo so the rpeo already exits after pbqp solving */
+               plist_insert_back(rpeo, node);
+       } while(node_is_reduced(node));
+
+       assert(node);
+       assert(pbqp_node_get_degree(node) > 2);
+
+#if    KAPS_DUMP
+       if (pbqp->dump_file) {
+               char     txt[100];
+               sprintf(txt, "RN-Reduction of Node n%d", node->index);
+               dump_section(pbqp->dump_file, 2, txt);
+               pbqp_dump_graph(pbqp);
+       }
+#endif
+#if KAPS_STATISTIC
+       /* Check whether we can merge a neighbor into the current node. */
+       for (min_index = 0; min_index < pbqp_node_get_degree(node); ++min_index) {
+               check_melting_possibility(pbqp, node->edges[min_index]);
+       }
+#endif
+
+       min_index = get_local_minimal_alternative(pbqp, node);
+
+#if    KAPS_DUMP
+       if (pbqp->dump_file) {
+               fprintf(pbqp->dump_file, "node n%d is set to %d<br><br>\n",
+                                       node->index, min_index);
+       }
+#endif
+
+#if KAPS_STATISTIC
+               FILE *fh = fopen("solutions.pb", "a");
+               fprintf(fh, "[%u]", min_index);
+               fclose(fh);
+               pbqp->num_rn++;
+#endif
+
+       /* Now that we found the local minimum set all other costs to infinity. */
+       select_alternative(node, min_index);
+}
+
 static void apply_heuristic_reductions_co(pbqp *pbqp, plist_t *rpeo)
 {
        #if KAPS_TIMING
                /* create timers */
-               ir_timer_t *t_edge = ir_timer_register("be_pbqp_edges", "pbqp reduce independent edges");
-               ir_timer_t *t_r0 = ir_timer_register("be_pbqp_r0", "pbqp R0 reductions");
-               ir_timer_t *t_r1 = ir_timer_register("be_pbqp_r1", "pbqp R1 reductions");
-               ir_timer_t *t_r2 = ir_timer_register("be_pbqp_r2", "pbqp R2 reductions");
-               ir_timer_t *t_rn = ir_timer_register("be_pbqp_rN", "pbqp RN reductions");
-
-               /* reset timers */
-               ir_timer_reset(t_edge);
-               ir_timer_reset(t_r0);
-               ir_timer_reset(t_r1);
-               ir_timer_reset(t_r2);
-               ir_timer_reset(t_rn);
+               ir_timer_t *t_edge = ir_timer_new();
+               ir_timer_t *t_r0   = ir_timer_new();
+               ir_timer_t *t_r1   = ir_timer_new();
+               ir_timer_t *t_r2   = ir_timer_new();
+               ir_timer_t *t_rn   = ir_timer_new();
        #endif
 
        for (;;) {
@@ -108,11 +156,11 @@ static void apply_heuristic_reductions_co(pbqp *pbqp, plist_t *rpeo)
                        #endif
                } else {
                        #if KAPS_TIMING
-                               printf("%-20s: %8.3lf msec\n", ir_timer_get_description(t_edge), (double)ir_timer_elapsed_usec(t_edge) / 1000.0);
-                               printf("%-20s: %8.3lf msec\n", ir_timer_get_description(t_r0), (double)ir_timer_elapsed_usec(t_r0) / 1000.0);
-                               printf("%-20s: %8.3lf msec\n", ir_timer_get_description(t_r1), (double)ir_timer_elapsed_usec(t_r1) / 1000.0);
-                               printf("%-20s: %8.3lf msec\n", ir_timer_get_description(t_r2), (double)ir_timer_elapsed_usec(t_r2) / 1000.0);
-                               printf("%-20s: %8.3lf msec\n", ir_timer_get_description(t_rn), (double)ir_timer_elapsed_usec(t_rn) / 1000.0);
+                               printf("pbqp reduce independent edges: %8.3lf msec\n", (double)ir_timer_elapsed_usec(t_edge) / 1000.0);
+                               printf("pbqp R0 reductions: %8.3lf msec\n", (double)ir_timer_elapsed_usec(t_r0) / 1000.0);
+                               printf("pbqp R1 reductions: %8.3lf msec\n", (double)ir_timer_elapsed_usec(t_r1) / 1000.0);
+                               printf("pbqp R2 reductions: %8.3lf msec\n", (double)ir_timer_elapsed_usec(t_r2) / 1000.0);
+                               printf("pbqp RN reductions: %8.3lf msec\n", (double)ir_timer_elapsed_usec(t_rn) / 1000.0);
                        #endif
 
                        return;
@@ -140,9 +188,14 @@ void solve_pbqp_heuristical_co(pbqp *pbqp, plist_t *rpeo)
 
        #if KAPS_STATISTIC
                fh = fopen("solutions.pb", "a");
-               fprintf(fh, ": %lld RE:%u R0:%u R1:%u R2:%u RN/BF:%u\n", pbqp->solution,
+               #if KAPS_USE_UNSIGNED
+                       fprintf(fh, ": %u RE:%u R0:%u R1:%u R2:%u RM:%u RN/BF:%u\n", pbqp->solution,
                                        pbqp->num_edges, pbqp->num_r0, pbqp->num_r1, pbqp->num_r2,
-                                       pbqp->num_rn);
+                                       pbqp->num_rm, pbqp->num_rn);
+               #else
+                       fprintf(fh, ": %lld RE:%u R0:%u R1:%u R2:%u RM:%u RN/BF:%u\n", pbqp->solution,
+                                       pbqp->num_edges, pbqp->num_r0, pbqp->num_r1, pbqp->num_r2,
+               #endif
                fclose(fh);
        #endif
 
@@ -151,54 +204,3 @@ void solve_pbqp_heuristical_co(pbqp *pbqp, plist_t *rpeo)
 
        free_buckets();
 }
-
-void apply_RN_co(pbqp *pbqp, plist_t *rpeo)
-{
-       pbqp_node   *node         = NULL;
-       unsigned     min_index    = 0;
-
-       assert(pbqp);
-
-       /* We want to reduce the first node in reverse perfect elimination order. */
-       do {
-               /* get first element from reverse perfect elimination order */
-               node = plist_first(rpeo)->data;
-               /* remove element from reverse perfect elimination order */
-               plist_erase(rpeo, plist_first(rpeo));
-               /* insert node at the end of rpeo so the rpeo already exits after pbqp solving */
-               plist_insert_back(rpeo, node);
-       } while(node_is_reduced(node));
-
-       assert(node);
-       assert(pbqp_node_get_degree(node) > 2);
-
-#if    KAPS_DUMP
-       if (pbqp->dump_file) {
-               char     txt[100];
-               sprintf(txt, "RN-Reduction of Node n%d", node->index);
-               dump_section(pbqp->dump_file, 2, txt);
-               pbqp_dump_graph(pbqp);
-       }
-#endif
-
-       min_index = get_local_minimal_alternative(pbqp, node);
-
-#if    KAPS_DUMP
-       if (pbqp->dump_file) {
-               fprintf(pbqp->dump_file, "node n%d is set to %d<br><br>\n",
-                                       node->index, min_index);
-       }
-#endif
-
-#if KAPS_STATISTIC
-       if (dump == 0) {
-               FILE *fh = fopen("solutions.pb", "a");
-               fprintf(fh, "[%u]", min_index);
-               fclose(fh);
-               pbqp->num_rn++;
-       }
-#endif
-
-       /* Now that we found the local minimum set all other costs to infinity. */
-       select_alternative(node, min_index);
-}