Commit ac617193 authored by Georgios Dagkakis's avatar Georgios Dagkakis

changes in demand plannins algorithm

parent 1d28372e
from dream.plugins import plugin from dream.plugins import plugin
from dream.plugins.TimeSupport import TimeSupportMixin from dream.plugins.TimeSupport import TimeSupportMixin
from datetime import datetime from datetime import datetime
class DemandPlanningLine(plugin.OutputPreparationPlugin, TimeSupportMixin): class DemandPlanningLine(plugin.OutputPreparationPlugin, TimeSupportMixin):
""" Output the queue statistics in a format compatible with Output_viewGraph """ Output the queue statistics in a format compatible with Output_viewGraph
""" """
def postprocess(self, data): def postprocess(self, data):
from dream.simulation.applications.DemandPlanning.Globals import G from dream.simulation.applications.DemandPlanning.Globals import G
result = data['result']['result_list'][-1] result = data['result']['result_list'][-1]
bottleNeckUtilizationDict = result['bottleneck_utilization'] = {} bottleNeckUtilizationDict = result['bottleneck_utilization'] = {}
for bottleneck, bottleNeckUtilization in G.Utilisation.iteritems(): for bottleneck, bottleNeckUtilization in G.Utilisation.iteritems():
dateList=[] dateList=[]
# get the current date from the data # get the current date from the data
for record_id,record in bottleNeckUtilization.iteritems(): for record_id,record in bottleNeckUtilization.iteritems():
year=str(record_id)[0:4] year=str(record_id)[0:4]
week=str(record_id)[4:] week=str(record_id)[4:]
fullDate=datetime.strptime(year+'-'+week+'-0', '%Y-%W-%w') fullDate=datetime.strptime(year+'-'+week+'-0', '%Y-%W-%w')
dateList.append(fullDate) dateList.append(fullDate)
# XXX We need to make TimeSupportMixin resuable. We should not have to do this. # XXX We need to make TimeSupportMixin resuable. We should not have to do this.
currentDate=str(min(dateList)) currentDate=str(min(dateList))
currentDate=currentDate.replace('-', '/') currentDate=currentDate.replace('-', '/')
data['general']['currentDate']=currentDate data['general']['currentDate']=currentDate
data['general']['timeUnit']='week' data['general']['timeUnit']='week'
self.initializeTimeSupport(data) self.initializeTimeSupport(data)
series = [] series = []
options = { options = {
"xaxis": { "xaxis": {
"mode": "time", "mode": "time",
#"minTickSize": [1, self.getTimeUnitText()], #"minTickSize": [1, self.getTimeUnitText()],
"minTickSize": [1, "day"], "minTickSize": [1, "day"],
}, },
"legend": { "legend": {
"backgroundOpacity": 0.1, "backgroundOpacity": 0.1,
"position":"se", "position":"se",
}, },
} }
bottleNeckUtilizationDict[bottleneck] = { bottleNeckUtilizationDict[bottleneck] = {
"series": series, "series": series,
"options": options "options": options
} }
# create the 3 lines # create the 3 lines
for (utilizationType, utilizationLabel) in [ for (utilizationType, utilizationLabel) in [
( 'minUtilization', 'Min Utilization' ), ( 'minUtilization', 'Min Utilization' ),
( 'averageUtilization', 'Actual Utilization' ), ( 'averageUtilization', 'Actual Utilization' ),
( 'maxUtilization', 'Target Utilization' ) ]: ( 'maxUtilization', 'Target Utilization' ) ]:
utilizationList=[] utilizationList=[]
for record_id, record in bottleNeckUtilization.iteritems(): for record_id, record in bottleNeckUtilization.iteritems():
year=str(record_id)[0:4] year=str(record_id)[0:4]
week=str(record_id)[4:] week=str(record_id)[4:]
fullDate=datetime.strptime(year+'-'+week+'-0', '%Y-%W-%w') fullDate=datetime.strptime(year+'-'+week+'-0', '%Y-%W-%w')
utilizationList.append([fullDate,record[utilizationType]]) utilizationList.append([fullDate,record[utilizationType]])
utilizationList.sort(key=lambda x: x[0], reverse=True) utilizationList.sort(key=lambda x: x[0], reverse=True)
series.append({ series.append({
"label": utilizationLabel, "label": utilizationLabel,
"data": [((time-datetime(1970, 1, 1)).total_seconds()*1000, value) for (time, value) in utilizationList] "data": [((time-datetime(1970, 1, 1)).total_seconds()*1000, value) for (time, value) in utilizationList]
}) })
return data return data
class BottleNeckByWeek(plugin.OutputPreparationPlugin, TimeSupportMixin): class BottleNeckByWeek(plugin.OutputPreparationPlugin, TimeSupportMixin):
""" Output the queue statistics in a format compatible with Output_viewGraph, for the second widget by week. """ Output the queue statistics in a format compatible with Output_viewGraph, for the second widget by week.
""" """
def postprocess(self, data): def postprocess(self, data):
from dream.simulation.applications.DemandPlanning.Globals import G from dream.simulation.applications.DemandPlanning.Globals import G
result = data['result']['result_list'][-1] result = data['result']['result_list'][-1]
bottleNeckUtilizationDict = result['bottleneck_utilization_by_week'] = {} bottleNeckUtilizationDict = result['bottleneck_utilization_by_week'] = {}
by_week = {} by_week = {}
# change {bottleneck: {week: data }} in {week: {bottleneck: data}} # change {bottleneck: {week: data }} in {week: {bottleneck: data}}
for bottleneck, bottleNeckUtilization in G.Utilisation.iteritems(): for bottleneck, bottleNeckUtilization in G.Utilisation.iteritems():
for record_id, record in bottleNeckUtilization.iteritems(): for record_id, record in bottleNeckUtilization.iteritems():
by_week.setdefault(record_id, {})[bottleneck] = record by_week.setdefault(record_id, {})[bottleneck] = record
for week, bottleneckData in by_week.items(): for week, bottleneckData in by_week.items():
series = [] series = []
#ticks = list(enumerate(bottleneckData.keys())) #ticks = list(enumerate(bottleneckData.keys()))
ticks = list(enumerate(G.Bottlenecks)) ticks = list(enumerate(G.Bottlenecks))
options = { options = {
"xaxis": { "xaxis": {
"minTickSize": 1, "minTickSize": 1,
"ticks": ticks "ticks": ticks
}, },
"legend": { "legend": {
"backgroundOpacity": 0.1, "backgroundOpacity": 0.1,
"position":"se", "position":"se",
}, },
"series": { "series": {
"bars": { "bars": {
"show": True, "show": True,
"barWidth": 0.10, "barWidth": 0.10,
"order": 1, "order": 1,
"align": "center" "align": "center"
}, },
"stack": False "stack": False
} }
} }
weekLabel = "%s %s" % (str(week)[:4], str(week)[4:]) weekLabel = "%s %s" % (str(week)[:4], str(week)[4:])
bottleNeckUtilizationDict[weekLabel] = { bottleNeckUtilizationDict[weekLabel] = {
"series": series, "series": series,
"options": options "options": options
} }
# create the 3 bars # create the 3 bars
for (utilizationType, utilizationLabel) in [ for (utilizationType, utilizationLabel) in [
( 'minUtilization', 'Min Utilization' ), ( 'minUtilization', 'Min Utilization' ),
( 'averageUtilization', 'Actual Utilization' ), ( 'averageUtilization', 'Actual Utilization' ),
( 'maxUtilization', 'Target Utilization' ) ]: ( 'maxUtilization', 'Target Utilization' ) ]:
series.append({ series.append({
"label": utilizationLabel, "label": utilizationLabel,
"data": list(enumerate([bottleneckData[x][utilizationType] for x in G.Bottlenecks])), "data": list(enumerate([bottleneckData[x][utilizationType] for x in G.Bottlenecks])),
}) })
return data
class BottleNeckLoadByWeek(plugin.OutputPreparationPlugin, TimeSupportMixin):
""" Output the queue statistics in a format compatible with Output_viewGraph, for the second widget by week.
"""
def postprocess(self, data):
from dream.simulation.applications.DemandPlanning.Globals import G
result = data['result']['result_list'][-1]
bottleNeckUtilizationDict = result['bottleneck_load_by_week'] = {}
by_week = {}
# change {bottleneck: {ma: {week:data }}} in {(bottleneck, week): {ma: data}}
maxUtilisation = 0
for bottleneck, bottleNeckUtilization in G.Butilisation.iteritems():
for ma, record in bottleNeckUtilization.iteritems():
for week, value in record.iteritems():
by_week.setdefault((bottleneck, week), {})[ma] = value
if value > maxUtilisation:
maxUtilisation = value
#maxUtilisation += 10 - maxUtilisation%10
maList = []
for sp in G.SPs:
for ma in G.SPlist[sp]:
maList.append(ma)
for Bweek, bottleneckData in by_week.items():
series = []
if len(maList)<=10:
ticks = list(enumerate(maList))
else:
ticks = list(enumerate(range(len(maList))))
options = {
"xaxis": {
"minTickSize": 1,
"ticks": ticks,
"axisLabel": "MAs"
},
"yaxis": {
"min": 0,
"max": round(maxUtilisation),
"axisLabel": "Utilisation %"
},
"legend": {
"backgroundOpacity": 0.1,
"position":"se",
},
"series": {
"bars": {
"show": True,
"barWidth": 0.70,
"order": 1,
"align": "center"
},
"stack": False
}
}
weekLabel = "%s %s" % (str(Bweek[0]), str(Bweek[1]))
bottleNeckUtilizationDict[weekLabel] = {
"series": series,
"options": options
}
# create the 3 bars
series.append({
"label": '',
"data": list(enumerate([bottleneckData[x] for x in maList])),
"color": "blue"
})
return data return data
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment