コード例 #1
0
ファイル: splitter.cpp プロジェクト: Artemid/alchemy-2
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;
	}
	
}
コード例 #2
0
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;
    }
}