User Tools

Site Tools


dom6:fearbattleenchantmentssimulationcode

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
dom6:fearbattleenchantmentssimulationcode [2024/12/18 18:35]
isitaris created
dom6:fearbattleenchantmentssimulationcode [2024/12/18 18:40] (current)
isitaris
Line 138: Line 138:
                     print(moraleMalus)                     print(moraleMalus)
             roundCountCurrent = tickCount // 7500             roundCountCurrent = tickCount // 7500
 +    
             # end of battle, unit hasn't routed yet (this is dom5 number, gotta check new dom6 end of turn stuff)             # end of battle, unit hasn't routed yet (this is dom5 number, gotta check new dom6 end of turn stuff)
             if roundCountCurrent > 100: # turn 100: battle enchantents end             if roundCountCurrent > 100: # turn 100: battle enchantents end
Line 335: Line 335:
                     unitHasRouted = True                     unitHasRouted = True
                 moraleCheckCount = 1                 moraleCheckCount = 1
 +    
             # new round, chance of morale malus to decay, and wailing winds will be able to try a rout one more time             # new round, chance of morale malus to decay, and wailing winds will be able to try a rout one more time
             if roundCountNew > roundCountCurrent:             if roundCountNew > roundCountCurrent:
Line 343: Line 343:
                     print(moraleMalus)                     print(moraleMalus)
             roundCountCurrent = tickCount // 7500             roundCountCurrent = tickCount // 7500
 +    
             # end of battle, unit hasn't routed yet (this is dom5 number, gotta check new dom6 end of turn stuff)             # end of battle, unit hasn't routed yet (this is dom5 number, gotta check new dom6 end of turn stuff)
             if roundCountCurrent > 100: # turn 100: battle enchantents end             if roundCountCurrent > 100: # turn 100: battle enchantents end
                 unitHasRouted = True                 unitHasRouted = True
 +    
                 roundCountCurrent = 130 #debug value                 roundCountCurrent = 130 #debug value
         return roundCountCurrent         return roundCountCurrent
 +    
     # did I actually finish those DOM5 versions? to be checked     # did I actually finish those DOM5 versions? to be checked
     def DOM5_wailingBattleSim_squad(unitMorale = 10, bloodRainActive = 0, squadSize = 1, unitDensity = 1, debug = 0):     def DOM5_wailingBattleSim_squad(unitMorale = 10, bloodRainActive = 0, squadSize = 1, unitDensity = 1, debug = 0):
Line 366: Line 366:
             tickCount += 320             tickCount += 320
             roundCountNew = tickCount // 7500             roundCountNew = tickCount // 7500
 +    
             for squadSquare_i in range(squadSquareSize):             for squadSquare_i in range(squadSquareSize):
                 # Wailing Winds effect                 # Wailing Winds effect
Line 376: Line 376:
                         if moraleMalus[unitID] < frightenMalusLimit: # in DOM5 the morale malus caps at 5                         if moraleMalus[unitID] < frightenMalusLimit: # in DOM5 the morale malus caps at 5
                             moraleMalus[unitID] += 1                             moraleMalus[unitID] += 1
 +    
                         # in DOM5 there is no individual rout                         # in DOM5 there is no individual rout
                         # if moraleCheckCount_easier[unitID] == 0 and unitHasRouted[unitID] == False and moraleCheckFailureIndividual(unitMorale, moraleMalus[unitID]):                         # if moraleCheckCount_easier[unitID] == 0 and unitHasRouted[unitID] == False and moraleCheckFailureIndividual(unitMorale, moraleMalus[unitID]):
Line 383: Line 383:
                         #     if debug == 1:                         #     if debug == 1:
                         #         print("big fear routs unit "+str(unitID)+" at round "+str(roundCountNew))                         #         print("big fear routs unit "+str(unitID)+" at round "+str(roundCountNew))
 +    
                         moraleCheckCount_easier[unitID] = 1                         moraleCheckCount_easier[unitID] = 1
 +    
                         unitMoraleProblems[:] += 1000                         unitMoraleProblems[:] += 1000
                         unitMoraleProblems[unitID] += 1000                         unitMoraleProblems[unitID] += 1000
 +    
                         if np.max(unitMoraleProblems) >= 10000: # or 5 cases depending on surviving number of squad members; issue is those cases look at whether the unit is alive, not routed. So it's hard to check in a sim without fighting; maybe ignore for now                         if np.max(unitMoraleProblems) >= 10000: # or 5 cases depending on surviving number of squad members; issue is those cases look at whether the unit is alive, not routed. So it's hard to check in a sim without fighting; maybe ignore for now
                             if moraleCheckCount == 0 and unitHasRouted[unitID] == False and moraleCheckFailureStandard_squad(moraleDomAverage(squadSize, unitMorale, moraleMalus), squadSize, squadMoraleBonus): # This should not be a true average, but in fact is rather %%((number of alive units in squad / 2) + total morale) / number of alive units (https://illwiki.com/dom5/user/loggy/morale)                             if moraleCheckCount == 0 and unitHasRouted[unitID] == False and moraleCheckFailureStandard_squad(moraleDomAverage(squadSize, unitMorale, moraleMalus), squadSize, squadMoraleBonus): # This should not be a true average, but in fact is rather %%((number of alive units in squad / 2) + total morale) / number of alive units (https://illwiki.com/dom5/user/loggy/morale)
