From 84cb7799d78806e02e68193a3b4c20ec9de42260 Mon Sep 17 00:00:00 2001 From: Lazloo Date: Fri, 24 Feb 2017 15:42:14 +0100 Subject: [PATCH] 20170224 Add Multi-Objective Global Optimization (MOGO) as new class --- dependencies/@AnalyzeKriging/AnalyzeKriging.m | 9 +- .../@AnalyzeKriging/plotInterpolation_nD.m | 4 +- .../@KrigingSuperClass/KrigingSuperClass.m | 20 +-- .../@KrigingSuperClass/calcCrossOverQuality.m | 2 + dependencies/@KrigingSuperClass/prediction.m | 18 +-- dependencies/@MOGO/MOGO.m | 115 ++++++++++++++++++ dependencies/@MOGO/calcAndSaveNewSamples.m | 23 ++++ dependencies/@MOGO/calcKriging.m | 28 +++++ .../@MOGO/collectAllDataUntilGivenIteration.m | 18 +++ dependencies/@MOGO/estimateParetoCurve.m | 18 +++ dependencies/@MOGO/externalFunction.m | 4 + dependencies/@MOGO/generateNewData.m | 11 ++ dependencies/@MOGO/sampleFromDistribution.m | 14 +++ dependencies/@MOGO/saveTmpResults.m | 22 ++++ dependencies/@MOGO/setVariableNames.m | 11 ++ 15 files changed, 289 insertions(+), 28 deletions(-) create mode 100644 dependencies/@MOGO/MOGO.m create mode 100644 dependencies/@MOGO/calcAndSaveNewSamples.m create mode 100644 dependencies/@MOGO/calcKriging.m create mode 100644 dependencies/@MOGO/collectAllDataUntilGivenIteration.m create mode 100644 dependencies/@MOGO/estimateParetoCurve.m create mode 100644 dependencies/@MOGO/externalFunction.m create mode 100644 dependencies/@MOGO/generateNewData.m create mode 100644 dependencies/@MOGO/sampleFromDistribution.m create mode 100644 dependencies/@MOGO/saveTmpResults.m create mode 100644 dependencies/@MOGO/setVariableNames.m diff --git a/dependencies/@AnalyzeKriging/AnalyzeKriging.m b/dependencies/@AnalyzeKriging/AnalyzeKriging.m index b5e8a7c..23cbd46 100644 --- a/dependencies/@AnalyzeKriging/AnalyzeKriging.m +++ b/dependencies/@AnalyzeKriging/AnalyzeKriging.m @@ -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}) diff --git a/dependencies/@AnalyzeKriging/plotInterpolation_nD.m b/dependencies/@AnalyzeKriging/plotInterpolation_nD.m index 45d9340..edb2564 100644 --- a/dependencies/@AnalyzeKriging/plotInterpolation_nD.m +++ b/dependencies/@AnalyzeKriging/plotInterpolation_nD.m @@ -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 diff --git a/dependencies/@KrigingSuperClass/KrigingSuperClass.m b/dependencies/@KrigingSuperClass/KrigingSuperClass.m index a9e37a7..dc7119a 100644 --- a/dependencies/@KrigingSuperClass/KrigingSuperClass.m +++ b/dependencies/@KrigingSuperClass/KrigingSuperClass.m @@ -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)))); @@ -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)))); diff --git a/dependencies/@KrigingSuperClass/calcCrossOverQuality.m b/dependencies/@KrigingSuperClass/calcCrossOverQuality.m index 04dc7cb..02577b7 100644 --- a/dependencies/@KrigingSuperClass/calcCrossOverQuality.m +++ b/dependencies/@KrigingSuperClass/calcCrossOverQuality.m @@ -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) @@ -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; diff --git a/dependencies/@KrigingSuperClass/prediction.m b/dependencies/@KrigingSuperClass/prediction.m index 4198123..c0ad61c 100644 --- a/dependencies/@KrigingSuperClass/prediction.m +++ b/dependencies/@KrigingSuperClass/prediction.m @@ -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 --------------------------------- @@ -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 diff --git a/dependencies/@MOGO/MOGO.m b/dependencies/@MOGO/MOGO.m new file mode 100644 index 0000000..ae1ab45 --- /dev/null +++ b/dependencies/@MOGO/MOGO.m @@ -0,0 +1,115 @@ +classdef MOGO1 + 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 \ No newline at end of file diff --git a/dependencies/@MOGO/calcKriging.m b/dependencies/@MOGO/calcKriging.m new file mode 100644 index 0000000..8ea60f8 --- /dev/null +++ b/dependencies/@MOGO/calcKriging.m @@ -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 \ No newline at end of file diff --git a/dependencies/@MOGO/collectAllDataUntilGivenIteration.m b/dependencies/@MOGO/collectAllDataUntilGivenIteration.m new file mode 100644 index 0000000..e5e700d --- /dev/null +++ b/dependencies/@MOGO/collectAllDataUntilGivenIteration.m @@ -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 \ No newline at end of file diff --git a/dependencies/@MOGO/estimateParetoCurve.m b/dependencies/@MOGO/estimateParetoCurve.m new file mode 100644 index 0000000..b2d7c56 --- /dev/null +++ b/dependencies/@MOGO/estimateParetoCurve.m @@ -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 + diff --git a/dependencies/@MOGO/externalFunction.m b/dependencies/@MOGO/externalFunction.m new file mode 100644 index 0000000..7ed76be --- /dev/null +++ b/dependencies/@MOGO/externalFunction.m @@ -0,0 +1,4 @@ +function [obj2] = externalFunction(obj,varargin) + obj2 = obj; +end + diff --git a/dependencies/@MOGO/generateNewData.m b/dependencies/@MOGO/generateNewData.m new file mode 100644 index 0000000..9d4cd76 --- /dev/null +++ b/dependencies/@MOGO/generateNewData.m @@ -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 + diff --git a/dependencies/@MOGO/sampleFromDistribution.m b/dependencies/@MOGO/sampleFromDistribution.m new file mode 100644 index 0000000..487a9b1 --- /dev/null +++ b/dependencies/@MOGO/sampleFromDistribution.m @@ -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 + diff --git a/dependencies/@MOGO/saveTmpResults.m b/dependencies/@MOGO/saveTmpResults.m new file mode 100644 index 0000000..5401c0d --- /dev/null +++ b/dependencies/@MOGO/saveTmpResults.m @@ -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 + diff --git a/dependencies/@MOGO/setVariableNames.m b/dependencies/@MOGO/setVariableNames.m new file mode 100644 index 0000000..4146ca3 --- /dev/null +++ b/dependencies/@MOGO/setVariableNames.m @@ -0,0 +1,11 @@ +function [] = setVariableNames(obj,inputNames,OutputNames) + + + nObj = obj.KrigingAnalyzeObj.getnKrigingObjects; + for iKrigObj = 1:nObj + obj.KrigingAnalyzeObj.setInputVarNames(iKrigObj,inputNames); + obj.KrigingAnalyzeObj.setKrigingObjectNames(iKrigObj,OutputNames{iKrigObj}) + end + +end +