@@ -63,12 +63,12 @@ def __init__(
63
63
)
64
64
evaluations = [] if evaluations is None else evaluations
65
65
self ._index = index
66
+ self ._gen_id = None
66
67
self ._custom_parameters = (
67
68
[] if custom_parameters is None else custom_parameters
68
69
)
69
70
self ._ignored = False
70
71
self ._ignored_reason = None
71
-
72
72
# Add custom parameters as trial attributes.
73
73
for param in self ._custom_parameters :
74
74
setattr (self , param .name , None )
@@ -81,6 +81,76 @@ def __init__(
81
81
self ._mapped_evaluations [ev .parameter .name ] = ev
82
82
self .mark_as (TrialStatus .CANDIDATE )
83
83
84
+ def to_dict (self ) -> Dict :
85
+ """Convert the trial to a dictionary."""
86
+ trial_dict = {
87
+ ** self .parameters_as_dict (),
88
+ ** self .objectives_as_dict (),
89
+ ** self .analyzed_parameters_as_dict (),
90
+ ** self .custom_parameters_as_dict (),
91
+ "_id" : self ._gen_id ,
92
+ "_ignored" : self ._ignored ,
93
+ "_ignored_reason" : self ._ignored_reason ,
94
+ "_status" : self ._status ,
95
+ }
96
+
97
+ return trial_dict
98
+
99
+ @classmethod
100
+ def from_dict (
101
+ cls ,
102
+ trial_dict : Dict ,
103
+ varying_parameters : List [VaryingParameter ],
104
+ objectives : List [Objective ],
105
+ analyzed_parameters : List [Parameter ],
106
+ custom_parameters : Optional [List [TrialParameter ]] = None ,
107
+ ) -> "Trial" :
108
+ """Create a trial from a dictionary.
109
+
110
+ Parameters
111
+ ----------
112
+ trial_dict : dict
113
+ Dictionary containing the trial information.
114
+ varying_parameters : list of VaryingParameter
115
+ The varying parameters of the optimization.
116
+ objectives : list of Objective
117
+ The optimization objectives.
118
+ analyzed_parameters : list of Parameter, optional
119
+ Additional parameters to be analyzed during the optimization.
120
+ custom_parameters : list of TrialParameter, optional
121
+ Additional parameters needed to identify or carry out the trial, and
122
+ which will be included in the optimization history.
123
+ """
124
+ # Prepare values of the input parameters
125
+ parameter_values = [trial_dict [var .name ] for var in varying_parameters ]
126
+ # Prepare evaluations
127
+ evaluations = [
128
+ Evaluation (parameter = par , value = trial_dict [par .name ])
129
+ for par in objectives + analyzed_parameters
130
+ if par .name in trial_dict
131
+ ]
132
+ # Create the trial object
133
+ trial = cls (
134
+ varying_parameters = varying_parameters ,
135
+ objectives = objectives ,
136
+ analyzed_parameters = analyzed_parameters ,
137
+ parameter_values = parameter_values ,
138
+ evaluations = evaluations ,
139
+ custom_parameters = custom_parameters ,
140
+ )
141
+ if "_id" in trial_dict :
142
+ trial ._gen_id = trial_dict ["_id" ]
143
+ if "_ignored" in trial_dict :
144
+ trial ._ignored = trial_dict ["_ignored" ]
145
+ if "_ignored_reason" in trial_dict :
146
+ trial ._ignored_reason = trial_dict ["_ignored_reason" ]
147
+ if "_status" in trial_dict :
148
+ trial ._status = trial_dict ["_status" ]
149
+ for custom_param in custom_parameters :
150
+ setattr (trial , custom_param .name , trial_dict [custom_param .name ])
151
+
152
+ return trial
153
+
84
154
@property
85
155
def varying_parameters (self ) -> List [VaryingParameter ]:
86
156
"""Get the list of varying parameters."""
@@ -129,6 +199,15 @@ def index(self) -> int:
129
199
def index (self , value ):
130
200
self ._index = value
131
201
202
+ @property
203
+ def gen_id (self ) -> int :
204
+ """Get the index of the trial."""
205
+ return self ._gen_id
206
+
207
+ @gen_id .setter
208
+ def gen_id (self , value ):
209
+ self ._gen_id = value
210
+
132
211
@property
133
212
def ignored (self ) -> bool :
134
213
"""Get whether the trial is ignored by the generator."""
@@ -225,7 +304,8 @@ def objectives_as_dict(self) -> Dict:
225
304
params = {}
226
305
for obj in self ._objectives :
227
306
ev = self ._mapped_evaluations [obj .name ]
228
- params [obj .name ] = (ev .value , ev .sem )
307
+ if ev is not None :
308
+ params [obj .name ] = ev .value
229
309
return params
230
310
231
311
def analyzed_parameters_as_dict (self ) -> Dict :
@@ -237,5 +317,13 @@ def analyzed_parameters_as_dict(self) -> Dict:
237
317
params = {}
238
318
for par in self ._analyzed_parameters :
239
319
ev = self ._mapped_evaluations [par .name ]
240
- params [par .name ] = (ev .value , ev .sem )
320
+ if ev is not None :
321
+ params [par .name ] = ev .value
322
+ return params
323
+
324
+ def custom_parameters_as_dict (self ) -> Dict :
325
+ """Get a mapping between names and values of the custom parameters."""
326
+ params = {}
327
+ for param in self ._custom_parameters :
328
+ params [param .name ] = getattr (self , param .name )
241
329
return params
0 commit comments