Line 396: Line 396:
                                     print("big fear routs whole squad at round "+str(roundCountNew)+"----------------")                                     print("big fear routs whole squad at round "+str(roundCountNew)+"----------------")
                             moraleCheckCount = 1                             moraleCheckCount = 1
 +    
             # new round, chance of morale malus to decay, and wailing winds will be able to try a rout one more time             # new round, chance of morale malus to decay, and wailing winds will be able to try a rout one more time
             if roundCountNew > roundCountCurrent:             if roundCountNew > roundCountCurrent:
Line 418: Line 418:
             print("sim ends at round "+str(roundCountCurrent)+" with unitRoutRound = "+str(unitRoutRound))             print("sim ends at round "+str(roundCountCurrent)+" with unitRoutRound = "+str(unitRoutRound))
         return unitRoutRound         return unitRoutRound
- +     
- +     
 +    
     ########################################################################################################################     ########################################################################################################################
     ########################### Making distributions by running battle simulations several times ###########################     ########################### Making distributions by running battle simulations several times ###########################
     ########################################################################################################################     ########################################################################################################################
- +     
 +    
     def wailingExpectedRout_commanders(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000):     def wailingExpectedRout_commanders(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000):
         roundExpectedRout = 0         roundExpectedRout = 0
Line 434: Line 434:
             roundExpectedRout+=routRound             roundExpectedRout+=routRound
         return 1./nIteration * roundExpectedRout         return 1./nIteration * roundExpectedRout
 +    
     def makeWailingRoutDistrib_commanders(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000, isDOM5 = 0):     def makeWailingRoutDistrib_commanders(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000, isDOM5 = 0):
         routingTime = []         routingTime = []
Line 446: Line 446:
         routingTime = np.array(routingTime)         routingTime = np.array(routingTime)
         return routingTime         return routingTime
 +    
     def makeWailingRoutDistrib_squad(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, squadSize = 1, unitDensity = 1, nIteration = 1000, isDOM5 = 0):     def makeWailingRoutDistrib_squad(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, squadSize = 1, unitDensity = 1, nIteration = 1000, isDOM5 = 0):
         nRounds = 100         nRounds = 100
Line 461: Line 461:
         routedRatio = routedRatio * 1./nIteration         routedRatio = routedRatio * 1./nIteration
         return routedRatio         return routedRatio
 +    
     def makeFearMoraleMalusAverageDistrib(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000):     def makeFearMoraleMalusAverageDistrib(unitMorale = 10, bloodRainActive = 0, wailingWindsActive = 1, nIteration = 1000):
         nRounds = 100         nRounds = 100
Line 472: Line 472:
         return moraleMalusAverage         return moraleMalusAverage
     # makeFearMoraleMalusAverageDistrib(10, 1, 0, 1000)     # makeFearMoraleMalusAverageDistrib(10, 1, 0, 1000)
- +     
- +     
 +    
     ################################################################################################################     ################################################################################################################
     ########################### Functions to plot distributions into a .pdf or .png file ###########################     ########################### Functions to plot distributions into a .pdf or .png file ###########################
     ################################################################################################################     ################################################################################################################
 +    
     def plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):     def plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):
 +    
         nBins = 140         nBins = 140
         fig, ax = plt.subplots()         fig, ax = plt.subplots()
Line 486: Line 486:
         ax.set_xlabel('Round number')         ax.set_xlabel('Round number')
         ax.set_ylabel('Proba of being already routed (ie cumulative) in %')         ax.set_ylabel('Proba of being already routed (ie cumulative) in %')
 +    
         if option == "longCollection":         if option == "longCollection":
             colourMap = plt.get_cmap("viridis", nDistribs)             colourMap = plt.get_cmap("viridis", nDistribs)
         else:         else:
             colourMap = plt.get_cmap("copper", nDistribs)             colourMap = plt.get_cmap("copper", nDistribs)
 +    
         for i in range(nDistribs):         for i in range(nDistribs):
             if option == "longCollection":             if option == "longCollection":
Line 497: Line 497:
             else:             else:
                 ax.hist(routingTimeDistrib_collection[i], nBins, label=collectionLegend[i], range=(0,nBins), density=True, cumulative=True, color=colourMap(i), histtype="step")                 ax.hist(routingTimeDistrib_collection[i], nBins, label=collectionLegend[i], range=(0,nBins), density=True, cumulative=True, color=colourMap(i), histtype="step")
