コード例 #1
0
ファイル: analyzer.py プロジェクト: felix8/Base
def analyzePacket(simulation_time, incoming_packet, threshold, user_list, users, encounters):
    source = incoming_packet[0]
    destination = incoming_packet[1]
    asker = incoming_packet[2]
    expert = incoming_packet[3]
    ttl = incoming_packet[4]
    question = incoming_packet[5]
    answer = incoming_packet[6]
    tags = incoming_packet[7]
    confidence = incoming_packet[8]
    
    ev_asker = incoming_packet[9]
    ev_expert = incoming_packet[10]
    
    this_user = user_list[users.index(destination)]
    
    if ttl < 1:
        # drop packet if it has expired
        this_user.remove_from_buffer(incoming_packet)
        if answer == 0:
            msg = question
        else:
            msg = answer
        return (-1, -1, msg)
    
    if this_user.user_id == asker:
        # dynamic tagging initiation phase
        if trust.enough_confidence(confidence, threshold) == 1:
            # if participating users are confident of expert
            # send expert's response (answer) offline to
            # storage where it will be clustered along
            # other expert responses and displayed on
            # user's screen asynchronously (not in simulation)
            this_user.add_expert_to_response(expert, ev_expert, question, answer)
            if answer == 0:
                msg = question
            else:
                msg = answer
            # drop packet
        this_user.remove_from_buffer(incoming_packet)
        if answer == 0:
            msg = question
        else:
            msg = answer
        return (source, destination, msg)

    if expert == 0:
        # broadcast message: looking for experts!
        # query creation and forwarding phase
        
        owner_response = ui.display_user(this_user, tags, question)
        # owner_response: {yes/no, {{tag, location}...}, answer, ev_thisNode}
        if  owner_response[0] == 1:
            # current node's device owner 
            # identifies him/herself as an expert
            
            # send packet containing expert response to nbrs
            response = 0
            for encounter in encounters:
                if encounter[1] not in users:
                    continue
                if encounter[2] == simulation_time:
                    if encounter[0] == this_user.user_id:
                        response = response + 1
                        # send response to nbr
                        this_packet = (this_user.user_id, encounter[1], asker, this_user.user_id,\
                                       out_ttl, question, owner_response[2],\
                                       owner_response[1],\
                                       [0 for i in range(len(owner_response[1]))],\
                                       ev_asker,\
                                       owner_response[3])
                        user_list[users.index(encounter[1])].\
                        add_to_buffer(this_packet)
            if response > response_threshold:
                this_user.remove_from_buffer(incoming_packet)
            # keep message in buffer
            if answer == 0:
                msg = question
            else:
                msg = answer
            return (source, destination, msg)
        else:
            # no response from owner just forward packet
            response = 0
            # epidemic flooding
            for encounter in encounters:
                if encounter[1] not in users:
                    continue
                if encounter[2] == simulation_time:
                    if encounter[0] == this_user.user_id:
                        response = response + 1
                        this_packet = (this_user.user_id, encounter[1], asker, expert,\
                                       ttl-1, question, answer, tags,\
                                       confidence, ev_asker, [])
                        user_list[users.index(encounter[1])].\
                        add_to_buffer(this_packet)
            if response > response_threshold:
                this_user.remove_from_buffer(incoming_packet)
            
            if answer == 0:
                msg = question
            else:
                msg = answer
            return (source, destination, msg)
    else:
        # expert identification phase
        # message is being sent by self-identified
        # ...expert to asker
        
        if this_user.user_id == expert:
            this_user.remove_from_buffer(incoming_packet)
            if answer == 0:
                msg = question
            else:
                msg = answer
            return (-1, -1, msg)
        else:
            
            # scoped routing/gradient descent:

            if trust.enough_confidence(confidence, threshold) == 1:
                # enough confidence votes (negative/positive)
                # have been obtained. Send packet to users who mobility
                # matches Asker
                
                # confidence is high but drop packet current user is not similar
                # to asker
                          
                if this_user.is_similar(ev_asker, threshold) == 0:
                    # asker is not similar to me
                    # drop packet
                    this_user.remove_from_buffer(incoming_packet)
                    color = 'red'
                    return (source, destination, color)               
                response = 0
                for encounter in encounters:
                    if encounter[1] not in users:
                        continue
                    if encounter[2] == simulation_time:
                        if encounter[0] == this_user.user_id:
                            response = response + 1
                            this_packet = (this_user.user_id, encounter[1], asker, expert,\
                                           ttl-1, question, answer, tags,\
                                           confidence, ev_asker, ev_expert)
                            user_list[users.index(encounter[1])].\
                            add_to_buffer(this_packet)
                if response > response_threshold:
                    this_user.remove_from_buffer(incoming_packet)
            
            elif trust.enough_confidence(confidence, threshold) == -1:
                # bad response
                # drop packet
                this_user.remove_from_buffer(incoming_packet)
            else:
                # need to forward the packet to users whose mobility
                # matches expert to obtain more votes 
                for i in range(len(tags)):
                    seen_before = this_user.has_seen(expert, tags[i], threshold)
                    if  seen_before == 1:
                        # this node visits tag,location frequently
                        # ...and has seen expert
                        confidence[i] = confidence[i] + 1
                    elif seen_before == -1:
                        # this node visits tag,location frequently
                        # ...and has NOT seen expert
                        confidence[i] = confidence[i] - 1
                
                response = 0
                for encounter in encounters:
                    if encounter[1] not in users:
                        continue
                    if encounter[2] == simulation_time:
                        if encounter[0] == this_user.user_id:
                            response = response + 1
                            this_packet = (this_user.user_id, encounter[1], asker, expert,\
                                           ttl-1, question, answer, tags,\
                                           confidence, ev_asker, [])
                            user_list[users.index(encounter[1])].\
                            add_to_buffer(this_packet)
                if response > response_threshold:
                    this_user.remove_from_buffer(incoming_packet)
            if answer == 0:
                msg = question
            else:
                msg = answer
            return (source, destination, msg)
コード例 #2
0
ファイル: simulation.py プロジェクト: felix8/Base
#        if len(user.answer_folder) > 0:
#            print user.answer_folder
#        print "\n"

    o.write("nx.draw_random(G)\n")
    o.write("plt.savefig('path_"+str(time_unit)+".png')")
o.close()

for user in user_list:
    print user.user_id, str(len(user.input_msg_buffer))

print "\n\nQuestion asked: '" + question_tag[0] + "' by Asker: " + str(asker)
if len(user_list[users.index(asker)].answer_folder) > 0:
    print 'Simulation successful.'
    for msg in user_list[users.index(asker)].answer_folder: 
        print "Answer: '" + msg[2] + "' by Expert: " + str(msg[0])
else:
    bad_replies = []
    if len(user_list[users.index(asker)].input_msg_buffer) > 0:
        for msg in  user_list[users.index(asker)].input_msg_buffer:
            if msg[3] != 0:
                if trust.enough_confidence(msg[8], 0) != 1:
                    # format: <expert_id, confidence, answer>
                    bad_replies.append((msg[3],msg[8],msg[6]))
    if len(bad_replies) > 0:
        print 'Received bad responses such as: Expert: '+\
        str(bad_replies[0][0])+' Confidence Score: '+\
        ' '.join([str(reply) for reply in bad_replies[0][1]])+' Answer: '+bad_replies[0][2]
    else:
        print 'No bad responses'