diff --git a/src/main/java/avatartranslator/AvatarLibraryFunction.java b/src/main/java/avatartranslator/AvatarLibraryFunction.java index 8babbc76a54455a57e1c0e1f633e205d06631cb6..0831f73dae0a3e9c2981e5b4acae11532fb60013 100644 --- a/src/main/java/avatartranslator/AvatarLibraryFunction.java +++ b/src/main/java/avatartranslator/AvatarLibraryFunction.java @@ -624,6 +624,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl asme.setValues (replaceAttributesInExpr(_asme.getMinValue (), _arg), replaceAttributesInExpr(_asme.getMaxValue (), _arg)); asme.setFunctionId (_asme.getFunctionId ()); asme.setExtraAttribute1(_asme.getExtraAttribute1()); + asme.setExtraAttribute2(_asme.getExtraAttribute2()); asme.setVariable (arg.placeholdersMapping.get (this.getAvatarAttributeWithName (_asme.getVariable ())).getName ()); this.translateNext (asme, _asme, arg); diff --git a/src/main/java/avatartranslator/AvatarRandom.java b/src/main/java/avatartranslator/AvatarRandom.java index d60d0eb51134bcb9720741dbca8be2662a7633ec..71c60bd60257fa83e9eb2cf9e8a55b4da27da138 100644 --- a/src/main/java/avatartranslator/AvatarRandom.java +++ b/src/main/java/avatartranslator/AvatarRandom.java @@ -56,13 +56,16 @@ public class AvatarRandom extends AvatarStateMachineElement { public final static int RANDOM_UNIFORM_LAW = 0; public final static int RANDOM_TRIANGULAR_LAW = 1; public final static int RANDOM_GAUSSIAN_LAW = 2; - public final static String[] DISTRIBUTION_LAWS = {"Uniform", "Triangular", "Gaussian"}; - public final static String[] DISTRIBUTION_LAWS_SHORT = {"", " ^", "ĝ"}; + public final static int RANDOM_LOG_NORMAL_LAW = 3; + public final static String[] DISTRIBUTION_LAWS = {"Uniform", "Triangular", "Gaussian", "Log normal"}; + public final static String[] DISTRIBUTION_LAWS_SHORT = {"", " ^", "ĝ", "ln"}; - public final static int[] NB_OF_EXTRA_ATTRIBUTES = {0, 1, 1}; - public final static String[] LABELS_OF_EXTRA_ATTRIBUTES = {"", "triangle top", "standard deviation"}; + public final static int[] NB_OF_EXTRA_ATTRIBUTES = {0, 1, 1, 2}; + public final static String[] LABELS_OF_EXTRA_ATTRIBUTES_1 = {"", "triangle top", "standard deviation", "standard deviation"}; + public final static String[] LABELS_OF_EXTRA_ATTRIBUTES_2 = {"", "", "", "mean"}; protected int functionId; protected String extraAttribute1; + protected String extraAttribute2; public AvatarRandom(String _name, Object _referenceObject) { super(_name, _referenceObject); @@ -88,6 +91,10 @@ public class AvatarRandom extends AvatarStateMachineElement { return extraAttribute1; } + public String getExtraAttribute2() { + return extraAttribute2; + } + public void setVariable(String _variable) { variable = _variable; } @@ -104,6 +111,9 @@ public class AvatarRandom extends AvatarStateMachineElement { public void setExtraAttribute1(String _extraAttribute1) { extraAttribute1 = _extraAttribute1; } + public void setExtraAttribute2(String _extraAttribute2) { + extraAttribute2 = _extraAttribute2; + } public String getNiceName() { return "Random between " + minValue + " and " + maxValue + " stored in " + variable; @@ -120,7 +130,8 @@ public class AvatarRandom extends AvatarStateMachineElement { ar.setValues(minValue, maxValue); ar.setFunctionId(functionId); ar.setExtraAttribute1(extraAttribute1); + ar.setExtraAttribute2(extraAttribute2); - return ar; + return ar; } } diff --git a/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java b/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java index 35075d415eebe7379490fa95977664f2890b75dc..21f5616d1d3aee34a1856373507d01d58a01e04b 100644 --- a/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java +++ b/src/main/java/avatartranslator/directsimulation/AvatarSimulationBlock.java @@ -402,13 +402,23 @@ public class AvatarSimulationBlock { extra1 = 0.0; } + double extra2; + //TraceManager.addDev("Extra2=" + random.getExtraAttribute2()); + try { + extra2 = Double.parseDouble(random.getExtraAttribute2()); + } catch (Exception e) { + //TraceManager.addDev("Extra2 exception"); + extra2 = 0.0; + } + //TraceManager.addDev("Extra2=" + extra2); + if ((forcedRandom > -1) && (forcedRandom >= valMin) && (forcedRandom <= valMax)) { // Use provided value as random value valMin = forcedRandom; } else { // randomly select a value according to distribution law - valMin = makeRandom(valMin, valMax, random.getFunctionId(), extra1); + valMin = makeRandom(valMin, valMax, random.getFunctionId(), extra1, extra2); } attributeValues.remove(index); attributeValues.add(index, "" + valMin); @@ -727,7 +737,7 @@ public class AvatarSimulationBlock { return result; } - public int makeRandom(int minV, int maxV, int functionID, double extra1) { + public int makeRandom(int minV, int maxV, int functionID, double extra1, double extra2) { switch (functionID) { case AvatarRandom.RANDOM_UNIFORM_LAW: //TraceManager.addDev("\n\n\n******* UNIFORM LAW ********"); @@ -735,10 +745,16 @@ public class AvatarSimulationBlock { case AvatarRandom.RANDOM_TRIANGULAR_LAW: //TraceManager.addDev("\n\n\n******* TRIANGULAR LAW ********"); return (int) (MyMath.triangularDistribution((double) (minV), (double) (maxV), extra1)); - case AvatarTransition.DELAY_GAUSSIAN_LAW: + case AvatarRandom.RANDOM_GAUSSIAN_LAW: //TraceManager.addDev("\n\n\n******* GAUSSIAN LAW ********"); return (int)(Math.floor(MyMath.gaussianDistribution((double) (minV), (double) (maxV), extra1))); - + case AvatarRandom.RANDOM_LOG_NORMAL_LAW: + try { + return (int) (Math.floor(MyMath.logNormalDistribution((double) (minV), (double) (maxV), extra1, extra2))); + } catch (Exception e) { + TraceManager.addDev("Exception on log normal: " + e.getMessage()); + return minV; + } } return minV; } diff --git a/src/main/java/myutil/MyMath.java b/src/main/java/myutil/MyMath.java index 20b38db7ff9af6aedb6e7015deda8c470ffb5a5d..f780ca1bbf3cf6281f045eb3b0ea335c9332e84e 100644 --- a/src/main/java/myutil/MyMath.java +++ b/src/main/java/myutil/MyMath.java @@ -42,6 +42,7 @@ package myutil; import java.util.Random; +import org.apache.commons.math3.distribution.LogNormalDistribution; /** * Class MyMath @@ -129,5 +130,19 @@ public class MyMath { return n; } + + public static double logNormalDistribution(double a, double b, double sigma, double mean) { + //TraceManager.addDev("LOG NORMAL. SIGMA=" + sigma + " MEAN=" + mean); + LogNormalDistribution lnd = new LogNormalDistribution(sigma, mean); + double val = lnd.sample(); + val += a; + if (val > b) { + return logNormalDistribution(a, b, sigma, mean); + } + return val; + } + + + } diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index b54fc6ec0fefea06caa61430bc5528efb8986dd7..a4b55ed06d63fa8711c61bbf2b943fca084a0f86 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -1558,6 +1558,8 @@ public class AvatarDesignPanelTranslator { arandom.setValues(tmp1, tmp2); arandom.setFunctionId(asmdrand.getFunctionId()); arandom.setExtraAttribute1(asmdrand.getExtraAttribute1()); + arandom.setExtraAttribute2(asmdrand.getExtraAttribute2()); + tmp1 = modifyString(asmdrand.getVariable()); AvatarAttribute aa = _ab.getAvatarAttributeWithName(tmp1); diff --git a/src/main/java/ui/avatarsmd/AvatarSMDRandom.java b/src/main/java/ui/avatarsmd/AvatarSMDRandom.java index 066e3008ef8c4087453d63a741aafb2231be5af1..157cccf43a67923b64fe663dde355e2f99fdbfb1 100755 --- a/src/main/java/ui/avatarsmd/AvatarSMDRandom.java +++ b/src/main/java/ui/avatarsmd/AvatarSMDRandom.java @@ -68,6 +68,7 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is protected String minValue; protected String maxValue; protected String extraAttribute1; + protected String extraAttribute2; protected int functionId; protected int stateOfError = 0; // Not yet checked @@ -96,6 +97,7 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is maxValue = "10"; functionId = 0; extraAttribute1 = ""; + extraAttribute2 = ""; myImageIcon = IconManager.imgic912; } @@ -162,7 +164,7 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is String tmpName; JDialogTMLADRandom dialog = new JDialogTMLADRandom(frame, "Setting RANDOM attributes", - getVariable(), getMinValue(), getMaxValue(), getFunctionId(), getExtraAttribute1()); + getVariable(), getMinValue(), getMaxValue(), getFunctionId(), getExtraAttribute1(), getExtraAttribute2()); //dialog.setSize(500, 450); GraphicLib.centerOnParent(dialog, 500, 450); dialog.setVisible( true ); // blocked until dialog has been closed @@ -207,6 +209,15 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is extraAttribute1 = formerExtra; } + formerExtra = extraAttribute2; + extraAttribute2 = dialog.getExtraAttribute2(); + double extra2; + try { + extra2 = Double.parseDouble(extraAttribute2); + } catch (Exception e) { + extraAttribute2 = formerExtra; + } + if (error) { JOptionPane.showMessageDialog(frame, @@ -258,6 +269,10 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is return extraAttribute1; } + public String getExtraAttribute2() { + return extraAttribute2; + } + @Override protected String translateExtraParam() { StringBuffer sb = new StringBuffer("<extraparam>\n"); @@ -271,6 +286,8 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is sb.append(getFunctionId()); sb.append("\" extraAttribute1=\""); sb.append(getExtraAttribute1()); + sb.append("\" extraAttribute2=\""); + sb.append(getExtraAttribute2()); sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -303,6 +320,10 @@ public class AvatarSMDRandom extends AvatarSMDBasicCanBeDisabledComponent /* Is if (extraAttribute1 == null) { extraAttribute1 = ""; } + extraAttribute2 = elt.getAttribute("extraAttribute2"); + if (extraAttribute2 == null) { + extraAttribute2 = ""; + } s = elt.getAttribute("functionId"); if (s != null) { try { diff --git a/src/main/java/ui/tmlad/TMLADRandom.java b/src/main/java/ui/tmlad/TMLADRandom.java index 635f7c074d4438cc3bdf3ef361a36da30b1c93db..a5e8308f70e8c844f353dff82e96685d4ffd9594 100755 --- a/src/main/java/ui/tmlad/TMLADRandom.java +++ b/src/main/java/ui/tmlad/TMLADRandom.java @@ -146,7 +146,7 @@ public class TMLADRandom extends TADComponentWithoutSubcomponents/* Issue #69 TG String tmpName; JDialogTMLADRandom dialog = new JDialogTMLADRandom(frame, "Setting RANDOM attributes", - getVariable(), getMinValue(), getMaxValue(), getFunctionId(), null); + getVariable(), getMinValue(), getMaxValue(), getFunctionId(), null, null); //dialog.setSize(500, 450); GraphicLib.centerOnParent(dialog, 500, 450); dialog.setVisible( true ); // blocked until dialog has been closed diff --git a/src/main/java/ui/window/JDialogTMLADRandom.java b/src/main/java/ui/window/JDialogTMLADRandom.java index 0ecc27b40500c0dd37de02a1ee9e454a0b6cf451..15bfe01ad2c9f4c6b045a31f9fecf59e52e566b5 100644 --- a/src/main/java/ui/window/JDialogTMLADRandom.java +++ b/src/main/java/ui/window/JDialogTMLADRandom.java @@ -65,20 +65,20 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener { private JPanel panel2; private Frame frame; - private String variable, minValue, maxValue, extraAttribute1; + private String variable, minValue, maxValue, extraAttribute1, extraAttribute2; private int functionId; // Panel2 - private JTextField jvariable, jminValue, jmaxValue, jextraAttribute1; - private JLabel jextraAttribute1L; + private JTextField jvariable, jminValue, jmaxValue, jextraAttribute1, jextraAttribute2; + private JLabel jextraAttribute1L, jextraAttribute2L; private JComboBox<String> randomFunction; /* Creates new form */ public JDialogTMLADRandom(Frame _frame, String _title, String _variable, String _minValue, String _maxValue, int _functionId, - String _extraAttribute1) { + String _extraAttribute1, String _extraAttribute2) { super(_frame, _title, true); frame = _frame; variable = _variable; @@ -86,6 +86,7 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener { maxValue = _maxValue; functionId = _functionId; extraAttribute1 = _extraAttribute1; + extraAttribute2 = _extraAttribute2; initComponents(); myInitComponents(); @@ -168,6 +169,17 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener { panel2.add(jextraAttribute1, c2); } + if (extraAttribute2 != null) { + c2.gridwidth = 1; + jextraAttribute2L = new JLabel(""); + panel2.add(jextraAttribute2L, c2); + c2.gridwidth = GridBagConstraints.REMAINDER; //end row + jextraAttribute2 = new JTextField(extraAttribute2, 30); + jextraAttribute2.setEditable(true); + jextraAttribute2.setFont(new Font("times", Font.PLAIN, 12)); + panel2.add(jextraAttribute2, c2); + } + checkAttributesDistributionLawB(); // main panel; @@ -236,17 +248,30 @@ public class JDialogTMLADRandom extends JDialogBase implements ActionListener { public String getExtraAttribute1() {return jextraAttribute1.getText();} + public String getExtraAttribute2() {return jextraAttribute2.getText();} + private void checkAttributesDistributionLawB() { if (extraAttribute1 != null) { functionId = randomFunction.getSelectedIndex(); int nbOfExtras = AvatarRandom.NB_OF_EXTRA_ATTRIBUTES[functionId]; jextraAttribute1.setEnabled(nbOfExtras > 0); - if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES[functionId].length() > 0) - jextraAttribute1L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES[functionId] + ":"); + if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_1[functionId].length() > 0) + jextraAttribute1L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_1[functionId] + ":"); else { jextraAttribute1L.setText(""); } } + + if (extraAttribute2 != null) { + functionId = randomFunction.getSelectedIndex(); + int nbOfExtras = AvatarRandom.NB_OF_EXTRA_ATTRIBUTES[functionId]; + jextraAttribute2.setEnabled(nbOfExtras > 1); + if (AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_2[functionId].length() > 0) + jextraAttribute2L.setText(AvatarRandom.LABELS_OF_EXTRA_ATTRIBUTES_2[functionId] + ":"); + else { + jextraAttribute2L.setText(""); + } + } }