59 lines
1.4 KiB
Kotlin
59 lines
1.4 KiB
Kotlin
package drills.drill09.average
|
|
|
|
import util.network.epidemic.EpidemicNode
|
|
import util.network.epidemic.EpidemicPacket
|
|
import util.network.epidemic.replay.ReplayPacket
|
|
import util.network.simulator.Address
|
|
import util.network.simulator.Network
|
|
|
|
class AverageNode(
|
|
address: Address,
|
|
network: Network,
|
|
initialValue: Double,
|
|
bufferSize: Int = 1
|
|
) : EpidemicNode<Double, ReplayPacket<Double>>(address, network, initialValue, bufferSize) {
|
|
override fun receivePushOrReply(packet: ReplayPacket<Double>) {
|
|
val payload = packet.payload
|
|
|
|
if (packet.isReplay)
|
|
changeValue(payload)
|
|
else {
|
|
val newValue = (nodeValue + payload) / 2
|
|
|
|
changeValue(newValue)
|
|
|
|
send(
|
|
ReplayPacket(
|
|
address,
|
|
packet.senderAddress,
|
|
newValue,
|
|
EpidemicPacket.Type.PUSH,
|
|
true
|
|
)
|
|
)
|
|
|
|
sendPush()
|
|
}
|
|
}
|
|
|
|
override fun receivePull(packet: ReplayPacket<Double>) {
|
|
TODO("Not yet implemented")
|
|
}
|
|
|
|
override fun infect() {
|
|
Thread.interrupted()
|
|
}
|
|
|
|
override fun makeInfectionPacket(
|
|
receiverAddress: Address,
|
|
type: EpidemicPacket.Type
|
|
): EpidemicPacket<Double> {
|
|
return ReplayPacket(
|
|
address,
|
|
receiverAddress,
|
|
nodeValue,
|
|
type,
|
|
false
|
|
)
|
|
}
|
|
} |