spot  2.16
ltlf2dfa.hh
1 // -*- coding: utf-8 -*-
2 // Copyright (C) by the Spot authors, see the AUTHORS file for details.
3 //
4 // This file is part of Spot, a model checking library.
5 //
6 // Spot is free software; you can redistribute it and/or modify it
7 // under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // Spot is distributed in the hope that it will be useful, but WITHOUT
12 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 // License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
19 #pragma once
20 
21 #include <spot/twa/twagraph.hh>
22 #include <spot/misc/bddlt.hh>
23 #include <spot/misc/trival.hh>
24 #include <spot/twaalgos/backprop.hh>
25 
26 namespace spot
27 {
44 
49  struct SPOT_API mtdfa_stats
50  {
55  unsigned states;
56 
62  unsigned aps;
63 
67  unsigned nodes;
68 
74  unsigned terminals;
75 
80  bool has_true;
81  bool has_false;
83 
88  unsigned long long paths;
89 
93  unsigned long long edges;
94  };
95 
116  struct SPOT_API mtdfa: public std::enable_shared_from_this<mtdfa>
117  {
118  public:
123  mtdfa(const bdd_dict_ptr& dict) noexcept
124  : dict_(dict)
125  {
126  }
127 
128  ~mtdfa()
129  {
130  dict_->unregister_all_my_variables(this);
131  }
132 
133  std::vector<bdd> states;
134  std::vector<formula> names;
144  std::vector<formula> aps;
145 
150  unsigned num_roots() const
151  {
152  return states.size();
153  }
154 
160  unsigned num_states() const
161  {
162  return states.size() + bdd_has_true(states);
163  }
164 
165  // This assumes that all states are reachable, so we just have to
166  // check if one terminal is accepting.
168  bool is_empty() const;
169 
179  std::ostream& print_dot(std::ostream& os,
180  int index = -1,
181  bool labels = true) const;
182 
200  twa_graph_ptr as_twa(bool state_based = false, bool labels = true) const;
201 
215  mtdfa_stats get_stats(bool nodes, bool paths) const;
216 
219  {
220  return dict_;
221  }
222 
235  void set_controllable_variables(const std::vector<std::string>& vars,
236  bool ignore_non_registered_ap = false);
239 
242  {
243  return controllable_variables_;
244  }
245 
246  private:
247  bdd_dict_ptr dict_;
248  bdd controllable_variables_ = bddtrue;
249  };
250 
253  typedef std::shared_ptr<mtdfa> mtdfa_ptr;
256  typedef std::shared_ptr<const mtdfa> const_mtdfa_ptr;
257 
296  SPOT_API mtdfa_ptr
298  bool fuse_same_bdds = true,
299  bool simplify_terms = true,
300  bool detect_empty_univ = true,
301  bool preserve_quantifiers_in_names = false);
302 
303 
310  };
311 
317  struct SPOT_API ltlf_synthesis_options
318  {
323  bool one_step_preprocess = true;
324 
331  bool terminating_semantics = true;
332 
334  bool fuse_same_bdds = true;
335 
337  bool simplify_terms = true;
338 
344  bool detect_empty_univ = true;
345  };
346 
393  SPOT_API mtdfa_ptr
395  const std::vector<std::string>& outvars,
396  ltlf_synthesis_backprop backprop
398  bool realizability = false,
399  ltlf_synthesis_options options = {});
400 
432  SPOT_API mtdfa_ptr
434  bool minimize = true, bool order_for_aps = true,
435  bool want_names = true,
436  bool fuse_same_bdds = true,
437  bool simplify_terms = true);
438 
457  SPOT_API mtdfa_ptr minimize_mtdfa(const mtdfa_ptr& dfa);
458 
461  SPOT_API mtdfa_ptr product(const mtdfa_ptr& dfa1, const mtdfa_ptr& dfa2);
462 
465  SPOT_API mtdfa_ptr product_or(const mtdfa_ptr& dfa1, const mtdfa_ptr& dfa2);
466 
473  SPOT_API mtdfa_ptr product_xor(const mtdfa_ptr& dfa1, const mtdfa_ptr& dfa2);
474 
481  SPOT_API mtdfa_ptr product_xnor(const mtdfa_ptr& dfa1, const mtdfa_ptr& dfa2);
482 
488  SPOT_API mtdfa_ptr product_implies(const mtdfa_ptr& dfa1,
489  const mtdfa_ptr& dfa2);
490 
493  SPOT_API mtdfa_ptr complement(const mtdfa_ptr& dfa);
494 
497  SPOT_API mtdfa_ptr trim(const mtdfa_ptr& dfa);
498 
509  SPOT_API mtdfa_ptr quantify_exists(const mtdfa_ptr& dfa, bdd vars,
510  bool trim = true);
511  SPOT_API mtdfa_ptr quantify_exists(const mtdfa_ptr& dfa,
512  const formula& ap, bool trim = true);
513  SPOT_API mtdfa_ptr quantify_exists(const mtdfa_ptr& dfa,
514  const std::vector<formula>& aps,
515  bool trim = true);
517 
528  SPOT_API mtdfa_ptr quantify_forall(const mtdfa_ptr& dfa, bdd vars,
529  bool trim = true);
530  SPOT_API mtdfa_ptr quantify_forall(const mtdfa_ptr& dfa,
531  const formula& ap, bool trim = true);
532  SPOT_API mtdfa_ptr quantify_forall(const mtdfa_ptr& dfa,
533  const std::vector<formula>& aps,
534  bool trim = true);
536 
540 
541 
548  class SPOT_API ltlf_translator
549  {
550  public:
553  bool simplify_terms = true);
554 
556  mtdfa_ptr ltlf_to_mtdfa(formula f, bool fuse_same_bdds,
557  bool detect_empty_univ = true,
558  bool preserve_quantifiers_in_names = false);
559 
561  mtdfa_ptr ltlf_to_mtdfa_synthesis(formula f, bool fuse_same_bdds,
562  bool detect_empty_univ = true,
563  const std::vector<std::string>* outvars
564  = nullptr,
565  bool do_backprop = false,
566  bool realizability = false,
567  bool one_step_preprocess = false,
568  bool bfs = true,
569  bool terminating_semantics = true,
570  bool preserve_quantifiers_in_names
571  = false);
572 
576  std::pair<formula, bool> leaf_to_formula(int b, int term) const;
577 
583  int formula_to_terminal(formula f, bool may_stop = false);
585  bdd formula_to_terminal_bdd(formula f, bool may_stop = false);
587  int formula_to_terminal_bdd_as_int(formula f, bool may_stop = false);
588 
590  bdd combine_and(bdd left, bdd right);
592  bdd combine_or(bdd left, bdd right);
594  bdd combine_implies(bdd left, bdd right);
596  bdd combine_equiv(bdd left, bdd right);
598  bdd combine_xor(bdd left, bdd right);
600  bdd combine_not(bdd b);
601 
602 
612  int formula_propeq_to_terminal(formula f, bool may_stop = false);
613 
614 
616  bddExtCache* get_cache()
617  {
618  return &cache_;
619  }
620 
621  ~ltlf_translator();
622  private:
623  std::unordered_map<formula, int> formula_to_var_;
624  std::unordered_map<formula, bdd> propositional_equiv_bdd_;
625  std::unordered_map<bdd, formula, bdd_hash> propositional_equiv_;
626  std::unordered_map<formula, int> propeq_to_int_;
627 
628  std::unordered_map<formula, bdd> formula_to_bdd_;
629  std::unordered_map<formula, int> formula_to_int_;
630  std::vector<formula> int_to_formula_;
631  bdd_dict_ptr dict_;
632  bddExtCache cache_;
633  bool simplify_terms_;
634  };
635 
649  SPOT_API std::vector<bool>
651 
664  SPOT_API std::vector<bool>
666 
667  SPOT_API std::vector<trival>
670 
680  SPOT_API mtdfa_ptr
682  const std::vector<bool>& winning_states);
683  SPOT_API mtdfa_ptr
685  const std::vector<trival>& winning_states);
687 
688 
705  SPOT_API backprop_graph
706  mtdfa_to_backprop(mtdfa_ptr dfa, bool early_stop = true,
707  bool preserve_names = false);
708 
724  SPOT_API mtdfa_ptr
725  mtdfa_winning_strategy(mtdfa_ptr dfa, bool backprop_nodes);
726 
741  SPOT_API twa_graph_ptr
742  mtdfa_strategy_to_mealy(mtdfa_ptr strategy, bool labels = true,
743  bool loop = false);
744 }
Graph used for backward propagation of winning conditions in parity games.
Definition: backprop.hh:34
Main class for temporal logic formula.
Definition: formula.hh:847
"Semi-internal" class used to implement ltlf_to_mtdfa()
Definition: ltlf2dfa.hh:549
bdd propeq_encode(formula f)
Encode a formula using propositional equivalences.
int formula_to_terminal(formula f, bool may_stop=false)
Convert a formula to a terminal index.
int formula_to_int(formula f)
Convert a formula to an integer key.
bdd formula_to_terminal_bdd(formula f, bool may_stop=false)
Convert a formula to a terminal BDD.
ltlf_translator(const bdd_dict_ptr &dict, bool simplify_terms=true)
Construct the translator with the given BDD dictionary.
std::pair< formula, bool > leaf_to_formula(int b, int term) const
Convert a leaf value to a formula.
bdd combine_equiv(bdd left, bdd right)
Combine two BDDs with equivalence.
formula propeq_representative(formula f)
Get the representative for a propositional equiv.
int formula_propeq_to_terminal(formula f, bool may_stop=false)
Convert propositional equiv formula to terminal.
bdd combine_implies(bdd left, bdd right)
Combine two BDDs with implication.
int formula_propeq_to_terminal_bdd_as_int(formula f, bool may_stop)
Convert propositional equiv formula to terminal BDD int.
bdd combine_and(bdd left, bdd right)
Combine two BDDs with logical AND.
bddExtCache * get_cache()
Return a pointer to the internal BDD cache.
Definition: ltlf2dfa.hh:616
bdd ltlf_to_mtbdd(formula f)
Convert an LTLf formula to an MTBDD.
int formula_to_terminal_bdd_as_int(formula f, bool may_stop=false)
Convert a formula to a terminal BDD integer.
bdd combine_xor(bdd left, bdd right)
Combine two BDDs with exclusive OR.
mtdfa_ptr ltlf_to_mtdfa_synthesis(formula f, bool fuse_same_bdds, bool detect_empty_univ=true, const std::vector< std::string > *outvars=nullptr, bool do_backprop=false, bool realizability=false, bool one_step_preprocess=false, bool bfs=true, bool terminating_semantics=true, bool preserve_quantifiers_in_names=false)
Translate an LTLf formula to MTdfa for synthesis.
bdd combine_or(bdd left, bdd right)
Combine two BDDs with logical OR.
bdd combine_not(bdd b)
Negate a BDD.
formula terminal_to_formula(int t) const
Convert a terminal integer to a formula.
mtdfa_ptr ltlf_to_mtdfa(formula f, bool fuse_same_bdds, bool detect_empty_univ=true, bool preserve_quantifiers_in_names=false)
Translate an LTLf formula to a Multi-Terminal DFA.
int formula_propeq_to_int(formula f)
Convert propositional equiv formula to int.
A Transition-based ω-Automaton.
Definition: twa.hh:648
mtdfa_ptr product_or(const mtdfa_ptr &dfa1, const mtdfa_ptr &dfa2)
Combine two MTDFAs to sum their languages.
mtdfa_ptr twadfa_to_mtdfa(const twa_graph_ptr &twa)
Convert a TWA (representing a DFA) into an MTDFA.
mtdfa_ptr product_xor(const mtdfa_ptr &dfa1, const mtdfa_ptr &dfa2)
Combine two MTDFAs to build the exclusive sum of their languages.
mtdfa_ptr ltlf_to_mtdfa_for_synthesis(formula f, const bdd_dict_ptr &dict, const std::vector< std::string > &outvars, ltlf_synthesis_backprop backprop=dfs_node_backprop, bool realizability=false, ltlf_synthesis_options options={})
Solve (or start solving) LTLf synthesis.
mtdfa_ptr product_xnor(const mtdfa_ptr &dfa1, const mtdfa_ptr &dfa2)
Combine two MTDFAs to keep words that are handled similarly in both operands.
mtdfa_ptr ltlf_to_mtdfa_compose(formula f, const bdd_dict_ptr &dict, bool minimize=true, bool order_for_aps=true, bool want_names=true, bool fuse_same_bdds=true, bool simplify_terms=true)
Convert an LTLf formula into a MTDFA, with a compositional approach.
std::shared_ptr< const mtdfa > const_mtdfa_ptr
Shared pointer to a const mtdfa.
Definition: ltlf2dfa.hh:256
mtdfa_ptr ltlf_to_mtdfa(formula f, const bdd_dict_ptr &dict, bool fuse_same_bdds=true, bool simplify_terms=true, bool detect_empty_univ=true, bool preserve_quantifiers_in_names=false)
Convert an LTLf formula into an MTDFA.
twa_graph_ptr mtdfa_strategy_to_mealy(mtdfa_ptr strategy, bool labels=true, bool loop=false)
Convert an MTDFA representing a strategy to a TwA with the "synthesis-output" property.
mtdfa_ptr product(const mtdfa_ptr &dfa1, const mtdfa_ptr &dfa2)
Combine two MTDFAs to intersect their languages.
ltlf_synthesis_backprop
Backpropagation mode for LTLf synthesis.
Definition: ltlf2dfa.hh:306
mtdfa_ptr trim(const mtdfa_ptr &dfa)
Trim an MTDFA.
mtdfa_ptr quantify_forall(const mtdfa_ptr &dfa, bdd vars, bool trim=true)
Universally quantify variables in an MTDFA.
mtdfa_ptr minimize_mtdfa(const mtdfa_ptr &dfa)
Minimize a MTDFA.
mtdfa_ptr mtdfa_winning_strategy(mtdfa_ptr dfa, bool backprop_nodes)
Compute a strategy for an MTDFA interpreted as a game.
std::vector< bool > mtdfa_winning_region(mtdfa_ptr dfa)
Compute the winning region of the MTDFA interpreted as a game.
std::shared_ptr< mtdfa > mtdfa_ptr
Shared pointer to a mtdfa.
Definition: ltlf2dfa.hh:253
mtdfa_ptr mtdfa_restrict_as_game(mtdfa_ptr dfa)
Build a generalized strategy from a set of winning states.
backprop_graph mtdfa_to_backprop(mtdfa_ptr dfa, bool early_stop=true, bool preserve_names=false)
Build a backprop_graph from dfa.
mtdfa_ptr quantify_exists(const mtdfa_ptr &dfa, bdd vars, bool trim=true)
Existentially quantify variables in an MTDFA.
mtdfa_ptr product_implies(const mtdfa_ptr &dfa1, const mtdfa_ptr &dfa2)
Combine two MTDFAs to build an implication.
@ state_refine
no backpropagation, just local refinement
Definition: ltlf2dfa.hh:307
@ dfs_node_backprop
on-the-fly, DFS
Definition: ltlf2dfa.hh:309
@ bfs_node_backprop
on-the-fly, BFS
Definition: ltlf2dfa.hh:308
twa_graph_ptr complement(const const_twa_graph_ptr &aut, const output_aborter *aborter=nullptr)
Complement a TωA.
std::shared_ptr< bdd_dict > bdd_dict_ptr
Shared pointer to a bdd_dict.
Definition: bdddict.hh:304
std::shared_ptr< twa_graph > twa_graph_ptr
Shared pointer to a mutable twa_graph.
Definition: fwd.hh:44
Definition: automata.hh:26
std::vector< bool > mtdfa_winning_region_lazy(mtdfa_ptr dfa)
Compute the winning region of the MTDFA interpreted as a game. Lazy version.
std::vector< trival > mtdfa_winning_region_lazy3(mtdfa_ptr dfa)
Compute the winning region of the MTDFA interpreted as a game. Lazy version.
Fine-tuning options for LTLf synthesis.
Definition: ltlf2dfa.hh:318
statistics about an mtdfa instance
Definition: ltlf2dfa.hh:50
unsigned nodes
Number of internal nodes (or decision nodes)
Definition: ltlf2dfa.hh:67
unsigned long long paths
Number of paths between a root and a leaf (terminal or constant)
Definition: ltlf2dfa.hh:88
unsigned terminals
Number of terminal nodes.
Definition: ltlf2dfa.hh:74
unsigned aps
number of atomic propositions
Definition: ltlf2dfa.hh:62
bool has_false
Whether the true and false constants are used.
Definition: ltlf2dfa.hh:81
bool has_true
Whether the true and false constants are used.
Definition: ltlf2dfa.hh:80
unsigned states
number of roots
Definition: ltlf2dfa.hh:55
unsigned long long edges
Number of pairs (root, leaf) for which a path exists.
Definition: ltlf2dfa.hh:93
A DFA represented using shared multi-terminal BDDs.
Definition: ltlf2dfa.hh:117
unsigned num_states() const
The number of states in the automaton.
Definition: ltlf2dfa.hh:160
twa_graph_ptr as_twa(bool state_based=false, bool labels=true) const
Convert this automaton to a spot::twa_graph.
std::ostream & print_dot(std::ostream &os, int index=-1, bool labels=true) const
Print the states array of MTBDD in graphviz format.
void set_controllable_variables(const std::vector< std::string > &vars, bool ignore_non_registered_ap=false)
Declare a list of controllable variables.
bdd_dict_ptr get_dict() const
Get the bdd_dict associated to this automaton.
Definition: ltlf2dfa.hh:218
std::vector< formula > aps
The list of atomic propositions possibly used by the automaton.
Definition: ltlf2dfa.hh:144
void set_controllable_variables(bdd vars)
Declare a list of controllable variables.
std::vector< formula > names
Definition: ltlf2dfa.hh:134
mtdfa_stats get_stats(bool nodes, bool paths) const
Compute some statistics about the automaton.
bdd get_controllable_variables() const
Returns the conjunction of controllable variables.
Definition: ltlf2dfa.hh:241
std::vector< bdd > states
BDD transitions for each root state.
Definition: ltlf2dfa.hh:133
unsigned num_roots() const
The number of MTBDDs roots.
Definition: ltlf2dfa.hh:150
bool is_empty() const
Check if the automaton recognizes the empty language.
mtdfa(const bdd_dict_ptr &dict) noexcept
Create an empty mtdfa.
Definition: ltlf2dfa.hh:123

Please direct any question, comment, or bug report to the Spot mailing list at spot@lrde.epita.fr.
Generated on Fri Feb 27 2015 10:00:07 for spot by doxygen 1.9.1