Tuesday

OMNeT++ tictoc10.ned, txc10.cc Solution

TicToc10 Exercise Question:
You'll notice that this simple "routing" is not very efficient: often the packet keeps bouncing between two nodes for a while before it is sent to a different direction. This can be improved somewhat if nodes don't send the packet back to the sender. Implement this.
Hints: cMessage::getArrivalGate(), cGate::getIndex().
Note that if the message didn't arrive via a gate but was a self-message, then getArrivalGate() returns NULL.
Source: http://www.omnetpp.org/doc/omnetpp/tictoc-tutorial/part3.html

TicToc10 Solution:
void Txc10::forwardMessage(cMessage *msg)
{
    // In this example, we just pick a random gate (gate outs size) to send it on.
    // We draw a random number between 0 and the size of gate `out[]'.
    int n = gateSize("out");
    int k = intuniform(0,n-1);
     
    cGate *arrivalGate = msg->getArrivalGate();
    //int arrivalGateIndex = arrivalGate->getIndex(); // null pointer exception runtime error
                                          // because the first message sent by scheduleAt is a self-message
    
    if (arrivalGate == NULL) //self-message, do what?  
    {  
        // In this case, you may want to actually do something once the self
        // message "fires". Otherwise, as you've seen, the simulation ends there. 
        // In short, you could just send the self message.       
        EV << "Forwarding self message " << msg << " on port out[" << k << "]\n";
        send(msg, "out", k);         
    } 
    else if (arrivalGate != NULL)  // if it is not a self-message, get arrivalGateIndex
    {
        int arrivalGateIndex = arrivalGate->getIndex();
        
        if (n >= 2) //if out gates are more than 1, easy
                    //this line is needed to avoid infinite loop because you can send back to the sender
                    //if there is only one output gate
        {
            while (arrivalGateIndex == k)  
            {
                k = intuniform(0,n-1);
            }
        }
        
        EV << "Forwarding message " << msg << " on port out[" << k << "]\n";
        send(msg, "out", k); 
    } 
}

1 comment:

Unknown said...

Thanks

Measure execution time with Julia, example using sorting algorithms

# random integers between 1 and 100 inclusive, generate thousands of them x = rand ( 1 : 100 , 100000 ) @time sort (x; alg=InsertionSort, r...