Graphviz 14.1.3~dev.20260201.2050
Loading...
Searching...
No Matches
blocks.cpp
Go to the documentation of this file.
1
22#include "config.h"
23
24#include <vpsc/blocks.h>
25#include <vpsc/block.h>
26#include <vpsc/constraint.h>
27#include <fstream>
28using std::ios;
29using std::ofstream;
30using std::set;
31using std::list;
32
33#ifndef RECTANGLE_OVERLAP_LOGGING
34 #define RECTANGLE_OVERLAP_LOGGING 0
35#endif
36
38
39Blocks::Blocks(const int n, Variable *vs_[]) : vs(vs_), nvs(n) {
41 for(int i=0;i<nvs;i++) {
42 insert(new Block(vs[i]));
43 }
44}
46{
48 for (Block *b : *this) {
49 delete b;
50 }
51}
52
57list<Variable*> Blocks::totalOrder() {
58 list<Variable*> order;
59 for(int i=0;i<nvs;i++) {
60 vs[i]->visited=false;
61 }
62 for(int i=0;i<nvs;i++) {
63 if(vs[i]->in.empty()) {
64 dfsVisit(vs[i],order);
65 }
66 }
67 return order;
68}
69// Recursive depth first search giving total order by pushing nodes in the DAG
70// onto the front of the list when we finish searching them
71void Blocks::dfsVisit(Variable *v, list<Variable*> &order) {
72 v->visited=true;
73 for (Constraint *c : v->out) {
74 if(!c->right->visited) {
75 dfsVisit(c->right, order);
76 }
77 }
79 ofstream f(LOGFILE,ios::app);
80 f<<" order="<<*v<<"\n";
81 }
82 order.push_front(v);
83}
90 ofstream f(LOGFILE,ios::app);
91 f<<"mergeLeft called on "<<*r<<"\n";
92 }
96 while (c != nullptr && c->slack()<0) {
98 ofstream f(LOGFILE,ios::app);
99 f<<"mergeLeft on constraint: "<<*c<<"\n";
100 }
102 Block *l = c->left->block;
103 if (l->in.empty()) l->setUpInConstraints();
104 double dist = c->right->offset - c->left->offset - c->gap;
105 if (r->vars.size() < l->vars.size()) {
106 dist=-dist;
107 std::swap(l, r);
108 }
109 blockTimeCtr++;
110 r->merge(l, c, dist);
111 r->mergeIn(l);
113 removeBlock(l);
114 c=r->findMinInConstraint();
115 }
117 ofstream f(LOGFILE,ios::app);
118 f<<"merged "<<*r<<"\n";
119 }
120}
126 ofstream f(LOGFILE,ios::app);
127 f<<"mergeRight called on "<<*l<<"\n";
128 }
131 while (c != nullptr && c->slack()<0) {
133 ofstream f(LOGFILE,ios::app);
134 f<<"mergeRight on constraint: "<<*c<<"\n";
135 }
137 Block *r = c->right->block;
139 double dist = c->left->offset + c->gap - c->right->offset;
140 if (l->vars.size() > r->vars.size()) {
141 dist=-dist;
142 std::swap(l, r);
143 }
144 l->merge(r, c, dist);
145 l->mergeOut(r);
146 removeBlock(r);
148 }
150 ofstream f(LOGFILE,ios::app);
151 f<<"merged "<<*l<<"\n";
152 }
153}
154void Blocks::removeBlock(Block *doomed) {
155 doomed->deleted=true;
156 //erase(doomed);
157}
159 for (auto i = begin(); i != end();) {
160 Block *b=*i;
161 if(b->deleted) {
162 i = erase(i);
163 delete b;
164 } else {
165 ++i;
166 }
167 }
168}
173void Blocks::split(Block *b, Block *&l, Block *&r, Constraint *c) {
174 b->split(l,r,c);
176 ofstream f(LOGFILE,ios::app);
177 f<<"Split left: "<<*l<<"\n";
178 f<<"Split right: "<<*r<<"\n";
179 }
180 r->posn = b->posn;
181 r->wposn = r->posn * r->weight;
182 mergeLeft(l);
183 // r may have been merged!
184 r = c->right->block;
186 r->posn = r->wposn / r->weight;
187 mergeRight(r);
188 removeBlock(b);
189
190 insert(l);
191 insert(r);
192}
197double Blocks::cost() {
198 double c = 0;
199 for (Block *b : *this) {
200 c += b->cost();
201 }
202 return c;
203}
static void out(agerrlevel_t level, const char *fmt, va_list args)
Report messages using a user-supplied or default write function.
Definition agerror.c:86
#define RECTANGLE_OVERLAP_LOGGING
Definition block.cpp:35
long blockTimeCtr
Definition blocks.cpp:37
long blockTimeCtr
Definition blocks.cpp:37
#define LOGFILE
A block structure defined over the variables.
Definition blocks.h:24
Definition block.h:28
bool deleted
Definition block.h:53
Constraint * findMinInConstraint()
Definition block.cpp:180
std::vector< Variable * > vars
Definition block.h:31
void split(Block *&l, Block *&r, Constraint *c)
Definition block.cpp:398
double posn
Definition block.h:32
void deleteMinOutConstraint()
Definition block.cpp:242
void mergeIn(Block *b)
Definition block.cpp:165
void mergeOut(Block *b)
Definition block.cpp:175
std::vector< Constraint * > in
Definition block.h:55
void setUpOutConstraints()
Definition block.cpp:105
double wposn
Definition block.h:34
void setUpInConstraints()
Definition block.cpp:102
double desiredWeightedPosition()
Definition block.cpp:95
double weight
Definition block.h:33
Constraint * findMinOutConstraint()
Definition block.cpp:229
void merge(Block *b, Constraint *c, double dist)
Definition block.cpp:148
void deleteMinInConstraint()
Definition block.cpp:239
long timeStamp
Definition block.h:54
void cleanup()
Definition blocks.cpp:158
double cost()
Definition blocks.cpp:197
void split(Block *b, Block *&l, Block *&r, Constraint *c)
Definition blocks.cpp:173
std::list< Variable * > totalOrder()
Definition blocks.cpp:57
~Blocks()
Definition blocks.cpp:45
Blocks(const int n, Variable *vs[])
Definition blocks.cpp:39
void mergeRight(Block *l)
Definition blocks.cpp:124
void mergeLeft(Block *r)
Definition blocks.cpp:88
static void insert(PairHeap *h, Pair edge)
Definition closest.c:134
static int in(Extype_t lhs, Exid_t *rhs, Exdisc_t *disc)
Definition compile.c:1632
static double dist(int dim, double *x, double *y)
A constraint determines a minimum or exact spacing required between two variables.
Definition constraint.h:25
Variable * right
Definition constraint.h:29
double gap
Definition constraint.h:30
Variable * left
Definition constraint.h:28
double slack() const
Definition constraint.h:34
Block * block
Definition variable.h:33
double offset
Definition variable.h:32
bool visited
Definition variable.h:34