403{
404 LayerSelectionInfo::LayerInfoContainer layerInfos;
405
406 LayerSelectionInfo::LayerInfoQueue processQueue;
407 const SubgraphView::IConnectableLayers& subgraphLayers = subgraph.GetIConnectableLayers();
408 for (auto& layer : subgraphLayers)
409 {
410
411 auto emplaced = layerInfos.emplace(layer, LayerSelectionInfo{PolymorphicDowncast<Layer*>(layer), selector});
412 LayerSelectionInfo& layerInfo = emplaced.first->second;
413
414
415 if (layerInfo.IsInputLayer())
416 {
417 processQueue.push(&layerInfo);
418 }
419 }
420
421 const SubgraphView::IInputSlots& subgraphInputSlots = subgraph.GetIInputSlots();
422 for (auto& inputSlot : subgraphInputSlots)
423 {
424 Layer& layer = PolymorphicDowncast<InputSlot*>(inputSlot)->GetOwningLayer();
425 auto emplaced = layerInfos.emplace(&layer, LayerSelectionInfo{&layer, selector});
426 LayerSelectionInfo& layerInfo = emplaced.first->second;
427
428 processQueue.push(&layerInfo);
429 }
430
431 while (!processQueue.empty())
432 {
433 LayerSelectionInfo& layerInfo = *processQueue.front();
434 processQueue.pop();
435
436
437 if (!layerInfo.m_IsProcessed)
438 {
439
441 {
442
443 processQueue.push(&layerInfo);
444 continue;
445 }
446
447
449
450
451 ForEachLayerOutput(layerInfos, layerInfo, [&processQueue](LayerSelectionInfo& childInfo)
452 {
453 processQueue.push(&childInfo);
454 });
455
456
457 layerInfo.m_IsProcessed = true;
458 }
459 }
460
461
462 using SelectionInfoPtrs = std::vector<LayerSelectionInfo*>;
463 std::map<PartialSubgraph*, SelectionInfoPtrs> splitMap;
464 for (auto& info : layerInfos)
465 {
466 if (
info.second.m_IsSelected)
467 {
468 auto it = splitMap.find(
info.second.m_Subgraph->GetRepresentative());
469 if (it == splitMap.end())
470 {
471 splitMap.insert(
472 std::make_pair(
info.second.m_Subgraph->GetRepresentative(), SelectionInfoPtrs{&info.second}));
473 }
474 else
475 {
476 it->second.push_back(&
info.second);
477 }
478 }
479 }
480
481
482 Subgraphs result;
483 for (auto& splitGraph : splitMap)
484 {
485 SubgraphView::IInputSlots inputs;
486 SubgraphView::IOutputSlots outputs;
487 SubgraphView::IConnectableLayers layers;
488 for (auto&& infoPtr : splitGraph.second)
489 {
490 infoPtr->CollectNonSelectedInputs(layerInfos, inputs);
491 infoPtr->CollectNonSelectedOutputSlots(layerInfos, outputs);
492 layers.push_back(infoPtr->m_Layer);
493 }
494
495
496
497 std::sort(inputs.begin(), inputs.end(), [](const IInputSlot* a, const IInputSlot* b)
498 {
499 auto* castA = PolymorphicDowncast<const InputSlot*>(a);
500 auto* castB = PolymorphicDowncast<const InputSlot*>(b);
501 const LayerGuid guidA = castA->GetOwningLayer().GetGuid();
502 const LayerGuid guidB = castB->GetOwningLayer().GetGuid();
503 if (guidA < guidB)
504 {
505 return true;
506 }
507 else if (guidA == guidB)
508 {
509 return (castA->GetSlotIndex() < castB->GetSlotIndex());
510 }
511 return false;
512 });
513 std::sort(outputs.begin(), outputs.end(), [](const IOutputSlot* a, const IOutputSlot* b)
514 {
515 auto* castA = PolymorphicDowncast<const OutputSlot*>(a);
516 auto* castB = PolymorphicDowncast<const OutputSlot*>(b);
517 const LayerGuid guidA = castA->GetOwningLayer().GetGuid();
518 const LayerGuid guidB = castB->GetOwningLayer().GetGuid();
519 if (guidA < guidB)
520 {
521 return true;
522 }
523 else if (guidA == guidB)
524 {
525 return (a->CalculateIndexOnOwner() < b->CalculateIndexOnOwner());
526 }
527 return false;
528 });
529 layers.sort([](const IConnectableLayer* a, const IConnectableLayer* b) { return a->GetGuid() < b->GetGuid(); });
530
531
532 result.emplace_back(std::make_unique<SubgraphView>(std::move(layers),
533 std::move(inputs),
534 std::move(outputs)));
535 }
536
537
538
539
540 std::sort(result.begin(), result.end(), [](const SubgraphView::SubgraphViewPtr& a,
541 const SubgraphView::SubgraphViewPtr& b)
542 {
543 return a->GetIConnectableLayers().front()->GetGuid() < b->GetIConnectableLayers().front()->GetGuid();
544 });
545
546 return result;
547}
void AssignSplitId(LayerSelectionInfo::LayerInfoContainer &layerInfos, LayerSelectionInfo &layerInfo)
bool IsReadyForSplitAssignment(LayerSelectionInfo::LayerInfoContainer &layerInfos, LayerSelectionInfo &layerInfo)
void ForEachLayerOutput(LayerSelectionInfo::LayerInfoContainer &layerInfos, LayerSelectionInfo &layerInfo, Delegate function)