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;
};