Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

FMEFunc.h
Go to the documentation of this file.
1 
32 #pragma once
33 
40 
41 #include <list>
42 
43 namespace ogdf {
44 namespace fast_multipole_embedder {
45 
46 
49  std::list<LinearQuadtree::NodeID> nodes;
50  uint32_t pointCount;
51 
52  template<typename Func>
53  void for_loop(Func& func) {
54  for (LinearQuadtree::NodeID id : nodes) {
55  func(id);
56  }
57  }
58 };
59 
61  uint32_t begin;
62  uint32_t numNodes;
63 };
64 
70 
71  float timeStep;
75  float normNodeSize;
76  uint32_t maxNumIterations;
77  uint32_t minNumIterations;
78 
81 
82  double stopCritForce;
84  double stopCritConstSq;
85 
87 };
88 
89 
91 struct FMELocalContext;
92 
96  uint32_t numThreads;
101  float* globalForceX;
102  float* globalForceY;
104  bool earlyExit;
105  float scaleFactor;
106  float coolDown;
107  float min_x;
108  float max_x;
109  float min_y;
110  float max_y;
112 };
113 
117  float* forceX;
118  float* forceY;
119  double maxForceSq;
120  double avgForce;
121  float min_x;
122  float max_x;
123  float min_y;
124  float max_y;
129 
132  uint32_t numInnerNodes;
133 
136  uint32_t numLeaves;
137 };
138 
141  return min_max_functor<float>(pLocalContext->pGlobalContext->pGraph->nodeXPos(),
142  pLocalContext->min_x, pLocalContext->max_x);
143 }
144 
147  return min_max_functor<float>(pLocalContext->pGlobalContext->pGraph->nodeYPos(),
148  pLocalContext->min_y, pLocalContext->max_y);
149 }
150 
152 public:
153  inline LQMortonFunctor(FMELocalContext* pLocalContext) {
154  x = pLocalContext->pGlobalContext->pGraph->nodeXPos();
155  y = pLocalContext->pGlobalContext->pGraph->nodeYPos();
156  s = pLocalContext->pGlobalContext->pGraph->nodeSize();
157  quadtree = pLocalContext->pGlobalContext->pQuadtree;
158  translate_x = -quadtree->minX();
159  translate_y = -quadtree->minY();
160  scale = quadtree->scaleInv();
161  }
162 
163  inline uint32_t operator()(void) const { return quadtree->numberOfPoints(); }
164 
165  inline void operator()(uint32_t i) {
167  uint32_t ref = p.ref;
168  p.mortonNr = mortonNumber<uint64_t, uint32_t>((uint32_t)((x[ref] + translate_x) * scale),
169  (uint32_t)((y[ref] + translate_y) * scale));
170  }
171 
172  inline void operator()(uint32_t begin, uint32_t end) {
173  for (uint32_t i = begin; i <= end; i++) {
174  this->operator()(i);
175  }
176  }
177 
178 private:
180  float translate_x;
181  float translate_y;
182  double scale;
183  float* x;
184  float* y;
185  float* s;
186 };
187 
189 struct p2m_functor {
192 
194 
195  inline void operator()(LinearQuadtree::NodeID nodeIndex) {
196  uint32_t numPointsInLeaf = tree.numberOfPoints(nodeIndex);
197  uint32_t firstPointOfLeaf = tree.firstPoint(nodeIndex);
198  for (uint32_t pointIndex = firstPointOfLeaf;
199  pointIndex < (firstPointOfLeaf + numPointsInLeaf); pointIndex++) {
200  expansions.P2M(pointIndex, nodeIndex);
201  }
202  }
203 };
204 
206 static inline p2m_functor p2m_function(FMELocalContext* pLocalContext) {
207  return p2m_functor(*pLocalContext->pGlobalContext->pQuadtree,
208  *pLocalContext->pGlobalContext->pExpansion);
209 }
210 
212 struct m2m_functor {
215 
217 
219  expansions.M2M(child, parent);
220  }
221 
222  inline void operator()(LinearQuadtree::NodeID nodeIndex) {
223  tree.forall_children(pair_call(*this, nodeIndex))(nodeIndex);
224  }
225 };
226 
228 static inline m2m_functor m2m_function(FMELocalContext* pLocalContext) {
229  return m2m_functor(*pLocalContext->pGlobalContext->pQuadtree,
230  *pLocalContext->pGlobalContext->pExpansion);
231 }
232 
234 struct m2l_functor {
236 
238 
239  inline void operator()(LinearQuadtree::NodeID nodeIndexSource,
240  LinearQuadtree::NodeID nodeIndexReceiver) {
241  expansions.M2L(nodeIndexSource, nodeIndexReceiver);
242  }
243 };
244 
246 static inline m2l_functor m2l_function(FMELocalContext* pLocalContext) {
247  return m2l_functor(*pLocalContext->pGlobalContext->pExpansion);
248 }
249 
251 struct l2l_functor {
254 
256 
258  expansions.L2L(parent, child);
259  }
260 
261  inline void operator()(LinearQuadtree::NodeID nodeIndex) {
262  tree.forall_children(pair_call(*this, nodeIndex))(nodeIndex);
263  }
264 };
265 
267 static inline l2l_functor l2l_function(FMELocalContext* pLocalContext) {
268  return l2l_functor(*pLocalContext->pGlobalContext->pQuadtree,
269  *pLocalContext->pGlobalContext->pExpansion);
270 }
271 
273 struct l2p_functor {
276  float* fx;
277  float* fy;
278 
279  l2p_functor(const LinearQuadtree& t, LinearQuadtreeExpansion& e, float* x, float* y)
280  : tree(t), expansions(e), fx(x), fy(y) { }
281 
282  inline void operator()(LinearQuadtree::NodeID nodeIndex, LinearQuadtree::PointID pointIndex) {
283  expansions.L2P(nodeIndex, pointIndex, fx[pointIndex], fy[pointIndex]);
284  }
285 
286  inline void operator()(LinearQuadtree::PointID pointIndex) {
287  LinearQuadtree::NodeID nodeIndex = tree.pointLeaf(pointIndex);
288  this->operator()(nodeIndex, pointIndex);
289  }
290 };
291 
293 static inline l2p_functor l2p_function(FMELocalContext* pLocalContext) {
294  return l2p_functor(*pLocalContext->pGlobalContext->pQuadtree,
295  *pLocalContext->pGlobalContext->pExpansion, pLocalContext->forceX, pLocalContext->forceY);
296 }
297 
299 struct p2p_functor {
301  float* fx;
302  float* fy;
303 
304  p2p_functor(const LinearQuadtree& t, float* x, float* y) : tree(t), fx(x), fy(y) { }
305 
306  inline void operator()(LinearQuadtree::NodeID nodeIndexA, LinearQuadtree::NodeID nodeIndexB) {
307  uint32_t offsetA = tree.firstPoint(nodeIndexA);
308  uint32_t offsetB = tree.firstPoint(nodeIndexB);
309  uint32_t numPointsA = tree.numberOfPoints(nodeIndexA);
310  uint32_t numPointsB = tree.numberOfPoints(nodeIndexB);
311  eval_direct_fast(tree.pointX() + offsetA, tree.pointY() + offsetA,
312  tree.pointSize() + offsetA, fx + offsetA, fy + offsetA, numPointsA,
313  tree.pointX() + offsetB, tree.pointY() + offsetB, tree.pointSize() + offsetB,
314  fx + offsetB, fy + offsetB, numPointsB);
315  }
316 
317  inline void operator()(LinearQuadtree::NodeID nodeIndex) {
318  uint32_t offset = tree.firstPoint(nodeIndex);
319  uint32_t numPoints = tree.numberOfPoints(nodeIndex);
320  eval_direct_fast(tree.pointX() + offset, tree.pointY() + offset, tree.pointSize() + offset,
321  fx + offset, fy + offset, numPoints);
322  }
323 };
324 
326 static inline p2p_functor p2p_function(FMELocalContext* pLocalContext) {
327  return p2p_functor(*pLocalContext->pGlobalContext->pQuadtree, pLocalContext->forceX,
328  pLocalContext->forceY);
329 }
330 
333 public:
334  explicit LQPartitioner(FMELocalContext* pLocalContext)
335  : numPointsPerThread(0)
336  , numThreads(pLocalContext->pGlobalContext->numThreads)
337  , currThread(0)
338  , tree(pLocalContext->pGlobalContext->pQuadtree)
339  , localContexts(pLocalContext->pGlobalContext->pLocalContext) { }
340 
342  uint32_t numInnerNodesPerThread = tree->numberOfInnerNodes() / numThreads;
343  if (numInnerNodesPerThread < 25) {
346  for (uint32_t i = 1; i < numThreads; i++) {
348  }
349  } else {
351  currThread = 0;
354  for (uint32_t i = 0; i < tree->numberOfInnerNodes(); i++) {
356  curr = tree->nextNode(curr);
357  if (currThread < numThreads - 1
358  && localContexts[currThread]->innerNodePartition.numNodes
359  >= numInnerNodesPerThread) {
360  currThread++;
363  }
364  }
365  }
366 
367  uint32_t numLeavesPerThread = tree->numberOfLeaves() / numThreads;
368  if (numLeavesPerThread < 25) {
371  for (uint32_t i = 1; i < numThreads; i++) {
373  }
374  } else {
376  currThread = 0;
377  localContexts[0]->leafPartition.begin = curr;
379  for (uint32_t i = 0; i < tree->numberOfLeaves(); i++) {
381  curr = tree->nextNode(curr);
382  if (currThread < numThreads - 1
383  && localContexts[currThread]->leafPartition.numNodes >= numLeavesPerThread) {
384  currThread++;
387  }
388  }
389  }
390  }
391 
392  void partition() {
394  currThread = 0;
396  for (uint32_t i = 0; i < numThreads; i++) {
397  localContexts[i]->treePartition.nodes.clear();
399  }
400  if (numThreads > 1) {
401  newPartition();
402  }
403  }
404 
405  void newPartition(uint32_t nodeID) {
406  uint32_t bound = tree->numberOfPoints() / (numThreads * numThreads);
407 
408  if (tree->isLeaf(nodeID) || tree->numberOfPoints(nodeID) < bound) {
409  l_par.push_back(nodeID);
410  } else {
411  for (uint32_t i = 0; i < tree->numberOfChilds(nodeID); i++) {
412  newPartition(tree->child(nodeID, i));
413  }
414  }
415  }
416 
417  void newPartition() {
418  l_par.clear();
419  newPartition(tree->root());
420  uint32_t bound = (tree->numberOfPoints() / (numThreads))
421  + (tree->numberOfPoints() / (numThreads * numThreads * 2));
422  while (!l_par.empty()) {
424  uint32_t v = l_par.front();
425  if (((partition->pointCount + tree->numberOfPoints(v)) <= bound)
426  || (currThread == numThreads - 1)) {
427  partition->pointCount += tree->numberOfPoints(v);
428  partition->nodes.push_back(v);
429  tree->nodeFence(v);
430  l_par.pop_front();
431  } else {
432  currThread++;
433  }
434  }
435  }
436 
438 
439 private:
441  uint32_t numThreads;
442  uint32_t currThread;
443  std::list<uint32_t> l_par;
446 };
447 
449 public:
450  inline explicit LQPointUpdateFunctor(FMELocalContext* pLocalContext) {
451  x = pLocalContext->pGlobalContext->pGraph->nodeXPos();
452  y = pLocalContext->pGlobalContext->pGraph->nodeYPos();
453  s = pLocalContext->pGlobalContext->pGraph->nodeSize();
454  quadtree = pLocalContext->pGlobalContext->pQuadtree;
455  }
456 
457  inline uint32_t operator()(void) const { return quadtree->numberOfPoints(); }
458 
459  inline void operator()(uint32_t i) {
461  uint32_t ref = p.ref;
462  quadtree->setPoint(i, x[ref], y[ref], s[ref]);
463  }
464 
465  inline void operator()(uint32_t begin, uint32_t end) {
466  for (uint32_t i = begin; i <= end; i++) {
467  this->operator()(i);
468  }
469  }
470 
471 private:
473  float* x;
474  float* y;
475  float* s;
476 };
477 
482 public:
483  inline explicit LQCoordsFunctor(FMELocalContext* pLocalContext) {
484  quadtree = pLocalContext->pGlobalContext->pQuadtree;
485  quadtreeExp = pLocalContext->pGlobalContext->pExpansion;
486  }
487 
488  inline uint32_t operator()(void) const { return quadtree->numberOfNodes(); }
489 
490  inline void operator()(uint32_t i) { quadtree->computeCoords(i); }
491 
492  inline void operator()(uint32_t begin, uint32_t end) {
493  for (uint32_t i = begin; i <= end; i++) {
494  this->operator()(i);
495  }
496  }
497 
498 private:
501 };
502 
507 class M2LFunctor {
508 public:
509  inline explicit M2LFunctor(FMELocalContext* pLocalContext) {
510  quadtree = pLocalContext->pGlobalContext->pQuadtree;
511  quadtreeExp = pLocalContext->pGlobalContext->pExpansion;
512  wspd = pLocalContext->pGlobalContext->pWSPD;
513  }
514 
515  inline uint32_t operator()(void) const { return quadtree->numberOfNodes(); }
516 
517  inline void operator()(uint32_t i) {
518  uint32_t currEntryIndex = wspd->firstPairEntry(i);
519  for (uint32_t k = 0; k < wspd->numWSNodes(i); k++) {
520  uint32_t j = wspd->wsNodeOfPair(currEntryIndex, i);
521  quadtreeExp->M2L(j, i);
522  currEntryIndex = wspd->nextPair(currEntryIndex, i);
523  }
524  }
525 
526  inline void operator()(uint32_t begin, uint32_t end) {
527  for (uint32_t i = begin; i <= end; i++) {
528  this->operator()(i);
529  }
530  }
531 
532 private:
536 };
537 
541 class NDFunctor {
542 public:
543  inline explicit NDFunctor(FMELocalContext* pLocalContext) {
544  quadtree = pLocalContext->pGlobalContext->pQuadtree;
545  quadtreeExp = pLocalContext->pGlobalContext->pExpansion;
546  forceArrayX = pLocalContext->forceX;
547  forceArrayY = pLocalContext->forceY;
548  }
549 
550  inline uint32_t operator()(void) const { return quadtree->numberOfDirectNodes(); }
551 
552  inline void operator()(uint32_t i) {
553  uint32_t nodeI = quadtree->directNode(i);
554  uint32_t offset = quadtree->firstPoint(nodeI);
555  uint32_t numPoints = quadtree->numberOfPoints(nodeI);
556  eval_direct_fast(quadtree->pointX() + offset, quadtree->pointY() + offset,
557  quadtree->pointSize() + offset, forceArrayX + offset, forceArrayY + offset,
558  numPoints);
559  }
560 
561  inline void operator()(uint32_t begin, uint32_t end) {
562  for (uint32_t i = begin; i <= end; i++) {
563  this->operator()(i);
564  }
565  }
566 
567 private:
570  float* forceArrayX;
571  float* forceArrayY;
572 };
573 
577 class D2DFunctor {
578 public:
579  inline explicit D2DFunctor(FMELocalContext* pLocalContext) {
580  quadtree = pLocalContext->pGlobalContext->pQuadtree;
581  quadtreeExp = pLocalContext->pGlobalContext->pExpansion;
582  forceArrayX = pLocalContext->forceX;
583  forceArrayY = pLocalContext->forceY;
584  }
585 
586  inline uint32_t operator()(void) const { return quadtree->numberOfDirectPairs(); }
587 
588  inline void operator()(uint32_t i) {
589  uint32_t nodeA = quadtree->directNodeA(i);
590  uint32_t nodeB = quadtree->directNodeB(i);
591  uint32_t offsetA = quadtree->firstPoint(nodeA);
592  uint32_t offsetB = quadtree->firstPoint(nodeB);
593  uint32_t numPointsA = quadtree->numberOfPoints(nodeA);
594  uint32_t numPointsB = quadtree->numberOfPoints(nodeB);
595  eval_direct_fast(quadtree->pointX() + offsetA, quadtree->pointY() + offsetA,
596  quadtree->pointSize() + offsetA, forceArrayX + offsetA, forceArrayY + offsetA,
597  numPointsA, quadtree->pointX() + offsetB, quadtree->pointY() + offsetB,
598  quadtree->pointSize() + offsetB, forceArrayX + offsetB, forceArrayY + offsetB,
599  numPointsB);
600  }
601 
602  inline void operator()(uint32_t begin, uint32_t end) {
603  for (uint32_t i = begin; i <= end; i++) {
604  this->operator()(i);
605  }
606  }
607 
608 private:
611  float* forceArrayX;
612  float* forceArrayY;
613 };
614 
615 enum class FMEEdgeForce { SubRep = 0x2, DivDegree = 0x8 };
616 
617 inline int operator&(int lhs, FMEEdgeForce rhs) { return lhs & static_cast<int>(rhs); }
618 
619 template<unsigned int FLAGS>
621 public:
622  inline explicit EdgeForceFunctor(FMELocalContext* pLocalContext) {
623  pGraph = pLocalContext->pGlobalContext->pGraph;
624  x = pGraph->nodeXPos();
625  y = pGraph->nodeYPos();
626  edgeInfo = pGraph->edgeInfo();
627  nodeInfo = pGraph->nodeInfo();
629  nodeSize = pGraph->nodeSize();
630  forceArrayX = pLocalContext->forceX;
631  forceArrayY = pLocalContext->forceY;
632  }
633 
634  inline uint32_t operator()(void) const { return pGraph->numEdges(); }
635 
636  inline void operator()(uint32_t i) {
637  const EdgeAdjInfo& e_info = edgeInfo[i];
638  const NodeAdjInfo& a_info = nodeInfo[e_info.a];
639  const NodeAdjInfo& b_info = nodeInfo[e_info.b];
640 
641  float d_x = x[e_info.a] - x[e_info.b];
642  float d_y = y[e_info.a] - y[e_info.b];
643  float d_sq = d_x * d_x + d_y * d_y;
644 
645  float f = (float)(logf(d_sq) * 0.5f - logf(desiredEdgeLength[i]));
646 
647  float fa = f * 0.25f;
648  float fb = f * 0.25f;
649 
650  if (FLAGS & FMEEdgeForce::DivDegree) {
651  fa = (float)(fa / ((float)a_info.degree));
652  fb = (float)(fb / ((float)b_info.degree));
653  }
654 
655  if (FLAGS & FMEEdgeForce::SubRep) {
656  fa += (nodeSize[e_info.b] / d_sq);
657  fb += (nodeSize[e_info.a] / d_sq);
658  }
659  forceArrayX[e_info.a] -= fa * d_x;
660  forceArrayY[e_info.a] -= fa * d_y;
661  forceArrayX[e_info.b] += fb * d_x;
662  forceArrayY[e_info.b] += fb * d_y;
663  }
664 
665  inline void operator()(uint32_t begin, uint32_t end) {
666  for (uint32_t i = begin; i <= end; i++) {
667  this->operator()(i);
668  }
669  }
670 
671 private:
672  float* x;
673  float* y;
676 
679  float* nodeSize;
680  float* forceArrayX;
681  float* forceArrayY;
682 };
683 
684 template<unsigned int FLAGS>
686  return EdgeForceFunctor<FLAGS>(pLocalContext);
687 }
688 
689 
690 enum class FMECollect {
691  NoFactor = 0x00,
692  EdgeFactor = 0x01,
693  RepulsiveFactor = 0x02,
694  EdgeFactorRep = 0x04,
695  Tree2GraphOrder = 0x08,
696  ZeroThreadArray = 0x10
697 };
698 
699 inline int operator&(int lhs, FMECollect rhs) { return lhs & static_cast<int>(rhs); }
700 
701 inline constexpr int operator|(int lhs, FMECollect rhs) { return lhs | static_cast<int>(rhs); }
702 
703 inline constexpr int operator|(FMECollect lhs, FMECollect rhs) {
704  return static_cast<int>(lhs) | static_cast<int>(rhs);
705 }
706 
707 template<unsigned int FLAGS>
709 public:
710  inline explicit CollectForceFunctor(FMELocalContext* pLocalContext) {
711  numContexts = pLocalContext->pGlobalContext->numThreads;
712  globalContext = pLocalContext->pGlobalContext;
713  localContexts = pLocalContext->pGlobalContext->pLocalContext;
716  pGraph = pLocalContext->pGlobalContext->pGraph;
717  if (FLAGS & FMECollect::EdgeFactor) {
718  factor = pLocalContext->pGlobalContext->pOptions->edgeForceFactor;
719  } else if (FLAGS & FMECollect::RepulsiveFactor) {
720  factor = pLocalContext->pGlobalContext->pOptions->repForceFactor;
721  } else if (FLAGS & FMECollect::EdgeFactorRep) {
723  } else {
724  factor = 1.0;
725  }
726  }
727 
728  inline uint32_t operator()(void) const { return pGraph->numNodes(); }
729 
730  inline void operator()(uint32_t i) {
731  float sumX = 0.0f;
732  float sumY = 0.0f;
733  for (uint32_t j = 0; j < numContexts; j++) {
734  float* localArrayX = localContexts[j]->forceX;
735  float* localArrayY = localContexts[j]->forceY;
736  sumX += localArrayX[i];
737  sumY += localArrayY[i];
738  if (FLAGS & FMECollect::ZeroThreadArray) {
739  localArrayX[i] = 0.0f;
740  localArrayY[i] = 0.0f;
741  }
742  }
743 
744  if (FLAGS & FMECollect::Tree2GraphOrder) {
746  }
747  if (FLAGS & FMECollect::RepulsiveFactor && pGraph->nodeInfo(i).degree > 100) {
748  // prevent some evil effects
749  sumX /= (float)pGraph->nodeInfo(i).degree;
750  sumY /= (float)pGraph->nodeInfo(i).degree;
751  }
752  globalArrayX[i] += sumX * factor;
753  globalArrayY[i] += sumY * factor;
754  }
755 
756  inline void operator()(uint32_t begin, uint32_t end) {
757  for (uint32_t i = begin; i <= end; i++) {
758  this->operator()(i);
759  }
760  }
761 
762 private:
766  float* globalArrayX;
767  float* globalArrayY;
768  uint32_t numContexts;
769  float factor;
770 };
771 
772 template<unsigned int FLAGS>
774  return CollectForceFunctor<FLAGS>(pLocalContext);
775 }
776 
777 static constexpr int TIME_STEP_NORMAL = 0x1;
778 static constexpr int TIME_STEP_PREP = 0x2;
779 static constexpr int ZERO_GLOBAL_ARRAY = 0x4;
780 static constexpr int USE_NODE_MOVE_RAD = 0x8;
781 
782 template<unsigned int FLAGS>
784 public:
785 #if 1
786  inline explicit NodeMoveFunctor(FMELocalContext* pLocalContext)
787 #else
788  inline NodeMoveFunctor(FMELocalContext* pLocalContext, float* xCoords, float* yCoords,
789  float ftimeStep, float* globalForceArray)
790  : x(xCoords)
791  , y(yCoords)
792  , timeStep(ftimeStep)
793  , forceArray(globalForceArray) {}
794 #endif
795  {
796  if (FLAGS & TIME_STEP_NORMAL) {
797  timeStep = pLocalContext->pGlobalContext->pOptions->timeStep
798  * pLocalContext->pGlobalContext->coolDown;
799  } else if (FLAGS & TIME_STEP_PREP) {
800  timeStep = pLocalContext->pGlobalContext->pOptions->preProcTimeStep;
801  } else {
802  timeStep = 1.0;
803  }
804  pGraph = pLocalContext->pGlobalContext->pGraph;
805  x = pGraph->nodeXPos();
806  y = pGraph->nodeYPos();
808  forceArrayX = pLocalContext->pGlobalContext->globalForceX;
809  forceArrayY = pLocalContext->pGlobalContext->globalForceY;
810  localContext = pLocalContext;
812  }
813 
814 #if 0
815  inline void operator()(void) const
816  {
817  return pGraph->numNodes();
818  };
819 #endif
820 
821  inline void operator()(uint32_t i) {
822  float d_x = forceArrayX[i] * timeStep;
823  float d_y = forceArrayY[i] * timeStep;
824  double dsq = (d_x * d_x + d_y * d_y);
825  double d = sqrt(dsq);
826 
827  localContext->maxForceSq = max<double>(localContext->maxForceSq, (double)dsq);
828  localContext->avgForce += d;
829  if (d < FLT_MAX) {
830  x[i] += d_x;
831  y[i] += d_y;
832  if (FLAGS & ZERO_GLOBAL_ARRAY) {
833  forceArrayX[i] = 0.0;
834  forceArrayY[i] = 0.0;
835  } else {
836  forceArrayX[i] = d_x;
837  forceArrayY[i] = d_y;
838  }
839  } else {
840  forceArrayX[i] = 0.0;
841  forceArrayY[i] = 0.0;
842  }
843  }
844 
845  inline void operator()(uint32_t begin, uint32_t end) {
846  for (uint32_t i = begin; i <= end; i++) {
847  this->operator()(i);
848  }
849  }
850 
851 private:
852  float timeStep;
853  float* x;
854  float* y;
855  float* forceArrayX;
856  float* forceArrayY;
861 };
862 
863 template<unsigned int FLAGS>
865  return NodeMoveFunctor<FLAGS>(pLocalContext);
866 }
867 
868 template<typename TYP>
869 inline void for_loop_array_set(uint32_t threadNr, uint32_t numThreads, TYP* a, uint32_t n, TYP value) {
870  uint32_t s = n / numThreads;
871  uint32_t o = s * threadNr;
872  if (threadNr == numThreads - 1) {
873  s = s + (n % numThreads);
874  }
875 
876  for (uint32_t i = 0; i < s; i++) {
877  a[o + i] = value;
878  }
879 }
880 
881 }
882 }
ogdf::fast_multipole_embedder::p2p_functor::fx
float * fx
Definition: FMEFunc.h:301
ogdf::fast_multipole_embedder::LinearQuadtree::minX
float minX() const
Definition: LinearQuadtree.h:542
ogdf::fast_multipole_embedder::l2l_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndex)
Definition: FMEFunc.h:261
ogdf
The namespace for all OGDF objects.
Definition: AugmentationModule.h:36
ogdf::fast_multipole_embedder::CollectForceFunctor::localContexts
FMELocalContext ** localContexts
Definition: FMEFunc.h:765
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfNodes
uint32_t numberOfNodes() const
returns the number of nodes in this tree
Definition: LinearQuadtree.h:429
ogdf::fast_multipole_embedder::FMENodeChainPartition::numNodes
uint32_t numNodes
Definition: FMEFunc.h:62
ogdf::fast_multipole_embedder::min_max_y_function
static min_max_functor< float > min_max_y_function(FMELocalContext *pLocalContext)
creates a min max functor for the y coords of the node
Definition: FMEFunc.h:146
ogdf::fast_multipole_embedder::l2p_functor::fy
float * fy
Definition: FMEFunc.h:277
ogdf::fast_multipole_embedder::LQPartitioner::newPartition
void newPartition()
Definition: FMEFunc.h:417
ogdf::fast_multipole_embedder::LinearQuadtree::NodeID
unsigned int NodeID
Definition: LinearQuadtree.h:52
ogdf::fast_multipole_embedder::EdgeForceFunctor::nodeInfo
NodeAdjInfo * nodeInfo
Definition: FMEFunc.h:675
ogdf::fast_multipole_embedder::LQMortonFunctor::s
float * s
Definition: FMEFunc.h:185
ogdf::fast_multipole_embedder::FMEGlobalOptions::edgeForceFactor
float edgeForceFactor
edge force factor for the main step
Definition: FMEFunc.h:72
ogdf::fast_multipole_embedder::FMEGlobalContext::pOptions
FMEGlobalOptions * pOptions
pointer to the global options
Definition: FMEFunc.h:103
ogdf::fast_multipole_embedder::EdgeForceFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:634
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfDirectNodes
uint32_t numberOfDirectNodes() const
Definition: LinearQuadtree.h:530
ogdf::fast_multipole_embedder::FMEGlobalContext::pExpansion
LinearQuadtreeExpansion * pExpansion
pointer to the coeefficients
Definition: FMEFunc.h:99
ogdf::fast_multipole_embedder::operator&
int operator&(int lhs, FMEEdgeForce rhs)
Definition: FMEFunc.h:617
ogdf::fast_multipole_embedder::D2DFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:609
ogdf::fast_multipole_embedder::m2l_functor::expansions
LinearQuadtreeExpansion & expansions
Definition: FMEFunc.h:235
ogdf::fast_multipole_embedder::FMEGlobalOptions::stopCritForce
double stopCritForce
stopping criteria
Definition: FMEFunc.h:82
LinearQuadtree.h
Declaration of class LinearQuadtree.
ogdf::fast_multipole_embedder::FMELocalContext::maxForceSq
double maxForceSq
local maximum force
Definition: FMEFunc.h:119
ogdf::fast_multipole_embedder::p2p_function
static p2p_functor p2p_function(FMELocalContext *pLocalContext)
creates Local-to-Point functor
Definition: FMEFunc.h:326
ogdf::fast_multipole_embedder::NDFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:552
ogdf::fast_multipole_embedder::EdgeForceFunctor::forceArrayY
float * forceArrayY
Definition: FMEFunc.h:681
ogdf::fast_multipole_embedder::FMEGlobalOptions::normNodeSize
float normNodeSize
average node size when node sizes are normalized
Definition: FMEFunc.h:75
ogdf::fast_multipole_embedder::LQCoordsFunctor
Computes the coords and size of the i-th node in the LinearQuadtree.
Definition: FMEFunc.h:481
ogdf::fast_multipole_embedder::LinearQuadtree::directNode
NodeID directNode(uint32_t i) const
Definition: LinearQuadtree.h:532
ogdf::fast_multipole_embedder::CollectForceFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:728
ogdf::fast_multipole_embedder::ArrayGraph
Definition: ArrayGraph.h:40
ogdf::fast_multipole_embedder::LQCoordsFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:490
ogdf::fast_multipole_embedder::D2DFunctor::D2DFunctor
D2DFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:579
ogdf::fast_multipole_embedder::LinearQuadtree::forall_children
forall_children_functor< F > forall_children(F f) const
creator
Definition: LinearQuadtree.h:151
ogdf::fast_multipole_embedder::l2l_functor::expansions
LinearQuadtreeExpansion & expansions
Definition: FMEFunc.h:253
ogdf::fast_multipole_embedder::LQMortonFunctor::translate_y
float translate_y
Definition: FMEFunc.h:181
ogdf::fast_multipole_embedder::D2DFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:588
ogdf::fast_multipole_embedder::LinearQuadtree::firstInnerNode
NodeID firstInnerNode() const
Definition: LinearQuadtree.h:518
ogdf::fast_multipole_embedder::FMEGlobalOptions::doPostProcessing
bool doPostProcessing
enable postprocessing
Definition: FMEFunc.h:80
ogdf::fast_multipole_embedder::D2DFunctor::forceArrayX
float * forceArrayX
Definition: FMEFunc.h:611
ogdf::fast_multipole_embedder::l2p_functor::l2p_functor
l2p_functor(const LinearQuadtree &t, LinearQuadtreeExpansion &e, float *x, float *y)
Definition: FMEFunc.h:279
ogdf::fast_multipole_embedder::LQCoordsFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:499
ogdf::fast_multipole_embedder::NDFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:550
ogdf::fast_multipole_embedder::NodeAdjInfo
Information about incident edges (16 bytes).
Definition: EdgeChain.h:43
ogdf::fast_multipole_embedder::FMETreePartition::pointCount
uint32_t pointCount
Definition: FMEFunc.h:50
ogdf::fast_multipole_embedder::WSPD
Class for the Well-Separated-Pairs-Decomposition (WSPD)
Definition: WSPD.h:41
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfInnerNodes
uint32_t numberOfInnerNodes() const
Definition: LinearQuadtree.h:520
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::y
float * y
Definition: FMEFunc.h:474
ogdf::begin
HypergraphRegistry< HypernodeElement >::iterator begin(const HypergraphRegistry< HypernodeElement > &self)
ogdf::fast_multipole_embedder::l2p_functor::fx
float * fx
Definition: FMEFunc.h:276
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:472
ogdf::fast_multipole_embedder::FMENodeChainPartition
Definition: FMEFunc.h:60
ogdf::fast_multipole_embedder::WSPD::wsNodeOfPair
uint32_t wsNodeOfPair(uint32_t currPairIndex, NodeID a) const
Returns the other node (not a) of the pair with index currPairIndex.
Definition: WSPD.h:81
ogdf::fast_multipole_embedder::EdgeAdjInfo::a
uint32_t a
First node of the pair.
Definition: EdgeChain.h:54
ogdf::fast_multipole_embedder::FMELocalContext::pGlobalContext
FMEGlobalContext * pGlobalContext
pointer to the global context
Definition: FMEFunc.h:116
ogdf::fast_multipole_embedder::l2l_functor::tree
const LinearQuadtree & tree
Definition: FMEFunc.h:252
ogdf::fast_multipole_embedder::LinearQuadtree::scaleInv
double scaleInv() const
Definition: LinearQuadtree.h:550
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::LQPointUpdateFunctor
LQPointUpdateFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:450
ogdf::fast_multipole_embedder::FMELocalContext::leafPartition
FMENodeChainPartition leafPartition
chain of leaf nodes assigned to the thread
Definition: FMEFunc.h:128
ogdf::fast_multipole_embedder::ArrayGraph::numNodes
uint32_t numNodes() const
Returns the number of nodes.
Definition: ArrayGraph.h:56
ogdf::fast_multipole_embedder::FMETreePartition::for_loop
void for_loop(Func &func)
Definition: FMEFunc.h:53
ogdf::fast_multipole_embedder::EdgeForceFunctor
Definition: FMEFunc.h:620
ogdf::fast_multipole_embedder::LinearQuadtree::computeCoords
void computeCoords(NodeID nodeIndex)
Definition: LinearQuadtree.h:552
ogdf::fast_multipole_embedder::FMECollect::NoFactor
@ NoFactor
ogdf::fast_multipole_embedder::FMECollect::ZeroThreadArray
@ ZeroThreadArray
ogdf::fast_multipole_embedder::pair_call
static pair_call_functor< F, A > pair_call(F f, A a)
creates a pair call resulting in a call f(a, *)
Definition: FMEFunctional.h:150
ogdf::fast_multipole_embedder::FMECollect::EdgeFactor
@ EdgeFactor
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfDirectPairs
uint32_t numberOfDirectPairs() const
Definition: LinearQuadtree.h:528
ogdf::fast_multipole_embedder::TIME_STEP_NORMAL
static constexpr int TIME_STEP_NORMAL
Definition: FMEFunc.h:777
ogdf::fast_multipole_embedder::FMENodeChainPartition::begin
uint32_t begin
Definition: FMEFunc.h:61
ogdf::fast_multipole_embedder::p2m_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndex)
Definition: FMEFunc.h:195
ogdf::fast_multipole_embedder::ArrayGraph::nodeXPos
float * nodeXPos()
Returns the x coord array for all nodes.
Definition: ArrayGraph.h:162
ogdf::fast_multipole_embedder::LQPartitioner::l_par
std::list< uint32_t > l_par
Definition: FMEFunc.h:443
ogdf::fast_multipole_embedder::FMEGlobalContext::pGraph
ArrayGraph * pGraph
pointer to the array graph
Definition: FMEFunc.h:97
ogdf::fast_multipole_embedder::FMECollect::RepulsiveFactor
@ RepulsiveFactor
ogdf::fast_multipole_embedder::LinearQuadtree::nextNode
NodeID nextNode(NodeID nodeID) const
Definition: LinearQuadtree.h:374
ogdf::fast_multipole_embedder::LQMortonFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:179
ogdf::fast_multipole_embedder::l2p_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndex, LinearQuadtree::PointID pointIndex)
Definition: FMEFunc.h:282
LinearQuadtreeBuilder.h
Declaration of class LinearQuadtreeBuilder.
ogdf::fast_multipole_embedder::FMELocalContext::forceY
float * forceY
local force array for all nodes, points
Definition: FMEFunc.h:118
ogdf::fast_multipole_embedder::TIME_STEP_PREP
static constexpr int TIME_STEP_PREP
Definition: FMEFunc.h:778
ogdf::fast_multipole_embedder::p2p_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndex)
Definition: FMEFunc.h:317
ogdf::fast_multipole_embedder::LQMortonFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:172
ogdf::fast_multipole_embedder::CollectForceFunctor::globalArrayX
float * globalArrayX
Definition: FMEFunc.h:766
ogdf::fast_multipole_embedder::FMEGlobalContext::coolDown
float coolDown
Definition: FMEFunc.h:106
ogdf::fast_multipole_embedder::NodeMoveFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:845
ArrayGraph.h
Declaration of class ArrayGraph.
ogdf::fast_multipole_embedder::FMELocalContext::max_y
float max_y
global point, node max y coordinate for bounding box calculations
Definition: FMEFunc.h:124
ogdf::fast_multipole_embedder::NodeMoveFunctor::nodeMoveRadius
float * nodeMoveRadius
Definition: FMEFunc.h:857
LinearQuadtreeExpansion.h
Declaration of class LinearQuadtreeExpansion.
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:457
ogdf::fast_multipole_embedder::LinearQuadtree::pointSize
float pointSize(PointID point) const
Definition: LinearQuadtree.h:453
ogdf::fast_multipole_embedder::FMELocalContext::avgForce
double avgForce
local maximum force
Definition: FMEFunc.h:120
ogdf::fast_multipole_embedder::LQPartitioner::numThreads
uint32_t numThreads
Definition: FMEFunc.h:441
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfLeaves
uint32_t numberOfLeaves() const
Definition: LinearQuadtree.h:524
ogdf::fast_multipole_embedder::FMEGlobalOptions::preProcMaxNumIterations
uint32_t preProcMaxNumIterations
number of iterations the preprocessing is applied
Definition: FMEFunc.h:69
ogdf::fast_multipole_embedder::EdgeForceFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:636
ogdf::fast_multipole_embedder::WSPD::nextPair
uint32_t nextPair(uint32_t currPairIndex, NodeID a) const
Returns the index of the next pair of currPairIndex of the node with index a.
Definition: WSPD.h:76
ogdf::fast_multipole_embedder::FMELocalContext::numInnerNodes
uint32_t numInnerNodes
number of inner nodes the thread prepared
Definition: FMEFunc.h:132
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfPoints
uint32_t numberOfPoints(NodeID nodeID) const
returns the number of points contained in the subtree of node nodeID
Definition: LinearQuadtree.h:415
ogdf::fast_multipole_embedder::m2m_functor::m2m_functor
m2m_functor(const LinearQuadtree &t, LinearQuadtreeExpansion &e)
Definition: FMEFunc.h:216
ogdf::fast_multipole_embedder::FMEGlobalContext::pQuadtree
LinearQuadtree * pQuadtree
pointer to the quadtree
Definition: FMEFunc.h:98
ogdf::fast_multipole_embedder::FMETreePartition::nodes
std::list< LinearQuadtree::NodeID > nodes
Definition: FMEFunc.h:49
ogdf::fast_multipole_embedder::FMEGlobalContext::currAvgEdgeLength
double currAvgEdgeLength
Definition: FMEFunc.h:111
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion
Definition: LinearQuadtreeExpansion.h:39
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion::P2M
void P2M(uint32_t point, uint32_t receiver)
adds a point with the given charge to the receiver expansion
ogdf::fast_multipole_embedder::FMELocalContext::firstInnerNode
LinearQuadtree::NodeID firstInnerNode
first inner nodes the thread prepared
Definition: FMEFunc.h:130
ogdf::fast_multipole_embedder::LinearQuadtree::LQPoint::mortonNr
MortonNR mortonNr
Definition: LinearQuadtree.h:57
ogdf::fast_multipole_embedder::NodeMoveFunctor::y
float * y
Definition: FMEFunc.h:854
ogdf::fast_multipole_embedder::m2m_functor::operator()
void operator()(LinearQuadtree::NodeID parent, LinearQuadtree::NodeID child)
Definition: FMEFunc.h:218
ogdf::fast_multipole_embedder::LQPartitioner::partitionNodeChains
void partitionNodeChains()
Definition: FMEFunc.h:341
ogdf::fast_multipole_embedder::FMEGlobalOptions::doPrepProcessing
bool doPrepProcessing
enable preprocessing
Definition: FMEFunc.h:79
ogdf::fast_multipole_embedder::NodeMoveFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:821
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion::L2L
void L2L(uint32_t source, uint32_t receiver)
shifts the source local coefficient to the center of the receiver and adds them
ogdf::fast_multipole_embedder::EdgeForceFunctor::edgeInfo
EdgeAdjInfo * edgeInfo
Definition: FMEFunc.h:674
ogdf::fast_multipole_embedder::node_move_function
static NodeMoveFunctor< FLAGS > node_move_function(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:864
ogdf::fast_multipole_embedder::CollectForceFunctor::pGraph
ArrayGraph * pGraph
Definition: FMEFunc.h:763
ogdf::fast_multipole_embedder::LinearQuadtree::firstPoint
PointID firstPoint(NodeID nodeID) const
Definition: LinearQuadtree.h:380
ogdf::fast_multipole_embedder::LinearQuadtree::pointLeaf
NodeID pointLeaf(PointID point) const
Definition: LinearQuadtree.h:445
ogdf::fast_multipole_embedder::l2l_functor
Local-to-Local functor.
Definition: FMEFunc.h:251
ogdf::fast_multipole_embedder::LinearQuadtree::child
NodeID child(NodeID nodeID, uint32_t i) const
returns the i th child index of node nodeID
Definition: LinearQuadtree.h:403
ogdf::fast_multipole_embedder::m2m_function
static m2m_functor m2m_function(FMELocalContext *pLocalContext)
creates Multipole-to-Multipole functor
Definition: FMEFunc.h:228
ogdf::fast_multipole_embedder::M2LFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:515
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:459
ogdf::fast_multipole_embedder::LQPartitioner::currPartition
FMETreePartition * currPartition()
Definition: FMEFunc.h:437
ogdf::fast_multipole_embedder::CollectForceFunctor::numContexts
uint32_t numContexts
Definition: FMEFunc.h:768
ogdf::fast_multipole_embedder::FMEGlobalOptions
the main global options for a run
Definition: FMEFunc.h:66
ogdf::fast_multipole_embedder::FMEGlobalContext::min_y
float min_y
global point, node min y coordinate for bounding box calculations
Definition: FMEFunc.h:109
ogdf::fast_multipole_embedder::FMELocalContext::min_x
float min_x
global point, node min x coordinate for bounding box calculations
Definition: FMEFunc.h:121
ogdf::fast_multipole_embedder::FMEEdgeForce::SubRep
@ SubRep
ogdf::fast_multipole_embedder::LQPartitioner::tree
LinearQuadtree * tree
Definition: FMEFunc.h:444
ogdf::fast_multipole_embedder::LinearQuadtree::LQPoint::ref
uint32_t ref
Definition: LinearQuadtree.h:59
ogdf::fast_multipole_embedder::LQMortonFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:165
ogdf::fast_multipole_embedder::M2LFunctor
Converts the multipole expansion coefficients from all nodes which are well separated from the i-th n...
Definition: FMEFunc.h:507
WSPD.h
Declaration of class WSPD (well-separated pair decomposition).
ogdf::fast_multipole_embedder::LinearQuadtree::pointX
float pointX(PointID point) const
Definition: LinearQuadtree.h:449
ogdf::fast_multipole_embedder::FMEGlobalContext
Global Context.
Definition: FMEFunc.h:94
ogdf::fast_multipole_embedder::USE_NODE_MOVE_RAD
static constexpr int USE_NODE_MOVE_RAD
Definition: FMEFunc.h:780
ogdf::fast_multipole_embedder::p2p_functor::fy
float * fy
Definition: FMEFunc.h:302
ogdf::fast_multipole_embedder::ArrayGraph::nodeMoveRadius
float * nodeMoveRadius()
Returns the node movement radius array for all nodes.
Definition: ArrayGraph.h:180
ogdf::fast_multipole_embedder::LQCoordsFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:492
ogdf::fast_multipole_embedder::EdgeForceFunctor::EdgeForceFunctor
EdgeForceFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:622
ogdf::fast_multipole_embedder::NodeMoveFunctor::NodeMoveFunctor
NodeMoveFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:786
ogdf::fast_multipole_embedder::LQMortonFunctor::LQMortonFunctor
LQMortonFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:153
ogdf::fast_multipole_embedder::D2DFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:602
ogdf::fast_multipole_embedder::FMEGlobalOptions::stopCritAvgForce
double stopCritAvgForce
stopping criteria
Definition: FMEFunc.h:83
ogdf::fast_multipole_embedder::FMECollect
FMECollect
Definition: FMEFunc.h:690
ogdf::fast_multipole_embedder::LinearQuadtree::firstLeaf
NodeID firstLeaf() const
Definition: LinearQuadtree.h:522
ogdf::fast_multipole_embedder::edge_force_function
static EdgeForceFunctor< FLAGS > edge_force_function(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:685
ogdf::fast_multipole_embedder::LQPartitioner::localContexts
FMELocalContext ** localContexts
Definition: FMEFunc.h:445
ogdf::fast_multipole_embedder::m2l_functor::m2l_functor
m2l_functor(LinearQuadtreeExpansion &e)
Definition: FMEFunc.h:237
ogdf::fast_multipole_embedder::ArrayGraph::nodeInfo
NodeAdjInfo & nodeInfo(uint32_t i)
Returns the adjacency information for the node at index i in m_nodeAdj.
Definition: ArrayGraph.h:138
ogdf::fast_multipole_embedder::NDFunctor
Calculates the repulsive forces acting between all nodes inside the cell of the i-th LinearQuadtree n...
Definition: FMEFunc.h:541
ogdf::fast_multipole_embedder::p2p_functor::p2p_functor
p2p_functor(const LinearQuadtree &t, float *x, float *y)
Definition: FMEFunc.h:304
ogdf::fast_multipole_embedder::l2p_functor
Local-to-Point functor.
Definition: FMEFunc.h:273
ogdf::fast_multipole_embedder::M2LFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:517
ogdf::fast_multipole_embedder::FMEGlobalContext::min_x
float min_x
global point, node min x coordinate for bounding box calculations
Definition: FMEFunc.h:107
ogdf::fast_multipole_embedder::FMEGlobalContext::globalForceY
float * globalForceY
the global node force y array
Definition: FMEFunc.h:102
ogdf::fast_multipole_embedder::m2l_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndexSource, LinearQuadtree::NodeID nodeIndexReceiver)
Definition: FMEFunc.h:239
ogdf::fast_multipole_embedder::M2LFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:533
ogdf::fast_multipole_embedder::min_max_x_function
static min_max_functor< float > min_max_x_function(FMELocalContext *pLocalContext)
creates a min max functor for the x coords of the node
Definition: FMEFunc.h:140
ogdf::fast_multipole_embedder::LinearQuadtree::LQPoint
Definition: LinearQuadtree.h:55
ogdf::fast_multipole_embedder::LinearQuadtree::pointY
float pointY(PointID point) const
Definition: LinearQuadtree.h:451
ogdf::fast_multipole_embedder::LinearQuadtree::point
LQPoint & point(PointID pointID)
Definition: LinearQuadtree.h:386
ogdf::fast_multipole_embedder::FMELocalContext
Local thread Context.
Definition: FMEFunc.h:115
ogdf::fast_multipole_embedder::CollectForceFunctor::globalContext
FMEGlobalContext * globalContext
Definition: FMEFunc.h:764
ogdf::fast_multipole_embedder::LQCoordsFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:488
ogdf::fast_multipole_embedder::LinearQuadtree::minY
float minY() const
Definition: LinearQuadtree.h:544
ogdf::fast_multipole_embedder::D2DFunctor
Calculates the repulsive forces acting between all nodes of the direct interacting cells of the i-th ...
Definition: FMEFunc.h:577
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion::M2M
void M2M(uint32_t source, uint32_t receiver)
shifts the source multipole coefficient to the center of the receiver and adds them
ogdf::fast_multipole_embedder::ArrayGraph::desiredEdgeLength
float * desiredEdgeLength()
Returns the edge length array for all edges.
Definition: ArrayGraph.h:183
ogdf::fast_multipole_embedder::l2l_function
static l2l_functor l2l_function(FMELocalContext *pLocalContext)
creates Local-to-Local functor
Definition: FMEFunc.h:267
ogdf::fast_multipole_embedder::FMECollect::EdgeFactorRep
@ EdgeFactorRep
ogdf::fast_multipole_embedder::LQMortonFunctor::x
float * x
Definition: FMEFunc.h:183
ogdf::fast_multipole_embedder::p2m_functor
Point-to-Multipole functor.
Definition: FMEFunc.h:189
ogdf::fast_multipole_embedder::m2m_functor
Multipole-to-Multipole functor.
Definition: FMEFunc.h:212
ogdf::fast_multipole_embedder::NodeMoveFunctor::x
float * x
Definition: FMEFunc.h:853
ogdf::fast_multipole_embedder::NDFunctor::quadtree
LinearQuadtree * quadtree
Definition: FMEFunc.h:568
ogdf::fast_multipole_embedder::m2m_functor::expansions
LinearQuadtreeExpansion & expansions
Definition: FMEFunc.h:214
ogdf::fast_multipole_embedder::FMEGlobalContext::max_y
float max_y
global point, node max y coordinate for bounding box calculations
Definition: FMEFunc.h:110
ogdf::fast_multipole_embedder::NodeMoveFunctor::localContext
FMELocalContext * localContext
Definition: FMEFunc.h:860
ogdf::fast_multipole_embedder::FMEGlobalOptions::maxNumIterations
uint32_t maxNumIterations
maximum number of iterations in the main step
Definition: FMEFunc.h:76
ogdf::fast_multipole_embedder::FMECollect::Tree2GraphOrder
@ Tree2GraphOrder
ogdf::fast_multipole_embedder::m2l_functor
Multipole-to-Local functor.
Definition: FMEFunc.h:234
ogdf::fast_multipole_embedder::FMEGlobalOptions::multipolePrecision
uint32_t multipolePrecision
Definition: FMEFunc.h:86
ogdf::fast_multipole_embedder::collect_force_function
static CollectForceFunctor< FLAGS > collect_force_function(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:773
ogdf::fast_multipole_embedder::LQPartitioner
The partitioner which partitions the quadtree into subtrees and partitions the sequence of inner node...
Definition: FMEFunc.h:332
ogdf::fast_multipole_embedder::FMEGlobalContext::max_x
float max_x
global point, node max x coordinate for bounding box calculations
Definition: FMEFunc.h:108
ogdf::fast_multipole_embedder::M2LFunctor::wspd
WSPD * wspd
Definition: FMEFunc.h:535
ogdf::fast_multipole_embedder::p2m_function
static p2m_functor p2m_function(FMELocalContext *pLocalContext)
creates a Point-to-Multipole functor
Definition: FMEFunc.h:206
ogdf::fast_multipole_embedder::LQMortonFunctor::y
float * y
Definition: FMEFunc.h:184
ogdf::fast_multipole_embedder::FMELocalContext::firstLeaf
LinearQuadtree::NodeID firstLeaf
first leaves the thread prepared
Definition: FMEFunc.h:134
ogdf::fast_multipole_embedder::l2p_functor::tree
const LinearQuadtree & tree
Definition: FMEFunc.h:274
ogdf::fast_multipole_embedder::NDFunctor::quadtreeExp
LinearQuadtreeExpansion * quadtreeExp
Definition: FMEFunc.h:569
ogdf::fast_multipole_embedder::LQMortonFunctor::translate_x
float translate_x
Definition: FMEFunc.h:180
ogdf::fast_multipole_embedder::LQMortonFunctor::scale
double scale
Definition: FMEFunc.h:182
ogdf::fast_multipole_embedder::ArrayGraph::nodeSize
float * nodeSize()
Returns the node size array for all nodes.
Definition: ArrayGraph.h:174
ogdf::fast_multipole_embedder::FMEEdgeForce
FMEEdgeForce
Definition: FMEFunc.h:615
ogdf::fast_multipole_embedder::FMELocalContext::numLeaves
uint32_t numLeaves
number of leaves the thread prepared
Definition: FMEFunc.h:136
ogdf::fast_multipole_embedder::EdgeForceFunctor::x
float * x
Definition: FMEFunc.h:672
ogdf::fast_multipole_embedder::CollectForceFunctor::CollectForceFunctor
CollectForceFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:710
ogdf::fast_multipole_embedder::LinearQuadtree
Definition: LinearQuadtree.h:47
ogdf::fast_multipole_embedder::LinearQuadtree::PointID
unsigned int PointID
Definition: LinearQuadtree.h:53
ogdf::fast_multipole_embedder::LQCoordsFunctor::LQCoordsFunctor
LQCoordsFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:483
ogdf::fast_multipole_embedder::CollectForceFunctor
Definition: FMEFunc.h:708
ogdf::fast_multipole_embedder::min_max_functor
generic min max functor for an array
Definition: FMEFunctional.h:205
ogdf::fast_multipole_embedder::LQMortonFunctor
Definition: FMEFunc.h:151
ogdf::fast_multipole_embedder::FMEGlobalOptions::timeStep
float timeStep
time step factor for the main step
Definition: FMEFunc.h:71
ogdf::fast_multipole_embedder::NodeMoveFunctor
Definition: FMEFunc.h:783
ogdf::fast_multipole_embedder::p2m_functor::tree
const LinearQuadtree & tree
Definition: FMEFunc.h:190
ogdf::fast_multipole_embedder::FMEGlobalOptions::normEdgeLength
float normEdgeLength
average edge length when desired edge length are normalized
Definition: FMEFunc.h:74
ogdf::fast_multipole_embedder::LQPartitioner::currThread
uint32_t currThread
Definition: FMEFunc.h:442
ogdf::fast_multipole_embedder::LQMortonFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:163
ogdf::fast_multipole_embedder::M2LFunctor::M2LFunctor
M2LFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:509
ogdf::fast_multipole_embedder::WSPD::firstPairEntry
uint32_t firstPairEntry(NodeID nodeID) const
Returns the index of the first pair of node nodeID.
Definition: WSPD.h:86
ogdf::fast_multipole_embedder::operator|
constexpr int operator|(int lhs, FMECollect rhs)
Definition: FMEFunc.h:701
ogdf::fast_multipole_embedder::p2p_functor
Local-to-Point functor.
Definition: FMEFunc.h:299
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::s
float * s
Definition: FMEFunc.h:475
ogdf::fast_multipole_embedder::NodeAdjInfo::degree
uint32_t degree
Total count of pairs where is either the first or second node.
Definition: EdgeChain.h:45
ogdf::fast_multipole_embedder::D2DFunctor::quadtreeExp
LinearQuadtreeExpansion * quadtreeExp
Definition: FMEFunc.h:610
ogdf::fast_multipole_embedder::LinearQuadtree::isLeaf
bool isLeaf(NodeID nodeID) const
returns true if the given node index is a leaf
Definition: LinearQuadtree.h:409
ogdf::fast_multipole_embedder::CollectForceFunctor::factor
float factor
Definition: FMEFunc.h:769
ogdf::fast_multipole_embedder::ArrayGraph::nodeYPos
float * nodeYPos()
Returns the y coord array for all nodes.
Definition: ArrayGraph.h:168
ogdf::fast_multipole_embedder::l2p_function
static l2p_functor l2p_function(FMELocalContext *pLocalContext)
creates Local-to-Point functor
Definition: FMEFunc.h:293
ogdf::fast_multipole_embedder::NDFunctor::forceArrayY
float * forceArrayY
Definition: FMEFunc.h:571
ogdf::fast_multipole_embedder::EdgeForceFunctor::pGraph
ArrayGraph * pGraph
Definition: FMEFunc.h:677
ogdf::end
HypergraphRegistry< HypernodeElement >::iterator end(const HypergraphRegistry< HypernodeElement > &self)
ogdf::fast_multipole_embedder::p2p_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndexA, LinearQuadtree::NodeID nodeIndexB)
Definition: FMEFunc.h:306
ogdf::fast_multipole_embedder::m2l_function
static m2l_functor m2l_function(FMELocalContext *pLocalContext)
creates Multipole-to-Local functor
Definition: FMEFunc.h:246
ogdf::fast_multipole_embedder::LQPartitioner::LQPartitioner
LQPartitioner(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:334
ogdf::fast_multipole_embedder::FMEGlobalOptions::preProcEdgeForceFactor
float preProcEdgeForceFactor
edge force factor for the preprocessing step
Definition: FMEFunc.h:68
ogdf::fast_multipole_embedder::LQPartitioner::partition
void partition()
Definition: FMEFunc.h:392
ogdf::fast_multipole_embedder::p2m_functor::p2m_functor
p2m_functor(const LinearQuadtree &t, LinearQuadtreeExpansion &e)
Definition: FMEFunc.h:193
ogdf::fast_multipole_embedder::EdgeAdjInfo
Information about an edge (16 bytes).
Definition: EdgeChain.h:52
ogdf::fast_multipole_embedder::ArrayGraph::numEdges
uint32_t numEdges() const
Returns the number of edges.
Definition: ArrayGraph.h:59
ogdf::fast_multipole_embedder::m2m_functor::operator()
void operator()(LinearQuadtree::NodeID nodeIndex)
Definition: FMEFunc.h:222
ogdf::fast_multipole_embedder::EdgeForceFunctor::desiredEdgeLength
float * desiredEdgeLength
Definition: FMEFunc.h:678
ogdf::fast_multipole_embedder::FMELocalContext::forceX
float * forceX
local force array for all nodes, points
Definition: FMEFunc.h:117
ogdf::fast_multipole_embedder::FMELocalContext::max_x
float max_x
global point, node max x coordinate for bounding box calculations
Definition: FMEFunc.h:122
ogdf::fast_multipole_embedder::LinearQuadtree::root
NodeID root() const
returns the index of the root
Definition: LinearQuadtree.h:423
ogdf::fast_multipole_embedder::LinearQuadtree::refOfPoint
uint32_t refOfPoint(PointID id) const
Definition: LinearQuadtree.h:499
ogdf::fast_multipole_embedder::CollectForceFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:756
ogdf::fast_multipole_embedder::FMEGlobalOptions::repForceFactor
float repForceFactor
repulsive force factor for the main step
Definition: FMEFunc.h:73
ogdf::fast_multipole_embedder::M2LFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:526
ogdf::fast_multipole_embedder::NDFunctor::NDFunctor
NDFunctor(FMELocalContext *pLocalContext)
Definition: FMEFunc.h:543
ogdf::fast_multipole_embedder::FMEGlobalContext::numThreads
uint32_t numThreads
number of threads, local contexts
Definition: FMEFunc.h:96
ogdf::fast_multipole_embedder::CollectForceFunctor::globalArrayY
float * globalArrayY
Definition: FMEFunc.h:767
ogdf::fast_multipole_embedder::NodeMoveFunctor::timeStep
float timeStep
Definition: FMEFunc.h:852
ogdf::fast_multipole_embedder::FMEGlobalContext::scaleFactor
float scaleFactor
var
Definition: FMEFunc.h:105
ogdf::fast_multipole_embedder::EdgeForceFunctor::forceArrayX
float * forceArrayX
Definition: FMEFunc.h:680
ogdf::fast_multipole_embedder::FMEGlobalOptions::minNumIterations
uint32_t minNumIterations
minimum number of iterations to be done regardless of any other conditions
Definition: FMEFunc.h:77
ogdf::fast_multipole_embedder::FMEGlobalOptions::stopCritConstSq
double stopCritConstSq
stopping criteria
Definition: FMEFunc.h:84
ogdf::fast_multipole_embedder::FMELocalContext::innerNodePartition
FMENodeChainPartition innerNodePartition
chain of inner nodes assigned to the thread
Definition: FMEFunc.h:127
ogdf::fast_multipole_embedder::FMELocalContext::lastInnerNode
LinearQuadtree::NodeID lastInnerNode
last inner nodes the thread prepared
Definition: FMEFunc.h:131
ogdf::fast_multipole_embedder::FMELocalContext::min_y
float min_y
global point, node min y coordinate for bounding box calculations
Definition: FMEFunc.h:123
ogdf::fast_multipole_embedder::LinearQuadtree::nodeFence
void nodeFence(NodeID nodeID)
Definition: LinearQuadtree.h:503
ogdf::fast_multipole_embedder::l2p_functor::operator()
void operator()(LinearQuadtree::PointID pointIndex)
Definition: FMEFunc.h:286
ogdf::fast_multipole_embedder::p2m_functor::expansions
LinearQuadtreeExpansion & expansions
Definition: FMEFunc.h:191
ogdf::fast_multipole_embedder::WSPD::numWSNodes
uint32_t numWSNodes(NodeID a) const
Returns the number of well separated nodes for node a.
Definition: WSPD.h:55
ogdf::fast_multipole_embedder::for_loop_array_set
void for_loop_array_set(uint32_t threadNr, uint32_t numThreads, TYP *a, uint32_t n, TYP value)
Definition: FMEFunc.h:869
ogdf::fast_multipole_embedder::NodeMoveFunctor::forceArrayX
float * forceArrayX
Definition: FMEFunc.h:855
ogdf::fast_multipole_embedder::p2p_functor::tree
const LinearQuadtree & tree
Definition: FMEFunc.h:300
ogdf::fast_multipole_embedder::NDFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:561
ogdf::fast_multipole_embedder::LinearQuadtree::directNodeB
NodeID directNodeB(uint32_t i) const
Definition: LinearQuadtree.h:536
ogdf::fast_multipole_embedder::EdgeForceFunctor::nodeSize
float * nodeSize
Definition: FMEFunc.h:679
ogdf::fast_multipole_embedder::ZERO_GLOBAL_ARRAY
static constexpr int ZERO_GLOBAL_ARRAY
Definition: FMEFunc.h:779
ogdf::fast_multipole_embedder::LQPointUpdateFunctor
Definition: FMEFunc.h:448
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::x
float * x
Definition: FMEFunc.h:473
ogdf::fast_multipole_embedder::FMELocalContext::currAvgEdgeLength
double currAvgEdgeLength
Definition: FMEFunc.h:125
FMEKernel.h
Declaration of FME kernel.
ogdf::fast_multipole_embedder::NodeMoveFunctor::currentEdgeLength
float * currentEdgeLength
Definition: FMEFunc.h:858
ogdf::fast_multipole_embedder::m2m_functor::tree
const LinearQuadtree & tree
Definition: FMEFunc.h:213
ogdf::fast_multipole_embedder::LinearQuadtree::directNodeA
NodeID directNodeA(uint32_t i) const
Definition: LinearQuadtree.h:534
ogdf::fast_multipole_embedder::LQCoordsFunctor::quadtreeExp
LinearQuadtreeExpansion * quadtreeExp
Definition: FMEFunc.h:500
ogdf::fast_multipole_embedder::FMEGlobalContext::pLocalContext
FMELocalContext ** pLocalContext
all local contexts
Definition: FMEFunc.h:95
ogdf::fast_multipole_embedder::FMEGlobalContext::pWSPD
WSPD * pWSPD
pointer to the well separated pairs decomposition
Definition: FMEFunc.h:100
ogdf::fast_multipole_embedder::l2p_functor::expansions
LinearQuadtreeExpansion & expansions
Definition: FMEFunc.h:275
ogdf::fast_multipole_embedder::LQPointUpdateFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:465
ogdf::fast_multipole_embedder::FMELocalContext::lastLeaf
LinearQuadtree::NodeID lastLeaf
last leaves the thread prepared
Definition: FMEFunc.h:135
ogdf::fast_multipole_embedder::CollectForceFunctor::operator()
void operator()(uint32_t i)
Definition: FMEFunc.h:730
ogdf::fast_multipole_embedder::LinearQuadtree::setPoint
void setPoint(PointID id, float x, float y, uint32_t ref)
Definition: LinearQuadtree.h:473
ogdf::fast_multipole_embedder::FMEGlobalContext::earlyExit
bool earlyExit
var for the main thread to notify the other threads that they are done
Definition: FMEFunc.h:104
ogdf::fast_multipole_embedder::l2l_functor::l2l_functor
l2l_functor(const LinearQuadtree &t, LinearQuadtreeExpansion &e)
Definition: FMEFunc.h:255
ogdf::fast_multipole_embedder::D2DFunctor::operator()
uint32_t operator()(void) const
Definition: FMEFunc.h:586
ogdf::fast_multipole_embedder::NodeMoveFunctor::pGraph
ArrayGraph * pGraph
Definition: FMEFunc.h:859
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion::L2P
void L2P(uint32_t source, uint32_t point, float &fx, float &fy)
evaluates the derivate of the local expansion at the point and adds the forces to fx fy
ogdf::fast_multipole_embedder::FMEGlobalContext::globalForceX
float * globalForceX
the global node force x array
Definition: FMEFunc.h:101
ogdf::fast_multipole_embedder::NodeMoveFunctor::forceArrayY
float * forceArrayY
Definition: FMEFunc.h:856
ogdf::fast_multipole_embedder::EdgeAdjInfo::b
uint32_t b
Second node of the pair.
Definition: EdgeChain.h:55
ogdf::fast_multipole_embedder::M2LFunctor::quadtreeExp
LinearQuadtreeExpansion * quadtreeExp
Definition: FMEFunc.h:534
ogdf::fast_multipole_embedder::LinearQuadtreeExpansion::M2L
void M2L(uint32_t source, uint32_t receiver)
converts the source multipole coefficient in to a local coefficients at the center of the receiver an...
ogdf::fast_multipole_embedder::NDFunctor::forceArrayX
float * forceArrayX
Definition: FMEFunc.h:570
ogdf::fast_multipole_embedder::LQPartitioner::newPartition
void newPartition(uint32_t nodeID)
Definition: FMEFunc.h:405
ogdf::fast_multipole_embedder::FMEGlobalOptions::preProcTimeStep
float preProcTimeStep
time step factor for the preprocessing step
Definition: FMEFunc.h:67
ogdf::fast_multipole_embedder::FMETreePartition
struct for distributing subtrees to the threads
Definition: FMEFunc.h:48
ogdf::fast_multipole_embedder::LQPartitioner::numPointsPerThread
uint32_t numPointsPerThread
Definition: FMEFunc.h:440
ogdf::fast_multipole_embedder::ArrayGraph::edgeInfo
EdgeAdjInfo & edgeInfo(uint32_t i)
Returns the adjacency information for the edge at index i in m_edgeAdj.
Definition: ArrayGraph.h:144
ogdf::fast_multipole_embedder::l2l_functor::operator()
void operator()(LinearQuadtree::NodeID parent, LinearQuadtree::NodeID child)
Definition: FMEFunc.h:257
ogdf::fast_multipole_embedder::FMELocalContext::treePartition
FMETreePartition treePartition
tree partition assigned to the thread
Definition: FMEFunc.h:126
ogdf::fast_multipole_embedder::EdgeForceFunctor::y
float * y
Definition: FMEFunc.h:673
ogdf::fast_multipole_embedder::LinearQuadtree::numberOfChilds
uint32_t numberOfChilds(NodeID nodeID) const
returns the number of children of node nodeID. for an inner node this is 1..4 and can be accessed by ...
Definition: LinearQuadtree.h:395
ogdf::fast_multipole_embedder::eval_direct_fast
void eval_direct_fast(float *x, float *y, float *s, float *fx, float *fy, size_t n)
kernel function to evaluate forces between n points with coords x, y directly. result is stored in fx...
Definition: FMEKernel.h:158
ogdf::fast_multipole_embedder::EdgeForceFunctor::operator()
void operator()(uint32_t begin, uint32_t end)
Definition: FMEFunc.h:665
ogdf::fast_multipole_embedder::D2DFunctor::forceArrayY
float * forceArrayY
Definition: FMEFunc.h:612
ogdf::fast_multipole_embedder::FMEEdgeForce::DivDegree
@ DivDegree