Algorithms for Smoothed Online Convex Optimization

Smoothed Online Convex Optimization (SOCO) is the problem of choosing a sequence of points in some decision space minimizing a hitting cost which is paid for choosing a point and which changes in-between rounds as well as a movement cost that is paid for movement in the decision space.

Thus, SOCO can be understood as online convex optimization with an additional smoothing element.

A special focus of this work is the application to the dynamic right-sizing of data centers.

Thesis, Presentation (with animations), Documentation


The following is a result of my undergraduate thesis work at TUM under the supervision of Prof. Dr. Susanne Albers and advised by Jens Quedenfeld.


The top-level folders are described as follows:

folder description
analysis empirical evaluation of the implemented algorithms in the application of dynamically right-sizing data centers
implementation implementation of the algorithms
thesis source files of the thesis and the presentation


The implementation can mainly be broken down into three separate parts.

To achieve optimal performance, everything is implemented in Rust and heavily parallelized. Python bindings are included to interface with the streaming and data center model components.



The Rust crate is contained in the implementation directory. See the relevant development section there.


The analysis directory contains the case studies with real-world data. It requires the Python bindings for the soco crate. See the relevant prerequisites section for more information.


We warmly welcome everyone who is intersted in contributing. Please reference our Code of Conduct.


Here you can find details on all past releases. Unreleased breaking changes that are on the current master can be found here.

acts_as_favoritor follows Semantic Versioning 2.0 as defined at Reference the security policy.


  1. Review breaking changes and deprecations in
  2. Change version in implementation/Cargo.toml.
  3. Reset
  4. Create a pull request to merge the changes into main.
  5. After the pull request was merged, create a new release listing the breaking changes and commits on main since the last release.
  6. The release workflow will publish the crate to