summaryrefslogtreecommitdiffstats
path: root/src/libvpsc/solve_VPSC.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libvpsc/solve_VPSC.h')
-rw-r--r--src/libvpsc/solve_VPSC.h81
1 files changed, 68 insertions, 13 deletions
diff --git a/src/libvpsc/solve_VPSC.h b/src/libvpsc/solve_VPSC.h
index 0f919a22a..e416ef9c6 100644
--- a/src/libvpsc/solve_VPSC.h
+++ b/src/libvpsc/solve_VPSC.h
@@ -1,7 +1,9 @@
/**
- * \brief Solve an instance of the "Variable Placement with Separation
+ * @file
+ * Solve an instance of the "Variable Placement with Separation
* Constraints" problem.
- *
+ */
+/*
* Authors:
* Tim Dwyer <tgdwyer@gmail.com>
*
@@ -32,8 +34,26 @@ class Blocks;
*/
class Solver {
public:
- virtual void satisfy();
- virtual void solve();
+
+ /**
+ * Produces a feasible - though not necessarily optimal - solution by
+ * examining blocks in the partial order defined by the directed acyclic
+ * graph of constraints. For each block (when processing left to right) we
+ * maintain the invariant that all constraints to the left of the block
+ * (incoming constraints) are satisfied. This is done by repeatedly merging
+ * blocks into bigger blocks across violated constraints (most violated
+ * first) fixing the position of variables inside blocks relative to one
+ * another so that constraints internal to the block are satisfied.
+ */
+ virtual void satisfy();
+
+ /**
+ * Calculate the optimal solution. After using satisfy() to produce a
+ * feasible solution, refine() examines each block to see if further
+ * refinement is possible by splitting the block. This is done repeatedly
+ * until no further improvement is possible.
+ */
+ virtual void solve();
Solver(const unsigned n, Variable* const vs[], const unsigned m, Constraint *cs[]);
virtual ~Solver();
@@ -54,16 +74,51 @@ private:
class IncSolver : public Solver {
public:
- unsigned splitCnt;
- void satisfy();
- void solve();
- void moveBlocks();
- void splitBlocks();
- IncSolver(const unsigned n, Variable* const vs[], const unsigned m, Constraint *cs[]);
+ unsigned splitCnt;
+
+ /**
+ * incremental version of satisfy that allows refinement after blocks are
+ * moved.
+ *
+ * - move blocks to new positions
+ * - repeatedly merge across most violated constraint until no more
+ * violated constraints exist
+ *
+ * Note: there is a special case to handle when the most violated constraint
+ * is between two variables in the same block. Then, we must split the block
+ * over an active constraint between the two variables. We choose the
+ * constraint with the most negative lagrangian multiplier.
+ */
+ void satisfy();
+
+ void solve();
+
+ void moveBlocks();
+
+ void splitBlocks();
+
+ IncSolver(const unsigned n, Variable* const vs[], const unsigned m, Constraint *cs[]);
private:
- typedef std::vector<Constraint*> ConstraintList;
- ConstraintList inactive;
- Constraint* mostViolated(ConstraintList &l);
+
+ typedef std::vector<Constraint*> ConstraintList;
+
+ ConstraintList inactive;
+
+ /**
+ * Scan constraint list for the most violated constraint, or the first equality
+ * constraint.
+ */
+ Constraint* mostViolated(ConstraintList &l);
};
}
#endif // SEEN_REMOVEOVERLAP_SOLVE_VPSC_H
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :