package drills.drill09.gossip import util.network.epidemic.EpidemicNode import util.network.epidemic.packet.EpidemicPacket import util.network.epidemic.packet.FeedbackEpidemicPacket import util.network.simulator.Address import util.network.simulator.Network import kotlin.random.Random class QueryNode( address: Address, network: Network, initialValue: T, private val demotivatingFactor: Int = 10, bufferSize: Int = 1 ) : EpidemicNode>( address, network, initialValue, bufferSize ) { private var queryValue: T = nodeValue private var random = Random(System.currentTimeMillis()) override fun makeInfectionPacket( receiverAddress: Address, type: EpidemicPacket.Type ): EpidemicPacket { return FeedbackEpidemicPacket( address, receiverAddress, queryValue, type, false ) } override fun receivePushOrReply(packet: FeedbackEpidemicPacket) { when (nodeState) { State.REMOVED -> return State.INFECTED -> whenInfected(packet) State.SUSCEPTIBLE -> whenSusceptible(packet) } } private fun whenSusceptible(packet: FeedbackEpidemicPacket) { nodeState = State.INFECTED queryValue = packet.payload sendPushToRandom(2) if (packet.payload == nodeValue) println("find ${packet.payload} on node $address") } private fun whenInfected(packet: FeedbackEpidemicPacket) { if (!packet.isFeedback) send( FeedbackEpidemicPacket( address, packet.senderAddress, queryValue, EpidemicPacket.Type.PUSH, true ) ) if (packet.isFeedback && random.nextDouble(1.0) < 1 / demotivatingFactor) nodeState = State.REMOVED } override fun receivePull(packet: FeedbackEpidemicPacket) { TODO("Not yet implemented") } override fun infect() { Thread.interrupted() } }