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

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