Program Listing for File FMKWayGainMgr.hpp

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

#pragma once

#include "FMGainMgr.hpp"
#include "FMKWayGainCalc.hpp"
#include <gsl/span>
// #include <range/v3/view/zip.hpp>

using namespace ranges;

// class FMKWayGainMgr;

class FMKWayGainMgr : public FMGainMgr<FMKWayGainCalc, FMKWayGainMgr>
{
  private:
    robin<std::uint8_t> RR;

  public:
    using Base = FMGainMgr<FMKWayGainCalc, FMKWayGainMgr>;
    using GainCalc_ = FMKWayGainCalc;
    using node_t = typename SimpleNetlist::node_t;

    FMKWayGainMgr(const SimpleNetlist& H, std::uint8_t K)
        : Base {H, K}
        , RR {K}
    {
    }

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

    auto modify_key(
        const node_t& w, std::uint8_t part_w, gsl::span<const int> keys) -> void
    {
        for (auto k : this->RR.exclude(part_w))
        {
            this->gainbucket[k].modify_key(
                this->gainCalc.vertex_list[k][w], keys[k]);
        }
    }

    auto update_move_v(const MoveInfoV<node_t>& move_info_v, int gain) -> void;

    auto lock(uint8_t whichPart, const node_t& v) -> void
    {
        auto& vlink = this->gainCalc.vertex_list[whichPart][v];
        this->gainbucket[whichPart].detach(vlink);
        vlink.lock();
    }

    auto lock_all(uint8_t /*fromPart*/, const node_t& v) -> void
    {
        // for (const auto& [vlist, bckt] :
        //     views::zip(this->gainCalc.vertex_list, this->gainbucket))
        auto bckt_it = this->gainbucket.begin();
        for (auto& vlist : this->gainCalc.vertex_list)
        {
            auto& vlink = vlist[v];
            bckt_it->detach(vlink);
            vlink.lock(); // lock
            ++bckt_it;
        }
    }

  private:
    auto _set_key(uint8_t whichPart, const node_t& v, int key) -> void
    {
        this->gainbucket[whichPart].set_key(
            this->gainCalc.vertex_list[whichPart][v], key);
    }
};