584 {
586 const int R = (int)
r_nodes.size();
588
595
596 int max_flush = 0;
598 for (const auto &row : mat)
599 for (float v : row)
600 max_flush = std::max(max_flush, (int)v);
601 int bonus = max_flush *
L + 1;
602
603
604 for (
int i = 0; i <
L; ++i)
606
607
608 for (
int i = 0; i <
L; ++i) {
610 for (int j : it->second)
612 continue;
613 }
614
615 std::optional<std::vector<int>> unlink_limits;
617 unlink_limits = it->second;
618
619 for (int j = 0; j < R; ++j) {
620 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
621 continue;
623 }
624 }
625
626
627
628
629
630
631
632
633
634 int nozzle_bonus = max_flush + 1;
635 std::vector<int> r_in_degree(R, 0);
636 for (
int i = 0; i <
L; ++i) {
638 for (int j : it->second)
639 r_in_degree[j]++;
640 continue;
641 }
642 std::optional<std::vector<int>> unlink_limits;
644 unlink_limits = it->second;
645 for (int j = 0; j < R; ++j) {
646 if (unlink_limits.has_value() && std::find(unlink_limits->begin(), unlink_limits->end(), j) != unlink_limits->end())
647 continue;
648 r_in_degree[j]++;
649 }
650 }
651
652 for (int j = 0; j < R; ++j) {
654 int cap = std::max(r_in_degree[j], 1);
655
656 m_solver->add_edge(
L + j,
L + R + g, 1, -nozzle_bonus);
657 if (cap > 1)
658 m_solver->add_edge(
L + j,
L + R + g, cap - 1, 0);
659 }
660
661
662
663 for (int g = 0; g < G; ++g) {
667 }
668 }
#define L(s)
Definition ExtrusionEntity.cpp:25
int get_flush_cost(int l_idx, int r_idx)
Definition ToolOrderUtils.cpp:575