#ifndef GRAPH_UTILS_PM_PASS_MANAGER_HPP
#define GRAPH_UTILS_PM_PASS_MANAGER_HPP
#include <list>
#include <string>
#include <unordered_map>
#include "graph/interface/c_types_map.hpp"
#include "graph/utils/json.hpp"
#include "graph/utils/pm/pass_base.hpp"
namespace dnnl {
namespace impl {
namespace graph {
namespace pass {
using pass_filter_fn
= std::function<bool(const pass_base_ptr &, partition_policy_t)>;
bool default_pass_filter(const pass_base_ptr &pass, partition_policy_t policy);
class pass_registry_t {
using pass_create_fn = pass_base_ptr (*)(std::string, std::string);
public:
pass_base_t ®ister_pass(const std::string &backend_name,
const std::string &pass_name, pass_create_fn fn);
pass_base_t ®ister_pass(const pass_base_ptr &pass);
const std::list<pass_base_ptr> &get_passes() const { return passes_; }
void sort_passes();
pass_base_ptr &get_pass_ptr(const std::string &pass_name) {
auto it = passes_map_.find(pass_name);
assert(it != passes_map_.end() && "pass not exists!");
return it->second;
}
pass_registry_t() = default;
pass_registry_t(const pass_registry_t &) = delete;
pass_registry_t(pass_registry_t &&) = default;
pass_registry_t &operator=(const pass_registry_t &) = delete;
pass_registry_t &operator=(pass_registry_t &&) = delete;
private:
std::list<pass_base_ptr> passes_;
std::unordered_map<std::string, pass_base_ptr> passes_map_;
};
class pass_manager_t {
private:
pass_registry_t &pass_registry_;
public:
pass_manager_t(pass_registry_t ®istry) : pass_registry_(registry) {}
const std::list<pass_base_ptr> &get_passes() {
return pass_registry_.get_passes();
}
pass_base_ptr &get_pass_ptr(const std::string &pass_name) {
return pass_registry_.get_pass_ptr(pass_name);
}
void print_passes(const std::string &pass_config_json);
void print_passes(std::ostream *os);
impl::status_t run_passes(graph_t &agraph,
const std::string &pass_config_json,
partition_policy_t policy = partition_policy::fusion,
const pass_filter_fn &filter_fn = default_pass_filter);
impl::status_t run_passes(graph_t &agraph, std::istream *fs,
partition_policy_t policy = partition_policy::fusion,
const pass_filter_fn &filter_fn = default_pass_filter);
};
} } } }
#endif