bool test(const DynamicVector<RealType>& params) const { for (size_t i=0; i<params.size(); i++) { if ((params[i] < low_) || (params[i] > high_)) return false; } return true; }
bool test(const DynamicVector<RealType>& params) const { for (size_t i=0; i<params.size(); ++i) { if (params[i] <= 0.0) return false; } return true; }
DynamicVector<Movie> Controller::getSortedMoviesByActor() { DynamicVector<Movie> clone = this->repository.movies.clone(); for (int i = 0; i < clone.size() - 1; i++) { for (int j = i + 1; j < clone.size(); j++) { if (clone[i].actor.compare(clone[j].actor)>0) { Movie aux = clone[i]; clone[i] = clone[j]; clone[j] = aux; } } } return clone; }
int ChParallelDataManager::OutputBlazeVector(DynamicVector<real> src, std::string filename) { const char* numformat = "%.16g"; ChStreamOutAsciiFile stream(filename.c_str()); stream.SetNumFormat(numformat); for (int i = 0; i < src.size(); i++) stream << src[i] << "\n"; return 0; }
DynamicVector<Movie> Controller::getSortedMoviesByYearAndGenre() { DynamicVector<Movie> clone = this->repository.movies.clone(); for (int i = 0; i < clone.size() - 1; i++) { for (int j = i + 1; j < clone.size(); j++) { if (clone[i].year > clone[j].year) { Movie aux = clone[i]; clone[i] = clone[j]; clone[j] = aux; } else if (clone[i].year == clone[j].year && clone[i].genre.compare(clone[j].genre)> 0) { Movie aux = clone[i]; clone[i] = clone[j]; clone[j] = aux; } } } return clone; }
LevelElimination * LAMGLSSolver::coarsenElimination(const Matrix & finerMatrix) { cout << "coarsenElimination()" << endl; //Per salvare i P ed i q std::vector<qPStage*> cStages; /* Prealloco spazio per al più SETUP_ELIMINATION_MAX_STAGES così evito * possibili riallocazioni */ cStages.reserve(SETUP_ELIMINATION_MAX_STAGES); //Copio la matrice così posso modificarla senza modificare quella del finerLevel Matrix A(finerMatrix); Matrix Acc; //Per lo Schur Complement System Matrix Acf; //Per lo Schur Complement System // Il numero di stage di eliminazione eseguiti sulla matrice A size_t stageNum = 0; /* Vector che vengono riusati*/ DynamicVector<size_t> Cset; //Insieme dei nodi da non eliminare DynamicVector<size_t> Fset; //Insieme dei nodi da eliminare DynamicVector<size_t> degree; //Grado di ciascun nodo DynamicVector<size_t> candidate; //Nodi candidati all'eliminazione DynamicVector<NodeEliminationStatus> status; //Stato dei nodi /* P è sempre sparsa anche quando A è densa */ SpMat P; DynamicVector<double> q; while (stageNum < SETUP_ELIMINATION_MAX_STAGES) { size_t A_rows = A.rows(); if (A_rows <= MAX_DIRECT_SOLVE_SIZE) break; /* (1) Calcola il vettore degree della matrice. */ degree.resize(A_rows); for (size_t i = 0; i < A_rows; ++i) { degree[i] = A.nonZeros(i); if (A(i, i) != 0)//Tolgo l'elemento sulla diagonale degree[i]--; else cerr << "La diagionale i-esima c'ha lelemento a zero!!! ERRORE MORTALE!!!" << endl; } /* (2) [f c ] = lowDegreeNodes(A,degree,MaxDegree) */ candidate.resize(A_rows); candidate = 0; /* Individuo i nodi candidati (degree[i] <= MAX_DEGREE) */ size_t cnnZ = 0; //Devo usare questa variabili perché i valori "settati" di candidate comprendono il valore "0" cioè il nodo 0 for (size_t i = 0; i < A_rows; ++i) { if (degree[i] <= SETUP_ELIMINATION_MAX_DEGREE) { candidate[cnnZ++] = i; } } /* I primi cnnZ elementi sono stati inizializzati */ candidate.resize(cnnZ, true); status.resize(A_rows); status = HIGH_DEGREE; //Tutti gli elementi prendono HIGH_DEGREE // status(candidate) = 0; % Reset all relevant nodes to "not visited" for (size_t i = 0; i < candidate.size(); ++i) { status[candidate[i]] = NOT_DECIDED; } for (size_t k = 0; k < candidate.size(); ++k) { lowdegreesweep(A, candidate[k], status); //Template call } /* Adesso devo creare i vettori F e C, inserendovi i nodi che verranno * o meno eliminati */ size_t nf = 0; //|Fset| size_t nc = 0; //|Cset| Cset.resize(A_rows, false); Fset.resize(A_rows, false); for (size_t i = 0; i < A_rows; ++i) { if (status[i] == LOW_DEGREE) Fset[nf++] = i; //Inserisco il nodo i nell'insieme F else Cset[nc++] = i; //Lo inserisco invece in C } /* L'insieme C non può mai essere vuoto, dobbiamo lasciargli almeno * un elemento */ if (nc == 0) { Cset[nc++] = Fset[--nf]; Fset[nf] = 0; } Cset.resize(nc, true); //nc non è mai 0 Fset.resize(nf, true); /* FINE di (2) [f c ] = lowDegreeNodes(A,degree,MaxDegree) */ if ((nf <= SETUP_ELIMINATION_MIN_ELIM_FRACTION * A_rows)) { /* Il coarsening non è abbastanza efficace perché andiamo ad eliminare * un numero, nf, di nodi che è inferiore alla minima soglia accettabile * di eliminazione. Ci fermiamo senza eliminare.*/ break; } /* (3) Una volta individuati i nodi da eliminare devo calcolare gli * operatori P e q che mi consentono di eliminare tutti questi nodi * [R, q] = eliminationOperators(A, f, index); */ /* In MEX si crea una matrice columnMajor che poi verrà trasposta perché * le matrici di Matlab sono columnMajor e se uno vuole sfruttare la * rappresentazione interna deve usarle così. * Noi invece possiamo già generare la matrice trasposta costruendo * direttamente la matrice rowMajor e "sostituendo" ai termini riga * quelli colonna. */ /* P è sempre una matrice sparsa perché il numero dei suoi nonzero * e basso anche quando A è densa */ P.resize(nf, nc, false); q.resize(nf, false); /* Quanti elemenenti abbiamo salvato in Q (e quante righe di R * abbiamo costruito) */ size_t P_row = 0; size_t P_col = 0; /* Per ogni f-riga di A prendi ciascun c-elemento di questa riga e formaci * la i-esima riga di R. L'inverso dell'f-esimo elemento di ciascuna f-riga * va messo in q. Inoltre ciascuna riga i di R va scalata di un fattore -q[i] */ for (DynamicVector<size_t>::Iterator dvit = Fset.begin(); dvit != Fset.end(); dvit++) { eliminationOperators(A, Cset, (*dvit), q, P, P_col, P_row); P_row++; //Passiamo alla prosssima riga } //Salvo i dati così creati nel cStages cStages.push_back(new qPStage(new SpMat(P), new DynamicVector<double>(q), new DynamicVector<size_t>(Fset), new DynamicVector<size_t>(Cset), (nf + nc))); /* FINE (03) [R, q] = eliminationOperators(A, f, index);*/ /* (4) Adesso devo calcolare il sistema complementare di Schur dato da * A = Ac,c + Ac,f*R^t */ /* Acc è la sottomatrice di A che ha come elementi tutti gli a_ij tali * che (ij) appartiene a Cset x Cset. Quindi per ogni riga crow devo * prenderci tutti gli elementi che hanno indice pari a ccol */ MtxOps::submatrix(A, Cset, Cset, Acc); /* Acf invece ha nc righe e nf colonne*/ MtxOps::submatrix(A, Cset, Fset, Acf); /* Finalmente posso aggiornare A*/ A = Acc + Acf * P; /* Acc_[nc x nc] + (Acf * P)_[nc x nc]. * Dunque La matrice A risultante diventa una nc x nc e perdiamo esattamente nf nodi.*/ }//Fine while(stageNum...) /* Usciti dal while dobbiamo creare il livello, se è possibile farlo */ LevelElimination* ret = NULL; if (stageNum != 0) { if (useSparse) { if (isSparseOK(A)) { ret = new LevelElimination(new SpMat(A), cStages, multiGrid.back()); } else { useSparse = false; ret = new LevelElimination(new DMat(A), cStages, multiGrid.back()); } } else { ret = new LevelElimination(new DMat(A), cStages, multiGrid.back()); } } cout << "coarsenElimination() finito" << endl; return ret; }