Skip to content

Commit

Permalink
* Now possible to indicate in the Init if a subsystem has variation, #33
Browse files Browse the repository at this point in the history
  • Loading branch information
MBaranskiEBC committed May 8, 2019
1 parent 75f5df8 commit 4fd6725
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 54 deletions.
3 changes: 3 additions & 0 deletions pyDMPC/ControlFramework/Init_Geo.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
IDs_inputs = []
T_set = []
Q_set = []
variation = []

""" Subsystems """
# Ground
Expand All @@ -140,6 +141,7 @@
cost_par.append("decisionVariables.y[1]")
T_set.append(285)
Q_set.append(2200)
variation.append(True)


# Building
Expand All @@ -158,3 +160,4 @@
cost_par.append("decisionVariables.y[1]")
T_set.append(295)
Q_set.append(0)
variation.append(True)
13 changes: 10 additions & 3 deletions pyDMPC/ControlFramework/Subsystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def __init__(self, name, position,
bounds_DVs,model_path, names_BCs,
num_VarsOut, names_DVs,
output_vars, initial_names, IDs_initial_values,IDs_inputs,cost_par,
T_set,Q_set, type_subSyst=None):
T_set,Q_set,variation, type_subSyst=None):
self._name = name
self._type_subSyst = type_subSyst
self._num_DVs = num_DVs
Expand All @@ -41,6 +41,7 @@ def __init__(self, name, position,
self._IDs_inputs = IDs_inputs
self.T_set = T_set
self.Q_set = Q_set
self.variation = variation


def GetNeighbour(self, neighbour_name):
Expand Down Expand Up @@ -110,7 +111,10 @@ def CalcDVvalues(self, time_step, time_storage, iter, model):
if time_step-time_storage < Init.optimization_interval and time_step != Init.sync_rate:
# Interpolation
try:
[commands, costs, outputs] = BExMoC.Interpolation(self.measurements, self.lookUpTables[1], self._bounds_DVs, self.lookUpTables[0], self.lookUpTables[2])
[commands, costs, outputs] = BExMoC.Interpolation(
self.measurements, self.lookUpTables[1],
self._bounds_DVs, self.lookUpTables[0],
self.lookUpTables[2],self.variation)

except:
commands = []
Expand All @@ -135,7 +139,10 @@ def CalcDVvalues(self, time_step, time_storage, iter, model):
sio.savemat((Init.path_res +'\\'+Init.name_wkdir + '\\' + self._name + '\\' + 'OptimizerTrack.mat' ), {'OptimizerTrackCounter11': res_grid})

try:
[commands, costs, outputs] = BExMoC.Interpolation(self.measurements, self.lookUpTables[1], self._bounds_DVs, self.lookUpTables[0], self.lookUpTables[2])
[commands, costs, outputs] = BExMoC.Interpolation(
self.measurements, self.lookUpTables[1],
self._bounds_DVs, self.lookUpTables[0],
self.lookUpTables[2], self.variation)

print('measurements: ' + str(self.measurements))
print('commands: ' +str(commands))
Expand Down
1 change: 1 addition & 0 deletions pyDMPC/ControlFramework/System.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def GenerateSubSys(self):
Init.cost_par[i],
Init.T_set[i],
Init.Q_set[i],
Init.variation[i],
Init.type_subSyst[i])
)
subsystems.sort(key = lambda x: x.position)
Expand Down
115 changes: 64 additions & 51 deletions pyDMPC/ControlFramework/algorithm/BExMoC.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ def CalcLookUpTables(s, time_storage, init_conds):
return [storage_cost, storage_DV, storage_out, exDestArr, storage_grid]


def Interpolation(measurements_SubSys, storage_DV, bounds_DVs, storage_cost, storage_out):
def Interpolation(measurements_SubSys, storage_DV, bounds_DVs, storage_cost,
storage_out, variation):
"""
Interpolate the values of the decision variables, costs and outputs
Expand All @@ -211,57 +212,69 @@ def Interpolation(measurements_SubSys, storage_DV, bounds_DVs, storage_cost, sto
Reformat the boundary conditions, decision variables, outputs and
costs
"""
cond_BC = [True if L<len(measurements_SubSys) else False for L in range(len(storage_DV[0]))]
cond_DV = [False if L<len(measurements_SubSys) else True for L in range(len(storage_DV[0]))]
cond_Out = [False if L<len(measurements_SubSys) else True for L in range(len(storage_out[0]))]
cond_Costs = cond_DV

