diff --git a/resources/MatlabInterface/@JEInterface/JEInterface.m b/resources/MatlabInterface/@JEInterface/JEInterface.m index 3f3015a9..2cb304f2 100644 --- a/resources/MatlabInterface/@JEInterface/JEInterface.m +++ b/resources/MatlabInterface/@JEInterface/JEInterface.m @@ -1,12 +1,14 @@ -function int = JEInterface(fhandle, range, varargin) +function int = JEInterface(fhandle, datatype, range, varargin) % EvA2 Interface for Matlab -% JEInterface(fhandle, range) -% JEInterface(fhandle, range, initRange) -% JEInterface(fhandle, range, initRange, defaultargs) -% JEInterface(fhandle, range, initRange, defaultargs, options...) +% JEInterface(fhandle, datatype, range) +% JEInterface(fhandle, datatype, range, initRange) +% JEInterface(fhandle, datatype, range, initRange, defaultargs) +% JEInterface(fhandle, datatype, range, initRange, defaultargs, options...) % % Arguments: % fhandle: a function handle defining the optimization target. +% datatype: symbol 'int', 'double', or 'binary' denoting the problem data +% type % range: a 2 x dim array defining the solution subspace with lower and % upper bounds; or a scalar defining the bitwidth for binary % problems. @@ -52,11 +54,22 @@ int.mediator = ''; int.optParams = []; int.optParamValues = []; int.hexMask=hex2dec('ffffffff'); +int.dataType=''; % to be set later! if (isa(fhandle, 'function_handle')) int.f = fhandle; else - error('Wrong second argument type, expected function_handle'); + error('Wrong first argument type, expected function_handle'); +end + +if (strcmp(datatype,'double')) + int.dataType=eva2.server.go.problems.MatlabProblemDataTypeEnum.typeDouble; +elseif strcmp(datatype, 'int') + int.dataType=eva2.server.go.problems.MatlabProblemDataTypeEnum.typeInteger; +elseif strcmp(datatype, 'binary') + int.dataType=eva2.server.go.problems.MatlabProblemDataTypeEnum.typeBinary; +else + error('Invalid data type, select double, int, or binary!'); end disp('Setting up JEInterface...'); @@ -79,7 +92,7 @@ end int = class(int,'JEInterface'); int.opts = makeOptions(int); -if (nargin>2) +if (nargin>3) int.initialRange=varargin{1}; if (isa(varargin{1}, 'double') && (size(varargin{1},1) == 2)) @@ -91,15 +104,15 @@ if (nargin>2) disp(s); end - if (nargin>3) + if (nargin>4) int.args = varargin{2}; disp('Fitness function argument: '); disp(int.args); - if (nargin > 4) - if (rem(nargin,2)==1) + if (nargin > 5) + if (rem(nargin,2)==0) error('Invalid number of arguments!'); end disp('Reading options:'); - for i=3:2:nargin-2 + for i=3:2:nargin-3 int=setOpt(int, varargin{i}, varargin{i+1}); end end @@ -107,11 +120,15 @@ if (nargin>2) end display(getOptions(int)); % finally create the java object -if (isempty(int.initialRange)) - int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.range); +if (isempty(int.initialRange)) % binary case + int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.dataType, int.range); else - if (isempty(int.range) || eq(size(int.range), size(int.initialRange))) - int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.range, int.initialRange); +% size(int.range); +% size(int.initialRange); +% eq(size(int.range), size(int.initialRange)) +% disp('-------'); + if (isempty(int.range) || (sum(eq(size(int.range), size(int.initialRange)))==2)) + int.mp = eva2.server.go.problems.MatlabProblem(int.dim, int.dataType, int.range, int.initialRange); %int.mp.getIndividualTemplate().setMutationOperator( ... % eva2.server.go.operators.mutation.MutateEAMixer(eva2.server.go.operators.mutation.MutateGASwapBits, eva2.server.go.operators.mutation.MutateGAUniform)); else diff --git a/resources/MatlabInterface/@JEInterface/testEvalFunc.m b/resources/MatlabInterface/@JEInterface/testEvalFunc.m index b085b15e..8210c4a9 100644 --- a/resources/MatlabInterface/@JEInterface/testEvalFunc.m +++ b/resources/MatlabInterface/@JEInterface/testEvalFunc.m @@ -2,7 +2,7 @@ function testEvalFunc(int) % Test the fitness function output format. wordwidth=32; -if (isempty(int.range)) +if (strcmp(int.dataType,eva2.server.go.problems.MatlabProblemDataTypeEnum.typeBinary)) % binary problem s=sprintf('Binary problem of bitwidth %d', int.dim); disp(s); @@ -13,7 +13,7 @@ if (isempty(int.range)) %x(numInts)=bitshift(x(numInts),-overheadBits); % shift right by overhead bs=eva2.tools.math.RNG.randomBitSet(0.5, int.dim); x=convertUnsignedJE(int, bs); -else +elseif strcmp(int.dataType,eva2.server.go.problems.MatlabProblemDataTypeEnum.typeDouble) % double problem x=rand(1, int.dim); s=sprintf('Real valued problem in %d dimensions and range %s ', int.dim, mat2str(int.range)); @@ -21,8 +21,16 @@ else for i=1:int.dim x(i)=int.range(i,1)+x(i)*(int.range(i,2)-int.range(i,1)); end +elseif strcmp(int.dataType,eva2.server.go.problems.MatlabProblemDataTypeEnum.typeInteger) + % integer problem + s=sprintf('Real valued problem in %d dimensions and range %s ', int.dim, mat2str(int.range)); + disp(s); + size(int.range) + %x=int.range(1,:)+ceil(rand(1,int.dim).*int.range(2,:)-int.range(1,:)); + x=(int.range(:,1)+ceil(rand(int.dim,1).*int.range(:,2)-int.range(:,1)))'; +else + error('Invalid data type in testEvalFunc.m!'); end - if (isempty(int.range)) msg=sprintf('\nTesting value: %d, bin.: %s', x, dec2bin(x, int.dim)); else diff --git a/src/eva2/server/go/problems/MatlabEvalMediator.java b/src/eva2/server/go/problems/MatlabEvalMediator.java index af2f3bff..d0f7b031 100644 --- a/src/eva2/server/go/problems/MatlabEvalMediator.java +++ b/src/eva2/server/go/problems/MatlabEvalMediator.java @@ -233,17 +233,22 @@ public class MatlabEvalMediator { } void setSolution(Object sol) { - //System.out.println("setting Sol"); +// System.err.println("setting obj Sol " + BeanInspector.toString(sol)); optSolution = sol; } void setSolutionSet(double[][] solSet) { -// System.err.println("setting SolSet " + ((solSet != null) ? solSet.length : 0)); +// System.err.println("setting dbl SolSet " + ((solSet != null) ? solSet.length : 0)); optSolSet = solSet; } void setSolutionSet(BitSet[] solSet) { -// System.err.println("setting SolSet " + ((solSet != null) ? solSet.length : 0)); +// System.err.println("setting bs SolSet " + ((solSet != null) ? solSet.length : 0)); + optSolSet = solSet; + } + + void setSolutionSet(int[][] solSet) { +// System.err.println("setting int SolSet " + ((solSet != null) ? solSet.length : 0)); optSolSet = solSet; } @@ -252,7 +257,7 @@ public class MatlabEvalMediator { * @return */ public Object getSolution() { -// System.err.println("getting Sol"); +// System.err.println("getting Sol " + BeanInspector.toString(optSolution)); return optSolution; } diff --git a/src/eva2/server/go/problems/MatlabProblem.java b/src/eva2/server/go/problems/MatlabProblem.java index 42c7d002..5abec10b 100644 --- a/src/eva2/server/go/problems/MatlabProblem.java +++ b/src/eva2/server/go/problems/MatlabProblem.java @@ -14,8 +14,10 @@ import eva2.server.go.PopulationInterface; import eva2.server.go.individuals.AbstractEAIndividual; import eva2.server.go.individuals.ESIndividualDoubleData; import eva2.server.go.individuals.GAIndividualBinaryData; +import eva2.server.go.individuals.GIIndividualIntegerData; import eva2.server.go.individuals.InterfaceDataTypeBinary; import eva2.server.go.individuals.InterfaceDataTypeDouble; +import eva2.server.go.individuals.InterfaceDataTypeInteger; import eva2.server.go.operators.postprocess.InterfacePostProcessParams; import eva2.server.go.operators.postprocess.PostProcess; import eva2.server.go.operators.postprocess.PostProcessParams; @@ -50,16 +52,16 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf // transient PrintStream resOutStream = null; int verbosityLevel = 0; private MatlabEvalMediator handler = null; - private boolean isDouble = true; +// private boolean isDouble = true; + private MatlabProblemDataTypeEnum dataType = MatlabProblemDataTypeEnum.typeDouble; private double[][] initialRange = null; // the initial range for double-valued problems public static boolean hideFromGOE = true; - + // transient private double[] currArray = null; // private String mtCmd = null; public MatlabProblem(MatlabProblem o) { -// this.matlab = o.matlab; this.m_Template=null; this.handler = o.handler; this.runnable = o.runnable; @@ -69,7 +71,7 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf // this.res = new ResultArr(); // if (o.res != null) if (o.res.get() != null) res.set(o.res.get()); this.range = o.range; - this.isDouble = o.isDouble; + this.dataType = o.dataType; this.initialRange = o.initialRange; // this.mtCmd = o.mtCmd; // currArray = null; @@ -79,61 +81,104 @@ public class MatlabProblem extends AbstractOptimizationProblem implements Interf return new MatlabProblem(this); } + /** + * Constructor of a real valued problem. + * @param dim + * @param range + */ +// public MatlabProblem(int dim, double[][] range) { +// init(dim, ProblemDataTypeEnum.typeDouble, range, null, defTestOut); +// } + + /** + * Constructor of a binary problem with given bit length. + * @param dim + */ public MatlabProblem(int dim) { - this(dim, (double[][])null); - } - - public MatlabProblem(int dim, double[][] range) { - init(dim, range, null, defTestOut); + init(dim, MatlabProblemDataTypeEnum.typeBinary, null, null, defTestOut); } - public MatlabProblem(int dim, double[][] range, double[][] initRange) { - init(dim, range, initRange, defTestOut); + /** + * Constructor of a real valued problem with initialization range. + * @param dim + * @param range + * @param initRange + */ +// public MatlabProblem(int dim, double[][] range, double[][] initRange) { +// init(dim, ProblemDataTypeEnum.typeDouble, range, initRange, defTestOut); +// } + + /** + * Constructor of real or integer valued problem, the range will be converted + * to integer in the latter case. + * + * @param dim + * @param datType + * @param range + */ + public MatlabProblem(int dim, MatlabProblemDataTypeEnum datType, double[][] range) { + init(dim, datType, range, null, defTestOut); + } + + /** + * Constructor of real or integer valued problem with initialization range. + * The ranges will be converted to integer in the latter case. + * + * @param dim + * @param datType + * @param range + */ + public MatlabProblem(int dim, MatlabProblemDataTypeEnum datType, double[][] range, double[][] initRange) { + init(dim, datType, range, initRange, defTestOut); } - public MatlabProblem(int dim, double lower, double upper) { - this(dim, null); - double[][] range = new double[dim][2]; - for (int i=0; i 0) { // avoid evil case setting dim to 0 during object init ((InterfaceDataTypeDouble)this.m_Template).setDoubleDataLength(getProblemDimension()); ((InterfaceDataTypeDouble)this.m_Template).SetDoubleRange(range); } - } else { + break; + case typeBinary: ///// binary alternative - if (m_Template == null) m_Template = new GAIndividualBinaryData(getProblemDimension()); - - ///// Integer alternative - /*if (m_Template == null) m_Template = new GAIndividualIntegerData(); - int intLen = 1+((getProblemDimension()-1)/32); - int lastIntCodingBits = getProblemDimension()-((intLen-1)*32); - if (lastIntCodingBits > 32) System.err.println("ERROR in MatlabProblem:initTemplate"); - ((GAIndividualIntegerData)m_Template).setIntegerDataLength(intLen); - ((GAIndividualIntegerData)m_Template).SetIntRange(Integer.MIN_VALUE, Integer.MAX_VALUE); - if (lastIntCodingBits < 32) ((GAIndividualIntegerData)m_Template).SetIntRange(intLen-1, 0, (int)Math.pow(2, lastIntCodingBits)-1); - */ ///// -// System.err.println("integer length is "+((GAIndividualIntegerData)m_Template).getIntegerData().length); -// System.err.println("Range is " + BeanInspector.toString(((GAIndividualIntegerData)m_Template).getIntRange())); -// m_Template = new GAIndividualBinaryData(); -// ((GAIndividualBinaryData)m_Template).setBinaryDataLength(getProblemDimension()); + if (m_Template == null || !(m_Template instanceof GAIndividualBinaryData)) m_Template = new GAIndividualBinaryData(getProblemDimension()); + break; + case typeInteger: + int[][] intRange=makeIntRange(range); + if (m_Template == null || !(m_Template instanceof GIIndividualIntegerData)) m_Template = new GIIndividualIntegerData(intRange); + break; } } + private int[][] makeIntRange(double[][] r) { + int[][] intRange=new int[r.length][r[0].length]; + for (int i=0; i0)) { - if (isDouble) { - double[][] solSet = new double[pop.size()][]; + switch(dataType) { + case typeDouble: + double[][] rsolSet = new double[pop.size()][]; for (int i=0; i