4 #include "pbqp_edge_t.h"
5 #include "pbqp_node_t.h"
6 #include "html_dumper.h"
11 static void dump_vector(FILE *f, vector *vec)
16 fprintf(f, "<span class=\"vector\">( ");
17 unsigned len = vec->len;
19 for (index = 0; index < len; ++index) {
21 if (vec->entries[index].data == INF_COSTS) {
22 fprintf(f, "<span title=\"%s\"> inf </span>",
23 vec->entries[index].name);
25 fprintf(f, "<span title=\"%s\">%6d</span>",
26 vec->entries[index].name, vec->entries[index].data);
29 if (vec->entries[index].data == INF_COSTS) {
32 fprintf(f, "%6d", vec->entries[index].data);
36 fprintf(f, " )</span>\n");
39 static void dump_matrix(FILE *f, pbqp_matrix *mat)
43 num *p = mat->entries;
47 fprintf(f, "\t\\begin{pmatrix}\n");
48 for (row = 0; row < mat->rows; ++row) {
49 if (*p == INF_COSTS) {
53 fprintf(f, "\t %6d", *p++);
56 for (col = 1; col < mat->cols; ++col) {
57 if (*p == INF_COSTS) {
61 fprintf(f, "& %6d", *p++);
66 fprintf(f, "\t\\end{pmatrix}\n");
69 void dump_edge(pbqp *pbqp, pbqp_edge *edge)
71 fputs("<tex>\n", pbqp->dump_file);
72 fprintf(pbqp->dump_file, "\t\\overline\n{C}_{%d,%d}=\n",
73 edge->src->index, edge->tgt->index);
74 dump_matrix(pbqp->dump_file, edge->costs);
75 fputs("</tex><br>", pbqp->dump_file);
78 static void dump_edge_costs(pbqp *pbqp)
83 assert(pbqp->dump_file);
85 fputs("<p>", pbqp->dump_file);
86 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
87 pbqp_node *src_node = get_node(pbqp, src_index);
93 unsigned len = ARR_LEN(src_node->edges);
94 for (edge_index = 0; edge_index < len; ++edge_index) {
95 pbqp_edge *edge = src_node->edges[edge_index];
96 unsigned tgt_index = edge->tgt->index;
97 if (src_index < tgt_index) {
98 dump_edge(pbqp, edge);
102 fputs("</p>", pbqp->dump_file);
105 void dump_node(pbqp *pbqp, pbqp_node *node)
108 assert(pbqp->dump_file);
111 fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", node->index);
112 dump_vector(pbqp->dump_file, node->costs);
113 fputs("<br>\n", pbqp->dump_file);
117 static void dump_node_costs(pbqp *pbqp)
122 assert(pbqp->dump_file);
124 /* dump node costs */
125 fputs("<p>", pbqp->dump_file);
126 for (index = 0; index < pbqp->num_nodes; ++index) {
127 dump_node(pbqp, get_node(pbqp, index));
129 fputs("</p>", pbqp->dump_file);
132 void dump_section(FILE *f, int level, char *txt)
136 fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
139 void pbqp_dump_graph(pbqp *pbqp)
144 assert(pbqp->dump_file);
146 fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
147 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
148 pbqp_node *node = get_node(pbqp, src_index);
149 if (node && !node_is_reduced(node)) {
150 fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
154 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
155 pbqp_node *node = get_node(pbqp, src_index);
160 if (node_is_reduced(node))
163 unsigned len = ARR_LEN(node->edges);
165 for (edge_index = 0; edge_index < len; ++edge_index) {
166 pbqp_node *tgt_node = node->edges[edge_index]->tgt;
167 unsigned tgt_index = tgt_node->index;
169 if (node_is_reduced(tgt_node))
172 if (src_index < tgt_index) {
173 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
178 fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
181 void pbqp_dump_input(pbqp *pbqp)
184 assert(pbqp->dump_file);
186 dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
187 dump_section(pbqp->dump_file, 2, "1.1 Topology");
188 pbqp_dump_graph(pbqp);
189 dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
190 dump_node_costs(pbqp);
191 dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
192 dump_edge_costs(pbqp);
195 void dump_simplifyedge(pbqp *pbqp, pbqp_edge *edge)
198 assert(pbqp->dump_file);
200 dump_node(pbqp, edge->src);
201 dump_edge(pbqp, edge);
202 dump_node(pbqp, edge->tgt);