string FlowAnalysis::vtkExportVectorOps(const string& out, const vector<size_t>& fracA, const vector<size_t>& fracB){ if(timeSpan==0.) throw std::runtime_error("FlowAnalysis.timeSpan==0, no data was ever collected."); #if 0 if(fracA.empty()!=fracB.empty()) throw std::runtime_error("Either both fracA and fracB must be given, or both must be empty (and will be filled automatically)."); if(fracA.empty() && fracB.empty()){ fracA.resize(nFractions/2); fracB.resize(nFractions-fracA.size()); std::iota(fracA.begin(),fracA.end(),0); std::iota(fracB.begin(),fracB.end(),fracA.size()); } #endif auto grid=vtkMakeGrid(); auto cross=vtkMakeArray(grid,"cross",3,/*fillZero*/false); auto crossNorm=vtkMakeArray(grid,"|cross|",1,/*fillZero*/false); auto diff=vtkMakeArray(grid,"diff",3,/*fillZero*/false); auto diffNorm=vtkMakeArray(grid,"|diff|",1,/*fillZero*/false); auto diffA=vtkMakeArray(grid,"diffA",3,/*fillZero*/false); auto diffANorm=vtkMakeArray(grid,"|diffA|",1,/*fillZero*/false); auto diffB=vtkMakeArray(grid,"diffB",3,/*fillZero*/false); auto diffBNorm=vtkMakeArray(grid,"|diffB|",1,/*fillZero*/false); for(size_t i=0; i<fracA.size(); i++) if((int)fracA[i]>=nFractions) throw std::runtime_error("FlowAnalysis.vtkExportVectorOps: fracA["+to_string(i)+"]="+to_string(fracA[i])+" out of range 0.."+to_string(nFractions-1)); for(size_t i=0; i<fracB.size(); i++) if((int)fracB[i]>=nFractions) throw std::runtime_error("FlowAnalysis.vtkExportVectorOps: fracB["+to_string(i)+"]="+to_string(fracB[i])+" out of range 0.."+to_string(nFractions-1)); Real weightB=avgFlowNorm(fracA)/avgFlowNorm(fracB); if(isnan(weightB)){ LOG_WARN("Weighting coefficient is NaN (no flow in fraction B), using 1 instead; the result will be still mathematically correct but useless.") weightB=1.; } Vector3r _cross, _diff, _diffA, _diffB; // other conditions: resize sRes for(int i=0; i<boxCells[0]; i++){ for(int j=0; j<boxCells[1]; j++){ for(int k=0; k<boxCells[2]; k++){ int ijk[]={i,j,k}; Vector3r A(Vector3r::Zero()), B(Vector3r::Zero()); for(size_t frac: fracA) A+=Vector3r(data[frac][i][j][k][PT_FLOW_X],data[frac][i][j][k][PT_FLOW_Y],data[frac][i][j][k][PT_FLOW_Z]); for(size_t frac: fracB) B+=Vector3r(data[frac][i][j][k][PT_FLOW_X],data[frac][i][j][k][PT_FLOW_Y],data[frac][i][j][k][PT_FLOW_Z]); // compute the result _cross=A.cross(B); _diff=A-B*weightB; if(_diff.dot(A+B)>=0.){ _diffA=_diff; _diffB=Vector3r::Zero(); } else{ _diffA=Vector3r::Zero(); _diffB=-_diff; } vtkIdType dataId=grid->ComputePointId(ijk); cross->SetTuple(dataId,_cross.data()); diff->SetTuple(dataId,_diff.data()); diffA->SetTuple(dataId,_diffA.data()); diffB->SetTuple(dataId,_diffB.data()); crossNorm->SetValue(dataId,_cross.norm()); diffNorm->SetValue(dataId,_diff.norm()); diffANorm->SetValue(dataId,_diffA.norm()); diffBNorm->SetValue(dataId,_diffB.norm()); }}} return vtkWriteGrid(out+".ops",grid); }
size_t Column::LoadTextFile(std::string filepath) { std::ifstream infile; infile.open(filepath, std::ifstream::in); if (!infile.good()) { std::cerr << "Can't open file: " << filepath << std::endl; return -1; } WordUnit val; size_t id = 0; for (id = 0; (id < GetNumTuples()) && (infile >> val); id++) { SetTuple(id, val); } infile.close(); return id; }
TEST_F(LoggingTests, BasicUpdateTest) { auto recovery_table = ExecutorTestsUtil::CreateTable(1024); auto &manager = catalog::Manager::GetInstance(); storage::Database db(DEFAULT_DB_ID); manager.AddDatabase(&db); db.AddTable(recovery_table); auto tuples = BuildLoggingTuples(recovery_table, 1, false, false); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 1); EXPECT_EQ(tuples.size(), 1); logging::WriteAheadFrontendLogger fel(true); // auto bel = logging::WriteAheadBackendLogger::GetInstance(); cid_t test_commit_id = 10; Value val0 = tuples[0]->GetValue(0); Value val1 = tuples[0]->GetValue(1); Value val2 = tuples[0]->GetValue(2); Value val3 = tuples[0]->GetValue(3); auto curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_UPDATE, test_commit_id, recovery_table->GetOid(), ItemPointer(100, 5), ItemPointer(100, 4), tuples[0], DEFAULT_DB_ID); curr_rec->SetTuple(tuples[0]); fel.UpdateTuple(curr_rec); delete curr_rec; auto tg_header = recovery_table->GetTileGroupById(100)->GetHeader(); EXPECT_TRUE(tg_header->GetBeginCommitId(5) <= test_commit_id); EXPECT_EQ(tg_header->GetEndCommitId(5), MAX_CID); EXPECT_EQ(tg_header->GetEndCommitId(4), test_commit_id); EXPECT_TRUE( val0.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 0)) == 0); EXPECT_TRUE( val1.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 1)) == 0); EXPECT_TRUE( val2.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 2)) == 0); EXPECT_TRUE( val3.Compare(recovery_table->GetTileGroupById(100)->GetValue(5, 3)) == 0); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); }
TEST_F(LoggingTests, OutOfOrderCommitTest) { auto recovery_table = ExecutorTestsUtil::CreateTable(1024); auto &manager = catalog::Manager::GetInstance(); storage::Database db(DEFAULT_DB_ID); manager.AddDatabase(&db); db.AddTable(recovery_table); auto tuples = BuildLoggingTuples(recovery_table, 1, false, false); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 1); EXPECT_EQ(tuples.size(), 1); logging::WriteAheadFrontendLogger fel(true); // auto bel = logging::WriteAheadBackendLogger::GetInstance(); cid_t test_commit_id = 10; auto curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_UPDATE, test_commit_id + 1, recovery_table->GetOid(), INVALID_ITEMPOINTER, ItemPointer(100, 5), nullptr, DEFAULT_DB_ID); fel.DeleteTuple(curr_rec); delete curr_rec; EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); curr_rec = new logging::TupleRecord( LOGRECORD_TYPE_TUPLE_INSERT, test_commit_id, recovery_table->GetOid(), ItemPointer(100, 5), INVALID_ITEMPOINTER, tuples[0], DEFAULT_DB_ID); curr_rec->SetTuple(tuples[0]); fel.InsertTuple(curr_rec); delete curr_rec; auto tg_header = recovery_table->GetTileGroupById(100)->GetHeader(); EXPECT_EQ(tg_header->GetEndCommitId(5), test_commit_id + 1); EXPECT_EQ(recovery_table->GetNumberOfTuples(), 0); EXPECT_EQ(recovery_table->GetTileGroupCount(), 2); }