- +     
 +    
         # Create new legend handles but use the colors from the existing ones         # Create new legend handles but use the colors from the existing ones
         handles, labels = ax.get_legend_handles_labels()         handles, labels = ax.get_legend_handles_labels()
Line 507: Line 507:
         else:         else:
             new_handles = [Line2D([], [], c=handles[i].get_edgecolor()) for i in range(nDistribs)]             new_handles = [Line2D([], [], c=handles[i].get_edgecolor()) for i in range(nDistribs)]
 +    
         # plt.legend(handles=new_handles, labels=labels)         # plt.legend(handles=new_handles, labels=labels)
 +    
         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))
         ax.label_outer()         ax.label_outer()
 +    
         plt.xlim(xmin=0, xmax = 100)         plt.xlim(xmin=0, xmax = 100)
         plt.ylim(ymin=0, ymax = 1.05)         plt.ylim(ymin=0, ymax = 1.05)
         plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format         plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format
 +    
         plt.title(pltTitle)         plt.title(pltTitle)
 +    
         fig.tight_layout() # otherwise the right y-label is slightly clipped         fig.tight_layout() # otherwise the right y-label is slightly clipped
         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped
- +     
 +    
         # x-axis: major ticks every 20, minor ticks every 5         # x-axis: major ticks every 20, minor ticks every 5
         major_ticks_x = np.arange(0, 101, 20)         major_ticks_x = np.arange(0, 101, 20)
Line 529: Line 529:
         major_ticks_y = np.arange(0, 101, 20)*1./100         major_ticks_y = np.arange(0, 101, 20)*1./100
         minor_ticks_y = np.arange(0, 101, 5)*1./100         minor_ticks_y = np.arange(0, 101, 5)*1./100
 +    
         ax.set_xticks(major_ticks_x)         ax.set_xticks(major_ticks_x)
         ax.set_xticks(minor_ticks_x, minor=True)         ax.set_xticks(minor_ticks_x, minor=True)
         ax.set_yticks(major_ticks_y)         ax.set_yticks(major_ticks_y)
         ax.set_yticks(minor_ticks_y, minor=True)         ax.set_yticks(minor_ticks_y, minor=True)
 +    
         ax.grid(which='both')         ax.grid(which='both')
 +    
         ax.grid(which='minor', alpha=0.2)         ax.grid(which='minor', alpha=0.2)
         ax.grid(which='major', alpha=0.5)         ax.grid(which='major', alpha=0.5)
 +    
         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it
         script_dir = os.path.dirname(__file__)         script_dir = os.path.dirname(__file__)
         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')
         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')
 +    
         if not os.path.isdir(results_dir):         if not os.path.isdir(results_dir):
             os.makedirs(results_dir)             os.makedirs(results_dir)
         if not os.path.isdir(results_dir_png):         if not os.path.isdir(results_dir_png):
             os.makedirs(results_dir_png)             os.makedirs(results_dir_png)
 +    
         if option == "debug":         if option == "debug":
             plt.show()             plt.show()
Line 555: Line 555:
         plt.savefig(results_dir_png+pdfName+'.png')         plt.savefig(results_dir_png+pdfName+'.png')
                  
 +    
     def plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):     def plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):
 +    
         fig, ax = plt.subplots()         fig, ax = plt.subplots()
         color1 = 'tab:red'         color1 = 'tab:red'
         ax.set_xlabel('Round number')         ax.set_xlabel('Round number')
         ax.set_ylabel('Proportion of squad already routed in %')         ax.set_ylabel('Proportion of squad already routed in %')
 +    
         if option == "longCollection":         if option == "longCollection":
             colourMap = plt.get_cmap("viridis", nDistribs)             colourMap = plt.get_cmap("viridis", nDistribs)
         else:         else:
             colourMap = plt.get_cmap("copper", nDistribs)             colourMap = plt.get_cmap("copper", nDistribs)
 +    
         nRounds = 100 # x-axis bin size         nRounds = 100 # x-axis bin size
         for i in range(nDistribs):         for i in range(nDistribs):
Line 574: Line 574:
             else:             else:
                 ax.plot(np.array(range(nRounds)), routedRatioDistrib_collection[i], label=collectionLegend[i], color=colourMap(i))                 ax.plot(np.array(range(nRounds)), routedRatioDistrib_collection[i], label=collectionLegend[i], color=colourMap(i))
 +    
         # Create new legend handles but use the colors from the existing ones         # Create new legend handles but use the colors from the existing ones
         handles, labels = ax.get_legend_handles_labels()         handles, labels = ax.get_legend_handles_labels()
