Program Listing for File FMGainMgr.hpp

Return to documentation for file (ckpttncpp/FMGainMgr.hpp)

#pragma once

#include "bpqueue.hpp" // import bpqueue
#include "dllist.hpp"  // import dllink
#include "netlist.hpp" // import Netlist
#include <cinttypes>
#include <gsl/span>
#include <iterator>
#include <memory>
#include <type_traits>

template <typename GainCalc, class Derived>
class FMGainMgr
{
    Derived& self = *static_cast<Derived*>(this);
    using node_t = typename SimpleNetlist::node_t;
    // friend Derived;
    using Item = dllink<std::pair<node_t, uint32_t>>;

  protected:
    Item waitinglist {std::pair {node_t {}, uint32_t(0)}};
    const SimpleNetlist& H;
    std::vector<bpqueue<node_t>> gainbucket;
    // size_t pmax;
    std::uint8_t K;

  public:
    GainCalc gainCalc;

    // int totalcost;

    // FMGainMgr(FMGainMgr&&) = default;

    FMGainMgr(const SimpleNetlist& H, std::uint8_t K);

    auto init(gsl::span<const std::uint8_t> part) -> int;

    [[nodiscard]] auto is_empty_togo(uint8_t toPart) const -> bool
    {
        return this->gainbucket[toPart].is_empty();
    }

    [[nodiscard]] auto is_empty() const -> bool
    {
        return std::all_of(this->gainbucket.cbegin(), this->gainbucket.cend(),
            [&](const auto& bckt) { return bckt.is_empty(); });
    }

    auto select(gsl::span<const std::uint8_t> part)
        -> std::tuple<MoveInfoV<node_t>, int>;

    auto select_togo(uint8_t toPart) -> std::tuple<node_t, int>;

    auto update_move(gsl::span<const std::uint8_t> part,
        const MoveInfoV<node_t>& move_info_v) -> void;

  private:
    auto _update_move_2pin_net(gsl::span<const std::uint8_t> part,
        const MoveInfo<node_t>& move_info) -> void;

    auto _update_move_3pin_net(gsl::span<const std::uint8_t> part,
        const MoveInfo<node_t>& move_info) -> void;

    auto _update_move_general_net(gsl::span<const std::uint8_t> part,
        const MoveInfo<node_t>& move_info) -> void;
};