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 fprintf(f, "<span title=\"%s\">%6d</span>", vec->entries[index].name,
22 vec->entries[index].data);
24 fprintf(f, "%6d", vec->entries[index].data);
27 fprintf(f, " )</span>\n");
30 static void dump_matrix(FILE *f, pbqp_matrix *mat)
34 num *p = mat->entries;
38 fprintf(f, "\t\\begin{pmatrix}\n");
39 for (row = 0; row < mat->rows; ++row) {
40 fprintf(f, "\t %6d", *p++);
41 for (col = 1; col < mat->cols; ++col) {
42 fprintf(f, "& %6d", *p++);
46 fprintf(f, "\t\\end{pmatrix}\n");
49 static void dump_edge_costs(pbqp *pbqp)
54 assert(pbqp->dump_file);
56 fputs("<p>", pbqp->dump_file);
57 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
58 pbqp_node *src_node = get_node(pbqp, src_index);
64 unsigned len = ARR_LEN(src_node->edges);
65 for (edge_index = 0; edge_index < len; ++edge_index) {
66 pbqp_edge *edge = src_node->edges[edge_index];
67 unsigned tgt_index = edge->tgt;
68 if (src_index < tgt_index) {
69 fputs("<tex>\n", pbqp->dump_file);
70 fprintf(pbqp->dump_file, "\t\\overline\n{C}_{%d,%d}=\n",
71 src_index, tgt_index);
72 dump_matrix(pbqp->dump_file, edge->costs);
73 fputs("</tex><br>", pbqp->dump_file);
77 fputs("</p>", pbqp->dump_file);
80 static void dump_node_costs(pbqp *pbqp)
85 assert(pbqp->dump_file);
88 fputs("<p>", pbqp->dump_file);
89 for (index = 0; index < pbqp->num_nodes; ++index) {
90 pbqp_node *node = get_node(pbqp, index);
92 fprintf(pbqp->dump_file, "\tc<sub>%d</sub> = ", index);
93 dump_vector(pbqp->dump_file, node->costs);
94 fputs("<br>\n", pbqp->dump_file);
97 fputs("</p>", pbqp->dump_file);
100 static void dump_section(FILE *f, int level, char *txt)
104 fprintf(f, "<h%d>%s</h%d>\n", level, txt, level);
107 void pbqp_dump_graph(pbqp *pbqp)
112 assert(pbqp->dump_file);
114 fputs("<p>\n<graph>\n\tgraph input {\n", pbqp->dump_file);
115 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
116 pbqp_node *node = get_node(pbqp, src_index);
118 fprintf(pbqp->dump_file, "\t n%d;\n", src_index);
122 for (src_index = 0; src_index < pbqp->num_nodes; ++src_index) {
123 pbqp_node *node = get_node(pbqp, src_index);
128 unsigned len = ARR_LEN(node->edges);
130 for (edge_index = 0; edge_index < len; ++edge_index) {
131 unsigned tgt_index = node->edges[edge_index]->tgt;
133 if (src_index < tgt_index) {
134 fprintf(pbqp->dump_file, "\t n%d -- n%d;\n", src_index,
139 fputs("\t}\n</graph>\n</p>\n", pbqp->dump_file);
142 void pbqp_dump_input(pbqp *pbqp)
145 assert(pbqp->dump_file);
147 dump_section(pbqp->dump_file, 1, "1. PBQP Problem");
148 dump_section(pbqp->dump_file, 2, "1.1 Topology");
149 pbqp_dump_graph(pbqp);
150 dump_section(pbqp->dump_file, 2, "1.2 Cost Vectors");
151 dump_node_costs(pbqp);
152 dump_section(pbqp->dump_file, 2, "1.3 Cost Matrices");
153 dump_edge_costs(pbqp);