blob: f6037e363bc71b0cce932fdab98cc5510617fc06 [file] [log] [blame]
Shockb0f83152012-12-25 14:16:47 +08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2012 Tsinghua University, P.R.China
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Xiaoke Jiang <shock.jiang@gmail.com>
19 */
20
Alexander Afanasyev0c395372014-12-20 15:54:02 -080021#include "ndn-consumer-zipf-mandelbrot.hpp"
Shockb0f83152012-12-25 14:16:47 +080022
Alexander Afanasyev0c395372014-12-20 15:54:02 -080023#include "ns3/ndn-app-face.hpp"
Alexander Afanasyev1a0fff62013-01-19 14:29:51 -080024
Alexander Afanasyev0c395372014-12-20 15:54:02 -080025#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.hpp"
Alexander Afanasyev1a0fff62013-01-19 14:29:51 -080026
Shockb0f83152012-12-25 14:16:47 +080027#include <math.h>
Shockb0f83152012-12-25 14:16:47 +080028
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080029NS_LOG_COMPONENT_DEFINE("ndn.ConsumerZipfMandelbrot");
Shockb0f83152012-12-25 14:16:47 +080030
31namespace ns3 {
32namespace ndn {
33
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080034NS_OBJECT_ENSURE_REGISTERED(ConsumerZipfMandelbrot);
Shockb0f83152012-12-25 14:16:47 +080035
36TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080037ConsumerZipfMandelbrot::GetTypeId(void)
Shockb0f83152012-12-25 14:16:47 +080038{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080039 static TypeId tid =
40 TypeId("ns3::ndn::ConsumerZipfMandelbrot")
41 .SetGroupName("Ndn")
42 .SetParent<ConsumerCbr>()
43 .AddConstructor<ConsumerZipfMandelbrot>()
Alexander Afanasyev13800102012-12-25 00:30:31 -080044
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080045 .AddAttribute("NumberOfContents", "Number of the Contents in total", StringValue("100"),
46 MakeUintegerAccessor(&ConsumerZipfMandelbrot::SetNumberOfContents,
47 &ConsumerZipfMandelbrot::GetNumberOfContents),
48 MakeUintegerChecker<uint32_t>())
Alexander Afanasyev13800102012-12-25 00:30:31 -080049
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080050 .AddAttribute("q", "parameter of improve rank", StringValue("0.7"),
51 MakeDoubleAccessor(&ConsumerZipfMandelbrot::SetQ,
52 &ConsumerZipfMandelbrot::GetQ),
53 MakeDoubleChecker<double>())
54
55 .AddAttribute("s", "parameter of power", StringValue("0.7"),
56 MakeDoubleAccessor(&ConsumerZipfMandelbrot::SetS,
57 &ConsumerZipfMandelbrot::GetS),
58 MakeDoubleChecker<double>());
Shockb0f83152012-12-25 14:16:47 +080059
60 return tid;
61}
62
Shockb0f83152012-12-25 14:16:47 +080063ConsumerZipfMandelbrot::ConsumerZipfMandelbrot()
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080064 : m_N(100) // needed here to make sure when SetQ/SetS are called, there is a valid value of N
65 , m_q(0.7)
66 , m_s(0.7)
67 , m_SeqRng(0.0, 1.0)
Shockb0f83152012-12-25 14:16:47 +080068{
Alexander Afanasyev13800102012-12-25 00:30:31 -080069 // SetNumberOfContents is called by NS-3 object system during the initialization
Shockb0f83152012-12-25 14:16:47 +080070}
71
Alexander Afanasyev13800102012-12-25 00:30:31 -080072ConsumerZipfMandelbrot::~ConsumerZipfMandelbrot()
73{
Shockb0f83152012-12-25 14:16:47 +080074}
75
76void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080077ConsumerZipfMandelbrot::SetNumberOfContents(uint32_t numOfContents)
Alexander Afanasyev13800102012-12-25 00:30:31 -080078{
79 m_N = numOfContents;
80
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080081 NS_LOG_DEBUG(m_q << " and " << m_s << " and " << m_N);
Saran Tarnoi5cd9a152013-02-15 15:59:15 -080082
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080083 m_Pcum = std::vector<double>(m_N + 1);
Alexander Afanasyev13800102012-12-25 00:30:31 -080084
85 m_Pcum[0] = 0.0;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080086 for (uint32_t i = 1; i <= m_N; i++) {
87 m_Pcum[i] = m_Pcum[i - 1] + 1.0 / std::pow(i + m_q, m_s);
88 }
Saran Tarnoi5cd9a152013-02-15 15:59:15 -080089
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080090 for (uint32_t i = 1; i <= m_N; i++) {
91 m_Pcum[i] = m_Pcum[i] / m_Pcum[m_N];
92 NS_LOG_LOGIC("Cumulative probability [" << i << "]=" << m_Pcum[i]);
Alexander Afanasyev13800102012-12-25 00:30:31 -080093 }
94}
95
96uint32_t
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080097ConsumerZipfMandelbrot::GetNumberOfContents() const
Alexander Afanasyev13800102012-12-25 00:30:31 -080098{
99 return m_N;
100}
101
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800102void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800103ConsumerZipfMandelbrot::SetQ(double q)
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800104{
105 m_q = q;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800106 SetNumberOfContents(m_N);
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800107}
108
109double
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800110ConsumerZipfMandelbrot::GetQ() const
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800111{
112 return m_q;
113}
114
115void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800116ConsumerZipfMandelbrot::SetS(double s)
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800117{
118 m_s = s;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800119 SetNumberOfContents(m_N);
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800120}
121
122double
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800123ConsumerZipfMandelbrot::GetS() const
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800124{
125 return m_s;
126}
Alexander Afanasyev13800102012-12-25 00:30:31 -0800127
128void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800129ConsumerZipfMandelbrot::SendPacket()
130{
131 if (!m_active)
132 return;
Shockb0f83152012-12-25 14:16:47 +0800133
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800134 NS_LOG_FUNCTION_NOARGS();
Shockb0f83152012-12-25 14:16:47 +0800135
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800136 uint32_t seq = std::numeric_limits<uint32_t>::max(); // invalid
Shockb0f83152012-12-25 14:16:47 +0800137
Alexander Afanasyev13800102012-12-25 00:30:31 -0800138 // std::cout << Simulator::Now ().ToDouble (Time::S) << "s max -> " << m_seqMax << "\n";
Shockb0f83152012-12-25 14:16:47 +0800139
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800140 while (m_retxSeqs.size()) {
141 seq = *m_retxSeqs.begin();
142 m_retxSeqs.erase(m_retxSeqs.begin());
Shockb0f83152012-12-25 14:16:47 +0800143
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800144 // NS_ASSERT (m_seqLifetimes.find (seq) != m_seqLifetimes.end ());
145 // if (m_seqLifetimes.find (seq)->time <= Simulator::Now ())
146 // {
Shockb0f83152012-12-25 14:16:47 +0800147
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800148 // NS_LOG_DEBUG ("Expire " << seq);
149 // m_seqLifetimes.erase (seq); // lifetime expired. Trying to find another unexpired
150 // sequence number
151 // continue;
152 // }
153 NS_LOG_DEBUG("=interest seq " << seq << " from m_retxSeqs");
154 break;
155 }
156
157 if (seq == std::numeric_limits<uint32_t>::max()) // no retransmission
158 {
159 if (m_seqMax != std::numeric_limits<uint32_t>::max()) {
160 if (m_seq >= m_seqMax) {
161 return; // we are totally done
162 }
Alexander Afanasyev13800102012-12-25 00:30:31 -0800163 }
Shockb0f83152012-12-25 14:16:47 +0800164
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800165 seq = ConsumerZipfMandelbrot::GetNextSeq();
166 m_seq++;
167 }
Shockb0f83152012-12-25 14:16:47 +0800168
Alexander Afanasyev13800102012-12-25 00:30:31 -0800169 // std::cout << Simulator::Now ().ToDouble (Time::S) << "s -> " << seq << "\n";
Shockb0f83152012-12-25 14:16:47 +0800170
Alexander Afanasyev13800102012-12-25 00:30:31 -0800171 //
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -0700172 shared_ptr<Name> nameWithSequence = make_shared<Name>(m_interestName);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800173 nameWithSequence->appendSeqNum(seq);
Alexander Afanasyev13800102012-12-25 00:30:31 -0800174 //
Shockb0f83152012-12-25 14:16:47 +0800175
Spyridon Mastorakis53e922f2014-10-17 17:29:26 -0700176 shared_ptr<Interest> interest = make_shared<Interest>();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800177 interest->SetNonce(m_rand.GetValue());
178 interest->SetName(nameWithSequence);
Shockb0f83152012-12-25 14:16:47 +0800179
Alexander Afanasyevfaa01f92013-07-10 18:34:31 -0700180 // NS_LOG_INFO ("Requesting Interest: \n" << *interest);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800181 NS_LOG_INFO("> Interest for " << seq << ", Total: " << m_seq << ", face: " << m_face->GetId());
182 NS_LOG_DEBUG("Trying to add " << seq << " with " << Simulator::Now() << ". already "
183 << m_seqTimeouts.size() << " items");
Shockb0f83152012-12-25 14:16:47 +0800184
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800185 m_seqTimeouts.insert(SeqTimeout(seq, Simulator::Now()));
186 m_seqFullDelay.insert(SeqTimeout(seq, Simulator::Now()));
Alexander Afanasyev400aae12013-01-19 13:27:52 -0800187
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800188 m_seqLastDelay.erase(seq);
189 m_seqLastDelay.insert(SeqTimeout(seq, Simulator::Now()));
Alexander Afanasyev400aae12013-01-19 13:27:52 -0800190
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800191 m_seqRetxCounts[seq]++;
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800192
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800193 m_rtt->SentSeq(SequenceNumber32(seq), 1);
Shockb0f83152012-12-25 14:16:47 +0800194
Alexander Afanasyev1a0fff62013-01-19 14:29:51 -0800195 FwHopCountTag hopCountTag;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800196 interest->GetPayload()->AddPacketTag(hopCountTag);
Saran Tarnoi5cd9a152013-02-15 15:59:15 -0800197
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 m_transmittedInterests(interest, this, m_face);
199 m_face->ReceiveInterest(interest);
Shockb0f83152012-12-25 14:16:47 +0800200
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800201 ConsumerZipfMandelbrot::ScheduleNextPacket();
Shockb0f83152012-12-25 14:16:47 +0800202}
203
Shockb0f83152012-12-25 14:16:47 +0800204uint32_t
Alexander Afanasyev13800102012-12-25 00:30:31 -0800205ConsumerZipfMandelbrot::GetNextSeq()
206{
207 uint32_t content_index = 1; //[1, m_N]
208 double p_sum = 0;
Shockb0f83152012-12-25 14:16:47 +0800209
Alexander Afanasyev13800102012-12-25 00:30:31 -0800210 double p_random = m_SeqRng.GetValue();
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800211 while (p_random == 0) {
212 p_random = m_SeqRng.GetValue();
213 }
214 // if (p_random == 0)
215 NS_LOG_LOGIC("p_random=" << p_random);
216 for (uint32_t i = 1; i <= m_N; i++) {
217 p_sum = m_Pcum[i]; // m_Pcum[i] = m_Pcum[i-1] + p[i], p[0] = 0; e.g.: p_cum[1] = p[1],
218 // p_cum[2] = p[1] + p[2]
219 if (p_random <= p_sum) {
220 content_index = i;
221 break;
222 } // if
223 } // for
224 // content_index = 1;
225 NS_LOG_DEBUG("RandomNumber=" << content_index);
Alexander Afanasyev13800102012-12-25 00:30:31 -0800226 return content_index;
Shockb0f83152012-12-25 14:16:47 +0800227}
228
229void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800230ConsumerZipfMandelbrot::ScheduleNextPacket()
231{
Shockb0f83152012-12-25 14:16:47 +0800232
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800233 if (m_firstTime) {
234 m_sendEvent = Simulator::Schedule(Seconds(0.0), &ConsumerZipfMandelbrot::SendPacket, this);
235 m_firstTime = false;
236 }
237 else if (!m_sendEvent.IsRunning())
238 m_sendEvent = Simulator::Schedule((m_random == 0) ? Seconds(1.0 / m_frequency)
239 : Seconds(m_random->GetValue()),
240 &ConsumerZipfMandelbrot::SendPacket, this);
Shockb0f83152012-12-25 14:16:47 +0800241}
242
243} /* namespace ndn */
244} /* namespace ns3 */