zipf: Small changes (style and small logic correction) and adding documentation section
diff --git a/apps/ndn-consumer-cbr.h b/apps/ndn-consumer-cbr.h
index 8ab4472..01e84a5 100644
--- a/apps/ndn-consumer-cbr.h
+++ b/apps/ndn-consumer-cbr.h
@@ -88,7 +88,6 @@
// DataRate
// GetDesiredRate () const;
-private:
protected:
double m_frequency; // Frequency of interest packets (in hertz)
bool m_firstTime;
diff --git a/apps/ndn-consumer-zipf-mandelbrot.cc b/apps/ndn-consumer-zipf-mandelbrot.cc
index d744143..1fc8d45 100644
--- a/apps/ndn-consumer-zipf-mandelbrot.cc
+++ b/apps/ndn-consumer-zipf-mandelbrot.cc
@@ -24,7 +24,6 @@
#include "ns3/ndn-interest.h"
#include "ns3/ndn-content-object.h"
#include <math.h>
-//#include <random-variable.h>
NS_LOG_COMPONENT_DEFINE ("ndn.ConsumerZipfMandelbrot");
@@ -41,18 +40,22 @@
.SetGroupName ("Ndn")
.SetParent<ConsumerCbr> ()
.AddConstructor<ConsumerZipfMandelbrot> ()
- .AddAttribute ("N", "Number of the Contents in total",
- StringValue ("100"),
- MakeUintegerAccessor (&ConsumerZipfMandelbrot::m_N),
- MakeUintegerChecker<uint32_t> ())
- .AddAttribute ("q", "parameter of improve rank",
- StringValue ("0.7"),
- MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
- MakeDoubleChecker<double>())
- .AddAttribute ("s", "parameter of power",
- StringValue ("0.7"),
- MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
- MakeDoubleChecker<double>())
+
+ .AddAttribute ("NumberOfContents", "Number of the Contents in total",
+ StringValue ("100"),
+ MakeUintegerAccessor (&ConsumerZipfMandelbrot::SetNumberOfContents, &ConsumerZipfMandelbrot::GetNumberOfContents),
+ MakeUintegerChecker<uint32_t> ())
+
+ // Alex: q and s are not yet really working
+ //
+ // .AddAttribute ("q", "parameter of improve rank",
+ // StringValue ("0.7"),
+ // MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_q),
+ // MakeDoubleChecker<double>())
+ // .AddAttribute ("s", "parameter of power",
+ // StringValue ("0.7"),
+ // MakeDoubleAccessor (&ConsumerZipfMandelbrot::m_s),
+ // MakeDoubleChecker<double>())
;
return tid;
@@ -60,149 +63,162 @@
ConsumerZipfMandelbrot::ConsumerZipfMandelbrot()
- : m_N(100)
- , m_q (0.7)
- , m_s (0.7)
+ : m_q (0.7)
+ , m_s (0.7)
+ , m_SeqRng (0.0, 1.0)
{
- m_Pcum = new double[m_N+1];
- m_Pcum[0] = 0.0;
- for (uint32_t i=1; i<=m_N; i++) {
- m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
- }
- for (uint32_t i=1; i<=m_N; i++) {
- m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
- NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
- }
- //Ptr<UniformRandomVariable> m_SeqRng = CreateObject<UniformRandomVariable> ();
- m_SeqRng = new UniformVariable(0.0, 1.0); //[1, m_N+1)
- //m_SeqRng = new UniformVariable ();
+ // SetNumberOfContents is called by NS-3 object system during the initialization
}
-ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot() {
- if (m_Pcum) {
- delete m_Pcum;
- m_Pcum = NULL;
- }
-// if (m_SeqRng) {
-// delete m_SeqRng;
-// m_SeqRng = NULL;
-// }
+ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot()
+{
}
void
+ConsumerZipfMandelbrot::SetNumberOfContents (uint32_t numOfContents)
+{
+ m_N = numOfContents;
+
+ m_Pcum = std::vector<double> (m_N + 1);
+
+ m_Pcum[0] = 0.0;
+ for (uint32_t i=1; i<=m_N; i++)
+ {
+ m_Pcum[i] = m_Pcum[i-1] + 1.0/pow(i+m_q, m_s);
+ }
+
+ for (uint32_t i=1; i<=m_N; i++)
+ {
+ m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
+ NS_LOG_LOGIC("cum Probability ["<<i<<"]="<<m_Pcum[i]);
+ }
+}
+
+uint32_t
+ConsumerZipfMandelbrot::GetNumberOfContents () const
+{
+ return m_N;
+}
+
+
+void
ConsumerZipfMandelbrot::SendPacket() {
- if (!m_active) return;
+ if (!m_active) return;
- NS_LOG_FUNCTION_NOARGS ();
+ NS_LOG_FUNCTION_NOARGS ();
- uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
+ uint32_t seq=std::numeric_limits<uint32_t>::max (); //invalid
- // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
+ // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
- while (m_retxSeqs.size ())
- {
- seq = *m_retxSeqs.begin ();
- m_retxSeqs.erase (m_retxSeqs.begin ());
+ while (m_retxSeqs.size ())
+ {
+ seq = *m_retxSeqs.begin ();
+ m_retxSeqs.erase (m_retxSeqs.begin ());
- // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
- // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
- // {
+ // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
+ // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
+ // {
- // NS_LOG_DEBUG ("Expire " << seq);
- // m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
- // continue;
- // }
- NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
- break;
- }
+ // NS_LOG_DEBUG ("Expire " << seq);
+ // m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired sequence number
+ // continue;
+ // }
+ NS_LOG_DEBUG("=interest seq "<<seq<<" from m_retxSeqs");
+ break;
+ }
- if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
- {
- if (m_seqMax != std::numeric_limits<uint32_t>::max ())
- {
- if (m_seq >= m_seqMax)
- {
- return; // we are totally done
- }
- }
+ if (seq == std::numeric_limits<uint32_t>::max ()) //no retransmission
+ {
+ if (m_seqMax != std::numeric_limits<uint32_t>::max ())
+ {
+ if (m_seq >= m_seqMax)
+ {
+ return; // we are totally done
+ }
+ }
- seq = ConsumerZipfMandelbrot::GetNextSeq();
- m_seq ++;
- }
+ seq = ConsumerZipfMandelbrot::GetNextSeq();
+ m_seq ++;
+ }
- // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
+ // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
- //
- Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
- (*nameWithSequence) (seq);
- //
+ //
+ Ptr<NameComponents> nameWithSequence = Create<NameComponents> (m_interestName);
+ (*nameWithSequence) (seq);
+ //
- InterestHeader interestHeader;
- interestHeader.SetNonce (m_rand.GetValue ());
- interestHeader.SetName (nameWithSequence);
+ InterestHeader interestHeader;
+ interestHeader.SetNonce (m_rand.GetValue ());
+ interestHeader.SetName (nameWithSequence);
- // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
- NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+ // NS_LOG_INFO ("Requesting Interest: \n" << interestHeader);
+ NS_LOG_INFO ("> Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
- Ptr<Packet> packet = Create<Packet> ();
+ Ptr<Packet> packet = Create<Packet> ();
- //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
- packet->AddHeader (interestHeader);
- //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
+ //NS_LOG_DEBUG ("= Interest for " << seq<<", Total: "<<m_seq<<", face: "<<m_face->GetId());
+ packet->AddHeader (interestHeader);
+ //NS_LOG_DEBUG ("Interest packet size: " << packet->GetSize ());
- NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
+ NS_LOG_DEBUG ("Trying to add " << seq << " with " << Simulator::Now () << ". already " << m_seqTimeouts.size () << " items");
- m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
- m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
- m_transmittedInterests (&interestHeader, this, m_face);
+ m_seqTimeouts.insert (SeqTimeout (seq, Simulator::Now ()));
+ m_seqLifetimes.insert (SeqTimeout (seq, Simulator::Now () + m_interestLifeTime)); // only one insert will work. if entry exists, nothing will happen... nothing should happen
+ m_transmittedInterests (&interestHeader, this, m_face);
- m_rtt->SentSeq (SequenceNumber32 (seq), 1);
+ m_rtt->SentSeq (SequenceNumber32 (seq), 1);
- m_protocolHandler (packet);
+ m_protocolHandler (packet);
- ConsumerZipfMandelbrot::ScheduleNextPacket ();
+ ConsumerZipfMandelbrot::ScheduleNextPacket ();
}
uint32_t
-ConsumerZipfMandelbrot::GetNextSeq(){
- uint32_t content_index = 1; //[1, m_N]
- double p_sum = 0;
+ConsumerZipfMandelbrot::GetNextSeq()
+{
+ uint32_t content_index = 1; //[1, m_N]
+ double p_sum = 0;
- double p_random = m_SeqRng->GetValue();
- while (p_random == 0){
- p_random = m_SeqRng->GetValue();
- }
- //if (p_random == 0)
- NS_LOG_LOGIC("p_random="<<p_random);
- for (uint32_t i=1; i<=m_N; i++) {
- p_sum = m_Pcum[i]; //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0; e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
- if (p_random <= p_sum) {
- content_index = i;
- break;
- } //if
- } //for
- //content_index = 1;
- NS_LOG_DEBUG("RandomNumber="<<content_index);
- return content_index;
+ double p_random = m_SeqRng.GetValue();
+ while (p_random == 0)
+ {
+ p_random = m_SeqRng.GetValue();
+ }
+ //if (p_random == 0)
+ NS_LOG_LOGIC("p_random="<<p_random);
+ for (uint32_t i=1; i<=m_N; i++)
+ {
+ p_sum = m_Pcum[i]; //m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0; e.g.: p_cum[1] = p[1], p_cum[2] = p[1] + p[2]
+ if (p_random <= p_sum)
+ {
+ content_index = i;
+ break;
+ } //if
+ } //for
+ //content_index = 1;
+ NS_LOG_DEBUG("RandomNumber="<<content_index);
+ return content_index;
}
void
ConsumerZipfMandelbrot::ScheduleNextPacket() {
- if (m_firstTime)
- {
- m_sendEvent = Simulator::Schedule (Seconds (0.0),
- &ConsumerZipfMandelbrot::SendPacket, this);
- m_firstTime = false;
- }
- else if (!m_sendEvent.IsRunning ())
- m_sendEvent = Simulator::Schedule (
- (m_random == 0) ?
- Seconds(1.0 / m_frequency)
- :
- Seconds(m_random->GetValue ()),
- &ConsumerZipfMandelbrot::SendPacket, this);
+ if (m_firstTime)
+ {
+ m_sendEvent = Simulator::Schedule (Seconds (0.0),
+ &ConsumerZipfMandelbrot::SendPacket, this);
+ m_firstTime = false;
+ }
+ else if (!m_sendEvent.IsRunning ())
+ m_sendEvent = Simulator::Schedule (
+ (m_random == 0) ?
+ Seconds(1.0 / m_frequency)
+ :
+ Seconds(m_random->GetValue ()),
+ &ConsumerZipfMandelbrot::SendPacket, this);
}
} /* namespace ndn */
diff --git a/apps/ndn-consumer-zipf-mandelbrot.h b/apps/ndn-consumer-zipf-mandelbrot.h
index 7d72ef3..71113b2 100644
--- a/apps/ndn-consumer-zipf-mandelbrot.h
+++ b/apps/ndn-consumer-zipf-mandelbrot.h
@@ -43,38 +43,41 @@
*
* The class implements an app which requests contents following Zipf-Mandelbrot Distribution
* Here is the explaination of Zipf-Mandelbrot Distribution: http://en.wikipedia.org/wiki/Zipf%E2%80%93Mandelbrot_law
-
*/
-//
-class ConsumerZipfMandelbrot: public ns3::ndn::ConsumerCbr {
+class ConsumerZipfMandelbrot: public ConsumerCbr
+{
public:
- static TypeId GetTypeId ();
+ static TypeId GetTypeId ();
/**
* \brief Default constructor
* Sets up randomized Number Generator (RNG)
* Note: m_seq of its parent class ConsumerCbr here is used to record the interest number
*/
- ConsumerZipfMandelbrot();
- virtual ~ConsumerZipfMandelbrot();
+ ConsumerZipfMandelbrot ();
+ virtual ~ConsumerZipfMandelbrot ();
- virtual void SendPacket();
- uint32_t GetNextSeq();
+ virtual void SendPacket();
+ uint32_t GetNextSeq();
protected:
- virtual void
- ScheduleNextPacket ();
+ virtual void
+ ScheduleNextPacket ();
private:
- uint32_t m_N; //number of the contents
- double m_q; //q in (k+q)^s
- double m_s; //s in (k+q)^s
- double * m_Pcum; //cumulative probability
+ void
+ SetNumberOfContents (uint32_t numOfContents);
- UniformVariable * m_SeqRng; //RNG
+ uint32_t
+ GetNumberOfContents () const;
+
+private:
+ uint32_t m_N; //number of the contents
+ double m_q; //q in (k+q)^s
+ double m_s; //s in (k+q)^s
+ std::vector<double> m_Pcum; //cumulative probability
-
-
+ UniformVariable m_SeqRng; //RNG
};
} /* namespace ndn */