File: Set.h

package info (click to toggle)
bandage 0.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 15,684 kB
  • sloc: cpp: 45,359; sh: 491; makefile: 12
file content (131 lines) | stat: -rw-r--r-- 4,045 bytes parent folder | download | duplicates (3)
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: 2559 $
 *
 * last checkin:
 *   $Author: gutwenger $
 *   $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
 ***************************************************************/

/** \file
 * \brief Declaration of class Set.
 *
 * \author Stefan Hachul
 *
 * \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_SET_H
#define OGDF_SET_H

#include "../basic/List.h"
#include "../basic/Graph.h"
#include "../basic/NodeArray.h"
#include "../internal/energybased/NodeAttributes.h"

namespace ogdf {

	class Set
	{
		//Helping data structure that holds set S_node of nodes in the range [0,
		//G.number_of_nodes()-1] (needed for class Multilevel) for randomly choosing nodes
		//(with uniform or weighted probability!)

	public:

		Set();     //constructor
		~Set();    //destructor

		void set_seed(int rand_seed); //the the random seed to rand_seed


		//---------------------- for set of nodes---------------------------------------

		//Inits S_node[0,...,G.number_of_nodes()-1] and stores the i-th node of P
		//at position S_node[i] and in position_in_node_set for each node its index in
		//S_node.
		void init_node_set(Graph& G);

		//Returns whether S_node is empty or not.
		bool empty_node_set();

		//Returns true if and only if v is deleted from S_node.
		bool is_deleted(node v);

		//Deletes the node v from S_node.
		void delete_node(node v);

		//---------------- for set of nodes with uniform probability -------------------


		//Selects a random element from S_node with uniform probability and updates S_node
		//and position_in_node_set.
		node get_random_node();

		//---------------- for set of nodes with weighted  probability -------------------

		//Same as init_node_set(G), but additionally the array mass_of_star is caculated.
		void init_node_set(Graph& G,NodeArray<NodeAttributes>& A);

		//---------------- for set of nodes with ``lower mass'' probability --------------

		//Gets rand_tries random elements from S_node and selects the one with the lowest
		//mass_of_star and updates S_node and position_in_node_set.
		node get_random_node_with_lowest_star_mass(int rand_tries);

		//---------------- for set of nodes with ``higher mass'' probability --------------

		//Gets rand_tries random elements from S_node and selects the one with the highest
		//mass_of_star and updates S_node and position_in_node_set.
		node get_random_node_with_highest_star_mass(int rand_tries);

	private:

		bool using_S_node; //indicates weather S_item, or S_node is used

		node* S_node;       //representation of the node set S_node[0,G.number_of_nodes()-1]
		int last_selectable_index_of_S_node;//index of the last randomly choosable element
		//in S_node (this value is decreased after each
		//select operation)
		NodeArray<int> position_in_node_set;//holds for each node of G the index of its
		//position in S_node
		NodeArray<int> mass_of_star; //the sum of the masses of a node and its neighbours

	};

}//namespace ogdf
#endif