4 #include "pbqp_edge_t.h"
5 #include "pbqp_node_t.h"
6 #include "heuristical.h"
7 #include "html_dumper.h"
11 /* Caution: Due to static buffer use only once per statement */
12 static const char *cost2a(num const cost)
16 if (cost == INF_COSTS) return "inf";
17 sprintf(buf, "%10lld", cost);
22 static void dump_vector(FILE *f, vector *vec)
27 fprintf(f, "<span class=\"vector\">( ");
28 unsigned len = vec->len;
30 for (index = 0; index < len; ++index) {
32 fprintf(f, "<span title=\"%s\">%s</span> ",
33 vec->entries[index].name, cost2a(vec->entries[index].data));
35 fprintf(f, "%s ", cost2a(vec->entries[index].data));
38 fprintf(f, " )</span>\n");
41 static void dump_matrix(FILE *f, pbqp_matrix *mat)
45 num *p = mat->entries;
49 fprintf(f, "\t\\begin{pmatrix}\n");
50 for (row = 0; row < mat->rows; ++row) {
51 fprintf(f, "\t %s", cost2a(*p++));
53 for (col = 1; col < mat->cols; ++col) {
54 fprintf(f, "& %s", cost2a(*p++));
58 fprintf(f, "\t\\end{pmatrix}\n");
61 void dump_edge(pbqp *pbqp, pbqp_edge *edge)
63 fputs("<tex>\n", pbqp->dump_file);
64 fprintf(pbqp->dump_file, "\t\\overline\n{C}_{%d,%d}=\n",
65 edge->src->index, edge->tgt->index);
66 dump_matrix(pbqp->dump_file, edge->costs);
67 fputs("</tex><br>", pbqp->dump_file);
70 static void dump_edge_costs(pbqp *pbqp)
75 assert(pbqp->dump_file);
77 fputs("<p>", pbqp->dump_file);
78 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
79 pbqp_node *src_node = get_node(pbqp, src_index);
85 unsigned len = ARR_LEN(src_node->edges);
86 for (edge_index = 0; edge_index < len; ++edge_index) {
87 pbqp_edge *edge = src_node->edges[edge_index];
88 unsigned tgt_index = edge->tgt->index;
89 if (src_index < tgt_index) {
90 dump_edge(pbqp, edge);
94 fputs("</p>", pbqp->dump_file);
97 void dump_node(pbqp *pbqp, pbqp_node *node)
100 assert(pbqp->dump_file);
103 fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", node->index);
104 dump_vector(pbqp->dump_file, node->costs);
105 fputs("<br>\n", pbqp->dump_file);
109 static void dump_node_costs(pbqp *pbqp)
114 assert(pbqp->dump_file);
116 /* dump node costs */
117 fputs("<p>", pbqp->dump_file);
118 for (index = 0; index < pbqp->num_nodes; ++index) {
119 dump_node(pbqp, get_node(pbqp, index));
121 fputs("</p>", pbqp->dump_file);
124 void dump_section(FILE *f, int level, char *txt)
128 fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
131 void pbqp_dump_graph(pbqp *pbqp)
136 assert(pbqp->dump_file);
138 fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
139 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
140 pbqp_node *node = get_node(pbqp, src_index);
141 if (node && !node_is_reduced(node)) {
142 fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
146 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
147 pbqp_node *node = get_node(pbqp, src_index);
152 if (node_is_reduced(node))
155 unsigned len = ARR_LEN(node->edges);
157 for (edge_index = 0; edge_index < len; ++edge_index) {
158 pbqp_node *tgt_node = node->edges[edge_index]->tgt;
159 unsigned tgt_index = tgt_node->index;
161 if (node_is_reduced(tgt_node))
164 if (src_index < tgt_index) {
165 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
170 fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
173 void pbqp_dump_input(pbqp *pbqp)
176 assert(pbqp->dump_file);
178 dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
179 dump_section(pbqp->dump_file, 2, "1.1 Topology");
180 pbqp_dump_graph(pbqp);
181 dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
182 dump_node_costs(pbqp);
183 dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
184 dump_edge_costs(pbqp);
187 void dump_simplifyedge(pbqp *pbqp, pbqp_edge *edge)
190 assert(pbqp->dump_file);
192 dump_node(pbqp, edge->src);
193 dump_edge(pbqp, edge);
194 dump_node(pbqp, edge->tgt);