// -*- coding: utf-8 -*-
// Copyright (C) 2009, 2011, 2012, 2013, 2014, 2015 Laboratoire de
// Recherche et Développement de l'Epita (LRDE).
//
// This file is part of Spot, a model checking library.
//
// Spot is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// Spot is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
// License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
#pragma once
#include
#include
#include
#include
#include "misc/hash.hh"
#include "ltlast/formula.hh"
#include "bdddict.hh"
#include "tgba.hh"
#include "ltlvisit/tostring.hh"
namespace spot
{
/// \brief A self-loop Transition-based Alternating Automaton (TAA)
/// which is seen as a TGBA (abstract class, see below).
class SPOT_API taa_tgba: public twa
{
public:
taa_tgba(const bdd_dict_ptr& dict);
struct transition;
typedef std::list state;
typedef std::set state_set;
/// Explicit transitions.
struct transition
{
bdd condition;
acc_cond::mark_t acceptance_conditions;
const state_set* dst;
};
void add_condition(transition* t, const ltl::formula* f);
/// TGBA interface.
virtual ~taa_tgba();
virtual spot::state* get_init_state() const final;
virtual tgba_succ_iterator* succ_iter(const spot::state* state) const final;
virtual std::string format_state(const spot::state* state) const = 0;
protected:
virtual bdd compute_support_conditions(const spot::state* state)
const final;
typedef std::vector ss_vec;
taa_tgba::state_set* init_;
ss_vec state_set_vec_;
std::map acc_map_;
private:
// Disallow copy.
taa_tgba(const taa_tgba& other) SPOT_DELETED;
taa_tgba& operator=(const taa_tgba& other) SPOT_DELETED;
};
/// Set of states deriving from spot::state.
class SPOT_API set_state final: public spot::state
{
public:
set_state(const taa_tgba::state_set* s, bool delete_me = false)
: s_(s), delete_me_(delete_me)
{
}
virtual int compare(const spot::state*) const;
virtual size_t hash() const;
virtual set_state* clone() const;
virtual ~set_state()
{
if (delete_me_)
delete s_;
}
const taa_tgba::state_set* get_state() const;
private:
const taa_tgba::state_set* s_;
bool delete_me_;
};
class SPOT_API taa_succ_iterator final: public tgba_succ_iterator
{
public:
taa_succ_iterator(const taa_tgba::state_set* s, const acc_cond& acc);
virtual ~taa_succ_iterator();
virtual bool first();
virtual bool next();
virtual bool done() const;
virtual set_state* current_state() const;
virtual bdd current_condition() const;
virtual acc_cond::mark_t current_acceptance_conditions() const;
private:
/// Those typedefs are used to generate all possible successors in
/// the constructor using a cartesian product.
typedef taa_tgba::state::const_iterator iterator;
typedef std::pair iterator_pair;
typedef std::vector bounds_t;
typedef std::unordered_map,
state_ptr_hash, state_ptr_equal> seen_map;
struct distance_sort :
public std::binary_function
{
bool
operator()(const iterator_pair& lhs, const iterator_pair& rhs) const
{
return std::distance(lhs.first, lhs.second) <
std::distance(rhs.first, rhs.second);
}
};
std::vector::const_iterator i_;
std::vector succ_;
seen_map seen_;
const acc_cond& acc_;
};
/// A taa_tgba instance with states labeled by a given type.
/// Still an abstract class, see below.
template
class SPOT_API taa_tgba_labelled: public taa_tgba
{
public:
taa_tgba_labelled(const bdd_dict_ptr& dict) : taa_tgba(dict) {};
~taa_tgba_labelled()
{
auto i = acc_map_.begin();
while (i != acc_map_.end())
(i++)->first->destroy();
}
void set_init_state(const label& s)
{
std::vector