17   while (!(Curr == NULL && Prev == 
Root)) {
 
   19     if (Prev == NULL || Prev == Curr->
Parent) {
 
   21       if (Curr->
Left != NULL) {
 
   24       } 
else if (Curr->
Right != NULL) {
 
   32     } 
else if (Prev == Curr->
Left) {
 
  142   if (
CurrRowIdx == TTable::Last) { 
return false; }
 
  143   if (RowI.
CurrRowIdx == TTable::Last) { 
return true; }
 
  203       Result = 
TBool(
false);
 
  216   CurrRowIdx(RowIdx), Table(TablePtr), Start(RowIdx == TablePtr->FirstValidRow) {}
 
  230   if (
CurrRowIdx == TTable::Last) { 
return false; }
 
  231   if (RowI.
CurrRowIdx == TTable::Last) { 
return true; }
 
  295       Result = 
TBool(
false);
 
  303   FirstValidRow(0), LastValidRow(-1) {}
 
  306   NumValidRows(0), FirstValidRow(0), LastValidRow(-1) {}
 
  309   NumRows(0), NumValidRows(0), FirstValidRow(0), LastValidRow(-1), IsNextDirty(0) {
 
  313   for (
TInt i = 0; i < TableSchema.
Len(); i++) {
 
  314     TStr ColName = TableSchema[i].Val1;
 
  379   NumValidRows(SIn), FirstValidRow(SIn), LastValidRow(SIn), Next(SIn), IntCols(SIn),
 
  380   FltCols(SIn), StrColMaps(SIn) {
 
  387   NumValidRows(H.Len()), FirstValidRow(0), LastValidRow(H.Len()-1) {
 
  414   NumRows(H.Len()), NumValidRows(H.Len()), FirstValidRow(0), LastValidRow(H.Len()-1) {
 
  439   Sch(Table.Sch), SrcCol(Table.SrcCol), DstCol(Table.DstCol), EdgeAttrV(Table.EdgeAttrV),
 
  440   SrcNodeAttrV(Table.SrcNodeAttrV), DstNodeAttrV(Table.DstNodeAttrV),
 
  441   CommonNodeAttrs(Table.CommonNodeAttrs) {
 
  458   TSsParser Ss(InFNm, 
'\t', 
false, 
false, 
false);
 
  459   TInt rowsToPeek = 1000;
 
  461   TInt lastComment = 0;
 
  473     for (
TInt i = 0; i < numCols; i++) {
 
  476       else if (Ss.
IsFlt(i)) {
 
  484     if (currRow > rowsToPeek || Ss.
Eof()) 
break;
 
  488   TSsParser SsNames(InFNm, Separator, 
false, 
false, 
false);
 
  489   for (
int i = 0; i < lastComment; i++) { SsNames.
Next();}
 
  491   TStr first(SsNames[0]);
 
  494   if (first != comment) {
 
  495     for (
int i = 1; i < first.
Len(); i++){
 
  496       if (first[i] != 
' ') { begin = i; 
break;}
 
  500   for (
int i = 1; i < SsNames.
GetFlds(); i++) {attrV.
Add(SsNames[i]);}
 
  501   for (
TInt i = 0; i < numCols; i++) {
 
  508                         const char& Separator, 
TBool HasTitleLine) {
 
  510   TInt RowLen = T->Sch.Len();
 
  512   for (
TInt i = 0; i < RowLen; i++) {
 
  513     ColTypes[i] = T->GetSchemaColType(i);
 
  528       TInt L = strlen(Ss[i]);
 
  529       if (Ss[i][L-1] < 
' ') { Ss[i][L-1] = 0; }
 
  540   int NumThreads = omp_get_max_threads();
 
  542   uint64 Delta = Rem / NumThreads;
 
  543   if (Delta < 1) Delta = 1;
 
  550   for (
int i = 1; i < NumThreads; i++) {
 
  551     StartIntV[i] = StartIntV[i-1] + Delta;
 
  556   omp_set_num_threads(NumThreads);
 
  557   #pragma omp parallel for schedule(dynamic) reduction(+:Cnt) 
  558   for (
int i = 0; i < NumThreads; i++) {
 
  560     Cnt += LineCountV[i];
 
  565   for (
int i = 1; i < NumThreads; i++) {
 
  566     PrefixSumV[i] = PrefixSumV[i-1] + LineCountV[i-1];
 
  573   for (
TInt i = 0; i < RowLen; i++) {
 
  574     switch (ColTypes[i]) {
 
  576         T->IntCols[IntColIdx].Gen(Cnt);
 
  580         T->FltCols[FltColIdx].Gen(Cnt);
 
  589   omp_set_num_threads(NumThreads);
 
  590   #pragma omp parallel for schedule(dynamic) reduction(+:Cnt) 
  591   for (
int i = 0; i < NumThreads; i++) {
 
  599       if (FieldsV.
Len() != S.
Len()) {
 
  604       TInt RowIdx = PrefixSumV[i] + k;
 
  606       for (
TInt j = 0; j < RowLen; j++) {
 
  607         switch (ColTypes[j]) {
 
  609             if (RelevantCols.
Len() == 0) {
 
  610               T->IntCols[IntColIdx][RowIdx] = \
 
  613               T->IntCols[IntColIdx][RowIdx] = \
 
  619             if (RelevantCols.
Len() == 0) {
 
  620               T->FltCols[FltColIdx][RowIdx] = \
 
  623               T->FltCols[FltColIdx][RowIdx] = \
 
  639   T->NumValidRows = T->NumRows;
 
  644   omp_set_num_threads(NumThreads);
 
  645   #pragma omp parallel for schedule(dynamic, 10000) 
  646   for (
int64 i = 0; i < Cnt-1; i++) {
 
  650   T->Next[Cnt-1] = 
Last;
 
  651   T->LastValidRow = T->NumRows - 1;
 
  653   T->IdColName = 
"_id";
 
  654   TInt IdCol = T->IntCols.Add();
 
  655   T->IntCols[IdCol].Gen(Cnt);
 
  658   omp_set_num_threads(NumThreads);
 
  659   #pragma omp parallel for schedule(dynamic, 10000) 
  660   for (
int64 i = 0; i < Cnt; i++) {
 
  661     T->IntCols[IdCol][i] = i;
 
  664   T->AddSchemaCol(T->IdColName, 
atInt);
 
  665   T->AddColType(T->IdColName, 
atInt, T->IntCols.Len()-1);
 
  671  const char& Separator, 
TBool HasTitleLine) {
 
  673   int RowLen = T->Sch.Len();
 
  675   for (
int i = 0; i < RowLen; i++) {
 
  676     ColTypes[i] = T->GetSchemaColType(i);
 
  688     for (
int i = 0; i < Ss.
GetFlds(); i++) {
 
  690       int L = strlen(Ss[i]);
 
  691       if (Ss[i][L-1] < 
' ') { Ss[i][L-1] = 0; }
 
  707     for (
int i = 0; i < RowLen; i++) {
 
  708       switch (ColTypes[i]) {
 
  710           if (RelevantCols.
Len() == 0) {
 
  711             T->IntCols[IntColIdx].Add(Ss.
GetInt(i));
 
  713             T->IntCols[IntColIdx].Add(Ss.
GetInt(RelevantCols[i]));
 
  718           if (RelevantCols.
Len() == 0) {
 
  719             T->FltCols[FltColIdx].Add(Ss.
GetFlt(i));
 
  721             T->FltCols[FltColIdx].Add(Ss.
GetFlt(RelevantCols[i]));
 
  727           if (RelevantCols.
Len() == 0) {
 
  730             ColIdx = RelevantCols[i];
 
  733           T->AddStrVal(StrColIdx, Sval);
 
  742   T->NumRows = 
static_cast<int>(Cnt);
 
  743   T->NumValidRows = T->NumRows;
 
  746   T->Next.Gen(static_cast<int>(Cnt));
 
  747   for (
uint64 i = 0; i < Cnt-1; i++) {
 
  748     T->Next[
static_cast<int>(i)] = static_cast<int>(i+1);
 
  751   T->Next[
static_cast<int>(Cnt-1)] = 
Last;
 
  752   T->LastValidRow = T->NumRows - 1;
 
  758  const TIntV& RelevantCols, 
const char& Separator, 
TBool HasTitleLine) {
 
  760   bool NoStringCols = 
true;
 
  764   if (RelevantCols.
Len() == 0) {
 
  767     for (
int i = 0; i < RelevantCols.
Len(); i++) {
 
  768       SR.
Add(S[RelevantCols[i]]);
 
  774   for (
int i = 0; i < SR.
Len(); i++) {
 
  775     if (T->GetSchemaColType(i) == 
atStr) {
 
  776       NoStringCols = 
false;
 
  781   if (
GetMP() && NoStringCols) {
 
  785     LoadSSPar(T, S, InFNm, RelevantCols, Separator, HasTitleLine);
 
  787     LoadSSSeq(T, S, InFNm, RelevantCols, Separator, HasTitleLine);
 
  790     LoadSSSeq(T, S, InFNm, RelevantCols, Separator, HasTitleLine);
 
  796  const char& Separator, 
TBool HasTitleLine) {
 
  797   return LoadSS(S, InFNm, Context, 
TIntV(), Separator, HasTitleLine);
 
  802     printf(
"Table is empty");
 
  805   FILE* F = fopen(OutFNm.
CStr(), 
"w");
 
  808     printf(
"failed to open file %s\n", OutFNm.
CStr());
 
  821   for (
TInt i = 0; i < L-1; i++) {
 
  822     fprintf(F, 
"%s\t", DSch[i].Val1.CStr());
 
  824   fprintf(F, 
"%s\n", DSch[L-1].Val1.CStr());
 
  827     for (
TInt i = 0; i < L; i++) {
 
  828       char C = (i == L-1) ? 
'\n' : 
'\t';
 
  883   ColTypeIntMap.
Save(SOut);
 
  895   for (
TInt i = 0; i < L-1; i++) {
 
  896     fprintf(OutF, 
"%s\t", DSch[i].Val1.CStr());
 
  898   fprintf(OutF, 
"%s\n", DSch[L-1].Val1.CStr());
 
  901     for (
TInt i = 0; i < L; i++) {
 
  902       char C = (i == L-1) ? 
'\n' : 
'\t';
 
  926   for (
TInt i = 0; i < L; i++) {
 
  936       TInt RowIdx = RowI.GetRowIdx();
 
  938       printf(
"ChangeContext in  %d  %d  %d  .%s.\n",
 
  946   for (
TInt i = 0; i < L; i++) {
 
  956       TInt RowIdx = RowI.GetRowIdx();
 
  993   for (
TInt i = 0; i < Attrs.
Len(); i++) {
 
  998   for (
TInt i = 0; i < Attrs.
Len(); i++) {
 
 1115     if (
Sch[c].Val1 == NColName) {
 
 1140   Assert(RowIdx != TTable::Invalid);
 
 1141   if (RowIdx == TTable::Last) { 
return; }
 
 1154   for (
TInt i = 0; i < KeepV.
Len(); i++) {
 
 1161     if (KeepSize < KeepV.
Len()) {
 
 1179   if (
NumValidRows % NumPartitions != 0) PartitionSize++;
 
 1180   if (PartitionSize < 10) { 
 
 1184   Partitions.
Reserve(NumPartitions+1);
 
 1187   TInt currStart = currRow;
 
 1189     TInt currCount = PartitionSize;
 
 1190     while (currRow != TTable::Last) {
 
 1191       if (currCount == 0) {
 
 1192         Partitions.
Add(
TIntPr(currStart, currRow));
 
 1193         currStart = currRow;
 
 1194         currCount = PartitionSize;
 
 1196       currRow = 
Next[currRow];
 
 1199     Partitions.
Add(
TIntPr(currStart, currRow));
 
 1202     currRow += PartitionSize;
 
 1203     while (currRow != TTable::Last && currRow < 
Next.
Len()) {
 
 1204       if (
Next[currRow] == TTable::Invalid) { currRow++; 
continue; }
 
 1205       Partitions.
Add(
TIntPr(currStart, currRow));
 
 1206       currStart = currRow;
 
 1207       currRow += PartitionSize;
 
 1209     Partitions.
Add(
TIntPr(currStart, TTable::Last));
 
 1227   gettimeofday(&timer0, NULL);
 
 1232   if(!UsePhysicalIds && IdColIdx < 0){
 
 1233         TExcept::Throw(
"Grouping: Either use physical row ids, or have an id column");
 
 1239   TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 1247   #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) //num_threads(1) 
 1248   for (
int i = 0; i < Partitions.
Len(); i++){
 
 1251     while (RowI < EndI) {
 
 1254       UpdateGrouping<TInt>(Grouping, RowI.
GetIntAttr(GroupByColIdx), idx);
 
 1258   gettimeofday(&timer0, NULL);
 
 1264 #endif // GCC_ATOMIC 
 1267   TIntV RemainingRows;
 
 1274         RemainingRows.
Add(it->Dat[0]);
 
 1282         RemainingRows.
Add(it->Dat[0]);
 
 1290         RemainingRows.
Add(it->Dat[0]);
 
 1299   if(Cols.
Len() == 1){ 
 
 1306   GroupAux(NCols, Grouping, Ordered, 
"", 
true, UniqueVec, 
true);
 
 1316   for (
TInt i = 0; i < GroupAndRowIds.Len(); i++) {
 
 1317     IntCols[L-1][GroupAndRowIds[i].Val2] = GroupAndRowIds[i].Val1;
 
 1325   if(!UsePhysicalIds && IdColIdx < 0){
 
 1326         TExcept::Throw(
"Grouping: Either use physical row ids, or have an id column");
 
 1328   TIntV IntGroupByCols;
 
 1329   TIntV FltGroupByCols;
 
 1330   TIntV StrGroupByCols;
 
 1332   for (
TInt c = 0; c < GroupBy.
Len(); c++) {
 
 1339     switch (ColType.
Val1) {
 
 1341         IntGroupByCols.
Add(ColType.
Val2);
 
 1344         FltGroupByCols.
Add(ColType.
Val2);
 
 1347         StrGroupByCols.
Add(ColType.
Val2);
 
 1352   TInt IKLen = IntGroupByCols.
Len();
 
 1353   TInt FKLen = FltGroupByCols.
Len();
 
 1354   TInt SKLen = StrGroupByCols.
Len();
 
 1362     TIntV IKey(IKLen + SKLen, 0);
 
 1363     TFltV FKey(FKLen, 0);
 
 1364     TIntV SKey(SKLen, 0);
 
 1367     for (
TInt c = 0; c < IKLen; c++) {
 
 1368       IKey.
Add(it.GetIntAttr(IntGroupByCols[c])); 
 
 1370     for (
TInt c = 0; c < FKLen; c++) {
 
 1371       FKey.
Add(it.GetFltAttr(FltGroupByCols[c])); 
 
 1373     for (
TInt c = 0; c < SKLen; c++) {
 
 1374       SKey.
Add(it.GetStrMapById(StrGroupByCols[c])); 
 
 1377       if (IKLen > 0) { IKey.
ISort(0, IKey.
Len()-1, 
true); }
 
 1378       if (FKLen > 0) { FKey.
ISort(0, FKey.
Len()-1, 
true); }
 
 1379       if (SKLen > 0) { SKey.
ISort(0, SKey.
Len()-1, 
true); }
 
 1381     for (
TInt c = 0; c < SKLen; c++) {
 
 1388     TInt RowIdx = it.GetRowIdx();
 
 1389     TInt idx = UsePhysicalIds ? it.GetRowIdx() : 
IntCols[IdColIdx][it.GetRowIdx()];
 
 1390     if (!Grouping.IsKey(GroupKey)) {
 
 1393       NewGroup.
Val1 = GroupNum;
 
 1395       Grouping.AddDat(GroupKey, NewGroup);
 
 1396       if (GroupColName != 
"") {
 
 1408         if (GroupColName != 
"") {
 
 1432   if (GroupColName != 
"") {
 
 1574   GroupAux(NGroupBy, Grouping, Ordered, NGroupColName, 
false, UniqueVec, UsePhysicalIds);
 
 1588    for (
TInt c = 0; c < GroupByAttrs.
Len(); c++) {
 
 1606   TInt NumOfGroups = 0;
 
 1607   TInt GroupingCase = 0;
 
 1610   GroupStmt Stmt(NGroupByAttrs, Ordered, UsePhysicalIds);
 
 1614         if(NGroupByAttrs.
Len() == 1){
 
 1619                                         GroupByIntColMP(NGroupByAttrs[0], GroupByIntMapping_MP, UsePhysicalIds);
 
 1622                                                 GroupByIntMPKeys[x] = it.GetKey();
 
 1638 #endif // GCC_ATOMIC 
 1640                                 NumOfGroups = GroupByIntMapping.
Len();
 
 1645                                 NumOfGroups = GroupByFltMapping.
Len();
 
 1650                                 NumOfGroups = GroupByStrMapping.
Len();
 
 1658                 GroupAux(NGroupByAttrs, Mapping_aux, Ordered, 
"", 
false, UniqueVector, UsePhysicalIds);
 
 1660                         Mapping.
AddDat(it.GetKey(), it.GetDat().Val2);
 
 1662                 NumOfGroups = Mapping.
Len();
 
 1688   #pragma omp parallel for schedule(dynamic) 
 1690   for (
int g = 0; g < NumOfGroups; g++) {
 
 1691         TIntV* GroupRows = NULL;
 
 1692         switch(GroupingCase){
 
 1697                         GroupRows = & GroupByIntMapping.
GetDat(GroupByIntMapping.
GetKey(g));
 
 1700                         GroupRows = & GroupByIntMapping.
GetDat(GroupByIntMapping.
GetKey(g));
 
 1703                         GroupRows = & GroupByStrMapping.
GetDat(GroupByStrMapping.
GetKey(g));
 
 1707                         GroupRows = & GroupByIntMapping_MP.
GetDat(GroupByIntMPKeys[g]);
 
 1723         TIntV& ValidRows = *GroupRows;
 
 1725     if (sz <= 0) 
continue;
 
 1728       for (
TInt i = 0; i < sz; i++) { 
IntCols[ColIdx][ValidRows[i]] = sz; }
 
 1733         for (
TInt i = 0; i < sz; i++) { V.
Add(
IntCols[AggrColIdx][ValidRows[i]]); }
 
 1734         TInt Res = AggregateVector<TInt>(V, AggOp);
 
 1735         if (AggOp == 
aaMean) { Res = Res / sz; }
 
 1736         for (
TInt i = 0; i < sz; i++) { 
IntCols[ColIdx][ValidRows[i]] = Res; }
 
 1739         for (
TInt i = 0; i < sz; i++) { V.
Add(
FltCols[AggrColIdx][ValidRows[i]]); }
 
 1740         TFlt Res = AggregateVector<TFlt>(V, AggOp);
 
 1741         if (AggOp == 
aaMean) { Res /= sz; }
 
 1742         for (
TInt i = 0; i < sz; i++) { 
FltCols[ColIdx][ValidRows[i]] = Res; }
 
 1752   for (
TInt i = 0; i < AggrAttrs.
Len(); i++) {
 
 1754     if (Info[i].Val1 != Info[0].Val1) {
 
 1755       TExcept::Throw(
"AggregateCols: Aggregation attributes must have the same type");
 
 1759   if (Info[0].Val1 == 
atInt) {
 
 1764       TInt RowIdx = RI.GetRowIdx();
 
 1766       for (
TInt i = 0; i < AggrAttrs.
Len(); i++) {
 
 1769       IntCols[ResIdx][RowIdx] = AggregateVector<TInt>(V, AggOp);
 
 1771   } 
else if (Info[0].Val1 == 
atFlt) {
 
 1776       TInt RowIdx = RI.GetRowIdx();
 
 1778       for (
TInt i = 0; i < AggrAttrs.
Len(); i++) {
 
 1781       FltCols[ResIdx][RowIdx] = AggregateVector<TFlt>(V, AggOp);
 
 1784     TExcept::Throw(
"AggregateCols: Only Int and Flt aggregation supported right now");
 
 1793                 for(
int i = 0; i < ik.
Len(); i++){ printf(
"%d ",ik[i].Val);} 
 
 1794                 for(
int i = 0; i < fk.
Len(); i++){ printf(
"%f ",fk[i].Val);} 
 
 1797                 for(
int i = 0; i < v.
Len(); i++){ printf(
"%d ",v[i].Val);} 
 
 1804   GroupByAttrs.
Add(CountColName);
 
 1821   GroupAux(NGroupBy, Grouping, Ordered, 
"", 
false, UniqueVec);
 
 1831       ColInfo.
Add(GroupTable->GetColTypeMap(
Sch[i].Val1));
 
 1833         ColInfo[i].Val2 = -1;
 
 1841     for (
TInt i = 0; i < Rows.
Len(); i++) {
 
 1850         if (ColIdx == -1) { 
continue; }
 
 1853         switch (Info.
Val1) {
 
 1855             GroupTable->IntCols[ColIdx].Add(
IntCols[V[c]][RowIdx]);
 
 1858             GroupTable->FltCols[ColIdx].Add(
FltCols[V[c]][RowIdx]);
 
 1861             GroupTable->StrColMaps[ColIdx].Add(
StrColMaps[V[c]][RowIdx]);
 
 1866       if (GroupTable->LastValidRow >= 0) {
 
 1867         GroupTable->Next[GroupTable->LastValidRow] = GroupTable->NumRows;
 
 1869       GroupTable->Next.Add(GroupTable->Last);
 
 1870       GroupTable->LastValidRow = GroupTable->NumRows;
 
 1872       GroupTable->NumRows++;
 
 1873       GroupTable->NumValidRows++;
 
 1875     GroupTable->InitIds();
 
 1876     Result.
Add(GroupTable);
 
 1894     IntCols[IdColIdx][RI.GetRowIdx()] = IdCnt;
 
 1908     IntCols[IdCol][RI.GetRowIdx()] = IdCnt;
 
 1924     TStr CName = JointTable->RenumberColName(ColName);
 
 1926     JointTable->AddColType(CName, TypeMap);
 
 1928     JointTable->AddSchemaCol(CName, ColType);
 
 1933     TStr CName = JointTable->RenumberColName(ColName);
 
 1937     switch (NewDat.
Val1) {
 
 1948     JointTable->AddColType(CName, NewDat);
 
 1949     JointTable->AddSchemaCol(CName, ColType);
 
 1953   JointTable->AddSchemaCol(IdColName, 
atInt);
 
 1998         if(Cols1.
Len()!=Cols2.
Len()){
 
 2002         for (
TInt i = 0; i < Cols1.
Len(); i++) {
 
 2016                         TExcept::Throw(
"Column type not supported. Only Flt and Int column types are supported.");
 
 2033                                         for(
TInt i = 0; i < Cols1.
Len(); i++) {
 
 2034                                                 float attrVal1, attrVal2;
 
 2035                                                 attrVal1 = 
GetColType(Cols1[i])==
atInt ? (float)RowI.GetIntAttr(Cols1[i]) : (float)RowI.GetFltAttr(Cols1[i]);
 
 2036                                                 attrVal2 = Table.
GetColType(Cols2[i])==
atInt ? (float)RowI2.GetIntAttr(Cols2[i]) : (float)RowI2.GetFltAttr(Cols2[i]);
 
 2037                                                 distance += pow(attrVal1 - attrVal2, 2);
 
 2040                                         distance = sqrt(distance);
 
 2042                                         if(distance<=Threshold){
 
 2043                                                 JointTable->AddJointRow(*
this, Table, RowI.GetRowIdx(), RowI2.GetRowIdx());
 
 2044                                                 DistanceV.
Add(distance);
 
 2053                                                         TExcept::Throw(
"Haversine disance expects exactly two attributes - latitude and longitude - in that order.");
 
 2058                                                 float Latitude1  = 
GetColType(Cols1[0])==
atInt ? (float)RowI.GetIntAttr(Cols1[0]) : (float)RowI.GetFltAttr(Cols1[0]);
 
 2059                                                 float Latitude2 = Table.
GetColType(Cols2[0])==
atInt ? (float)RowI2.GetIntAttr(Cols2[0]) : (float)RowI2.GetFltAttr(Cols2[0]);
 
 2061                                                 float Longitude1  = 
GetColType(Cols1[1])==
atInt ? (float)RowI.GetIntAttr(Cols1[1]) : (float)RowI.GetFltAttr(Cols1[1]);
 
 2062                                                 float Longitude2  = Table.
GetColType(Cols2[1])==
atInt ? (float)RowI2.GetIntAttr(Cols2[1]) : (float)RowI2.GetFltAttr(Cols2[1]);
 
 2064                                                 Latitude1 *= 
static_cast<float>(M_PI/180.0);
 
 2065                                                 Latitude2 *= 
static_cast<float>(M_PI/180.0);
 
 2066                                                 Longitude1 *= 
static_cast<float>(M_PI/180.0);
 
 2067                                                 Longitude2 *= 
static_cast<float>(M_PI/180.0);
 
 2069                                                 float dlon = Longitude2 - Longitude1;
 
 2070                                                 float dlat = Latitude2 - Latitude1;
 
 2071                                                 float a = pow(sin(dlat/2), 2) + cos(Latitude1)*cos(Latitude2)*pow(sin(dlon/2), 2);
 
 2072                                                 float c = 2*atan2(sqrt(a), sqrt(1-a));
 
 2073                                                 distance = (
static_cast<float>(Radius.
Val))*c;
 
 2075                                                 if(distance<=Threshold){
 
 2076                                                         JointTable->AddJointRow(*
this, Table, RowI.GetRowIdx(), RowI2.GetRowIdx());
 
 2077                                                         DistanceV.
Add(distance);
 
 2089         JointTable->StoreFltCol(DistanceColName, DistanceV);
 
 2090         JointTable->InitIds();
 
 2105         for(
TInt i=0;i<2;i++){
 
 2109     JointTable->AddColType(CName, Group);
 
 2110     JointTable->AddSchemaCol(CName, 
atInt);
 
 2114         JointTable->AddColType(DistanceColName, Group);
 
 2115         JointTable->AddSchemaCol(DistanceColName, 
atFlt);
 
 2124                 TInt GroupId = 
IntCols[GroupColIdx][RowI.GetRowIdx()];
 
 2128                         if(!TIntHH.
IsKey(GroupId)){
 
 2130                                 TIntHH.
AddDat(GroupId, TIntH);
 
 2135                         TIntH.
AddDat(SimAttrVal, 0);
 
 2146                 TInt GroupId1 = it1.GetKey();
 
 2149                                 int intersectionCount = 0;
 
 2150                                 TInt GroupId2 = it2.GetKey();
 
 2155                                         TInt Val = it.GetKey();
 
 2156                                         if(Vals2H.
IsKey(Val)){
 
 2157                                                 intersectionCount+=1;
 
 2161                                 int unionCount = Vals1H.
Len() + Vals2H.
Len() - intersectionCount;
 
 2162                                 float distance = 1.0f - (float)intersectionCount/unionCount;
 
 2165                                 if(distance<=Threshold){
 
 2166                                                 JointTable->IntCols[0].Add(GroupId1);
 
 2167                                                 JointTable->IntCols[1].Add(GroupId2);
 
 2168                                                 JointTable->FltCols[0].Add(distance);
 
 2169                                                 JointTable->IncrementNext();
 
 2174   JointTable->InitIds();
 
 2181  const TStr& DistanceColName, 
const TSimType& SimType, 
const TFlt& Threshold) {
 
 2186         for(
TInt i=0; i<GroupBy.
Len(); i++)
 
 2188                 ProjectionV.
Add(GroupBy[i]);
 
 2191         ProjectionV.
Add(SimCol);
 
 2194         TStr CName = 
"Group";
 
 2197   GroupAux(NGroupBy, Grouping, 
false, CName, 
false, UniqueVec);
 
 2211                 if(!GroupIdH.
IsKey(GroupNum))
 
 2213                         TInt RandomRowId = RowIds[0];  
 
 2214                         GroupIdH.
AddDat(GroupNum, RandomRowId);
 
 2218         for(
TRowIterator RowI = GroupJointTable->BegRI(); RowI < GroupJointTable->EndRI(); RowI++)
 
 2221                 TInt GroupId1 = GroupJointTable->IntCols[0][RowI.GetRowIdx()];
 
 2222                 TInt GroupId2 = GroupJointTable->IntCols[1][RowI.GetRowIdx()];
 
 2227                 JointTable->AddJointRow(*
this, *
this, RowId1, RowId2);
 
 2232         JointTable->StoreFltCol(DistanceColName, GroupJointTable->FltCols[0]);
 
 2234         ProjectionV.
Add(DistanceColName);
 
 2238         for(
TInt i=0; i<GroupBy.
Len(); i++){
 
 2239                 for(
TInt j=0; j<JointTable->Sch.Len(); j++)
 
 2241                         TStr ColName = JointTable->Sch[j].Val1;
 
 2242                         if(ColName.
IsStrIn(GroupBy[i]))
 
 2244                                 ProjectionV.
Add(ColName);
 
 2249         JointTable->ProjectInPlace(ProjectionV);
 
 2250         JointTable->InitIds();
 
 2276     printf(
"no such column %s\n", Col1.
CStr());
 
 2280     printf(
"no such column %s\n", Col2.
CStr());
 
 2284     printf(
"Trying to Join on columns of different type\n");
 
 2293   const TTable& TS = ThisIsSmaller ? *
this : Table;
 
 2294   const TTable& TB = ThisIsSmaller ?  Table : *
this;
 
 2295   TStr ColS = ThisIsSmaller ? Col1 : Col2;
 
 2296   TStr ColB = ThisIsSmaller ? Col2 : Col1;
 
 2313         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 2318         #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD)  
 2319         for (
int i = 0; i < Partitions.
Len(); i++){
 
 2321           JointRowIDSet[i].
Reserve(PartitionSize);
 
 2324           while (RowI < EndI) {
 
 2328               for(
TInt j = 0; j < Group.
Len(); j++){
 
 2344         JointTable->AddNJointRowsMP(*
this, Table, JointRowIDSet);      
 
 2355         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 2358         #pragma omp parallel for schedule(dynamic)  
 2359         for (
int i = 0; i < Partitions.
Len(); i++){
 
 2360           JointRowIDSet[i].
Reserve(PartitionSize);
 
 2363           while (RowI < EndI) {
 
 2367               for(
TInt j = 0; j < Group.
Len(); j++){
 
 2378         JointTable->AddNJointRowsMP(*
this, Table, JointRowIDSet);
 
 2387         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 2390         #pragma omp parallel for schedule(dynamic)  
 2391         for (
int i = 0; i < Partitions.
Len(); i++){
 
 2392           JointRowIDSet[i].
Reserve(PartitionSize);
 
 2395           while (RowI < EndI) {
 
 2399               for(
TInt j = 0; j < Group.
Len(); j++){
 
 2410         JointTable->AddNJointRowsMP(*
this, Table, JointRowIDSet);
 
 2415 #endif // GCC_ATOMIC 
 2421           TInt K = RowI.GetIntAttr(ColBId);
 
 2424             for (
TInt i = 0; i < Group.
Len(); i++) {
 
 2425               if (ThisIsSmaller) {
 
 2426                 JointTable->AddJointRow(*
this, Table, Group[i], RowI.GetRowIdx());
 
 2428                 JointTable->AddJointRow(*
this, Table, RowI.GetRowIdx(), Group[i]);
 
 2439           TFlt K = RowI.GetFltAttr(ColBId);
 
 2442             for (
TInt i = 0; i < Group.
Len(); i++) {
 
 2443               if (ThisIsSmaller) {
 
 2444                 JointTable->AddJointRow(*
this, Table, Group[i], RowI.GetRowIdx());
 
 2446                 JointTable->AddJointRow(*
this, Table, RowI.GetRowIdx(), Group[i]);
 
 2457           TInt K = RowI.GetStrMapById(ColBId);
 
 2460             for (
TInt i = 0; i < Group.
Len(); i++) {
 
 2461               if (ThisIsSmaller) {
 
 2462                 JointTable->AddJointRow(*
this, Table, Group[i], RowI.GetRowIdx());
 
 2464                 JointTable->AddJointRow(*
this, Table, RowI.GetRowIdx(), Group[i]);
 
 2479   const TStr& KeyCol2, 
const TStr& JoinCol2){
 
 2481     printf(
"no such column %s\n", KeyCol1.
CStr());
 
 2485     printf(
"no such column %s\n", KeyCol2.
CStr());
 
 2489     printf(
"no such column %s\n", JoinCol1.
CStr());
 
 2493     printf(
"no such column %s\n", JoinCol2.
CStr());
 
 2497     printf(
"Trying to Join on columns of different type\n");
 
 2501     printf(
"Key type mismatch\n");
 
 2513       if(JoinColType == 
atStr){
 
 2514         JVal = RowI.GetStrMapById(JoinColIdxB);
 
 2516         JVal = RowI.GetIntAttr(JoinColIdxB);
 
 2522         if(KeyType == 
atStr){
 
 2523           KeyB = RowI.GetStrMapById(KeyColIdxB);
 
 2525           KeyB = RowI.GetIntAttr(KeyColIdxB);
 
 2529         for(
int i = 0; i < RelevantRows.
Len(); i++){
 
 2532           if(KeyType == 
atStr){
 
 2533             KeyS = TS.
StrColMaps[KeyColIdxS][RelevantRows[i]];
 
 2535             KeyS = TS.
IntCols[KeyColIdxS][RelevantRows[i]];
 
 2539           if(Counters.
IsKey(Keys)){
 
 2547               Counters.
AddDat(Keys, 
TIntTr(RelevantRows[i], RowI.GetRowIdx(),1));
 
 2549               Counters.
AddDat(Keys, 
TIntTr(RowI.GetRowIdx(), RelevantRows[i],1));
 
 2563       if(JoinColType == 
atStr){
 
 2564         JVal = RowI.GetStrMapById(JoinColIdxB);
 
 2566         JVal = RowI.GetIntAttr(JoinColIdxB);
 
 2572         if(KeyType == 
atStr){
 
 2573           KeyB = RowI.GetStrMapById(KeyColIdxB);
 
 2575           KeyB = RowI.GetIntAttr(KeyColIdxB);
 
 2579         for(
int i = 0; i < RelevantRows.
Len(); i++){
 
 2582           if(KeyType == 
atStr){
 
 2583             KeyS = TS.
StrColMaps[KeyColIdxS][RelevantRows[i]];
 
 2585             KeyS = TS.
IntCols[KeyColIdxS][RelevantRows[i]];
 
 2590           if(Counters.
IsKey(K)){
 
 2598               Counters.
AddDat(K, 
TIntTr(RelevantRows[i], RowI.GetRowIdx(),1));
 
 2600               Counters.
AddDat(K, 
TIntTr(RowI.GetRowIdx(), RelevantRows[i],1));
 
 2612     TIntTr& Counter = iter.GetDat();
 
 2615     if(Counter.
Val3 >= Threshold){
 
 2616       JointTable->AddJointRow(*
this, Table, Counter.
Val1, Counter.
Val2);
 
 2625     const TIntTr& Counter = iter.GetDat();
 
 2626     const TIntTr& Keys = iter.GetKey();
 
 2628     if(Counter.
Val3 >= Threshold){
 
 2630       if(!Pairs.
IsKey(K)){
 
 2632         JointTable->AddJointRow(*
this, Table, Counter.
Val1, Counter.
Val2);
 
 2655   const TTable& TS = ThisIsSmaller ? *
this : Table;
 
 2656   const TTable& TB = ThisIsSmaller ?  Table : *
this;
 
 2657   TStr JoinColS = JoinCol1;
 
 2662         JoinColS = JoinCol2;
 
 2674     printf(
"ThresholdJoin only supports integer or string key attributes\n");
 
 2675     TExcept::Throw(
"ThresholdJoin only supports integer or string key attributes");
 
 2677   if(JoinColType != 
atInt && JoinColType != 
atStr){
 
 2678     printf(
"ThresholdJoin only supports integer or string join attributes\n");
 
 2679     TExcept::Throw(
"ThresholdJoin only supports integer or string join attributes");
 
 2684   if(JoinColType == 
atInt){
 
 2686   } 
else if(JoinColType == 
atStr){
 
 2689     TExcept::Throw(
"ThresholdJoin only supports integer or string join attributes");
 
 2754   TInt NumRelevantCols = RelevantCols.
Len();
 
 2757   for (
TInt i = 0; i < NumRelevantCols; i++) {
 
 2759     ColIndices[i] = 
GetColIdx(RelevantCols[i]);
 
 2766       for (
TInt i = 0; i < NumRelevantCols; i++) {
 
 2767         switch (ColTypes[i]) {
 
 2779       if (!Predicate.
Eval()) { 
 
 2787       for (
TInt i = 0; i < NumRelevantCols; i++) {
 
 2788         switch (ColTypes[i]) {
 
 2790           Predicate.
SetIntVal(RelevantCols[i], RowI.GetIntAttr(RelevantCols[i]));
 
 2793           Predicate.
SetFltVal(RelevantCols[i], RowI.GetFltAttr(RelevantCols[i]));
 
 2796           Predicate.
SetStrVal(RelevantCols[i], RowI.GetStrAttr(RelevantCols[i]));
 
 2800       if (Predicate.
Eval()) { SelectedRows.
Add(RowI.GetRowIdx()); }
 
 2807   Select(Predicate, SelectedRows, 
false);
 
 2808   ClassifyAux(SelectedRows, LabelName, PositiveLabel, NegativeLabel);
 
 2861       if (Result) { SelectedRows.
Add(RowI.GetRowIdx()); }
 
 2867   const TStr& LabelName, 
const TInt& PositiveLabel, 
const TInt& NegativeLabel) {
 
 2870   ClassifyAux(SelectedRows, LabelName, PositiveLabel, NegativeLabel);
 
 2881     TExcept::Throw(
"SelectAtomicConst: coltype does not match const type"); 
 
 2891       TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 2892       int RemoveCount = 0;
 
 2899       #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) reduction(+:RemoveCount) 
 2900       for (
int i = 0; i < Partitions.
Len(); i++){
 
 2907         while (RowI < EndI) {
 
 2910           if (Type != 
atStr) {
 
 2920             if (First) { FirstRowIdx = CurrRowIdx; First = 
false; } 
 
 2921             else { 
Next[LastRowIdx] = CurrRowIdx; }
 
 2922             LastRowIdx = CurrRowIdx; 
 
 2925         Bounds[i] = 
TIntPr(FirstRowIdx, LastRowIdx);
 
 2934       while (CurrBound < Bounds.Len() && Bounds[CurrBound].Val1 == 
TTable::Invalid) {
 
 2937       if (CurrBound == Bounds.Len()) {
 
 2947         TInt PrevBound = CurrBound;
 
 2949         while (CurrBound < Bounds.Len()) {
 
 2950           if (Bounds[CurrBound].Val1 == TTable::Invalid) { CurrBound++; 
continue; }
 
 2951           Next[Bounds[PrevBound].Val2] = Bounds[CurrBound].Val1;
 
 2953           PrevBound = CurrBound;
 
 2982       TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 2986       int TotalSelectedRows = 0;
 
 2987       #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) reduction(+:TotalSelectedRows) 
 2988       for (
int i = 0; i < Partitions.
Len(); i++){
 
 2991         while (RowI < EndI) {
 
 2992           if (Type != 
atStr) {
 
 2994               TotalSelectedRows++;
 
 2998               TotalSelectedRows++;
 
 3007       SelectedTable->ResizeTable(TotalSelectedRows);
 
 3011       if (TotalSelectedRows == 0) {
 
 3016       #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) 
 3017       for (
int i = 0; i < Partitions.
Len(); i++){
 
 3018         TIntV LocalSelectedRows;
 
 3019         LocalSelectedRows.
Reserve(PartitionSize);
 
 3022         while (RowI < EndI) {
 
 3023           if (Type != 
atStr) {
 
 3034         SelectedTable->AddSelectedRows(*
this, LocalSelectedRows);
 
 3044       SelectedTable->SetFirstValidRow();
 
 3048         if (RowI.CompareAtomicConst(ColIdx, Val, Cmp)) { 
 
 3049           SelectedTable->AddRowI(RowI);
 
 3057       if (RowI.CompareAtomicConst(ColIdx, Val, Cmp)) { 
 
 3058         SelectedRows.
Add(RowI.GetRowIdx());
 
 3066   switch (CompareByType) {
 
 3068       if (
IntCols[CompareByIndex][R1] > 
IntCols[CompareByIndex][R2]) { 
return (Asc ? 1 : -1); }
 
 3069       if (
IntCols[CompareByIndex][R1] < 
IntCols[CompareByIndex][R2]) { 
return (Asc ? -1 : 1); }
 
 3073       if (
FltCols[CompareByIndex][R1] > 
FltCols[CompareByIndex][R2]) { 
return (Asc ? 1 : -1); }
 
 3074       if (
FltCols[CompareByIndex][R1] < 
FltCols[CompareByIndex][R2]) { 
return (Asc ? -1 : 1); }
 
 3080       int CmpRes = strcmp(S1.
CStr(), S2.
CStr());
 
 3081       return (Asc ? CmpRes : -CmpRes);
 
 3089   for (
TInt i = 0; i < CompareByTypes.
Len(); i++) {
 
 3090     TInt res = 
CompareRows(R1, R2, CompareByTypes[i], CompareByIndices[i], Asc);
 
 3091     if (res != 0) { 
return res; }
 
 3097   if (StartIdx < EndIdx) {
 
 3098     for (
TInt i = StartIdx+1; i <= EndIdx; i++) {
 
 3101       while ((StartIdx < j) && (
CompareRows(V[j-1], Val, SortByTypes, SortByIndices, Asc) > 0)) {
 
 3111   TInt L = EndIdx - StartIdx + 1;
 
 3115   if (
CompareRows(V[Idx1], V[Idx2], SortByTypes, SortByIndices, Asc) < 0) {
 
 3116     if (
CompareRows(V[Idx2], V[Idx3], SortByTypes, SortByIndices, Asc) < 0) { 
return Idx2; }
 
 3117     if (
CompareRows(V[Idx1], V[Idx3], SortByTypes, SortByIndices, Asc) < 0) { 
return Idx3; }
 
 3120     if (
CompareRows(V[Idx3], V[Idx2], SortByTypes, SortByIndices, Asc) < 0) { 
return Idx2; }
 
 3121     if (
CompareRows(V[Idx3], V[Idx1], SortByTypes, SortByIndices, Asc) < 0) { 
return Idx3; }
 
 3130   for (j = StartIdx; j < EndIdx; j++) {
 
 3131     if (
CompareRows(V[j], V[j+1], SortByTypes, SortByIndices, Asc) > 0) {
 
 3139   TInt PivotIdx = 
GetPivot(V, StartIdx, EndIdx, SortByTypes, SortByIndices, Asc);
 
 3140   TInt Pivot = V[PivotIdx];
 
 3141   V.
Swap(PivotIdx, EndIdx);
 
 3142   TInt StoreIdx = StartIdx;
 
 3143   for (
TInt i = StartIdx; i < EndIdx; i++) {
 
 3144     if (
CompareRows(V[i], Pivot, SortByTypes, SortByIndices, Asc) <= 0) {
 
 3145       V.
Swap(i, StoreIdx);
 
 3150   V.
Swap(StoreIdx, EndIdx);
 
 3155   if (StartIdx < EndIdx) {
 
 3156     if (EndIdx - StartIdx < 20) {
 
 3157       ISort(V, StartIdx, EndIdx, SortByTypes, SortByIndices, Asc);
 
 3159       TInt Pivot = 
Partition(V, StartIdx, EndIdx, SortByTypes, SortByIndices, Asc);
 
 3160       if (Pivot > EndIdx) {
 
 3169         V[Ub], V[Pivot], SortByTypes, SortByIndices, Asc) == 0) {
 
 3172       QSort(V, StartIdx, Ub, SortByTypes, SortByIndices, Asc);
 
 3173       QSort(V, Pivot+1, EndIdx, SortByTypes, SortByIndices, Asc);
 
 3179   TInt i = Idx1, j = Idx2;
 
 3181   while  (i < Idx2 && j < Idx3) {
 
 3182     if (
CompareRows(V[i], V[j], SortByTypes, SortByIndices, Asc) <= 0) {
 
 3200   for (
TInt sz = 0; sz < Idx3 - Idx1; sz++) {
 
 3201     V[Idx1 + sz] = SortedV[sz];
 
 3207   TInt NumThreads = 8; 
 
 3210   for (
TInt i = 0; i < NumThreads; i++) {
 
 3211     IndV.
Add(i * (Sz / NumThreads));
 
 3215   omp_set_num_threads(NumThreads);
 
 3216   #pragma omp parallel for 
 3217   for (
int i = 0; i < NumThreads; i++) {
 
 3218     QSort(V, IndV[i], IndV[i+1] - 1, SortByTypes, SortByIndices, Asc);
 
 3221   while (NumThreads > 1) {
 
 3222     omp_set_num_threads(NumThreads / 2);
 
 3223     #pragma omp parallel for 
 3224     for (
int i = 0; i < NumThreads; i += 2) {
 
 3225       Merge(V, IndV[i], IndV[i+1], IndV[i+2], SortByTypes, SortByIndices, Asc);
 
 3229     for (
TInt i = 0; i < NumThreads; i+=2) {
 
 3235     NumThreads = NumThreads / 2;
 
 3238 #endif // USE_OPENMP 
 3250       ValidRows[i] = RI.GetRowIdx();
 
 3255   TIntV OrderByIndices(OrderBy.
Len());
 
 3256   for (
TInt i = 0; i < OrderBy.
Len(); i++) {
 
 3258     OrderByIndices[i] = 
GetColIdx(OrderBy[i]);
 
 3264     QSortPar(ValidRows, OrderByTypes, OrderByIndices, Asc);
 
 3280     Next[ValidRows[i]] = ValidRows[i+1];
 
 3282   if (NumValidRows > 0) {
 
 3283     Next[ValidRows[NumValidRows-1]] = 
Last;
 
 3290   if (!OrderColName.
Empty()) {
 
 3293       RankCol[ValidRows[i]] = i;
 
 3295     if (ResetRankByMSC) {
 
 3297         TStr GroupName = OrderBy[0];
 
 3299           RankCol[ValidRows[i]] = 0;
 
 3301           RankCol[ValidRows[i]] = RankCol[ValidRows[i-1]] + 1;
 
 3318     if (
Next[i] != TTable::Invalid) {  
 
 3320       if (FreeIndex == 0) {
 
 3326         Next[FreeIndex] = FreeIndex + 1;
 
 3327         Mapping.
Add(FreeIndex);
 
 3349       Mapping.
Add(TTable::Invalid);
 
 3365     if (!(RowI < 
EndRI())) {
 
 3377   TInt CurrId = LastId;
 
 3389   if (!NodeVals.
IsKey(NodeId)) {
 
 3390     Graph->AddNode(NodeId);
 
 3402         Graph->AddIntAttrDatE(RowId, 
IntCols[Index][RowId], ColName);
 
 3405         Graph->AddFltAttrDatE(RowId, 
FltCols[Index][RowId], ColName);
 
 3408         Graph->AddStrAttrDatE(RowId, 
GetStrValIdx(Index, RowId), ColName);
 
 3416   for (
TInt i = 0; i < NodeAttrV.
Len(); i++) {
 
 3417     TStr ColAttr = NodeAttrV[i];
 
 3428       if (!NodeIntAttrs.
IsKey(NId)) { NodeIntAttrs.
AddKey(NId); }
 
 3431     } 
else if (CT == 
atFlt) {
 
 3432       if (!NodeFltAttrs.
IsKey(NId)) { NodeFltAttrs.
AddKey(NId); }
 
 3436       if (!NodeStrAttrs.
IsKey(NId)) { NodeStrAttrs.
AddKey(NId); }
 
 3464     TInt CurrRowIdx = *it;
 
 3468     if (NodeType == 
atFlt) {
 
 3473     } 
else if (NodeType == 
atInt || NodeType == 
atStr) {
 
 3474       if (NodeType == 
atInt) {
 
 3475         SVal = 
IntCols[SrcColIdx][CurrRowIdx];
 
 3476         DVal = 
IntCols[DstColIdx][CurrRowIdx];
 
 3483       if (!Graph->IsNode(SVal)) { Graph->AddNode(SVal); }
 
 3484       if (!Graph->IsNode(DVal)) { Graph->AddNode(DVal); }
 
 3490     Graph->AddEdge(SVal, DVal, CurrRowIdx);
 
 3504     for (
TNEANet::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) {
 
 3505       TInt NId = NodeI.GetId();
 
 3506       if (NodeIntAttrs.
IsKey(NId)) {
 
 3510           Graph->AddIntAttrDatN(NId, AttrVal, it.GetKey());
 
 3513       if (NodeFltAttrs.
IsKey(NId)) {
 
 3517           Graph->AddFltAttrDatN(NId, AttrVal, it.GetKey());
 
 3520       if (NodeStrAttrs.
IsKey(NId)) {
 
 3524           Graph->AddStrAttrDatN(NId, AttrVal, it.GetKey());
 
 3542   for (
TInt i = 0; i < NumBuckets; i++) {
 
 3548   Assert (JumpSize <= WindowSize);
 
 3549   int NumBuckets, MinBucket, MaxBucket;
 
 3558         if (MinValue > 
IntCols[SplitColId][i]) {
 
 3559           MinValue = 
IntCols[SplitColId][i];
 
 3561         if (MaxValue < 
IntCols[SplitColId][i]) {
 
 3562           MaxValue = 
IntCols[SplitColId][i];
 
 3567     if (StartVal == 
TInt::Mn) StartVal = MinValue;
 
 3568     if (EndVal == 
TInt::Mx) EndVal = MaxValue;
 
 3574     NumBuckets = (EndVal - StartVal)/JumpSize + 1;
 
 3582     int SplitVal = 
IntCols[SplitColId][i];
 
 3583     if (SplitVal < StartVal || SplitVal > EndVal) { 
continue; }
 
 3584     int RowVal = SplitVal - StartVal;
 
 3585     if (JumpSize == 0) { 
 
 3586       MinBucket = RowVal/WindowSize;
 
 3587       MaxBucket = NumBuckets-1;
 
 3588     } 
else if (JumpSize == WindowSize) { 
 
 3589       MinBucket = MaxBucket = RowVal/JumpSize;  
 
 3591       if (RowVal < WindowSize) { MinBucket = 0; }
 
 3592       else { MinBucket = (RowVal-WindowSize)/JumpSize + 1; }
 
 3593       MaxBucket = RowVal/JumpSize;  
 
 3601   int NumBuckets = SplitIntervals.
Len();
 
 3607     int SplitVal = 
IntCols[SplitColId][i];
 
 3608     for (
TInt j = 0; j < SplitIntervals.
Len(); j++) { 
 
 3609       if (SplitVal >= SplitIntervals[j].Val1 && SplitVal < SplitIntervals[j].Val2) {
 
 3622     GraphSequence.
Add(PNet);
 
 3625   return GraphSequence;
 
 3653   printf(
"buckets filled\n");
 
 3701   for (
TInt i = 0; i < IntAttrNames.
Len(); i++) {
 
 3704   for (
TInt i = 0; i < FltAttrNames.
Len(); i++) {
 
 3707   for (
TInt i = 0; i < StrAttrNames.
Len(); i++) {
 
 3715   while (NodeI < Network->EndNI()) {
 
 3716     T->IntCols[0].Add(NodeI.
GetId());
 
 3717     for (
TInt i = 0; i < IntAttrNames.
Len(); i++) {
 
 3718       T->IntCols[i+1].Add(Network->GetIntAttrDatN(NodeI,IntAttrNames[i]));
 
 3720     for (
TInt i = 0; i < FltAttrNames.
Len(); i++) {
 
 3721       T->FltCols[i].Add(Network->GetFltAttrDatN(NodeI,FltAttrNames[i]));
 
 3723     for (
TInt i = 0; i < StrAttrNames.
Len(); i++) {
 
 3724       T->AddStrVal(i, Network->GetStrAttrDatN(NodeI,StrAttrNames[i]));
 
 3731   T->NumValidRows = T->NumRows;
 
 3732   T->Next = 
TIntV(T->NumRows,0);
 
 3733   for (
TInt i = 0; i < T->NumRows-1; i++) {
 
 3736   T->LastValidRow = T->NumRows-1;
 
 3755   for (
TInt i = 0; i < IntAttrNames.
Len(); i++) {
 
 3758   for (
TInt i = 0; i < FltAttrNames.
Len(); i++) {
 
 3761   for (
TInt i = 0; i < StrAttrNames.
Len(); i++) {
 
 3770   while (EdgeI < Network->EndEI()) {
 
 3771     T->IntCols[0].Add(EdgeI.
GetId());
 
 3774     for (
TInt i = 0; i < IntAttrNames.
Len(); i++) {
 
 3775       T->IntCols[i+3].Add(Network->GetIntAttrDatE(EdgeI,IntAttrNames[i]));
 
 3777     for (
TInt i = 0; i < FltAttrNames.
Len(); i++) {
 
 3778       T->FltCols[i].Add(Network->GetFltAttrDatE(EdgeI,FltAttrNames[i]));
 
 3780     for (
TInt i = 0; i < StrAttrNames.
Len(); i++) {
 
 3781       T->AddStrVal(i, Network->GetStrAttrDatE(EdgeI,StrAttrNames[i]));
 
 3788   T->NumValidRows = T->NumRows;
 
 3789   T->Next = 
TIntV(T->NumRows,0);
 
 3790   for (
TInt i = 0; i < T->NumRows-1; i++) {
 
 3793   T->LastValidRow = T->NumRows-1;
 
 3806   TInt NumEdges = Network->GetEdges();
 
 3807   TInt NumPartitions = omp_get_max_threads()*CHUNKS_PER_THREAD;
 
 3808   TInt PartitionSize = NumEdges/NumPartitions;
 
 3809   if (PartitionSize*NumPartitions < NumEdges) { NumPartitions++;}
 
 3813   TIntV PartitionSizes;
 
 3816   while (FirstEI < Network->EndEI()){
 
 3817     if (currCount == PartitionSize) {
 
 3818       Partitions.
Add(TEIPr(currStart, FirstEI));
 
 3819       currStart = FirstEI;
 
 3820       PartitionSizes.
Add(currCount);
 
 3828   Partitions.
Add(TEIPr(currStart, FirstEI));
 
 3829   PartitionSizes.
Add(currCount);
 
 3831   T->ResizeTable(NumEdges);
 
 3832   #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) 
 3833   for (
int p = 0; p < Partitions.
Len(); p++) {
 
 3837     int start = T->GetEmptyRowsStart(PartitionSizes[p]);
 
 3838     while (EdgeI < EndI) {
 
 3839       T->IntCols[0][start] = EdgeI.
GetSrcNId();
 
 3840       T->IntCols[1][start] = EdgeI.
GetDstNId();
 
 3842       if (EdgeI < EndI) { T->Next[start] = start+1;}
 
 3847   Assert(T->NumRows == NumEdges);
 
 3850 #endif // GCC_ATOMIC 
 3853  const TStr& NodeAttrName, 
const TAttrType& NodeAttrType, 
const TStr& PropertyAttrName, 
 
 3860   TInt NodeColIdx = T->GetColIdx(NodeAttrName);
 
 3863   for (
TNEANet::TNodeI NodeI = Network->BegNI(); NodeI < Network->EndNI(); NodeI++) {
 
 3864     switch (NodeAttrType) {
 
 3866         T->IntCols[NodeColIdx].Add(Network->GetIntAttrDatN(NodeI,NodeAttrName));
 
 3869         T->FltCols[NodeColIdx].Add(Network->GetFltAttrDatN(NodeI,NodeAttrName));
 
 3872         T->AddStrVal(
TInt(0), Network->GetStrAttrDatN(NodeI,NodeAttrName));
 
 3875     T->FltCols[0].Add(Property.
GetDat(NodeI.GetId()));
 
 3880   T->NumValidRows = T->NumRows;
 
 3881   T->Next = 
TIntV(T->NumRows,0);
 
 3882   for (
TInt i = 0; i < T->NumRows-1; i++) {
 
 3885   T->LastValidRow = T->NumRows-1;
 
 3893   if (GroupBy.
Empty()) {
 
 3894     OrderBy.
Add(OrderCol);
 
 3896     OrderBy.
Add(GroupBy);
 
 3897     OrderBy.
Add(OrderCol);
 
 3899   if (RankColName.
Empty()) {
 
 3902     Order(OrderBy, RankColName, 
true);
 
 3907     TInt Succ = RI.GetRowIdx();
 
 3908     TBool OutOfGroup = 
false;
 
 3909     for (
TInt i = 0; i < K; i++) {
 
 3911       if (Succ == 
Last) { 
break; }
 
 3912       switch (GroupByAttrType) {
 
 3914           if (
GetIntVal(GroupBy, Succ) != RI.GetIntAttr(GroupBy)) { OutOfGroup = 
true; }
 
 3917           if (
GetFltVal(GroupBy, Succ) != RI.GetFltAttr(GroupBy)) { OutOfGroup = 
true; }
 
 3920           if (
GetStrVal(GroupBy, Succ) != RI.GetStrAttr(GroupBy)) { OutOfGroup = 
true; }
 
 3923       if (OutOfGroup) { 
break; }  
 
 3924       T->AddJointRow(*
this, *
this, RI.GetRowIdx(), Succ);
 
 3931         printf(
"Total number of rows: %d\n", 
NumRows.
Val);
 
 3933         printf(
"Number of Int columns: %d\n", 
IntCols.
Len());
 
 3934         printf(
"Number of Flt columns: %d\n", 
FltCols.
Len());
 
 3937         printf(
"Approximate table size is %s KB\n", 
TUInt64::GetStr(MemUsed).CStr());
 
 3941   TSize ApproxSize = 0;
 
 3960         printf(
"Number of strings in pool: ");
 
 3962         printf(
"Number of entries in hash table: ");
 
 3965         printf(
"Approximate context size is %s KB\n",
 
 3970         TSize ApproxSize = 0;
 
 3983     if (TColIdx < 0) { 
TExcept::Throw(
"when adding a table, it must contain all columns of source table!"); }
 
 3998   for (
TInt i = 0; i < TNext.
Len(); i++) {
 
 4020   TIntV IntGroupByCols;
 
 4021   TIntV FltGroupByCols;
 
 4022   TIntV StrGroupByCols;
 
 4024   TInt IKLen, FKLen, SKLen;
 
 4034     if (
Sch[c] != Table.
Sch[c]) {
 
 4035       printf(
"(%s,%d) != (%s,%d)\n", 
Sch[c].Val1.CStr(), 
Sch[c].Val2, Table.
Sch[c].Val1.CStr(), Table.
Sch[c].Val2); 
 
 4040     switch (ColType.
Val1) {
 
 4042         IntGroupByCols.
Add(ColType.
Val2);
 
 4045         FltGroupByCols.
Add(ColType.
Val2);
 
 4048         StrGroupByCols.
Add(ColType.
Val2);
 
 4053   IKLen = IntGroupByCols.
Len();
 
 4054   FKLen = FltGroupByCols.
Len();
 
 4055   SKLen = StrGroupByCols.
Len();
 
 4058   GroupAux(GroupBy, Grouping, 
true, 
"", 
false, UniqueVec, 
true);
 
 4063     TIntV IKey(IKLen + SKLen, 0);
 
 4064     TFltV FKey(FKLen, 0);
 
 4067     for (
TInt c = 0; c < IKLen; c++) {
 
 4068       IKey.
Add(it.GetIntAttr(IntGroupByCols[c])); 
 
 4070     for (
TInt c = 0; c < FKLen; c++) {
 
 4071       FKey.
Add(it.GetFltAttr(FltGroupByCols[c])); 
 
 4073     for (
TInt c = 0; c < SKLen; c++) {
 
 4074       IKey.
Add(it.GetStrMapById(StrGroupByCols[c])); 
 
 4079     TInt RowIdx = it.GetRowIdx();
 
 4080     if (Grouping.
IsKey(GroupKey)) {
 
 4082       Collisions.
AddKey(RowIdx);
 
 4089     printf(
"new column dimension must agree with number of rows\n");
 
 4097     IntCols[ColIdx][RI.GetRowIdx()] = ColVals[i];
 
 4106     printf(
"new column dimension must agree with number of rows\n");
 
 4114     FltCols[ColIdx][RI.GetRowIdx()] = ColVals[i];
 
 4123     printf(
"new column dimension must agree with number of rows\n");
 
 4156         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 4157         #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) 
 4158         for (
int i = 0; i < Partitions.
Len(); i++){
 
 4171   return(__sync_bool_compare_and_swap(lock, 0, 1));
 
 4176     TFlt DefaultFltVal) {
 
 4200         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 4210         #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) // num_threads(1) 
 4211                           for (
int i = 0; i < Partitions.
Len(); i++) {
 
 4214                                   while (RowI < EndI) {
 
 4216             if (Grouping.
IsKey(K)) {
 
 4218               for (
int j = 0; j < UpdateRows.
Len(); j++) {
 
 4219                 int* lock = &Locks[UpdateRows[j]].Val;
 
 4240 #endif  // GCC_ATOMIC 
 4243   const TStr& FKeyAttr, 
const TStr& ReadAttr, 
TFlt DefaultFltVal){
 
 4254 #endif  // GCC_ATOMIC 
 4269     FltCols[UpdateColIdx][iter.GetRowIdx()] = DefaultFltVal;
 
 4278           TInt K = RI.GetIntAttr(NFKeyAttr);
 
 4279           if (Grouping.
IsKey(K)) {
 
 4281             for (
int i = 0; i < UpdateRows.
Len(); i++) {
 
 4282               FltCols[UpdateColIdx][UpdateRows[i]] = RI.GetFltAttr(NReadAttr);
 
 4318   for (
TInt c = 0; c < IntVals.
Len(); c++) {
 
 4321   for (
TInt c = 0; c < FltVals.
Len(); c++) {
 
 4324   for (
TInt c = 0; c < StrVals.
Len(); c++) {
 
 4331   if (RowCount == 0) {
 
 4342     #pragma omp parallel for schedule(static) 
 4344     for (
int i = 0; i < TotalCols+1; i++) {
 
 4345       if (i < FltOffset) {
 
 4347       } 
else if (i < StrOffset) {
 
 4349       } 
else if (i < TotalCols) {
 
 4355   } 
else if (
Next.
Len() > RowCount) {
 
 4360     #pragma omp parallel for schedule(static) 
 4362     for (
int i = 0; i < TotalCols+1; i++) {
 
 4363       if (i < FltOffset) {
 
 4365       } 
else if (i < StrOffset) {
 
 4367       } 
else if (i < TotalCols) {
 
 4379   #pragma omp critical 
 4400   int NewRows = RowIDs.
Len();
 
 4401   if (NewRows == 0) { 
return; }
 
 4404   for (
TInt r = 0; r < NewRows; r++) {
 
 4405     TInt CurrRowIdx = RowIDs[r];
 
 4416   for (
TInt r = 0; r < NewRows-1; r++) {
 
 4417     Next[start+r] = start+r+1;
 
 4422   if (NewRows == 0) { 
return; }
 
 4425   for (
TInt r = 0; r < NewRows; r++) {
 
 4426     for (
TInt i = 0; i < IntColsP.
Len(); i++) {
 
 4427       IntCols[i][start+r] = IntColsP[i][r];
 
 4429     for (
TInt i = 0; i < FltColsP.
Len(); i++) {
 
 4430       FltCols[i][start+r] = FltColsP[i][r];
 
 4432     for (
TInt i = 0; i < StrColMapsP.
Len(); i++) {
 
 4436   for (
TInt r = 0; r < NewRows-1; r++) {
 
 4437     Next[start+r] = start+r+1;
 
 4444   int JointTableSize = 0;
 
 4445   TIntV StartOffsets(JointRowIDSet.
Len());
 
 4446   for (
int i = 0; i < JointRowIDSet.
Len(); i++) {
 
 4447     StartOffsets[i] = JointTableSize;
 
 4448     JointTableSize += JointRowIDSet[i].
Len();
 
 4450   if (JointTableSize == 0) {
 
 4468   for (
TInt IdCnt = 0; IdCnt < JointTableSize; IdCnt++) {
 
 4472   #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD)  
 4473   for (
int j = 0; j < JointRowIDSet.
Len(); j++) {
 
 4474     const TIntPrV& RowIDs = JointRowIDSet[j];
 
 4475     int start = StartOffsets[j];
 
 4476     int NewRows = RowIDs.
Len();
 
 4477     if (NewRows == 0) {
continue;}
 
 4478     for (
TInt r = 0; r < NewRows; r++){
 
 4479       TIntPr CurrRowIdPr = RowIDs[r]; 
 
 4498       IntCols[IdOffset][start+r] = start+r;
 
 4500     for(
TInt r = 0; r < NewRows; r++){
 
 4501       Next[start+r] = start+r+1;
 
 4509 #endif // USE_OPENMP 
 4519   result->AddTable(*
this);
 
 4520   result->UnionAllInPlace(Table);
 
 4539       ColNames.
Add(
Sch[c].Val1);
 
 4546   result->AddTable(*
this);
 
 4548   result->Unique(ColNames);
 
 4552     if (!Collisions.
IsKey(it.GetRowIdx())) {
 
 4553       result->AddRowI(it);
 
 4582     if (Collisions.
IsKey(it.GetRowIdx())) {
 
 4583       result->AddRowI(it);
 
 4607     if (!Collisions.
IsKey(it.GetRowIdx())) {
 
 4608       result->AddRowI(it);
 
 4617   for (
TInt c = 0; c < ProjectCols.
Len(); c++) {
 
 4623   result->AddTable(*
this);
 
 4633   TStr NColName = ColName;
 
 4634   if (NColName.
GetCh(NColName.
Len()-2) == 
'-') { 
 
 4639     if (NColName == 
Sch[i].Val1.GetSubStr(0, 
Sch[i].Val1.
Len()-3)) {
 
 4644   NColName = NColName + 
"-" + Conflicts.
GetStr();
 
 4649   TStr DColName = ColName;
 
 4650   if (DColName.
Len() == 0) { 
return DColName; }
 
 4651   if (DColName.
GetCh(0) == 
'_') { 
return DColName; }
 
 4652   if (DColName.
GetCh(DColName.
Len()-2) == 
'-') { 
 
 4657     if (DColName == 
Sch[i].Val1.GetSubStr(0, 
Sch[i].Val1.
Len()-3)) {
 
 4661   if (Conflicts > 1) { 
return ColName; } 
 
 4662   else { 
return DColName; }
 
 4700     IntCols[LabelColIdx][i] = NegativeLabel;
 
 4702   for (
TInt i = 0; i < SelectedRows.
Len(); i++) {
 
 4703     IntCols[LabelColIdx][SelectedRows[i]] = PositiveLabel;
 
 4713         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 4714         #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) 
 4715         for (
int i = 0; i < Partitions.
Len(); i++){
 
 4719                         if(ResType == 
atInt){
 
 4744 #endif  // USE_OPENMP 
 4760   if (Arg1Type == 
atStr || Arg2Type == 
atStr) {
 
 4761     TExcept::Throw(
"Only numeric columns supported in arithmetic operations.");
 
 4763   if(Arg1Type == 
atInt && Arg2Type == 
atFlt && ResAttr == 
""){
 
 4764         TExcept::Throw(
"Trying to write float values to an existing int-typed column");
 
 4771   TInt ColIdx3 = ColIdx1;
 
 4773   if (ResAttr != 
"") {
 
 4774       if (Arg1Type == 
atInt && Arg2Type == 
atInt) {
 
 4784         ColGenericOpMP(ColIdx1, ColIdx2, Arg1Type, Arg2Type, ColIdx3, op);
 
 4789   if(Arg1Type == 
atInt && Arg2Type == 
atInt){ printf(
"hooray!\n"); ResType = 
atInt;}
 
 4792                 if(ResType == 
atInt){
 
 4793                         TInt V1 = RowI.GetIntAttr(ColIdx1);
 
 4794                         TInt V2 = RowI.GetIntAttr(ColIdx2);
 
 4795                         if (op == 
aoAdd) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = V1 + V2; }
 
 4796                 if (op == 
aoSub) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = V1 - V2; }
 
 4797                 if (op == 
aoMul) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = V1 * V2; }
 
 4798                 if (op == 
aoDiv) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = V1 / V2; }
 
 4799                 if (op == 
aoMod) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = V1 % V2; }
 
 4800                 if (op == 
aoMin) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = (V1 < V2) ? V1 : V2;}
 
 4801                 if (op == 
aoMax) { 
IntCols[ColIdx3][RowI.GetRowIdx()] = (V1 > V2) ? V1 : V2;}
 
 4803                         TFlt V1 = (Arg1Type == 
atInt) ? (
TFlt)RowI.GetIntAttr(ColIdx1) : RowI.GetFltAttr(ColIdx1);
 
 4804                         TFlt V2 = (Arg2Type == 
atInt) ? (
TFlt)RowI.GetIntAttr(ColIdx2) : RowI.GetFltAttr(ColIdx2);
 
 4805                         if (op == 
aoAdd) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = V1 + V2; }
 
 4806                 if (op == 
aoSub) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = V1 - V2; }
 
 4807                 if (op == 
aoMul) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = V1 * V2; }
 
 4808                 if (op == 
aoDiv) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = V1 / V2; }
 
 4810                 if (op == 
aoMin) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = (V1 < V2) ? V1 : V2;}
 
 4811                 if (op == 
aoMax) { 
FltCols[ColIdx3][RowI.GetRowIdx()] = (V1 > V2) ? V1 : V2;}
 
 4859     TExcept::Throw(
"Only numeric columns supported in arithmetic operations.");
 
 4861   if(Arg1Type == 
atInt && Arg2Type == 
atFlt && ResAttr == 
""){
 
 4862         TExcept::Throw(
"Trying to write float values to an existing int-typed column");
 
 4869   TInt ColIdx3 = AddToFirstTable ? ColIdx1 : ColIdx2;
 
 4872   if (ResAttr != 
"") {
 
 4873     if (AddToFirstTable) {
 
 4874       if (Arg1Type == 
atInt && Arg2Type == 
atInt) {
 
 4882       if (Arg1Type == 
atInt && Arg2Type == 
atInt) {
 
 4902   RI2 = Table.
BegRI();
 
 4905   while (RI1 < 
EndRI() && RI2 < Table.
EndRI()) {
 
 4906     if (ResType == 
atInt) {
 
 4909         if (AddToFirstTable) {
 
 4926         if (AddToFirstTable) {
 
 4944   if (RI1 != 
EndRI() || RI2 != Table.
EndRI()) {
 
 4950  const TStr& ResultAttrName, 
TBool AddToFirstTable) {
 
 4955  const TStr& ResultAttrName, 
TBool AddToFirstTable) {
 
 4960  const TStr& ResultAttrName, 
TBool AddToFirstTable) {
 
 4965  const TStr& ResultAttrName, 
TBool AddToFirstTable) {
 
 4970  const TStr& ResultAttrName, 
TBool AddToFirstTable) {
 
 4981   if (ArgType == 
atStr) {
 
 4982     TExcept::Throw(
"Only numeric columns supported in arithmetic operations.");
 
 4987   TInt ColIdx2 = ColIdx1;
 
 4990   TBool shouldCast = floatCast;
 
 4991   if (ResAttr != 
"") {
 
 4992       if ((ArgType == 
atInt) & !shouldCast) {
 
 5011     if ((ArgType == 
atInt) && !shouldCast) {
 
 5012       TInt CurVal = RowI.GetIntAttr(ColIdx1);
 
 5013       TInt Val = 
static_cast<int>(Num);
 
 5014       if (op == 
aoAdd) { 
IntCols[ColIdx2][RowI.GetRowIdx()] = CurVal + Val; }
 
 5015       if (op == 
aoSub) { 
IntCols[ColIdx2][RowI.GetRowIdx()] = CurVal - Val; }
 
 5016       if (op == 
aoMul) { 
IntCols[ColIdx2][RowI.GetRowIdx()] = CurVal * Val; }
 
 5017       if (op == 
aoDiv) { 
IntCols[ColIdx2][RowI.GetRowIdx()] = CurVal / Val; }
 
 5018       if (op == 
aoMod) { 
IntCols[ColIdx2][RowI.GetRowIdx()] = CurVal % Val; }
 
 5021       TFlt CurVal = (ArgType == 
atFlt) ? RowI.GetFltAttr(ColIdx1) : (
TFlt) RowI.GetIntAttr(ColIdx1);
 
 5022       if (op == 
aoAdd) { 
FltCols[ColIdx2][RowI.GetRowIdx()] = CurVal + Num; }
 
 5023       if (op == 
aoSub) { 
FltCols[ColIdx2][RowI.GetRowIdx()] = CurVal - Num; }
 
 5024       if (op == 
aoMul) { 
FltCols[ColIdx2][RowI.GetRowIdx()] = CurVal * Num; }
 
 5025       if (op == 
aoDiv) { 
FltCols[ColIdx2][RowI.GetRowIdx()] = CurVal / Num; }
 
 5035         TInt PartitionSize = Partitions[0].GetVal2()-Partitions[0].GetVal1()+1;
 
 5036         #pragma omp parallel for schedule(dynamic, CHUNKS_PER_THREAD) 
 5037         for (
int i = 0; i < Partitions.
Len(); i++){
 
 5041                         if ((ArgType == 
atInt) && !ShouldCast) {
 
 5043                         TInt Val = 
static_cast<int>(Num);
 
 5100   TInt ColIdx3 = ColIdx1;
 
 5103   if (ResAttr != 
"") {
 
 5109     TStr CurVal1 = RowI.GetStrAttr(ColIdx1);
 
 5110     TStr CurVal2 = RowI.GetStrAttr(ColIdx2);
 
 5111     TStr NewVal = CurVal1 + Sep + CurVal2;
 
 5118  const TStr& ResAttr, 
TBool AddToFirstTable) {
 
 5139   TInt ColIdx3 = ColIdx1;
 
 5141   if (!AddToFirstTable) {
 
 5146   if (ResAttr != 
"") {
 
 5147     if (AddToFirstTable) {
 
 5160   RI2 = Table.
BegRI();
 
 5162   while (RI1 < 
EndRI() && RI2 < Table.
EndRI()) {
 
 5165     TStr NewVal = CurVal1 + Sep + CurVal2;
 
 5167     if (AddToFirstTable) {
 
 5177   if (RI1 != 
EndRI() || RI2 != Table.
EndRI()) {
 
 5196   TInt ColIdx2 = ColIdx1;
 
 5199   if (ResAttr != 
"") {
 
 5205     TStr CurVal = RowI.GetStrAttr(ColIdx1);
 
 5206     TStr NewVal = CurVal + Sep + Val;
 
 5217     Result.
Add(it.GetIntAttr(ColId));
 
 5226     Result.
Add(it.GetFltAttr(ColId));
 
 5235     Result.
Add(it.GetStrAttr(ColId));
 
 5241   for (
TInt c = 0; c < NProjectCols.
Len(); c++) {
 
 5248     if (ProjectColsSet.
IsKey(ColName) || ColName == 
IdColName) { 
continue; }
 
 5271     if (!ProjectColsSet.
IsKey(ColName) && ColName != 
IdColName) { 
continue; }
 
 5292     if (ProjectColsSet.
IsKey(ColName) || ColName == 
IdColName) { 
continue; }
 
 5306   if (K1 == K2) { 
return V1 - V2; }
 
 5307   else { 
return K1 - K2; }
 
 5312   for (j = Start; j < End; j++) {
 
 5313     if (
CompareKeyVal(Key[j], Val[j], Key[j+1], Val[j+1]) > 0) {
 
 5317   if (j >= End) { 
return 0; }
 
 5323     for (
TInt i = Start+1; i <= End; i++) {
 
 5327       while ((Start < j) && (
CompareKeyVal(Key[j-1], Val[j-1], K, V) > 0)) {
 
 5339   TInt L = End - Start + 1;
 
 5343   if (
CompareKeyVal(Key[Idx1], Val[Idx1], Key[Idx2], Val[Idx2]) < 0) {
 
 5344     if (
CompareKeyVal(Key[Idx2], Val[Idx2], Key[Idx3], Val[Idx3]) < 0) { 
return Idx2; }
 
 5345     if (
CompareKeyVal(Key[Idx1], Val[Idx1], Key[Idx3], Val[Idx3]) < 0) { 
return Idx3; }
 
 5348     if (
CompareKeyVal(Key[Idx3], Val[Idx3], Key[Idx2], Val[Idx2]) < 0) { 
return Idx2; }
 
 5349     if (
CompareKeyVal(Key[Idx3], Val[Idx3], Key[Idx1], Val[Idx1]) < 0) { 
return Idx3; }
 
 5358   TInt PivotKey = Key[Pivot];
 
 5359   TInt PivotVal = Val[Pivot];
 
 5360   Key.
Swap(Pivot, End);
 
 5361   Val.
Swap(Pivot, End);
 
 5362   TInt StoreIdx = Start;
 
 5363   for (
TInt i = Start; i < End; i++) {
 
 5365     if (
CompareKeyVal(Key[i], Val[i], PivotKey, PivotVal) <= 0) {
 
 5366       Key.
Swap(i, StoreIdx);
 
 5367       Val.
Swap(i, StoreIdx);
 
 5373   Key.
Swap(StoreIdx, End);
 
 5374   Val.
Swap(StoreIdx, End);
 
 5381   if (L <= 0) { 
return; }
 
 5384   if (L <= 20) { 
ISortKeyVal(Key, Val, Start, End); }
 
 5388     if (Pivot > End) { 
return; }
 
 5395       #pragma omp task untied shared(Key, Val) 
 5402       #pragma omp task untied shared(Key, Val) 
 5414     if (ColIndex.
IsKey(Val)) {
 
 5415       return ColIndex.
GetDat(Val);
 
 5424     TInt ValAtRow = RowI.GetIntAttr(ColName);
 
 5425     if ( Val == ValAtRow) {
 
 5426       ToReturn.
Add(RowI.GetRowIdx());
 
 5435     if (ColIndex.
IsKey(Map)) {
 
 5436       return ColIndex.
GetDat(Map);
 
 5445     TInt MapAtRow = RowI.GetStrMapByName(ColName);
 
 5446     if ( Map == MapAtRow) {
 
 5447       ToReturn.
Add(RowI.GetRowIdx());
 
 5457     if (ColIndex.
IsKey(Val)) {
 
 5458       return ColIndex.
GetDat(Val);
 
 5468     TFlt ValAtRow = RowI.GetFltAttr(ColName);
 
 5469     if ( Val == ValAtRow) {
 
 5470       ToReturn.
Add(RowI.GetRowIdx());
 
 5480     TInt ValAtRow = RowI.GetIntAttr(ColName);
 
 5481     TInt RowIdx = RowI.GetRowIdx();
 
 5482     if (NewIndex.
IsKey(ValAtRow)) {
 
 5489       NewIndex.
AddDat(ValAtRow, New_V);
 
 5499     TFlt ValAtRow = RowI.GetFltAttr(ColName);
 
 5500     TInt RowIdx = RowI.GetRowIdx();
 
 5501     if (NewIndex.
IsKey(ValAtRow)) {
 
 5508       NewIndex.
AddDat(ValAtRow, New_V);
 
 5517     TInt MapAtRow = RowI.GetStrMapByName(ColName);
 
 5518     TInt RowIdx = RowI.GetRowIdx();
 
 5519     if (NewIndex.
IsKey(MapAtRow)) {
 
 5526       NewIndex.
AddDat(MapAtRow, New_V);
 
TSize GetMemUsedKB()
Returns approximate memory used by table in [KB]. 
 
void ThresholdJoinInputCorrectness(const TStr &KeyCol1, const TStr &JoinCol1, const TTable &Table, const TStr &KeyCol2, const TStr &JoinCol2)
 
void AddSchemaCol(const TStr &ColName, TAttrType ColType)
Adds column with name ColName and type ColType to the schema. 
 
TFlt GetFltAttr(TInt ColIdx) const 
Returns value of floating point attribute specified by float column index for current row...
 
TPair< TInt, TInt > TIntPr
 
TInt RequestIndexInt(const TStr &ColName)
Creates Index for Int Column ColName. 
 
TBool IsLastGraphOfSequence()
Checks if the end of the graph sequence is reached. 
 
TBool IsAttr(const TStr &Attr)
Checks if Attr is an attribute of this table schema. 
 
void SetFltVal(TStr VarName, TFlt VarVal)
Set flt variable value in the predicate or all the children that use it. 
 
void Order(const TStrV &OrderBy, TStr OrderColName="", TBool ResetRankByMSC=false, TBool Asc=true)
Orders the rows according to the values in columns of OrderBy (in descending lexicographic order)...
 
void FillBucketsByInterval(TStr SplitAttr, TIntPrV SplitIntervals)
Fills RowIdBuckets with sets of row ids. 
 
bool Next()
Loads next line from the input file. 
 
TIter EndI() const 
Returns an iterator referring to the past-the-end element in the vector. 
 
void RemoveRow(TInt RowIdx, TInt PrevRowIdx)
Removes row with id RowIdx. 
 
TStrV EdgeAttrV
List of columns (attributes) to serve as edge attributes. 
 
THash< GroupStmt, THash< TGroupKey, TIntV > > GroupMapping
Maps grouping statements to their (group-by key –> group id) mapping. 
 
TInt FirstValidRow
Physical index of first valid row. 
 
TStr DenormalizeColName(const TStr &ColName) const 
Removes suffix to column name if exists. 
 
void GetDatV(TVec< TDat > &DatV) const 
 
TInt GetPivot(TIntV &V, TInt StartIdx, TInt EndIdx, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc)
Gets pivot element for QSort. 
 
TInt GetColIdx(const TStr &ColName) const 
Gets index of column ColName among columns of the same type in the schema. 
 
enum TAttrType_ TAttrType
Types for tables, sparse and dense attributes. 
 
TVec< uint64 > GetStartPosV(uint64 Lb, uint64 Ub) const 
Finds start positions of all lines ending somewhere in [Lb, Ub) 
 
void StoreGroupCol(const TStr &GroupColName, const TVec< TPair< TInt, TInt > > &GroupAndRowIds)
Parallel helper function for grouping. - we currently don't support such parallel grouping by complex...
 
static const TInt Last
Special value for Next vector entry - last row in table. 
 
PTable UnionAll(const TTable &Table)
Returns union of this table with given Table, preserving duplicates. 
 
::TSize GetMemUsed() const 
 
static TInt PartitionKeyVal(TIntV &Key, TIntV &Val, TInt Start, TInt End)
 
Primitive class: Wrapper around primitive data types. 
 
bool operator==(const TRowIterator &RowI) const 
Checks if this iterator points to the same row pointed by RowI. 
 
TStrV GetSrcNodeIntAttrV() const 
Gets src node int attribute name vector. 
 
void PrintGrouping(const THash< TGroupKey, TIntV > &Grouping) const 
 
void SelectFirstNRows(const TInt &N)
Selects first N rows from the table. 
 
TStrV GetDstNodeStrAttrV() const 
Gets dst node str attribute name vector. 
 
void Del(const TSizeTy &ValN)
Removes the element at position ValN. 
 
void GetPartitionRanges(TIntPrV &Partitions, TInt NumPartitions) const 
Partitions the table into NumPartitions and populate Partitions with the ranges. 
 
TInt GetIntAttr(TInt ColIdx) const 
Returns value of integer attribute specified by integer column index for current row. 
 
TPredComp
Comparison operators for selection predicates. 
 
void Defrag()
Releases memory of deleted rows, and defrags. 
 
PNEANet ToVarGraphSequenceIterator(TStr SplitAttr, TAttrAggr AggrPolicy, TIntPrV SplitIntervals)
Creates the graph sequence one at a time. 
 
void SaveBin(const TStr &OutFNm)
Saves table schema and content to a binary file. 
 
TStr GetStrAttr(TInt ColIdx) const 
Returns value of string attribute specified by string column index for current row. 
 
void Save(TSOut &SOut) const 
 
void AddIntCol(const TStr &ColName)
Adds an integer column with name ColName. 
 
THash< TStr, TPair< TAttrType, TInt > > ColTypeMap
 
TStr Rvar
Right variable of the comparison op. 
 
void ThresholdJoinCountCollisions(const TTable &TB, const TTable &TS, const TIntIntVH &T, TInt JoinColIdxB, TInt KeyColIdxB, TInt KeyColIdxS, THash< TIntPr, TIntTr > &Counters, TBool ThisIsSmaller, TAttrType JoinColType, TAttrType KeyType)
 
void AddGraphAttributeV(TStrV &Attrs, TBool IsEdge, TBool IsSrc, TBool IsDst)
Adds vector of names of columns to be used as graph attributes. 
 
void GroupByIntColMP(const TStr &GroupBy, THashMP< TInt, TIntV > &Grouping, TBool UsePhysicalIds=true) const 
Groups/hashes by a single column with integer values, using OpenMP multi-threading. 
 
void SetFltColToConstMP(TInt UpdateColIdx, TFlt DefaultFltVal)
 
int GetFlds() const 
Returns the number of fields in the current line. 
 
const TVal1 & GetVal1() const 
 
void ThresholdJoinCountPerJoinKeyCollisions(const TTable &TB, const TTable &TS, const TIntIntVH &T, TInt JoinColIdxB, TInt KeyColIdxB, TInt KeyColIdxS, THash< TIntTr, TIntTr > &Counters, TBool ThisIsSmaller, TAttrType JoinColType, TAttrType KeyType)
 
uint64 GetStreamPos() const 
Returns position of stream pointer. 
 
void ColAdd(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs columnwise addition. See TTable::ColGenericOp. 
 
TArithOp
Possible column-wise arithmetic operations. 
 
TInt RequestIndexStrMap(const TStr &ColName)
Creates Index for Str Column ColName. 
 
TFlt GetNextFltAttr(TInt ColIdx) const 
Returns value of float attribute specified by float column index for next row. 
 
TSizeTy Len() const 
Returns the number of elements in the vector. 
 
void AddSelectedRows(const TTable &Table, const TIntV &RowIDs)
Adds rows from Table that correspond to ids in RowIDs. 
 
TStr IdColName
A mapping from column name to column type and column index among columns of the same type...
 
Predicate - encapsulates comparison operations. 
 
TBool CompareAtomicConstTStr(TInt ColIdx, const TStr &Val, TPredComp Cmp)
Compares value in column ColIdx with given TStr Val. 
 
PTable SelfSimJoinPerGroup(const TStr &GroupAttr, const TStr &SimCol, const TStr &DistanceColName, const TSimType &SimType, const TFlt &Threshold)
Performs join if the distance between two rows is less than the specified threshold. 
 
static TStrV NormalizeColNameV(const TStrV &Cols)
Adds suffix to column name if it doesn't exist. 
 
static TInt CompareKeyVal(const TInt &K1, const TInt &V1, const TInt &K2, const TInt &V2)
 
THash< TStr, THash< TInt, TIntV > > StrMapColIndexes
Indexes for String Columns. 
 
THash< TStr, THash< TInt, TIntV > > IntColIndexes
Indexes for Int Columns. 
 
void ColConcat(const TStr &Attr1, const TStr &Attr2, const TStr &Sep="", const TStr &ResAttr="")
Concatenates two string columns. 
 
void Save(TSOut &SOut) const 
 
TStrV GetSrcNodeStrAttrV() const 
Gets src node str attribute name vector. 
 
TTableContext * Context
Execution Context. 
 
TSimType
Distance metrics for similarity joins. 
 
TBool Start
A flag indicating whether the current row in the first valid row of the table. 
 
void QSort(TIntV &V, TInt StartIdx, TInt EndIdx, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc=true)
Performs QSort on given vector V. 
 
TAttrType Type
Type of the predicate variables. 
 
TPredicateNode * Left
Left child of this node. 
 
THash< TStr, TInt > IntVars
Int variables in the current predicate tree. 
 
void InvalidateAffectedGroupings(const TStr &Attr)
 
void Dump(FILE *OutF=stdout) const 
Prints table contents to a text file. 
 
TInt LastValidRow
Physical index of last valid row. 
 
void Group(const TStrV &GroupBy, const TStr &GroupColName, TBool Ordered=true, TBool UsePhysicalIds=true)
Groups rows depending on values of GroupBy columns. 
 
TStr GetSubStr(const int &BChN, const int &EChN) const 
 
void ResizeTable(int RowCount)
Resizes the table to hold RowCount rows. 
 
TAttrAggr
Possible policies for aggregating node attributes. 
 
void ColDiv(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs columnwise division. See TTable::ColGenericOp. 
 
void Rename(const TStr &Column, const TStr &NewLabel)
Renames a column. 
 
void GroupAux(const TStrV &GroupBy, THash< TGroupKey, TPair< TInt, TIntV > > &Grouping, TBool Ordered, const TStr &GroupColName, TBool KeepUnique, TIntV &UniqueVec, TBool UsePhysicalIds=true)
Helper function for grouping. 
 
const TVal2 & GetVal2() const 
 
TStrV GetEdgeFltAttrV() const 
Gets edge float attribute name vector. 
 
bool GetInt(const int &FldN, int &Val) const 
If the field FldN is an integer its value is returned in Val and the function returns true...
 
TStr GetNextStrAttr(TInt ColIdx) const 
Returns value of string attribute specified by string column index for next row. 
 
const TDat & GetDat(const TKey &Key) const 
 
void GenerateColTypeMap(THash< TStr, TPair< TInt, TInt > > &ColTypeIntMap)
 
Node iterator. Only forward iteration (operator++) is supported. 
 
void GetStrAttrNames(TStrV &Names) const 
Gets vector of str attribute names. 
 
Schema GetSchema()
Gets the schema of this table. 
 
TVec< TIntV > RowIdBuckets
Partitioning of row ids into buckets corresponding to different graph objects when generating a seque...
 
TRowIteratorWithRemove BegRIWR()
Gets iterator with reomve to the first valid row. 
 
TInt GetNumValidRows() const 
Gets number of valid, i.e. not deleted, rows in this table. 
 
TRowIterator BegRI() const 
Gets iterator to the first valid row of the table. 
 
int GetFlds() const 
Returns the number of fields in the current line. 
 
PNEANet ToGraphPerGroupIterator(TStr GroupAttr, TAttrAggr AggrPolicy)
Creates the graph sequence one at a time. 
 
TVec< TIntV > IntCols
Next[i] is the successor of row i. Table iterators follow the order dictated by Next ...
 
Iterator class for TTable rows, that allows logical row removal while iterating. 
 
TSizeTy GetMemUsed() const 
Returns the memory footprint (the number of bytes) of the vector. 
 
void CheckAndAddIntNode(PNEANet Graph, THashSet< TInt > &NodeVals, TInt NodeId)
Checks if given NodeId is seen earlier; if not, add it to Graph and hashmap NodeVals. 
 
TVec< PNEANet > ToGraphSequence(TStr SplitAttr, TAttrAggr AggrPolicy, TInt WindowSize, TInt JumpSize, TInt StartVal=TInt::Mn, TInt EndVal=TInt::Mx)
Creates a sequence of graphs based on values of column SplitAttr and windows specified by JumpSize an...
 
void GroupByFltCol(const TStr &GroupBy, T &Grouping, const TIntV &IndexSet, TBool All, TBool UsePhysicalIds=true) const 
Groups/hashes by a single column with float values. Returns hash table with grouping. 
 
TInt GetStrMapByName(const TStr &Col) const 
Returns integer mapping of string attribute specified by attribute name for current row...
 
PTable Minus(TTable &Table)
Returns table with rows that are present in this table but not in given Table. 
 
bool IsKey(const TKey &Key) const 
 
static PTable GetNodeTable(const PNEANet &Network, TTableContext *Context)
Extracts node TTable from PNEANet. 
 
THash< TStr, TStr > StrVars
String variables in the current predicate tree. 
 
TIntV GetStrRowIdxByMap(const TStr &ColName, const TInt &Map) const 
Gets the rows containing int mapping Map in str column ColName. 
 
int GetId() const 
Returns edge ID. 
 
void LoadShM(TShMIn &ShMIn)
Load THash from shared memory file. Copying/Deleting Keys is illegal. 
 
TStr GetIdColName() const 
Gets name of the id column of this table. 
 
static TBool EvalStrAtom(const TStr &Val1, const TStr &Val2, TPredComp Cmp)
Compare atomic string values Val1 and Val2 using predicate Cmp. 
 
TRowIteratorWithRemove()
Default constructor. 
 
static void LoadSSSeq(PTable &NewTable, const Schema &S, const TStr &InFNm, const TIntV &RelevantCols, const char &Separator, TBool HasTitleLine)
Sequentially loads data from input file at InFNm into NewTable. 
 
TStr GetStrValIdx(TInt ColIdx, TInt RowIdx) const 
Gets the value in column with id ColIdx at row RowIdx. 
 
void Save(TSOut &SOut) const 
 
void IncrementNext()
Increments the next vector and set last, NumRows and NumValidRows. 
 
PTable SimJoin(const TStrV &Cols1, const TTable &Table, const TStrV &Cols2, const TStr &DistanceColName, const TSimType &SimType, const TFlt &Threshold)
Performs join if the distance between two rows is less than the specified threshold. 
 
bool Empty() const 
Tests whether the vector is empty. 
 
void InitIds()
Adds explicit row ids, initialize hash set mapping ids to physical rows. 
 
TStrTrV CommonNodeAttrs
List of attribute pairs with values common to source and destination and their common given name...
 
void QSortPar(TIntV &V, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc=true)
Performs QSort in parallel on given vector V. 
 
void Save(TSOut &SOut)
Saves table schema and content to a binary format. 
 
int GetDstNId() const 
Returns the destination of the edge. 
 
void Swap(TVec< TVal, TSizeTy > &Vec)
Swaps the contents of the vector with Vec. 
 
TBool Result
Result of evaulating the predicate rooted at this node. 
 
void ReadFltCol(const TStr &ColName, TFltV &Result) const 
Reads values of entire float column into Result. 
 
void InvalidatePhysicalGroupings()
 
void SkipCommentLines()
Skips lines that begin with a comment character. 
 
TPair< TIntV, TFltV > TGroupKey
Represents grouping key with IntV for integer and string attributes and FltV for float attributes...
 
Iterator class for TTable rows. 
 
TInt GetNextRowIdx() const 
Gets physical index of next row. 
 
int GetId() const 
Returns ID of the current node. 
 
bool Eof() const 
Checks for end of file. 
 
void Aggregate(const TStrV &GroupByAttrs, TAttrAggr AggOp, const TStr &ValAttr, const TStr &ResAttr, TBool Ordered=true)
Aggregates values of ValAttr after grouping with respect to GroupByAttrs. Result are stored as new at...
 
TAttrType GetSchemaColType(TInt Idx) const 
Gets type of the column with index Idx in the schema. 
 
void Clr(const bool &DoDel=true, const TSizeTy &NoDelLim=-1)
Clears the contents of the vector. 
 
void SetIntVal(TStr VarName, TInt VarVal)
Set int variable value in the predicate or all the children that use it. 
 
TStrV GetEdgeIntAttrV() const 
Gets edge int attribute name vector. 
 
void SetStrVal(TStr VarName, TStr VarVal)
Set str variable value in the predicate or all the children that use it. 
 
void RemoveNext()
Removes next row. 
 
TStr StrConst
Str const value if this object is a string constant. 
 
TVec< PNEANet > ToGraphPerGroup(TStr GroupAttr, TAttrAggr AggrPolicy)
Creates a sequence of graphs based on grouping specified by GroupAttr. 
 
const TTable * Table
Reference to table containing this row. 
 
static void Throw(const TStr &MsgStr)
 
Schema DenormalizeSchema() const 
Removes suffix to column names in the Schema. 
 
PNEANet NextGraphIterator()
Calls to this must be preceded by a call to one of the above ToGraph*Iterator functions. 
 
void PutAll(const TVal &Val)
Sets all elements of the vector to value Val. 
 
unsigned long long uint64
 
PNEANet BuildGraph(const TIntV &RowIds, TAttrAggr AggrPolicy)
Makes a single pass over the rows in the given row id set, and creates nodes, edges, assigns node and edge attributes. 
 
TBool EvalAtomicPredicate(const TAtomicPredicate &Atom)
Evaluate the give atomic predicate. 
 
void ColSub(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs columnwise subtraction. See TTable::ColGenericOp. 
 
int GetSrcNId() const 
Gets the source node of an edge. 
 
const TVal & GetDat(const TVal &Val) const 
Returns reference to the first occurrence of element Val. 
 
int GetEmptyRowsStart(int NewRows)
Gets the start index to a chunk of empty rows of size NewRows. 
 
THash< TStr, THash< TFlt, TIntV > > FltColIndexes
Indexes for Float Columns. 
 
TStr Lvar
Left variable of the comparison op. 
 
const char * GetKey(const int &KeyId) const 
 
void ProjectInPlace(const TStrV &ProjectCols)
Keeps only the columns specified in ProjectCols. 
 
TBool CompareAtomicConst(TInt ColIdx, const TPrimitive &Val, TPredComp Cmp)
Compares value in column ColIdx with given primitive Val. 
 
void Reindex()
Reinitializes row ids. 
 
TInt CurrBucket
Current row id bucket - used when generating a sequence of graphs using an iterator. 
 
PTable IsNextK(const TStr &OrderCol, TInt K, const TStr &GroupBy, const TStr &RankColName="")
Distance based filter. 
 
TAttrType GetColType(const TStr &ColName) const 
Gets type of column ColName. 
 
TVec< TIntV > StrColMaps
Data columns of integer mappings of string attributes. 
 
int sync_bool_compare_and_swap(int *lock)
 
TRowIteratorWithRemove & Next()
Increments the iterator (For Python compatibility). 
 
PNEANet ToGraphSequenceIterator(TStr SplitAttr, TAttrAggr AggrPolicy, TInt WindowSize, TInt JumpSize, TInt StartVal=TInt::Mn, TInt EndVal=TInt::Mx)
Creates the graph sequence one at a time. 
 
int GetDstNId() const 
Gets destination node of an edge. 
 
int AddKey(const TKey &Key)
 
::TSize GetMemUsed() const 
 
void GroupByIntCol(const TStr &GroupBy, T &Grouping, const TIntV &IndexSet, TBool All, TBool UsePhysicalIds=true) const 
Groups/hashes by a single column with integer values. 
 
PTable Join(const TStr &Col1, const TTable &Table, const TStr &Col2)
Performs equijoin. 
 
bool IsKey(const TKey &Key) const 
 
static void LoadSSPar(PTable &NewTable, const Schema &S, const TStr &InFNm, const TIntV &RelevantCols, const char &Separator, TBool HasTitleLine)
Parallelly loads data from input file at InFNm into NewTable. Only work when NewTable has no string c...
 
TIntV GetIntRowIdxByVal(const TStr &ColName, const TInt &Val) const 
Gets the rows containing Val in int column ColName. 
 
TInt GetRowIdx() const 
Gets the id of the row pointed by this iterator. 
 
bool GetFlt(const int &FldN, double &Val) const 
If the field FldN is a float its value is returned in Val and the function returns true...
 
A class representing a cached grouping statement identifier. 
 
TStr GetSchemaColName(TInt Idx) const 
Gets name of the column with index Idx in the schema. 
 
int GetSrcNId() const 
Returns the source of the edge. 
 
TInt GetStrMapById(TInt ColIdx) const 
Returns integer mapping of a string attribute value specified by string column index for current row...
 
TStrV SrcNodeAttrV
List of columns (attributes) to serve as source node attributes. 
 
TAttrAggr AggrPolicy
Aggregation policy used for solving conflicts between different values of an attribute of the same no...
 
static void QSortKeyVal(TIntV &Key, TIntV &Val, TInt Start, TInt End)
 
void Select(TPredicate &Predicate, TIntV &SelectedRows, TBool Remove=true)
Selects rows that satisfy given Predicate. 
 
void UnionAllInPlace(const TTable &Table)
Same as TTable::ConcatTable. 
 
void AddRowI(const TRowIterator &RI)
Adds row corresponding to RI. 
 
char GetCh(const int &ChN) const 
 
TIntIntH RowIdMap
Mapping of permanent row ids to physical id. 
 
void SaveSS(const TStr &OutFNm)
Saves table schema and content to a TSV file. 
 
PTable Union(const TTable &Table)
Returns union of this table with given Table. 
 
void SelectAtomicConst(const TStr &Col, const TPrimitive &Val, TPredComp Cmp, TIntV &SelectedRows, PTable &SelectedTable, TBool Remove=true, TBool Table=true)
Selects rows where the value of Col matches given primitive Val. 
 
void UpdateFltFromTable(const TStr &KeyAttr, const TStr &UpdateAttr, const TTable &Table, const TStr &FKeyAttr, const TStr &ReadAttr, TFlt DefaultFltVal=0.0)
 
Edge iterator. Only forward iteration (operator++) is supported. 
 
void ColConcatConst(const TStr &Attr1, const TStr &Val, const TStr &Sep="", const TStr &ResAttr="")
Concatenates column values with given string value. 
 
void GetCollidingRows(const TTable &T, THashSet< TInt > &Collisions)
Gets set of row ids of rows common with table T. 
 
void AddGraphAttribute(const TStr &Attr, TBool IsEdge, TBool IsSrc, TBool IsDst)
Adds names of columns to be used as graph attributes. 
 
void KeepSortedRows(const TIntV &KeepV)
Removes all rows that are not mentioned in the SORTED vector KeepV. 
 
TPair< TAttrType, TInt > GetColTypeMap(const TStr &ColName) const 
Gets column type and index of ColName. 
 
TAttrType GetType() const 
 
THash< TInt, TInt > TIntH
 
void GroupingSanityCheck(const TStr &GroupBy, const TAttrType &AttrType) const 
Checks if grouping key exists and matches given attr type. 
 
void GetFltAttrNames(TStrV &Names) const 
Gets vector of flt attribute names. 
 
TStrHash< TInt, TBigStrPool > StringVals
StringPool - stores string data values and maps them to integers. 
 
void UpdateTableForNewRow()
Updates table state after adding one or more rows. 
 
void SetVal(const TSizeTy &ValN, const TVal &Val)
Sets the value of element at position ValN to Val. 
 
int AddKey(const char *Key)
 
static TInt UseMP
Global switch for choosing multi-threaded versions of TTable functions. 
 
TPredComp Compare
Comparison op represented by this node. 
 
void DelColType(const TStr &ColName)
Adds column with name ColName and type ColType to the ColTypeMap. 
 
void ReadIntCol(const TStr &ColName, TIntV &Result) const 
Reads values of entire int column into Result. 
 
void FillBucketsByWindow(TStr SplitAttr, TInt JumpSize, TInt WindowSize, TInt StartVal, TInt EndVal)
Fills RowIdBuckets with sets of row ids. 
 
static TStr NormalizeColName(const TStr &ColName)
Adds suffix to column name if it doesn't exist. 
 
void AddStrCol(const TStr &ColName)
Adds a string column with name ColName. 
 
THash< TStr, GroupStmt > GroupStmtNames
Maps user-given grouping statement names to their group-by attributes. 
 
TRowIterator & Next()
Increments the iterator (For Python compatibility). 
 
TStr SrcCol
Column (attribute) to serve as src nodes when constructing the graph. 
 
void GetIntAttrNames(TStrV &Names) const 
Gets vector of int attribute names. 
 
void ISort(const TSizeTy &MnLValN, const TSizeTy &MxRValN, const bool &Asc)
Insertion sorts the values between positions MnLValN...MxLValN. 
 
PTable Project(const TStrV &ProjectCols)
Returns table with only the columns in ProjectCols. 
 
void StoreStrCol(const TStr &ColName, const TStrV &ColVals)
Adds entire str column to table. 
 
void LoadShM(TShMIn &ShMIn)
Constructs the vector from a shared memory input. 
 
TVec< TFltV > FltCols
Data columns of floating point attributes. 
 
TStrV GetDstNodeFltAttrV() const 
Gets dst node float attribute name vector. 
 
TStrV DstNodeAttrV
List of columns (attributes) to serve as destination node attributes. 
 
uint64 CountNewLinesInRange(uint64 Lb, uint64 Ub) const 
Counts number of occurences of ' ' in [Lb, Ub) 
 
Edge iterator. Only forward iteration (operator++) is supported. 
 
TIntV Next
A vector describing the logical order of the rows. 
 
static int GetRnd(const int &Range=0)
 
void Gen(const int &ExpectVals)
 
int AddKey(const TKey &Key)
 
TRowIterator EndRI() const 
Gets iterator to the last valid row of the table. 
 
void AddStrVal(const TInt &ColIdx, const TStr &Val)
Adds Val in column with id ColIdx. 
 
TTable * Table
Reference to table containing this row. 
 
int GetIntFromFldV(TVec< char * > &FieldsV, const int &FldN)
Gets integer at field FldN. 
 
void NextFromIndex(uint64 Index, TVec< char * > &FieldsV)
Loads next line starting from a given position. 
 
TInt NumRows
Number of rows in the table (valid and invalid). 
 
TFlt GetFltVal(const TStr &ColName, const TInt &RowIdx)
Gets the value of float attribute ColName at row RowIdx. 
 
static PTable LoadSS(const Schema &S, const TStr &InFNm, TTableContext *Context, const char &Separator= '\t', TBool HasTitleLine=false)
Loads table from spread sheet (TSV, CSV, etc). Note: HasTitleLine = true is not supported. Please comment title lines instead. 
 
TStr GetStrVal(const TStr &ColName, const TInt &RowIdx) const 
Gets the value of string attribute ColName at row RowIdx. 
 
void Unique(const TStr &Col)
Removes rows with duplicate values in given column. 
 
TRowIteratorWithRemove & operator++(int)
Increments the iterator. 
 
void AddJointRow(const TTable &T1, const TTable &T2, TInt RowIdx1, TInt RowIdx2)
Adds joint row T1[RowIdx1]<=>T2[RowIdx2]. 
 
void Classify(TPredicate &Predicate, const TStr &LabelName, const TInt &PositiveLabel=1, const TInt &NegativeLabel=0)
 
void Merge(TIntV &V, TInt Idx1, TInt Idx2, TInt Idx3, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc=true)
Helper function for parallel QSort. 
 
TStr DstCol
Column (attribute) to serve as dst nodes when constructing the graph. 
 
void ReadStrCol(const TStr &ColName, TStrV &Result) const 
Reads values of entire string column into Result. 
 
void GetKeyV(TVec< TKey > &KeyV) const 
 
static PTable GetEdgeTable(const PNEANet &Network, TTableContext *Context)
Extracts edge TTable from PNEANet. 
 
static const TInt Invalid
Special value for Next vector entry - logically removed row. 
 
void AddColType(const TStr &ColName, TPair< TAttrType, TInt > ColType)
Adds column with name ColName and type ColType to the ColTypeMap. 
 
PNEANet GetNextGraphFromSequence()
Returns the next graph in sequence corresponding to RowIdBuckets. 
 
TBool CompareAtomicConst(TInt ColIdx, const TPrimitive &Val, TPredComp Cmp)
Compares value in column ColIdx with given primitive Val. 
 
void StoreFltCol(const TStr &ColName, const TFltV &ColVals)
Adds entire flt column to table. 
 
THash< GroupStmt, THash< TInt, TGroupKey > > GroupIDMapping
Maps grouping statements to their (group id –> group-by key) mapping. 
 
TInt IntConst
Int const value if this object is an integer constant. 
 
TIter BegI() const 
Returns an iterator pointing to the first element in the vector. 
 
TPredOp Op
Logical op represented by this node. 
 
void LoadTableShM(TShMIn &ShMIn, TTableContext *ContextTable)
 
void GroupByStrCol(const TStr &GroupBy, T &Grouping, const TIntV &IndexSet, TBool All, TBool UsePhysicalIds=true) const 
Groups/hashes by a single column with string values. Returns hash table with grouping. 
 
TTableContext * ChangeContext(TTableContext *Context)
Changes the current context. Moves all object items to the new context. 
 
TInt CurrRowIdx
Physical row index of current row pointer by iterator. 
 
TPredicateNode * Root
Rood node of the current predicate tree. 
 
void AggregateCols(const TStrV &AggrAttrs, TAttrAggr AggOp, const TStr &ResAttr)
Aggregates attributes in AggrAttrs across columns. 
 
bool operator==(const TRowIteratorWithRemove &RowI) const 
Checks if this iterator points to the same row pointed by RowI. 
 
Table class: Relational table with columnar data storage. 
 
bool operator<(const TRowIterator &RowI) const 
Checks if this iterator points to a row that is before the one pointed by RowI. 
 
void SetStreamPos(uint64 Pos)
Sets position of stream pointer. 
 
void UpdateFltFromTableMP(const TStr &KeyAttr, const TStr &UpdateAttr, const TTable &Table, const TStr &FKeyAttr, const TStr &ReadAttr, TFlt DefaultFltVal=0.0)
 
static PTable GetEdgeTablePN(const PNGraphMP &Network, TTableContext *Context)
Extracts edge TTable from parallel graph PNGraphMP. 
 
void ISort(TIntV &V, TInt StartIdx, TInt EndIdx, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc=true)
Performs insertion sort on given vector V. 
 
TInt GetRowIdx() const 
Gets physical index of current row. 
 
TInt RequestIndexFlt(const TStr &ColName)
Creates Index for Flt Column ColName. 
 
static TBool EvalAtom(T Val1, T Val2, TPredComp Cmp)
Compare atomic values Val1 and Val2 using predicate Cmp. 
 
bool operator<(const TRowIteratorWithRemove &RowI) const 
Checks if this iterator points to a row that is before the one pointed by RowI. 
 
void InitRowIdBuckets(int NumBuckets)
Initializes the RowIdBuckets vector which will be used for the graph sequence creation. 
 
TStrV GetSrcNodeFltAttrV() const 
Gets src node float attribute name vector. 
 
static PTable GetFltNodePropertyTable(const PNEANet &Network, const TIntFltH &Property, const TStr &NodeAttrName, const TAttrType &NodeAttrType, const TStr &PropertyAttrName, TTableContext *Context)
Extracts node and edge property TTables from THash. 
 
Hash-Table with multiprocessing support. 
 
PTable ThresholdJoinPerJoinKeyOutputTable(const THash< TIntTr, TIntTr > &Counters, TInt Threshold, const TTable &Table)
 
PTable ThresholdJoin(const TStr &KeyCol1, const TStr &JoinCol1, const TTable &Table, const TStr &KeyCol2, const TStr &JoinCol2, TInt Threshold, TBool PerJoinKey=false)
 
static void ISortKeyVal(TIntV &Key, TIntV &Val, TInt Start, TInt End)
 
TBool IsConst
Flag if this atomic node represents a constant value. 
 
TInt CurrRowIdx
Physical row index of current row pointed by iterator. 
 
static TInt GetPivotKeyVal(TIntV &Key, TIntV &Val, TInt Start, TInt End)
 
void Clr(const bool &DoDel=true, const int &NoDelLim=-1, const bool &ResetDat=true)
 
bool Next()
Loads next line from the input file. 
 
TInt IsNextDirty
Flag to signify whether the rows are stored in logical sequence or reordered. Used for optimizing Get...
 
TStrV GetEdgeStrAttrV() const 
Gets edge str attribute name vector. 
 
void AddFltCol(const TStr &ColName)
Adds a float column with name ColName. 
 
TInt CompareRows(TInt R1, TInt R2, const TAttrType &CompareByType, const TInt &CompareByIndex, TBool Asc=true)
Returns positive value if R1 is bigger, negative value if R2 is bigger, and 0 if they are equal (strc...
 
TStr RenumberColName(const TStr &ColName) const 
Returns a re-numbered column name based on number of existing columns with conflicting names...
 
TTriple< TInt, TInt, TInt > TIntTr
 
TInt NumValidRows
Number of valid rows in the table (i.e. rows that were not logically removed). 
 
void Gen(const TSizeTy &_Vals)
Constructs a vector (an array) of _Vals elements. 
 
PTable ThresholdJoinOutputTable(const THash< TIntPr, TIntTr > &Counters, TInt Threshold, const TTable &Table)
 
void Count(const TStr &CountColName, const TStr &Col)
Counts number of unique elements. 
 
PTable InitializeJointTable(const TTable &Table)
Initializes an empty table for the join of this table with the given table. 
 
void ColMax(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs max of two columns. See TTable::ColGenericOp. 
 
void Reserve(const TSizeTy &_MxVals)
Reserves enough memory for the vector to store _MxVals elements. 
 
void ClassifyAtomic(const TStr &Col1, const TStr &Col2, TPredComp Cmp, const TStr &LabelName, const TInt &PositiveLabel=1, const TInt &NegativeLabel=0)
 
bool Cmp(const int &RelOp, const TRec &Rec1, const TRec &Rec2)
 
void StoreIntCol(const TStr &ColName, const TIntV &ColVals)
Adds entire int column to table. 
 
void AddIdColumn(const TStr &IdColName)
Adds a column of explicit integer identifiers to the rows. 
 
void GetVariables(TStrV &Variables)
Get variables in the predicate tree rooted at this node. 
 
static TInt CheckSortedKeyVal(TIntV &Key, TIntV &Val, TInt Start, TInt End)
 
void AddEdgeAttributes(PNEANet &Graph, int RowId)
Adds attributes of edge corresponding to RowId to the Graph. 
 
void GetIntAttrNames(TStrV &Names) const 
Gets vector of int attribute names. 
 
TVec< PNEANet > ToVarGraphSequence(TStr SplitAttr, TAttrAggr AggrPolicy, TIntPrV SplitIntervals)
Creates a sequence of graphs based on values of column SplitAttr and intervals specified by SplitInte...
 
TInt GetNextIntAttr(TInt ColIdx) const 
Returns value of integer attribute specified by integer column index for next row. 
 
void ColGenericOp(const TStr &Attr1, const TStr &Attr2, const TStr &ResAttr, TArithOp op)
Performs columnwise arithmetic operation. 
 
void SelectAtomic(const TStr &Col1, const TStr &Col2, TPredComp Cmp, TIntV &SelectedRows, TBool Remove=true)
Selects rows using atomic compare operation. 
 
TRowIterator & operator++(int)
Increments the iterator. 
 
bool IsKey(const TKey &Key) const 
 
void GetVariables(TStrV &Variables)
Get variables in current predicate. 
 
bool IsInt(const int &FldN) const 
Checks whether fields FldN is an integer. 
 
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element. 
 
void ColMin(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs min of two columns. See TTable::ColGenericOp. 
 
void ColMod(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs columnwise modulus. See TTable::ColGenericOp. 
 
static PNEANet New()
Static cons returns pointer to graph. Ex: PNEANet Graph=TNEANet::New(). 
 
void GetFltAttrNames(TStrV &Names) const 
Gets vector of flt attribute names. 
 
void RemoveFirstRow()
Removes first valid row of the table. 
 
bool IsStrIn(const TStr &Str) const 
 
TBool IsFirst() const 
Checks whether iterator points to first valid row of the table. 
 
void Trunc(const TSizeTy &_Vals=-1)
Truncates the vector's length and capacity to _Vals elements. 
 
Atomic predicate - encapsulates comparison operations. 
 
TBool IsColName(const TStr &ColName) const 
 
TInt CheckAndAddFltNode(T Graph, THash< TFlt, TInt > &NodeVals, TFlt FNodeVal)
Checks if given NodeVal is seen earlier; if not, add it to Graph and hashmap NodeVals. 
 
Predicate node - represents a binary predicate operation on two predicate nodes. 
 
void AddNodeAttributes(TInt NId, TStrV NodeAttrV, TInt RowId, THash< TInt, TStrIntVH > &NodeIntAttrs, THash< TInt, TStrFltVH > &NodeFltAttrs, THash< TInt, TStrStrVH > &NodeStrAttrs)
Takes as parameters, and updates, maps NodeXAttrs: Node Id –> (attribute name –> Vector of attribut...
 
void GetStrAttrNames(TStrV &Names) const 
Gets vector of str attribute names. 
 
PNEANet GetFirstGraphFromSequence(TAttrAggr AggrPolicy)
Returns the first graph of the sequence. 
 
TDat & AddDat(const TKey &Key)
 
PTable Intersection(const TTable &Table)
Returns intersection of this table with given Table. 
 
void AddNJointRowsMP(const TTable &T1, const TTable &T2, const TVec< TIntPrV > &JointRowIDSet)
Adds rows from T1 and T2 to this table in a parallel manner. Used by Join. 
 
void AddRowV(const TIntV &IntVals, const TFltV &FltVals, const TStrV &StrVals)
Adds row with values corresponding to the given vectors by type. 
 
const TDat & GetDat(const TKey &Key) const 
 
TFlt FltConst
Flt const value if this object is a float constant. 
 
TBool Eval()
Return the result of evaluating current predicate. 
 
TIntV GetFltRowIdxByVal(const TStr &ColName, const TFlt &Val) const 
Gets the rows containing Val in flt column ColName. 
 
TSize GetContextMemUsedKB()
Returns approximate memory used by table context in [KB]. 
 
uint64 GetStreamLen() const 
Returns length of stream. 
 
TPredicateNode * Parent
Parent node of this node. 
 
const TKey & GetKey(const int &KeyId) const 
 
TInt GetIntVal(const TStr &ColName, const TInt &RowIdx)
Gets the value of integer attribute ColName at row RowIdx. 
 
void AddTable(const TTable &T)
Adds all the rows of the input table. Allows duplicate rows (not a union). 
 
bool IsCmt() const 
Checks whether the current line is a comment (starts with '#'). 
 
void ColMul(const TStr &Attr1, const TStr &Attr2, const TStr &ResultAttrName="")
Performs columnwise multiplication. See TTable::ColGenericOp. 
 
void ClassifyAux(const TIntV &SelectedRows, const TStr &LabelName, const TInt &PositiveLabel=1, const TInt &NegativeLabel=0)
Adds a label attribute with positive labels on selected rows and negative labels on the rest...
 
THash< TStr, TFlt > FltVars
Float variables in the current predicate tree. 
 
void AddNRows(int NewRows, const TVec< TIntV > &IntColsP, const TVec< TFltV > &FltColsP, const TVec< TIntV > &StrColMapsP)
Adds NewRows rows from the given vectors for each column type. 
 
TVec< PTable > SpliceByGroup(const TStrV &GroupByAttrs, TBool Ordered=true)
Splices table into subtables according to a grouping statement. 
 
int GetKeyId(const char *Key) const 
 
void ColGenericOpMP(TInt ArgColIdx1, TInt ArgColIdx2, TAttrType ArgType1, TAttrType ArgType2, TInt ResColIdx, TArithOp op)
 
TVec< PNEANet > GetGraphsFromSequence(TAttrAggr AggrPolicy)
Returns a sequence of graphs. 
 
TStrV GetDstNodeIntAttrV() const 
Gets dst node int attribute name vector. 
 
TAtomicPredicate Atom
Atomic predicate at this node. 
 
bool IsFlt(const int &FldN) const 
Checks whether fields FldN is a float. 
 
TSizeTy AddV(const TVec< TVal, TSizeTy > &ValV)
Adds the elements of the vector ValV to the to end of the vector. 
 
TInt Partition(TIntV &V, TInt StartIdx, TInt EndIdx, const TVec< TAttrType > &SortByTypes, const TIntV &SortByIndices, TBool Asc)
Partitions vector for QSort. 
 
double GetFltFromFldV(TVec< char * > &FieldsV, const int &FldN)
Gets float at field FldN.