27 #define OMG_HOA_GCCMUTE
29 #ifdef OMG_HOA_GCCMUTE
31 #pragma GCC diagnostic push
32 #pragma GCC diagnostic ignored "-Wunused-private-field"
33 #pragma GCC diagnostic ignored "-Winconsistent-missing-override"
36 #include "cpphoafparser/consumer/hoa_intermediate_trace.hh"
37 #include "cpphoafparser/consumer/hoa_intermediate_resolve_aliases.hh"
38 #include "cpphoafparser/parser/hoa_parser.hh"
39 #include "cpphoafparser/parser/hoa_parser_helper.hh"
40 #include "cpphoafparser/parser/hoa_parser_exception.hh"
41 #include "cpphoafparser/util/implicit_edge_helper.hh"
42 #include "cpphoafparser/consumer/hoa_consumer.hh"
43 #include "cpphoafparser/consumer/hoa_consumer_exception.hh"
45 #ifdef OMG_HOA_GCCMUTE
46 #pragma GCC diagnostic pop
58 for(
int i=0;i<apc;i++) {
61 if(i+1<apc) res+=
" & ";
63 FD_DF(
"hoa_bits2expr: bits " << bits <<
" expr " << res);
70 EventSet::Iterator eit;
71 EventSet::Iterator eit_end;
72 StateSet::Iterator sit;
73 StateSet::Iterator sit_end;
85 std::vector<StateSet> accvec;
90 accstr1 =
"acc-name: Buchi";
91 accstr2 =
"Acceptance: 1 Inf(0)";
99 for(i=0;i<acc.
Size();++i) {
100 if(i>0) accstr2 +=
"|";
104 accvec.push_back(fin);
105 accvec.push_back(acc.
At(i).
RSet());
111 for(;asz>2;asz=(asz>>1))
114 std::map<Idx,uint32_t> ev2bits;
115 std::map<Idx,std::string> ev2expr;
119 for(;eit!=eit_end;++eit) {
129 for(;eit!=eit_end;++eit)
133 rOutStream <<
"HOA: v1" << std::endl;
134 rOutStream <<
"name: \"" << rAut.
Name() <<
"\""<< std::endl;
136 rOutStream <<
"AP: " << apc;
137 for(
int i=0; i<apc; ++i)
138 rOutStream <<
" \"ap"<<i<<
"\"";
139 rOutStream << std::endl;
143 for(;eit!=eit_end;++eit)
144 rOutStream <<
"Alias: @" << rAut.
EventName(*eit) <<
" " << ev2expr[*eit] << std::endl;
146 rOutStream <<
"Start:";
149 for(;sit!=sit_end;++sit)
150 rOutStream <<
" " << (*sit)-1;
151 rOutStream << std::endl;
153 rOutStream <<
"States: " << rAut.
States().
Size() << std::endl;
155 rOutStream << accstr1 << std::endl;
156 rOutStream << accstr2 << std::endl;
158 rOutStream <<
"--BODY--" << std::endl;
162 for(;sit!=sit_end;++sit) {
164 rOutStream <<
"State: " << (*sit)-1;
166 for(
unsigned int i=0; i<accvec.size(); ++i) {
167 if(!accvec[i].Exists(*sit))
continue;
174 if(!none) rOutStream <<
"}";
175 rOutStream << std::endl;
179 for(;tit!=tit_end;++tit)
180 rOutStream <<
"[@" << rAut.
EventName(tit->Ev) <<
"] " << tit->X2-1 << std::endl;
183 rOutStream <<
"--END--" << std::endl;
190 throw Exception(
"ExportHoa",
"refusing to export generator with no states", 80);
193 throw Exception(
"ExportHoa",
"refusing to export generator with no events", 80);
198 }
catch (std::ios::failure&) {
199 throw Exception(
"ExportHoa",
"Exception writing to anonymous stream", 2);
207 throw Exception(
"ExportHoa",
"refusing to export generator with no states", 80);
210 throw Exception(
"ExportHoa",
"refusing to export generator with no events", 80);
214 fout.exceptions(std::ios::badbit|std::ios::failbit);
216 fout.open(rFilename.c_str(), std::ios::out|std::ios::trunc);
218 catch (std::ios::failure&) {
219 std::stringstream errstr;
220 errstr <<
"Exception opening file \""<< rFilename <<
"\"";
221 throw Exception(
"ExportHoa", errstr.str(), 2);
226 }
catch (std::ios::failure&) {
227 std::stringstream errstr;
228 errstr <<
"Exception writing to file \""<< rFilename <<
"\"";
229 throw Exception(
"ExportHoa", errstr.str(), 2);
236 using namespace cpphoafparser;
241 rGen(gen), rSymTab(syms), mImplEdgeHlp(0) {}
254 for(
unsigned int i=0;i<numberOfStates;++i) rGen.InsState(i+1);
258 for(
unsigned int state : stateConjunction)
259 rGen.InsInitState(state+1);
262 virtual void addAlias(
const std::string& name, label_expr::ptr labelExpr)
override {
263 mAliases[name]=labelExpr;
266 virtual void setAPs(
const std::vector<std::string>& aps)
override {
269 for (
const std::string& ap : aps)
274 mAccSetCount=numberOfSets;
284 throw HOAConsumerException(
"acc-name is Rabin, but only a plain Generator was passed");
290 virtual void setName(
const std::string& name)
override {
294 virtual void setTool(
const std::string& name, std::shared_ptr<std::string> version)
override {
297 virtual void addProperties(
const std::vector<std::string>& properties)
override {
300 virtual void addMiscHeader(
const std::string& name,
const std::vector<IntOrString>& content)
override {
305 if(!(mRabin || mBuechi))
306 throw HOAConsumerException(
"\"acc-name\" must specify Buchi or Rabin");
309 if(mAccSetCount % 2 != 0)
310 throw HOAConsumerException(
"Rabin acceptance requires an even number of sets in \"Acceptance:\"");
311 pRAut->RabinAcceptance().Size((mAccSetCount+1)/2);
316 throw HOAConsumerException(
"Buchi acceptance requires exactly on set in \"Acceptance:\"");
319 mImplEdgeHlp = ImplicitEdgeHelper(mApCount);
321 if(rSymTab.Size()!=0) {
322 unsigned int evcnt= 1L << mApCount;
323 for(uint32_t i=0;i<evcnt;++i) {
324 if(!rSymTab.Exists(i+1))
continue;
325 std::string evname=rSymTab.Symbol(i+1);
326 mEdgeBitsToEvIdx[i]=rGen.InsEvent(evname);
330 if(rSymTab.Size()==0) {
331 std::map<std::string,label_expr::ptr>::iterator ait;
332 for(ait=mAliases.begin();ait!=mAliases.end();++ait) {
334 expr2bits(ait->second,bitslist);
335 if(bitslist.size()!=1)
continue;
336 mEdgeBitsToEvIdx[*bitslist.begin()]=rGen.InsEvent(ait->first);
342 std::shared_ptr<std::string> info,
343 label_expr::ptr labelExpr,
344 std::shared_ptr<int_list> accSignature)
override {
346 throw HOAConsumerException(
"state label expression not supported");
351 if (accSignature && mBuechi) {
352 if(accSignature->size()>0)
353 rGen.InsMarkedState(
id+1);
356 if (accSignature && mRabin) {
357 for (
unsigned int acc : *accSignature) {
358 RabinPair& rpair = pRAut->RabinAcceptance().At(acc/2);
365 mImplEdgeHlp.startOfState(
id);
369 unsigned int stateId,
370 const int_list& conjSuccessors,
371 std::shared_ptr<int_list> accSignature)
override
374 throw HOAConsumerException(
"transition marking not supported");
375 uint32_t edgebits = mImplEdgeHlp.nextImplicitEdge();
376 std::map<uint32_t,Idx>::iterator eit;
377 eit=mEdgeBitsToEvIdx.find(edgebits);
379 if(eit!=mEdgeBitsToEvIdx.end()) {
382 std::string evname=bits2event(edgebits);
383 evidx=rGen.InsEvent(evname);
384 mEdgeBitsToEvIdx[edgebits]=evidx;
386 for (
unsigned int succ : conjSuccessors)
387 rGen.SetTransition(stateId+1,evidx,succ+1);
391 label_expr::ptr labelExpr,
392 const int_list& conjSuccessors,
393 std::shared_ptr<int_list> accSignature)
override
396 throw HOAConsumerException(
"transition marking not supported");
398 expr2bits(labelExpr, bitslist);
399 for (
unsigned int edgebits : bitslist) {
400 std::map<uint32_t,Idx>::iterator eit;
401 eit=mEdgeBitsToEvIdx.find(edgebits);
403 if(eit!=mEdgeBitsToEvIdx.end()) {
406 std::string evname=bits2event(edgebits);
407 evidx=rGen.InsEvent(evname);
408 mEdgeBitsToEvIdx[edgebits]=evidx;
410 for (
unsigned int succ : conjSuccessors)
411 rGen.SetTransition(stateId+1,evidx,succ+1);
416 mImplEdgeHlp.endOfState();
422 RabinAcceptance::Iterator rit=pRAut->RabinAcceptance().Begin();
423 for(;rit!=pRAut->RabinAcceptance().End();++rit)
424 rit->ISet()=pRAut->States() - rit->ISet();
446 unsigned int mAccSetCount=0;
455 std::string res=
"ev";
456 for(
int i=mApCount-1;i>=0;--i) {
457 if(bits & (1L << i)) res+=
"1";
464 bool evalexpr(label_expr::ptr expr, uint32_t bits) {
465 switch (expr->getType()) {
466 case label_expr::EXP_AND:
467 return evalexpr(expr->getLeft(),bits) && evalexpr(expr->getRight(),bits);
468 case label_expr::EXP_OR:
469 return evalexpr(expr->getLeft(),bits) || evalexpr(expr->getRight(),bits);
470 case label_expr::EXP_NOT:
471 return !evalexpr(expr->getLeft(),bits);
472 case label_expr::EXP_TRUE:
474 case label_expr::EXP_FALSE:
476 case label_expr::EXP_ATOM:
477 if(!expr->getAtom().isAlias())
478 return bits & (1UL << expr->getAtom().getAPIndex());
479 std::map<std::string,label_expr::ptr>::iterator ait;
480 ait=mAliases.find(expr->getAtom().getAliasName());
481 if(ait==mAliases.end())
482 throw HOAConsumerException(
"unreckonizes alias");
483 return evalexpr(ait->second,bits);
485 throw HOAConsumerException(
"could not evaluate label expression");
491 void expr2bits(label_expr::ptr labelExpr, HOAConsumer::int_list& bitslist) {
492 uint32_t bits_sup = 1UL << mApCount;
494 for(; bits<bits_sup;++bits)
495 if(evalexpr(labelExpr,bits))
496 bitslist.push_back(bits);
512 consumer.reset(
new HOAIntermediateResolveAliases(consumer));
514 consumer.reset(
new HOAIntermediateTrace(consumer));
517 HOAParser::parse(rInStream, consumer,
true);
518 }
catch (HOAParserException& e) {
519 std::stringstream errstr;
520 errstr <<
"ImportHOA parser: \""<< e.what() <<
"\"";
521 throw Exception(
"ImportHoa", errstr.str(), 3);
522 }
catch (HOAConsumerException& e) {
523 std::stringstream errstr;
524 errstr <<
"ImportHOA consumer: \""<< e.what() <<
"\"";
525 throw Exception(
"ImportHoa", errstr.str(), 3);
533 fin.exceptions(std::ios::badbit);
535 fin.open(rFilename.c_str(), std::ios::in | std::ios::binary);
537 catch (std::ios::failure&) {
538 std::stringstream errstr;
539 errstr <<
"Exception opening file \""<< rFilename <<
"\"";
540 throw Exception(
"ImportHoa", errstr.str(), 2);
543 ImportHoa(fin,rGen,pSymTab,resolve,trace);
const std::string & Name(void) const
std::map< std::string, label_expr::ptr > mAliases
virtual void addEdgeWithLabel(unsigned int stateId, label_expr::ptr labelExpr, const int_list &conjSuccessors, std::shared_ptr< int_list > accSignature) override
virtual void setName(const std::string &name) override
virtual void setAcceptanceCondition(unsigned int numberOfSets, acceptance_expr::ptr accExpr) override
bool evalexpr(label_expr::ptr expr, uint32_t bits)
virtual void setAPs(const std::vector< std::string > &aps) override
HOAConsumerFaudes(Generator &gen, const SymbolTable &syms)
virtual void notifyEnd() override
virtual void setTool(const std::string &name, std::shared_ptr< std::string > version) override
void expr2bits(label_expr::ptr labelExpr, HOAConsumer::int_list &bitslist)
ImplicitEdgeHelper mImplEdgeHlp
virtual void addStartStates(const int_list &stateConjunction) override
virtual bool parserResolvesAliases() override
virtual void provideAcceptanceName(const std::string &name, const std::vector< IntOrString > &extraInfo) override
virtual void notifyEndOfState(unsigned int stateId) override
std::string bits2event(uint32_t bits)
virtual void addState(unsigned int id, std::shared_ptr< std::string > info, label_expr::ptr labelExpr, std::shared_ptr< int_list > accSignature) override
virtual void notifyHeaderStart(const std::string &version) override
virtual void addProperties(const std::vector< std::string > &properties) override
virtual void addAlias(const std::string &name, label_expr::ptr labelExpr) override
virtual void notifyWarning(const std::string &warning) override
virtual void notifyBodyStart() override
std::map< int, std::string > mApSymbols
virtual void notifyAbort() override
virtual void setNumberOfStates(unsigned int numberOfStates) override
std::map< uint32_t, Idx > mEdgeBitsToEvIdx
const SymbolTable & rSymTab
virtual void addEdgeImplicit(unsigned int stateId, const int_list &conjSuccessors, std::shared_ptr< int_list > accSignature) override
virtual void addMiscHeader(const std::string &name, const std::vector< IntOrString > &content) override
Idx InsEntry(Idx index, const std::string &rName)
virtual const T & At(const Position &pos) const
TBaseSet< Transition, TransSort::X1EvX2 >::Iterator Iterator
void RabinAcceptance(const faudes::RabinAcceptance &rRabAcc)
StateSet::Iterator StatesBegin(void) const
StateSet::Iterator InitStatesBegin(void) const
const StateSet & MarkedStates(void) const
const EventSet & Alphabet(void) const
TransSet::Iterator TransRelBegin(void) const
EventSet::Iterator AlphabetBegin(void) const
StateSet::Iterator StatesEnd(void) const
TransSet::Iterator TransRelEnd(void) const
StateSet::Iterator InitStatesEnd(void) const
std::string EventName(Idx index) const
EventSet::Iterator AlphabetEnd(void) const
const StateSet & States(void) const
virtual void EraseSet(const TBaseSet &rOtherSet)
void ExportHoa(std::ostream &rOutStream, const Generator &rAut, SymbolTable *pSymTab)
void ImportHoa(std::istream &rInStream, Generator &rGen, const SymbolTable *pSymTab, bool resolve, bool trace)
void omg_export_hoa(std::ostream &rOutStream, const Generator &rAut, SymbolTable *pSymTab)
std::string omg_hoa_bits2expr(uint32_t bits, int apc)
std::string ToStringInteger(Int number)