User Manual, Developers Guide and API Documentation

HighCwithHighI.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2009
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 #include <WNS/scheduler/strategy/dsastrategy/HighCwithHighI.hpp>
00029 #include <WNS/scheduler/SchedulerTypes.hpp>
00030 #include <WNS/Positionable.hpp>
00031 #include <WNS/PowerRatio.hpp>
00032 //#include <utility>
00033 
00034 using namespace wns::scheduler;
00035 using namespace wns::scheduler::strategy;
00036 using namespace wns::scheduler::strategy::dsastrategy;
00037 
00038 STATIC_FACTORY_REGISTER_WITH_CREATOR(HighCwithHighI,
00039                                      DSAStrategyInterface,
00040                                      "HighCwithHighI",
00041                                      wns::PyConfigViewCreator);
00042 
00043 HighCwithHighI::HighCwithHighI(const wns::pyconfig::View& config)
00044     : DSAStrategy(config)
00045 {
00046 
00047 }
00048 
00049 HighCwithHighI::~HighCwithHighI()
00050 {
00051 
00052 }
00053 
00054 // call this before each timeSlot/frame
00055 void
00056 HighCwithHighI::initialize(SchedulerStatePtr schedulerState,
00057                          SchedulingMapPtr schedulingMap)
00058 {
00059     DSAStrategy::initialize(schedulerState,schedulingMap); // must always initialize base class too
00060 
00061     int maxSubChannel = schedulerState->currentState->strategyInput->getFChannels();
00062     int numberOfTimeSlots = schedulerState->currentState->strategyInput->getNumberOfTimeSlots();
00063     int maxSpatialLayers = schedulerState->currentState->strategyInput->getMaxSpatialLayers();
00064 
00065     int prio = schedulerState->currentState->getCurrentPriority();
00066     wns::scheduler::ConnectionSet conns = colleagues.registry->getConnectionsForPriority(prio);
00067 
00068     // store users in userIDs from type std::set
00069     std::set<wns::scheduler::UserID> userIDs;
00070 
00071     wns::scheduler::ConnectionSet::iterator connsSetIt;
00072     for(connsSetIt = conns.begin(); connsSetIt != conns.end(); connsSetIt++)
00073         userIDs.insert(colleagues.registry->getUserForCID(*connsSetIt));
00074 
00075     unsigned int numberOfUsers = userIDs.size();
00076     unsigned int numberOfResources = maxSubChannel * numberOfTimeSlots * maxSpatialLayers;
00077 
00078     MESSAGE_SINGLE(NORMAL, logger, "getSubChannelWithDSA: Distributing " 
00079         << numberOfUsers << " users on " << numberOfResources << " resources.");
00080 
00081     if(numberOfUsers == 0)
00082         return;
00083 
00084     int usersMore = numberOfResources % numberOfUsers;
00085     int usersLess = numberOfUsers - usersMore;
00086     int resourcesMore = int(numberOfResources / numberOfUsers) + 1;
00087     int resourcesLess = int(numberOfResources / numberOfUsers);
00088 
00089     MESSAGE_SINGLE(NORMAL, logger, "getSubChannelWithDSA: " 
00090         << usersLess << " users get " << resourcesLess << " resources, "
00091         << usersMore << " users get " << resourcesMore << " resources");
00092 
00093     assure(resourcesLess > 0, "Not enough resources for all users");
00094     assure(usersMore * resourcesMore + usersLess * resourcesLess == numberOfResources,
00095         "Mismatched resource distribution");
00096 
00097     // store carriers per each user in carrierMultimap<carrier, UserID>
00098     std::multimap<wns::Power, unsigned int> carrierMultimap;
00099     wns::Power tmpCarrier;
00100 
00101     std::set<wns::scheduler::UserID>::iterator userIdIt;
00102     for(userIdIt = userIDs.begin(); userIdIt != userIDs.end(); userIdIt++)
00103     {
00104         tmpCarrier = colleagues.registry->estimateTxSINRAt(*userIdIt).carrier;
00105         carrierMultimap.insert(std::pair<wns::Power, unsigned int>(tmpCarrier, (*userIdIt).getNodeID()));
00106     }
00107 
00109 //  std::multimap<wns::Power, unsigned int>::iterator carrierMultimapItt;
00110 //  for(carrierMultimapItt = carrierMultimap.begin(); carrierMultimapItt != carrierMultimap.end(); carrierMultimapItt++)
00111 //  {
00112 //      std::cout << "DEBUGGG: User: " << carrierMultimapItt->second << " Signalstaerke: " << carrierMultimapItt->first << "\n";
00113 //  }
00115 
00116     // store sorted resources in sortedResourcesSet<DSAResult, FreqFirst>
00117     std::set<DSAResult, FreqFirst> sortedResourcesSet;
00118     DSAResult res;
00119     for(int i = 0; i < maxSubChannel; i++)
00120     {
00121         for(int j = 0; j < numberOfTimeSlots; j++)
00122         {
00123             for(int k = 0; k < maxSpatialLayers; k++)
00124             {
00125 //              DSAResult res;
00126                 res.subChannel = i;
00127                 res.timeSlot = j;
00128                 res.spatialLayer = k;
00129                 sortedResourcesSet.insert(res);
00130             }
00131         } 
00132     }
00133 
00134     // store interference per each Slot in interferenceMultimap<interference, SlotNr>
00135     std::multimap<wns::Power, DSAResult> interferenceMultimap;
00136     wns::Power tmpInterference;
00137     DSAResult tmpDSAResult;
00138 
00139     std::set<DSAResult, FreqFirst>::iterator sortedResourcesSetIt;
00140     for(sortedResourcesSetIt = sortedResourcesSet.begin(); sortedResourcesSetIt != sortedResourcesSet.end(); sortedResourcesSetIt++)
00141     {
00142 //      DSAResult tmpDSAResult = *sortedResourcesSetIt;
00143         tmpDSAResult = *sortedResourcesSetIt;
00144         tmpInterference = colleagues.registry->estimateTxSINRAt(schedulerState->myUserID, tmpDSAResult.timeSlot).interference;
00145         interferenceMultimap.insert(std::pair<wns::Power, DSAResult>(tmpInterference, tmpDSAResult));
00146     }
00147 
00149 //  std::multimap<wns::Power, DSAResult>::iterator interferenceMultimapItt;
00150 //  for(interferenceMultimapItt = interferenceMultimap.begin(); interferenceMultimapItt != interferenceMultimap.end(); interferenceMultimapItt++)
00151 //  {
00152 //      std::cout << "DEBUGGG: Slot: " << interferenceMultimapItt->second.timeSlot << " Interferenz: " << interferenceMultimapItt->first << "\n";
00153 //  }
00155 
00156     int counter = 0;
00157     int user = 0;
00158     int resourcesPerUser = resourcesLess;
00159 
00160     DSAResult tmpResource;
00161     std::vector<DSAResult> tmpDSAResultVector;
00162 //  tmpDSAResultVector.reserve(resourcesPerUser); // Vectorgroesse festlegen
00163 
00164     std::multimap<wns::Power, unsigned int>::iterator carrierMultimapIt;
00165     carrierMultimapIt = carrierMultimap.begin();
00166 
00167     std::multimap<wns::Power, DSAResult>::iterator interferenceMultimapIt;
00168     for(interferenceMultimapIt = interferenceMultimap.begin(); interferenceMultimapIt != interferenceMultimap.end(); interferenceMultimapIt++)
00169     {
00170         tmpResource.subChannel = interferenceMultimapIt->second.subChannel;
00171         tmpResource.timeSlot = interferenceMultimapIt->second.timeSlot;
00172         tmpResource.spatialLayer = interferenceMultimapIt->second.spatialLayer;
00173         tmpDSAResultVector.push_back(tmpResource);
00174 
00175         counter++;
00176 
00177         if(counter == resourcesPerUser)
00178         {
00179             usersResources_[carrierMultimapIt->second] = tmpDSAResultVector; 
00180             carrierMultimapIt++;
00181             tmpDSAResultVector.clear();
00182             user++;
00183             counter = 0;
00184         }
00185 
00186         if(user == usersLess)
00187         {
00188             resourcesPerUser = resourcesMore;
00189 //          tmpDSAResultVector.reserve(resourcesPerUser); // Vectorgroesse festlegen
00190         }
00191 
00192     }
00193 
00195 //  std::map<unsigned int, std::vector<DSAResult> >::iterator usersResourcesMapItt;
00196 //  for(usersResourcesMapItt = usersResources_.begin(); usersResourcesMapItt != usersResources_.end(); usersResourcesMapItt++)
00197 //  {
00198 //      std::cout << "DEBUGGG: User: " << usersResourcesMapItt->first
00199 //      << " bekommt folgende Slots: " << "\n";
00200 //
00201 //      std::vector<DSAResult>::iterator DSAResultVectorItt;
00202 //      for(DSAResultVectorItt = usersResourcesMapItt->second.begin(); DSAResultVectorItt != usersResourcesMapItt->second.end(); DSAResultVectorItt++)
00203 //      {
00204 //          std::cout << DSAResultVectorItt->timeSlot << " DEBUGGG" << "\n";
00205 //      } 
00206 //  }
00208 
00210 //  // request.user <-----> *userIdIt = User = UT8
00211 //  std::set<wns::scheduler::UserID>::iterator userIdIt;
00212 //  for(userIdIt = userIDs.begin(); userIdIt != userIDs.end(); userIdIt++)
00213 //  {
00214 //      std::cout << "DEBUGGG: " 
00215 //      << " UserID: " << (*userIdIt).getNodeID() 
00216 //      << " Carrier: " << colleagues.registry->estimateTxSINRAt(*userIdIt).carrier 
00217 //      << " Interferenz: " << colleagues.registry->estimateTxSINRAt(*userIdIt).interference 
00218 //      << " Pathloss: " << colleagues.registry->estimateTxSINRAt(*userIdIt).pathloss << "\n";
00219 //  }
00221 
00222 } //initialize
00223 
00224 DSAResult
00225 HighCwithHighI::getSubChannelWithDSA(RequestForResource& request,
00226                                    SchedulerStatePtr schedulerState,
00227                                    SchedulingMapPtr schedulingMap)
00228 {
00229 //  DSAResult dsaResult;
00230     MESSAGE_SINGLE(NORMAL, logger, "getSubChannelWithDSA(" << request.toString()<<")");
00231 
00232     assure(usersResources_.find(request.user.getNodeID()) != usersResources_.end(), "No resources for user " + request.user.getNodeID());
00233 
00234     std::vector<DSAResult>::iterator dsaResultVectortIt;
00235 
00236     bool found = false;
00237     for(dsaResultVectortIt = usersResources_[request.user.getNodeID()].begin();
00238         dsaResultVectortIt != usersResources_[request.user.getNodeID()].end() && !found; 
00239         dsaResultVectortIt++)
00240     {
00241         found = channelIsUsable(dsaResultVectortIt->subChannel, dsaResultVectortIt->timeSlot, dsaResultVectortIt->spatialLayer,
00242                                 request, schedulerState, schedulingMap);
00243     }
00244 
00245     if(!found)
00246     {
00247         MESSAGE_SINGLE(NORMAL, logger, "getSubChannelWithDSA(): no free subchannel");
00248         DSAResult dsaResult;
00249         return dsaResult;
00250     }
00251 
00252     else
00253     {
00254         dsaResultVectortIt--;
00255         MESSAGE_SINGLE(NORMAL, logger, "getSubChannelWithDSA(): Granting resource: "
00256             << dsaResultVectortIt->subChannel << "." << dsaResultVectortIt->timeSlot << "." 
00257             << dsaResultVectortIt->spatialLayer << " to User: " << request.user.getNodeID());// << request.toString());
00258         return *dsaResultVectortIt;
00259     }
00260 } // getSubChannelWithDSA
00261 

Generated on Thu May 24 03:31:50 2012 for openWNS by  doxygen 1.5.5