![]() |
User Manual, Developers Guide and API Documentation |
![]() |
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
1.5.5