grid_points = np.compress(cond_BC,storage_DV, axis = 1)
grid_point_values = np.compress(cond_DV,storage_DV, axis = 1)
grid_measurements = measurements_SubSys[::-1]
grid_point_values_costs = np.compress(cond_Costs,storage_cost, axis = 1)
grid_point_values_out = np.compress(cond_Out,storage_out, axis = 1)

print("Grid points:")
print(grid_points)
print("values:")
print(grid_point_values)
print("measurements:")
print(grid_measurements)

""" Interpolation of reformatted data """
try:
commands = interpolate.griddata(grid_points, grid_point_values,grid_measurements ,method='linear')
costs = interpolate.griddata(grid_points, grid_point_values_costs,grid_measurements ,method='linear')
out = interpolate.griddata(grid_points, grid_point_values_out, grid_measurements ,method='linear')

print("commands: " + str(commands))
print("costs: " + str(costs))
print("outputs: " + str(out))

# Check if commands are in range, else set to boundary values
for i, val in enumerate(commands):
if val < bounds_DVs[i]:
commands[i] = bounds_DVs[i]
print('Val < lower Bound')
elif val > bounds_DVs[i+1]:
commands[i] = bounds_DVs[i+1]
print('Val > higher Bound')
elif val >= bounds_DVs[i] and val <= bounds_DVs[i+1]:
commands[i] = val
# last case: invalid interpolation
else:
commands[i] = bounds_DVs[i]
print('interpolation failed!')
return [commands, costs, out]

except:
if variation:
cond_BC = [True if L<len(measurements_SubSys) else False for L in range(len(storage_DV[0]))]
cond_DV = [False if L<len(measurements_SubSys) else True for L in range(len(storage_DV[0]))]
cond_Out = [False if L<len(measurements_SubSys) else True for L in range(len(storage_out[0]))]
cond_Costs = cond_DV

grid_points = np.compress(cond_BC,storage_DV, axis = 1)
grid_point_values = np.compress(cond_DV,storage_DV, axis = 1)
grid_measurements = measurements_SubSys[::-1]
grid_point_values_costs = np.compress(cond_Costs,storage_cost, axis = 1)
grid_point_values_out = np.compress(cond_Out,storage_out, axis = 1)

print("Grid points:")
print(grid_points)
print("values:")
print(grid_point_values)
print("measurements:")
print(grid_measurements)

""" Interpolation of reformatted data """
try:
commands = interpolate.griddata(grid_points, grid_point_values,grid_measurements ,method='linear')
costs = interpolate.griddata(grid_points, grid_point_values_costs,grid_measurements ,method='linear')
out = interpolate.griddata(grid_points, grid_point_values_out, grid_measurements ,method='linear')

print("commands: " + str(commands))
print("costs: " + str(costs))
print("outputs: " + str(out))

# Check if commands are in range, else set to boundary values
for i, val in enumerate(commands):
if val < bounds_DVs[i]:
commands[i] = bounds_DVs[i]
print('Val < lower Bound')
elif val > bounds_DVs[i+1]:
commands[i] = bounds_DVs[i+1]
print('Val > higher Bound')
elif val >= bounds_DVs[i] and val <= bounds_DVs[i+1]:
commands[i] = val
# last case: invalid interpolation
else:
commands[i] = bounds_DVs[i]
print('interpolation failed!')

except:
commands = []
costs = []
out = []

for i in range(0,len(storage_DV)):
commands.append(storage_DV[0,0])
costs.append(0)
out.append(0)
print('interpolation failed!')

else:
commands = []
costs = []
out = []

for i in range(0,len(storage_DV)):
commands.append(storage_DV[0,0])
costs.append(0)
out.append(0)
print('interpolation failed!')
commands.append(storage_DV[0,2])
costs.append(storage_cost[0,2])
out.append(storage_out[0,2])

return [commands, costs, out]

0 comments on commit 4fd6725

Please sign in to comment.