Fish factoryΒΆ

SimPype features used in this example: Random variables, Resource inline customization, Message next, Log custom message properties.

The scenario of the simulation is a food factory processing fish:

                        /-> |Dry|
                       /
|Fish| -> |Selector| -+---> |Can|
                       \
                        \-> |Grill|

There are three species of fish arriving at the factory: cod, tuna, and calamari. These species need first to be sperated and process accordingly. Cod will be dried, tuna will be cut in chunks and put in a can, calamari will be grilled.

import simpype
import random


# [Mandatory] Create a SimPype simulation object
sim = simpype.Simulation(id = 'fish')
# [Optional] Fix the seed used by the pseudo-random generator
sim.seed = 42
# [Optional] Configure the log directory. 
# [Default] Log are store by default in the 'current working directory/log'
sim.log.dir = 'log'
# [Optional] Disable the logging to file and print to console instead
#sim.log.file = False
#sim.log.print = True
# [Optional] Log custom message properties
sim.log.property('species')
# [Mandatory] Add at least one generator to the simulation
fish = sim.add_generator(id = 'fish')
# [Mandatory] Assign an arrival time
fish.random['arrival'] = {
	0: lambda: random.expovariate(1.0 / 0.1)
}
fish.message.property['species'] = {
	0: lambda: random.choice(['cod', 'tuna', 'calamari'])
}


# [Mandatory] Add at least one resource to the simulation
dry = sim.add_resource(id = 'dry')
dry.random['service'] = {
	0: lambda: 60
}

# Add an additional resource
can = sim.add_resource(id = 'can')
can.random['service'] = {
	0: lambda: random.expovariate(1.0 / 20)
}

# Add an additional resource
grill = sim.add_resource(id = 'grill')
grill.random['service'] = {
	0: lambda: random.expovariate(1.0 / 60)
}

# Add an additional resource
selector = sim.add_resource(id = 'selector')
@simpype.resource.service(selector)
def selector_service(self, message):
	if message.property['species'].value == 'cod':
		message.next = dry
	elif message.property['species'].value == 'tuna':
		message.next = can
	elif message.property['species'].value == 'calamari':
		message.next = grill


# [Mandatory] Add a pipeline connecting the generator and the resource
p0 = sim.add_pipeline(fish, selector)
p1 = sim.add_pipeline(selector, can)
p2 = sim.add_pipeline(selector, grill)
pM = sim.merge_pipeline(p0, p1, p2)

# [Mandatory] Run the simulation e.g. until t=2
sim.run(until = 2)

sim.cfg stored under the log folder contains:

Simulation Seed: 42
Simulation Time: 2.000000000
Execution Time: 0.014687043

sim.log stored under the log folder contains:

timestamp,message,seq_num,resource,event,species
0.133359267,fish,0,selector,pipe.in,calamari
0.133359267,fish,0,selector,pipe.out,calamari
0.133359267,fish,0,selector,resource.serve,calamari
0.133359267,fish,0,grill,pipe.in,calamari
0.133359267,fish,0,grill,pipe.out,calamari
0.268323787,fish,1,selector,pipe.in,calamari
0.268323787,fish,1,selector,pipe.out,calamari
0.268323787,fish,1,selector,resource.serve,calamari
0.268323787,fish,1,grill,pipe.in,calamari
0.323128403,fish,2,selector,pipe.in,cod
0.323128403,fish,2,selector,pipe.out,cod
0.323128403,fish,2,selector,resource.serve,cod
0.323128403,fish,2,dry,pipe.in,cod
0.323128403,fish,2,dry,pipe.out,cod
0.332966368,fish,3,selector,pipe.in,cod
0.332966368,fish,3,selector,pipe.out,cod
0.332966368,fish,3,selector,resource.serve,cod
0.332966368,fish,3,dry,pipe.in,cod
0.403357921,fish,4,selector,pipe.in,cod
0.403357921,fish,4,selector,pipe.out,cod
0.403357921,fish,4,selector,resource.serve,cod
0.403357921,fish,4,dry,pipe.in,cod
0.485739346,fish,5,selector,pipe.in,calamari
0.485739346,fish,5,selector,pipe.out,calamari
0.485739346,fish,5,selector,resource.serve,calamari
0.485739346,fish,5,grill,pipe.in,calamari
0.590688546,fish,6,selector,pipe.in,calamari
0.590688546,fish,6,selector,pipe.out,calamari
0.590688546,fish,6,selector,resource.serve,calamari
0.590688546,fish,6,grill,pipe.in,calamari
0.645078509,fish,7,selector,pipe.in,tuna
0.645078509,fish,7,selector,pipe.out,tuna
0.645078509,fish,7,selector,resource.serve,tuna
0.645078509,fish,7,can,pipe.in,tuna
0.645078509,fish,7,can,pipe.out,tuna
0.734059379,fish,8,selector,pipe.in,cod
0.734059379,fish,8,selector,pipe.out,cod
0.734059379,fish,8,selector,resource.serve,cod
0.734059379,fish,8,dry,pipe.in,cod
0.876275315,fish,9,selector,pipe.in,cod
0.876275315,fish,9,selector,pipe.out,cod
0.876275315,fish,9,selector,resource.serve,cod
0.876275315,fish,9,dry,pipe.in,cod
0.996054309,fish,10,selector,pipe.in,tuna
0.996054309,fish,10,selector,pipe.out,tuna
0.996054309,fish,10,selector,resource.serve,tuna
0.996054309,fish,10,can,pipe.in,tuna
1.028609505,fish,11,selector,pipe.in,cod
1.028609505,fish,11,selector,pipe.out,cod
1.028609505,fish,11,selector,resource.serve,cod
1.028609505,fish,11,dry,pipe.in,cod
1.343761770,fish,12,selector,pipe.in,tuna
1.343761770,fish,12,selector,pipe.out,tuna
1.343761770,fish,12,selector,resource.serve,tuna
1.343761770,fish,12,can,pipe.in,tuna
1.354543710,fish,13,selector,pipe.in,tuna
1.354543710,fish,13,selector,pipe.out,tuna
1.354543710,fish,13,selector,resource.serve,tuna
1.354543710,fish,13,can,pipe.in,tuna
1.364715578,fish,14,selector,pipe.in,tuna
1.364715578,fish,14,selector,pipe.out,tuna
1.364715578,fish,14,selector,resource.serve,tuna
1.364715578,fish,14,can,pipe.in,tuna
1.457280525,fish,15,selector,pipe.in,cod
1.457280525,fish,15,selector,pipe.out,cod
1.457280525,fish,15,selector,resource.serve,cod
1.457280525,fish,15,dry,pipe.in,cod
1.588114568,fish,16,selector,pipe.in,calamari
1.588114568,fish,16,selector,pipe.out,calamari
1.588114568,fish,16,selector,resource.serve,calamari
1.588114568,fish,16,grill,pipe.in,calamari
1.601447842,fish,17,selector,pipe.in,tuna
1.601447842,fish,17,selector,pipe.out,tuna
1.601447842,fish,17,selector,resource.serve,tuna
1.601447842,fish,17,can,pipe.in,tuna
1.609655675,fish,18,selector,pipe.in,tuna
1.609655675,fish,18,selector,pipe.out,tuna
1.609655675,fish,18,selector,resource.serve,tuna
1.609655675,fish,18,can,pipe.in,tuna
1.786501773,fish,19,selector,pipe.in,calamari
1.786501773,fish,19,selector,pipe.out,calamari
1.786501773,fish,19,selector,resource.serve,calamari
1.786501773,fish,19,grill,pipe.in,calamari