Line 583: Line 583:
         else:         else:
             new_handles = [Line2D([], [], c=handles[i].get_color()) for i in range(nDistribs)]             new_handles = [Line2D([], [], c=handles[i].get_color()) for i in range(nDistribs)]
 +    
         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))
         ax.label_outer()         ax.label_outer()
 +    
         plt.xlim(xmin=0, xmax = 100)         plt.xlim(xmin=0, xmax = 100)
         plt.ylim(ymin=0, ymax = 1.05)         plt.ylim(ymin=0, ymax = 1.05)
         plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format         plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format
 +    
         plt.title(pltTitle)         plt.title(pltTitle)
 +    
         fig.tight_layout() # otherwise the right y-label is slightly clipped         fig.tight_layout() # otherwise the right y-label is slightly clipped
         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped
- +     
 +    
         # setting up the grid and the ticks on the axes:         # setting up the grid and the ticks on the axes:
 +    
         # x-axis: major ticks every 20, minor ticks every 5         # x-axis: major ticks every 20, minor ticks every 5
         major_ticks_x = np.arange(0, 101, 20)         major_ticks_x = np.arange(0, 101, 20)
Line 605: Line 605:
         major_ticks_y = np.arange(0, 101, 20)*1./100         major_ticks_y = np.arange(0, 101, 20)*1./100
         minor_ticks_y = np.arange(0, 101, 5)*1./100         minor_ticks_y = np.arange(0, 101, 5)*1./100
 +    
         ax.set_xticks(major_ticks_x)         ax.set_xticks(major_ticks_x)
         ax.set_xticks(minor_ticks_x, minor=True)         ax.set_xticks(minor_ticks_x, minor=True)
         ax.set_yticks(major_ticks_y)         ax.set_yticks(major_ticks_y)
         ax.set_yticks(minor_ticks_y, minor=True)         ax.set_yticks(minor_ticks_y, minor=True)
 +    
         ax.grid(which='both')         ax.grid(which='both')
 +    
         ax.grid(which='minor', alpha=0.2)         ax.grid(which='minor', alpha=0.2)
         ax.grid(which='major', alpha=0.5)         ax.grid(which='major', alpha=0.5)
 +    
         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it
         script_dir = os.path.dirname(__file__)         script_dir = os.path.dirname(__file__)
         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')
         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')
 +    
         if not os.path.isdir(results_dir):         if not os.path.isdir(results_dir):
             os.makedirs(results_dir)             os.makedirs(results_dir)
         if not os.path.isdir(results_dir_png):         if not os.path.isdir(results_dir_png):
             os.makedirs(results_dir_png)             os.makedirs(results_dir_png)
 +    
         if option == "debug":         if option == "debug":
             plt.show()             plt.show()
         plt.savefig(results_dir+pdfName+'.pdf')         plt.savefig(results_dir+pdfName+'.pdf')
         plt.savefig(results_dir_png+pdfName+'.png')         plt.savefig(results_dir_png+pdfName+'.png')
 +    
     def plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):     def plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName, option = ""):
 +    
         nBins = 140         nBins = 140
         fig, ax = plt.subplots()         fig, ax = plt.subplots()
Line 638: Line 638:
         ax.set_xlabel('Round number')         ax.set_xlabel('Round number')
         ax.set_ylabel('Morale malus')         ax.set_ylabel('Morale malus')
 +    
         if option == "longCollection":         if option == "longCollection":
             colourMap = plt.get_cmap("viridis", nDistribs)             colourMap = plt.get_cmap("viridis", nDistribs)
         else:         else:
             colourMap = plt.get_cmap("copper", nDistribs)             colourMap = plt.get_cmap("copper", nDistribs)
 +    
         xRounds = np.arange(100)         xRounds = np.arange(100)
         for i in range(nDistribs):         for i in range(nDistribs):
Line 652: Line 652:
                 # ax.hist(fearMoraleMalusDistrib_collection[i], nBins, label=collectionLegend[i], range=(0,nBins), density=False, cumulative=False, color=colourMap(i), histtype="step")                 # ax.hist(fearMoraleMalusDistrib_collection[i], nBins, label=collectionLegend[i], range=(0,nBins), density=False, cumulative=False, color=colourMap(i), histtype="step")
                 ax.plot(xRounds, fearMoraleMalusDistrib_collection[i], label=collectionLegend[i], color=colourMap(i))                 ax.plot(xRounds, fearMoraleMalusDistrib_collection[i], label=collectionLegend[i], color=colourMap(i))
 +    
         # Create new legend handles but use the colors from the existing ones         # Create new legend handles but use the colors from the existing ones
         handles, labels = ax.get_legend_handles_labels()         handles, labels = ax.get_legend_handles_labels()
