File: EnergyFunction.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 (131 lines) | stat: -rw-r--r-- 4,258 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 * $Revision: 2641 $
 *
 * last checkin:
 *   $Author: gutwenger $
 *   $Date: 2012-07-19 15:21:36 +0200 (Thu, 19 Jul 2012) $
 ***************************************************************/

/** \file
 * \brief Declares class EnergyFunction...
 *
 * ...which specifies an interface for energy functions for
 * the Davidson Harel graph drawing method. It is used in the
 * class DavidsonHarel.
 *
 * \author Rene Weiskircher
 *
 * \par License:
 * This file is part of the Open Graph Drawing Framework (OGDF).
 *
 * \par
 * Copyright (C)<br>
 * See README.txt in the root directory of the OGDF installation for details.
 *
 * \par
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * Version 2 or 3 as published by the Free Software Foundation;
 * see the file LICENSE.txt included in the packaging of this file
 * for details.
 *
 * \par
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * \par
 * You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 * \see  http://www.gnu.org/copyleft/gpl.html
 ***************************************************************/

#ifdef _MSC_VER
#pragma once
#endif

#ifndef OGDF_ENERGY_FUNCTION_H
#define OGDF_ENERGY_FUNCTION_H


#include <ogdf/basic/GraphAttributes.h>


namespace ogdf {

//! The interface for energy functions for the Davidson Harel graph drawing method.
/**
 * It is used in the class DavidsonHarel.
 */
class EnergyFunction
{
public:
	//! Initializes data dtructures to speed up later computations
	EnergyFunction(const string &funcname, GraphAttributes &AG);

	virtual ~EnergyFunction() { }

	//! computes energy for the layout at the beginning of the optimization process
	virtual void computeEnergy() = 0;

	//! sets m_testNode, m_testX and m_testY and computes the energy for the new configuration (vertex v moves to newPos)
	double computeCandidateEnergy(
		const node v,
		const DPoint &newPos);

	//! prints the name of the energy function
	string getName() const { return m_name; }

	//! Changes m_currentX and m_currentY by setting the position of m_testNode to m_testX and m_testY. Sets m_energy to m_candidateEnergy. Computes the energy of the layout stored in AG.
	void candidateTaken();

#ifdef OGDF_DEBUG
	//! prints status information for debugging
	void printStatus() const;
#endif

	double energy() const { return m_energy; }

protected:
	const Graph &m_G; //!< the graph that should be drawn
	const string m_name; //!< name of the energy function
	double m_candidateEnergy; //!< the energy of the layout if the candidate layout is chosen
	double m_energy; //!< energy of the current layout

	//! returns candidate position for the node to be moved
	DPoint testPos() { return m_testPos; }

	//! returns the current position of vertex v
	DPoint currentPos(const node v) const { return DPoint(m_AG.x(v),m_AG.y(v)); }

	//! returns the vertex that is under consideration in the current step
	node testNode() const { return m_testNode; }

	//! changes the data of a specific energy function if the candidate was taken
	virtual void internalCandidateTaken() = 0;

	//! computes the energy if m_testNode changes position to m_testX and m_testY, sets the value of m_candidateEnergy.
	virtual void compCandEnergy() = 0;

#ifdef OGDF_DEBUG
	virtual void printInternalData() const = 0;
#endif

private:
	//! the copy constructor is fake and can not be used.
	EnergyFunction(const EnergyFunction &e) : m_G(e.m_G), m_name(e.m_name), m_AG(e.m_AG) { }

	//! the assignment operator is fake and can not be used.
	EnergyFunction& operator=(const EnergyFunction &e);

	GraphAttributes& m_AG;	//!< This stores the graph with its graphical attributes and the current positions for the vertices
	node m_testNode; //!< The node that changed position in the candidate
	DPoint m_testPos; //!< New candidate positions for m_testNode
};

}// end namespace
#endif