Source code for run_city_justice
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the Cortix toolkit environment
# https://cortix.org
'''
Crimninal justice network dynamics modeling.
This example uses 7 modules:
- Community
- Arrested
- Adjudication
- Jail
- Prison
- Probation
- Parole
and a population balance model is used to follow the offenders population
groups between modules.
To run this case using MPI you should compute the number of
processes as follows:
`nprocs = 7 + 1 cortix`
then issue the MPI run command as follows (replace `nprocs` with a number):
`mpiexec -n nprocs run_justice.py`
To run this case with the Python multiprocessing library, just run this file at the
command line as
`run_city_justice.py`
'''
import scipy.constants as const
import matplotlib.pyplot as plt
from cortix import Cortix
from cortix import Network
from cortix.examples.city_justice.prison import Prison
from cortix.examples.city_justice.parole import Parole
from cortix.examples.city_justice.adjudication import Adjudication
from cortix.examples.city_justice.jail import Jail
from cortix.examples.city_justice.arrested import Arrested
from cortix.examples.city_justice.probation import Probation
from cortix.examples.city_justice.community import Community
[docs]def main():
'''Cortix run file for a criminal justice network.
Attributes
----------
n_groups : int
Number of population groups being followed. This must be the same for all
modules.
end_time: float
End of the flow time in SI unit.
time_step: float
Size of the time step between port communications in SI unit.
use_mpi: bool
If set to `True` use MPI otherwise use Python multiprocessing.
'''
# Configuration Parameters
n_groups = 150 # number of population groups
end_time = 40 * const.day
time_step = 0.5 * const.day
use_mpi = False # True for MPI; False for Python multiprocessing
city = Cortix(use_mpi=use_mpi, splash=True)
city.network = Network()
community = Community(n_groups=n_groups, non_offender_adult_population=100,
offender_pool_size=0)
city.network.module(community)
community.end_time = end_time
community.time_step = time_step
community.show_time = (True,10*const.day)
community.save = True
prison = Prison(n_groups=n_groups,pool_size=0.0)
city.network.module(prison)
prison.end_time = end_time
prison.time_step = time_step
prison.save = True
parole = Parole(n_groups=n_groups)
city.network.module(parole)
parole.end_time = end_time
parole.time_step = time_step
parole.save = True
adjudication = Adjudication(n_groups=n_groups)
city.network.module(adjudication)
adjudication.end_time = end_time
adjudication.time_step = time_step
adjudication.save = True
jail = Jail(n_groups=n_groups)
city.network.module(jail)
jail.end_time = end_time
jail.time_step = time_step
jail.save = True
arrested = Arrested(n_groups=n_groups)
city.network.module(arrested)
arrested.end_time = end_time
arrested.time_step = time_step
arrested.save = True
probation = Probation(n_groups=n_groups)
city.network.module(probation)
probation.end_time = end_time
probation.time_step = time_step
probation.save = True
city.network.connect( prison, parole, 'bidirectional' )
city.network.connect( adjudication, prison )
city.network.connect( jail, prison )
city.network.connect( adjudication, jail )
city.network.connect( arrested, jail )
city.network.connect( arrested, adjudication )
city.network.connect( arrested, probation )
city.network.connect( probation, jail )
city.network.connect( adjudication, probation )
city.network.connect( arrested, community )
city.network.connect( jail, community )
city.network.connect( probation, community )
city.network.connect( adjudication, community )
city.network.connect( prison, community )
city.network.connect( parole, community )
city.network.draw()
city.run()
if city.use_multiprocessing or city.rank == 0:
total_num_unknowns = n_groups * len(city.network.modules)
total_num_params = 0
# Inspect Data Function
def inspect_module_data(module, quant_name):
population_phase = module.population_phase
(fxg_quant, time_unit) = population_phase.get_quantity_history(quant_name)
fxg_quant.plot( x_scaling=1/const.day, x_label='Time [day]',
y_label=fxg_quant.name+' ['+fxg_quant.unit+' %]')
# Number of parameters in the prison model
n_params = (len(population_phase.GetActors())-1)*n_groups
return n_params
quant_names = {'Prison':'fpg','Parole':'feg','Adjudication':'fag',
'Jail':'fjg','Arrested':'frg','Probation':'fbg','Community':'f0g'}
for m in city.network.modules:
quant_name = quant_names[m.name]
total_num_params += inspect_module_data(m,quant_name)
plt.grid()
plt.savefig(m.name+'.png', dpi=300)
if m.name=='Community':
inspect_module_data(m,'f0g_free')
plt.grid()
plt.savefig(m.name+'-free.png', dpi=300)
# Total number of unknowns and parameters
city.log.info('total number of unknowns ='+str(total_num_unknowns))
city.log.info('total number of parameters ='+str(total_num_params))
# Properly shutdow city
city.close()
if __name__ == '__main__':
main()