16#ifndef MCRL2_DATA_LINEAR_INEQUALITY_H
17#define MCRL2_DATA_LINEAR_INEQUALITY_H
22#include "mcrl2/data/rewriter.h"
23#include "mcrl2/data/substitutions/map_substitution.h"
46 return application(times_f,arg0,arg1);
53 return application(plus_f,arg0,arg1);
60 return application(divides_f,arg0,arg1);
67 return application(minus_f,arg0,arg1);
74 return application(negate_f,arg);
81 return application(abs_f,arg);
121 case detail::less:
return "<";
122 case detail::less_eq:
return "<=";
123 case detail::equal:
return "==";
130 static atermpp::function_symbol f(
"variable_with_a_rational_factor",2);
148 return atermpp::down_cast<variable>((*
this)[0]);
155 return atermpp::down_cast<data_expression>((*
this)[1]);
161 return function()==f_variable_with_a_rational_factor();
187 template <
class ITERATOR>
188 lhs_t(
const ITERATOR begin,
const ITERATOR end)
193 template <
class ITERATOR,
class TRANSFORMER>
194 lhs_t(
const ITERATOR begin,
const ITERATOR end, TRANSFORMER f)
201 return std::find_if(begin(),
203 [&](
const detail::variable_with_a_rational_factor& p)
204 {
return p.variable_name()==v;});
210 std::vector <variable_with_a_rational_factor> result;
211 for(
const variable_with_a_rational_factor& p: *
this)
213 if (p.variable_name()!=v)
218 return lhs_t(result.begin(),result.end());
224 lhs_t::const_iterator i=find(v);
235 lhs_t::const_iterator i=find(v);
244 template <IsSubstitution SubstitutionFunction>
248 bool result_defined=
false;
249 for (
const variable_with_a_rational_factor& p: *
this)
253 result=rewrite_with_memory(real_plus(result,real_times(beta(p.variable_name()),p.factor())), r);
257 result=rewrite_with_memory(real_times(beta(p.variable_name()),p.factor()), r);
274 for(
const variable_with_a_rational_factor& p: *
this)
276 if (result==real_zero())
278 result=p.transform_to_data_expression();
282 result=real_plus(result,p.transform_to_data_expression());
294 detail::map_based_lhs_t::iterator i=new_lhs.find(x);
295 if (i!=new_lhs.end())
310 std::vector<variable_with_a_rational_factor> result;
311 for(
const variable_with_a_rational_factor& p: lhs)
313 if (!inserted && x<=p.variable_name())
315 result.emplace_back(x,e);
317 if (x!=p.variable_name())
319 result.emplace_back(p.variable_name(),p.factor());
324 result.emplace_back(p.variable_name(), p.factor());
329 result.emplace_back(x,e);
331 assert(std::find(result.begin(),result.end(),variable_with_a_rational_factor(x,e))!=result.end());
332 return lhs_t(result.begin(),result.end());
338 for (
const std::pair<
const variable, data_expression>& expr: std::ranges::reverse_view(lhs))
340 result.push_front(variable_with_a_rational_factor(expr.first,expr.second));
349 for (
const std::pair<
const variable, data_expression>& expr: std::ranges::reverse_view(lhs))
351 result.push_front(variable_with_a_rational_factor(expr.first, rewrite_with_memory(real_divides(expr.second,factor), r)));
366 variable last_variable_seen=lhs.front().variable_name();
368 for(
const variable_with_a_rational_factor& p: lhs)
373 if (p.variable_name()<=last_variable_seen)
377 last_variable_seen=p.variable_name();
385 std::vector <variable_with_a_rational_factor> result;
386 for(
const variable_with_a_rational_factor& p: lhs)
388 if (p.variable_name()!=v)
390 result.emplace_back(p.variable_name(),rewrite_with_memory(real_divides(p.factor(),f), r));
393 return lhs_t(result.begin(),result.end());
571 detail::map_based_lhs_t& new_lhs,
574 const bool negate =
false,
579 parse_and_store_expression(binary_left1(e),new_lhs,new_rhs,r,negate,factor);
580 parse_and_store_expression(binary_right1(e),new_lhs,new_rhs,r,!negate,factor);
584 parse_and_store_expression(unary_operand1(e),new_lhs,new_rhs,r,!negate,factor);
588 parse_and_store_expression(binary_left1(e),new_lhs,new_rhs,r,negate,factor);
589 parse_and_store_expression(binary_right1(e),new_lhs,new_rhs,r,negate,factor);
597 parse_and_store_expression(rhs,new_lhs,new_rhs,r,negate,real_times(lhs,factor));
601 parse_and_store_expression(lhs,new_lhs,new_rhs,r,negate,real_times(rhs,factor));
605 throw mcrl2::runtime_error(
"Expect constant multiplies expression: " + pp(e) +
"\n");
610 const variable& v = atermpp::down_cast<variable>(e);
613 throw mcrl2::runtime_error(
"Encountered a variable in a real expression which is not of sort real: " + pp(e) +
"\n");
615 const detail::map_based_lhs_t::const_iterator var_factor = new_lhs.find(v);
618 const data_expression new_factor(var_factor == new_lhs.end() ? neg_factor : real_plus(var_factor->second, neg_factor));
619 detail::set_factor_for_a_variable(new_lhs, v, rewrite_with_memory(new_factor, r));
633 throw mcrl2::runtime_error(
"Expect linear expression over reals: " + pp(e) +
"\n");
681 const bool negate=
false)
683 detail::map_based_lhs_t new_lhs;
685 parse_and_store_expression(lhs,new_lhs,new_rhs,r,negate);
686 parse_and_store_expression(rhs,new_lhs,new_rhs,r,!negate);
707 *
this=linear_inequality(detail::map_to_lhs_type(new_lhs),new_rhs,comparison);
712 *
this=linear_inequality(detail::map_to_lhs_type(new_lhs,factor,r),rewrite_with_memory(real_divides(new_rhs,factor), r),comparison);
730 if (is_equal_to_application(e))
734 else if (is_less_application(e))
738 else if (is_less_equal_application(e))
742 else if (is_greater_application(e))
747 else if (is_greater_equal_application(e))
754 throw mcrl2::runtime_error(
"Unexpected equality or inequality: " + pp(e) +
"\n") ;
757 data_expression lhs=data::binary_left(atermpp::down_cast<application>(e));
758 data_expression rhs=data::binary_right(atermpp::down_cast<application>(e));
766 return lhs().begin();
776 return atermpp::down_cast<detail::lhs_t>((*
this)[0]);
781 return atermpp::down_cast<data_expression>((*
this)[1]);
791 if (
this->function()==detail::linear_inequality_less())
795 else if (
this->function()==detail::linear_inequality_less_equal())
799 assert(
this->function()==detail::linear_inequality_equal());
820 return lhs().empty() &&
827 return lhs().empty() &&
841 if (lhs_begin()==lhs_end())
851 for (detail::lhs_t::const_iterator i=lhs_begin(); i!=lhs_end(); ++i)
853 variable v=i->variable_name();
854 data_expression e=real_times(rewrite_with_memory(real_divides(i->factor(),factor),r),
862 lhs_expression=real_plus(lhs_expression,e);
902 for (
const detail::variable_with_a_rational_factor& i : lhs())
904 variable_set.insert(i.variable_name());
911 return pp(l.lhs()) +
" " + detail::pp(l.comparison()) +
" " + pp(l.rhs());
923 return linear_inequality(
924 detail::meta_operation_lhs(e1.lhs(),e2.lhs(),
925 [&](
const data_expression& d1,
const data_expression& d2)->data_expression
926 {
return real_minus(d1,real_times(f,d2)); },r),
927 rewrite_with_memory(real_minus(e1.rhs(),real_times(f,e2.rhs())),r),
950 return real_minus_one;
963 throw mcrl2::runtime_error(
"Fail to determine the minimum of: " + pp(e1) +
" and " + pp(e2) +
"\n");
976 throw mcrl2::runtime_error(
"Fail to determine the maximum of: " + pp(e1) +
" and " + pp(e2) +
"\n");
986 std::set < variable > s=find_all_variables(e);
1001 throw mcrl2::runtime_error(
"Cannot determine that " + pp(e) +
" is smaller than 0");
1015 throw mcrl2::runtime_error(
"Cannot determine that " + pp(e) +
" is larger than or equal to 0");
1026template <
class TYPE>
1033 s=s+ (first?
"":
", ") + pp(l);
1040bool is_inconsistent(
const std::vector<linear_inequality>& inequalities_in,
const rewriter& r,
bool use_cache =
true);
1044void count_occurrences(
1045 const std::vector < linear_inequality >& inequalities,
1046 std::map < variable, std::size_t>& nr_positive_occurrences,
1047 std::map < variable, std::size_t>& nr_negative_occurrences,
1050 for (
const auto & inequalitie : inequalities)
1052 for (detail::lhs_t::const_iterator j=inequalitie.lhs_begin(); j!=inequalitie.lhs_end(); ++j)
1054 if (is_positive(j->factor(),r))
1056 nr_positive_occurrences[j->variable_name()]=nr_positive_occurrences[j->variable_name()]+1;
1060 nr_negative_occurrences[j->variable_name()]=nr_negative_occurrences[j->variable_name()]+1;
1066template <
class Variable_iterator >
1087inline bool is_a_redundant_inequality(
1088 const std::vector < linear_inequality >& inequalities,
1089 const std::vector<linear_inequality>::iterator i,
1095 for (std::vector < linear_inequality >:: const_iterator j=inequalities.begin() ;
1096 j!=inequalities.end() ; ++j)
1108 if (i->comparison()==detail::equal)
1113 *i=linear_inequality(i->lhs(),i->rhs(),detail::less);
1114 if (is_inconsistent(inequalities,r))
1117 if (is_inconsistent(inequalities,r))
1132 if (is_inconsistent(inequalities,r))
1156 const std::vector < linear_inequality >& inequalities,
1157 std::vector < linear_inequality >& resulting_inequalities,
1160 assert(resulting_inequalities.empty());
1161 if (inequalities.empty())
1167 if (is_inconsistent(inequalities,r))
1169 resulting_inequalities.emplace_back();
1173 resulting_inequalities=inequalities;
1174 for (std::size_t i=0; i<resulting_inequalities.size();)
1178 if (resulting_inequalities[i].comparison()==detail::equal)
1185 if (is_a_redundant_inequality(resulting_inequalities,
1186 resulting_inequalities.begin()+
static_cast<std::ptrdiff_t>(i),
1190
1191
1192
1193
1194
1195
1196 resulting_inequalities.erase(resulting_inequalities.begin()+
static_cast<std::ptrdiff_t>(i));
1208static void pivot_and_update(
1213 std::map < variable,data_expression >& beta,
1214 std::map < variable,data_expression >& beta_delta_correction,
1215 std::set < variable >& basic_variables,
1216 std::map < variable, detail::lhs_t >& working_equalities,
1219 mCRL2log(log::trace) <<
"Pivoting " << pp(xi) <<
" " << pp(xj) <<
"\n";
1221 const data_expression theta=rewrite_with_memory(real_divides(real_minus(v,beta[xi]),aij),r);
1222 const data_expression theta_delta_correction=rewrite_with_memory(real_divides(real_minus(v,beta_delta_correction[xi]),aij),r);
1224 beta_delta_correction[xi]=v_delta_correction;
1225 beta[xj]=rewrite_with_memory(real_plus(beta[xj],theta),r);
1226 beta_delta_correction[xj]=rewrite_with_memory(real_plus(beta_delta_correction[xj],theta_delta_correction),r);
1228 mCRL2log(log::trace) <<
"Pivoting phase 0\n";
1229 for (
const variable& basic_variable: basic_variables)
1231 mCRL2log(log::trace) <<
"Working equalities " << basic_variable <<
": " << pp(working_equalities[basic_variable]) <<
"\n";
1232 if ((basic_variable!=xi) && (working_equalities[basic_variable].count(xj)>0))
1234 const data_expression akj=working_equalities[basic_variable][xj];
1235 beta[basic_variable]=rewrite_with_memory(real_plus(beta[basic_variable],real_times(akj ,theta)),r);
1236 beta_delta_correction[basic_variable]=rewrite_with_memory(real_plus(beta_delta_correction[basic_variable],real_times(akj ,theta_delta_correction)),r);
1240 mCRL2log(log::trace) <<
"Pivoting phase 1\n";
1241 basic_variables.erase(xi);
1242 basic_variables.insert(xj);
1244 detail::
lhs_t expression_for_xj=working_equalities[xi];
1245 expression_for_xj=expression_for_xj
.erase(xj
);
1248 mCRL2log(log::trace) <<
"Expression for xj:" << pp(expression_for_xj) <<
"\n";
1249 mCRL2log(log::trace) <<
"Pivoting phase 2\n";
1250 working_equalities.erase(xi);
1252 for (
auto & working_equalitie : working_equalities)
1254 if (working_equalitie.second.count(xj)>0)
1256 const data_expression factor=working_equalitie.second[xj];
1257 mCRL2log(log::trace) <<
"VAR: " << pp(working_equalitie.first) <<
" Factor " << pp(factor) <<
"\n";
1258 working_equalitie.second=working_equalitie.second.erase(xj);
1262 working_equalitie.second=add(working_equalitie.second,multiply(expression_for_xj,factor,r),r);
1266 working_equalities[xj]=expression_for_xj;
1268 mCRL2log(log::trace) <<
"Pivoting phase 3\n";
1270 for (std::map < variable, detail::lhs_t >::const_iterator i=working_equalities.begin();
1271 i!=working_equalities.end() ; ++i)
1273 beta[i->first]=i->second.evaluate(make_map_substitution(beta),r);
1274 beta_delta_correction[i->first]=i->second.evaluate(make_map_substitution(beta_delta_correction),r);
1277 mCRL2log(log::trace) <<
"End pivoting " << pp(xj) <<
"\n";
1278 if (mCRL2logEnabled(log::trace))
1280 for (std::map < variable,data_expression >::const_iterator i=beta.begin();
1283 mCRL2log(log::trace) <<
"(1) beta[" << pp(i->first) <<
"]= " << pp(beta[i->first]) <<
"+ delta* " << pp(beta_delta_correction[i->first]) <<
"\n";
1285 for (std::map < variable, detail::lhs_t >::const_iterator i=working_equalities.begin();
1286 i!=working_equalities.end() ; ++i)
1288 mCRL2log(log::trace) <<
"EQ: " << pp(i->first) <<
" := " << pp(i->second) <<
"\n";
1328 std::unique_ptr<inequality_inconsistency_cache_base> present_branch,
1329 std::unique_ptr<inequality_inconsistency_cache_base> non_present_branch)
1353 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1355 for(
const linear_inequality& l: inequalities_in)
1358
1359 while (current_root->m_node==intermediate_node && l>current_root->m_inequality)
1361 current_root=current_root->m_non_present_branch.get();
1363 if (current_root->m_node==intermediate_node)
1365 if (l==current_root->m_inequality)
1367 current_root=current_root->m_present_branch.get();
1369 assert(current_root->m_node!=intermediate_node || l<current_root->m_inequality);
1373 return current_root->m_node==true_end_node;
1381 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1382 std::unique_ptr<inequality_inconsistency_cache_base>* current_root=&m_cache;
1383 for(
const linear_inequality& l: inequalities_in)
1386
1387 while ((*current_root)->m_node==intermediate_node && l>(*current_root)->m_inequality)
1389 current_root=&((*current_root)->m_non_present_branch);
1391 if ((*current_root)->m_node==intermediate_node)
1393 if (l==(*current_root)->m_inequality)
1395 current_root=&((*current_root)->m_present_branch);
1396 assert((*current_root)->m_node!=intermediate_node || l<(*current_root)->m_inequality);
1401 *current_root = std::make_unique<inequality_inconsistency_cache_base>(intermediate_node,l,
1402 std::make_unique<inequality_inconsistency_cache_base>(false_end_node),std::move(*current_root));
1403 current_root = &((*current_root)->m_present_branch);
1408 if ((*current_root)->m_node==true_end_node)
1418 *current_root = std::make_unique<inequality_inconsistency_cache_base>(intermediate_node,l,
1419 std::make_unique<inequality_inconsistency_cache_base>(false_end_node),std::move(*current_root));
1420 current_root = &((*current_root)->m_present_branch);
1426 if ((*current_root)->m_node!=true_end_node)
1428 assert(*current_root!=
nullptr);
1429 *current_root=std::make_unique<inequality_inconsistency_cache_base>(true_end_node);
1450 bool is_consistent(
const std::vector < linear_inequality >& inequalities_in_)
const
1452 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1454 for(std::set < linear_inequality >::const_iterator i=inequalities_in.begin(); i!=inequalities_in.end(); ++i)
1456 while (current_root->m_node==intermediate_node && *i>current_root->m_inequality)
1458 current_root=current_root->m_non_present_branch.get();
1460 if (current_root->m_node==intermediate_node)
1462 if (*i==current_root->m_inequality)
1464 current_root=current_root->m_present_branch.get();
1470 assert(current_root->m_node!=intermediate_node || *i<current_root->m_inequality);
1474 return current_root->m_node!=false_end_node && i==inequalities_in.end();
1482 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1483 std::unique_ptr<inequality_inconsistency_cache_base>* current_root=&m_cache;
1484 for(
const linear_inequality& l: inequalities_in)
1487
1488 while ((*current_root)->m_node==intermediate_node && l>(*current_root)->m_inequality)
1490 current_root=&((*current_root)->m_non_present_branch);
1492 if ((*current_root)->m_node==intermediate_node)
1494 if (l==(*current_root)->m_inequality)
1496 current_root=&((*current_root)->m_present_branch);
1497 assert((*current_root)->m_node!=intermediate_node || l<(*current_root)->m_inequality);
1502 *current_root = std::make_unique<inequality_inconsistency_cache_base>(intermediate_node,l,
1503 std::make_unique<inequality_inconsistency_cache_base>(true_end_node),std::move(*current_root));
1504 current_root = &((*current_root)->m_present_branch);
1510 *current_root = std::make_unique<inequality_inconsistency_cache_base>(intermediate_node,l,
1511 std::make_unique<inequality_inconsistency_cache_base>(true_end_node),std::move(*current_root));
1512 current_root = &((*current_root)->m_present_branch);
1535inline bool is_inconsistent(
1536 const std::vector < linear_inequality >& inequalities_in,
1538 const bool use_cache)
1548 mCRL2log(log::trace) <<
"Starting an inconsistency check on " + pp_vector(inequalities_in) <<
"\n";
1553 if (use_cache && consistency_cache.is_consistent(inequalities_in))
1555 assert(!is_inconsistent(inequalities_in,r,
false));
1558 if (use_cache && inconsistency_cache.is_inconsistent(inequalities_in))
1560 assert(is_inconsistent(inequalities_in,r,
false));
1564 std::map < variable,data_expression > lowerbounds;
1565 std::map < variable,data_expression > upperbounds;
1566 std::map < variable,data_expression > beta;
1567 std::map < variable,data_expression > lowerbounds_delta_correction;
1568 std::map < variable,data_expression > upperbounds_delta_correction;
1569 std::map < variable,data_expression > beta_delta_correction;
1570 std::set < variable > non_basic_variables;
1571 std::set < variable > basic_variables;
1572 std::map < variable, detail::lhs_t > working_equalities;
1576 for (std::vector < linear_inequality >::const_iterator i=inequalities_in.begin();
1577 i!=inequalities_in.end(); ++i)
1581 mCRL2log(log::trace) <<
"Inconsistent, because linear inequalities contains an inconsistent inequality\n";
1584 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1585 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1589 i->add_variables(non_basic_variables);
1590 for (detail::lhs_t::const_iterator j=i->lhs_begin();
1591 j!=i->lhs_end(); ++j)
1593 fresh_variable_name.add_identifier(j->variable_name().name());
1597 std::vector < linear_inequality > inequalities;
1598 std::vector < linear_inequality > equalities;
1599 non_basic_variables=
1600 gauss_elimination(inequalities_in,
1603 non_basic_variables.begin(),
1604 non_basic_variables.end(),
1607 assert(equalities.size()==0);
1608 non_basic_variables.clear();
1611 mCRL2log(log::trace) <<
"Resulting equalities " << pp_vector(equalities) <<
"\n";
1612 mCRL2log(log::trace) <<
"Resulting inequalities " << pp_vector(inequalities) <<
"\n";
1619 for (linear_inequality& inequality: inequalities)
1621 mCRL2log(log::trace) <<
"Investigate inequality: " <<
":=" << pp(inequality) <<
" || " << pp(inequality.lhs()) <<
"\n";
1622 if (inequality.is_false(r))
1624 mCRL2log(log::trace) <<
"Inconsistent, because linear inequalities contains an inconsistent inequality after Gauss elimination\n";
1627 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1628 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1632 if (!inequality.is_true(r))
1634 assert(inequality.comparison()!=detail::equal);
1635 assert(inequality.lhs().size()>0);
1636 inequality.add_variables(non_basic_variables);
1638 if (inequality.lhs().size()==1)
1640 variable v=inequality.lhs_begin()->variable_name();
1641 data_expression factor=inequality.lhs_begin()->factor();
1642 assert(factor!=real_zero());
1643 data_expression bound=rewrite_with_memory(real_divides(inequality.rhs(),factor),r);
1644 if (is_positive(factor,r))
1647 if ((upperbounds.count(v)==0) ||
1648 (rewrite_with_memory(less(bound,upperbounds[v]),r)==sort_bool::true_()))
1650 upperbounds[v]=bound;
1651 upperbounds_delta_correction[v]=
1652 ((inequality.comparison()==detail::less)?real_minus_one():real_zero());
1657 if (bound==upperbounds[v])
1659 upperbounds_delta_correction[v]=
1660 min(upperbounds_delta_correction[v],
1661 ((inequality.comparison()==detail::less)?real_minus_one():real_zero()),r);
1668 if ((lowerbounds.count(v)==0) ||
1669 (rewrite_with_memory(less(lowerbounds[v],bound),r)==sort_bool::true_()))
1671 lowerbounds[v]=bound;
1672 lowerbounds_delta_correction[v]=
1673 ((inequality.comparison()==detail::less)?real_one():real_zero());
1677 if (bound==lowerbounds[v])
1679 lowerbounds_delta_correction[v]=
1680 max(lowerbounds_delta_correction[v],
1681 ((inequality.comparison()==detail::less)?real_one():real_zero()),r);
1690 variable new_basic_variable(fresh_variable_name(
"slack_var"), sort_real::real_());
1691 basic_variables.insert(new_basic_variable);
1692 upperbounds[new_basic_variable]=inequality.rhs();
1693 upperbounds_delta_correction[new_basic_variable]=
1694 ((inequality.comparison()==detail::less)?real_minus_one():real_zero());
1695 working_equalities[new_basic_variable]=inequality.lhs();
1696 mCRL2log(log::trace) <<
"New slack variable: " << pp(new_basic_variable) <<
":=" << pp(inequality) <<
" " << pp(inequality.lhs()) <<
"\n";
1703 for (
const auto & non_basic_variable : non_basic_variables)
1705 if (lowerbounds.count(non_basic_variable)>0)
1707 if ((upperbounds.count(non_basic_variable)>0) &&
1708 ((rewrite_with_memory(less(upperbounds[non_basic_variable],lowerbounds[non_basic_variable]),r)==sort_bool::true_()) ||
1709 ((upperbounds[non_basic_variable]==lowerbounds[non_basic_variable]) &&
1710 (rewrite_with_memory(less(upperbounds_delta_correction[non_basic_variable],lowerbounds_delta_correction[non_basic_variable]),r)==sort_bool::true_()))))
1712 mCRL2log(log::trace) <<
"Inconsistent, preprocessing " << pp(non_basic_variable) <<
"\n";
1715 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1716 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1720 beta[non_basic_variable]=lowerbounds[non_basic_variable];
1721 beta_delta_correction[non_basic_variable]=lowerbounds_delta_correction[non_basic_variable];
1723 else if (upperbounds.count(non_basic_variable)>0)
1725 beta[non_basic_variable]=upperbounds[non_basic_variable];
1726 beta_delta_correction[non_basic_variable]=upperbounds_delta_correction[non_basic_variable];
1730 beta[non_basic_variable]=real_zero();
1731 beta_delta_correction[non_basic_variable]=real_zero();
1733 mCRL2log(log::trace) <<
"(2) beta[" << pp(non_basic_variable) <<
"]=" << pp(beta[non_basic_variable])<<
"+delta*" << pp(beta_delta_correction[non_basic_variable]) <<
"\n";
1737 for (
const auto & basic_variable : basic_variables)
1739 beta[basic_variable]=working_equalities[basic_variable].evaluate(make_map_substitution(beta),r);
1740 beta_delta_correction[basic_variable]=working_equalities[basic_variable].
1741 evaluate(make_map_substitution(beta_delta_correction),r);
1742 mCRL2log(log::trace) <<
"(3) beta[" << pp(basic_variable) <<
"]=" << pp(beta[basic_variable])<<
"+delta*" << pp(beta_delta_correction[basic_variable]) <<
"\n";
1754 bool lowerbound_violation =
false;
1756 for (
const auto & basic_variable : basic_variables)
1758 mCRL2log(log::trace) <<
"Evaluate start\n";
1760 data_expression value=beta[basic_variable];
1761 data_expression value_delta_correction=beta_delta_correction[basic_variable];
1762 mCRL2log(log::trace) <<
"Evaluate end\n";
1763 if ((upperbounds.count(basic_variable)>0) &&
1764 ((rewrite_with_memory(less(upperbounds[basic_variable],value),r)==sort_bool::true_()) ||
1765 ((upperbounds[basic_variable]==value) &&
1766 (rewrite_with_memory(less(upperbounds_delta_correction[basic_variable],value_delta_correction),r)==sort_bool::true_()))))
1770 mCRL2log(log::trace) <<
"Upperbound violation " << pp(basic_variable) <<
" bound: " << pp(upperbounds[basic_variable]) <<
"\n";
1773 lowerbound_violation=
false;
1776 else if ((lowerbounds.count(basic_variable)>0) &&
1777 ((rewrite_with_memory(less(value,lowerbounds[basic_variable]),r)==sort_bool::true_()) ||
1778 ((lowerbounds[basic_variable]==value) &&
1779 (rewrite_with_memory(less(value_delta_correction,lowerbounds_delta_correction[basic_variable]),r)==sort_bool::true_()))))
1783 mCRL2log(log::trace) <<
"Lowerbound violation " << pp(basic_variable) <<
" bound: " << pp(lowerbounds[basic_variable]) <<
"\n";
1786 lowerbound_violation=
true;
1793 mCRL2log(log::trace) <<
"Consistent while pivoting\n";
1796 consistency_cache.add_consistent_inequality_set(inequalities_in);
1797 assert(consistency_cache.is_consistent(inequalities_in));
1802 mCRL2log(log::trace) <<
"The smallest basic variable that does not satisfy the bounds is " << pp(xi) <<
"\n";
1803 if (lowerbound_violation)
1805 mCRL2log(log::trace) <<
"Lowerbound violation \n";
1809 for (
const detail::variable_with_a_rational_factor& lh : lhs)
1811 const variable xj = lh.variable_name();
1812 mCRL2log(log::trace) << pp(xj) <<
" -- " << pp(lh.factor()) <<
"\n";
1813 if ((is_positive(lh.factor(), r)
1814 && ((upperbounds.count(xj) == 0)
1815 || ((rewrite_with_memory(less(beta[xj], upperbounds[xj]), r) == sort_bool::true_())
1816 || ((beta[xj] == upperbounds[xj])
1817 && (rewrite_with_memory(less(beta_delta_correction[xj], upperbounds_delta_correction[xj]),
1819 == sort_bool::true_())))))
1820 || (is_negative(lh.factor(), r)
1821 && ((lowerbounds.count(xj) == 0)
1822 || ((rewrite_with_memory(greater(beta[xj], lowerbounds[xj]), r) == sort_bool::true_())
1823 || ((beta[xj] == lowerbounds[xj])
1824 && (rewrite_with_memory(
1825 greater(beta_delta_correction[xj], lowerbounds_delta_correction[xj]),
1827 == sort_bool::true_()))))))
1830 pivot_and_update(xi,xj,lowerbounds[xi],lowerbounds_delta_correction[xi],
1831 beta, beta_delta_correction,
1832 basic_variables,working_equalities,r);
1839 mCRL2log(log::trace) <<
"Inconsistent while pivoting\n";
1842 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1843 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1851 mCRL2log(log::trace) <<
"Upperbound violation \n";
1854 for (detail::lhs_t::const_iterator xj_it=working_equalities[xi].begin();
1855 xj_it!=working_equalities[xi].end(); ++xj_it)
1857 const variable xj=xj_it->variable_name();
1858 mCRL2log(log::trace) << pp(xj) <<
" -- " << pp(xj_it->factor()) <<
" POS " << is_positive(xj_it->factor(),r) <<
"\n";
1859 if ((is_negative(xj_it->factor(),r) &&
1860 ((upperbounds.count(xj)==0) ||
1861 ((rewrite_with_memory(less(beta[xj],upperbounds[xj]),r)==sort_bool::true_()) ||
1862 ((beta[xj]==upperbounds[xj])&& (rewrite_with_memory(less(beta_delta_correction[xj],upperbounds_delta_correction[xj]),r)==sort_bool::true_()))))) ||
1863 (is_positive(xj_it->factor(),r) &&
1864 ((lowerbounds.count(xj)==0) ||
1865 ((rewrite_with_memory(greater(beta[xj],lowerbounds[xj]),r)==sort_bool::true_()) ||
1866 ((beta[xj]==lowerbounds[xj]) && (rewrite_with_memory(greater(beta_delta_correction[xj],lowerbounds_delta_correction[xj]),r)==sort_bool::true_()))))))
1869 pivot_and_update(xi,xj,upperbounds[xi],upperbounds_delta_correction[xi],
1870 beta,beta_delta_correction,
1871 basic_variables,working_equalities,r);
1878 mCRL2log(log::trace) <<
"Inconsistent while pivoting (1)\n";
1881 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1882 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1911template <
class Variable_iterator >
1920 std::set < variable > remaining_variables;
1923 for (
const linear_inequality& inequality: inequalities)
1925 if (inequality.is_false(r))
1928 resulting_equalities.clear();
1929 resulting_inequalities.clear();
1930 resulting_inequalities.emplace_back();
1931 return remaining_variables;
1933 else if (!inequality.is_true(r))
1935 if (inequality.comparison()==detail::equal)
1937 resulting_equalities.push_back(inequality);
1941 resulting_inequalities.push_back(inequality);
1948 for (Variable_iterator i = variables_begin; i != variables_end; ++i)
1951 for (j=0; j<resulting_equalities.size(); ++j)
1953 bool check_equalities_for_redundant_inequalities(
false);
1954 std::set < variable > vars;
1955 resulting_equalities[j].add_variables(vars);
1956 if (vars.count(*i)>0)
1961 for (std::size_t k = 0; k < resulting_inequalities.size();)
1963 resulting_inequalities[k]=subtract(resulting_inequalities[k],
1964 resulting_equalities[j],
1965 resulting_inequalities[k].get_factor_for_a_variable(*i),
1966 resulting_equalities[j].get_factor_for_a_variable(*i),
1968 if (resulting_inequalities[k].is_false(r))
1971 resulting_equalities.clear();
1972 resulting_inequalities.clear();
1973 resulting_inequalities.emplace_back();
1974 remaining_variables.clear();
1975 return remaining_variables;
1977 else if (resulting_inequalities[k].is_true(r))
1980 if ((k+1)<resulting_inequalities.size())
1982 resulting_inequalities[k].swap(resulting_inequalities.back());
1984 resulting_inequalities.pop_back();
1992 for (std::size_t k = 0; k<resulting_equalities.size();)
2000 resulting_equalities[k]=subtract(
2001 resulting_equalities[k],
2002 resulting_equalities[j],
2003 resulting_equalities[k].get_factor_for_a_variable(*i),
2004 resulting_equalities[j].get_factor_for_a_variable(*i),
2006 if (resulting_equalities[k].is_false(r))
2009 resulting_equalities.clear();
2010 resulting_inequalities.clear();
2011 resulting_inequalities.emplace_back();
2012 remaining_variables.clear();
2013 return remaining_variables;
2015 else if (resulting_equalities[k].is_true(r))
2018 if (j+1==resulting_equalities.size())
2024 check_equalities_for_redundant_inequalities=
true;
2028 if ((k+1)<resulting_equalities.size())
2030 resulting_equalities[k].swap(resulting_equalities.back());
2032 resulting_equalities.pop_back();
2044 if (j+1<resulting_equalities.size())
2046 resulting_equalities[j].swap(resulting_equalities.back());
2048 resulting_equalities.pop_back();
2051 if (check_equalities_for_redundant_inequalities)
2053 for (std::size_t k = 0; k<resulting_equalities.size();)
2055 if (resulting_equalities[k].is_true(r))
2058 if ((k+1)<resulting_equalities.size())
2060 resulting_equalities[k].swap(resulting_equalities.back());
2062 resulting_equalities.pop_back();
2072 remaining_variables.insert(*i);
2075 return remaining_variables;
2086 static std::map < data_expression, data_expression > rewrite_hash_table;
2087 std::map < data_expression, data_expression > :: iterator i=rewrite_hash_table.find(t);
2088 if (i==rewrite_hash_table.end())
2091 rewrite_hash_table.insert(std::make_pair(t, t1));
aterm_string & operator=(const aterm_string &t) noexcept=default
A unordered_map class in which aterms can be stored.
An abstraction expression.
const variable_list & variables() const
const data_expression & body() const
const binder_type & binding_operator() const
alias(const basic_sort &name, const sort_expression &reference)
\brief Constructor Z12.
\brief Assignment of a data expression to a variable
const data_expression & rhs() const
const variable & lhs() const
data_expression & operator=(const data_expression &) noexcept=default
data_expression()
\brief Default constructor X3.
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
data_expression(const data_expression &) noexcept=default
Move semantics.
inequality_consistency_cache()
void add_consistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
inequality_consistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_consistency_cache(const inequality_consistency_cache &)=delete
bool is_consistent(const std::vector< linear_inequality > &inequalities_in_) const
std::unique_ptr< inequality_inconsistency_cache_base > m_cache
inequality_inconsistency_cache_base & operator=(const inequality_inconsistency_cache_base &)=delete
linear_inequality m_inequality
std::unique_ptr< inequality_inconsistency_cache_base > m_present_branch
std::unique_ptr< inequality_inconsistency_cache_base > m_non_present_branch
inequality_inconsistency_cache_base(const node_type node, const linear_inequality &inequality, std::unique_ptr< inequality_inconsistency_cache_base > present_branch, std::unique_ptr< inequality_inconsistency_cache_base > non_present_branch)
inequality_inconsistency_cache_base(const inequality_inconsistency_cache_base &)=delete
inequality_inconsistency_cache_base(const node_type node)
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in_) const
inequality_inconsistency_cache()
inequality_inconsistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_inconsistency_cache(const inequality_inconsistency_cache &)=delete
void add_inconsistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
std::unique_ptr< inequality_inconsistency_cache_base > m_cache
lhs_t(const aterm &t)
Constructor from an aterm.
const data_expression & operator[](const variable &v) const
Give the factor of variable v.
data_expression transform_to_data_expression() const
lhs_t erase(const variable &v) const
Erase a variable and its factor.
std::size_t count(const variable &v) const
Give the factor of variable v.
lhs_t(const ITERATOR begin, const ITERATOR end, TRANSFORMER f)
Constructor.
data_expression evaluate(const SubstitutionFunction &beta, const rewriter &r) const
Evaluate the variables in this lhs_t according to the subsitution function.
lhs_t::const_iterator find(const variable &v) const
Give an iterator of the factor/variable pair for v, or end() if v does not occur.
lhs_t(const ITERATOR begin, const ITERATOR end)
Constructor.
variable_with_a_rational_factor(const variable &v, const data_expression &f)
const variable & variable_name() const
data_expression transform_to_data_expression() const
bool is_variable_with_a_rational_factor() const
const data_expression & factor() const
function_symbol & operator=(function_symbol &&) noexcept=default
function_symbol()
Default constructor.
const detail::lhs_t & lhs() const
linear_inequality invert(const rewriter &r)
bool typical_pair(data_expression &lhs_expression, data_expression &rhs_expression, detail::comparison_t &comparison_operator, const rewriter &r) const
Return this inequality as a typical pair of terms of the form <x1+c2 x2+...+cn xn,...
linear_inequality()
Constructor yielding an inconsistent inequality.
bool is_true(const rewriter &r) const
void add_variables(std::set< variable > &variable_set) const
bool is_false(const rewriter &r) const
linear_inequality(const data_expression &e, const rewriter &r)
Constructor that constructs a linear inequality out of a data expression.
linear_inequality(const data_expression &lhs, const data_expression &rhs, const detail::comparison_t comparison, const rewriter &r, const bool negate=false)
constructor.
data_expression transform_to_data_expression() const
static void parse_and_store_expression(const data_expression &e, detail::map_based_lhs_t &new_lhs, data_expression &new_rhs, const rewriter &r, const bool negate=false, const data_expression &factor=real_one())
linear_inequality(const detail::lhs_t &lhs, const data_expression &r, detail::comparison_t t)
Basic constructor.
detail::lhs_t::const_iterator lhs_begin() const
detail::lhs_t::const_iterator lhs_end() const
linear_inequality(const detail::lhs_t &lhs, const data_expression &rhs, detail::comparison_t comparison, const rewriter &r)
constructor.
const data_expression & rhs() const
data_expression get_factor_for_a_variable(const variable &x)
detail::comparison_t comparison() const
Wrapper clas s for internal storage and substitution updates using operator()
std::multiset< variable_type > & m_variables_in_rhs
assignment(const variable_type &v, Substitution &sigma, std::multiset< variable_type > &variables_in_rhs, std::set< variable_type > &scratch_set)
Constructor.
const variable_type & m_variable
assignment & operator=(const expression_type &e)
Actual assignment.
std::set< variable_type > & m_scratch_set
Wrapper that extends any substitution to a substitution maintaining the vars in its rhs.
bool variable_occurs_in_a_rhs(const variable_type &v)
Indicates whether a variable occurs in some rhs of this substitution.
assignment operator[](variable_type const &v)
Assigment operator.
void clear()
Clear substitutions.
std::set< variable_type > m_scratch_set
const std::multiset< variable > & variables_in_rhs()
Provides a set of variables that occur in the right hand sides of the assignments.
maintain_variables_in_rhs()=default
Default constructor.
std::multiset< variable_type > m_variables_in_rhs
Rewriter that operates on data expressions.
data_expression operator()(const data_expression &d) const
Rewrites a data expression.
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
sort_expression & operator=(const sort_expression &) noexcept=default
\brief A constructor for a structured sort
function_symbol constructor_function(const sort_expression &s) const
Returns the constructor function for this constructor, assuming it is internally represented with sor...
function_symbol recogniser_function(const sort_expression &s) const
Returns the function corresponding to the recogniser of this constructor, such that it is usable in t...
const core::identifier_string & name() const
variable & operator=(variable &&) noexcept=default
const sort_expression & sort() const
\brief A where expression
where_clause(const atermpp::aterm &term)
bool has_time() const
Returns true if time is available.
Algorithm class for elimination of constant parameters.
LPS summand containing a deadlock.
ultimate_delay()
Constructor.
data_expression & constraint()
Obtain a reference to the constraint.
LPS summand containing a multi-action.
\brief A stochastic distribution
stochastic_distribution & operator=(stochastic_distribution &&) noexcept=default
stochastic_distribution()
\brief Default constructor X3.
const data::variable_list & variables() const
stochastic_distribution(const data::variable_list &variables, const data::data_expression &distribution)
\brief Constructor Z12.
const data::data_expression & distribution() const
A stochastic process initializer.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
Linear process specification.
const core::identifier_string & name() const
action(const atermpp::aterm &term)
const data::data_expression_list & arguments() const
const action_label & label() const
\brief The allow operator
allow(const atermpp::aterm &term)
const process_expression & operand() const
at(const atermpp::aterm &term)
at(const process_expression &operand, const data::data_expression &time_stamp)
\brief Constructor Z14.
const data::data_expression & time_stamp() const
const process_expression & operand() const
\brief The block operator
const process_expression & operand() const
block(const atermpp::aterm &term)
\brief The choice operator
choice(const atermpp::aterm &term)
const process_expression & left() const
choice(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
\brief The communication operator
comm(const atermpp::aterm &term)
const process_expression & operand() const
delta()
\brief Default constructor X3.
hide(const atermpp::aterm &term)
const process_expression & operand() const
\brief The if-then-else operator
const process_expression & else_case() const
const process_expression & then_case() const
if_then_else(const atermpp::aterm &term)
const data::data_expression & condition() const
if_then_else(const data::data_expression &condition, const process_expression &then_case, const process_expression &else_case)
\brief Constructor Z14.
\brief The if-then operator
const process_expression & then_case() const
if_then(const data::data_expression &condition, const process_expression &then_case)
\brief Constructor Z14.
if_then(const atermpp::aterm &term)
const data::data_expression & condition() const
\brief The merge operator
merge(const atermpp::aterm &term)
const process_expression & right() const
const process_expression & left() const
\brief A process expression
process_expression & operator=(const process_expression &) noexcept=default
process_expression(const process_expression &) noexcept=default
Move semantics.
process_expression()
\brief Default constructor X3.
process_expression & operator=(process_expression &&) noexcept=default
\brief A process identifier
process_identifier(const process_identifier &) noexcept=default
Move semantics.
process_identifier & operator=(const process_identifier &) noexcept=default
const core::identifier_string & name() const
process_identifier & operator=(process_identifier &&) noexcept=default
process_identifier()
Default constructor.
\brief A process assignment
process_instance_assignment(const process_instance_assignment &) noexcept=default
Move semantics.
process_instance_assignment(const process_identifier &identifier, const data::assignment_list &assignments)
\brief Constructor Z14.
const data::assignment_list & assignments() const
process_instance_assignment(const atermpp::aterm &term)
const process_identifier & identifier() const
const data::data_expression_list & actual_parameters() const
const process_identifier & identifier() const
Process specification consisting of a data specification, action labels, a sequence of process equati...
process_expression & init()
Returns the initialization of the process specification.
process::action_label_list & action_labels()
Returns the action label specification.
\brief The rename operator
rename(const atermpp::aterm &term)
const process_expression & operand() const
\brief The sequential composition
const process_expression & right() const
seq(const atermpp::aterm &term)
const process_expression & left() const
seq(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The distribution operator
const data::variable_list & variables() const
const data::data_expression & distribution() const
const process_expression & operand() const
stochastic_operator(const data::variable_list &variables, const data::data_expression &distribution, const process_expression &operand)
\brief Constructor Z14.
const process_expression & operand() const
sum(const data::variable_list &variables, const process_expression &operand)
\brief Constructor Z14.
sum(const atermpp::aterm &term)
const data::variable_list & variables() const
\brief The synchronization operator
const process_expression & left() const
sync(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
sync(const atermpp::aterm &term)
tau()
\brief Default constructor X3.
process_expression processbody
objectdatatype(const objectdatatype &o)=default
process_expression representedprocess
~objectdatatype()=default
process::action_label_list multi_action_names
processstatustype processstatus
identifier_string objectname
std::set< variable > get_free_variables() const
objectdatatype & operator=(const objectdatatype &o)=default
process_identifier process_representing_action
function_symbol_list functions
data_expression_list elementnames
enumeratedtype(const enumeratedtype &e)
enumeratedtype(const std::size_t n, specification_basic_type &spec)
enumeratedtype & operator=(const enumeratedtype &e)=default
~enumeratedtype()=default
enumtype(const enumtype &)=delete
enumtype & operator=(const enumtype &)=delete
std::size_t enumeratedtype_index
enumtype(std::size_t n, const sort_expression_list &fsorts, const sort_expression_list &gsorts, specification_basic_type &spec)
process_expression m_process_body
process_pid_pair & operator=(const process_pid_pair &other)=default
const process_expression & process_body() const
const process_identifier & process_id() const
process_pid_pair(const process_pid_pair &other)=default
process_pid_pair & operator=(process_pid_pair &&other)=default
process_pid_pair(const process_expression &process_body, const process_identifier &pid)
process_pid_pair(process_pid_pair &&other)=default
variable_list booleanStateVariables
static stackoperations * find_suitable_stack_operations(const variable_list ¶meters, stackoperations *stack_operations_list)
stacklisttype & operator=(const stacklisttype &)=delete
stacklisttype(const variable_list &parlist, specification_basic_type &spec, const bool regular, const std::set< process_identifier > &pCRLprocs, const bool singlecontrolstate)
Constructor.
stacklisttype(const stacklisttype &)=delete
stackoperations & operator=(const stackoperations &)=delete
data::function_symbol pop
data::function_symbol push
stackoperations(const stackoperations &)=delete
sort_expression_list sorts
data::function_symbol empty
data::function_symbol getstate
variable_list parameter_list
~stackoperations()=default
data::function_symbol emptystack
stackoperations(const variable_list &pl, specification_basic_type &spec)
sort_expression stacksort
process_expression procstorealGNFbody(const process_expression &body, variableposition v, std::vector< process_identifier > &todo, const bool regular, processstatustype mode, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree(std::size_t n, const variable_list &sums, data_expression_list terms, const sort_expression &termsort, const enumtype &e)
data::maintain_variables_in_rhs< data::mutable_map_substitution<> > make_unique_variables(const variable_list &var_list, const std::string &hint)
variable_list parscollect(const process_expression &oldbody, process_expression &newbody)
stochastic_action_summand collect_sum_arg_arg_cond(const enumtype &e, const stochastic_action_summand_vector &action_summands, const variable_list ¶meters)
action_list linMergeMultiActionList(const action_list &ma1, const action_list &ma2)
void generateLPEpCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procId, const bool containstime, const bool regular, variable_list ¶meters, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution)
variable get_fresh_variable(const std::string &s, const sort_expression &sort, const int reuse_index=-1)
process_expression distributeActionOverConditions(const process_expression &act, const data_expression &condition, const process_expression &restterm, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree_rec(std::size_t n, const variable_list &sums, data_expression_list &terms, const sort_expression &termsort, const enumtype &e)
static void complete_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map)
process_expression to_regular_form(const process_expression &t, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
void collectsumlistterm(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &body, const variable_list &pars, const stacklisttype &stack, const bool regular, const bool singlestate, const std::set< process_identifier > &pCRLprocs)
data_expression_list findarguments(const variable_list &pars, const variable_list &parlist, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
void calculate_communication_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void insertvariable(const variable &var, const bool mustbenew)
process_identifier storeinit(const process_expression &init)
static action_list to_sorted_action_list(const process_expression &p)
Convert the process expression to a sorted action list.
process_expression pCRLrewrite(const process_expression &t)
data_expression_list pushdummy_regular_data_expressions(const variable_list &pars, const stacklisttype &stack)
void define_equations_for_case_function(const std::size_t index, const data::function_symbol &functionname, const sort_expression &sort)
void alphaconvert(variable_list &sumvars, MutableSubstitution &sigma, const variable_list &occurvars, const data_expression_list &occurterms)
bool canterminatebody(const process_expression &t)
data_expression transform_matching_list(const variable_list &matchinglist)
void add_summands(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, process_expression summandterm, const std::set< process_identifier > &pCRLprocs, const stacklisttype &stack, const bool regular, const bool singlestate, const variable_list &process_parameters)
bool isDeltaAtZero(const process_expression &t)
data::function_symbol find_case_function(std::size_t index, const sort_expression &sort) const
data_expression_list make_initialstate(const process_identifier &initialProcId, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool regular, const bool singlecontrolstate, const stochastic_distribution &initial_stochastic_distribution)
static bool summandsCanBeClustered(const stochastic_action_summand &summand1, const stochastic_action_summand &summand2)
static sort_expression_list getActionSorts(const action_list &actionlist)
void filter_vars_by_multiaction(const action_list &multiaction, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
static process_identifier get_last(const process_identifier &id, const std::map< process_identifier, process_identifier > &identifier_identifier_map)
static bool check_real_variable_occurrence(const variable_list &sumvars, const data_expression &actiontime, const data_expression &condition)
process_identifier newprocess(const variable_list ¶meters, const process_expression &body, const processstatustype ps, const bool canterminate, const bool containstime)
void make_pCRL_procs(const process_identifier &id, std::set< process_identifier > &reachable_process_identifiers)
void filter_vars_by_term(const data_expression &t, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list pushdummy_stack(const variable_list ¶meters, const stacklisttype &stack, const variable_list &stochastic_variables)
void procstorealGNFrec(const process_identifier &procIdDecl, const variableposition v, std::vector< process_identifier > &todo, const bool regular)
static action_label_list getnames(const process_expression &multiAction)
variable_list getparameters_rec(const process_expression &multiAction, std::set< variable > &occurs_set)
static int match_sequence(const std::vector< process_instance_assignment > &s1, const std::vector< process_instance_assignment > &s2, const bool regular2)
assignment_list argscollect_regular2(const process_expression &t, variable_list &vl)
assignment_list make_optimised_assignment_list(const variable_list ¶meters, const data_expression_list &resultnextstate, const variable_list &sum_vars, const variable_list &stoch_vars)
bool fresh_equation_added
void calculate_left_merge_action(const lps::detail::ultimate_delay &ultimate_delay_condition, const stochastic_action_summand_vector &action_summands1, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
process_expression split_body(const process_expression &t, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc, const variable_list ¶meters)
void parallelcomposition(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const variable_list &pars1, const data_expression_list &init1, const stochastic_distribution &initial_stochastic_distribution1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const variable_list &pars2, const data_expression_list &init2, const stochastic_distribution &initial_stochastic_distribution2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars_result, data_expression_list &init_result, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
bool occursintermlist(const variable &var, const assignment_list &r, const process_identifier &proc_name) const
void transform_process_arguments(const process_identifier &procId)
objectdatatype & insert_process_declaration(const process_identifier &procId, const variable_list ¶meters, const process_expression &body, processstatustype s, const bool canterminate, const bool containstime)
static void set_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map, const process_identifier &id1_, const process_identifier &id2_, const process_identifier &initial_process)
bool canterminate_rec(const process_identifier &procId, bool &stable, std::set< process_identifier > &visited)
set_identifier_generator fresh_identifier_generator
std::set< process_identifier > remove_stochastic_operators_from_front(const std::set< process_identifier > &reachable_process_identifiers, process_identifier &initial_process_id, stochastic_distribution &initial_stochastic_distribution)
void filter_vars_by_termlist(Iterator begin, const Iterator &end, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
bool searchProcDeclaration(const variable_list ¶meters, const process_expression &body, const processstatustype s, const bool canterminate, const bool containstime, process_identifier &p) const
process_identifier splitmCRLandpCRLprocsAndAddTerminatedAction(const process_identifier &procId)
action_list linMergeMultiActionListProcess(const process_expression &ma1, const process_expression &ma2)
std::vector< process_equation > procs
action_list adapt_multiaction_to_stack(const action_list &multiAction, const stacklisttype &stack, const variable_list &vars)
void determinewhetherprocessescanterminate(const process_identifier &procId)
process_expression distribute_condition(const process_expression &body1, const data_expression &condition)
bool containstime_rec(const process_identifier &procId, bool *stable, std::set< process_identifier > &visited, bool &contains_if_then)
void collectsumlist(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const std::set< process_identifier > &pCRLprocs, const variable_list &pars, const stacklisttype &stack, bool regular, bool singlestate)
data_expression correctstatecond(const process_identifier &procId, const std::set< process_identifier > &pCRLproc, const stacklisttype &stack, int regular)
void calculate_communication_merge_action_summands(const stochastic_action_summand_vector &action_summands1, const stochastic_action_summand_vector &action_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
processstatustype determine_process_statusterm(const process_expression &body, const processstatustype status)
void calculate_communication_merge_action_deadlock_summands(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
data_expression getvar(const variable &var, const stacklisttype &stack) const
variable_list initdatavars
lps::detail::ultimate_delay combine_ultimate_delays(const lps::detail::ultimate_delay &delay1, const lps::detail::ultimate_delay &delay2)
Returns the conjunction of the two delay conditions and the join of the variables,...
process_expression distributeTime(const process_expression &body, const data_expression &time, const variable_list &freevars, data_expression &timecondition)
data_expression_list pushdummyrec_stack(const variable_list &totalpars, const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
static action_list to_action_list(const process_expression &p)
std::set< data::variable > sigma_variables(const Substitution &sigma)
void combine_summand_lists(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const variable_list &par1, const variable_list &par3, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
process_expression cut_off_unreachable_tail(const process_expression &t)
std::vector< enumeratedtype > enumeratedtypes
data_expression find_(const variable &s, const assignment_list &args, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process::action_label_list acts
assignment_list make_procargs_regular(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool singlestate, const variable_list &stochastic_variables)
std::size_t create_enumeratedtype(const std::size_t n)
void generateLPEmCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procIdDecl, const bool regular, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t)
static process_expression delta_at_zero()
assignment_list rewrite_assignments(const assignment_list &t)
assignment_list push_regular(const process_identifier &procId, const assignment_list &args, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, bool singlestate, const variable_list &stochastic_variables)
void transform_process_arguments(const process_identifier &procId, std::set< process_identifier > &visited_processes)
std::set< process_identifier > minimize_set_of_reachable_process_identifiers(const std::set< process_identifier > &reachable_process_identifiers, const process_identifier &initial_process)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
variable_list make_binary_sums(std::size_t n, const sort_expression &enumtypename, data_expression &condition, const variable_list &tail)
variable_list SieveProcDataVarsAssignments(const std::set< variable > &vars, const data_expression_list &initial_state_expressions)
data_expression_list extend_conditions(const variable &var, const data_expression_list &conditionlist)
bool check_valid_process_instance_assignment(const process_identifier &id, const assignment_list &assignments)
void calculate_left_merge_deadlock(const lps::detail::ultimate_delay &ultimate_delay_condition, const deadlock_summand_vector &deadlock_summands1, const bool is_allow, const bool is_block, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void addString(const identifier_string &str)
void procstovarheadGNF(const std::vector< process_identifier > &procs)
static process_expression action_list_to_process(const action_list &ma)
process_expression distribute_sum_over_a_stochastic_operator(const variable_list &sumvars, const variable_list &stochastic_variables, const data_expression &distribution, const process_expression &body)
void alphaconvertprocess(variable_list &sumvars, MutableSubstitution &sigma, const process_expression &p)
process_expression obtain_initial_distribution_term(const process_expression &t)
data_expression push_stack(const process_identifier &procId, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, const variable_list &vars, const variable_list &stochastic_variables)
void calculate_left_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
bool stochastic_operator_is_being_used
void declare_control_state(const std::set< process_identifier > &pCRLprocs)
void create_case_function_on_enumeratedtype(const sort_expression &sort, const std::size_t enumeratedtype_index)
variable_list SieveProcDataVarsSummands(const std::set< variable > &vars, const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list ¶meters)
static data_expression_list extend(const data_expression &c, const data_expression_list &cl)
specification_basic_type & operator=(const specification_basic_type &)=delete
static bool occursinvarandremove(const variable &var, variable_list &vl)
process_expression bodytovarheadGNF(const process_expression &body, const state s, const variable_list &freevars, const variableposition v, const std::set< variable > &variables_bound_in_sum)
process_identifier terminatedProcId
process_expression distribute_sum(const variable_list &sumvars, const process_expression &body1)
data_expression variables_are_equal_to_default_values(const variable_list &vl)
void procstorealGNF(const process_identifier &procsIdDecl, const bool regular)
static bool check_assignment_list(const assignment_list &assignments, const variable_list ¶meters)
data_expression RewriteTerm(const data_expression &t)
void alphaconversion(const process_identifier &procId, const variable_list ¶meters)
bool all_equal(const atermpp::term_list< T > &l)
void cluster_actions(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &pars)
process_expression transform_initial_distribution_term(const process_expression &t, const std::map< process_identifier, process_pid_pair > &processes_with_initial_distribution)
process_expression create_regular_invocation(process_expression sequence, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
process_expression transform_process_arguments_body(const process_expression &t, const std::set< variable > &bound_variables, std::set< process_identifier > &visited_processes)
static assignment_list parameters_to_assignment_list(const variable_list ¶meters, const std::set< variable > &variables_bound_in_sum)
assignment_list dummyparameterlist(const stacklisttype &stack, const bool singlestate)
mcrl2::data::rewriter rewr
void make_pCRL_procs(const process_expression &t, std::set< process_identifier > &reachable_process_identifiers)
stackoperations * stack_operations_list
process_expression wraptime(const process_expression &body, const data_expression &time, const variable_list &freevars)
objectdatatype & objectIndex(const process_identifier &o)
process_identifier split_process(const process_identifier &procId, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc)
bool mergeoccursin(variable &var, const variable_list &v, variable_list &matchinglist, variable_list &pars, data_expression_list &args, const variable_list &process_parameters)
static bool occursintermlist(const variable &var, const data_expression_list &r)
bool exists_variable_for_sequence(const std::vector< process_instance_assignment > &process_names, process_identifier &result)
std::set< variable > find_free_variables_process(const process_expression &p)
process_expression alphaconversionterm(const process_expression &t, const variable_list ¶meters, maintain_variables_in_rhs< mutable_map_substitution<> > sigma)
process_expression putbehind(const process_expression &body1, const process_expression &body2)
assignment_list substitute_assignmentlist(const assignment_list &assignments, const variable_list ¶meters, const bool replacelhs, const bool replacerhs, Substitution &sigma)
process_instance_assignment transform_process_instance_to_process_instance_assignment(const process_instance &procId, const std::set< variable > &bound_variables=std::set< variable >())
process_instance_assignment RewriteProcess(const process_instance_assignment &t)
process_identifier delta_process
const objectdatatype & objectIndex(const process_identifier &o) const
void insert_summand(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &sumvars, const data_expression &condition, const action_list &multiAction, const data_expression &actTime, const stochastic_distribution &distribution, const assignment_list &procargs, const bool has_time, const bool is_deadlock_summand)
bool alreadypresent(variable &var, const variable_list &vl, mutable_indexed_substitution<> ¶meter_renaming)
variable_list parameters_that_occur_in_body(const variable_list ¶meters, const process_expression &body)
process_expression enumerate_distribution_and_sums(const variable_list &sumvars, const variable_list &stochvars, const data_expression &distribution, const process_expression &body)
bool containstimebody(const process_expression &t)
assignment_list make_procargs(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const bool regular, const bool singlestate, const variable_list &stochastic_variables)
data_expression adapt_term_to_stack(const data_expression &t, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression_list processencoding(std::size_t i, const data_expression_list &t1, const stacklisttype &stack)
process_expression RewriteMultAct(const process_expression &t)
void generateLPEmCRLterm(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &t, const bool regular, const bool rename_variables, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
Linearise a process indicated by procIdDecl.
~specification_basic_type()
variable_list make_pars(const sort_expression_list &sortlist)
specification_basic_type(const specification_basic_type &)=delete
static data_expression real_times_optimized(const data_expression &r1, const data_expression &r2)
bool occursinpCRLterm(const variable &var, const process_expression &p, const bool strict)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses)
static std::size_t upperpowerof2(std::size_t i)
void extract_names(const process_expression &sequence, std::vector< process_instance_assignment > &result)
std::map< aterm, objectdatatype > objectdata
action RewriteAction(const action &t)
data_expression_vector adapt_termlist_to_stack(Iterator begin, const Iterator &end, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression make_procargs_stack(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const variable_list &stochastic_variables)
specification_basic_type(const process::action_label_list &as, const std::vector< process_equation > &ps, const variable_list &idvs, const data_specification &ds, const std::set< data::variable > &glob_vars, const t_lin_options &opt, const process_specification &procspec)
variable_list getparameters(const process_expression &multiAction)
data_expression makesingleultimatedelaycondition(const variable_list &sumvars, const variable_list &freevars, const data_expression &condition, const bool has_time, const variable &timevariable, const data_expression &actiontime, variable_list &used_sumvars)
void collectPcrlProcesses_term(const process_expression &body, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
data_expression representative_generator_internal(const sort_expression &s, const bool allow_dont_care_var=true)
assignment_list processencoding(std::size_t i, const assignment_list &t1, const stacklisttype &stack)
objectdatatype & addMultiAction(const process_expression &multiAction, bool &isnew)
void storeprocs(const std::vector< process_equation > &procs)
process_expression substitute_pCRLproc(const process_expression &p, Substitution &sigma)
void make_parameters_and_sum_variables_unique(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars, lps::detail::ultimate_delay &ultimate_delay_condition, const std::string &hint="")
std::set< variable > global_variables
static data_expression getRHSassignment(const variable &var, const assignment_list &as)
variable_list construct_renaming(const variable_list &pars1, const variable_list &pars2, variable_list &pars3, variable_list &pars4, const bool unique=true)
void determine_process_status(const process_identifier &procDecl, const processstatustype status)
static action_list makemultiaction(const process::action_label_list &actionIds, const data_expression_list &args)
void insertvariables(const variable_list &vars, const bool mustbenew)
variable_list collectparameterlist(std::set< process_identifier > &pCRLprocs)
data_expression_list RewriteTermList(const data_expression_list &t)
variable_list make_parameters_rec(const data_expression_list &l, std::set< variable > &occurs_set)
void detail_check_objectdata(const process_identifier &o) const
static assignment_list filter_assignments(const assignment_list &assignments, const variable_list ¶meters)
variable_list merge_var(const variable_list &v1, const variable_list &v2, std::vector< variable_list > &renamings_pars, std::vector< data_expression_list > &renamings_args, data_expression_list &conditionlist, const variable_list &process_parameters)
bool containstimebody(const process_expression &t, bool *stable, std::set< process_identifier > &visited, bool allowrecursion, bool &contains_if_then)
static assignment_list sort_assignments(const assignment_list &ass, const variable_list ¶meters)
assignment_list find_dummy_arguments(const variable_list &parlist, const assignment_list &args, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process_identifier tau_process
static sort_expression_list get_sorts(const List &l)
std::vector< process_identifier > seq_varnames
void storeact(const process::action_label_list &acts)
bool is_global_variable(const data_expression &d) const
variable_list joinparameters(const variable_list &par1, const variable_list &par2, mutable_indexed_substitution<> ¶meter_renaming)
static bool occursin(const variable &name, const variable_list &pars)
bool canterminatebody(const process_expression &t, bool &stable, std::set< process_identifier > &visited, const bool allowrecursion)
void AddTerminationActionIfNecessary(const stochastic_action_summand_vector &summands)
bool determinewhetherprocessescontaintime(const process_identifier &procId)
void filter_vars_by_assignmentlist(const assignment_list &assignments, const variable_list ¶meters, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list addcondition(const variable_list &matchinglist, const data_expression_list &conditionlist)
void calculate_communication_merge_deadlock_summands(const deadlock_summand_vector &deadlock_summands1, const deadlock_summand_vector &deadlock_summands2, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void transform(const process_identifier &init, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list ¶meters, data_expression_list &initial_state, stochastic_distribution &initial_stochastic_distribution)
process_expression obtain_initial_distribution(const process_identifier &procId)
objectdatatype & insertAction(const action_label &actionId)
Expression replace_variables_capture_avoiding_alt(const Expression &e, Substitution &sigma)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t, std::set< process_identifier > &visited_processes)
assignment_list pushdummy_regular(const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
assignment_list argscollect_regular(const process_expression &t, const variable_list &vl, const std::set< variable > &variables_bound_in_sum)
static data_expression_list getarguments(const action_list &multiAction)
lps::detail::ultimate_delay getUltimateDelayCondition(const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list &freevars)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
lhs_t map_to_lhs_type(const map_based_lhs_t &lhs, const data_expression &factor, const rewriter &r)
lhs_t map_to_lhs_type(const map_based_lhs_t &lhs)
std::string pp(const detail::comparison_t t)
lhs_t set_factor_for_a_variable(const lhs_t &lhs, const variable &x, const data_expression &e)
bool is_well_formed(const lhs_t &lhs)
detail::comparison_t negate(const detail::comparison_t t)
lhs_t remove_variable_and_divide(const lhs_t &lhs, const variable &v, const data_expression &f, const rewriter &r)
std::string pp(const detail::lhs_t &lhs)
void set_factor_for_a_variable(detail::map_based_lhs_t &new_lhs, const variable &x, const data_expression &e)
atermpp::function_symbol f_variable_with_a_rational_factor()
A collection of utilities for lazy expression construction.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
Namespace for system defined sort bool_.
const basic_sort & bool_()
Constructor for sort expression Bool.
const function_symbol & false_()
Constructor for function symbol false.
const function_symbol & true_()
Constructor for function symbol true.
Namespace for system defined sort real_.
function_symbol plus(const sort_expression &s0, const sort_expression &s1)
function_symbol times(const sort_expression &s0, const sort_expression &s1)
function_symbol divides(const sort_expression &s0, const sort_expression &s1)
data_expression & real_one()
bool is_plus_application(const atermpp::aterm &e)
Recogniser for application of +.
data_expression & real_zero()
function_symbol minus(const sort_expression &s0, const sort_expression &s1)
const basic_sort & real_()
Constructor for sort expression Real.
application times(const data_expression &arg0, const data_expression &arg1)
Application of function symbol *.
function_symbol abs(const sort_expression &s0)
bool is_times_application(const atermpp::aterm &e)
Recogniser for application of *.
function_symbol negate(const sort_expression &s0)
bool is_negate_application(const atermpp::aterm &e)
Recogniser for application of -.
bool is_minus_application(const atermpp::aterm &e)
Recogniser for application of -.
linear_inequality subtract(const linear_inequality &e1, const linear_inequality &e2, const data_expression &f1, const data_expression &f2, const rewriter &r)
Subtract the given equality, multiplied by f1/f2. The result is e1-(f1/f2)e2,.
application real_times(const data_expression &arg0, const data_expression &arg1)
data_expression & real_one()
bool is_closed_real_number(const data_expression &e)
bool is_application(const data_expression &t)
Returns true if the term t is an application.
application real_plus(const data_expression &arg0, const data_expression &arg1)
data_expression & real_minus_one()
bool is_positive(const data_expression &e, const rewriter &r)
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
application less_equal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <=.
application real_abs(const data_expression &arg)
application less(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <.
std::string pp_vector(const TYPE &inequalities)
Print the vector of inequalities to stderr in readable form.
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
application if_(const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Application of function symbol if.
void remove_redundant_inequalities(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
Remove every redundant inequality from a vector of inequalities.
application real_minus(const data_expression &arg0, const data_expression &arg1)
void fourier_motzkin(const data_expression &e_in, const variable_list &vars_in, data_expression &e_out, variable_list &vars_out, const rewriter &r)
Eliminate variables from a data expression using Gauss elimination and Fourier-Motzkin elimination.
std::string pp(const linear_inequality &l)
application real_divides(const data_expression &arg0, const data_expression &arg1)
std::set< variable > gauss_elimination(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_equalities, std::vector< linear_inequality > &resulting_inequalities, Variable_iterator variables_begin, Variable_iterator variables_end, const rewriter &r)
Try to eliminate variables from a system of inequalities using Gauss elimination.
bool is_zero(const data_expression &e)
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
void fourier_motzkin(const std::vector< linear_inequality > &inequalities_in, Data_variable_iterator variables_begin, Data_variable_iterator variables_end, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
data_expression rewrite_with_memory(const data_expression &t, const rewriter &r)
data_expression & real_zero()
application greater(const data_expression &arg0, const data_expression &arg1)
Application of function symbol >
application real_negate(const data_expression &arg)
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in, const rewriter &r, bool use_cache=true)
Determine whether a list of data expressions is inconsistent.
data_expression max(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
bool is_negative(const data_expression &e, const rewriter &r)
const data_expression_list & variable_list_to_data_expression_list(const variable_list &l)
Transform a variable_list into a data_expression_list.
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
data_expression min(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
The main namespace for the LPS library.
void complete_data_specification(stochastic_specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
bool occursinterm(const data::data_expression &t, const data::variable &var)
mcrl2::lps::stochastic_specification linearise(const mcrl2::process::process_specification &type_checked_spec, const mcrl2::lps::t_lin_options &lin_options=t_lin_options())
Linearises a process specification.
The main namespace for the Process library.
bool is_at(const atermpp::aterm &x)
bool is_process_instance(const atermpp::aterm &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
bool is_tau(const atermpp::aterm &x)
bool is_seq(const atermpp::aterm &x)
bool is_merge(const atermpp::aterm &x)
bool is_allow(const atermpp::aterm &x)
bool is_bounded_init(const atermpp::aterm &x)
bool is_delta(const atermpp::aterm &x)
bool is_sum(const atermpp::aterm &x)
bool is_block(const atermpp::aterm &x)
bool is_if_then_else(const atermpp::aterm &x)
bool is_comm(const atermpp::aterm &x)
void alphabet_reduce(process_specification &procspec, std::size_t duplicate_equation_limit=(std::numeric_limits< size_t >::max)())
Applies alphabet reduction to a process specification.
bool is_action(const atermpp::aterm &x)
bool is_left_merge(const atermpp::aterm &x)
bool is_hide(const atermpp::aterm &x)
bool is_if_then(const atermpp::aterm &x)
bool is_choice(const atermpp::aterm &x)
bool is_stochastic_operator(const atermpp::aterm &x)
bool is_rename(const atermpp::aterm &x)
bool is_sync(const atermpp::aterm &x)
void swap(atermpp::aterm &t1, atermpp::aterm &t2) noexcept
Swaps two term_applss.
A unary function that can be used in combination with replace_data_expressions to eliminate real numb...
fourier_motzkin_sigma(const rewriter &rewr_)
data_expression apply(const abstraction &d, bool negate) const
data_expression operator()(const data_expression &d) const
static constexpr bool is_identity_substitution
Options for linearisation.
bool apply_alphabet_axioms
make_substitution(const std::map< process_identifier, process_identifier > &map)
process_identifier operator()(const process_identifier &id) const
const std::map< process_identifier, process_identifier > & m_map