mirror of
https://github.com/Z3Prover/z3
synced 2025-04-11 03:33:35 +00:00
124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
/*++
|
|
Copyright (c) 2012 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
nlsat_interval_set.h
|
|
|
|
Abstract:
|
|
|
|
Sets of disjoint infeasible intervals.
|
|
|
|
Author:
|
|
|
|
Leonardo de Moura (leonardo) 2012-01-11.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#ifndef _NLSAT_INTERVAL_SET_H_
|
|
#define _NLSAT_INTERVAL_SET_H_
|
|
|
|
#include"nlsat_types.h"
|
|
|
|
namespace nlsat {
|
|
|
|
class interval_set;
|
|
|
|
class interval_set_manager {
|
|
anum_manager & m_am;
|
|
small_object_allocator & m_allocator;
|
|
svector<char> m_already_visited;
|
|
random_gen m_rand;
|
|
void del(interval_set * s);
|
|
public:
|
|
interval_set_manager(anum_manager & m, small_object_allocator & a);
|
|
~interval_set_manager();
|
|
|
|
void set_seed(unsigned s) { m_rand.set_seed(s); }
|
|
|
|
/**
|
|
\brief Return the empty set.
|
|
*/
|
|
interval_set * mk_empty() { return 0; }
|
|
|
|
/**
|
|
\brief Return a set of composed of a single interval.
|
|
*/
|
|
interval_set * mk(bool lower_open, bool lower_inf, anum const & lower,
|
|
bool upper_open, bool upper_inf, anum const & upper,
|
|
literal justification);
|
|
|
|
/**
|
|
\brief Return the union of two sets.
|
|
*/
|
|
interval_set * mk_union(interval_set const * s1, interval_set const * s2);
|
|
|
|
/**
|
|
\brief Reference counting
|
|
*/
|
|
void dec_ref(interval_set * s);
|
|
void inc_ref(interval_set * s);
|
|
|
|
/**
|
|
\brief Return true if s is the empty set.
|
|
*/
|
|
bool is_empty(interval_set const * s) {
|
|
return s == 0;
|
|
}
|
|
|
|
/**
|
|
\brief Return true if the set contains all real numbers.
|
|
*/
|
|
bool is_full(interval_set const * s);
|
|
|
|
/**
|
|
`\brief Return true if s1 is a subset of s2.
|
|
*/
|
|
bool subset(interval_set const * s1, interval_set const * s2);
|
|
|
|
/**
|
|
\brief Return true if s1 and s2 cover the same subset of R.
|
|
The justifications are ignored
|
|
*/
|
|
bool set_eq(interval_set const * s1, interval_set const * s2);
|
|
|
|
/**
|
|
\brief Return true if s1 and s2 are the same (the justifications are taking into account).
|
|
*/
|
|
bool eq(interval_set const * s1, interval_set const * s2);
|
|
|
|
/**
|
|
\brief Return a set of literals that justify s.
|
|
*/
|
|
void get_justifications(interval_set const * s, literal_vector & js);
|
|
|
|
void display(std::ostream & out, interval_set const * s) const;
|
|
|
|
unsigned num_intervals(interval_set const * s) const;
|
|
|
|
/**
|
|
\brief (For debugging purposes) Return one of the intervals in s.
|
|
\pre idx < num_intervals()
|
|
*/
|
|
interval_set * get_interval(interval_set const * s, unsigned idx) const;
|
|
|
|
/**
|
|
\brief Select a witness w in the complement of s.
|
|
|
|
\pre !is_full(s)
|
|
*/
|
|
void peek_in_complement(interval_set const * s, anum & w, bool randomize);
|
|
};
|
|
|
|
typedef obj_ref<interval_set, interval_set_manager> interval_set_ref;
|
|
|
|
inline std::ostream & operator<<(std::ostream & out, interval_set_ref const & s) {
|
|
s.m().display(out, s);
|
|
return out;
|
|
}
|
|
|
|
};
|
|
|
|
#endif
|