z3-z3-4.12.6.src.opt.totalizer.h Maven / Gradle / Ivy
/*++
Copyright (c) 2022 Microsoft Corporation
Module Name:
totalizer.h
Abstract:
Incremental totalizer for at least constraints
Author:
Nikolaj Bjorner (nbjorner) 2022-06-27
--*/
#pragma once
#include "ast/ast.h"
namespace opt {
class totalizer {
struct node {
node* m_left = nullptr;
node* m_right = nullptr;
expr_ref_vector m_literals;
node(expr_ref_vector& l): m_literals(l) {}
~node() {
dealloc(m_left);
dealloc(m_right);
}
unsigned size() const { return m_literals.size(); }
};
ast_manager& m;
expr_ref_vector m_literals;
node* m_root = nullptr;
expr_ref_vector m_clauses;
vector> m_defs;
void ensure_bound(node* n, unsigned k);
public:
totalizer(expr_ref_vector const& literals);
~totalizer();
expr* at_least(unsigned k);
expr_ref_vector& clauses() { return m_clauses; }
vector>& defs() { return m_defs; }
};
}