-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_functions.py
117 lines (100 loc) · 3.37 KB
/
test_functions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import torch
import numpy as np
import warnings
import LassoBench
from pathlib import Path
import os
warnings.filterwarnings("ignore")
root_dir = str(Path(os.getcwd()).parent.absolute())
class TestFunction:
def evaluate(self,x):
pass
def l2cost(x, point):
return 10 * np.linalg.norm(x - point, 1)
class ackley_proposed_sphere(TestFunction):
def __init__(self, low_dim, device, radius=1):
self.low_dim = low_dim
self.radius = radius
self.device = device
def evaluate(self, x):
z = x[0][:self.low_dim+1]
z = self.radius * z/torch.linalg.norm(z,ord=2)
n = len(z)
S = 0
M = 0
for i in range(n):
S += z[i]**2
S = -0.2*torch.sqrt(S/n)
for i in range(n):
M += torch.cos(2*torch.pi*z[i])
M = torch.exp(M/n)
return -20 * torch.exp(S) - M + torch.exp(torch.tensor(1,device=self.device)) + 20 + torch.normal(0,0.1,(1,),device=self.device)
class ackley_proposed_mix(TestFunction):
def __init__(self, low_dim, device):
self.low_dim = low_dim
self.device = device
def evaluate(self, x):
z = x[0][:20]
for i in range(0,10,2):
norm_z = torch.linalg.norm(z[i:i+2], ord = 2)
z[i:i+2] = z[i:i+2]/norm_z
n = len(z)
S = 0
M = 0
for i in range(n):
S += z[i]**2
S = -0.2*torch.sqrt(S/n)
for i in range(n):
M += torch.cos(2*torch.pi*z[i])
M = torch.exp(M/n)
return -20 * torch.exp(S) - M + torch.exp(torch.tensor(1,device=self.device)) + 20 + torch.rand(1, device=self.device)*0.01
class hyper_proposed_sphere(TestFunction):
def __init__(self, low_dim, device, radius=1):
self.low_dim = low_dim
self.radius = radius
self.device = device
def evaluate(self, x):
z = x[0][:self.low_dim+1]
z = self.radius * z/torch.linalg.norm(z,ord=2)
n = len(z)
S = 0
for i in range(n):
for j in range(i):
S += z[j]**2
return S
class hyper_proposed_mix(TestFunction):
def __init__(self, low_dim, device):
self.low_dim = low_dim
self.device = device
def evaluate(self, x):
z = x[0][:20]
for i in range(0,10,2):
norm_z = torch.linalg.norm(z[i:i+2], ord = 2)
z[i:i+2] = z[i:i+2]/norm_z
n = len(z)
S = 0
for i in range(n):
for j in range(i):
S += z[j]**2
return S
class lasso_hard(TestFunction):
def __init__(self, device):
self.device = device
def evaluate(self,x):
# dimension of x is an even number
synt_bench = LassoBench.SyntheticBenchmark(pick_bench="synt_hard", noise=True)
z = x[0].cpu().numpy()
loss = synt_bench.evaluate(z)
return torch.tensor(loss).to(device=self.device)
class lasso_real_proposed(TestFunction):
def __init__(self, device):
self.device = device
def evaluate(self,x):
# dimension of x is an even number
synt_bench = LassoBench.RealBenchmark(pick_data="leukemia")
#d = synt_bench.n_features
z = x[0].cpu().numpy()
loss = synt_bench.evaluate(z)
#f = Mopta.MoptaSoftConstraints()
#z = (x[0].cpu().numpy() + 1)/2
return torch.tensor(loss).to(device=self.device)