3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00
z3/lib/resource_limit.h
Leonardo de Moura e9eab22e5c Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:35:25 -07:00

169 lines
3.7 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
resource_limit.h
Abstract:
<abstract>
Author:
Leonardo de Moura (leonardo) 2007-04-18.
Revision History:
--*/
#ifndef _RESOURCE_LIMIT_H_
#define _RESOURCE_LIMIT_H_
//
// This object is used to limit the availability of "resources" during a search.
// The main applications:
//
// - limiting the number of conflicts.
//
// - limiting the number of branching&bound steps in the ILP
//
// - limiting the number of quantifier instantiations.
//
// - etc.
//
// The idea is that when the resources are exhausted, the bounded_search terminates with
// the undefined result.
//
// Then, the search can restart with bigger limits.
class resource_limit {
public:
virtual ~resource_limit() {
}
virtual const char * get_description() const = 0;
// - Reset counters associated with the limit.
virtual void reset_counters() = 0;
// - The limit was exhausted.
virtual bool exhausted() const = 0;
// - Return true if the limit is incremented.
virtual bool inc_limit() = 0;
virtual int get_limit() const = 0;
virtual void reset() = 0;
};
class base_resource_limit : public resource_limit {
protected:
int m_counter;
int m_curr_limit;
int m_init_limit;
int m_max_limit; // <0 if unbounded
const char * m_description;
public:
base_resource_limit(int init_limit, int max_limit, const char * desc):
m_counter(0),
m_curr_limit(init_limit),
m_init_limit(init_limit),
m_max_limit(max_limit),
m_description(desc) {
}
virtual ~base_resource_limit() {
}
int get_counter() const {
return m_counter;
}
bool inc_counter() {
m_counter++;
return m_counter <= m_curr_limit;
}
void set_init_limit(int l) {
m_init_limit = l;
m_curr_limit = l;
}
void set_max_limit(int l) {
m_max_limit = l;
}
virtual const char * get_description() const {
return m_description;
}
virtual void reset_counters() {
m_counter = 0;
}
virtual bool exhausted() const {
return m_counter >= m_curr_limit;
}
virtual int get_limit() const {
return m_curr_limit;
}
virtual void reset() {
m_counter = 0;
m_curr_limit = m_init_limit;
}
};
class li_resource_limit : public base_resource_limit {
int m_increment;
public:
li_resource_limit(int init_limit, int max_limit, int inc, const char * desc):
base_resource_limit(init_limit, max_limit, desc),
m_increment(inc) {
}
virtual ~li_resource_limit() {
}
virtual bool inc_limit() {
int new_limit = m_curr_limit + m_increment;
if (m_max_limit < 0 || new_limit <= m_max_limit) {
m_curr_limit = new_limit;
return true;
}
TRACE("resource_limit", tout << new_limit << " exhausts " << m_max_limit << "\n";);
return false;
}
};
class ei_resource_limit : public base_resource_limit {
double m_increment_ratio;
public:
ei_resource_limit(int init_limit, int max_limit, double inc, const char * desc):
base_resource_limit(init_limit, max_limit, desc),
m_increment_ratio(inc) {
}
virtual ~ei_resource_limit() {
}
virtual bool inc_limit() {
int new_limit = static_cast<int>(m_curr_limit * m_increment_ratio);
if (m_max_limit < 0 || new_limit <= m_max_limit) {
m_curr_limit = new_limit;
return true;
}
TRACE("resource_limit", tout << new_limit << " exhausts " << m_max_limit << "\n";);
return false;
}
};
#endif /* _RESOURCE_LIMIT_H_ */