Line 661: Line 661:
         else:         else:
             new_handles = [Line2D([], [], c=handles[i].get_color()) for i in range(nDistribs)]             new_handles = [Line2D([], [], c=handles[i].get_color()) for i in range(nDistribs)]
 +    
         # plt.legend(handles=new_handles, labels=labels)         # plt.legend(handles=new_handles, labels=labels)
 +    
         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))         ax.legend(handles=new_handles, labels=labels, loc='center left', bbox_to_anchor=(1, 0.5))
         ax.label_outer()         ax.label_outer()
 +    
         plt.xlim(xmin=0, xmax = 100)         plt.xlim(xmin=0, xmax = 100)
         plt.ylim(ymin=0, ymax = 10)         plt.ylim(ymin=0, ymax = 10)
         # plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format         # plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(xmax=1.0)) # transforms y-axis in % format
 +    
         plt.title(pltTitle)         plt.title(pltTitle)
 +    
         fig.tight_layout() # otherwise the right y-label is slightly clipped         fig.tight_layout() # otherwise the right y-label is slightly clipped
         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped         fig.tight_layout() # for some reason gotta call it twice for the top title to not be cropped
- +     
 +    
         # x-axis: major ticks every 20, minor ticks every 5         # x-axis: major ticks every 20, minor ticks every 5
         major_ticks_x = np.arange(0, 101, 20)         major_ticks_x = np.arange(0, 101, 20)
Line 686: Line 686:
         major_ticks_y = np.arange(0, 10, 1 )         major_ticks_y = np.arange(0, 10, 1 )
         minor_ticks_y = np.arange(0, 10, 1./5)         minor_ticks_y = np.arange(0, 10, 1./5)
 +    
         ax.set_xticks(major_ticks_x)         ax.set_xticks(major_ticks_x)
         ax.set_xticks(minor_ticks_x, minor=True)         ax.set_xticks(minor_ticks_x, minor=True)
         ax.set_yticks(major_ticks_y)         ax.set_yticks(major_ticks_y)
         ax.set_yticks(minor_ticks_y, minor=True)         ax.set_yticks(minor_ticks_y, minor=True)
 +    
         ax.grid(which='both')         ax.grid(which='both')
 +    
         ax.grid(which='minor', alpha=0.2)         ax.grid(which='minor', alpha=0.2)
         ax.grid(which='major', alpha=0.5)         ax.grid(which='major', alpha=0.5)
 +    
         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it         # save figure in ./WailingWindsPlots/ folder ; if it  doesnt exist, create it
         script_dir = os.path.dirname(__file__)         script_dir = os.path.dirname(__file__)
         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')         results_dir = os.path.join(script_dir, 'WailingWindsPlots/')
         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')         results_dir_png = os.path.join(script_dir, 'WailingWindsPlots/pngPlots')
 +    
         if not os.path.isdir(results_dir):         if not os.path.isdir(results_dir):
             os.makedirs(results_dir)             os.makedirs(results_dir)
         if not os.path.isdir(results_dir_png):         if not os.path.isdir(results_dir_png):
             os.makedirs(results_dir_png)             os.makedirs(results_dir_png)
 +    
         if option == "debug":         if option == "debug":
             plt.show()             plt.show()
         plt.savefig(results_dir+pdfName+'.pdf')         plt.savefig(results_dir+pdfName+'.pdf')
         plt.savefig(results_dir_png+pdfName+'.png')         plt.savefig(results_dir_png+pdfName+'.png')
- +     
 +    
     ################################################################################################################################     ################################################################################################################################
     ########################### Main functions that call plotting functions for many different scenarios ###########################     ########################### Main functions that call plotting functions for many different scenarios ###########################
     ################################################################################################################################     ################################################################################################################################
 +    
     def plot_varyingMorale_setEnchantments_commandersRout():     def plot_varyingMorale_setEnchantments_commandersRout():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         nIteration=100000         nIteration=100000
 +    
         nDistribs = len(unitMorale_collection)         nDistribs = len(unitMorale_collection)
 +    
         for bloodRainActive in [0,1]:         for bloodRainActive in [0,1]:
             for wailingWindsActive in [0,1]:             for wailingWindsActive in [0,1]:
Line 737: Line 737:
                     if wailingWindsActive == 0:                     if wailingWindsActive == 0:
                         wailingWinds = "_noWailingWinds"                         wailingWinds = "_noWailingWinds"
 +    
                     routingTimeDistrib_collection = []                     routingTimeDistrib_collection = []
                     collectionLegend = []                     collectionLegend = []
