summaryrefslogtreecommitdiffstats
path: root/src/removeoverlap/constraint.h
blob: 26afcefdd8adfba95765a787d7a6421c0fe3431a (plain)
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
/**
 * \brief Remove overlaps function
 *
 * Authors:
 *   Tim Dwyer <tgdwyer@gmail.com>
 *
 * Copyright (C) 2005 Authors
 *
 * Released under GNU GPL.  Read the file 'COPYING' for more information.
 */

#ifndef SEEN_REMOVEOVERLAP_CONSTRAINT_H
#define SEEN_REMOVEOVERLAP_CONSTRAINT_H

#include <iostream>
#include "variable.h"

class Constraint
{
	friend std::ostream& operator <<(std::ostream &os,const Constraint &c);
public:
	Variable *left;
	Variable *right;
	double gap;
	double lm;
	Constraint(Variable *left, Variable *right, double gap);
	~Constraint(void){};
	inline double Constraint::slack() const { return right->position() - gap - left->position(); }
	//inline bool operator<(Constraint const &o) const { return slack() < o.slack(); }
	long timeStamp;
	bool active;
	bool visited;
};
#include <float.h>
static inline bool compareConstraints(Constraint *&l, Constraint *&r) {
	double sl = l->slack();
	double sr = r->slack();
	if(l->left->block==l->right->block) sl=DBL_MIN;
	if(r->left->block==r->right->block) sr=DBL_MIN;
	if(sl==sr) {
		// arbitrary choice based on id
		if(l->left->id==r->left->id) {
			if(l->right->id<r->right->id) return true;
			return false;
		}
		if(l->left->id<r->left->id) return true;
		return false;
	}
	return sl < sr;
}

#endif // SEEN_REMOVEOVERLAP_CONSTRAINT_H