diff --git a/examples/regulator_1D/build.bat b/examples/regulator_1D/build.bat new file mode 100644 index 0000000000000000000000000000000000000000..91702438531219e8ab3d3eb8ef1b81f6625f335e --- /dev/null +++ b/examples/regulator_1D/build.bat @@ -0,0 +1,11 @@ +set problem_dir=%~dp0 +set bocop_root_path=..\..\.. + +rmdir /s /q build +mkdir build +cd build + +cmake -G "NMake Makefiles" -DPROBLEM_DIR=%problem_dir% %bocop_root_path% +nmake + +cd.. diff --git a/examples/regulator_1D/build.sh b/examples/regulator_1D/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..5048513173d439d24969a2c49a1b12eec7a9462d --- /dev/null +++ b/examples/regulator_1D/build.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +## shell script for Bocop build +## Pierre Martinon, Inria +## 2020 + +## set build folder +mkdir -p build +cd build + +## default cmake options +BOCOP_ROOT_PATH="../../../" +buildtype="Release" + +## set specific cmake options +while getopts ds option +do +case "${option}" in +d) buildtype="Debug";; +esac +done + +## launch cmake, make and go back to problem folder +KERNEL=`uname -s` +if [[ "$KERNEL" == *"MINGW"* ]]; then +cmake -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=${buildtype} -DPROBLEM_DIR=${PWD}/.. ${BOCOP_ROOT_PATH} +else +cmake -DCMAKE_BUILD_TYPE=${buildtype} -DPROBLEM_DIR=${PWD}/.. ${BOCOP_ROOT_PATH} +fi +status=$? +if [ "$status" -eq "0" ]; then +make -j +status=$? +fi +cd - + +exit $status diff --git a/examples/regulator_1D/problem.cpp b/examples/regulator_1D/problem.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8c9d756bf8971732f0ff75bbc732067a4c1651ef --- /dev/null +++ b/examples/regulator_1D/problem.cpp @@ -0,0 +1,56 @@ + + + +// +++DRAFT+++ This class implements the OCP functions +// It derives from the generic class bocop3OCPBase +// OCP functions are defined with templates since they will be called +// from both the NLP solver (double arguments) and AD tool (ad_double arguments) +//#pragma once + +#include <OCP.h> + +// /////////////////////////////////////////////////////////////////// + + +template <typename Variable> +inline void OCP::finalCost(double initial_time, double final_time, const Variable *initial_state, const Variable *final_state, const Variable *parameters, const double *constants, Variable &final_cost) +{ + final_cost = final_state[1]; +} + +template <typename Variable> +inline void OCP::dynamics(double time, const Variable *state, const Variable *control, const Variable *parameters, const double *constants, Variable *state_dynamics) +{ + state_dynamics[0] = control[0]; + state_dynamics[1] = state[0]*state[0]; +} + +template <typename Variable> +inline void OCP::boundaryConditions(double initial_time, double final_time, const Variable *initial_state, const Variable *final_state, const Variable *parameters, const double *constants, Variable *boundary_conditions) +{ + boundary_conditions[0] = initial_state[0]; + boundary_conditions[1] = initial_state[1]; + boundary_conditions[2] = final_state[0]; +} + +template <typename Variable> +inline void OCP::pathConstraints(double time, const Variable *state, const Variable *control, const Variable *parameters, const double *constants, Variable *path_constraints) +{ +} + +void OCP::preProcessing() +{} + +// /////////////////////////////////////////////////////////////////// +// explicit template instanciation for template functions, with double and double_ad +// +++ could be in an included separate file ? +// but needs to be done for aux functions too ? APPARENTLY NOT ! +template void OCP::finalCost<double>(double initial_time, double final_time, const double *initial_state, const double *final_state, const double *parameters, const double *constants, double &final_cost); +template void OCP::dynamics<double>(double time, const double *state, const double *control, const double *parameters, const double *constants, double *state_dynamics); +template void OCP::boundaryConditions<double>(double initial_time, double final_time, const double *initial_state, const double *final_state, const double *parameters, const double *constants, double *boundary_conditions); +template void OCP::pathConstraints<double>(double time, const double *state, const double *control, const double *parameters, const double *constants, double *path_constraints); + +template void OCP::finalCost<double_ad>(double initial_time, double final_time, const double_ad *initial_state, const double_ad *final_state, const double_ad *parameters, const double *constants, double_ad &final_cost); +template void OCP::dynamics<double_ad>(double time, const double_ad *state, const double_ad *control, const double_ad *parameters, const double *constants, double_ad *state_dynamics); +template void OCP::boundaryConditions<double_ad>(double initial_time, double final_time, const double_ad *initial_state, const double_ad *final_state, const double_ad *parameters, const double *constants, double_ad *boundary_conditions); +template void OCP::pathConstraints<double_ad>(double time, const double_ad *state, const double_ad *control, const double_ad *parameters, const double *constants, double_ad *path_constraints); diff --git a/examples/regulator_1D/problem.def b/examples/regulator_1D/problem.def new file mode 100644 index 0000000000000000000000000000000000000000..26c5bf5b1fdef46aeb90de2ee49294d21522f5fc --- /dev/null +++ b/examples/regulator_1D/problem.def @@ -0,0 +1,47 @@ +# Definition file + +# Dimensions +dim.state 2 +dim.control 1 +dim.boundaryconditions 3 +dim.pathconstraints 0 +dim.parameters 0 +dim.constants 0 + +# Time interval +initial.time 0 +final.time 2 + +# Constants + +# Time discretisation +ode.discretization midpoint_implicit +time.steps 100 + +# Bounds for constraints +boundarycond.0.lowerbound 1 +boundarycond.0.upperbound 1 +boundarycond.1.lowerbound 0 +boundarycond.1.upperbound 0 +boundarycond.2.lowerbound 0.5 +boundarycond.2.upperbound 0.5 + +# Bounds for variables +control.0.lowerbound -1 +control.0.upperbound 1 + +# Initialization for discretized problem +state.0.init 0.1 +state.1.init 0.1 +control.0.init 0.1 + +# Names + +# Ipopt +ipoptIntOption.print_level 5 +ipoptIntOption.max_iter 1000 +ipoptStrOption.mu_strategy adaptive +ipoptNumOption.tol 1e-12 + +# Misc +ad.retape 0 diff --git a/examples/regulator_1D/regulator_1D.ipynb b/examples/regulator_1D/regulator_1D.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c139ded8f842aec14d6ba793b150cf113f0003e0 --- /dev/null +++ b/examples/regulator_1D/regulator_1D.ipynb @@ -0,0 +1,101 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "noted-ethernet", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4e7d461b079745b38eb890c6207ac1d1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(IntSlider(value=14, continuous_update=False, description='iteration', max=14), Output())…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done\n", + "Loading solution: /home/martinon/bocop/bocop3/bocop/examples/regulator_1D/problem.sol\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 3 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 3 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "<bocop.bocop.dOCPSolution at 0x7f3d45b81850>" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import bocop\n", + "bocop.solve('.')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "previous-victory", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}