def __init__(self, generateFunc, Yesterday):
        self.df = generateFunc[0]
        self.stateOfDay = generateFunc[1]
        self.MoversList = generateFunc[2]
        self.YesterdayPatients = Yesterday
        s = States()
        self.deathRate = s.returnConfig("Rates", "deathRate", float)
        self.daysFromLimbo = s.returnConfig(
            "Days", "daysUntilLimboDieDuetoLackOfBeds", int)
        self.numberOfBeds = s.returnConfig("SampleDefaults", "numberOfBeds",
                                           int)
        self.deathsLackBed = s.returnConfig("Rates", "deathsDueToLackOfBeds",
                                            float)
        self.hospitalRate = s.returnConfig("Rates", "hospitalizationRate",
                                           float)
        self.hospitalRateICU = s.returnConfig("Rates", "deathRateForICU",
                                              float)
        self.dayUntilCuredCovid = s.returnConfig("Days",
                                                 "dayUnitlCuredIfPositive",
                                                 int)
        self.daysUnitlCuredHos = s.returnConfig("Days",
                                                "dayUnitlCuredIfInHospital",
                                                int)

        self.xlimit = s.returnConfig("SampleDefaults", "xlimit", int)
        self.ylimit = s.returnConfig("SampleDefaults", "ylimit", int)
        self.distanceLimit = s.returnConfig("SampleDefaults", "distance",
                                            float)
Exemple #2
0
    def __init__(self):

        s = States()
        self.groupSize = s.returnConfig("SampleDefaults", "groupSize", int)
        self.state = s.status
        self.colors = s.stateColors
        self.sampleSize = s.returnConfig("SampleDefaults", "sampleSize", float)
        self.x = s.returnConfig("SampleDefaults", "xLimit", int)
        self.y = s.returnConfig("SampleDefaults", "yLimit", int)
