![]() |
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/grouper/TrivialGrouper.hpp> 00029 #include <WNS/scheduler/SchedulerTypes.hpp> 00030 00031 using namespace wns::scheduler; 00032 using namespace wns::scheduler::grouper; 00033 00034 00035 STATIC_FACTORY_REGISTER_WITH_CREATOR(TrivialGrouper, GroupingProviderInterface, "TrivialGrouper", wns::PyConfigViewCreator); 00036 00037 TrivialGrouper::TrivialGrouper(const wns::pyconfig::View& config) 00038 : SpatialGrouper(config) 00039 { 00040 00041 } 00042 00043 Grouping 00044 TrivialGrouper::getTxGrouping(const UserSet activeUsers, int /* maxBeams */) { 00045 00046 assure(dynamic_cast<wns::service::phy::ofdma::DataTransmission*>(friends.ofdmaProvider), 00047 "Grouper needs an OFDMA Provider"); 00048 00049 Grouping grouping; 00050 grouping.groups.clear(); 00051 int n = 0; 00052 00053 if(beamforming){ 00054 00055 for (UserSet::iterator iter = activeUsers.begin(); 00056 iter != activeUsers.end(); 00057 ++iter) { 00058 UserID user = *iter; 00059 assure(user.isValid(), "No valid user"); 00060 00061 // make the one-user map for the SINR calculation 00062 std::map<wns::node::Interface*, wns::Power> map; 00063 map[user.getNode()] = colleagues.registry->estimateTxSINRAt(user).interference; 00064 00065 grouping.groups.push_back(convertMap(friends.ofdmaProvider->calculateCandIsTx(map, x_friendliness, txPower))); 00066 grouping.userGroupNumber[user] = n; 00067 00068 std::vector<wns::node::Interface*> undesireds; 00069 undesireds.clear(); 00070 grouping.patterns[user] = friends.ofdmaProvider->calculateAndSetBeam(user.getNode(), undesireds, x_friendliness); 00071 assure(grouping.patterns[user] != wns::service::phy::ofdma::PatternPtr(), "Invalid pattern returned"); 00072 n++; 00073 } 00074 } 00075 else{ // no beamforming 00076 00077 for (UserSet::iterator iter = activeUsers.begin(); 00078 iter != activeUsers.end(); 00079 ++iter) { 00080 UserID user = *iter; 00081 assure(user.isValid(), "No valid user"); 00082 00083 std::map<UserID, wns::CandI> candis; 00084 wns::scheduler::ChannelQualityOnOneSubChannel cqi = 00085 colleagues.registry->estimateTxSINRAt(user); 00086 candis[user] = wns::CandI(cqi.carrier, cqi.interference); 00087 grouping.groups.push_back(candis); 00088 grouping.userGroupNumber[user] = n; 00089 grouping.patterns[user] = wns::service::phy::ofdma::PatternPtr(); 00090 n++; 00091 } 00092 } 00093 return grouping; 00094 } 00095 00096 Grouping TrivialGrouper::getRxGrouping(const UserSet activeUsers , int /* maxBeams */) { 00097 00098 assure(dynamic_cast<wns::service::phy::ofdma::DataTransmission*>(friends.ofdmaProvider), 00099 "Grouper needs an OFDMA Provider"); 00100 00101 Grouping grouping; 00102 grouping.groups.clear(); 00103 int n = 0; 00104 00105 if(beamforming){ 00106 00107 for (UserSet::iterator iter = activeUsers.begin(); 00108 iter != activeUsers.end(); 00109 ++iter) { 00110 UserID user = *iter; 00111 assure(user.isValid(), "No valid user"); 00112 00113 // make the one-user vector for the SINR calculation 00114 std::vector<wns::node::Interface*> combination; 00115 combination.clear(); 00116 combination.push_back(user.getNode()); 00117 00118 grouping.groups.push_back( 00119 convertMap(friends.ofdmaProvider->calculateCandIsRx(combination, 00120 colleagues.registry->estimateRxSINROf(user).interference))); 00121 grouping.userGroupNumber[user] = n; 00122 00123 std::vector<wns::node::Interface*> undesireds; 00124 undesireds.clear(); 00125 grouping.patterns[user] = friends.ofdmaProvider->calculateAndSetBeam(user.getNode(), undesireds, colleagues.registry->estimateRxSINROf(user).interference); 00126 assure(grouping.patterns[user] != wns::service::phy::ofdma::PatternPtr(), "Invalid pattern returned"); 00127 n++; 00128 } 00129 } 00130 else{ // no beamforming 00131 00132 for (UserSet::iterator iter = activeUsers.begin(); 00133 iter != activeUsers.end(); 00134 ++iter) { 00135 UserID user = *iter; 00136 assure(user.isValid(), "No valid user"); 00137 00138 std::map<UserID, wns::CandI> candis; 00139 wns::scheduler::ChannelQualityOnOneSubChannel cqi = 00140 colleagues.registry->estimateRxSINROf(user); 00141 candis[user] = wns::CandI(cqi.carrier, cqi.interference); 00142 grouping.groups.push_back(candis); 00143 grouping.userGroupNumber[user] = n; 00144 grouping.patterns[user] = wns::service::phy::ofdma::PatternPtr(); 00145 n++; 00146 } 00147 } 00148 return grouping; 00149 } 00150 00151 00152
1.5.5