31 #include "../../util/Metrics.h"
40 init(FullIceTree{FullNodeDataListList{FullNodeDataList{FullNodeData{
43 std::numeric_limits<Ice::Float>::infinity(),
47 AdaptiveDynamicDomainParameters{1, 1, 1},
55 AdaptiveDynamicDomainParameters newaddParams,
56 std::size_t newWorkerId)
74 for (
const auto& workerNodes : iceTree.nodes)
78 nodes.back().resize(workerNodes.size());
84 for (std::size_t wId = 0; wId <
nodes.size(); ++wId)
86 for (std::size_t nId = 0; nId <
nodes.at(wId).
size(); ++nId)
89 const FullNodeData& iceNode = iceTree.nodes.at(wId).at(nId);
90 localNode.
config = iceNode.config;
91 localNode.
parent = iceNode.parent;
92 localNode.
radius = iceNode.radius;
115 if (
nodes.size() < count)
127 for (std::size_t i = 0; i < u.dependetOnUpdateIds.size(); ++i)
141 const auto workerId = getUpdatesWorkerId(u);
154 for (
const auto& nodeCreationUpdate : u.nodes)
160 for (
const auto& rewireUpdate : u.rewires)
166 for (
const auto& radiusUpdate : u.radii)
207 const NodeId& child = rewireUpdate.child;
208 const NodeId& newParent = rewireUpdate.newParent;
213 if (costOld < costNew ||
214 ((costOld == costNew) &&
215 (rewireUpdate.newParent.workerId >
getNode(child).parent.workerId))
249 for (
const auto& child :
getNode(root).children)
259 const NodeId& parent,
260 float fromParentCost,
261 std::size_t workerId)
264 auto& parentNode =
getNode(parent);
269 std::numeric_limits<float>::infinity(),
275 parentNode.children.insert(
id);
282 const NodeId& newParent,
283 float fromParentCost,
284 bool updateFromStartCost)
294 if (updateFromStartCost)
304 if (
getNode(
id).radius < std::numeric_limits<float>::infinity())
316 std::vector<std::pair<NodeId, float>>
322 std::vector<std::pair<NodeId, float>> idDistanceVector{};
323 idDistanceVector.reserve(
size());
325 for (std::size_t workerLevelIndex = 0; workerLevelIndex <
nodes.size(); ++workerLevelIndex)
327 for (std::size_t nodeLevelIndex = 0; nodeLevelIndex <
nodes.at(workerLevelIndex).
size();
330 const NodeId
id{
static_cast<Ice::Long>(workerLevelIndex),
334 idDistanceVector.emplace_back(
id, dist);
341 if (k < idDistanceVector.size())
344 idDistanceVector.begin(),
345 idDistanceVector.begin() + (k - 1),
346 idDistanceVector.end(),
347 [](
const std::pair<NodeId, float>& lhs,
const std::pair<NodeId, float>& rhs)
348 { return lhs.second < rhs.second; });
349 idDistanceVector.resize(k);
351 idDistanceVector.shrink_to_fit();
354 return idDistanceVector;
360 const auto worker =
static_cast<std::size_t
>(
id.workerId);
361 const auto node =
static_cast<std::size_t
>(
id.numberOfNode);
364 return nodes.at(worker).at(node);
370 const auto worker =
static_cast<std::size_t
>(
id.workerId);
371 const auto node =
static_cast<std::size_t
>(
id.numberOfNode);
374 return nodes.at(worker).at(node);
382 throw std::out_of_range{
"index >= size"};
387 for (
const auto& workerNodes :
nodes)
389 if (
index < workerNodes.size())
396 index -= workerNodes.size();
402 throw std::logic_error{
"Tree size decreased during id calculation!"};
410 ? std::numeric_limits<float>::infinity()
420 const auto id = min_elem->node;
444 const auto& node =
getNode(
id);
445 pathIds.emplace_back(
id);
463 const auto& node =
getNode(
id);
464 path.emplace_back(node.config);
477 FullNodeDataListList allNodes{};
478 allNodes.resize(
nodes.size());
480 for (std::size_t workerLevelIndex = 0; workerLevelIndex <
nodes.size(); ++workerLevelIndex)
482 FullNodeDataList& iceWorkerNodes = allNodes.at(workerLevelIndex);
483 const auto& workerNodes =
nodes.at(workerLevelIndex);
484 iceWorkerNodes.resize(workerNodes.size());
486 for (std::size_t nodeLevelIndex = 0; nodeLevelIndex < iceWorkerNodes.size();
489 const auto& localNode = workerNodes.at(nodeLevelIndex);
490 FullNodeData& iceNode = iceWorkerNodes.at(nodeLevelIndex);
491 iceNode.config = localNode.config;
492 iceNode.parent = localNode.parent;
493 iceNode.radius = localNode.radius;
494 iceNode.fromParentCost = localNode.fromParentCost;
506 const auto nodeId = getUpdatesWorkerId(u);
507 const auto updateSubId = getUpdatesSubId(u);