class SampleModel:
	def __init__(self, day, generateFunc, processFunc, plotFunc, path):
		self.day = day
		self.path = path
		self.s = States()
		self.dayLimit = self.s.returnConfig('SampleDefaults', 'dayLimit', int)
		self.x = self.s.returnConfig('SampleDefaults', 'xLimit', int)
		self.y = self.s.returnConfig('SampleDefaults', 'yLimit', int)
		self.groupsize = self.s.returnConfig('SampleDefaults', 'groupSize', int)
		self.sampleSize = self.s.returnConfig('SampleDefaults', 'sampleSize', float)
		self.distance = self.s.returnConfig('SampleDefaults', 'distance', float)
		self.beds = self.s.returnConfig('SampleDefaults', 'numberOfBeds', float)
		logfile = f"{self.path}/{self.s.returnConfig('SampleDefaults', 'logfile', str)}"
		self.logFile = open(logfile, "w+")
		self.distanceLimit = self.s.returnConfig("SampleDefaults", "distance", float)
		self.generateData = generateFunc
		self.stateOfDay = self.generateData[1]
		self.MoversList = self.generateData[2]
		self.YesterdayPatients = list(self.generateData[0]['State'])
		self.startProcess = processFunc
		self.plotData = plotFunc

	def write_log(self, *args):
		line = ' '.join([str(a) for a in args])
		self.logFile.write(line + '\n')
		print(line)
		return
	
	def infect(self, i):
		if rn.random() > 0.25 and self.day > 3:
			return
		if self.generateData[0].loc[i, "State"] == 0:
			self.generateData[0].loc[i, "State"], self.generateData[0].loc[i, "Day"] = 1, self.day


	def nextDay(self):
		process = self.startProcess
		self.day += 1
		process.kill(self.day)
		process.hospitilize(self.day)
		process.cure(self.day)
		self.move()
		self.interact()
		return

	def plot(self):
		self.plotData.setup_plot(self.day)
		return

	def count(self):
		List = list(self.generateData[0]['State'])

		self.stateOfDay.loc[self.day, 'Healthy'] = List.count(0)
		self.stateOfDay.loc[self.day, 'Covid-19(+)'] = List.count(1)
		self.stateOfDay.loc[self.day, 'Hospitalized'] = List.count(2)
		self.stateOfDay.loc[self.day, 'Cured'] = List.count(4)
		self.stateOfDay.loc[self.day, 'Dead'] = List.count(3)
		self.stateOfDay.loc[self.day, 'Limbo'] = List.count(5)
		self.stateOfDay.loc[self.day, 'Self Cured'] = List.count(6)
		self.stateOfDay.loc[self.day, 'Total Cured'] = List.count(6) + List.count(4)

		return

	def run(self):
		self.infect(rn.randrange(self.groupsize))
		self.plot()
		self.count()
		self.log(2)
		self.nextDay()
		self.plot()
		self.count()
		self.log(2)
		return

	def interact(self):
		for i in range(len(self.generateData[0])):
			for j in range(i):
				if self.check(i, j):
					if (self.generateData[0].loc[i, 'State'] == 0):
						self.infect(i)
					else:
						self.infect(j)

	def check(self, i, j):
		Dist = math.sqrt((self.generateData[0].loc[i, 'X'] - self.generateData[0].loc[j, 'X'])
                         ** 2 + (self.generateData[0].loc[i, 'Y'] - self.generateData[0].loc[j, 'Y'])**2)
		flag = ((self.YesterdayPatients[i] == 1) ^
                (self.YesterdayPatients[j] == 1)) and Dist < self.distanceLimit
		return flag

	def move(self):
		for i in self.MoversList:
			if (self.generateData[0].loc[i, 'State'] == 2) or (self.generateData[0].loc[i, 'State'] == 3) or (self.generateData[0].loc[i, 'State'] == 5):
				self.MoversList.remove(i)
			self.generateData[0].loc[i, 'X'], self.generateData[0].loc[i, 'Y'] = (self.generateData[0].loc[i, 'X'] + rn.uniform(
		    1, self.x / 3)) % self.x , (self.generateData[0].loc[i, 'Y'] + rn.uniform(1, self.y / 3)) % self.y


	def log(self, phase):
		if phase == 1:
			self.write_log(31 * '-')
			self.write_log("Here's the Input Data:")
			self.write_log(8 * '- - ')
			self.write_log('Numper of Sample:', self.groupsize)
			self.write_log('X & Y limites: ', self.x, ', ', self.y)
			self.write_log('Distance required for Contamination:', self.distance)
			self.write_log("Moving Sample", self.sampleSize)
			self.write_log("Number Of Beds", self.beds)
			x = input("Do you wish to continue? y/n: ")
			if x == "y":
				pass
			elif x == 'n':
				sys.exit()	
		elif phase == 2:
			self.write_log(31 * '-')
			self.write_log('Day:', self.day)
			self.write_log(8 * '- - ')
			self.write_log(self.generateData[1].loc[self.day])
		return

	def end(self):
		self.Png_to_gif()

		self.stateOfDay.to_excel(f"{self.path}/Stat.xlsx")
		self.stateOfDay.plot(title='Statistical Data Vs. Days Passed')

		plt.savefig(f"{self.path}/Stat")
		self.logFile.close()

	def condition(self):
		healthy = len(self.generateData[0][self.generateData[0]['State'] == 0])
		covid19 = len(self.generateData[0][self.generateData[0]['State'] == 1])
		hospitilize = len(self.generateData[0][self.generateData[0]['State'] == 2])
		dead = len(self.generateData[0][self.generateData[0]['State'] == 3])
		cured = len(self.generateData[0][self.generateData[0]['State'] == 4])
		Limbo = len(self.generateData[0][self.generateData[0]['State'] == 5])
		selfcured = len(self.generateData[0][self.generateData[0]['State'] == 6])
		today = list(self.generateData[1].loc[self.day])
		yest = list(self.generateData[1].loc[self.day- 1])
		
		if covid19 == 0 and today == yest and hospitilize == 0:
			
			return 1
		else:
			return 0



	def main(self):
		
		whileBreak = 0
		while True:
			whileBreak += int(self.condition())
			
			if whileBreak > 2:
				self.end()
				break
				
			else:
				self.whileBreak = 0

			self.YesterdayPatients = list(self.generateData[0]['State'])
			self.nextDay()
			self.plot()
			self.count()
			self.log(2)
		

	def Png_to_gif(self):
		frames = []
		inImgs = f"{self.path}/days/*.png"
		output = f"{self.path}/png_to_gif.gif"

		img, *imgs = [Image.open(i) for i in sorted(glob.glob(inImgs))]
		img.save(fp=output, format='GIF', append_images=imgs,
         save_all=True, duration=500, loop=0)
