int fbs() { int head,tail,l; head=0;tail=1; b[0][0]=x1;b[0][1]=y1; while(head!=tail) { x1=b[head][0]; y1=b[head++][1]; for(l=0;l<8;l++) { x=x1+k[l][0]; y=y1+k[l][1]; if(tru(x,y)) continue; if(a[x][y]) continue; b[tail][0]=x; b[tail++][1]=y; a[x][y]=a[x1][y1]+1; if(x==x2&&y==y2) return a[x][y]; } } }
/** * Helper function to initialize a bitarray from a string */ static QBitArray QStringToQBitArray(const QString &str) { QBitArray ba; ba.resize(str.length()); int i; QChar tru('1'); for (i = 0; i < str.length(); i++) { if (str.at(i) == tru) { ba.setBit(i, true); } } return ba; }
MuscleTask::MuscleTask(const MultipleSequenceAlignment &ma, const MuscleTaskSettings& _config) : Task(tr("MUSCLE alignment"), TaskFlags_FOSCOE | TaskFlag_MinimizeSubtaskErrorText), config(_config), inputMA(ma->getExplicitCopy()) { GCOUNTER( cvar, tvar, "MuscleTask" ); config.nThreads = (config.nThreads == 0 ? AppContext::getAppSettings()->getAppResourcePool()->getIdealThreadCount() : config.nThreads); SAFE_POINT_EXT(config.nThreads > 0, setError("Incorrect number of max parallel subtasks"), ); setMaxParallelSubtasks(config.nThreads); algoLog.info(tr("MUSCLE alignment started")); ctx = new MuscleContext(config.nThreads); ctx->params.g_bStable = config.stableMode; ctx->params.g_uMaxIters = config.maxIterations; ctx->params.g_ulMaxSecs = config.maxSecs; parallelSubTask = NULL; //todo: make more precise estimation, use config.op mode int aliLen = ma->getLength(); int nSeq = ma->getNumRows(); int memUseMB = qint64(aliLen) * qint64(nSeq) * 200 / (1024 * 1024); //200x per char in alignment TaskResourceUsage tru(RESOURCE_MEMORY, memUseMB); QString inputAlName = inputMA->getName(); resultMA->setName(inputAlName); resultSubMA->setName(inputAlName); inputSubMA = inputMA->getExplicitCopy(); if (config.alignRegion && config.regionToAlign.length != inputMA->getLength()) { SAFE_POINT_EXT(config.regionToAlign.length > 0, setError(tr("Incorrect region to align")), ); inputSubMA = inputMA->mid(config.regionToAlign.startPos, config.regionToAlign.length); CHECK_EXT(inputSubMA != MultipleSequenceAlignment(), setError(tr("Stopping MUSCLE task, because of error in MultipleSequenceAlignment::mid function")), ); }