double
LogRuleDownlinkPacketScheduler::ComputeSchedulingMetric (RadioBearer *bearer, double spectralEfficiency, int subChannel)
{
  double metric;

  if ((bearer->GetApplication ()->GetApplicationType () == Application::APPLICATION_TYPE_INFINITE_BUFFER)
	  ||
	  (bearer->GetApplication ()->GetApplicationType () == Application::APPLICATION_TYPE_CBR))
	{
	  metric = (spectralEfficiency * 180000.)
				/
				bearer->GetAverageTransmissionRate();
	}
  else
	{
	   QoSParameters *qos = bearer->GetQoSParameters ();
	   double HOL = bearer->GetHeadOfLinePacketDelay ();
	   double targetDelay = qos->GetMaxDelay ();

	   //COMPUTE METRIC USING EXP RULE:
	   double logTerm = log (1.1 + ( (5 * HOL) / targetDelay ));
	   double weight = (spectralEfficiency * 180000.)
		  		       /
	    	           bearer->GetAverageTransmissionRate();

  	   metric = logTerm * weight;
	}

  return metric;
}
double
MwRulePacketScheduler::ComputeSchedulingMetric (RadioBearer *bearer, double spectralEfficiency, int subChannel)
{
#ifdef SCHEDULER_DEBUG
	std::cout << "\t ComputeSchedulingMetric for flow "
			<< bearer->GetApplication ()->GetApplicationID () << std::endl;
#endif

  double metric;

  if ((bearer->GetApplication ()->GetApplicationType () == Application::APPLICATION_TYPE_INFINITE_BUFFER)
	  ||
	  (bearer->GetApplication ()->GetApplicationType () == Application::APPLICATION_TYPE_CBR))
	{
	  metric = (spectralEfficiency * 180000.)
				/
				bearer->GetAverageTransmissionRate();

#ifdef SCHEDULER_DEBUG
	std::cout << "\t\t non real time flow: metric = " << metric << std::endl;
#endif

	}
  else
	{
	  QoSParameters *qos = bearer->GetQoSParameters ();
	  double HOL = bearer->GetHeadOfLinePacketDelay ();
	  double targetDelay = qos->GetMaxDelay ();

#ifdef SCHEDULER_DEBUG
	  std::cout << "\t\t real time flow: HOL = " << HOL << ", target delay = " << targetDelay;
#endif

	  //compute sum of HOL and average spectral efficiency
//#ifdef SCHEDULER_DEBUG
//	  std::cout << "\n\t\t\t compute sum HOL for all real time flows"<< std::endl;
//#endif

	  double sumHOL = 0;
	  int nbFlows = 0;
	  FlowsToSchedule *flowsToSchedule = GetFlowsToSchedule ();
	  FlowsToSchedule::iterator iter;
	  FlowToSchedule *flow;

	  for (iter = flowsToSchedule->begin (); iter != flowsToSchedule->end (); iter++)
	    {
		  flow = (*iter);
		  if (!flow->GetBearer ()->HasPackets ())
		    {}
		  else
			{
			  if ((flow->GetBearer ()->GetApplication ()->GetApplicationType ()
					  != Application::APPLICATION_TYPE_INFINITE_BUFFER)
			   		  &&
			          (flow->GetBearer ()->GetApplication ()->GetApplicationType ()
			        		  != Application::APPLICATION_TYPE_CBR))
			    {
			      sumHOL += flow->GetBearer ()->GetHeadOfLinePacketDelay ();
			      nbFlows++;

//#ifdef SCHEDULER_DEBUG
//	              std::cout << "\t\t\t --> HOL for flow " << flow->GetBearer ()->GetApplication ()->GetApplicationID ()
//	            		  << " = " << flow->GetBearer ()->GetHeadOfLinePacketDelay ()<< std::endl;
//#endif
			    }
			  else
			    {
//#ifdef SCHEDULER_DEBUG
//	              std::cout << "\t\t\t --> non real time flow, go on! " << std::endl;
//#endif
			    }
			}
	    }


	  //COMPUTE METRIC USING EXP RULE:
	  double numerator = (6/targetDelay) * HOL;
	  double denominator = (1 + sqrt (sumHOL/nbFlows));
	  double weight = (spectralEfficiency * 180000.)
				      /
	    	          bearer->GetAverageTransmissionRate();

	  metric = (exp (numerator / denominator)) * weight;

#ifdef SCHEDULER_DEBUG
	  std::cout << " --> metric = " << metric << std::endl;
#endif
	}

  return metric;
}