Source code for quinn.func.funcs

#!/usr/bin/env python
"""Various analytical functions for testing the methods."""

import numpy as np



[docs] def blundell(xx, datanoise=0.0): r"""Classical example from :cite:t:`blundell:2015`. .. math:: f(x)=x+0.3 \sin(2\pi(x+\sigma\:{\cal N}(0,1)))+0.3 \sin(4\pi(x+\sigma\:{\cal N}(0,1)))+\sigma\:{\cal N}(0,1) Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise, both on the input and output. Returns: np.ndarray: Output array of size `(N,d)`. Note: This function is typically used in `d=1` setting. """ noise = datanoise * np.random.randn(xx.shape[0], xx.shape[1]) yy = xx + 0.3 * np.sin(2. * np.pi * (xx + noise)) + 0.3 * \ np.sin(4. * np.pi * (xx + noise)) + noise return yy
[docs] def Sine(xx, datanoise=0.0): r"""Simple sum of sines function .. math:: f(x)=\sin(x_1)+...+\sin(x_d) + \sigma \: {\cal N} (0,1) Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise. Returns: np.ndarray: Output array of size `(N,1)`. """ yy = datanoise * np.random.randn(xx.shape[0], 1) yy += np.sum(np.sin(xx), axis=1).reshape(-1, 1) return yy
[docs] def Summation(xx, datanoise=0.0): r"""Summation function. .. math:: f(x)=x_1 + x_2 + \dots + x_d + \sigma \: {\cal N} (0,1) Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise, both on the input and output. Returns: np.ndarray: Output array of size `(N,d)`. """ yy = datanoise * np.random.randn(xx.shape[0], 1) yy += np.sum(xx, axis=1).reshape(-1, 1) return yy
[docs] def Sine10(xx, datanoise=0.02): r"""Sum of sines function with 10 outputs .. math:: f_1(x)=\sin(x_1)+...+\sin(x_d) + \sigma \: {\cal N} (0,1)\\ \dots \qquad\qquad\qquad\qquad\\ f_{10}(x)=\sin(x_1)+...+\sin(x_d) + \sigma \: {\cal N} (0,1) Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise. Returns: np.ndarray: Output array of size `(N,10)`. """ yy = datanoise * np.random.randn(xx.shape[0], 10) yy += np.sum(np.sin(xx), axis=1).reshape(-1, 1) return yy
[docs] def Ackley(x, datanoise=0.02): r"""Ackley4 or Modified Ackley function from https://arxiv.org/pdf/1308.4008v1.pdf. .. math:: f(x)=\sum_{i=1}^{d-1} \left(\exp(-0.2)\sqrt{x_i^2+x_{i+1}^2} + 3 (\cos{2x_i}+\sin{2x_{i+1}})\right) + \sigma \: {\cal N} (0,1) Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise. Returns: np.ndarray: Output array of size `(N,1)`. """ yy = datanoise * np.random.randn(x.shape[0],) ndim = x.shape[1] for i in range(ndim - 1): yy += np.exp(-0.2) * np.sqrt(x[:, i]**2 + x[:, i + 1]**2) + \ 3 * (np.cos(2 * x[:, i]) + np.sin(2 * x[:, i + 1])) return yy.reshape(-1, 1)
[docs] def x5(xx, datanoise=0.0): r"""Fifth power function. Args: xx (np.ndarray): Input array :math:`x` of size `(N,d)`. datanoise (float, optional): Standard deviation :math:`\sigma` of i.i.d. gaussian noise. """ yy = datanoise * np.random.randn(xx.shape[0], 1) yy += xx[:, 0].reshape(-1, 1)**5 return yy