/// <summary> /// Handles a data record update by adding an element to the list of data records and checking for gray box cancellation, if desired. /// </summary> /// <param name="sender">Sender object.</param> /// <param name="adapterDataRecord">The adapter data record.</param> private void HandleDataRecordUpdate(object sender, AdapterDataRecord <TResult> adapterDataRecord) { lock (this._lock) { var currentDataRecord = new DataRecord <TResult>(this._tunerDataRecord.Copy(), adapterDataRecord); if (this._useGrayBoxInCurrentEvaluation && currentDataRecord.AdapterDataRecord.TargetAlgorithmStatus == TargetAlgorithmStatus.Running && currentDataRecord.AdapterDataRecord.ExpendedWallClockTime >= this._configuration.GrayBoxStartTimePoint) { var grayBoxFeatures = this._customGrayBoxMethods.GetGrayBoxFeaturesFromDataRecord(currentDataRecord); var grayBoxConfidence = this._grayBoxRandomForest.PredictProbability(grayBoxFeatures) .Probabilities[GrayBoxUtils.GrayBoxLabelOfTimeouts]; currentDataRecord.TunerDataRecord.GrayBoxConfidence = grayBoxConfidence; if (grayBoxConfidence >= this._configuration.GrayBoxConfidenceThreshold) { this._grayBoxTargetAlgorithm.CancelByGrayBox(); LoggingHelper.WriteLine( VerbosityLevel.Info, $"Cancelled the current evaluation by gray box tuning with confidence {grayBoxConfidence:0.######}!"); } } this._listOfDataRecords.Add(currentDataRecord); } }
public void CorrectGrayBoxFeaturesAreSelected() { var gurobiGrayBoxMethods = new GurobiGrayBoxMethods(); var runtimeFeatures = new GurobiRuntimeFeatures(DateTime.Now); var instanceFeatures = new GurobiInstanceFeatures(); var adapterFeatures = GurobiUtils.ComposeAdapterFeatures(runtimeFeatures, runtimeFeatures, instanceFeatures); var adapterFeaturesHeader = GurobiUtils.ComposeAdapterFeaturesHeader(runtimeFeatures, runtimeFeatures, instanceFeatures); var result = new GurobiResult(double.NaN, TimeSpan.MaxValue, TargetAlgorithmStatus.CancelledByTimeout, false); var adapterDataRecord = new AdapterDataRecord <GurobiResult>( "Gurobi901", TargetAlgorithmStatus.Running, TimeSpan.Zero, TimeSpan.Zero, DateTime.Now, adapterFeaturesHeader, adapterFeatures, result); var tunerDataRecord = new TunerDataRecord <GurobiResult>( "Node", 0, 0, "Instance", 0.5, new[] { "Genome" }, (GenomeDoubleRepresentation) new[] { 0D }, result); var dataRecord = new DataRecord <GurobiResult>(tunerDataRecord, adapterDataRecord); var featureNames = gurobiGrayBoxMethods.GetGrayBoxFeatureNamesFromDataRecord(dataRecord); var correctFeatureNames = new[] { "ExpendedWallClockTime", "RuntimeFeature_CuttingPlanesCount_Current", "RuntimeFeature_ExploredNodeCount_Current", "RuntimeFeature_FeasibleSolutionsCount_Current", "RuntimeFeature_MipGap_Current", "RuntimeFeature_SimplexIterationsCount_Current", "RuntimeFeature_UnexploredNodeCount_Current", "RuntimeFeature_CuttingPlanesCount_Last", "RuntimeFeature_ExploredNodeCount_Last", "RuntimeFeature_FeasibleSolutionsCount_Last", "RuntimeFeature_MipGap_Last", "RuntimeFeature_SimplexIterationsCount_Last", "RuntimeFeature_UnexploredNodeCount_Last", "InstanceFeature_NumberOfIntegerVariables", "InstanceFeature_NumberOfLinearConstraints", "InstanceFeature_NumberOfNonZeroCoefficients", "InstanceFeature_NumberOfVariables", }; featureNames.SequenceEqual(correctFeatureNames).ShouldBeTrue(); }
/// <summary> /// Adds the final data record to the list of data records, if missing. /// </summary> /// <param name="finalResult">The final result.</param> private void AddFinalDataRecordIfMissing(TResult finalResult) { var lastDataRecord = this._listOfDataRecords.Last(); if (lastDataRecord.AdapterDataRecord.TargetAlgorithmStatus == TargetAlgorithmStatus.Running) { var newLastTunerDataRecord = lastDataRecord.TunerDataRecord.Copy(); newLastTunerDataRecord.GrayBoxConfidence = double.NaN; var newLastAdapterDataRecord = new AdapterDataRecord <TResult>( lastDataRecord.AdapterDataRecord.TargetAlgorithmName, finalResult.TargetAlgorithmStatus, lastDataRecord.AdapterDataRecord.ExpendedCpuTime, lastDataRecord.AdapterDataRecord.ExpendedWallClockTime, DateTime.Now, lastDataRecord.AdapterDataRecord.AdapterFeaturesHeader, lastDataRecord.AdapterDataRecord.AdapterFeatures, finalResult); var newLastDataRecord = new DataRecord <TResult>(newLastTunerDataRecord, newLastAdapterDataRecord); this._listOfDataRecords.Add(newLastDataRecord); } }