/** * \brief A block is a group of variables that must be moved together to improve * the goal function without violating already active constraints. * The variables in a block are spanned by a tree of active constraints. * * Authors: * Tim Dwyer * * Copyright (C) 2005 Authors * * This version is released under the CPL (Common Public License) with * the Graphviz distribution. * A version is also available under the LGPL as part of the Adaptagrams * project: https://github.com/mjwybrow/adaptagrams. * If you make improvements or bug fixes to this code it would be much * appreciated if you could also contribute those changes back to the * Adaptagrams repository. */ #pragma once #include #include struct Variable; struct Constraint; class Block { friend std::ostream& operator <<(std::ostream &os,const Block &b); public: std::vector vars; double posn; double weight; double wposn; Block(Variable *v=nullptr); Block(const Block &) = delete; Constraint* findMinLM(); Constraint* findMinLMBetween(Variable* lv, Variable* rv); Constraint* findMinInConstraint(); Constraint* findMinOutConstraint(); void deleteMinInConstraint(); void deleteMinOutConstraint(); double desiredWeightedPosition(); void merge(Block *b, Constraint *c, double dist); void merge(Block *b, Constraint *c); void mergeIn(Block *b); void mergeOut(Block *b); void split(Block *&l, Block *&r, Constraint *c); Constraint* splitBetween(Variable* vl, Variable* vr, Block* &lb, Block* &rb); void setUpInConstraints(); void setUpOutConstraints(); double cost(); bool deleted; long timeStamp; std::vector in; std::vector out; private: typedef enum {NONE, LEFT, RIGHT} Direction; typedef std::pair Pair; void reset_active_lm(Variable *v, Variable *u); double compute_dfdv(Variable *v, Variable *u, Constraint *&min_lm); Pair compute_dfdv_between( Variable*, Variable*, Variable*, Direction, bool); bool canFollowLeft(const Constraint *c, const Variable *last); bool canFollowRight(const Constraint *c, const Variable *last); void populateSplitBlock(Block *b, Variable *v, Variable *u); void addVariable(Variable *v); std::vector setUpConstraintHeap(bool use_in); };