/* virtual */ void FsLazyWindowApplication::Interval(void) { int lb,mb,rb,mx,my; FsGetMouseEvent(lb,mb,rb,mx,my); mouseOn=PickedNode(mx,my); auto key=FsInkey(); if(FSKEY_ESC==key) { SetMustTerminate(true); } if(FSKEY_D==key && nullptr!=mouseOn) { btree.Delete(mouseOn); VerifyTree(); } if(FSKEY_L==key && nullptr!=mouseOn) { btree.RotateLeft(mouseOn); VerifyTree(); } if(FSKEY_B==key) { BreadthFirstTraversal(btree.GetRoot()); } needRedraw=true; }
int BreadthFirstTraversal(struct queue *q,Node *root,Node *subformula[],int *i) { double infval = mxGetInf(); Node *p = NULL; if (root == NULL) return 0; enqueue(q,root); /* enqueue the root node*/ while (!queue_empty_p(q)) { if(!q->first){ p = NULL; } else{ /* set subformula index*/ p = dupnode(q->first); p = q->first; p->index = *i; subformula[*i] = dupnode(p); subformula[*i] = p; subformula[*i]->BoundCheck = 0; subformula[*i]->UBound = -infval; subformula[*i]->LBound = infval; subformula[*i]->LBound_nxt = infval; subformula[*i]->UBindicator = 0; subformula[*i]->LBindicator = 0; subformula[*i]->LBindicator_nxt = 0; subformula[*i]->loop_end = 0; (*i)++; } dequeue(q); if (p->lft != NULL) BreadthFirstTraversal( q,p->lft,subformula,i); if (p->rgt != NULL) BreadthFirstTraversal( q,p->rgt,subformula,i); } return (*i-1); }
mxArray *get_polarity(Miscellaneous *miscell, PMap *predMap, Node *phi) { /* Peer reviewed on 2013.07.22 by Dokhanchi, Adel */ const char *fields[] = {"polarity", "index"}; mxArray *tmp, *Array; /*mwSize *dims;*/ mwSize dims; double *pr; int temp_pol = 0; Polarity *p; int i = 0,ii; int iii=0; /* used for check the index for subformula*/ int jjj=0; /* length-1 of the subformula array */ int *qi; int temp = 1; #define subMax 200 /* biggest number of iterations the subformula could store*/ Node *subformula[subMax]; /* subformula array as a cross-reference for the phi*/ /* Initialize some variables for BFS */ queue q; queue *Q = &q; init_queue(Q); /*initial the queue*/ qi = &temp; /*----------------------------------*/ p = (Polarity *)emalloc(sizeof(Polarity)); p->polar = UNDEFINED_POLAR; tmp = mxCreateStructMatrix(1, 1, 2, fields); /*-----BFS for formula--------------*/ jjj = BreadthFirstTraversal(Q,phi,subformula,qi); for(iii=1; iii<jjj; iii++) /* check the index for subformula*/ { if(iii != subformula[iii]->index) mexErrMsgTxt("mx_dp_taliro: subformula not in right index!"); } make_predicate_list(miscell, p); /* predicate list*/ pr = mxCalloc(miscell->dp_taliro_param.nPred, sizeof(double)); /*dims = &(miscell->dp_taliro_param.nPred);*/ dims = (mwSize)(miscell->dp_taliro_param.nPred); Array = mxCreateDoubleMatrix (1, dims, mxREAL); for(i = 0;i<miscell->dp_taliro_param.nPred;i++) { pr[i] = miscell->pList.pindex[i]; if(pr[i] == -1) { pr[i] = 0; } } mxSetPr(Array,pr); /* predicate list ends*/ /* polarity calculation*/ i = jjj; while(i>0) { switch (subformula[i]->ntyp) { case TRUE: subformula[i]->pol = UNDEFINED_POLAR; break; case FALSE: subformula[i]->pol = UNDEFINED_POLAR; break; case VALUE: subformula[i]->pol = UNDEFINED_POLAR; break; case PREDICATE: /* match predicate index*/ for(ii = 0; ii < miscell->dp_taliro_param.nPred; ii++) { if(miscell->predMap[ii].str != NULL) { if(strcmp(subformula[i]->sym->name,predMap[ii].str)==0) { if(predMap[ii].parameter!=NULL){ subformula[i]->pol = POSITIVE_POLAR; } else{ subformula[i]->pol = UNDEFINED_POLAR; } } } } break; case NOT: subformula[i]->pol = flip(subformula[i]->lft->pol); /*p->polar = flip(p->polar);*/ break; case AND: subformula[i]->pol = mix(subformula[i]->lft->pol, subformula[i]->rgt->pol); break; case OR: subformula[i]->pol = mix(subformula[i]->lft->pol, subformula[i]->rgt->pol); break; case NEXT: subformula[i]->pol = subformula[i]->lft->pol; break; case WEAKNEXT: subformula[i]->pol = subformula[i]->lft->pol; break; case ALWAYS: if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 0) { subformula[i]->pol = pos(subformula[i]->rgt->pol); } else if(subformula[i]->time.l_par == 0 && subformula[i]->time.u_par == 1) { subformula[i]->pol = neg(subformula[i]->rgt->pol); } else if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 1) { subformula[i]->pol = MIXED_POLAR; } else { subformula[i]->pol = subformula[i]->rgt->pol; } break; case EVENTUALLY: if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 0) { subformula[i]->pol = neg(subformula[i]->rgt->pol); } else if(subformula[i]->time.l_par == 0 && subformula[i]->time.u_par == 1) { subformula[i]->pol = pos(subformula[i]->rgt->pol); } else if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 1) { subformula[i]->pol = MIXED_POLAR; } else { subformula[i]->pol = subformula[i]->rgt->pol; } break; case U_OPER: if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 0) { temp_pol = NEGATIVE_POLAR; subformula[i]->pol = mix(temp_pol,mix(subformula[i]->lft->pol,subformula[i]->rgt->pol)); } else if(subformula[i]->time.l_par == 0 && subformula[i]->time.u_par == 1) { temp_pol = POSITIVE_POLAR; subformula[i]->pol = mix(temp_pol,mix(subformula[i]->lft->pol,subformula[i]->rgt->pol)); } else if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 1) { subformula[i]->pol = MIXED_POLAR; } else { subformula[i]->pol = mix(subformula[i]->lft->pol,subformula[i]->rgt->pol); } break; case V_OPER: if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 0) { /* temp_pol = POSITIVE_POLAR; subformula[i]->pol = mix(temp_pol,mix(subformula[i]->lft->pol,subformula[i]->rgt->pol));*/ temp_pol = NEGATIVE_POLAR; subformula[i]->pol = flip(mix(temp_pol,mix(flip(subformula[i]->lft->pol),flip(subformula[i]->rgt->pol)))); } else if(subformula[i]->time.l_par == 0 && subformula[i]->time.u_par == 1) { /* temp_pol = NEGATIVE_POLAR; subformula[i]->pol = mix(temp_pol,mix(subformula[i]->lft->pol,subformula[i]->rgt->pol));*/ temp_pol = POSITIVE_POLAR; subformula[i]->pol = flip(mix(temp_pol,mix(flip(subformula[i]->lft->pol),flip(subformula[i]->rgt->pol)))); } else if(subformula[i]->time.l_par == 1 && subformula[i]->time.u_par == 1) { subformula[i]->pol = MIXED_POLAR; } else { subformula[i]->pol = mix(subformula[i]->lft->pol,subformula[i]->rgt->pol); } break; default: break; } i--; } /* polarity calculation ends*/ mxSetField(tmp, 0, "polarity", mxCreateDoubleScalar(subformula[1]->pol)); mxSetField(tmp, 0, "index", Array); return (tmp); }