Metadata-Version: 2.1
Name: pyrotor
Version: 1.0.0
Summary: Trajectory optimization package based on data
Home-page: https://github.com/bguedj/pyrotor
Author-email: arthur.talpaert@isen.yncrea.fr
License: MIT
Platform: UNKNOWN
Description-Content-Type: text/markdown
Requires-Dist: cvxopt (==1.2.4)
Requires-Dist: numpy (==1.19.1)
Requires-Dist: pandas (==0.25.3)
Requires-Dist: scipy (==1.5.2)
Requires-Dist: mock (==3.0.5)
Requires-Dist: pytest (==5.3.1)
Requires-Dist: pickleshare (==0.7.5)
Requires-Dist: scikit-learn (==0.23.2)
Requires-Dist: sphinx (==2.3.1)
Requires-Dist: recommonmark (==0.6.0)
Requires-Dist: sphinx-rtd-theme (==0.5.0)


[![](https://travis-ci.com/bguedj/pyrotor.svg?token=mBozP3BYCpx6zxMpJQAQ&branch=master)](https://travis-ci.com/github/bguedj/pyrotor)

# pyrotor
*Trajectory optimization package based on data*

- - - -
### Installation

```Bash
$ pip install pyrotor
```

- - - -
### Getting started
```Python
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from glob import glob
import pyrotor


# Define setting

# Define quadratic cost function
# Quadratic part
q = np.array([[1,0],
             [0,1]])
# Linear part
w = np.array([0,0])

# Constant part
c = 2.87

quadratic_model = [c, w, q]


# Define initial and final states
endpoints = {'x1': {'start': .1,
                    'end': .9,
                    'delta': .01},
             'x2': {'start': .828,
                    'end': .172,
                    'delta': .01}}
# Define independent variable (time)

independent_variable = {'start': .1,
                        'end': .9,
                        'frequency': .01}
# Compute number of evaluation points
delta_time = independent_variable['end'] - independent_variable['start']
delta_time /= independent_variable['frequency']
independent_variable['points_nb'] = int(delta_time) + 1


# Define constraints

# x1 > 0
def f1(data):
    x1 = data["x1"].values
    return x1

# x1 < 1
def f2(data):
    x1 = data["x1"].values
    return 1 - x1

# x2 > 0
def f3(data):
    x2 = data["x2"].values
    return x2

# x2 < 1
def f4(data):
    x2 = data["x2"].values
    return 1 - x2

# x2 > f(x1)
def f5(data):
    x1 = data["x1"].values
    x2 = data["x2"].values
    return x2 - 150/19 * (1-x1)**3 + 225/19 * (1-x1)**2 - 100/19 * (1-x1) + 79/190

constraints = [f1, f2, f3, f4, f5]


# Define functional basis

# Basis name
basis = 'legendre'
# Dimension for each variable
basis_dimension = {'x1': 3,
                   'x2': 5}

# Import reference trajectories

reference_trajectories = pyrotor.datasets.load_toy_dataset()

# Optimization

# Create PyRotor class

mr_pyrotor = pyrotor.Pyrotor(quadratic_model,
                             reference_trajectories,
                             endpoints,
                             constraints,
                             basis,
                             basis_dimension,
                             independent_variable,
                             n_best_trajectory_to_use=20,
                             verbose=False)


# Execute PyRotor solver

mr_pyrotor.compute_optimal_trajectory()


# Compute savings

mr_pyrotor.compute_gains()
mr_pyrotor.compute_relative_gains()


# Plot

X = np.linspace(independent_variable['start'],
                independent_variable['end'],
                independent_variable['points_nb'])
X_ = np.linspace(0, 1, 101)
constraint_f5 = np.array([150/19 * (1-x)**3 - 225/19 * (1-x)**2 + 100/19 * (1-x) - 79/190 for x in X_])

fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(12, 20))
ax1.plot(X, mr_pyrotor.trajectory['x1'])
ax1.set_xlabel('$t$')
ax1.set_ylabel('$x_1(t)$')
ax2.plot(X, mr_pyrotor.trajectory['x2'])
ax2.set_xlabel('$t$')
ax2.set_ylabel('$x_2(t)$')
ax3.plot(mr_pyrotor.trajectory['x1'], mr_pyrotor.trajectory['x2'], color='b', label='Optimized trajectory')
for trajectory in mr_pyrotor.reference_trajectories:
    ax3.plot(trajectory['x1'], trajectory['x2'], linestyle=":", label='_nolegend_')
ax3.fill_between(X_, 0, constraint_f5, color='r', alpha=.5, label='Forbidden area')
ax3.set_xlabel('$x_1$')
ax3.set_ylabel('$x_2$')
ax3.set_xlim(left=0, right=1)
ax3.set_ylim(bottom=0, top=1)
ax3.legend()
plt.tight_layout()
plt.show()
```