Line 744: Line 744:
                         routingTimeDistrib_collection += [makeWailingRoutDistrib_commanders(unitMorale, bloodRainActive, wailingWindsActive, nIteration)]                         routingTimeDistrib_collection += [makeWailingRoutDistrib_commanders(unitMorale, bloodRainActive, wailingWindsActive, nIteration)]
                         collectionLegend += ["morale " + str(unitMorale)]                         collectionLegend += ["morale " + str(unitMorale)]
 +    
                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"
                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"
 +    
                     pltTitle = "commanders - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus                     pltTitle = "commanders - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus
                     pdfName = "MoralePlays_MoraleComparison_commanders___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus                     pdfName = "MoralePlays_MoraleComparison_commanders___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus
 +    
                     plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")                     plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")
 +    
     def plot_setMorale_varyingEnchantments_commandersRout():     def plot_setMorale_varyingEnchantments_commandersRout():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         # unitMorale_collection = [15]         # unitMorale_collection = [15]
         nIteration=100000         nIteration=100000
 +    
         for unitMorale in unitMorale_collection:         for unitMorale in unitMorale_collection:
             print("simulating unit morale "+str(unitMorale))             print("simulating unit morale "+str(unitMorale))
             # for wailingWindsActive in [0,1]:             # for wailingWindsActive in [0,1]:
             #     if (bloodRainActive, wailingWindsActive) != (0, 0):             #     if (bloodRainActive, wailingWindsActive) != (0, 0):
 +    
             nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)             nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)
             routingTimeDistrib_collection = []             routingTimeDistrib_collection = []
             collectionLegend = []             collectionLegend = []
 +    
             for bloodRainActive in [0,1]:             for bloodRainActive in [0,1]:
                 for wailingWindsActive in [0,1]:                 for wailingWindsActive in [0,1]:
Line 775: Line 775:
                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"
                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]
- +     
 +    
             pltTitle = "commanders - morale " + str(unitMorale)             pltTitle = "commanders - morale " + str(unitMorale)
             pdfName = "MoralePlays_WailingRainComparison_commanders___morale_" + str(unitMorale)             pdfName = "MoralePlays_WailingRainComparison_commanders___morale_" + str(unitMorale)
 +    
             plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName)             plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName)
 +    
     def plot_setMorale_varyingEnchantments_squadRout():     def plot_setMorale_varyingEnchantments_squadRout():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         # unitMorale_collection = range(16,30,2)         # unitMorale_collection = range(16,30,2)
         nIteration=100000         nIteration=100000
 +    
         squadSize = 10         squadSize = 10
         unitDensity = 2         unitDensity = 2
 +    
         for unitMorale in unitMorale_collection:         for unitMorale in unitMorale_collection:
             print("analysing: morale "+str(unitMorale)+":")             print("analysing: morale "+str(unitMorale)+":")
 +    
             nDistribs = 2 # wailing,rain (on,on), (on,off), (off,on)             nDistribs = 2 # wailing,rain (on,on), (on,off), (off,on)
             routedRatioDistrib_collection = []             routedRatioDistrib_collection = []
             collectionLegend = []             collectionLegend = []
 +    
             for bloodRainActive in [0,1]:             for bloodRainActive in [0,1]:
                 for wailingWindsActive in [0,1]:                 for wailingWindsActive in [0,1]:
Line 805: Line 805:
                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"                          rainStatus = "ON" if bloodRainActive == 1 else "OFF" 
                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]
- +     
 +    
             pltTitle = "squad morale " + str(unitMorale)             pltTitle = "squad morale " + str(unitMorale)
             pdfName = "MoralePlays_WailingRainComparison_squad___morale_" + str(unitMorale)             pdfName = "MoralePlays_WailingRainComparison_squad___morale_" + str(unitMorale)
 +    
             plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "")             plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "")
 +    
     def plot_varyingMorale_setEnchantments_squadRout():     def plot_varyingMorale_setEnchantments_squadRout():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         nIteration=100000         nIteration=100000
 +    
         squadSize = 10         squadSize = 10
         unitDensity = 2         unitDensity = 2
 +    
         nDistribs = len(unitMorale_collection)         nDistribs = len(unitMorale_collection)
 +    
         for bloodRainActive in [0,1]:         for bloodRainActive in [0,1]:
             for wailingWindsActive in [0,1]:             for wailingWindsActive in [0,1]:
