void SolutionRow(struct str_node *RowNode) { Cover(RowNode->Header); struct str_node *RightNode; for (RightNode = RowNode->Right; RightNode != RowNode; RightNode = RightNode->Right) { Cover(RightNode->Header); } }
void IntervalSet<TElem>::SubtractFrom(TInterval const & interval, vector<TInterval> & difference) const { TIterator begin; TIterator end; Cover(interval, begin, end); TElem from = interval.first; TElem const to = interval.second; for (auto it = begin; it != end && from < to; ++it) { if (it->first > from) { difference.emplace_back(from, it->first); from = it->second; } else { from = max(from, it->second); } } if (from < to) difference.emplace_back(from, to); }
int DFS() { int i,j; for (i=0;i<n;i++) for (j=0;j<m;j++) { if (Check(i,j)) { Cover(i,j,'1'); if (!DFS()) //下一个状态里有一个必败状态 { Cover(i,j,'0'); return 1; //这个状态必胜 } Cover(i,j,'0'); } } return 0; }
void Search(int k) { /*if(GlobalProgressUpdate < k) { printf("== Search(%d)\n", k); PrintSolution(); GlobalProgressUpdate = k; }*/ if ((RootNode->Left == RootNode && RootNode->Right == RootNode) || k == (81 - MaxK)) { //Valid solution! //printf("----------- SOLUTION FOUND -----------\n"); PrintSolution(); Finished = 1; return; } struct str_node *Column = ChooseColumn(); Cover(Column); struct str_node *RowNode; struct str_node *RightNode; for (RowNode = Column->Down; RowNode != Column && !Finished; RowNode = RowNode->Down) { // Try this row node on! Result[nResult++] = RowNode->IDNum; for (RightNode = RowNode->Right; RightNode != RowNode; RightNode = RightNode->Right) Cover(RightNode->Header); Search(k + 1); // Ok, that node didn't quite work for (RightNode = RowNode->Right; RightNode != RowNode; RightNode = RightNode->Right) UnCover(RightNode->Header); Result[--nResult] = 0; } UnCover(Column); }
void IntervalSet<TElem>::Add(TInterval const & interval) { // Skips empty intervals. if (interval.first == interval.second) return; TIterator begin; TIterator end; Cover(interval, begin, end); TElem from = interval.first; TElem to = interval.second; // Updates |from| and |to| in accordance with corner intervals (if any). if (begin != end) { if (begin->first < from) from = begin->first; auto last = end; --last; if (last->second > to) to = last->second; } // Now all elements [from, to) can be added to the set as a single // interval which will replace all intervals in [begin, end). But // note that it can be possible to merge new interval with its // neighbors, so following code checks it. if (begin != m_intervals.begin()) { auto prevBegin = begin; --prevBegin; if (prevBegin->second == from) { begin = prevBegin; from = prevBegin->first; } } if (end != m_intervals.end() && end->first == to) { to = end->second; ++end; } m_intervals.erase(begin, end); m_intervals.emplace(from, to); }
void State::exercise( bool is_owner ) { barrier.wait(); if( is_owner ) { Cover(0); if( ja.try_acquire() ) { Cover(1); ++job_created; ja.set_and_release(job); Cover(2); if( ja.try_acquire() ) { Cover(3); ja.release(); Cover(4); if( ja.try_acquire() ) { Cover(5); ja.release(); } } Cover(6); } else { Cover(7); } if( DelayMask&1<<N ) { while( !job_received ) __TBB_Yield(); } } else { // Using extra bit of DelayMask for choosing whether to run wait_for_job or not. if( DelayMask&1<<N ) { rml::job* j= &ja.wait_for_job(); if( j!=&job ) REPORT("%p\n",j); ASSERT( j==&job, NULL ); job_received = true; } Cover(8); } rml::job* j; if( ja.try_plug(j) ) { ASSERT( j==&job || !j, NULL ); if( j ) { Cover(9+is_owner); ++job_destroyed; } else { __TBB_ASSERT( !is_owner, "owner failed to create job but plugged self" ); Cover(11); } } else { Cover(12+is_owner); } }
Datum get_covers(PG_FUNCTION_ARGS) { tsvector *txt = (tsvector *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); QUERYTYPE *query = (QUERYTYPE *) PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1)); WordEntry *pptr = ARRPTR(txt); int i, dlen = 0, j, cur = 0, len = 0, rlen; DocWord *dw, *dwptr; text *out; char *cptr; DocRepresentation *doc; int olddwpos = 0; int ncover = 1; Extention ext; doc = get_docrep(txt, query, &rlen); if (!doc) { out = palloc(VARHDRSZ); VARATT_SIZEP(out) = VARHDRSZ; PG_FREE_IF_COPY(txt, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_POINTER(out); } for (i = 0; i < txt->size; i++) { if (!pptr[i].haspos) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("no pos info"))); dlen += POSDATALEN(txt, &(pptr[i])); } dwptr = dw = palloc(sizeof(DocWord) * dlen); memset(dw, 0, sizeof(DocWord) * dlen); for (i = 0; i < txt->size; i++) { WordEntryPos *posdata = POSDATAPTR(txt, &(pptr[i])); for (j = 0; j < POSDATALEN(txt, &(pptr[i])); j++) { dw[cur].w = STRPTR(txt) + pptr[i].pos; dw[cur].len = pptr[i].len; dw[cur].pos = WEP_GETPOS(posdata[j]); cur++; } len += (pptr[i].len + 1) * (int) POSDATALEN(txt, &(pptr[i])); } qsort((void *) dw, dlen, sizeof(DocWord), compareDocWord); MemSet(&ext, 0, sizeof(Extention)); while (Cover(doc, rlen, query, &ext)) { dwptr = dw + olddwpos; while (dwptr->pos < ext.p && dwptr - dw < dlen) dwptr++; olddwpos = dwptr - dw; dwptr->start = ncover; while (dwptr->pos < ext.q + 1 && dwptr - dw < dlen) dwptr++; (dwptr - 1)->finish = ncover; len += 4 /* {}+two spaces */ + 2 * 16 /* numbers */ ; ncover++; } out = palloc(VARHDRSZ + len); cptr = ((char *) out) + VARHDRSZ; dwptr = dw; while (dwptr - dw < dlen) { if (dwptr->start) { sprintf(cptr, "{%d ", dwptr->start); cptr = strchr(cptr, '\0'); } memcpy(cptr, dwptr->w, dwptr->len); cptr += dwptr->len; *cptr = ' '; cptr++; if (dwptr->finish) { sprintf(cptr, "}%d ", dwptr->finish); cptr = strchr(cptr, '\0'); } dwptr++; } VARATT_SIZEP(out) = cptr - ((char *) out); pfree(dw); for (i = 0; i < rlen; i++) if (doc[i].needfree) pfree(doc[i].item); pfree(doc); PG_FREE_IF_COPY(txt, 0); PG_FREE_IF_COPY(query, 1); PG_RETURN_POINTER(out); }
static float4 calc_rank_cd(float4 *arrdata, tsvector * txt, QUERYTYPE * query, int method) { DocRepresentation *doc; int len, i, doclen = 0; Extention ext; double Wdoc = 0.0; double invws[lengthof(weights)]; double SumDist = 0.0, PrevExtPos = 0.0, CurExtPos = 0.0; int NExtent = 0; for (i = 0; i < lengthof(weights); i++) { invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : weights[i])); if (invws[i] > 1.0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("weight out of range"))); invws[i] = 1.0 / invws[i]; } doc = get_docrep(txt, query, &doclen); if (!doc) return 0.0; MemSet(&ext, 0, sizeof(Extention)); while (Cover(doc, doclen, query, &ext)) { double Cpos = 0.0; double InvSum = 0.0; int nNoise; DocRepresentation *ptr = ext.begin; while (ptr <= ext.end) { InvSum += invws[ptr->wclass]; ptr++; } Cpos = ((double) (ext.end - ext.begin + 1)) / InvSum; /* * if doc are big enough then ext.q may be equal to ext.p * due to limit of posional information. In this case we * approximate number of noise word as half cover's * length */ nNoise = (ext.q - ext.p) - (ext.end - ext.begin); if ( nNoise < 0 ) nNoise = (ext.end - ext.begin) / 2; Wdoc += Cpos / ((double) (1 + nNoise)); CurExtPos = ((double) (ext.q + ext.p)) / 2.0; if (NExtent > 0 && CurExtPos > PrevExtPos /* prevent devision by * zero in a case of multiple lexize */ ) SumDist += 1.0 / (CurExtPos - PrevExtPos); PrevExtPos = CurExtPos; NExtent++; } if ((method & RANK_NORM_LOGLENGTH) && txt->size > 0) Wdoc /= log((double) (cnt_length(txt) + 1)); if (method & RANK_NORM_LENGTH) { len = cnt_length(txt); if (len > 0) Wdoc /= (double) len; } if ((method & RANK_NORM_EXTDIST) && SumDist > 0) Wdoc /= ((double) NExtent) / SumDist; if ((method & RANK_NORM_UNIQ) && txt->size > 0) Wdoc /= (double) (txt->size); if ((method & RANK_NORM_LOGUNIQ) && txt->size > 0) Wdoc /= log((double) (txt->size + 1)) / log(2.0); for (i = 0; i < doclen; i++) if (doc[i].needfree) pfree(doc[i].item); pfree(doc); return (float4) Wdoc; }
static bool Cover(DocRepresentation * doc, int len, QUERYTYPE * query, Extention * ext) { DocRepresentation *ptr; int lastpos = ext->pos; int i; bool found = false; reset_istrue_flag(query); ext->p = 0x7fffffff; ext->q = 0; ptr = doc + ext->pos; /* find upper bound of cover from current position, move up */ while (ptr - doc < len) { for (i = 0; i < ptr->nitem; i++) ptr->item[i]->istrue = 1; if (TS_execute(GETQUERY(query), NULL, false, checkcondition_ITEM)) { if (ptr->pos > ext->q) { ext->q = ptr->pos; ext->end = ptr; lastpos = ptr - doc; found = true; } break; } ptr++; } if (!found) return false; reset_istrue_flag(query); ptr = doc + lastpos; /* find lower bound of cover from founded upper bound, move down */ while (ptr >= doc) { for (i = 0; i < ptr->nitem; i++) ptr->item[i]->istrue = 1; if (TS_execute(GETQUERY(query), NULL, true, checkcondition_ITEM)) { if (ptr->pos < ext->p) { ext->begin = ptr; ext->p = ptr->pos; } break; } ptr--; } if (ext->p <= ext->q) { /* * set position for next try to next lexeme after begining of founded * cover */ ext->pos = (ptr - doc) + 1; return true; } ext->pos++; return Cover(doc, len, query, ext); }
static bool Cover(DocRepresentation *doc, int len, QueryRepresentation *qr, Extention *ext) { DocRepresentation *ptr; int lastpos = ext->pos; int i; bool found = false; /* * since this function recurses, it could be driven to stack overflow. * (though any decent compiler will optimize away the tail-recursion. */ check_stack_depth(); memset(qr->operandexist, 0, sizeof(bool) * qr->query->size); ext->p = 0x7fffffff; ext->q = 0; ptr = doc + ext->pos; /* find upper bound of cover from current position, move up */ while (ptr - doc < len) { for (i = 0; i < ptr->nitem; i++) { if (ptr->item[i]->type == QI_VAL) QR_SET_OPERAND_EXISTS(qr, ptr->item[i]); } if (TS_execute(GETQUERY(qr->query), (void *) qr, false, checkcondition_QueryOperand)) { if (ptr->pos > ext->q) { ext->q = ptr->pos; ext->end = ptr; lastpos = ptr - doc; found = true; } break; } ptr++; } if (!found) return false; memset(qr->operandexist, 0, sizeof(bool) * qr->query->size); ptr = doc + lastpos; /* find lower bound of cover from found upper bound, move down */ while (ptr >= doc + ext->pos) { for (i = 0; i < ptr->nitem; i++) if (ptr->item[i]->type == QI_VAL) QR_SET_OPERAND_EXISTS(qr, ptr->item[i]); if (TS_execute(GETQUERY(qr->query), (void *) qr, true, checkcondition_QueryOperand)) { if (ptr->pos < ext->p) { ext->begin = ptr; ext->p = ptr->pos; } break; } ptr--; } if (ext->p <= ext->q) { /* * set position for next try to next lexeme after beginning of found * cover */ ext->pos = (ptr - doc) + 1; return true; } ext->pos++; return Cover(doc, len, qr, ext); }