#pragma once
#include "ast/seq_decl_plugin.h"
#include "util/obj_hashtable.h"
namespace seq {
class profile_abs {
seq_util seq;
unsigned m_pk_mod = 0; unsigned m_pk_sigma = 0; unsigned m_pk_top = 0; unsigned m_pk_budget = 0; obj_map<expr, unsigned> m_pk_prof; obj_map<expr, unsigned> m_pk_forced;
unsigned prof_cat(unsigned a, unsigned b) const;
unsigned prof_pow(unsigned a, unsigned n) const;
unsigned prof_star(unsigned a) const;
unsigned prof_loop(unsigned a, unsigned lo, unsigned hi) const;
unsigned prof_chars(bool has_sigma, bool has_other) const;
public:
explicit profile_abs(ast_manager& m) : seq(m) {}
static const unsigned max_modulus = 10;
void begin_pass(unsigned modulus, unsigned sigma);
unsigned profiles(expr* re);
unsigned forced(expr* re);
unsigned regex_residues(expr* re, unsigned modulus, unsigned sigma);
unsigned residues_in_pass(expr* re);
};
}