void LSplitter::doCompleteSplitInChunks(vector<WClause*> groundCNF,int atomId, vector<vector<int> > allGroundings, int numGroundings, vector<vector<WClause*> >& resolvedCNFList,int startnum, int chunkSize,bool& done) { vector<int> binVector(numGroundings); for(unsigned int i=0;i<numGroundings;i++) { binVector[i] = 0; } int mask = 1; int iter=numGroundings-1; while(startnum) { int x = startnum & mask; binVector[iter--] = x; startnum = startnum >> 1; } iter = 0; while(1) { vector<WClause*> resolvedCNF; for(unsigned int i=0;i<groundCNF.size();i++) { WClause* resolvedClause=LvrMLN::create_new_clause(groundCNF[i]); resolver->resolveGroundClause(groundCNF[i],atomId,binVector,allGroundings,*resolvedClause); resolvedCNF.push_back(resolvedClause); } resolvedCNFList.push_back(resolvedCNF); int ind = binVector.size()-1; binVector[ind]++; while(binVector[ind] == 2) { binVector[ind]=0; if((ind-1) >= 0) binVector[ind-1]++; else { done=true; break; } ind--; } iter++; //reached chunk size assignments if(iter == chunkSize) break; //reached the end of all assignments if(done) break; } }
VariableReader::VariableReader(const string& fileName, VariableContainer& varContainer) : ConfigReader(fileName), variableContainer(varContainer), is2D(false) { // Allow float -> int and int -> float conversions cfg.setAutoConvert(true); const Setting& variables = cfg.lookup("variables"); const unsigned int nVar = variables.getLength(); unsigned int nRange = 0; for( unsigned int iVar=0; iVar < nVar; ++iVar ) { int remainder = (iVar-nRange)%3; if( remainder == 0 ) { const Setting& setting = variables[iVar]; if( setting.getType() == Setting::Type::TypeString ) { readVariableName(variables[iVar]); } else { const unsigned int axisLength = setting.getLength(); if( axisLength != 2 ) { cerr << "Need exactly two numbers for y-axis range: " << (variables[iVar-3]).c_str() << endl; throw 1; } vector<double> axisVector = {(double) setting[0], (double) setting[1]}; variableContainer.axisRanges[variableContainer.variableNames.size()-1] = ( axisVector ); nRange++; } } else if( remainder == 1 ) { variableContainer.nBins.push_back( variables[iVar] ); } else { const Setting& binSetting = variables[iVar]; const unsigned int binLength = binSetting.getLength(); if( binLength < 2 ) { cerr << "Not enough numbers to make binning for variable: " << (variables[iVar-2]).c_str() << endl; throw 1; } vector<double> binVector(binLength); for( unsigned int iBin=0; iBin < binLength; ++iBin ) { binVector[iBin] = (double) binSetting[iBin]; } variableContainer.binning.push_back( binVector ); } } // Check # arguments if( (nVar-variableContainer.axisRanges.size())%3 != 0 ) { cerr << "Number of elements in variables list not correct." << endl; throw 1; } }