NetDest.cc revision 6145:15cca6ab723a
1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30/* 31 * NetDest.C 32 * 33 * Description: See NetDest.h 34 * 35 * $Id$ 36 * 37 */ 38 39#include "NetDest.hh" 40#include "RubyConfig.hh" 41#include "Protocol.hh" 42 43NetDest::NetDest() 44{ 45 setSize(); 46} 47 48void NetDest::add(MachineID newElement) 49{ 50 m_bits[vecIndex(newElement)].add(bitIndex(newElement.num)); 51} 52 53void NetDest::addNetDest(const NetDest& netDest) 54{ 55 assert(m_bits.size() == netDest.getSize()); 56 for (int i = 0; i < m_bits.size(); i++) { 57 m_bits[i].addSet(netDest.m_bits[i]); 58 } 59} 60 61void NetDest::addRandom() 62{ 63 int i = random()%m_bits.size(); 64 m_bits[i].addRandom(); 65} 66 67void NetDest::setNetDest(MachineType machine, const Set& set) 68{ 69 // assure that there is only one set of destinations for this machine 70 assert(MachineType_base_level((MachineType)(machine+1)) - MachineType_base_level(machine) == 1); 71 m_bits[MachineType_base_level(machine)] = set; 72} 73 74void NetDest::remove(MachineID oldElement) 75{ 76 m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num)); 77} 78 79void NetDest::removeNetDest(const NetDest& netDest) 80{ 81 assert(m_bits.size() == netDest.getSize()); 82 for (int i = 0; i < m_bits.size(); i++) { 83 m_bits[i].removeSet(netDest.m_bits[i]); 84 85 } 86} 87 88void NetDest::clear() 89{ 90 for (int i = 0; i < m_bits.size(); i++) { 91 m_bits[i].clear(); 92 } 93} 94 95void NetDest::broadcast() 96{ 97 for (MachineType machine = MachineType_FIRST; machine < MachineType_NUM; ++machine) { 98 broadcast(machine); 99 } 100} 101 102void NetDest::broadcast(MachineType machineType) { 103 104 for (int i = 0; i < MachineType_base_count(machineType); i++) { 105 MachineID mach = {machineType, i}; 106 add(mach); 107 } 108} 109 110//For Princeton Network 111Vector<NodeID> NetDest::getAllDest() { 112 Vector<NodeID> dest; 113 dest.clear(); 114 for (int i=0; i<m_bits.size(); i++) { 115 for (int j=0; j<m_bits[i].getSize(); j++) { 116 if (m_bits[i].isElement(j)) { 117 dest.insertAtBottom((NodeID) (MachineType_base_number((MachineType) i) + j)); 118 } 119 } 120 } 121 return dest; 122} 123 124int NetDest::count() const 125{ 126 int counter = 0; 127 for (int i=0; i<m_bits.size(); i++) { 128 counter += m_bits[i].count(); 129 } 130 return counter; 131} 132 133NodeID NetDest::elementAt(MachineID index) { 134 return m_bits[vecIndex(index)].elementAt(bitIndex(index.num)); 135} 136 137NodeID NetDest::smallestElement() const 138{ 139 assert(count() > 0); 140 for (int i=0; i<m_bits.size(); i++) { 141 for (int j=0; j<m_bits[i].getSize(); j++) { 142 if (m_bits[i].isElement(j)) { 143 return j; 144 } 145 } 146 } 147 ERROR_MSG("No smallest element of an empty set."); 148} 149 150MachineID NetDest::smallestElement(MachineType machine) const 151{ 152 for (int j = 0; j < m_bits[MachineType_base_level(machine)].getSize(); j++) { 153 if (m_bits[MachineType_base_level(machine)].isElement(j)) { 154 MachineID mach = {machine, j}; 155 return mach; 156 } 157 } 158 159 ERROR_MSG("No smallest element of given MachineType."); 160} 161 162 163// Returns true iff all bits are set 164bool NetDest::isBroadcast() const 165{ 166 for (int i=0; i<m_bits.size(); i++) { 167 if (!m_bits[i].isBroadcast()) { 168 return false; 169 } 170 } 171 return true; 172} 173 174// Returns true iff no bits are set 175bool NetDest::isEmpty() const 176{ 177 for (int i=0; i<m_bits.size(); i++) { 178 if (!m_bits[i].isEmpty()) { 179 return false; 180 } 181 } 182 return true; 183} 184 185// returns the logical OR of "this" set and orNetDest 186NetDest NetDest::OR(const NetDest& orNetDest) const 187{ 188 assert(m_bits.size() == orNetDest.getSize()); 189 NetDest result; 190 for (int i=0; i<m_bits.size(); i++) { 191 result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]); 192 } 193 return result; 194} 195 196 197// returns the logical AND of "this" set and andNetDest 198NetDest NetDest::AND(const NetDest& andNetDest) const 199{ 200 assert(m_bits.size() == andNetDest.getSize()); 201 NetDest result; 202 for (int i=0; i<m_bits.size(); i++) { 203 result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]); 204 } 205 return result; 206} 207 208// Returns true if the intersection of the two sets is non-empty 209bool NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const 210{ 211 assert(m_bits.size() == other_netDest.getSize()); 212 for (int i=0; i<m_bits.size(); i++) { 213 if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) { 214 return true; 215 } 216 } 217 return false; 218} 219 220bool NetDest::isSuperset(const NetDest& test) const 221{ 222 assert(m_bits.size() == test.getSize()); 223 224 for (int i=0; i<m_bits.size(); i++) { 225 if (!m_bits[i].isSuperset(test.m_bits[i])) { 226 return false; 227 } 228 } 229 return true; 230} 231 232bool NetDest::isElement(MachineID element) const 233{ 234 return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num)); 235} 236 237void NetDest::setSize() 238{ 239 m_bits.setSize(MachineType_base_level(MachineType_NUM)); 240 assert(m_bits.size() == MachineType_NUM); 241 242 for (int i = 0; i < m_bits.size(); i++) { 243 m_bits[i].setSize(MachineType_base_count((MachineType)i)); 244 } 245} 246 247void NetDest::print(ostream& out) const 248{ 249 out << "[NetDest (" << m_bits.size() << ") "; 250 251 for (int i=0; i<m_bits.size(); i++) { 252 for (int j=0; j<m_bits[i].getSize(); j++) { 253 out << (bool) m_bits[i].isElement(j) << " "; 254 } 255 out << " - "; 256 } 257 out << "]"; 258} 259 260