spot/spot/twaalgos/hoa.hh
Alexandre Duret-Lutz 2c13b299b8 hoa: add missing include
Fixes #515, reported by Yuri Victorovich.

* spot/twaalgos/hoa.hh: Include <unordered_map>.
2022-10-10 10:00:38 +02:00

168 lines
6.4 KiB
C++

// -*- coding: utf-8 -*-
// Copyright (C) 2014, 2015, 2022 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 <http://www.gnu.org/licenses/>.
#pragma once
#include <iosfwd>
#include <spot/misc/common.hh>
#include <spot/twa/fwd.hh>
#include <vector>
#include <unordered_map>
#include <utility>
#include <functional>
#include <bddx.h>
namespace spot
{
/// \ingroup twa_io
/// \brief Print reachable states in Hanoi Omega Automata format.
///
/// \param os The output stream to print on.
/// \param g The automaton to output.
/// \param opt a set of characters each corresponding to a possible
/// option: (i) implicit labels for complete and
/// deterministic automata, (k) state labels when possible,
/// (s) state-based acceptance when possible, (t)
/// transition-based acceptance, (m) mixed acceptance, (l)
/// single-line output, (v) verbose properties, (1.1) use
/// version 1.1 of the HOA format.
SPOT_API std::ostream&
print_hoa(std::ostream& os,
const const_twa_ptr& g,
const char* opt = nullptr);
/// \ingroup twa_io
/// \brief Obtain aliases used in the HOA format.
///
/// Aliases are stored as a vector of pairs (name, bdd).
/// The bdd is expected to use only variable registered by \a g.
SPOT_API std::vector<std::pair<std::string, bdd>>*
get_aliases(const const_twa_ptr& g);
/// \ingroup twa_io
/// \brief Define all aliases used in the HOA format.
///
/// Aliases are stored as a vector of pairs (name, bdd).
/// The bdd is expected to use only variable registered by \a g.
///
/// Pass an empty vector to remove existing aliases.
SPOT_API void
set_aliases(twa_ptr g, std::vector<std::pair<std::string, bdd>> aliases);
/// \ingroup twa_io
/// \brief Help printing BDDs as text, using aliases.
class SPOT_API hoa_alias_formater final
{
public:
typedef std::vector<std::pair<std::string, bdd>> aliases_t;
private:
aliases_t* aliases_;
std::unordered_map<int, unsigned> aliases_map_;
std::vector<std::pair<bdd, unsigned>> alias_cubes_;
const char* false_str_;
const char* true_str_;
const char* or_str_;
const char* and_str_;
const char* not_str_;
const char* lpar_str_;
const char* rpar_str_;
std::function<std::string(int)> ap_printer_;
public:
/// \brief Initialize this class from the aliases defined
/// for an automaton.
///
/// The aliases are taken from the named-property "aliases",
/// defined in the automaton. If no such named-property exist,
/// the aliases() method will return a null pointer.
///
/// Note that any alias that uses an atomic proposition not
/// registered in the automaton is not only ignored, but also
/// removed from the alias list stored in the automaton.
///
/// The \a or_str, \a and_str, and \ap_printer arguments are
/// used to print operators OR, AND, and to print atomic propositions
/// that are not aliases. \a lpar_str and \a rpar_str are used
/// to group conjuncts that appear in a disjunction.
hoa_alias_formater(const const_twa_graph_ptr& aut,
const char* false_str,
const char* true_str,
const char* or_str,
const char* and_str,
const char* not_str,
const char* lpar_str,
const char* rpar_str,
std::function<std::string(int)> ap_printer);
/// \brief Attempt to format a BDD label using aliases.
///
/// The returned pair should be interpreted as a disjunction
/// between an expression involving aliases, and a BDD that could
/// not be expressed using aliases.
///
/// The conversion works in several attempts, in the following order:
///
/// - If an alias A exists for \a label, `"@A"` is returned.
///
/// - If an alias A exists for the negation of \a label, `"!@A`
/// is returned.
///
/// - If \a label is true or false, `true_str` or `false_str`
/// are returned as specified at construction.
///
/// - If \a label can be built as a disjunction of positive
/// aliases, such a disjunction is returned as `"@A | @B | @C"`.
///
/// - If \a label can be built from a conjunction of
/// aliases or negated aliases, it is returned as
/// `"@A&!@B&@C"`. Note that this check first
/// attempt to use aliases that represent cubes before trying
/// other aliases.
///
/// - Otherwise \a label is split in irredundant-sum-of-products
/// and each clause is encoded as a conjunctions of (possibly
/// negated) aliases using only those that are cubes. Any
/// remaining literal is encoded with the ap_printer() function
/// passed to the constructor.
///
/// The aliases to be used are those returned by the aliases()
/// method. The vector returned by aliases() is scanned from
/// position \a aliases_start. As this vector is stored in the
/// opposite order of how aliases should be stored in the HOA
/// output, adjusting \a aliases_start is helpful to encode an
/// aliases using only previously defined aliases (i.e., aliases
/// that appear later in the sequence returned by aliases()).
std::string
encode_label(bdd label, unsigned aliases_start = 0);
/// \brief Retrieve the list of aliases.
///
/// This points to the same list that the automaton's "aliasaes"
/// named properties points to. Will return `nullptr` if no
/// aliases are defined.
///
/// \note Aliases involving atomic propositions that are not
/// declared in the automaton have been removed by this class'
/// constructor.
aliases_t* aliases()
{
return aliases_;
}
};
}