A Discrete-Event Network Simulator
API
building-position-allocator.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (C) 2012 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC)
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: Nicola Baldo <nbaldo@cttc.es>
19 * Michele Polese <michele.polese@gmail.com> for the OutdoorPositionAllocator class
20 */
22#include <ns3/mobility-building-info.h>
23#include "ns3/mobility-model.h"
24#include "ns3/buildings-helper.h"
25#include "ns3/random-variable-stream.h"
26#include "ns3/double.h"
27#include "ns3/uinteger.h"
28#include "ns3/enum.h"
29#include "ns3/boolean.h"
30#include "ns3/log.h"
31#include "ns3/box.h"
32#include "ns3/building.h"
33#include "ns3/string.h"
34#include "ns3/pointer.h"
35#include <cmath>
36
37#include "ns3/building-list.h"
38
39namespace ns3 {
40
41NS_LOG_COMPONENT_DEFINE ("BuildingPositionAllocator");
42
43NS_OBJECT_ENSURE_REGISTERED (RandomBuildingPositionAllocator);
44
45
47{
48 m_rand = CreateObject<UniformRandomVariable> ();
49}
50
53{
54 static TypeId tid = TypeId ("ns3::RandomBuildingPositionAllocator")
56 .SetGroupName ("Buildings")
57 .AddConstructor<RandomBuildingPositionAllocator> ()
58 .AddAttribute ("WithReplacement",
59 "If true, the building will be randomly selected with replacement. "
60 "If false, no replacement will occur, until the list of buildings "
61 "to select becomes empty, at which point it will be filled again "
62 "with the list of all buildings.",
63 BooleanValue (false),
66 return tid;
67}
68
69Vector
71{
72 NS_ASSERT_MSG (BuildingList::GetNBuildings () > 0, "no building found");
75 {
78 }
79 else
80 {
82 {
83 for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
84 {
85 m_buildingListWithoutReplacement.push_back (*bit);
86 }
87 }
91 }
92
93 Ptr<RandomBoxPositionAllocator> pa = CreateObject<RandomBoxPositionAllocator> ();
94 BoxValue bv;
95 b->GetAttribute ("Boundaries", bv);
96 double x = m_rand->GetValue (bv.Get ().xMin, bv.Get ().xMax);
97 double y = m_rand->GetValue (bv.Get ().yMin, bv.Get ().yMax);
98 double z = m_rand->GetValue (bv.Get ().zMin, bv.Get ().zMax);
99 return Vector (x, y, z);
100}
101
102int64_t
104{
105 m_rand->SetStream (stream);
106 return 1;
107}
108
109
111
113{
114}
115
116TypeId
118{
119 static TypeId tid = TypeId ("ns3::OutdoorPositionAllocator")
121 .SetGroupName ("Buildings")
122 .AddConstructor<OutdoorPositionAllocator> ()
123 .AddAttribute ("X",
124 "A random variable which represents the x coordinate of a position in a random box.",
125 StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"),
127 MakePointerChecker<RandomVariableStream> ())
128 .AddAttribute ("Y",
129 "A random variable which represents the y coordinate of a position in a random box.",
130 StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"),
132 MakePointerChecker<RandomVariableStream> ())
133 .AddAttribute ("Z",
134 "A random variable which represents the z coordinate of a position in a random box.",
135 StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=1.0]"),
137 MakePointerChecker<RandomVariableStream> ())
138 .AddAttribute ("MaxAttempts",
139 "Maximum number of attempts for the rejection sampling before giving up.",
140 UintegerValue (1000),
142 MakeUintegerChecker<uint32_t> ())
143 ;
144
145 return tid;
146}
147
148void
150{
151 m_x = x;
152}
153void
155{
156 m_y = y;
157}
158void
160{
161 m_z = z;
162}
163
164Vector
166{
167 NS_ABORT_MSG_IF (BuildingList::GetNBuildings () == 0, "no building found");
168
169 bool outdoor = false;
170 uint32_t attempts = 0;
171 Vector position = Vector (0,0,0);
172
173 while (!outdoor && attempts < m_maxAttempts)
174 {
175 // get a random position
176 double x = m_x->GetValue ();
177 double y = m_y->GetValue ();
178 double z = m_z->GetValue ();
179
180 position = Vector (x, y, z);
181
182 NS_LOG_INFO ("Position " << position);
183
184 bool inside = false;
185 for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
186 {
187 if ((*bit)->IsInside (position))
188 {
189 NS_LOG_INFO ("Position " << position << " is inside the building with boundaries "
190 << (*bit)->GetBoundaries ().xMin << " " << (*bit)->GetBoundaries ().xMax << " "
191 << (*bit)->GetBoundaries ().yMin << " " << (*bit)->GetBoundaries ().yMax << " "
192 << (*bit)->GetBoundaries ().zMin << " " << (*bit)->GetBoundaries ().zMax);
193 inside = true;
194 break;
195 }
196 }
197
198 if (inside)
199 {
200 NS_LOG_INFO ("Inside a building, attempt " << attempts << " out of " << m_maxAttempts);
201 attempts++;
202 }
203 else
204 {
205 NS_LOG_INFO ("Outdoor position found " << position);
206 outdoor = true;
207 }
208 }
209
210 NS_ABORT_MSG_IF (attempts >= m_maxAttempts, "Too many attempts, give up");
211 NS_ABORT_MSG_IF (!outdoor, "Still indoor, give up");
212 return position;
213}
214
215int64_t
217{
218 m_x->SetStream (stream);
219 m_y->SetStream (stream + 1);
220 m_z->SetStream (stream + 2);
221 return 3;
222}
223
224
226
227
229{
230 m_rand = CreateObject<UniformRandomVariable> ();
231}
232
233TypeId
235{
236 static TypeId tid = TypeId ("ns3::RandomRoomPositionAllocator")
238 .SetGroupName ("Buildings")
239 .AddConstructor<RandomRoomPositionAllocator> ();
240 return tid;
241}
242
243Vector
245{
246 NS_LOG_FUNCTION (this);
247 NS_ASSERT_MSG (BuildingList::GetNBuildings () > 0, "no building found");
248
249 if (m_roomListWithoutReplacement.empty ())
250 {
251 for (BuildingList::Iterator bit = BuildingList::Begin (); bit != BuildingList::End (); ++bit)
252 {
253 NS_LOG_LOGIC ("building " << (*bit)->GetId ());
254 for (uint32_t rx = 1; rx <= (*bit)->GetNRoomsX (); ++rx)
255 {
256 for (uint32_t ry = 1; ry <= (*bit)->GetNRoomsY (); ++ry)
257 {
258 for (uint32_t f = 1; f <= (*bit)->GetNFloors (); ++f)
259 {
260 RoomInfo i;
261 i.roomx = rx;
262 i.roomy = ry;
263 i.floor = f;
264 i.b = *bit;
265 NS_LOG_LOGIC ("adding room (" << rx << ", " << ry << ", " << f << ")");
266 m_roomListWithoutReplacement.push_back (i);
267 }
268 }
269 }
270 }
271 }
275 NS_LOG_LOGIC ("considering building " << r.b->GetId () << " room (" << r.roomx << ", " << r.roomy << ", " << r.floor << ")");
276
277 Ptr<RandomBoxPositionAllocator> pa = CreateObject<RandomBoxPositionAllocator> ();
278 BoxValue bv;
279 r.b->GetAttribute ("Boundaries", bv);
280 Box box = bv.Get ();
281 double rdx = (box.xMax - box.xMin) / r.b->GetNRoomsX ();
282 double rdy = (box.yMax - box.yMin) / r.b->GetNRoomsY ();
283 double rdz = (box.zMax - box.zMin) / r.b->GetNFloors ();
284 double x1 = box.xMin + rdx * (r.roomx - 1);
285 double x2 = box.xMin + rdx * r.roomx;
286 double y1 = box.yMin + rdy * (r.roomy -1);
287 double y2 = box.yMin + rdy * r.roomy;
288 double z1 = box.zMin + rdz * (r.floor - 1);
289 double z2 = box.zMin + rdz * r.floor;
290 NS_LOG_LOGIC ("randomly allocating position in "
291 << " (" << x1 << "," << x2 << ") "
292 << "x (" << y1 << "," << y2 << ") "
293 << "x (" << z1 << "," << z2 << ") ");
294
295 double x = m_rand->GetValue (x1, x2);
296 double y = m_rand->GetValue (y1, y2);
297 double z = m_rand->GetValue (z1, z2);
298
299 return Vector (x, y, z);
300}
301
302int64_t
304{
305 m_rand->SetStream (stream);
306 return 1;
307}
308
309
310
311
312
314
316{
317 NS_FATAL_ERROR (" Constructor \"SameRoomPositionAllocator ()\" should not be used");
318}
319
320
322 : m_nodes (c)
323{
324 m_rand = CreateObject<UniformRandomVariable> ();
326 // this is needed to make sure the building models associated with c have been initialized
327 for (NodeContainer::Iterator it = m_nodes.Begin (); it != m_nodes.End (); ++it)
328 {
330 NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
332 NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
333 bmm->MakeConsistent (mm);
334 }
335}
336
337TypeId
339{
340 static TypeId tid = TypeId ("ns3::SameRoomPositionAllocator")
342 .SetGroupName ("Buildings")
343 .AddConstructor<SameRoomPositionAllocator> ();
344 return tid;
345}
346
347Vector
349{
350 NS_LOG_FUNCTION (this);
351 if (m_nodeIt == m_nodes.End ())
352 {
354 }
355
356 NS_ASSERT_MSG (m_nodeIt != m_nodes.End (), "no node in container");
357
358 NS_LOG_LOGIC ("considering node " << (*m_nodeIt)->GetId ());
359 Ptr<MobilityModel> mm = (*m_nodeIt)->GetObject<MobilityModel> ();
360 NS_ASSERT_MSG (mm, "no mobility model aggregated to this node");
362 NS_ASSERT_MSG (bmm, "MobilityBuildingInfo has not been aggregated to this node mobility model");
363
364 ++m_nodeIt;
365 uint32_t roomx = bmm->GetRoomNumberX ();
366 uint32_t roomy = bmm->GetRoomNumberY ();
367 uint32_t floor = bmm->GetFloorNumber ();
368 NS_LOG_LOGIC ("considering building " << bmm->GetBuilding ()->GetId () << " room (" << roomx << ", " << roomy << ", " << floor << ")");
369
370 Ptr<Building> b = bmm->GetBuilding ();
371 Ptr<RandomBoxPositionAllocator> pa = CreateObject<RandomBoxPositionAllocator> ();
372 BoxValue bv;
373 b->GetAttribute ("Boundaries", bv);
374 Box box = bv.Get ();
375 double rdx = (box.xMax - box.xMin) / b->GetNRoomsX ();
376 double rdy = (box.yMax - box.yMin) / b->GetNRoomsY ();
377 double rdz = (box.zMax - box.zMin) / b->GetNFloors ();
378 double x1 = box.xMin + rdx * (roomx - 1);
379 double x2 = box.xMin + rdx * roomx;
380 double y1 = box.yMin + rdy * (roomy -1);
381 double y2 = box.yMin + rdy * roomy;
382 double z1 = box.zMin + rdz * (floor - 1);
383 double z2 = box.zMin + rdz * floor;
384 NS_LOG_LOGIC ("randomly allocating position in "
385 << " (" << x1 << "," << x2 << ") "
386 << "x (" << y1 << "," << y2 << ") "
387 << "x (" << z1 << "," << z2 << ") ");
388
389 double x = m_rand->GetValue (x1, x2);
390 double y = m_rand->GetValue (y1, y2);
391 double z = m_rand->GetValue (z1, z2);
392
393 return Vector (x, y, z);
394}
395
396int64_t
398{
399 m_rand->SetStream (stream);
400 return 1;
401}
402
404
405
407 uint32_t x,
408 uint32_t y,
409 uint32_t z,
410 Ptr<Building> pbtr)
411{
412 m_rand = CreateObject<UniformRandomVariable> ();
413 roomx = x;
414 roomy = y;
415 floor = z;
416 bptr = pbtr;
417}
418
419TypeId
421{
422 static TypeId tid = TypeId ("ns3::FixedRoomPositionAllocator")
424 .SetGroupName ("Buildings")
425 .AddConstructor<SameRoomPositionAllocator> ();
426 return tid;
427}
428
429Vector
431{
432
433 NS_LOG_LOGIC ("considering building " << bptr->GetId () << " room (" << roomx << ", " << roomy << ", " << floor << ")");
434
435 Ptr<RandomBoxPositionAllocator> pa = CreateObject<RandomBoxPositionAllocator> ();
436
437 Box box = bptr->GetBoundaries ();
438 double rdx = (box.xMax - box.xMin) / bptr->GetNRoomsX ();
439 double rdy = (box.yMax - box.yMin) / bptr->GetNRoomsY ();
440 double rdz = (box.zMax - box.zMin) / bptr->GetNFloors ();
441 double x1 = box.xMin + rdx * (roomx - 1);
442 double x2 = box.xMin + rdx * roomx;
443 double y1 = box.yMin + rdy * (roomy -1);
444 double y2 = box.yMin + rdy * roomy;
445 double z1 = box.zMin + rdz * (floor - 1);
446 double z2 = box.zMin + rdz * floor;
447 NS_LOG_LOGIC ("randomly allocating position in "
448 << " (" << x1 << "," << x2 << ") "
449 << "x (" << y1 << "," << y2 << ") "
450 << "x (" << z1 << "," << z2 << ") ");
451
452 double x = m_rand->GetValue (x1, x2);
453 double y = m_rand->GetValue (y1, y2);
454 double z = m_rand->GetValue (z1, z2);
455 return Vector (x, y, z);
456}
457
458
459int64_t
461{
462 m_rand->SetStream (stream);
463 return 1;
464}
465
466} // namespace ns3
double f(double x, void *params)
Definition: 80211b.c:70
AttributeValue implementation for Boolean.
Definition: boolean.h:37
a 3d box
Definition: box.h:35
double yMax
The y coordinate of the top bound of the box.
Definition: box.h:116
double xMin
The x coordinate of the left bound of the box.
Definition: box.h:110
double yMin
The y coordinate of the bottom bound of the box.
Definition: box.h:114
double xMax
The x coordinate of the right bound of the box.
Definition: box.h:112
double zMin
The z coordinate of the down bound of the box.
Definition: box.h:118
double zMax
The z coordinate of the up bound of the box.
Definition: box.h:120
AttributeValue implementation for Box.
static Ptr< Building > GetBuilding(uint32_t n)
std::vector< Ptr< Building > >::const_iterator Iterator
Const Iterator.
Definition: building-list.h:40
static uint32_t GetNBuildings(void)
static Iterator End(void)
static Iterator Begin(void)
Generate a random position uniformly distributed in the volume of a chosen room inside a chosen build...
uint32_t floor
Index of the room on the z-axis (i.e., floor number)
uint32_t roomx
Index of the room on the x-axis.
uint32_t roomy
Index of the room on the y-axis.
Ptr< UniformRandomVariable > m_rand
Provides uniform random variables.
Ptr< Building > bptr
Pointer to the chosen building.
FixedRoomPositionAllocator(uint32_t x, uint32_t y, uint32_t z, Ptr< Building > b)
int64_t AssignStreams(int64_t)
Assign a fixed random variable stream number to the random variables used by this model.
static TypeId GetTypeId(void)
Get the type ID.
mobility buildings information (to be used by mobility models)
Keep track of the current position and velocity of an object.
keep track of a set of node pointers.
std::vector< Ptr< Node > >::const_iterator Iterator
Node container iterator.
Iterator Begin(void) const
Get an iterator which refers to the first Node in the container.
Iterator End(void) const
Get an iterator which indicates past-the-last Node in the container.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:470
void SetY(Ptr< RandomVariableStream > y)
Set the random variable stream object that generates y-positions.
uint32_t m_maxAttempts
maximum number of attempts before giving up
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void SetX(Ptr< RandomVariableStream > x)
Set the random variable stream object that generates x-positions.
Ptr< RandomVariableStream > m_x
pointer to x's random variable stream
Ptr< RandomVariableStream > m_z
pointer to z's random variable stream
Ptr< RandomVariableStream > m_y
pointer to y's random variable stream
void SetZ(Ptr< RandomVariableStream > z)
Set the random variable stream object that generates z-positions.
static TypeId GetTypeId(void)
Get the type ID.
Allocate a set of positions.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
Allocate each position by randomly choosing a building from the list of all buildings,...
static TypeId GetTypeId(void)
Get the type ID.
bool m_withReplacement
If true, the building will be randomly selected with replacement.
Ptr< UniformRandomVariable > m_rand
Provides uniform random variables.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
std::vector< Ptr< Building > > m_buildingListWithoutReplacement
List of building without replacement.
Allocate each position by randomly choosing a room from the list of all buildings,...
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
std::vector< RoomInfo > m_roomListWithoutReplacement
Container of rooms.
Ptr< UniformRandomVariable > m_rand
Provides uniform random variables.
static TypeId GetTypeId(void)
Get the type ID.
virtual double GetValue(void)=0
Get the next random value as a double drawn from the distribution.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Walks a given NodeContainer sequentially, and for each node allocate a new position randomly in the s...
int64_t AssignStreams(int64_t)
Assign a fixed random variable stream number to the random variables used by this model.
NodeContainer m_nodes
Nodes container.
Ptr< UniformRandomVariable > m_rand
Provides uniform random variables.
NodeContainer::Iterator m_nodeIt
Nodes iterator.
static TypeId GetTypeId(void)
Get the type ID.
Hold variables of type string.
Definition: string.h:41
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Hold an unsigned integer type.
Definition: uinteger.h:44
double GetValue(double min, double max)
Get the next random value, as a double in the specified range .
uint32_t GetInteger(uint32_t min, uint32_t max)
Get the next random value, as an unsigned integer in the specified range .
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:88
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Definition: boolean.h:85
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition: uinteger.h:45
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:289
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.
list x
Random number samples.