diff options
Diffstat (limited to 'klippy/mathutil.py')
-rw-r--r-- | klippy/mathutil.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/klippy/mathutil.py b/klippy/mathutil.py new file mode 100644 index 00000000..d8df3539 --- /dev/null +++ b/klippy/mathutil.py @@ -0,0 +1,40 @@ +# Simple math helper functions +# +# Copyright (C) 2018 Kevin O'Connor <kevin@koconnor.net> +# +# This file may be distributed under the terms of the GNU GPLv3 license. +import logging + +# Helper code that implements coordinate descent +def coordinate_descent(adj_params, params, error_func): + # Define potential changes + params = dict(params) + dp = {param_name: 1. for param_name in adj_params} + # Calculate the error + best_err = error_func(params) + + threshold = 0.00001 + rounds = 0 + + while sum(dp.values()) > threshold and rounds < 10000: + rounds += 1 + for param_name in adj_params: + orig = params[param_name] + params[param_name] = orig + dp[param_name] + err = error_func(params) + if err < best_err: + # There was some improvement + best_err = err + dp[param_name] *= 1.1 + continue + params[param_name] = orig - dp[param_name] + err = error_func(params) + if err < best_err: + # There was some improvement + best_err = err + dp[param_name] *= 1.1 + continue + params[param_name] = orig + dp[param_name] *= 0.9 + logging.info("Coordinate descent best_err: %s rounds: %d", best_err, rounds) + return params |