File: block.h

package info (click to toggle)
tulip 4.8.0dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 179,264 kB
  • ctags: 64,517
  • sloc: cpp: 600,444; ansic: 36,311; makefile: 22,136; python: 1,304; sh: 946; yacc: 522; xml: 337; pascal: 157; php: 66; lex: 55
file content (75 lines) | stat: -rw-r--r-- 2,455 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
 * \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 <tgdwyer@gmail.com>
 *
 * Copyright (C) 2005 Authors
 *
 * Released under GNU LGPL.  Read the file 'COPYING' for more information.
 */

#ifndef SEEN_REMOVEOVERLAP_BLOCK_H
#define SEEN_REMOVEOVERLAP_BLOCK_H

#include <vector>
#include <iostream>
template <class T> class PairingHeap;
namespace vpsc {
class Variable;
class Constraint;

class Block {
  typedef std::vector<Variable*> Variables;
  typedef std::vector<Constraint*>::iterator Cit;
  typedef std::vector<Variable*>::iterator Vit;

  friend std::ostream& operator <<(std::ostream &os,const Block &b);
public:
  Variables *vars;
  double posn;
  double weight;
  double wposn;
  Block(Variable* const v=NULL);
  ~Block(void);
  Constraint* findMinLM();
  Constraint* findMinLMBetween(Variable* const lv, Variable* const 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;
  PairingHeap<Constraint*> *in;
  PairingHeap<Constraint*> *out;
  bool isActiveDirectedPathBetween(Variable* u, Variable *v);
private:
  typedef enum {NONE, LEFT, RIGHT} Direction;
  typedef std::pair<double, Constraint*> Pair;
  void reset_active_lm(Variable* const v, Variable* const u);
  double compute_dfdv(Variable* const v, Variable* const u,
                      Constraint *&min_lm);
  Pair compute_dfdv_between(
    Variable*, Variable* const, Variable* const,
    const Direction, bool);
  bool canFollowLeft(Constraint *c, const Variable* const last);
  bool canFollowRight(Constraint *c, const Variable* const last);
  void populateSplitBlock(Block *b, Variable* const v, Variable* const u);
  void addVariable(Variable* const v);
  void setUpConstraintHeap(PairingHeap<Constraint*>* &h,bool in);
};

}
#endif // SEEN_REMOVEOVERLAP_BLOCK_H