Line 835: Line 835:
                     if wailingWindsActive == 0:                     if wailingWindsActive == 0:
                         wailingWinds = "_noWailingWinds"                         wailingWinds = "_noWailingWinds"
 +    
                     routedRatioDistrib_collection = []                     routedRatioDistrib_collection = []
                     collectionLegend = []                     collectionLegend = []
 +    
                     for unitMorale in unitMorale_collection:                     for unitMorale in unitMorale_collection:
                         print("Morale "+str(unitMorale))                         print("Morale "+str(unitMorale))
                         routedRatioDistrib_collection += [makeWailingRoutDistrib_squad(unitMorale, bloodRainActive, wailingWindsActive, squadSize, unitDensity, nIteration)]                         routedRatioDistrib_collection += [makeWailingRoutDistrib_squad(unitMorale, bloodRainActive, wailingWindsActive, squadSize, unitDensity, nIteration)]
                         collectionLegend += ["morale " + str(unitMorale)]                         collectionLegend += ["morale " + str(unitMorale)]
 +    
                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"
                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"
 +    
                     pltTitle = "squad - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus                     pltTitle = "squad - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus
                     pdfName = "MoralePlays_MoraleComparison_squad___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus                     pdfName = "MoralePlays_MoraleComparison_squad___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus
 +    
                     plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")                     plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")
 +    
     def plot_varyingMorale_setEnchantments_moraleMalus():     def plot_varyingMorale_setEnchantments_moraleMalus():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         nIteration=10000         nIteration=10000
 +    
         nDistribs = len(unitMorale_collection)         nDistribs = len(unitMorale_collection)
 +    
         for bloodRainActive in [0,1]:         for bloodRainActive in [0,1]:
             for wailingWindsActive in [0,1]:             for wailingWindsActive in [0,1]:
Line 872: Line 872:
                     if wailingWindsActive == 0:                     if wailingWindsActive == 0:
                         wailingWinds = "_noWailingWinds"                         wailingWinds = "_noWailingWinds"
 +    
                     fearMoraleMalusDistrib_collection = []                     fearMoraleMalusDistrib_collection = []
                     collectionLegend = []                     collectionLegend = []
Line 879: Line 879:
                         fearMoraleMalusDistrib_collection += [makeFearMoraleMalusAverageDistrib(unitMorale, bloodRainActive, wailingWindsActive, nIteration)]                         fearMoraleMalusDistrib_collection += [makeFearMoraleMalusAverageDistrib(unitMorale, bloodRainActive, wailingWindsActive, nIteration)]
                         collectionLegend += ["morale " + str(unitMorale)]                         collectionLegend += ["morale " + str(unitMorale)]
 +    
                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"                     wailingStatus = "ON" if wailingWindsActive == 1 else "OFF"
                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"                     rainStatus = "ON" if bloodRainActive == 1 else "OFF"
 +    
                     pltTitle = "morale malus - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus                     pltTitle = "morale malus - BloodRain" + rainStatus + ", WailingWinds " + wailingStatus
                     pdfName = "MoralePlays_MoraleComparison___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus + "_moraleMalus"                     pdfName = "MoralePlays_MoraleComparison___BloodRain_" + rainStatus + "_WailingWinds_" + wailingStatus + "_moraleMalus"
 +    
                     plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")                     plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName, "longCollection")
 +    
     def plot_setMorale_varyingEnchantments_moraleMalus():     def plot_setMorale_varyingEnchantments_moraleMalus():
         unitMorale_collection = range(10,30,2)         unitMorale_collection = range(10,30,2)
         # unitMorale_collection = [15]         # unitMorale_collection = [15]
         nIteration=10000         nIteration=10000
 +    
         for unitMorale in unitMorale_collection:         for unitMorale in unitMorale_collection:
             print("simulating unit morale "+str(unitMorale))             print("simulating unit morale "+str(unitMorale))
             # for wailingWindsActive in [0,1]:             # for wailingWindsActive in [0,1]:
             #     if (bloodRainActive, wailingWindsActive) != (0, 0):             #     if (bloodRainActive, wailingWindsActive) != (0, 0):
 +    
             nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)             nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)
             fearMoraleMalusDistrib_collection = []             fearMoraleMalusDistrib_collection = []
             collectionLegend = []             collectionLegend = []
 +    
             for bloodRainActive in [0,1]:             for bloodRainActive in [0,1]:
                 for wailingWindsActive in [0,1]:                 for wailingWindsActive in [0,1]:
Line 910: Line 910:
                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"
                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]
- +     
 +    
             pltTitle = "morale malus - morale " + str(unitMorale)             pltTitle = "morale malus - morale " + str(unitMorale)
             pdfName = "MoralePlays_WailingRainComparison___morale_" + str(unitMorale)+"_moraleMalus"             pdfName = "MoralePlays_WailingRainComparison___morale_" + str(unitMorale)+"_moraleMalus"
 +    
             plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName)             plotHistograms_fearMoraleMalus(nDistribs, fearMoraleMalusDistrib_collection, collectionLegend, pltTitle, pdfName)
- +     
- +     
- +     
 +    
     def plot_all_commanders():     def plot_all_commanders():
         plot_varyingMorale_setEnchantments_commandersRout()         plot_varyingMorale_setEnchantments_commandersRout()
         plot_setMorale_varyingEnchantments_commandersRout()         plot_setMorale_varyingEnchantments_commandersRout()
