sequence_in_t TeacherBB::equivalenceQuery(const unique_ptr<DFSM>& conjecture) { _equivalenceQueryCounter++; auto tmp = _currState; auto model = FSMmodel::duplicateFSM(conjecture); if (!model->isReduced()) model->minimize(); for (state_t extraStates = 0; extraStates < _maxExtraStates; extraStates++) { auto TS = _testingMethod(model, extraStates); for (const auto& test : TS) { auto bbOut = resetAndOutputQuery(test); _outputQueryCounter--; sequence_out_t modelOut; state_t state = 0; for (const auto& input : test) { auto ns = model->getNextState(state, input); if ((ns != NULL_STATE) && (ns != WRONG_STATE)) { modelOut.emplace_back(model->getOutput(state, input)); state = ns; } else modelOut.emplace_back(WRONG_OUTPUT); } if (bbOut != modelOut) { _currState = tmp; return test; } } } _currState = tmp; return sequence_in_t(); }
void LatticeReduction::reduce2(Vector&a,Vector&b,Vector&c){ Vector v[3]; v[0]=a; v[1]=b; v[2]=c; int iter=0; int ok=0; while(ok<3){ int i,j; if(iter%3==0){ i=0; j=1; } else if(iter%3==1){ i=0; j=2; } else { i=1; j=2; } if(isReduced(v[i],v[j])) ok++; else { reduce(v[i],v[j]); ok=1; } iter++; } a=v[0]; b=v[1]; c=v[2]; }
bool LatticeReduction::isReduced2(const Vector&a,const Vector&b,const Vector &c){ return isReduced(a,b) && isReduced(a,b) && isReduced(b,c); }