MK branch revs. 263 & 295: GUI reordering, GP bugfix. Plus minors (JEInterface.m, tex2html)

This commit is contained in:
Marcel Kronfeld 2009-06-15 13:21:10 +00:00
parent b1a7fa7949
commit 52d707f0e0
9 changed files with 284 additions and 128 deletions

View File

@ -1,8 +1,8 @@
function int = JEInterface(fhandle, range, varargin) function int = JEInterface(fhandle, range, varargin)
% EvA2 Interface for Matlab % EvA2 Interface for Matlab
% JEInterface(interfaceName, fhandle, range) % JEInterface(fhandle, range)
% JEInterface(interfaceName, fhandle, range, defaultargs) % JEInterface(fhandle, range, defaultargs)
% JEInterface(interfaceName, fhandle, range, defaultargs, options...) % JEInterface(fhandle, range, defaultargs, options...)
% %
% Arguments: % Arguments:
% fhandle: a function handle defining the optimization target. % fhandle: a function handle defining the optimization target.

View File

@ -583,7 +583,7 @@ public class GenericObjectEditor implements PropertyEditor {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
System.err.println("exception in setHideProperty: " + e.getMessage()); System.err.println("exception in setHideProperty for " + cls.getName() + "/" + property + " : " + e.getMessage());
return false; return false;
} }
} }
@ -616,11 +616,30 @@ public class GenericObjectEditor implements PropertyEditor {
System.err.println("Error: property " + property + " not found!"); System.err.println("Error: property " + property + " not found!");
return false; return false;
} catch (Exception e) { } catch (Exception e) {
System.err.println("exception in setHideProperty: " + e.getMessage()); System.err.println("exception in setHideProperty for " + cls.getName() + "/" + property + " : " + e.getMessage());
return false; return false;
} }
} }
/**
* Hide or unhide all properties of a given class. Added to avoid the problem with hidden
* properties of inherited classes hide the property for all classes within the same inheritance tree.
*
* @param cls
* @param hide
*/
public static void setHideAllProperties(Class<?> cls, boolean hide) {
try {
BeanInfo bi = Introspector.getBeanInfo(cls);
PropertyDescriptor[] props = bi.getPropertyDescriptors();
for (int i=0; i<props.length; i++) {
props[i].setHidden(hide);
}
} catch (Exception e) {
System.err.println("exception in setHideProperty for " + cls.getName() + "/all : " + e.getMessage());
}
}
/** /**
* Convenience-method. See setHideProperty. * Convenience-method. See setHideProperty.
* *

View File

@ -33,8 +33,10 @@ import java.beans.PropertyChangeSupport;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.beans.PropertyEditor; import java.beans.PropertyEditor;
import java.beans.PropertyVetoException; import java.beans.PropertyVetoException;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JButton; import javax.swing.JButton;
@ -46,6 +48,7 @@ import javax.swing.SwingConstants;
import eva2.gui.GenericObjectEditor.GOEPanel; import eva2.gui.GenericObjectEditor.GOEPanel;
import eva2.tools.EVAHELP; import eva2.tools.EVAHELP;
import eva2.tools.Mathematics;
import eva2.tools.StringTools; import eva2.tools.StringTools;
/*==========================================================================* /*==========================================================================*
* CLASS DECLARATION * CLASS DECLARATION
@ -151,91 +154,35 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
int rowHeight = 12; int rowHeight = 12;
// JScrollPane js = null; // JScrollPane js = null;
JTextArea jt = new JTextArea(); // JTextArea jt = new JTextArea();
// m_HelpText = null; // m_HelpText = null;
// Look for a globalInfo method that returns a string // Look for a globalInfo method that returns a string
// describing the target // describing the target
int methsFound = 0; // dont loop too long, so count until all found int methsFound = 0; // dont loop too long, so count until all found
GenericObjectEditor.setHideAllProperties(m_Target.getClass(), false);
for (int i = 0; i < m_Methods.length; i++) { for (int i = 0; i < m_Methods.length; i++) {
String name = m_Methods[i].getDisplayName(); String name = m_Methods[i].getDisplayName();
Method meth = m_Methods[i].getMethod(); Method meth = m_Methods[i].getMethod();
if (name.equals("globalInfo")) { if (name.equals("globalInfo")) {
if (TRACE) System.out.println("found globalInfo method for " + targ.getClass().toString()); JPanel jp = makeInfoPanel(meth, targ, rowHeight, gbLayout);
if (meth.getReturnType().equals(String.class)) { if (jp!=null) {
try { add(jp);
Object args[] = { }; componentOffset = 1;
String globalInfo = (String)(meth.invoke(m_Target, args)); }
String summary = globalInfo; methsFound++;
// int ci = globalInfo.indexOf('.');
// if (ci != -1) {
// // this shortens the displayed text, using only the first "sentence".
// // May cause problems, if the dot belongs to a number, for example,
// // so I deactivated it (MK).
// summary = globalInfo.substring(0, ci + 1);
// }
m_ClassName = targ.getClass().getName();
// m_HelpText = new StringBuffer("NAME\n");
// m_HelpText.append(m_ClassName).append("\n\n");
// m_HelpText.append("SYNOPSIS\n").append(globalInfo).append("\n\n");
m_HelpBut = new JButton("Help");
m_HelpBut.setToolTipText("More information about " + m_ClassName);
m_HelpBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent a) {
openHelpFrame();
//m_HelpBut.setEnabled(false);
}
});
jt.setText(summary);
jt.setFont(new Font("SansSerif", Font.PLAIN, rowHeight));
jt.setEditable(false);
jt.setLineWrap(true);
jt.setWrapStyleWord(true);
jt.setBackground(getBackground());
jt.setSize(jt.getPreferredSize());
JPanel jp = new JPanel();
jp.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Info"),
BorderFactory.createEmptyBorder(0, 5, 5, 5)
));
jp.setLayout(new BorderLayout());
jp.add(jt, BorderLayout.CENTER);
JPanel p2 = new JPanel();
p2.setLayout(new BorderLayout());
if (HtmlDemo.resourceExists(getHelpFileName())) {
// this means that the expected URL really exists
p2.add(m_HelpBut, BorderLayout.NORTH);
} else {
if (TRACE) System.out.println("not adding help button because of missing " + getHelpFileName());
}
jp.add(p2, BorderLayout.EAST);
GridBagConstraints gbConstraints = new GridBagConstraints();
//gbConstraints.anchor = GridBagConstraints.EAST;
gbConstraints.fill = GridBagConstraints.BOTH;
//gbConstraints.gridy = 0;
//gbConstraints.gridx = 0;
gbConstraints.gridwidth = 2;
gbConstraints.insets = new Insets(0,5,0,5);
gbLayout.setConstraints(jp, gbConstraints);
add(jp);
componentOffset = 1;
methsFound++;
if (methsFound == 2) break; // small speed-up
} catch (Exception ex) {
} // end try
} // end if (meth.getReturnType().equals(String.class)) {
} // end if (name.equals("globalInfo")) { } // end if (name.equals("globalInfo")) {
else if (name.equals("hideHideable")) { else if (name.equals("hideHideable")) {
Object args[] = { }; Object args[] = { };
try { try {
meth.invoke(m_Target, args); meth.invoke(m_Target, args);
methsFound++;
if (methsFound == 2) break; // small speed-up
} catch(Exception ex) {} } catch(Exception ex) {}
methsFound++;
} else if (name.equals("customPropertyOrder")) {
methsFound++;
reorderProperties(meth);
} }
if (methsFound == 3) break; // small speed-up
} // end for (int i = 0; i < m_Methods.length; i++) { } // end for (int i = 0; i < m_Methods.length; i++) {
// Now lets search for the individual properties, their // Now lets search for the individual properties, their
@ -246,6 +193,7 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
m_ViewWrapper= new JComponent[m_Properties.length]; m_ViewWrapper= new JComponent[m_Properties.length];
m_Labels = new JLabel[m_Properties.length]; m_Labels = new JLabel[m_Properties.length];
m_TipTexts = new String[m_Properties.length]; m_TipTexts = new String[m_Properties.length];
// boolean firstTip = true; // boolean firstTip = true;
for (int i = 0; i < m_Properties.length; i++) { for (int i = 0; i < m_Properties.length; i++) {
// For each property do this // For each property do this
@ -385,6 +333,146 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
setVisible(true); setVisible(true);
} }
/**
* Be sure to give a clone
* @param oldProps
* @param meth
* @return
*/
private PropertyDescriptor[] reorderProperties(Method meth) {
PropertyDescriptor[] oldProps = m_Properties.clone();
PropertyDescriptor[] newProps = new PropertyDescriptor[oldProps.length];
// Mathematics.revertArray(oldProps, newProps);
Object[] args = { };
Object retV=null;
try {
retV = meth.invoke(m_Target, args);
} catch(Exception ex) {}
if (retV!=null) {
try {
if (retV.getClass().isArray()) {
String[] swProps=(String[])retV;
//int findFirst=findFirstProp(props[0], oldProps);
int firstNonNull=0;
for (int i=0; i<oldProps.length; i++) {
if (i<swProps.length) {
int pInOld=findProp(oldProps, swProps[i]);
newProps[i]=oldProps[pInOld];
oldProps[pInOld]=null;
} else {
firstNonNull = findFirstNonNullAfter(oldProps, firstNonNull);
newProps[i]=oldProps[firstNonNull];
firstNonNull++;
}
}
m_Properties=newProps;
}
} catch (Exception e) {
System.err.println("Error during reordering properties: " + e.getMessage());
return m_Properties;
}
}
return newProps;
}
/**
* Find the first non-null entry in an Array at or after the given index and return its index.
* If only null entries are found, -1 is returned.
*
* @param arr
* @param firstLook
* @return
*/
private int findFirstNonNullAfter(PropertyDescriptor[] arr,
int firstLook) {
for (int i=firstLook; i<arr.length; i++) if (arr[i]!=null) return i;
return -1;
}
/**
* Find a string property in an array and return its index or -1 if not found.
*
* @param oldProps
* @param string
* @return
*/
private int findProp(PropertyDescriptor[] oldProps, String string) {
for (int i=0; i<oldProps.length; i++) {
if (oldProps[i]==null) continue;
String name = oldProps[i].getDisplayName();
if (name.compareTo(string)==0) return i;
}
return -1;
}
private JPanel makeInfoPanel(Method meth, Object targ, int rowHeight, GridBagLayout gbLayout) {
if (TRACE) System.out.println("found globalInfo method for " + targ.getClass().toString());
if (meth.getReturnType().equals(String.class)) {
try {
Object args[] = { };
String globalInfo = (String)(meth.invoke(m_Target, args));
String summary = globalInfo;
// int ci = globalInfo.indexOf('.');
// if (ci != -1) {
// // this shortens the displayed text, using only the first "sentence".
// // May cause problems, if the dot belongs to a number, for example,
// // so I deactivated it (MK).
// summary = globalInfo.substring(0, ci + 1);
// }
m_ClassName = targ.getClass().getName();
// m_HelpText = new StringBuffer("NAME\n");
// m_HelpText.append(m_ClassName).append("\n\n");
// m_HelpText.append("SYNOPSIS\n").append(globalInfo).append("\n\n");
m_HelpBut = new JButton("Help");
m_HelpBut.setToolTipText("More information about " + m_ClassName);
m_HelpBut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent a) {
openHelpFrame();
//m_HelpBut.setEnabled(false);
}
});
JTextArea jt = new JTextArea();
jt.setText(summary);
jt.setFont(new Font("SansSerif", Font.PLAIN, rowHeight));
jt.setEditable(false);
jt.setLineWrap(true);
jt.setWrapStyleWord(true);
jt.setBackground(getBackground());
jt.setSize(jt.getPreferredSize());
JPanel jp = new JPanel();
jp.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Info"),
BorderFactory.createEmptyBorder(0, 5, 5, 5)
));
jp.setLayout(new BorderLayout());
jp.add(jt, BorderLayout.CENTER);
JPanel p2 = new JPanel();
p2.setLayout(new BorderLayout());
if (HtmlDemo.resourceExists(getHelpFileName())) {
// this means that the expected URL really exists
p2.add(m_HelpBut, BorderLayout.NORTH);
} else {
if (TRACE) System.out.println("not adding help button because of missing " + getHelpFileName());
}
jp.add(p2, BorderLayout.EAST);
GridBagConstraints gbConstraints = new GridBagConstraints();
//gbConstraints.anchor = GridBagConstraints.EAST;
gbConstraints.fill = GridBagConstraints.BOTH;
//gbConstraints.gridy = 0;
//gbConstraints.gridx = 0;
gbConstraints.gridwidth = 2;
gbConstraints.insets = new Insets(0,5,0,5);
gbLayout.setConstraints(jp, gbConstraints);
return jp;
} catch (Exception ex) {
} // end try
} // end if (meth.getReturnType().equals(String.class)) {
return null;
}
private String translateGreek(String name) { private String translateGreek(String name) {
// Add some specific display for some greeks here // Add some specific display for some greeks here
if (name.equalsIgnoreCase("alpha")) if (name.equalsIgnoreCase("alpha"))
@ -700,7 +788,7 @@ public class PropertySheetPanel extends JPanel implements PropertyChangeListener
if (followDependencies) { if (followDependencies) {
// Handle the special method getGOEPropertyUpdateLinks which returns a list of pairs // Handle the special method getGOEPropertyUpdateLinks which returns a list of pairs
// of strings indicating that on an update if the i-th property, the i+1-th property // of strings indicating that on an update of the i-th property, the i+1-th property
// should be updated. This is useful for changes within sub-classes of the target // should be updated. This is useful for changes within sub-classes of the target
// which are not directly displayed in this panel but in sub-panels (and there have an own view etc.) // which are not directly displayed in this panel but in sub-panels (and there have an own view etc.)
Object o = BeanInspector.callIfAvailable(m_Target, "getGOEPropertyUpdateLinks", null); Object o = BeanInspector.callIfAvailable(m_Target, "getGOEPropertyUpdateLinks", null);

View File

@ -21,7 +21,8 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
protected AbstractGPNode m_Parent; protected AbstractGPNode m_Parent;
protected AbstractGPNode[] m_Nodes = new AbstractGPNode[0]; protected AbstractGPNode[] m_Nodes = new AbstractGPNode[0];
protected int m_Depth = 0; protected int m_Depth = 0;
private static final boolean TRACE=false;
/** This method allows you to clone the Nodes /** This method allows you to clone the Nodes
* @return the clone * @return the clone
*/ */
@ -107,7 +108,7 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
else if (matchSet.size()>1) System.err.println("String has ambiguous prefix: " + str + " -- " + BeanInspector.toString(matchSet)); else if (matchSet.size()>1) System.err.println("String has ambiguous prefix: " + str + " -- " + BeanInspector.toString(matchSet));
else { // exactly one match: else { // exactly one match:
AbstractGPNode currentNode = (AbstractGPNode)matchSet.get(0).clone(); AbstractGPNode currentNode = (AbstractGPNode)matchSet.get(0).clone();
// System.out.println("Found match: " + currentNode.getOpIdentifier() + "/" + currentNode.getArity()); if (TRACE) System.out.println("Found match: " + currentNode.getOpIdentifier() + "/" + currentNode.getArity());
int cutFront=currentNode.getOpIdentifier().length(); int cutFront=currentNode.getOpIdentifier().length();
String restStr; String restStr;
if (currentNode.getArity()==0) { if (currentNode.getArity()==0) {
@ -130,7 +131,7 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
currentNode.m_Nodes[i]=nextState.head(); currentNode.m_Nodes[i]=nextState.head();
restStr=nextState.tail().substring(1).trim(); // cut comma or brace restStr=nextState.tail().substring(1).trim(); // cut comma or brace
} }
// System.out.println("lacking rest: " + restStr); if (TRACE) System.out.println("read " + currentNode.getName() + ", rest: " + restStr);
return new Pair<AbstractGPNode,String>(currentNode, restStr); return new Pair<AbstractGPNode,String>(currentNode, restStr);
} }
} }
@ -145,7 +146,8 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
int firstBrace = str.indexOf(')'); int firstBrace = str.indexOf(')');
if ((firstBrace >= 0) && (firstBrace<argLen)) argLen = firstBrace; if ((firstBrace >= 0) && (firstBrace<argLen)) argLen = firstBrace;
} }
firstArg=str.substring(0,argLen); if (argLen>0) firstArg=str.substring(0,argLen);
else firstArg=str.trim();
try { try {
Double d=Double.parseDouble(firstArg); Double d=Double.parseDouble(firstArg);
return new Pair<Double,String>(d, str.substring(firstArg.length())); return new Pair<Double,String>(d, str.substring(firstArg.length()));
@ -183,8 +185,10 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
Vector<AbstractGPNode> nodeTypes, String str, boolean firstLongestOnly, boolean ignoreCase) { Vector<AbstractGPNode> nodeTypes, String str, boolean firstLongestOnly, boolean ignoreCase) {
Vector<AbstractGPNode> matching = new Vector<AbstractGPNode>(); Vector<AbstractGPNode> matching = new Vector<AbstractGPNode>();
for (int i=0; i<nodeTypes.size(); i++) { for (int i=0; i<nodeTypes.size(); i++) {
if (str.startsWith(nodeTypes.get(i).getOpIdentifier())) matching.add(nodeTypes.get(i)); String reqPrefix=nodeTypes.get(i).getOpIdentifier();
else if (ignoreCase && str.toLowerCase().startsWith(nodeTypes.get(i).getOpIdentifier().toLowerCase())) matching.add(nodeTypes.get(i)); if (nodeTypes.get(i).getArity()>0) reqPrefix+="(";
if (str.startsWith(reqPrefix)) matching.add(nodeTypes.get(i));
else if (ignoreCase && str.toLowerCase().startsWith(reqPrefix.toLowerCase())) matching.add(nodeTypes.get(i));
} }
if (matching.size()>1 && firstLongestOnly) { // allow only the longest match (or first longest) if (matching.size()>1 && firstLongestOnly) { // allow only the longest match (or first longest)
int maxLen = matching.get(0).getOpIdentifier().length(); int maxLen = matching.get(0).getOpIdentifier().length();
@ -209,8 +213,13 @@ public abstract class AbstractGPNode implements InterfaceProgram, java.io.Serial
public static void main(String[] args) { public static void main(String[] args) {
// Double d = Double.parseDouble("2.58923 + 3"); // Double d = Double.parseDouble("2.58923 + 3");
AbstractGPNode node = AbstractGPNode.parseFromString("+(x,cOs(*(pI,x1)))"); // AbstractGPNode node = AbstractGPNode.parseFromString("-23421");
// System.out.println("Parsed GPNode: " + node.getStringRepresentation()); AbstractGPNode node = AbstractGPNode.parseFromString("+(-23421,cOs(*(pI,x1)))");
AbstractGPNode.parseFromString("+(+(85.334407,*(0.0056858,*(x1,x4))), +(*(0.00026,*(x0,x3)),*(-0.0022053,*(x2,x4))))");
AbstractGPNode.parseFromString("+(+(80.51249,*(0.0071317,*(x1,x4))), +(*(0.0029955,*(x0,x1)),*(0.0021813,*(x2,x2))))");
AbstractGPNode.parseFromString("+(+(9.300961,*(0.0047026,*(x2,x4))), +(*(0.0012547,*(x0,x2)),*(0.0019085,*(x2,x3))))");
System.out.println("Parsed GPNode: " + node.getStringRepresentation());
node = AbstractGPNode.parseFromString(node.getStringRepresentation()); node = AbstractGPNode.parseFromString(node.getStringRepresentation());
} }

View File

@ -19,9 +19,9 @@ public class GPArea implements java.io.Serializable {
/** Handles property change notification */ /** Handles property change notification */
private transient PropertyChangeSupport m_Support = new PropertyChangeSupport(this); private transient PropertyChangeSupport m_Support = new PropertyChangeSupport(this);
private ArrayList m_CompleteList = new ArrayList(); private ArrayList<AbstractGPNode> m_CompleteList = new ArrayList<AbstractGPNode>();
private ArrayList m_ReducedList = new ArrayList(); private ArrayList<AbstractGPNode> m_ReducedList = new ArrayList<AbstractGPNode>();
private ArrayList m_BlackList = new ArrayList(); private ArrayList<Boolean> m_BlackList = new ArrayList<Boolean>();
public GPArea() { public GPArea() {
@ -29,11 +29,11 @@ public class GPArea implements java.io.Serializable {
public GPArea(GPArea g) { public GPArea(GPArea g) {
if (g.m_BlackList != null) if (g.m_BlackList != null)
this.m_BlackList = (ArrayList)g.m_BlackList.clone(); this.m_BlackList = (ArrayList<Boolean>)g.m_BlackList.clone();
if (g.m_ReducedList != null) if (g.m_ReducedList != null)
this.m_ReducedList = (ArrayList)g.m_ReducedList.clone(); this.m_ReducedList = (ArrayList<AbstractGPNode>)g.m_ReducedList.clone();
if (g.m_CompleteList != null) if (g.m_CompleteList != null)
this.m_CompleteList = (ArrayList)g.m_CompleteList.clone(); this.m_CompleteList = (ArrayList<AbstractGPNode>)g.m_CompleteList.clone();
} }
public Object clone() { public Object clone() {
@ -60,13 +60,13 @@ public class GPArea implements java.io.Serializable {
/** This method allows you to fetch the black list /** This method allows you to fetch the black list
* @return blacklist * @return blacklist
*/ */
public ArrayList getBlackList() { public ArrayList<Boolean> getBlackList() {
return this.m_BlackList; return this.m_BlackList;
} }
/** This method allows you to set the black list /** This method allows you to set the black list
* @param a blacklist * @param a blacklist
*/ */
public void SetBlackList(ArrayList a) { public void SetBlackList(ArrayList<Boolean> a) {
this.m_BlackList = a; this.m_BlackList = a;
} }
/** This method allows you to set a BlackList element /** This method allows you to set a BlackList element
@ -80,21 +80,21 @@ public class GPArea implements java.io.Serializable {
/** This method allows you to fetch the CompleteList /** This method allows you to fetch the CompleteList
* @return blacklist * @return blacklist
*/ */
public ArrayList getCompleteList() { public ArrayList<AbstractGPNode> getCompleteList() {
return this.m_CompleteList; return this.m_CompleteList;
} }
/** This method allows you to fetch the CompleteList /** This method allows you to fetch the CompleteList
* @return blacklist * @return blacklist
*/ */
public ArrayList getReducedList() { public ArrayList<AbstractGPNode> getReducedList() {
return this.m_ReducedList; return this.m_ReducedList;
} }
/** This method allows you to set the CompleteList /** This method allows you to set the CompleteList
* @param a blacklist * @param a blacklist
*/ */
public void SetCompleteList(ArrayList a) { public void SetCompleteList(ArrayList<AbstractGPNode> a) {
this.m_CompleteList = a; this.m_CompleteList = a;
m_Support.firePropertyChange("GPArea", null, this); m_Support.firePropertyChange("GPArea", null, this);
} }
@ -102,7 +102,7 @@ public class GPArea implements java.io.Serializable {
/** This method compiles the Complete List to the allowed list using the BlackList /** This method compiles the Complete List to the allowed list using the BlackList
*/ */
public void compileReducedList() { public void compileReducedList() {
this.m_ReducedList = new ArrayList(); this.m_ReducedList = new ArrayList<AbstractGPNode>();
for (int i = 0; i < this.m_CompleteList.size(); i++) { for (int i = 0; i < this.m_CompleteList.size(); i++) {
if (((Boolean)(this.m_BlackList.get(i))).booleanValue()) { if (((Boolean)(this.m_BlackList.get(i))).booleanValue()) {
this.m_ReducedList.add(this.m_CompleteList.get(i)); this.m_ReducedList.add(this.m_CompleteList.get(i));
@ -115,7 +115,7 @@ public class GPArea implements java.io.Serializable {
* @param targetarity The target arity. * @param targetarity The target arity.
*/ */
public AbstractGPNode getRandomNodeWithArity(int targetarity) { public AbstractGPNode getRandomNodeWithArity(int targetarity) {
ArrayList tmpArray = new ArrayList(); ArrayList<AbstractGPNode> tmpArray = new ArrayList<AbstractGPNode>();
for (int i = 0; i < this.m_ReducedList.size(); i++) { for (int i = 0; i < this.m_ReducedList.size(); i++) {
if (((AbstractGPNode)this.m_ReducedList.get(i)).getArity() == targetarity) tmpArray.add(this.m_ReducedList.get(i)); if (((AbstractGPNode)this.m_ReducedList.get(i)).getArity() == targetarity) tmpArray.add(this.m_ReducedList.get(i));
} }
@ -133,7 +133,7 @@ public class GPArea implements java.io.Serializable {
/** This method will return a non terminal /** This method will return a non terminal
*/ */
public AbstractGPNode getRandomNonTerminal() { public AbstractGPNode getRandomNonTerminal() {
ArrayList tmpArray = new ArrayList(); ArrayList<AbstractGPNode> tmpArray = new ArrayList<AbstractGPNode>();
for (int i = 0; i < this.m_ReducedList.size(); i++) { for (int i = 0; i < this.m_ReducedList.size(); i++) {
if (((AbstractGPNode)this.m_ReducedList.get(i)).getArity() > 0) tmpArray.add(this.m_ReducedList.get(i)); if (((AbstractGPNode)this.m_ReducedList.get(i)).getArity() > 0) tmpArray.add(this.m_ReducedList.get(i));
} }
@ -146,19 +146,21 @@ public class GPArea implements java.io.Serializable {
} }
public void clear() { public void clear() {
m_CompleteList = new ArrayList(); m_CompleteList = new ArrayList<AbstractGPNode>();
m_ReducedList = new ArrayList(); m_ReducedList = new ArrayList<AbstractGPNode>();
m_BlackList = new ArrayList(); m_BlackList = new ArrayList<Boolean>();
m_Support.firePropertyChange("GPArea", null, this); m_Support.firePropertyChange("GPArea", null, this);
} }
public void addPropertyChangeListener(PropertyChangeListener l) { public void addPropertyChangeListener(PropertyChangeListener l) {
if (m_Support==null) m_Support = new PropertyChangeSupport(this);
m_Support.addPropertyChangeListener(l); m_Support.addPropertyChangeListener(l);
} }
/** /**
* *
*/ */
public void removePropertyChangeListener(PropertyChangeListener l) { public void removePropertyChangeListener(PropertyChangeListener l) {
if (m_Support==null) m_Support = new PropertyChangeSupport(this);
m_Support.removePropertyChangeListener(l); m_Support.removePropertyChangeListener(l);
} }
} }

View File

@ -44,7 +44,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
private double[] m_C = new double[m_NumberOfConstants]; private double[] m_C = new double[m_NumberOfConstants];
private boolean m_UseInnerConst = false; private boolean m_UseInnerConst = false;
private boolean m_UseLocalHillClimbing = false; private boolean m_UseLocalHillClimbing = false;
transient private GPArea m_GPArea = new GPArea(); private GPArea m_GPArea = new GPArea();
protected AbstractEAIndividual m_OverallBest = null; protected AbstractEAIndividual m_OverallBest = null;
protected double m_Noise = 0.0; protected double m_Noise = 0.0;
@ -55,6 +55,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
public PSymbolicRegression() { public PSymbolicRegression() {
this.m_Template = new GPIndividualProgramData(); this.m_Template = new GPIndividualProgramData();
this.initProblem(); this.initProblem();
this.compileArea();
} }
public PSymbolicRegression(PSymbolicRegression b) { public PSymbolicRegression(PSymbolicRegression b) {
@ -100,17 +101,16 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
this.m_OverallBest = null; this.m_OverallBest = null;
this.m_C = new double[this.m_NumberOfConstants]; this.m_C = new double[this.m_NumberOfConstants];
for (int i = 0; i < this.m_C.length; i++) this.m_C[i] = RNG.randomDouble(-10, 10); for (int i = 0; i < this.m_C.length; i++) this.m_C[i] = RNG.randomDouble(-10, 10);
this.compileArea();
} }
/** /**
* This method compiles the area * This method compiles the area. Only to be called once in the constructor
* to build the basic function set or if the number of constants etc. change.
*/ */
private void compileArea() { private void compileArea() {
// unfortunately this must be cloned or the GUI wont update. // unfortunately this must be cloned or the GUI wont update.
// if (m_GPArea==null) GPArea oldArea=m_GPArea;
m_GPArea = new GPArea(); m_GPArea = new GPArea();
// else m_GPArea = (GPArea)m_GPArea.clone();
if (m_GPArea.isEmpty()) { if (m_GPArea.isEmpty()) {
this.m_GPArea.add2CompleteList(new GPNodeAdd()); this.m_GPArea.add2CompleteList(new GPNodeAdd());
@ -126,6 +126,9 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
for (int i = 0; i < this.m_X.length; i++) this.m_GPArea.add2CompleteList(new GPNodeInput("X"+i)); for (int i = 0; i < this.m_X.length; i++) this.m_GPArea.add2CompleteList(new GPNodeInput("X"+i));
for (int i = 0; i < this.m_C.length; i++) this.m_GPArea.add2CompleteList(new GPNodeInput("C"+i)); for (int i = 0; i < this.m_C.length; i++) this.m_GPArea.add2CompleteList(new GPNodeInput("C"+i));
} }
if ((oldArea!=null) && (oldArea.getBlackList()!=null) && (oldArea.getBlackList().size()==m_GPArea.getBlackList().size())) {
m_GPArea.SetBlackList(oldArea.getBlackList());
}
this.m_GPArea.compileReducedList(); this.m_GPArea.compileReducedList();
} }
@ -319,7 +322,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
* @return description * @return description
*/ */
public String globalInfo() { public String globalInfo() {
return "The task is to infer the equation from a system that can only be observed"; return "The task is to infer the equation of a system that can only be observed at a number of checkpoints.";
} }
/** This method allows you to choose how much noise is to be added to the /** This method allows you to choose how much noise is to be added to the
@ -360,7 +363,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
return this.m_UseLocalHillClimbing; return this.m_UseLocalHillClimbing;
} }
public String useLocalHillClimbingTipText() { public String useLocalHillClimbingTipText() {
return "Toggel the use of local hill climbing for inner constants."; return "Toggle the use of local hill climbing for inner constants.";
} }
/** This method allows you to set the number of ephremial constants. /** This method allows you to set the number of ephremial constants.
@ -368,8 +371,9 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
*/ */
public void setNumberOfConstants(int b) { public void setNumberOfConstants(int b) {
this.m_NumberOfConstants = b; this.m_NumberOfConstants = b;
m_GPArea.clear();
this.initProblem(); this.initProblem();
m_GPArea.clear();
this.compileArea();
} }
public int getNumberOfConstants() { public int getNumberOfConstants() {
return this.m_NumberOfConstants; return this.m_NumberOfConstants;
@ -407,7 +411,7 @@ public class PSymbolicRegression extends AbstractOptimizationProblem implements
return this.m_GPArea; return this.m_GPArea;
} }
public String areaTipText() { public String areaTipText() {
return "Select elements from the available area."; return "Select function set from the available area.";
} }
/** This method allows you to toggle path visualisation on and off. /** This method allows you to toggle path visualisation on and off.

View File

@ -150,20 +150,11 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
*/ */
protected Population generateEvalChildren(Population fromPopulation) { protected Population generateEvalChildren(Population fromPopulation) {
Population result = m_Population.cloneWithoutInds(), parents; Population result = m_Population.cloneWithoutInds(), parents;
AbstractEAIndividual[] offSprings;
AbstractEAIndividual tmpIndy;
result.clear(); result.clear();
this.m_ParentSelection.prepareSelection(fromPopulation);
this.m_PartnerSelection.prepareSelection(fromPopulation);
parents = this.m_ParentSelection.selectFrom(fromPopulation, this.m_Lambda);
for (int i = 0; i < parents.size(); i++) { parents = generateChildren(fromPopulation, result, this.m_Lambda);
tmpIndy = (AbstractEAIndividual)parents.get(i);
offSprings = tmpIndy.mateWith(this.m_PartnerSelection.findPartnerFor(tmpIndy, fromPopulation, this.m_NumberOfPartners));
offSprings[0].mutate();
result.add(i, offSprings[0]);
}
this.evaluatePopulation(result); this.evaluatePopulation(result);
if (result.getEAIndividual(0).getMutationOperator() instanceof InterfaceMutationGenerational) { if (result.getEAIndividual(0).getMutationOperator() instanceof InterfaceMutationGenerational) {
@ -174,13 +165,43 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
return result; return result;
} }
protected Population selectParents() { /**
this.m_EnvironmentSelection.prepareSelection(this.m_Population); * Create a new population by parent selection, partner selection, recombination and crossover.
return this.m_EnvironmentSelection.selectFrom(this.m_Population, this.m_Mu); * The new population is added to the result population, while the selected parent population (after
* selection but before recombination/crossover) is returned.
* Returned parents and result population are to have the same size and correspond per individual.
*
* @param fromPopulation
* @param result
* @param lambda
* @return
*/
protected Population generateChildren(Population fromPopulation, Population result, int lambda) {
AbstractEAIndividual tmpIndy;
AbstractEAIndividual[] offSprings;
Population parents;
this.m_ParentSelection.prepareSelection(fromPopulation);
this.m_PartnerSelection.prepareSelection(fromPopulation);
parents = this.m_ParentSelection.selectFrom(fromPopulation, lambda);
for (int i = 0; i < parents.size(); i++) {
tmpIndy = (AbstractEAIndividual)parents.get(i);
offSprings = tmpIndy.mateWith(this.m_PartnerSelection.findPartnerFor(tmpIndy, fromPopulation, this.m_NumberOfPartners));
offSprings[0].mutate();
result.add(i, offSprings[0]);
}
return parents;
} }
/** The optimize method will compute a 'improved' and evaluated population protected Population selectParents(Population fromPop, int mu) {
this.m_EnvironmentSelection.prepareSelection(fromPop);
return this.m_EnvironmentSelection.selectFrom(fromPop, mu);
}
/**
* The optimize method will compute an improved and evaluated population.
*/ */
public void optimize() { public void optimize() {
Population nextGeneration, parents; Population nextGeneration, parents;
@ -188,7 +209,7 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
//System.out.println("optimize"); //System.out.println("optimize");
// first perform the environment selection to select myu parents // first perform the environment selection to select myu parents
parents = selectParents(); parents = selectParents(m_Population, this.m_Mu);
// System.out.println("-- selected avg fit " + BeanInspector.toString(parents.getMeanFitness()) + " from last gen " + BeanInspector.toString(m_Population.getMeanFitness())); // System.out.println("-- selected avg fit " + BeanInspector.toString(parents.getMeanFitness()) + " from last gen " + BeanInspector.toString(m_Population.getMeanFitness()));
@ -370,6 +391,11 @@ public class EvolutionStrategies implements InterfaceOptimizer, java.io.Serializ
public String globalInfo() { public String globalInfo() {
return "This is an Evolution Strategy. Note that the population size depends on mu (number of parents) and lambda (number of offspring)."; return "This is an Evolution Strategy. Note that the population size depends on mu (number of parents) and lambda (number of offspring).";
} }
public String[] customPropertyOrder() {
return new String[]{"mu", "lambda"};
}
/** This method will return a naming String /** This method will return a naming String
* @return The name of the algorithm * @return The name of the algorithm
*/ */

View File

@ -282,7 +282,7 @@ public class Processor extends Thread implements InterfaceProcessor, InterfacePo
* @return the percentage of current (multi-)run already performed * @return the percentage of current (multi-)run already performed
*/ */
private int getStatusPercent(Population pop, int currentRun, int multiRuns) { private int getStatusPercent(Population pop, int currentRun, int multiRuns) {
double percentPerRun = 100/multiRuns; double percentPerRun = 100./multiRuns;
int curProgress; int curProgress;
if (this.goParams.getTerminator() instanceof EvaluationTerminator) { if (this.goParams.getTerminator() instanceof EvaluationTerminator) {
double curRunPerf = pop.getFunctionCalls()*percentPerRun/(double)((EvaluationTerminator)this.goParams.getTerminator()).getFitnessCalls(); double curRunPerf = pop.getFunctionCalls()*percentPerRun/(double)((EvaluationTerminator)this.goParams.getTerminator()).getFitnessCalls();

View File

@ -25,6 +25,14 @@ public class Mathematics {
System.out.println(median(y) / 1000); System.out.println(median(y) / 1000);
} }
public static void revertArray(Object[] src, Object[] dst) {
if (dst.length>=src.length) {
for (int i=0; i<src.length; i++) {
dst[src.length-i-1]=src[i];
}
} else System.err.println("Mismatching array lengths!");
}
/** /**
* Computes the median of a given double vector. * Computes the median of a given double vector.
* *