Skip to content
This repository has been archived by the owner on Jan 12, 2025. It is now read-only.

Commit

Permalink
20170224 Add Multi-Objective Global Optimization (MOGO) as new class
Browse files Browse the repository at this point in the history
  • Loading branch information
Lazloo committed Feb 24, 2017
1 parent 1c3fa6b commit 84cb779
Show file tree
Hide file tree
Showing 15 changed files with 289 additions and 28 deletions.
9 changes: 7 additions & 2 deletions dependencies/@AnalyzeKriging/AnalyzeKriging.m
Original file line number Diff line number Diff line change
Expand Up @@ -979,8 +979,13 @@
end
% -----------------------------------------------------------------
function [] = setColormapToolbox(obj,varargin)
% Set color map. if "ColormapToolbox" is empty, default
% colormap is created
% Set color map.
%
% Possible Input:
% - 'ColormapToolbox' is empty, default colormap is created.
% - 'FZJ' is chosen, a blue colormap is used
% - nColorX3 matrix. For more information see matlab
% documentrary "colormap"

% Check input
if isempty(varargin)||isempty(varargin{1})
Expand Down
4 changes: 2 additions & 2 deletions dependencies/@AnalyzeKriging/plotInterpolation_nD.m
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,9 @@
case 'KrigingInterpolation'
title(obj.getKrigingObjectNames{KrigingObjectIndex},'FontSize',20)
case 'ExpectedImprovement'
title(sprintf('Exp. Improvement: %s',obj.getKrigingObjectNames{KrigingObjectIndex}),'FontSize',20)
title(sprintf('Exp. Improvement: %s',obj.getKrigingObjectNames{KrigingObjectIndex}{1}),'FontSize',20)
case 'Optimum'
title(sprintf('Plateau Plot: %s',obj.getKrigingObjectNames{KrigingObjectIndex}),'FontSize',20)
title(sprintf('Plateau Plot: %s',obj.getKrigingObjectNames{KrigingObjectIndex}{1}),'FontSize',20)
otherwise
error('Unknown plotting objective')
end
Expand Down
20 changes: 10 additions & 10 deletions dependencies/@KrigingSuperClass/KrigingSuperClass.m
Original file line number Diff line number Diff line change
Expand Up @@ -415,14 +415,14 @@
% This function gives out the parameters of the model which is
% used for the covariance
% CovariogramModelChoice 1: parameters=[theta,sigma] covariance = obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2)
% CovariogramModelChoice 2: parameters=[theta,sigma,sigmaError] covariance =sigmaError + obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2);
% CovariogramModelChoice 3: parameters=[theta,p,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*exp(-1/2*sum(distance^obj.p),obj.theta.^2)));
% CovariogramModelChoice 4: parameters=[theta,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*exp(-1/2*sum(distance^2),obj.theta.^2)));
% CovariogramModelChoice 5: parameters=[theta,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*(1 + sqrt(3)*weightedEuclidean).*exp((-sqrt(3)*weightedEuclidean)),
% CovariogramModelChoice 2: parameters=[theta,sigma,sigmaError] covariance =sigmaError^2 + obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2);
% CovariogramModelChoice 3: parameters=[theta,p,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*exp(-1/2*sum(distance^obj.p),obj.theta.^2)));
% CovariogramModelChoice 4: parameters=[theta,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*exp(-1/2*sum(distance^2),obj.theta.^2)));
% CovariogramModelChoice 5: parameters=[theta,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*(1 + sqrt(3)*weightedEuclidean).*exp((-sqrt(3)*weightedEuclidean)),
% weightedEuclidean=sqrt(distance.^2/obj.theta^2);
% CovariogramModelChoice 6: as CovariogramModelChoice 5 but with
% weightecalcInterpolation_3DdEuclidean = sqrt(sum(distance^2/obj.theta.^2))));
% CovariogramModelChoice 7: covariance = sigmaError + obj.sigma^2*(1 + sqrt(5)*weightedEuclidean+5/3*weightedEuclidean.^2).*exp((- sqrt(5)*weightedEuclidean));
% CovariogramModelChoice 7: covariance = sigmaError^2 + obj.sigma^2*(1 + sqrt(5)*weightedEuclidean+5/3*weightedEuclidean.^2).*exp((- sqrt(5)*weightedEuclidean));
% weightedEuclidean=sqrt(distance.^2/obj.theta^2);
% CovariogramModelChoice 8: as CovariogramModelChoice 7 but with
% weightedEuclidean = sqrt(sum(distance^2/obj.theta.^2))));
Expand Down Expand Up @@ -471,14 +471,14 @@
%------------------------------------------------------------------
function [LowerBound] = getLBCovariogramModelParameters(obj)
% CovariogramModelChoice 1: parameters=[theta,sigma] covariance = obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2)
% CovariogramModelChoice 2: parameters=[theta,sigma,sigmaError] covariance =sigmaError + obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2);
% CovariogramModelChoice 3: parameters=[theta,p,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*exp(-1/2*sum(distance^obj.p),obj.theta.^2)));
% CovariogramModelChoice 4: parameters=[theta,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*exp(-1/2*sum(distance^2),obj.theta.^2)));
% CovariogramModelChoice 5: parameters=[theta,sigma,sigmaError] covariance = sigmaError + obj.sigma^2*(1 + sqrt(3)*weightedEuclidean).*exp((-sqrt(3)*weightedEuclidean)),
% CovariogramModelChoice 2: parameters=[theta,sigma,sigmaError] covariance =sigmaError^2 + obj.sigma^2*exp(-1/2*distance.^2/obj.theta^2);
% CovariogramModelChoice 3: parameters=[theta,p,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*exp(-1/2*sum(distance^obj.p),obj.theta.^2)));
% CovariogramModelChoice 4: parameters=[theta,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*exp(-1/2*sum(distance^2),obj.theta.^2)));
% CovariogramModelChoice 5: parameters=[theta,sigma,sigmaError] covariance = sigmaError^2 + obj.sigma^2*(1 + sqrt(3)*weightedEuclidean).*exp((-sqrt(3)*weightedEuclidean)),
% weightedEuclidean=sqrt(distance.^2/obj.theta^2);
% CovariogramModelChoice 6: as CovariogramModelChoice 5 but with
% weightedEuclidean = sqrt(sum(distance^2/obj.theta.^2))));
% CovariogramModelChoice 7: covariance = sigmaError + obj.sigma^2*(1 + sqrt(5)*weightedEuclidean+5/3*weightedEuclidean.^2).*exp((- sqrt(5)*weightedEuclidean));
% CovariogramModelChoice 7: covariance = sigmaError^2 + obj.sigma^2*(1 + sqrt(5)*weightedEuclidean+5/3*weightedEuclidean.^2).*exp((- sqrt(5)*weightedEuclidean));
% weightedEuclidean=sqrt(distance.^2/obj.theta^2);
% CovariogramModelChoice 8: as CovariogramModelChoice 7 but with
% weightedEuclidean = sqrt(sum(distance^2/obj.theta.^2))));
Expand Down
2 changes: 2 additions & 0 deletions dependencies/@KrigingSuperClass/calcCrossOverQuality.m
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@

