Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Open-source code for paper: "Direct Multiple Shooting for Computationally Effici

- Activate the virtual environment: `.\.env\Scripts\activate`

- Install dependencies with: `pip install -r requirements.txt`
- Install dependencies with: `pip install -e .`
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not "dependencies" any more. I would say "Install package" (please also double-check that we indicate the right directory to run the command from).


- deactivate virtual environment by typing: `deactivate`

Expand Down
31 changes: 31 additions & 0 deletions examples/getting_started_ms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from mseetc.train import Train
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please revert this change and place this code back in ocp.py, as this re-structuring is not relevant for the PR.

from mseetc.track import Track
from mseetc.ms.ocp import casadiSolver

if __name__ == '__main__':


# Example on how to solve an OCP

train = Train(config={'id':'NL_Intercity_VIRM6', 'max deceleration':None, 'max acceleration':{'unit':'m/s^2', 'value':0.45}}, pathJSON='../trains')

track = Track(config={'id':'00_var_speed_limit_100'}, pathJSON='../tracks')

opts = {'numIntervals':200, 'integrationMethod':'RK', 'integrationOptions':{'numApproxSteps':1}, 'energyOptimal':True}

solver = casadiSolver(train, track, opts)

df, stats = solver.solve(1541)

# print some info
if df is not None:

print("")
print("Objective value = {:.2f} {}".format(stats['Cost'], 'kWh' if solver.opts.energyOptimal else 's'))
print("")
print("Maximum acceleration: {:5.2f}, with bound {}".format(df.max()['Acceleration [m/s^2]'], train.accMax if train.accMax is not None else 'None'))
print("Maximum deceleration: {:5.2f}, with bound {}".format(df.min()['Acceleration [m/s^2]'], train.accMin if train.accMin is not None else 'None'))

else:

print("Solver failed!")
Empty file added mseetc/__init__.py
Empty file.
1 change: 0 additions & 1 deletion data.py → mseetc/data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

def dataLosses():

