Program Listing for File MoveApplier.h

Return to documentation for file (src/partition/refine/engine/MoveApplier.h)

#ifndef PARTITION_REFINE_ENGINE_MOVEAPPLIER_H_
#define PARTITION_REFINE_ENGINE_MOVEAPPLIER_H_

#include "refine/bucket/MoveBucket.h"
#include "refine/core/RefineTypes.h"


class IMoveConstraintChecker {
 public:
  virtual ~IMoveConstraintChecker() = default;

  virtual bool canMove(
      const graph &finest, vector<VectorXi> &occupied_resources,
      vector<int> &parts, int node_id, int to_part, const fpga &fpgas,
      const std::function<bool(const vector<VectorXi> &, const node &, int)>
          &check_balance) const = 0;
};

class CompositeConstraintChecker : public IMoveConstraintChecker {
 public:
  bool canMove(const graph &finest, vector<VectorXi> &occupied_resources,
               vector<int> &parts, int node_id, int to_part, const fpga &fpgas,
               const std::function<bool(const vector<VectorXi> &, const node &,
                                        int)> &check_balance) const override;
};

struct MoveApplierContext {
  int large_net_threshold;
  vector<vector<int>> &cut_weights;
  const fpga &fpgas;
  const TimingRefineConfig &timing_cfg;
};

class MoveStateApplierCore {
 public:
  static void takeMove(const MoveApplierContext &ctx, const graph &finest,
                       vector<VectorXi> &occupied_resources, vector<int> &parts,
                       vector<NetPartition> &partition, int node, int best_p,
                       HSFullTiming::HSTimingDelta *delta,
                       bool update_timing_edge = true);

  static void applyMoveToState(const MoveApplierContext &ctx,
                               const Gain &gain_cell, const graph &finest,
                               vector<int> &parts,
                               vector<VectorXi> &occupied_resources,
                               vector<NetPartition> &partition);

  static void acceptMove(const MoveApplierContext &ctx, const Gain &gain_cell,
                         PerPartBucketSet &buckets, vector<Gain> &moves_trace,
                         double &total_delta_gain,
                         vector<bool> &visited_vertices_flag,
                         const graph &finest, vector<int> &parts,
                         vector<VectorXi> &occupied_resources,
                         vector<NetPartition> &partition);

  static void cancelMove(const MoveApplierContext &ctx, const Gain &gain_cell,
                         const graph &finest,
                         vector<bool> &visited_vertices_flag,
                         vector<int> &parts,
                         vector<VectorXi> &occupied_resources,
                         vector<NetPartition> &partition);
};

class ConstraintCheckerCore {
 public:
  static bool checkBalance(const fpga &fpgas,
                           const vector<VectorXi> &occupied_resources,
                           const node &vertex, int from);

  static bool checkMove(
      const fpga &fpgas, const graph &finest,
      vector<VectorXi> &occupied_resources, vector<int> &parts, int node_id,
      int toPart,
      const std::function<bool(const vector<VectorXi> &, const node &, int)>
          &check_balance_fn);
};

#endif