public QryResult evaluateIndri(RetrievalModel r) throws IOException {
		
	   //  Initialization

	    allocDaaTPtrs (r);
	    QryResult result = new QryResult ();
	 
	    double queryVal = (double) 1 / (double)this.args.size(); // args / daat ?
	    boolean looper = true;
	    double tempScore = 0;
	    DaaTPtr ptri;
	    
	    while (looper)
	    {
	    	looper = false;
	    	double answer = 1;
	    	// the minDoc is initialized to max value
	    	int minDoc = Integer.MAX_VALUE;
	    	
	    	// Get the minimum docid from the inv lists.
	    	for (int i=0; i < this.daatPtrs.size(); i++) {
	    		
	    		ptri = this.daatPtrs.get(i);
	    		
	    		if (ptri.nextDoc == ptri.scoreList.scores.size())
	    			continue;
	    		
	    		if (minDoc >= ptri.scoreList.getDocid (ptri.nextDoc))
	    		{
	    			minDoc = ptri.scoreList.getDocid (ptri.nextDoc);
	    			looper = true;
	    		}
	    		
	    	}
	    	
	    	if (looper == false)
	    		break;
	    		
	    	for (int i=0; i < this.daatPtrs.size(); i++) {
		    	
	    		ptri = this.daatPtrs.get(i);
	    		
	    		if (ptri.nextDoc == ptri.scoreList.scores.size()) {
	    			tempScore = ((QryopSlScore) this.args.get(i)).getDefaultScore(r, minDoc);
	    			double poww = Math.pow(tempScore, queryVal);	//  INDRI
	    			answer = answer * poww; //	INDRI
	    			continue;
	    		}
	    		
	    		if (minDoc != ptri.scoreList.getDocid (ptri.nextDoc))
	    		{
	    		
	    			tempScore = ((QryopSlScore) this.args.get(i)).getDefaultScore(r, minDoc);
	    			double poww = Math.pow(tempScore, queryVal);	//  INDRI
	    			answer = answer * poww; //	INDRI
	    		}
	    		else
	    		{
	    			tempScore = ptri.scoreList.getDocidScore(ptri.nextDoc); 
	    			double poww = Math.pow(tempScore, queryVal);	//  INDRI
	    			answer = answer * poww;	//	INDRI
	    			ptri.nextDoc++;
	    		}
	    		
	    	}  	
	    	
	    	result.docScores.add (minDoc, answer);
	    }

	    freeDaaTPtrs ();

	    return result;
	  }