r4019 - in trunk/src/main/java/fr/ifremer/isisfish: simulator/sensitivity simulator/sensitivity/domain ui/sensitivity/wizard
Author: echatellier Date: 2014-06-17 14:34:23 +0200 (Tue, 17 Jun 2014) New Revision: 4019 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4019 Log: fixes #5245: R?\195?\169introduire la possibilit?\195?\169 de d?\195?\169finir des facteurs continus sur des matrices Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java 2014-06-17 09:02:25 UTC (rev 4018) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/SensitivityUtils.java 2014-06-17 12:34:23 UTC (rev 4019) @@ -30,6 +30,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; import fr.ifremer.isisfish.entities.Equation; import fr.ifremer.isisfish.types.RangeOfValues; @@ -134,6 +135,8 @@ result = true; } else if (value instanceof Equation) { result = true; + } else if (value instanceof MatrixND) { + result = true; } else if (value instanceof RangeOfValues) { RangeOfValues rangeOfValues = (RangeOfValues)value; if (rangeOfValues.getType().equals("Float")) { Modified: trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2014-06-17 09:02:25 UTC (rev 4018) +++ trunk/src/main/java/fr/ifremer/isisfish/simulator/sensitivity/domain/ContinuousDomain.java 2014-06-17 12:34:23 UTC (rev 4019) @@ -35,6 +35,7 @@ import org.apache.commons.beanutils.MethodUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.simulator.sensitivity.Distribution; @@ -178,19 +179,19 @@ args.add(identifier); // build distribution param args list - Class distClass = distribution.getDistClass(); + // QUNIFPC est un cas particulier dans toutes les distributions possibles if (distribution == Distribution.QUNIFPC) { // special management : % to min/max Object reference = distributionParameters.get(Distribution.QUNIFPC.getDistibutionParams()[0].getName()); double coef = (Double)distributionParameters.get(Distribution.QUNIFPC.getDistibutionParams()[1].getName()); - double ref = (Double)reference; - args.add(ref * (1.0 - coef)); // min - args.add(ref * (1.0 + coef)); // max - } else if (distribution == Distribution.QUNIFMM) { - Object min = distributionParameters.get(Distribution.QUNIFMM.getDistibutionParams()[0].getName()); - args.add(min); - Object max = distributionParameters.get(Distribution.QUNIFMM.getDistibutionParams()[1].getName()); - args.add(max); + if (reference instanceof MatrixND) { + args.add(1.0 - coef); // min + args.add(1.0 + coef); // max + } else { + double ref = (Double)reference; + args.add(ref * (1.0 - coef)); // min + args.add(ref * (1.0 + coef)); // max + } } else { for (DistributionParam param : distribution.getDistibutionParams()) { String name = param.getName(); @@ -199,11 +200,13 @@ } } - // add default value for lower.tail = TRUE, log.p = FALSE + // add default value for lower.tail = TRUE args.add(true); + // add default value forlog.p = FALSE args.add(false); // invoke quantile method + Class distClass = distribution.getDistClass(); Object result = null; try { result = MethodUtils.invokeStaticMethod(distClass, "quantile", args.toArray()); @@ -213,6 +216,14 @@ } } + // pour les matrices, on retourne la matrice multipliée par la valeur données par R + if (distribution == Distribution.QUNIFPC) { + Object reference = distributionParameters.get(Distribution.QUNIFPC.getDistibutionParams()[0].getName()); + if (reference instanceof MatrixND) { + MatrixND ref = ((MatrixND)reference).copy(); + result = ref.mults((Double)result); + } + } return result; } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java 2014-06-17 09:02:25 UTC (rev 4018) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/ContinuousDistributionPanel.java 2014-06-17 12:34:23 UTC (rev 4019) @@ -44,6 +44,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.math.matrix.MatrixND; +import org.nuiton.math.matrix.gui.MatrixPanelEditor; import fr.ifremer.isisfish.simulator.sensitivity.Distribution; import fr.ifremer.isisfish.simulator.sensitivity.Distribution.DistributionParam; @@ -89,8 +91,16 @@ GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); + // values possibility depending on input type + Distribution[] values; + if (originalValue instanceof MatrixND) { + values = new Distribution[]{Distribution.QUNIFPC}; + } else { + values = Distribution.values(); + } + // combobox - distributionCombo = new JComboBox<Distribution>(Distribution.values()); + distributionCombo = new JComboBox<Distribution>(values); // important : for setSelectedItem to fire event distributionCombo.setSelectedItem(null); distributionCombo.addItemListener(this); @@ -128,7 +138,11 @@ if (value != null) { JComponent comp = paramComponents.get(paramComponentIndex); - ((JTextComponent)comp).setText(value.toString()); + if (comp instanceof MatrixPanelEditor) { + ((MatrixPanelEditor)comp).setMatrix((MatrixND)value); + } else { + ((JTextComponent)comp).setText(value.toString()); + } } else { if (log.isWarnEnabled()) { log.warn("Param " + param.getName() + " not found during init"); @@ -180,16 +194,28 @@ JComponent paramField = getParamField(param); paramField.setToolTipText(param.getDescription()); - // rendu simple - dynamicPanel.add(paramLabel, new GridBagConstraints(0, index, 1, 1, 0, 0, - GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, - new Insets(0, 0, 0, 0), 0, 0)); + // rendu étendu pour les matrix panels + if (paramField instanceof MatrixPanelEditor) { + dynamicPanel.add(paramLabel, new GridBagConstraints(0, index, 2, 1, 0, 0, + GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + dynamicPanel.add(paramField, new GridBagConstraints(0, index, 2, 1, 1, 1, + GridBagConstraints.NORTH, GridBagConstraints.BOTH, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + } else { + // rendu simple + dynamicPanel.add(paramLabel, new GridBagConstraints(0, index, 1, 1, 0, 0, + GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + + dynamicPanel.add(paramField, new GridBagConstraints(1, index, 1, 1, 1, 0, + GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, + new Insets(0, 0, 0, 0), 0, 0)); + index++; + } - dynamicPanel.add(paramField, new GridBagConstraints(1, index, 1, 1, 1, 0, - GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, - new Insets(0, 0, 0, 0), 0, 0)); - index++; - paramComponents.add(paramField); } @@ -211,7 +237,12 @@ JComponent result; if (param.isOriginalValue()) { - result = new JTextField(originalValue.toString()); + if (originalValue instanceof MatrixND) { + result = new MatrixPanelEditor(); + ((MatrixPanelEditor)result).setMatrix((MatrixND)originalValue); + } else { + result = new JTextField(originalValue.toString()); + } } else { result = new JTextField(); } @@ -250,9 +281,13 @@ for (DistributionParam param : params) { JComponent comp = paramComponents.get(paramComponentIndex); - // XXX echatellier 20131201 : always double type ? - String strValue = ((JTextComponent)comp).getText().trim(); - domain.addDistributionParam(param.getName(), Double.parseDouble(strValue)); + if (comp instanceof MatrixPanelEditor) { + domain.addDistributionParam(param.getName(), ((MatrixPanelEditor)comp).getMatrix()); + } else { + // XXX echatellier 20131201 : always double type ? + String strValue = ((JTextComponent)comp).getText().trim(); + domain.addDistributionParam(param.getName(), Double.parseDouble(strValue)); + } paramComponentIndex++; } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java 2014-06-17 09:02:25 UTC (rev 4018) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/wizard/SensitivityWizardHandler.java 2014-06-17 12:34:23 UTC (rev 4019) @@ -372,6 +372,9 @@ ui.setBeanProperty(property); ui.setBean(bean); result = ui; + } else if (value instanceof MatrixND) { + MatrixND matrix = (MatrixND)value; + result = new ContinuousDistributionPanel(matrix.clone()); } else if (value instanceof TimeUnit) { TimeUnit timeUnit = (TimeUnit)value; //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); @@ -580,6 +583,9 @@ ui.setBeanProperty(property); ui.setBean(entity); result = ui; + } else if (value instanceof MatrixND) { + MatrixND matrix = (MatrixND)value; + result = new ContinuousDistributionPanel(matrix.clone()); } else if (value instanceof TimeUnit) { TimeUnit timeUnit = (TimeUnit)value; //DefaultContinuousPanelUI ui = new DefaultContinuousPanelUI(); @@ -597,7 +603,24 @@ topiaContext.closeContext(); } else { - if (factorPath.startsWith("parameters.rule.")) { + if (factorPath.startsWith("parameters.population.")) { + // la seule facon d'avoir les parametres ici est d'aller + // les chercher dans les parametres de simulation + Pattern pattern = Pattern.compile("^parameters\\.population\\.(\\w+)(\\.(.+)?)$"); + Matcher matcher = pattern.matcher(factorPath); + if (matcher.matches()) { + String populationName = matcher.group(1); + if (log.isDebugEnabled()) { + log.debug("Loading population : " + populationName); + } + TopiaContext topiaContext = getTopiaContext(factorWizardUI); + Population pop = IsisFishDAOHelper.getPopulationDAO(topiaContext).findByName(populationName); + SimulAction action = factorWizardUI.getContextValue(SimulAction.class); + MatrixND N = action.getSimulationParameter().getNumberOf(pop); + result = new ContinuousDistributionPanel(N.clone()); + topiaContext.closeContext(); + } + } else if (factorPath.startsWith("parameters.rule.")) { Pattern pattern = Pattern.compile("^parameters\\.rule\\.(\\d+)\\.parameter\\.(\\w+)(\\..+)?$"); Matcher matcher = pattern.matcher(factorPath); if (matcher.matches()) {
participants (1)
-
echatellier@users.forge.codelutin.com