- +     
- +     
 +    
     def plot_test():     def plot_test():
         unitMorale_collection = [10,15,20,25]         unitMorale_collection = [10,15,20,25]
         nIteration=100000         nIteration=100000
 +    
         # # commanders         # # commanders
         # for unitMorale in unitMorale_collection:         # for unitMorale in unitMorale_collection:
         #     # for wailingWindsActive in [0,1]:         #     # for wailingWindsActive in [0,1]:
         #     #     if (bloodRainActive, wailingWindsActive) != (0, 0):         #     #     if (bloodRainActive, wailingWindsActive) != (0, 0):
 +    
         #     nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)         #     nDistribs = 3 # wailing,rain (on,on), (on,off), (off,on)
         #     routingTimeDistrib_collection = []         #     routingTimeDistrib_collection = []
         #     collectionLegend = []         #     collectionLegend = []
 +    
         #     for bloodRainActive in [0,1]:         #     for bloodRainActive in [0,1]:
         #         for wailingWindsActive in [0,1]:         #         for wailingWindsActive in [0,1]:
Line 946: Line 946:
         #                 rainStatus = "ON" if bloodRainActive == 1 else "OFF"         #                 rainStatus = "ON" if bloodRainActive == 1 else "OFF"
         #                 collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]         #                 collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]
- +     
 +    
         #     pltTitle = "commander morale " + str(unitMorale)         #     pltTitle = "commander morale " + str(unitMorale)
         #     pdfName = "test_WailingRainComparison___morale_" + str(unitMorale)+"_commanders"         #     pdfName = "test_WailingRainComparison___morale_" + str(unitMorale)+"_commanders"
 +    
         #     plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, "debug")         #     plotHistograms_commanders(nDistribs, routingTimeDistrib_collection, collectionLegend, pltTitle, pdfName, "debug")
- +     
 +    
         # squad         # squad
         for unitMorale in unitMorale_collection:         for unitMorale in unitMorale_collection:
Line 959: Line 959:
             # for wailingWindsActive in [0,1]:             # for wailingWindsActive in [0,1]:
             #     if (bloodRainActive, wailingWindsActive) != (0, 0):             #     if (bloodRainActive, wailingWindsActive) != (0, 0):
 +    
             nDistribs = 2 # wailing,rain (on,on), (on,off), (off,on)             nDistribs = 2 # wailing,rain (on,on), (on,off), (off,on)
             routedRatioDistrib_collection = []             routedRatioDistrib_collection = []
Line 965: Line 965:
             squadSize = 10             squadSize = 10
             unitDensity = 2             unitDensity = 2
 +    
             for bloodRainActive in [0,1]:             for bloodRainActive in [0,1]:
                 for wailingWindsActive in [0,1]:                 for wailingWindsActive in [0,1]:
Line 974: Line 974:
                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"                         rainStatus = "ON" if bloodRainActive == 1 else "OFF"
                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]                         collectionLegend += ["winds " + wailingStatus + "\nrain    " + rainStatus]
- +     
 +    
             pltTitle = "squad morale " + str(unitMorale)             pltTitle = "squad morale " + str(unitMorale)
             pdfName = "test_WailingRainComparison___morale_" + str(unitMorale)+"_squad"             pdfName = "test_WailingRainComparison___morale_" + str(unitMorale)+"_squad"
 +    
             plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "")             plotHistograms_squad(nDistribs, routedRatioDistrib_collection, collectionLegend, pltTitle, pdfName, "")
- +     
- +     
- +     
- +     
- +     
- +     
 +    
     # for units:     # for units:
     #     proba full squad gone     #     proba full squad gone
     #     proba one unit gone     #     proba one unit gone
     #     % of units in the squad gone     #     % of units in the squad gone
- +     
 +    
     # legacy error bars attempt     # legacy error bars attempt
 +    
         # SumSquareDev = 0         # SumSquareDev = 0
         # E = wailingExpectedRout(unitMorale, bloodRainActive, wailingWindsActive, nIteration)         # E = wailingExpectedRout(unitMorale, bloodRainActive, wailingWindsActive, nIteration)
                  
         # n, bins, patches = plt.hist(RoutingTime, num_bins, range=(0,140), density=1, facecolor='blue', alpha=0.5)             # n, bins, patches = plt.hist(RoutingTime, num_bins, range=(0,140), density=1, facecolor='blue', alpha=0.5)    
 +    
         # y,binEdges = np.histogram(RoutingTime,range=(0,300),bins=num_bins)         # y,binEdges = np.histogram(RoutingTime,range=(0,300),bins=num_bins)
         # bincenters = 0.5*(binEdges[1:]+binEdges[:-1])         # bincenters = 0.5*(binEdges[1:]+binEdges[:-1])
dom6/fearbattleenchantmentssimulationcode.1734546930.txt.gz · Last modified: 2024/12/18 18:35 by isitaris