protoVec = zeros(size(uniqueInput,1),1);
predVec = zeros(size(uniqueInput,1),1);
qualityVec = zeros(size(uniqueInput,1),1);
try
for iExpOut = 1:size(uniqueInput,1)

Expand Down Expand Up @@ -144,6 +145,7 @@
else
quality = quality + (mean(OutputBackup(indexSameInput))-expected)^2;
end
qualityVec(iExpOut) = (mean(OutputBackup(indexSameInput))-expected)^2;
case 4
proto = ((mean(OutputBackup(indexSameInput))-expected)/sigma)^2;
protoVec(iExpOut) = proto;
Expand Down
18 changes: 4 additions & 14 deletions dependencies/@KrigingSuperClass/prediction.m
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,6 @@
min(obj.getOutputData),max(obj.getOutputData));
b = (max(obj.getOutputData)-min(obj.getOutputData))/(1-0);
OutputTotal(:,2) = OutputTotal(:,2)*b;
% Do not scale standard deviation as for the calculation no
% normalized output values are used!!!!!!!!!!!!!!!!!!
% f=(x-minX)./(maxX-minX).*(UB-LB)+LB;
end

%% --------------------- Nested Functions ---------------------------------
Expand Down Expand Up @@ -335,21 +332,14 @@
% 1.
% sigmaEstimation = covariance_zero-krigingWeights'*obj.CovargramVectors(1:size(krigingWeights,1),:);
% 2.
% sigmaEstimation = obj.BasisFctCoefficients'basisFctEval +
% obj.CovargramVectors(1:obj.nExperiments,:)'*...
% inv(obj.CovariogramMatrix(1:obj.nExperiments,1:obj.nExperiments))*...
% (obj.OutputData-obj.BasisFctCoefficients'basisFctEval)
% 3.
% sigmaEstimation = covariance_zero -
% - 2*krigingWeights'*obj.CovargramVectors(1:size(krigingWeights,1),:)
% + krigingWeights'*obj.CovariogramMatrix(1:size(krigingWeights,1),1:size(krigingWeights,1))*krigingWeights

if isempty(obj.KriKitObjNoise)||isempty(obj.KriKitObjNoise.getOutputData) % Check if an initialized noise model exist
covariance_zero = covariance_zero + obj.sigmaError^2;
else
% errorProp = (sum(bsxfun(@times,obj.HeterogeneousNoise.^2,krigingWeights(1:obj.getnExperiments,:).^2)));
% errorProp = (sum(bsxfun(@times,obj.HeterogeneousNoise.^2,krigingWeights(1:obj.getnExperiments,:))));
% covariance_zero = bsxfun(@plus,covariance_zero,errorProp);
predLogNoise = obj.KriKitObjNoise.prediction(nonNormInput(:,:));

% covariance_zero = covariance_zero + exp(predLogNoise(:,1));
% covariance_zero = bsxfun(@plus,covariance_zero, exp(predLogNoise(:,1)).*(max(obj.getOutputData)-min(obj.getOutputData)).^2 );
covariance_zero = bsxfun(@plus,covariance_zero, exp(predLogNoise(:,1)) );
end

Expand Down
115 changes: 115 additions & 0 deletions dependencies/@MOGO/MOGO.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
classdef MOGO<handle

%% Public Members
properties(GetAccess='public',SetAccess='public')
KrigingAnalyzeObj = [];
CovModelChoice = 6;
SaveInputDataOverIterations = cell(0);
SaveOutputDataOverIterations = cell(0);
SaveCovarParametersOverIterations = cell(0);
InputDataRange = [];
nInputVar = 0;
% Number of realizations drawn during conditional simulation
nRealizations = 5e2;

InputData = [];
OutputData = [];
end
properties(GetAccess='public',SetAccess='protected')

% Saving optimization results in each iteration
GlobalUncertainity = [];
GlobalUncertainityNorm = [];
HVVec = [];
end
%% Private Members
properties(GetAccess='private',SetAccess='private')

end

%% Protected Members
properties(GetAccess='protected',SetAccess='protected')

end

methods(Abstract)
% These function have to be user defined in each inherinted class

% ----------------------------------------------------------------
% Used in "generateData"
[output] = objFct(obj,varargin)
end

methods
%% Constructor
function obj = MOGO()
obj.KrigingAnalyzeObj = BayesianOptimizationClass();
obj.KrigingAnalyzeObj.addKrigingObject(1,'Test Name')
obj.KrigingAnalyzeObj.KrigingObjects{1}.setNormInput(true)
obj.KrigingAnalyzeObj.KrigingObjects{1}.setNormOutput(true)
obj.KrigingAnalyzeObj.KrigingObjects{1}.setShowDetails(true)
end
%% Copy Operator for a shallow copy
% ----------------------------------------------------------------
function copy = copyObj(obj)
% Create a shallow copy of the calling object.
copy = eval(class(obj));
meta = eval(['?',class(obj)]);
for p = 1: size(meta.Properties,1)
pname = meta.Properties{p}.Name;
try
eval(['copy.',pname,' = obj.',pname,';']);
catch
error(['\nCould not copy ',pname,'.\n']);
% fprintf(['\nCould not copy ',pname,'.\n']);
end
end
end
%% General Methods
[] = calcKriging(obj,varargin)
% ----------------------------------------------------------------
function []=saveObject(obj,varargin)
index = varargin{1};
save(strcat('tmpSave_',num2str(index)),'obj')
end
% ----------------------------------------------------------------
[] = saveTmpResults(obj,iIter)
% ----------------------------------------------------------------
[] = estimateParetoCurve(obj,iKrigingEstimation)
% ----------------------------------------------------------------
[] = setVariableNames(obj,inputNames,OutputNames)
% ----------------------------------------------------------------
[] = calcAndSaveNewSamples(obj,iterationNumber)
% ----------------------------------------------------------------
[inputData,outputData]=collectAllDataUntilGivenIteration(obj,finalIteration)
% ----------------------------------------------------------------
function []=SaveCurrentCovarParameter(obj,iterationNumber)
obj.SaveCovarParametersOverIterations{iterationNumber} = obj.KrigingAnalyzeObj.KrigingObjects{1}.getCovariogramModelParameters;
end
% ----------------------------------------------------------------
[]=generateNewData(obj,varargin);
%% Set function
function []=setInputDataRange(obj,InputDataRange)
% Check
if size(InputDataRange,1)== 2 && size(InputDataRange,2)== obj.nInputVar && obj.nInputVar~=2
InputDataRange = InputDataRange';
end
obj.InputDataRange = InputDataRange;
end

function []=setInputData(obj,InputData)
obj.resetData
obj.InputData = InputData;
obj.KrigingAnalyzeObj.KrigingObjects{1}.setInputData(obj.InputData)
obj.SaveInputDataOverIterations{1} = obj.InputData;
obj.nInputVar = size(InputData,2);
end
% ----------------------------------------------------------------
function []=setOutputData(obj,OutputData)
obj.OutputData = OutputData;
obj.KrigingAnalyzeObj.KrigingObjects{1}.setOutputData(obj.OutputData)
obj.SaveOutputDataOverIterations{1} = obj.OutputData;
end
end
end

23 changes: 23 additions & 0 deletions dependencies/@MOGO/calcAndSaveNewSamples.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
function [newSamplePoint] = calcAndSaveNewSamples(obj,varargin)
% [] = calcAndSaveNewSamplesMultiObj(obj,iterationNumber,OptimizationAlgorithm,UseOnlyMaximumValue)
iterationNumber = varargin{1};

if obj.KrigingAnalyzeObj.getnKrigingObjects>1
obj.KrigingAnalyzeObj.determineParetoSet(1:obj.KrigingAnalyzeObj.getnKrigingObjects)
end
% obj.nParetoSamples = obj.KrigingAnalyzeObj.getnParetoSetExperiments;

% Save the covariogram parameters
obj.SaveCovarParametersOverIterations{iterationNumber-1} = obj.KrigingAnalyzeObj.KrigingObjects{1}.getCovariogramModelParameters;
newSamplePoint = obj.KrigingAnalyzeObj.calcNewSamplesViaMCMC(1:obj.KrigingAnalyzeObj.getnKrigingObjects,'DRAM');


% Generate New data points (For ome cases input variables are aslo part of the ouput of the obj function)
obj.SaveInputDataOverIterations{iterationNumber} = newSamplePoint;
obj.generateNewData(iterationNumber);

% Save data points
obj.InputData = [obj.InputData;obj.SaveInputDataOverIterations{iterationNumber}];
obj.OutputData = [obj.OutputData;obj.SaveOutputDataOverIterations{iterationNumber}];
% obj.KrigingAnalyzeObj.getNewSamples
end
28 changes: 28 additions & 0 deletions dependencies/@MOGO/calcKriging.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
function [] = calcKriging(obj,varargin)

% Create kriging model for each object
for iKrigingObject = 1:obj.KrigingAnalyzeObj.getnKrigingObjects
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setUseMatlabRegressionGP(false);

obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setInputData(obj.InputData);
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setOutputData(obj.OutputData(:,iKrigingObject));

obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setCovariogramModelChoice(obj.CovModelChoice)
maxValue = 1e2;

if obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.getCovariogramModelChoice==3
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setLBCovariogramModelParameters([ones(1,obj.KrigingAnalyzeObj.KrigingObjects{1}.getnCovariogramParameters)]*1e-10)
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setUBCovariogramModelParameters([maxValue,maxValue,2,2,maxValue,maxValue])
else
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setLBCovariogramModelParameters([ones(1,obj.KrigingAnalyzeObj.KrigingObjects{1}.getnCovariogramParameters)]*1e-10)
obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.setUBCovariogramModelParameters([ones(1,obj.KrigingAnalyzeObj.KrigingObjects{1}.getnCovariogramParameters)]*maxValue)
end


obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.generateRegressionGPModel()
% obj.KrigingAnalyzeObj.KrigingObjects{iKrigingObject}.calcCovariogramMatrix

end

obj.setInputDataRange(obj.InputDataRange(1:obj.nInputVar,:));
end
18 changes: 18 additions & 0 deletions dependencies/@MOGO/collectAllDataUntilGivenIteration.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
function [inputData,outputData]=collectAllDataUntilGivenIteration(obj,finalIteration)
% First allocation
nData=0;
for iIter=1:finalIteration
nData = nData + size(obj.SaveInputDataOverIterations{iIter},1);
end

% Now collecting
inputData = zeros(nData,obj.nInputVar);
outputData = zeros(nData,1);
iRow = 0;
for iIter=1:finalIteration
nDataIter = size(obj.SaveInputDataOverIterations{iIter},1);
inputData(iRow+1:iRow+nDataIter,:) = obj.SaveInputDataOverIterations{iIter};
outputData(iRow+1:iRow+nDataIter,1) = obj.SaveOutputDataOverIterations{iIter};
iRow = iRow + nDataIter;
end
end
18 changes: 18 additions & 0 deletions dependencies/@MOGO/estimateParetoCurve.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
function [] = estimateParetoCurve(obj,iKrigingEstimation)
nObj = obj.KrigingAnalyzeObj.getnKrigingObjects;

obj.KrigingAnalyzeObj.predictParetoCurve(1:nObj,obj.nRealizations,(10^3),30);
globalUncertainity=obj.KrigingAnalyzeObj.getGlobalParetoUncertainity;
globalUncertainityNorm=obj.KrigingAnalyzeObj.getGlobalParetoUncertainityNorm;

refPoint = (1-obj.KrigingAnalyzeObj.getMinMax(1:nObj))/2;
transformedOutput = -bsxfun(@times,obj.KrigingAnalyzeObj.getMinMax(1:nObj),obj.OutputData);
HV=Hypervolume_MEX(transformedOutput,refPoint);

obj.GlobalUncertainity(iKrigingEstimation) = globalUncertainity;
obj.GlobalUncertainityNorm(iKrigingEstimation) = globalUncertainityNorm;
obj.HVVec(iKrigingEstimation) = HV;


end

4 changes: 4 additions & 0 deletions dependencies/@MOGO/externalFunction.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
function [obj2] = externalFunction(obj,varargin)
obj2 = obj;
end

11 changes: 11 additions & 0 deletions dependencies/@MOGO/generateNewData.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
function [] = generateNewData(obj,varargin)
iterationNumber = varargin{1};

outputProto = obj.objFct(obj.SaveInputDataOverIterations{iterationNumber});
obj.SaveOutputDataOverIterations{iterationNumber} = outputProto(:,1:end-obj.nInputVar);

% Save Input Data
obj.SaveInputDataOverIterations{iterationNumber} = outputProto(:,end-obj.nInputVar+1:end);

end

14 changes: 14 additions & 0 deletions dependencies/@MOGO/sampleFromDistribution.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
function [varargout] = sampleFromDistribution(obj,varargin)
muVec = varargin{1};
stdVec = varargin{2};

distA = randn(1e5,1);
distB = randn(1e5,1);

distA = distA*stdVec(1) + muVec(1);
distB = distB*stdVec(2) + muVec(2);

varargout{1} = distA;
varargout{2} = distB;
end

22 changes: 22 additions & 0 deletions dependencies/@MOGO/saveTmpResults.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
function [] = saveTmpResults(obj,iIter)
%% Backup
fileNameUnc = strcat('globalUncertainityVec_iIter',num2str(iIter));
fileNameIn = strcat('input_iIter',num2str(iIter));
fileNameOut = strcat('output_iIter',num2str(iIter));
fileNameNormUnc = strcat('globalUncertainityNormVec_iIter',num2str(iIter));
fileNameHV = strcat('HVMatrixVec_iIter',num2str(iIter));

% Save
input = obj.InputData;
output = obj.OutputData;
GU = obj.GlobalUncertainity;
GUN = obj.GlobalUncertainityNorm;
HVVec = obj.HVVec;
save(fileNameIn,'input')
save(fileNameOut,'output')
save(fileNameUnc,'GU')
save(fileNameNormUnc,'GUN')
save(fileNameHV,'HVVec')

end

Loading

0 comments on commit 84cb779

Please sign in to comment.