// the function the thread will run when it is called void ProcessingThread::run() { while(1) { ///////////////////////////////// // Stop thread if stopped=TRUE // ///////////////////////////////// stoppedMutex.lock(); if (stopped) { stopped=false; stoppedMutex.unlock(); break; } stoppedMutex.unlock(); ///////////////////////////////// ///////////////////////////////// // Save processing time processingTime=t.elapsed(); // Start timer (used to calculate processing rate) t.start(); // Get frame from queue Mat currentFrame=imageBuffer->getFrame(); // Make copy of current frame (processing will be performed on this copy) currentFrame.copyTo(currentFrameCopy); // Set ROI of currentFrameCopy currentFrameCopy.locateROI(frameSize,framePoint); currentFrameCopy.adjustROI(-currentROI.y,-(frameSize.height-currentROI.height-currentROI.y), -currentROI.x,-(frameSize.width-currentROI.width-currentROI.x)); updateMembersMutex.lock(); updateMembersMutex.unlock(); // Update statistics updateFPS(processingTime); currentSizeOfBuffer=imageBuffer->getSizeOfImageBuffer(); if (decideToProcess()){ writeHistory(); // set the black level if (SetBlackFlag == 1){ blackVal = setBlackCalib(currentFrame); SetBlackFlag = 0; } process(¤tFrame); } draw_on_image(GameState.table, ¤tFrameCopy); frame=MatToQImage(currentFrameCopy); emit newFrame(frame); //printTest(); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ } qDebug() << "Stopping processing thread..."; }
/* * SaveHistory - save history to file */ void SaveHistory( void ) { FILE *f; if( EditVars.HistoryFile == NULL || !historyLoaded ) { return; } f = fopen( EditVars.HistoryFile, "wt" ); if( f == NULL ) { return; } writeHistory( f, &EditVars.CLHist ); writeHistory( f, &EditVars.FindHist ); writeHistory( f, &EditVars.FilterHist ); writeHistory( f, &EditVars.LastFilesHist ); fclose( f ); } /* SaveHistory */
void IssueDetailsGenerator::write( HtmlWriter* writer, HtmlText::Flags flags ) { IssueEntity issue = IssueEntity::find( m_issueId ); if ( issue.isValid() ) { writer->writeBlock( issue.name(), HtmlWriter::Header2Block ); writer->createLayout(); QList<ValueEntity> values; if ( dataManager->setting( "hide_empty_values" ) == "1" ) values = issue.nonEmptyValues(); else values = issue.values(); writer->beginCell( HtmlWriter::TopPane, values.isEmpty() ? 2 : 1 ); writeProperties( writer, issue ); if ( !values.isEmpty() ) { writer->beginCell( HtmlWriter::TopPane ); writeAttributes( writer, values, flags ); } if ( m_description ) { DescriptionEntity description = issue.description(); if ( description.isValid() ) { writer->appendLayoutRow(); writer->beginCell( HtmlWriter::BottomPane, 2 ); writer->writeBlock( descriptionLinks( description, flags ), HtmlWriter::FloatBlock ); writer->writeBlock( tr( "Description" ), HtmlWriter::Header3Block ); writer->writeBlock( descriptionText( description, flags ), HtmlWriter::CommentBlock ); } } if ( m_history != NoHistory ) { writer->appendLayoutRow(); writer->beginCell( HtmlWriter::BottomPane, 2 ); if ( !flags.testFlag( HtmlText::NoInternalLinks ) ) writer->writeBlock( historyLinks( flags ), HtmlWriter::FloatBlock ); writer->writeBlock( tr( "Issue History" ), HtmlWriter::Header3Block ); writeHistory( writer, issue, flags ); } writer->endLayout(); } }
unsigned long CSysSolve::BCGSTAB(const CSysVector & b, CSysVector & x, CMatrixVectorProduct & mat_vec, CPreconditioner & precond, double tol, unsigned long m, bool monitoring) { int rank = 0; #ifndef NO_MPI #ifdef WINDOWS MPI_Comm_rank(MPI_COMM_WORLD, &rank); #else rank = MPI::COMM_WORLD.Get_rank(); #endif #endif /*--- Check the subspace size ---*/ if (m < 1) { if (rank == 0) cerr << "CSysSolve::BCGSTAB: illegal value for subspace size, m = " << m << endl; #ifdef NO_MPI exit(1); #else #ifdef WINDOWS MPI_Abort(MPI_COMM_WORLD,1); MPI_Finalize(); #else MPI::COMM_WORLD.Abort(1); MPI::Finalize(); #endif #endif } CSysVector r(b); CSysVector r_0(b); CSysVector p(b); CSysVector v(b); CSysVector s(b); CSysVector t(b); CSysVector phat(b); CSysVector shat(b); CSysVector A_x(b); /*--- Calculate the initial residual, compute norm, and check if system is already solved ---*/ mat_vec(x,A_x); r -= A_x; r_0 = r; // recall, r holds b initially double norm_r = r.norm(); double norm0 = b.norm(); if ( (norm_r < tol*norm0) || (norm_r < eps) ) { if (rank == 0) cout << "CSysSolve::BCGSTAB(): system solved by initial guess." << endl; return 0; } /*--- Initialization ---*/ double alpha = 1.0, beta = 1.0, omega = 1.0, rho = 1.0, rho_prime = 1.0; /*--- Set the norm to the initial initial residual value ---*/ norm0 = norm_r; /*--- Output header information including initial residual ---*/ int i = 0; if ((monitoring) && (rank == 0)) { writeHeader("BCGSTAB", tol, norm_r); writeHistory(i, norm_r, norm0); } /*--- Loop over all search directions ---*/ for (i = 0; i < m; i++) { /*--- Compute rho_prime ---*/ rho_prime = rho; /*--- Compute rho_i ---*/ rho = dotProd(r, r_0); /*--- Compute beta ---*/ beta = (rho / rho_prime) * (alpha /omega); /*--- p_{i} = r_{i-1} + beta * p_{i-1} - beta * omega * v_{i-1} ---*/ double beta_omega = -beta*omega; p.Equals_AX_Plus_BY(beta, p, beta_omega, v); p.Plus_AX(1.0, r); /*--- Preconditioning step ---*/ precond(p, phat); mat_vec(phat, v); /*--- Calculate step-length alpha ---*/ double r_0_v = dotProd(r_0, v); alpha = rho / r_0_v; /*--- s_{i} = r_{i-1} - alpha * v_{i} ---*/ s.Equals_AX_Plus_BY(1.0, r, -alpha, v); /*--- Preconditioning step ---*/ precond(s, shat); mat_vec(shat, t); /*--- Calculate step-length omega ---*/ omega = dotProd(t, s) / dotProd(t, t); /*--- Update solution and residual: ---*/ x.Plus_AX(alpha, phat); x.Plus_AX(omega, shat); r.Equals_AX_Plus_BY(1.0, s, -omega, t); /*--- Check if solution has converged, else output the relative residual if necessary ---*/ norm_r = r.norm(); if (norm_r < tol*norm0) break; if (((monitoring) && (rank == 0)) && ((i+1) % 5 == 0) && (rank == 0)) writeHistory(i+1, norm_r, norm0); } if ((monitoring) && (rank == 0)) { cout << "# BCGSTAB final (true) residual:" << endl; cout << "# Iteration = " << i << ": |res|/|res0| = " << norm_r/norm0 << endl; } // /*--- Recalculate final residual (this should be optional) ---*/ // mat_vec(x, A_x); // r = b; r -= A_x; // double true_res = r.norm(); // // if ((fabs(true_res - norm_r) > tol*10.0) && (rank == 0)) { // cout << "# WARNING in CSysSolve::BCGSTAB(): " << endl; // cout << "# true residual norm and calculated residual norm do not agree." << endl; // cout << "# true_res - calc_res = " << true_res <<" "<< norm_r << endl; // } return i; }
unsigned long CSysSolve::FGMRES(const CSysVector & b, CSysVector & x, CMatrixVectorProduct & mat_vec, CPreconditioner & precond, double tol, unsigned long m, bool monitoring) { int rank = 0; #ifndef NO_MPI #ifdef WINDOWS MPI_Comm_rank(MPI_COMM_WORLD, &rank); #else rank = MPI::COMM_WORLD.Get_rank(); #endif #endif /*--- Check the subspace size ---*/ if (m < 1) { if (rank == 0) cerr << "CSysSolve::FGMRES: illegal value for subspace size, m = " << m << endl; #ifdef NO_MPI exit(1); #else #ifdef WINDOWS MPI_Abort(MPI_COMM_WORLD,1); MPI_Finalize(); #else MPI::COMM_WORLD.Abort(1); MPI::Finalize(); #endif #endif } /*--- Check the subspace size ---*/ if (m > 1000) { if (rank == 0) cerr << "CSysSolve::FGMRES: illegal value for subspace size (too high), m = " << m << endl; #ifdef NO_MPI exit(1); #else #ifdef WINDOWS MPI_Abort(MPI_COMM_WORLD,1); MPI_Finalize(); #else MPI::COMM_WORLD.Abort(1); MPI::Finalize(); #endif #endif } /*--- Define various arrays Note: elements in w and z are initialized to x to avoid creating a temporary CSysVector object for the copy constructor ---*/ vector<CSysVector> w(m+1, x); vector<CSysVector> z(m+1, x); vector<double> g(m+1, 0.0); vector<double> sn(m+1, 0.0); vector<double> cs(m+1, 0.0); vector<double> y(m, 0.0); vector<vector<double> > H(m+1, vector<double>(m, 0.0)); /*--- Calculate the norm of the rhs vector ---*/ double norm0 = b.norm(); /*--- Calculate the initial residual (actually the negative residual) and compute its norm ---*/ mat_vec(x,w[0]); w[0] -= b; double beta = w[0].norm(); if ( (beta < tol*norm0) || (beta < eps) ) { /*--- System is already solved ---*/ if (rank == 0) cout << "CSysSolve::FGMRES(): system solved by initial guess." << endl; return 0; } /*--- Normalize residual to get w_{0} (the negative sign is because w[0] holds the negative residual, as mentioned above) ---*/ w[0] /= -beta; /*--- Initialize the RHS of the reduced system ---*/ g[0] = beta; /*--- Set the norm to the initial residual value ---*/ norm0 = beta; /*--- Output header information including initial residual ---*/ int i = 0; if ((monitoring) && (rank == 0)) { writeHeader("FGMRES", tol, beta); writeHistory(i, beta, norm0); } /*--- Loop over all search directions ---*/ for (i = 0; i < m; i++) { /*--- Check if solution has converged ---*/ if (beta < tol*norm0) break; /*--- Precondition the CSysVector w[i] and store result in z[i] ---*/ precond(w[i], z[i]); /*--- Add to Krylov subspace ---*/ mat_vec(z[i], w[i+1]); /*--- Modified Gram-Schmidt orthogonalization ---*/ modGramSchmidt(i, H, w); /*--- Apply old Givens rotations to new column of the Hessenberg matrix then generate the new Givens rotation matrix and apply it to the last two elements of H[:][i] and g ---*/ for (int k = 0; k < i; k++) applyGivens(sn[k], cs[k], H[k][i], H[k+1][i]); generateGivens(H[i][i], H[i+1][i], sn[i], cs[i]); applyGivens(sn[i], cs[i], g[i], g[i+1]); /*--- Set L2 norm of residual and check if solution has converged ---*/ beta = fabs(g[i+1]); /*--- Output the relative residual if necessary ---*/ if ((((monitoring) && (rank == 0)) && ((i+1) % 100 == 0)) && (rank == 0)) writeHistory(i+1, beta, norm0); } /*--- Solve the least-squares system and update solution ---*/ solveReduced(i, H, g, y); for (int k = 0; k < i; k++) { x.Plus_AX(y[k], z[k]); } if ((monitoring) && (rank == 0)) { cout << "# FGMRES final (true) residual:" << endl; cout << "# Iteration = " << i << ": |res|/|res0| = " << beta/norm0 << endl; } // /*--- Recalculate final (neg.) residual (this should be optional) ---*/ // mat_vec(x, w[0]); // w[0] -= b; // double res = w[0].norm(); // // if (fabs(res - beta) > tol*10) { // if (rank == 0) { // cout << "# WARNING in CSysSolve::FGMRES(): " << endl; // cout << "# true residual norm and calculated residual norm do not agree." << endl; // cout << "# res - beta = " << res - beta << endl; // } // } return i; }
unsigned long CSysSolve::ConjugateGradient(const CSysVector & b, CSysVector & x, CMatrixVectorProduct & mat_vec, CPreconditioner & precond, double tol, unsigned long m, bool monitoring) { int rank = 0; #ifndef NO_MPI #ifdef WINDOWS MPI_Comm_rank(MPI_COMM_WORLD, &rank); #else rank = MPI::COMM_WORLD.Get_rank(); #endif #endif /*--- Check the subspace size ---*/ if (m < 1) { if (rank == 0) cerr << "CSysSolve::ConjugateGradient: illegal value for subspace size, m = " << m << endl; #ifdef NO_MPI exit(1); #else #ifdef WINDOWS MPI_Abort(MPI_COMM_WORLD,1); MPI_Finalize(); #else MPI::COMM_WORLD.Abort(1); MPI::Finalize(); #endif #endif } CSysVector r(b); CSysVector A_p(b); /*--- Calculate the initial residual, compute norm, and check if system is already solved ---*/ mat_vec(x,A_p); r -= A_p; // recall, r holds b initially double norm_r = r.norm(); double norm0 = b.norm(); if ( (norm_r < tol*norm0) || (norm_r < eps) ) { if (rank == 0) cout << "CSysSolve::ConjugateGradient(): system solved by initial guess." << endl; return 0; } double alpha, beta, r_dot_z; CSysVector z(r); precond(r, z); CSysVector p(z); /*--- Set the norm to the initial initial residual value ---*/ norm0 = norm_r; /*--- Output header information including initial residual ---*/ int i = 0; if ((monitoring) && (rank == 0)) { writeHeader("CG", tol, norm_r); writeHistory(i, norm_r, norm0); } /*--- Loop over all search directions ---*/ for (i = 0; i < m; i++) { /*--- Apply matrix to p to build Krylov subspace ---*/ mat_vec(p, A_p); /*--- Calculate step-length alpha ---*/ r_dot_z = dotProd(r, z); alpha = dotProd(A_p, p); alpha = r_dot_z / alpha; /*--- Update solution and residual: ---*/ x.Plus_AX(alpha, p); r.Plus_AX(-alpha, A_p); /*--- Check if solution has converged, else output the relative residual if necessary ---*/ norm_r = r.norm(); if (norm_r < tol*norm0) break; if (((monitoring) && (rank == 0)) && ((i+1) % 5 == 0)) writeHistory(i+1, norm_r, norm0); precond(r, z); /*--- Calculate Gram-Schmidt coefficient beta, beta = dotProd(r_{i+1}, z_{i+1}) / dotProd(r_{i}, z_{i}) ---*/ beta = 1.0 / r_dot_z; r_dot_z = dotProd(r, z); beta *= r_dot_z; /*--- Gram-Schmidt orthogonalization; p = beta *p + z ---*/ p.Equals_AX_Plus_BY(beta, p, 1.0, z); } if ((monitoring) && (rank == 0)) { cout << "# Conjugate Gradient final (true) residual:" << endl; cout << "# Iteration = " << i << ": |res|/|res0| = " << norm_r/norm0 << endl; } // /*--- Recalculate final residual (this should be optional) ---*/ // mat_vec(x, A_p); // r = b; // r -= A_p; // double true_res = r.norm(); // // if (fabs(true_res - norm_r) > tol*10.0) { // if (rank == 0) { // cout << "# WARNING in CSysSolve::ConjugateGradient(): " << endl; // cout << "# true residual norm and calculated residual norm do not agree." << endl; // cout << "# true_res - calc_res = " << true_res - norm_r << endl; // } // } return i; }
void ForEachMSAction::Perform(ArtifactSet &artifacts, ProgressListener &progress) { unsigned taskIndex = 0; FinishAll(); for(std::vector<std::string>::const_iterator i=_filenames.begin();i!=_filenames.end();++i) { std::string filename = *i; progress.OnStartTask(*this, taskIndex, _filenames.size(), std::string("Processing measurement set ") + filename); bool skip = false; if(_skipIfAlreadyProcessed) { MeasurementSet set(filename); if(set.HasRFIConsoleHistory()) { skip = true; AOLogger::Info << "Skipping " << filename << ",\n" "because the set contains AOFlagger history and -skip-flagged was given.\n"; } } if(!skip) { std::auto_ptr<ImageSet> imageSet(ImageSet::Create(filename, _baselineIOMode, _readUVW)); bool isMS = dynamic_cast<MSImageSet*>(&*imageSet) != 0; if(isMS) { MSImageSet *msImageSet = static_cast<MSImageSet*>(&*imageSet); msImageSet->SetDataColumnName(_dataColumnName); msImageSet->SetSubtractModel(_subtractModel); } imageSet->Initialize(); if(_loadOptimizedStrategy) { rfiStrategy::DefaultStrategy::TelescopeId telescopeId; unsigned flags; double frequency, timeResolution, frequencyResolution; rfiStrategy::DefaultStrategy::DetermineSettings(*imageSet, telescopeId, flags, frequency, timeResolution, frequencyResolution); RemoveAll(); rfiStrategy::DefaultStrategy::LoadFullStrategy( *this, telescopeId, flags, frequency, timeResolution, frequencyResolution ); if(_threadCount != 0) rfiStrategy::Strategy::SetThreadCount(*this, _threadCount); } std::auto_ptr<ImageSetIndex> index(imageSet->StartIndex()); artifacts.SetImageSet(&*imageSet); artifacts.SetImageSetIndex(&*index); InitializeAll(); ActionBlock::Perform(artifacts, progress); FinishAll(); artifacts.SetNoImageSet(); index.reset(); imageSet.reset(); if(isMS) writeHistory(*i); } progress.OnEndTask(*this); ++taskIndex; } InitializeAll(); }