* bin/autfilt.cc, bin/common_aoutput.cc, bin/common_aoutput.hh, bin/common_finput.cc, bin/common_finput.hh, bin/common_hoaread.cc, bin/common_output.cc, bin/common_output.hh, bin/common_post.cc, bin/common_post.hh, bin/common_r.hh, bin/common_range.cc, bin/common_range.hh, bin/common_setup.cc, bin/common_trans.cc, bin/common_trans.hh, bin/dstar2tgba.cc, bin/genltl.cc, bin/ltl2tgba.cc, bin/ltl2tgta.cc, bin/ltlcross.cc, bin/ltldo.cc, bin/ltlfilt.cc, bin/ltlgrind.cc, bin/randaut.cc, bin/randltl.cc, bin/spot-x.cc, spot/graph/graph.hh, spot/graph/ngraph.hh, spot/kripke/kripkegraph.hh, spot/ltsmin/ltsmin.cc, spot/ltsmin/ltsmin.hh, spot/misc/bareword.cc, spot/misc/bitvect.cc, spot/misc/bitvect.hh, spot/misc/common.hh, spot/misc/escape.cc, spot/misc/fixpool.hh, spot/misc/formater.cc, spot/misc/hash.hh, spot/misc/intvcmp2.cc, spot/misc/intvcmp2.hh, spot/misc/intvcomp.cc, spot/misc/intvcomp.hh, spot/misc/location.hh, spot/misc/minato.cc, spot/misc/minato.hh, spot/misc/mspool.hh, spot/misc/optionmap.cc, spot/misc/optionmap.hh, spot/misc/random.cc, spot/misc/random.hh, spot/misc/satsolver.cc, spot/misc/satsolver.hh, spot/misc/timer.cc, spot/misc/timer.hh, spot/misc/tmpfile.cc, spot/misc/trival.hh, spot/parseaut/fmterror.cc, spot/parseaut/parsedecl.hh, spot/parseaut/public.hh, spot/parsetl/fmterror.cc, spot/parsetl/parsedecl.hh, spot/priv/accmap.hh, spot/priv/bddalloc.cc, spot/priv/freelist.cc, spot/priv/trim.cc, spot/priv/weight.cc, spot/priv/weight.hh, spot/ta/taexplicit.cc, spot/ta/taexplicit.hh, spot/ta/taproduct.cc, spot/ta/taproduct.hh, spot/ta/tgtaexplicit.cc, spot/ta/tgtaexplicit.hh, spot/ta/tgtaproduct.cc, spot/ta/tgtaproduct.hh, spot/taalgos/dot.cc, spot/taalgos/dot.hh, spot/taalgos/emptinessta.cc, spot/taalgos/emptinessta.hh, spot/taalgos/minimize.cc, spot/taalgos/tgba2ta.cc, spot/taalgos/tgba2ta.hh, spot/tl/apcollect.cc, spot/tl/contain.cc, spot/tl/contain.hh, spot/tl/dot.cc, spot/tl/exclusive.cc, spot/tl/exclusive.hh, spot/tl/formula.cc, spot/tl/formula.hh, spot/tl/length.cc, spot/tl/mark.cc, spot/tl/mutation.cc, spot/tl/mutation.hh, spot/tl/parse.hh, spot/tl/print.cc, spot/tl/print.hh, spot/tl/randomltl.cc, spot/tl/randomltl.hh, spot/tl/relabel.cc, spot/tl/relabel.hh, spot/tl/remove_x.cc, spot/tl/simplify.cc, spot/tl/simplify.hh, spot/tl/snf.cc, spot/tl/snf.hh, spot/tl/unabbrev.cc, spot/tl/unabbrev.hh, spot/twa/acc.cc, spot/twa/acc.hh, spot/twa/bdddict.cc, spot/twa/bdddict.hh, spot/twa/bddprint.cc, spot/twa/formula2bdd.cc, spot/twa/formula2bdd.hh, spot/twa/taatgba.cc, spot/twa/taatgba.hh, spot/twa/twa.cc, spot/twa/twa.hh, spot/twa/twagraph.cc, spot/twa/twagraph.hh, spot/twa/twaproduct.cc, spot/twa/twaproduct.hh, spot/twaalgos/are_isomorphic.cc, spot/twaalgos/are_isomorphic.hh, spot/twaalgos/bfssteps.cc, spot/twaalgos/bfssteps.hh, spot/twaalgos/cleanacc.cc, spot/twaalgos/complete.cc, spot/twaalgos/compsusp.cc, spot/twaalgos/compsusp.hh, spot/twaalgos/copy.cc, spot/twaalgos/cycles.cc, spot/twaalgos/cycles.hh, spot/twaalgos/degen.cc, spot/twaalgos/degen.hh, spot/twaalgos/determinize.cc, spot/twaalgos/determinize.hh, spot/twaalgos/dot.cc, spot/twaalgos/dot.hh, spot/twaalgos/dtbasat.cc, spot/twaalgos/dtbasat.hh, spot/twaalgos/dtwasat.cc, spot/twaalgos/dtwasat.hh, spot/twaalgos/emptiness.cc, spot/twaalgos/emptiness.hh, spot/twaalgos/emptiness_stats.hh, spot/twaalgos/gtec/ce.cc, spot/twaalgos/gtec/ce.hh, spot/twaalgos/gtec/gtec.cc, spot/twaalgos/gtec/gtec.hh, spot/twaalgos/gtec/sccstack.cc, spot/twaalgos/gtec/status.cc, spot/twaalgos/gv04.cc, spot/twaalgos/hoa.cc, spot/twaalgos/hoa.hh, spot/twaalgos/isdet.cc, spot/twaalgos/isunamb.cc, spot/twaalgos/isweakscc.cc, spot/twaalgos/lbtt.cc, spot/twaalgos/lbtt.hh, spot/twaalgos/ltl2taa.cc, spot/twaalgos/ltl2taa.hh, spot/twaalgos/ltl2tgba_fm.cc, spot/twaalgos/ltl2tgba_fm.hh, spot/twaalgos/magic.cc, spot/twaalgos/magic.hh, spot/twaalgos/mask.cc, spot/twaalgos/mask.hh, spot/twaalgos/minimize.cc, spot/twaalgos/minimize.hh, spot/twaalgos/ndfs_result.hxx, spot/twaalgos/neverclaim.cc, spot/twaalgos/neverclaim.hh, spot/twaalgos/postproc.cc, spot/twaalgos/postproc.hh, spot/twaalgos/powerset.cc, spot/twaalgos/powerset.hh, spot/twaalgos/product.cc, spot/twaalgos/product.hh, spot/twaalgos/projrun.cc, spot/twaalgos/projrun.hh, spot/twaalgos/randomgraph.cc, spot/twaalgos/randomgraph.hh, spot/twaalgos/randomize.cc, spot/twaalgos/randomize.hh, spot/twaalgos/reachiter.cc, spot/twaalgos/reachiter.hh, spot/twaalgos/relabel.cc, spot/twaalgos/relabel.hh, spot/twaalgos/remfin.cc, spot/twaalgos/remprop.cc, spot/twaalgos/sbacc.cc, spot/twaalgos/sccfilter.cc, spot/twaalgos/sccfilter.hh, spot/twaalgos/sccinfo.cc, spot/twaalgos/sccinfo.hh, spot/twaalgos/se05.cc, spot/twaalgos/se05.hh, spot/twaalgos/sepsets.cc, spot/twaalgos/simulation.cc, spot/twaalgos/simulation.hh, spot/twaalgos/stats.cc, spot/twaalgos/stats.hh, spot/twaalgos/strength.cc, spot/twaalgos/strength.hh, spot/twaalgos/stripacc.cc, spot/twaalgos/stutter.cc, spot/twaalgos/stutter.hh, spot/twaalgos/tau03.cc, spot/twaalgos/tau03opt.cc, spot/twaalgos/tau03opt.hh, spot/twaalgos/totgba.cc, spot/twaalgos/translate.cc, spot/twaalgos/word.cc, tests/core/acc.cc, tests/core/bitvect.cc, tests/core/checkpsl.cc, tests/core/checkta.cc, tests/core/consterm.cc, tests/core/emptchk.cc, tests/core/equalsf.cc, tests/core/graph.cc, tests/core/ikwiad.cc, tests/core/intvcmp2.cc, tests/core/intvcomp.cc, tests/core/kind.cc, tests/core/kripkecat.cc, tests/core/ltlrel.cc, tests/core/ngraph.cc, tests/core/randtgba.cc, tests/core/readltl.cc, tests/core/reduc.cc, tests/core/safra.cc, tests/core/syntimpl.cc, tests/ltsmin/modelcheck.cc: Replace tabulars by 8 spaces. * tests/sanity/style.test: Add checks for no tabulars in *.cc *.hh *.hxx
246 lines
6.9 KiB
C++
246 lines
6.9 KiB
C++
// -*- coding: utf-8 -*-
|
|
// Copyright (C) 2014, 2015, 2016 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 "common_sys.hh"
|
|
|
|
#include <argp.h>
|
|
#include <memory>
|
|
|
|
#include <spot/parseaut/public.hh>
|
|
|
|
#include <spot/twaalgos/stats.hh>
|
|
#include <spot/twaalgos/sccinfo.hh>
|
|
#include <spot/twaalgos/gtec/gtec.hh>
|
|
#include <spot/twaalgos/word.hh>
|
|
#include <spot/twaalgos/isdet.hh>
|
|
#include "common_file.hh"
|
|
|
|
|
|
// Format for automaton output
|
|
enum automaton_format_t {
|
|
Dot,
|
|
Lbtt,
|
|
Spin,
|
|
Stats,
|
|
Hoa,
|
|
Quiet,
|
|
Count,
|
|
};
|
|
|
|
// The format to use in output_automaton()
|
|
extern automaton_format_t automaton_format;
|
|
// Set to the argument of --name, else nullptr.
|
|
extern const char* opt_name;
|
|
// Output options
|
|
extern const struct argp aoutput_argp;
|
|
|
|
// help text for %F and %L
|
|
extern char F_doc[32];
|
|
extern char L_doc[32];
|
|
|
|
// FORMAT help text
|
|
extern const struct argp aoutput_io_format_argp;
|
|
extern const struct argp aoutput_o_format_argp;
|
|
|
|
// Parse output options
|
|
int parse_opt_aoutput(int key, char* arg, struct argp_state* state);
|
|
|
|
|
|
enum stat_style { no_input, aut_input, ltl_input };
|
|
|
|
/// \brief prints various statistics about a TGBA
|
|
///
|
|
/// This object can be configured to display various statistics
|
|
/// about a TGBA. Some %-sequence of characters are interpreted in
|
|
/// the format string, and replaced by the corresponding statistics.
|
|
class hoa_stat_printer: protected spot::stat_printer
|
|
{
|
|
public:
|
|
hoa_stat_printer(std::ostream& os, const char* format,
|
|
stat_style input = no_input)
|
|
: spot::stat_printer(os, format)
|
|
{
|
|
if (input == aut_input)
|
|
{
|
|
declare('A', &haut_acc_);
|
|
declare('C', &haut_scc_);
|
|
declare('E', &haut_edges_);
|
|
declare('G', &haut_gen_acc_);
|
|
declare('M', &haut_name_);
|
|
declare('S', &haut_states_);
|
|
declare('T', &haut_trans_);
|
|
}
|
|
declare('<', &csv_prefix_);
|
|
declare('>', &csv_suffix_);
|
|
declare('F', &filename_);
|
|
declare('L', &location_);
|
|
if (input != ltl_input)
|
|
declare('f', &filename_); // Override the formula printer.
|
|
declare('m', &aut_name_);
|
|
declare('w', &aut_word_);
|
|
}
|
|
|
|
using spot::formater::declare;
|
|
using spot::formater::set_output;
|
|
|
|
/// \brief print the configured statistics.
|
|
///
|
|
/// The \a f argument is not needed if the Formula does not need
|
|
/// to be output.
|
|
std::ostream&
|
|
print(const spot::const_parsed_aut_ptr& haut,
|
|
const spot::const_twa_graph_ptr& aut,
|
|
spot::formula f,
|
|
const char* filename, int loc, double run_time,
|
|
const char* csv_prefix, const char* csv_suffix)
|
|
{
|
|
filename_ = filename ? filename : "";
|
|
csv_prefix_ = csv_prefix ? csv_prefix : "";
|
|
csv_suffix_ = csv_suffix ? csv_suffix : "";
|
|
if (loc >= 0 && has('L'))
|
|
{
|
|
std::ostringstream os;
|
|
os << loc;
|
|
location_ = os.str();
|
|
}
|
|
if (haut)
|
|
{
|
|
if (loc < 0 && has('L'))
|
|
{
|
|
std::ostringstream os;
|
|
os << haut->loc;
|
|
location_ = os.str();
|
|
}
|
|
|
|
if (has('T'))
|
|
{
|
|
spot::twa_sub_statistics s = sub_stats_reachable(haut->aut);
|
|
haut_states_ = s.states;
|
|
haut_edges_ = s.edges;
|
|
haut_trans_ = s.transitions;
|
|
}
|
|
else if (has('E'))
|
|
{
|
|
spot::twa_sub_statistics s = sub_stats_reachable(haut->aut);
|
|
haut_states_ = s.states;
|
|
haut_edges_ = s.edges;
|
|
}
|
|
if (has('M'))
|
|
{
|
|
auto n = haut->aut->get_named_prop<std::string>("automaton-name");
|
|
if (n)
|
|
haut_name_ = *n;
|
|
else
|
|
haut_name_.val().clear();
|
|
}
|
|
if (has('S'))
|
|
haut_states_ = haut->aut->num_states();
|
|
|
|
if (has('A'))
|
|
haut_acc_ = haut->aut->acc().num_sets();
|
|
|
|
if (has('C'))
|
|
haut_scc_ = spot::scc_info(haut->aut).scc_count();
|
|
|
|
if (has('G'))
|
|
{
|
|
std::ostringstream os;
|
|
os << haut->aut->get_acceptance();
|
|
haut_gen_acc_ = os.str();
|
|
}
|
|
}
|
|
|
|
if (has('m'))
|
|
{
|
|
auto n = aut->get_named_prop<std::string>("automaton-name");
|
|
if (n)
|
|
aut_name_ = *n;
|
|
else
|
|
aut_name_.val().clear();
|
|
}
|
|
if (has('w'))
|
|
{
|
|
auto res = spot::couvreur99(aut)->check();
|
|
if (res)
|
|
{
|
|
auto run = res->accepting_run();
|
|
assert(run);
|
|
spot::twa_word w(run->reduce());
|
|
w.simplify();
|
|
std::ostringstream out;
|
|
out << w;
|
|
aut_word_ = out.str();
|
|
}
|
|
else
|
|
{
|
|
aut_word_.val().clear();
|
|
}
|
|
}
|
|
|
|
return this->spot::stat_printer::print(aut, f, run_time);
|
|
}
|
|
|
|
private:
|
|
spot::printable_value<const char*> filename_;
|
|
spot::printable_value<std::string> location_;
|
|
spot::printable_value<std::string> haut_name_;
|
|
spot::printable_value<std::string> aut_name_;
|
|
spot::printable_value<std::string> aut_word_;
|
|
spot::printable_value<std::string> haut_gen_acc_;
|
|
spot::printable_value<unsigned> haut_states_;
|
|
spot::printable_value<unsigned> haut_edges_;
|
|
spot::printable_value<unsigned> haut_trans_;
|
|
spot::printable_value<unsigned> haut_acc_;
|
|
spot::printable_value<unsigned> haut_scc_;
|
|
spot::printable_value<const char*> csv_prefix_;
|
|
spot::printable_value<const char*> csv_suffix_;
|
|
};
|
|
|
|
|
|
class automaton_printer
|
|
{
|
|
hoa_stat_printer statistics;
|
|
std::ostringstream name;
|
|
hoa_stat_printer namer;
|
|
std::ostringstream outputname;
|
|
hoa_stat_printer outputnamer;
|
|
std::map<std::string, std::unique_ptr<output_file>> outputfiles;
|
|
|
|
public:
|
|
|
|
automaton_printer(stat_style input = no_input);
|
|
|
|
void
|
|
print(const spot::twa_graph_ptr& aut,
|
|
spot::formula f = nullptr,
|
|
// Input location for errors and statistics.
|
|
const char* filename = nullptr,
|
|
int loc = -1,
|
|
// Time and input automaton for statistics
|
|
double time = 0.0,
|
|
const spot::const_parsed_aut_ptr& haut = nullptr,
|
|
const char* csv_prefix = nullptr,
|
|
const char* csv_suffix = nullptr);
|
|
|
|
void add_stat(char c, const spot::printable* p);
|
|
};
|
|
|
|
void setup_default_output_format();
|