mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 04:03:39 +00:00
parent
bd46c52f95
commit
606754c09a
|
@ -348,6 +348,7 @@ public:
|
||||||
//
|
//
|
||||||
void compress() {
|
void compress() {
|
||||||
SASSERT(!m_delta.empty());
|
SASSERT(!m_delta.empty());
|
||||||
|
TRACE("seq", display(tout););
|
||||||
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
||||||
for (unsigned j = 0; j < m_delta[i].size(); ++j) {
|
for (unsigned j = 0; j < m_delta[i].size(); ++j) {
|
||||||
move const& mv = m_delta[i][j];
|
move const& mv = m_delta[i][j];
|
||||||
|
@ -460,6 +461,7 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sinkify_dead_states();
|
sinkify_dead_states();
|
||||||
|
TRACE("seq", display(tout););
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_sequence(unsigned& length) const {
|
bool is_sequence(unsigned& length) const {
|
||||||
|
@ -559,9 +561,8 @@ public:
|
||||||
template<class D>
|
template<class D>
|
||||||
std::ostream& display(std::ostream& out, D& displayer = D()) const {
|
std::ostream& display(std::ostream& out, D& displayer = D()) const {
|
||||||
out << "init: " << init() << "\n";
|
out << "init: " << init() << "\n";
|
||||||
out << "final: ";
|
out << "final: " << m_final_states << "\n";
|
||||||
for (unsigned i = 0; i < m_final_states.size(); ++i) out << m_final_states[i] << " ";
|
|
||||||
out << "\n";
|
|
||||||
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
||||||
moves const& mvs = m_delta[i];
|
moves const& mvs = m_delta[i];
|
||||||
for (move const& mv : mvs) {
|
for (move const& mv : mvs) {
|
||||||
|
@ -577,6 +578,22 @@ public:
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
std::ostream& display(std::ostream& out) const {
|
||||||
|
out << "init: " << init() << "\n";
|
||||||
|
out << "final: " << m_final_states << "\n";
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
||||||
|
moves const& mvs = m_delta[i];
|
||||||
|
for (move const& mv : mvs) {
|
||||||
|
out << i << " -> " << mv.dst() << " ";
|
||||||
|
if (mv.t()) {
|
||||||
|
out << "if *** ";
|
||||||
|
}
|
||||||
|
out << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
void sinkify_dead_states() {
|
void sinkify_dead_states() {
|
||||||
uint_set dead_states;
|
uint_set dead_states;
|
||||||
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
||||||
|
@ -604,7 +621,9 @@ private:
|
||||||
}
|
}
|
||||||
to_remove.reset();
|
to_remove.reset();
|
||||||
}
|
}
|
||||||
TRACE("seq", tout << "remove: " << dead_states << "\n";);
|
TRACE("seq", tout << "remove: " << dead_states << "\n";
|
||||||
|
tout << "final: " << m_final_states << "\n";
|
||||||
|
);
|
||||||
for (unsigned s : dead_states) {
|
for (unsigned s : dead_states) {
|
||||||
CTRACE("seq", !m_delta[s].empty(), tout << "live state " << s << "\n";);
|
CTRACE("seq", !m_delta[s].empty(), tout << "live state " << s << "\n";);
|
||||||
m_delta[s].reset();
|
m_delta[s].reset();
|
||||||
|
|
|
@ -379,9 +379,21 @@ typename symbolic_automata<T, M>::automaton_t* symbolic_automata<T, M>::mk_produ
|
||||||
pair2id.insert(init_pair, 0);
|
pair2id.insert(init_pair, 0);
|
||||||
moves_t mvs;
|
moves_t mvs;
|
||||||
unsigned_vector final;
|
unsigned_vector final;
|
||||||
if (a.is_final_state(a.init()) && b.is_final_state(b.init())) {
|
unsigned_vector a_init, b_init;
|
||||||
final.push_back(0);
|
a.get_epsilon_closure(a.init(), a_init);
|
||||||
|
for (unsigned ia : a_init) {
|
||||||
|
if (a.is_final_state(ia)) {
|
||||||
|
b.get_epsilon_closure(b.init(), b_init);
|
||||||
|
for (unsigned ib : b_init) {
|
||||||
|
if (b.is_final_state(ib)) {
|
||||||
|
final.push_back(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned n = 1;
|
unsigned n = 1;
|
||||||
moves_t mvsA, mvsB;
|
moves_t mvsA, mvsB;
|
||||||
while (!todo.empty()) {
|
while (!todo.empty()) {
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*++
|
|
||||||
Copyright (c) 2011 Microsoft Corporation
|
|
||||||
|
|
||||||
Module Name:
|
|
||||||
|
|
||||||
critical flet.cpp
|
|
||||||
|
|
||||||
Abstract:
|
|
||||||
|
|
||||||
Version of flet using "omp critical" directive.
|
|
||||||
|
|
||||||
Warning: it uses omp critical section "critical_flet"
|
|
||||||
|
|
||||||
Author:
|
|
||||||
|
|
||||||
Leonardo de Moura (leonardo) 2011-05-12
|
|
||||||
|
|
||||||
Revision History:
|
|
||||||
|
|
||||||
--*/
|
|
||||||
#ifndef CRITICAL_FLET_H_
|
|
||||||
#define CRITICAL_FLET_H_
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class critical_flet {
|
|
||||||
T & m_ref;
|
|
||||||
T m_old_value;
|
|
||||||
public:
|
|
||||||
critical_flet(T & ref, const T & new_value):
|
|
||||||
m_ref(ref),
|
|
||||||
m_old_value(ref) {
|
|
||||||
#pragma omp critical (critical_flet)
|
|
||||||
{
|
|
||||||
m_ref = new_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~critical_flet() {
|
|
||||||
#pragma omp critical (critical_flet)
|
|
||||||
{
|
|
||||||
m_ref = m_old_value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in a new issue