Exemple #4
0
class Draw:
    def __init__(self, df, path):
        self.path = path
        self.fig, self.axs = plt.subplots(2, figsize=(10, 8))
        self.fig.suptitle('Covid-19 Epidemic Sample Model', fontsize=16)
        self.ld = [
            'Healthy', 'Covid-19(+)', 'Hospitalized', 'Cured', 'Self Cured',
            'Death Toll', 'Limbo', 'Total Cured'
        ]
        self.df = df[0]
        self.stateOfDay = df[1]
        self.MoversList = df[2]
        self.state = States()
        self.dayLimit = self.state.returnConfig('SampleDefaults', 'dayLimit',
                                                int)
        self.x = self.state.returnConfig('SampleDefaults', 'xLimit', int)
        self.y = self.state.returnConfig('SampleDefaults', 'yLimit', int)
        self.groupsize = self.state.returnConfig('SampleDefaults', 'groupSize',
                                                 int)
        self.sampleSize = self.state.returnConfig('SampleDefaults',
                                                  'sampleSize', float)
        self.distance = self.state.returnConfig('SampleDefaults', 'distance',
                                                float)
        self.beds = self.state.returnConfig('SampleDefaults', 'numberOfBeds',
                                            float)
        self.distanceLimit = self.state.returnConfig("SampleDefaults",
                                                     "distance", float)

    def setup_plot(self, day):
        self.axs[0].cla()
        self.scat = self.axs[0].scatter(self.df['X'],
                                        self.df['Y'],
                                        s=1,
                                        c=self.plt1color())
        for i in self.MoversList:
            self.axs[0].scatter(self.df.loc[i, 'X'],
                                self.df.loc[i, 'Y'],
                                s=6,
                                facecolors='none',
                                edgecolors='black')
            self.axs[0].text(self.df.loc[i, 'X'] + 0.02,
                             self.df.loc[i, 'Y'] + 0.02,
                             str(i),
                             fontsize=5)
        sDay = str(day)
        title = f"Day={sDay}, Group Size={self.groupsize}, Movers={self.sampleSize * 100}%, Infection Distance={self.distance}"
        self.axs[0].set_title(title, loc='center')
        title2 = f"Healthy={len(self.df[self.df['State'] == 0])}, Infected={len(self.df[self.df['State'] == 1])}, Dead={len(self.df[self.df['State'] == 3])}"
        self.axs[0].set_xlabel(title2)
        self.axs[0].set_yticklabels([])
        self.axs[0].set_xticklabels([])
        self.axs[0].tick_params(which='both',
                                bottom=False,
                                top=False,
                                right=False,
                                left=False,
                                labelbottom=True)

        self.axs[1].set_yticklabels([])
        self.axs[1].set_xticklabels([])
        self.axs[1].cla()
        self.axs[1].plot(self.stateOfDay.Healthy,
                         label=self.ld[0],
                         color=self.plt2color()[0])
        self.axs[1].plot(self.stateOfDay['Covid-19(+)'],
                         label=self.ld[1],
                         color=self.plt2color()[1])
        self.axs[1].plot(self.stateOfDay.Hospitalized,
                         label=self.ld[2],
                         color=self.plt2color()[2])
        self.axs[1].plot(self.stateOfDay.Cured,
                         label=self.ld[3],
                         color=self.plt2color()[3])
        self.axs[1].plot(self.stateOfDay['Self Cured'],
                         label=self.ld[4],
                         color=self.plt2color()[4])
        self.axs[1].plot(self.stateOfDay.Dead,
                         label=self.ld[5],
                         color=self.plt2color()[5])
        self.axs[1].plot(self.stateOfDay.Limbo,
                         label=self.ld[6],
                         color=self.plt2color()[6])
        self.axs[1].plot(self.stateOfDay['Total Cured'],
                         label=self.ld[7],
                         color=self.plt2color()[7])
        self.axs[1].set_prop_cycle(color=self.plt2color())
        self.axs[1].legend(bbox_to_anchor=(0, 1),
                           loc='upper left',
                           borderaxespad=0.)
        plt.tight_layout(rect=[0, 0.03, 1, 0.95])
        plt.ion()
        plt.pause(0.5)
        plt.xlabel("Days")
        if day < 10:
            sDay = '0' + sDay
        title = f"{self.path}/days/Day{sDay}.png"
        plt.savefig(title)
        return

    def plt1color(self):
        cols = []
        for l in self.df.index:
            if self.df.loc[l, 'State'] == 1:  # Infected
                cols.append(self.state.stateColors(1))
            elif self.df.loc[l, 'State'] == 3:  # Dead
                cols.append(self.state.stateColors(3))
            elif self.df.loc[l, 'State'] == 2:  # Hospitalized
                cols.append(self.state.stateColors(2))
            elif self.df.loc[l, 'State'] == 4:  # Cured
                cols.append(self.state.stateColors(4))
            elif self.df.loc[l, 'State'] == 5:  # Limbo
                cols.append(self.state.stateColors(5))
            elif self.df.loc[l, 'State'] == 100:  #Total Cured
                cols.append(self.state.stateColors(100))
            else:
                cols.append('blue')  # Healthy
        return cols

    def plt2color(self):
        cols = []
        for i in self.stateOfDay.columns:
            if i == 'Covid-19(+)':  # Infected
                cols.append('red')
            elif i == 'Dead':  # Dead
                cols.append('black')
            elif i == 'Hospitalized':  # Hospitalized
                cols.append('orange')
            elif i == 'Cured':  # Cured
                cols.append('green')
            elif i == 'Self Cured':  # limbo
                cols.append('cyan')
            elif i == 'Limbo':  # limbo
                cols.append('yellow')
            elif i == 'Total Cured':  # limbo
                cols.append('lime')
            else:
                cols.append('blue')  # Healthy
        return cols