configA = {
Expand Down
3 changes: 1 addition & 2 deletions efficiency.py → mseetc/efficiency.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@

import numpy as np
import pandas as pd
import casadi as ca

from data import dataLosses
from .data import dataLosses

def forceToLoad(force, velocity, forceMax, powerMax):
"Convert force [N] to load [%] (force must be positive)."
Expand Down
37 changes: 3 additions & 34 deletions ocp.py → mseetc/ms/ocp.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
import pandas as pd
import casadi as ca

from train import *
from ..train import *
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would - for now - undo the nested ms folder and update the imports (from .track instead of from ..track)


from track import computeDiscretizationPoints
from ..track import computeDiscretizationPoints

from utils import Options, var, postProcessDataFrame, splitLosses
from ..utils import Options, var, postProcessDataFrame, splitLosses


class OptionsCasadiSolver(Options):
Expand Down Expand Up @@ -407,34 +407,3 @@ def solve(self, terminalTime, initialTime=0, terminalVelocity=1, initialVelocity
df = postProcessDataFrame(df, self.points, self.train)

return df, stats


if __name__ == '__main__':

from train import Train
from track import Track

# Example on how to solve an OCP

train = Train(config={'id':'NL_intercity_VIRM6', 'max deceleration':None, 'max acceleration':{'unit':'m/s^2', 'value':0.45}})

track = Track(config={'id':'00_var_speed_limit_100'})

opts = {'numIntervals':200, 'integrationMethod':'RK', 'integrationOptions':{'numApproxSteps':1}, 'energyOptimal':True}

solver = casadiSolver(train, track, opts)

df, stats = solver.solve(1541)

# print some info
if df is not None:

print("")
print("Objective value = {:.2f} {}".format(stats['Cost'], 'kWh' if solver.opts.energyOptimal else 's'))
print("")
print("Maximum acceleration: {:5.2f}, with bound {}".format(df.max()['Acceleration [m/s^2]'], train.accMax if train.accMax is not None else 'None'))
print("Maximum deceleration: {:5.2f}, with bound {}".format(df.min()['Acceleration [m/s^2]'], train.accMin if train.accMin is not None else 'None'))

else:

print("Solver failed!")
2 changes: 1 addition & 1 deletion track.py → mseetc/track.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import numpy as np
import pandas as pd

from utils import checkTTOBenchVersion, convertUnit
from .utils import checkTTOBenchVersion, convertUnit

def importTuples(tuples, xLabel, yLabels):
"""
Expand Down
2 changes: 1 addition & 1 deletion train.py → mseetc/train.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import numpy as np
import casadi as ca

from utils import Options, checkTTOBenchVersion, convertUnit, splitLosses
from .utils import Options, checkTTOBenchVersion, convertUnit, splitLosses

class Train():

Expand Down
4 changes: 2 additions & 2 deletions utils.py → mseetc/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ def postProcessDataFrame(dfIn, points, train, CVODES=True, integrateLosses=False

elif integrateLosses:

from train import TrainIntegrator
from .train import TrainIntegrator

trainIntegrator = TrainIntegrator(train.exportModel(), 'RK')
powTr, powRgb = splitLosses(train.powerLosses)
Expand Down Expand Up @@ -295,7 +295,7 @@ def postProcessDataFrame(dfIn, points, train, CVODES=True, integrateLosses=False

if integrateRollingResistance:

from train import TrainIntegrator
from .train import TrainIntegrator

trainIntegrator = TrainIntegrator(train.exportModel(), 'RK')
trainIntegrator.initRollingResistance(solver='CVODES')
Expand Down
Binary file removed requirements.txt
Binary file not shown.
13 changes: 13 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from setuptools import setup, find_packages

setup(
name='mseetc',
version='0.0.1',
url='https://github.com/dkouzoup/ms-eetc.git',
author='Dimitris Kouzoupis',
description='Multiple shooting for computationally \
efficient train trajectory optimization',
packages=find_packages(),
install_requires=['numpy == 1.22.2', 'pandas == 1.4.0', \
'casadi==3.6.3', 'matplotlib==3.5.1', 'progressbar2'],
)
8 changes: 4 additions & 4 deletions simulations/figure10.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
import pandas as pd
import matplotlib.pyplot as plt

from train import Train
from track import Track
from ocp import casadiSolver
from mseetc.train import Train
from mseetc.track import Track
from mseetc.ms.ocp import casadiSolver

from utils import latexify
from mseetc.utils import latexify

vMin = 1

Expand Down
9 changes: 3 additions & 6 deletions simulations/figure2.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import sys
sys.path.append('..')

import numpy as np

import matplotlib.pyplot as plt

from utils import latexify, show, saveFig
from train import Train
from efficiency import motorLossesFunction, loadToForce
from mseetc.utils import latexify, show, saveFig
from mseetc.train import Train
from mseetc.efficiency import motorLossesFunction, loadToForce


def plotSplines(train, data):
Expand Down
9 changes: 3 additions & 6 deletions simulations/figure3.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import sys
sys.path.append('..')

import numpy as np

import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox

from utils import latexify, show, saveFig
from efficiency import loadToForce, totalLossesFunction
from mseetc.utils import latexify, show, saveFig
from mseetc.efficiency import loadToForce, totalLossesFunction


def plotSpline(loads, velocities, splineFun, forceMax, powerMax, axObj=None, type='3d'):
Expand Down Expand Up @@ -99,7 +96,7 @@ def plotSplines(loads, velocities, splineFun1, splineFun2, forceMax, powerMax, p

if __name__ == '__main__':

from train import Train
from mseetc.train import Train

train = Train(config={'id':'NL_Intercity_VIRM6'}, pathJSON='../trains')

Expand Down
7 changes: 2 additions & 5 deletions simulations/figure4.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
import sys
sys.path.append('..')

import pandas as pd
import numpy as np
import casadi as ca

import matplotlib.pyplot as plt

from utils import vecToNum, IVP, latexify, show, saveFig
from train import Train, TrainIntegrator
from mseetc.utils import vecToNum, IVP, latexify, show, saveFig
from mseetc.train import Train, TrainIntegrator


if __name__ == '__main__':
Expand Down
13 changes: 5 additions & 8 deletions simulations/figure5.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import sys
sys.path.append('..')

import json

import matplotlib.pyplot as plt

from ocp import casadiSolver
from train import Train
from track import Track
from utils import latexify, show, saveFig, postProcessDataFrame
from efficiency import totalLossesFunction
from mseetc.ms.ocp import casadiSolver
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from mseetc.ocp (many occurances)

from mseetc.train import Train
from mseetc.track import Track
from mseetc.utils import latexify, show, saveFig, postProcessDataFrame
from mseetc.efficiency import totalLossesFunction


def plot(df0b_list, df1b_list, df2b_list, tp, figSize=None, filename=None):
Expand Down
13 changes: 5 additions & 8 deletions simulations/figure6.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import sys
sys.path.append('..')

import json

import numpy as np
import matplotlib.pyplot as plt

from utils import postProcessDataFrame, latexify, show, saveFig
from train import Train
from track import Track, computeAltitude
from ocp import casadiSolver
from efficiency import totalLossesFunction
from mseetc.utils import postProcessDataFrame, latexify, show, saveFig
from mseetc.train import Train
from mseetc.track import Track, computeAltitude
from mseetc.ms.ocp import casadiSolver
from mseetc.efficiency import totalLossesFunction


def plotThreeTrajectories(df0, df1, df2, withSpeedLimits=False, withAltitude=False, figSize=None, \
Expand Down
2 changes: 1 addition & 1 deletion simulations/figure7.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from figure6 import runSimulation

from utils import latexify, show, saveFig
from mseetc.utils import latexify, show, saveFig


def plotColormapZV(df_perfect, df_static, df_dynamic, train, figSize=None, filename=None):
Expand Down
13 changes: 5 additions & 8 deletions simulations/table3.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import sys
sys.path.append('..')

import json

import pandas as pd

from utils import postProcessDataFrame
from train import Train
from track import Track
from ocp import casadiSolver
from efficiency import totalLossesFunction
from mseetc.utils import postProcessDataFrame
from mseetc.train import Train
from mseetc.track import Track
from mseetc.ms.ocp import casadiSolver
from mseetc.efficiency import totalLossesFunction


if __name__ == '__main__':
Expand Down
12 changes: 5 additions & 7 deletions unitTests/curvatureResistance/curvatureResistance.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,10 @@
import sys
import unittest

sys.path.append('../..')

from efficiency import totalLossesFunction
from ocp import casadiSolver
from train import Train
from track import Track
from mseetc.efficiency import totalLossesFunction
from mseetc.ocp import casadiSolver
from mseetc.train import Train
from mseetc.track import Track


class TestCurvatureResistance(unittest.TestCase):
Expand Down Expand Up @@ -290,4 +288,4 @@ def testClothoidApproximation(self):

if __name__ == '__main__':

unittest.main()
unittest.main()