43#ifdef OGDF_SYSTEM_UNIX
47#ifdef OGDF_FME_KERNEL_USE_SSE
52namespace fast_multipole_embedder {
63#ifndef OGDF_SSE3_EXTENSIONS
65# undef OGDF_FME_KERNEL_USE_SSE
66# undef OGDF_FME_KERNEL_USE_SSE_DIRECT
71#ifdef OGDF_FME_KERNEL_USE_SSE
72 std::cout <<
"OGDF_FME_KERNEL_USE_SSE" << std::endl;
74#ifdef OGDF_FME_PARALLEL_QUADTREE_SORT
75 std::cout <<
"OGDF_FME_PARALLEL_QUADTREE_SORT" << std::endl;
77#ifdef OGDF_FME_KERNEL_USE_SSE_DIRECT
78 std::cout <<
"OGDF_FME_KERNEL_USE_SSE_DIRECT" << std::endl;
87 return !(((size_t)(
void*)ptr) & 0x0F);
92 return (T*)(((size_t)((
void*)t)) & ~0x0F);
97 return (T*)((((size_t)((
void*)t)) + 15) & ~0x0F);
100#ifdef OGDF_SYSTEM_UNIX
101inline timeval GetDiffTime(timeval _then,
double& dtime) {
102 timeval then = (timeval)_then;
104 gettimeofday(&now,
nullptr);
107 diff.tv_sec = now.tv_sec - then.tv_sec;
108 diff.tv_usec = now.tv_usec - then.tv_usec;
109 while (diff.tv_usec < 0) {
111 diff.tv_usec = 1000000 + now.tv_usec - then.tv_usec;
114 dtime = (double)diff.tv_sec;
115 dtime += (double)diff.tv_usec / 1e6;
122 std::cout << t <<
"s\t" << text << std::endl;
126 std::cout << t <<
"s\t" << text <<
"\t" << (t /
sum) * 100.0 <<
"%" << std::endl;
130#define OGDF_MALLOC_16(s) System::alignedMemoryAlloc16((s))
133#define OGDF_FREE_16(ptr) System::alignedMemoryFree((ptr))
136template<
typename MNR_T,
typename C_T>
141 const unsigned int BIT_LENGTH =
static_cast<unsigned int>(
sizeof(MNR_T)) << 3;
146 for (
unsigned int i = (BIT_LENGTH >> 1); i > 0; i = i >> 1) {
148 mask = mask ^ (mask << i);
149 x = (x | (x << i)) & mask;
150 y = (y | (y << i)) & mask;
156template<
typename MNR_T,
typename C_T>
159 unsigned int BIT_LENGTH =
static_cast<unsigned int>(
sizeof(C_T)) << 3;
164 for (
unsigned int i = 0; i < BIT_LENGTH; i++) {
165 x = (C_T)(x | (mnr & mask));
167 y = (C_T)(y | (mnr & mask));
175 uint32_t BIT_LENGTH =
static_cast<uint32_t
>(
sizeof(T)) << 3;
177 mask = mask << (BIT_LENGTH - 1);
178 for (uint32_t i = 0; i < BIT_LENGTH; i++) {
190 return 0x1 << (msb - 1);
262 topRow[0] = G.newNode();
263 for (
int j = 1; j < m; j++) {
264 topRow[j] = G.newNode();
265 G.newEdge(topRow[j - 1], topRow[j]);
267 for (
int i = 1; i < n; i++) {
269 G.newEdge(topRow[0], v);
271 for (
int j = 1; j < m; j++) {
273 G.newEdge(topRow[j - 1], v);
274 G.newEdge(topRow[j], v);
283 int numberOfNodesToDelete = (int)((
double)G.numberOfNodes() * missinNodesPercentage);
286 for (
int i = 0; i < numberOfNodesToDelete; i++) {
306 for (i = 0; i <=
m_max_n; i++) {
311 for (i = 0; i <=
m_max_n; i++) {
315 for (i = 2; i <=
m_max_n; i++) {
316 for (j = 1; j < i; j++) {
325 for (i = 0; i <=
m_max_n; i++) {
352 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
353 ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7, ArgType8 _arg8)
380template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
381 typename ArgType4,
typename ArgType5,
typename ArgType6,
typename ArgType7>
382struct FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6,
384 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
385 ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7)
410template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
411 typename ArgType4,
typename ArgType5,
typename ArgType6>
412struct FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6,
414 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
415 ArgType5 _arg5, ArgType6 _arg6)
432template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
433 typename ArgType4,
typename ArgType5>
436 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
453template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
typename ArgType4>
456 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4)
471template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3>
474 FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3)
488template<
typename FunctionType,
typename ArgType1,
typename ArgType2>
504template<
typename FunctionType,
typename ArgType1>
518template<
typename FunctionType>
528template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
529 typename ArgType4,
typename ArgType5,
typename ArgType6,
typename ArgType7,
typename ArgType8>
531createFuncInvoker(FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
532 ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7, ArgType8 _arg8) {
533 return FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6,
534 ArgType7, ArgType8>(func, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8);
537template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
538 typename ArgType4,
typename ArgType5,
typename ArgType6,
typename ArgType7,
typename ArgType8>
539FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6, ArgType7, ArgType8>
540createFuncInvoker(FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
541 ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7) {
542 return FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6,
543 ArgType7,
EmptyArgType>(func, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7);
546template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
547 typename ArgType4,
typename ArgType5,
typename ArgType6>
548FuncInvoker<FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6>
549createFuncInvoker(FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
550 ArgType5 _arg5, ArgType6 _arg6) {
552 func, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6);
555template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
556 typename ArgType4,
typename ArgType5>
558 FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4,
561 _arg2, _arg3, _arg4, _arg5);
564template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3,
typename ArgType4>
566 FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4) {
571template<
typename FunctionType,
typename ArgType1,
typename ArgType2,
typename ArgType3>
573 ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3) {
577template<
typename FunctionType,
typename ArgType1,
typename ArgType2>
583template<
typename FunctionType,
typename ArgType1>
588template<
typename FunctionType>
Includes declaration of graph class.
Decralation of GraphElement and GraphList classes.
Decalration of System class which provides unified access to system information.
Basic declarations, included by all source files.
Data type for general directed graphs (adjacency list representation).
int numberOfNodes() const
Returns the number of nodes in the graph.
internal::GraphObjectContainer< NodeElement > nodes
The container containing all node objects.
Class for the representation of nodes.
binomial coeffs from Hachuls FMMM
void free_array()
Free space for BK.
TYP ** m_binCoeffs
holds the binominal coefficients
void init_array()
Init BK -matrix for values n, k in 0 to t.
TYP value(unsigned int n, unsigned int k) const
utility class to select multiple nodes randomly
int nodesLeft() const
number of nodes available
node chooseNode() const
chooses a node from the available nodes in O(1)
int m_numNodes
total num nodes
NodeArray< int > m_nodeIndex
the index in the array of the nodes
void removeNode(node v)
removes a node from available nodes (assumes v is available) in O(1)
int m_numNodesChoosen
num available nodes
RandomNodeSet(const Graph &G)
init the random node set with the given graph. takes O(n)
~RandomNodeSet()
destructor
const Graph & m_graph
the graph
bool isAvailable(node v) const
node * m_array
the set of all nodes (at the end the available nodes)
RegisteredArray for nodes, edges and adjEntries of a graph.
int randomNumber(int low, int high)
Returns random integer between low and high (including).
Include of header files for SSE-intrinsics.
void randomGridGraph(Graph &G, int n, int m, double missinNodesPercentage=0.03)
uint32_t prevPowerOfTwo(uint32_t n)
returns the prev power of two
void gridGraph(Graph &G, int n, int m)
FuncInvoker< FunctionType, ArgType1, ArgType2, ArgType3, ArgType4, ArgType5, ArgType6, ArgType7, ArgType8 > createFuncInvoker(FunctionType func, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4, ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7, ArgType8 _arg8)
T * align_16_prev_ptr(T *t)
void printProfiledTime(double t, const char *text)
MNR_T mortonNumber(C_T ix, C_T iy)
common template for bit-interleaving to compute the morton number assumes sizeOf(MNR_T) = 2*sizeOf(C_...
void mortonNumberInv(MNR_T mnr, C_T &x, C_T &y)
common template for extracting the coordinates from a morton number assumes sizeOf(MNR_T) = 2*sizeOf(...
uint32_t mostSignificantBit(T n)
returns the index of the most signficant bit set. 0 = most signif, bitlength-1 = least signif
T * align_16_next_ptr(T *t)
void OGDF_FME_Print_Config()
The namespace for all OGDF objects.
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4, ArgType5 _arg5)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2)
FuncInvoker(FunctionType f, ArgType1 _arg1)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4, ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4, ArgType5 _arg5, ArgType6 _arg6)
FuncInvoker(FunctionType f)
FuncInvoker(FunctionType f, ArgType1 _arg1, ArgType2 _arg2, ArgType3 _arg3, ArgType4 _arg4, ArgType5 _arg5, ArgType6 _arg6, ArgType7 _arg7, ArgType8 _arg8)