From 099483ef3769445ed1246e430571b618c942e981 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Mon, 13 Jul 2026 18:15:52 +0100 Subject: [PATCH 01/17] resolve varargs related warnings When a function expects an `fn(Object... args)` set of arguments, calling - `fn(T[] array)` casts the array to an `Object[]` - `fn(null)` is equivalent to `fn()` for backward compatibility when varargs weren't a thing in Java and functions expected an `Object[] args` instead. This however comes with a warning due to the ambiguity with passing that `T[]` or `null` as a single object that would be the only item in `args`. This commit resolves those warnings. --- src/main/java/microsim/engine/SimulationEngine.java | 2 +- src/main/java/microsim/event/CollectionTargetEvent.java | 4 ++-- src/main/java/microsim/event/SingleTargetEvent.java | 4 ++-- src/main/java/microsim/gui/probe/MethodsDataModel.java | 2 +- src/main/java/microsim/reflection/DoubleValueExtractor.java | 2 +- src/main/java/microsim/reflection/FloatValueExtractor.java | 2 +- src/main/java/microsim/reflection/IntegerValueExtractor.java | 2 +- src/main/java/microsim/reflection/LongValueExtractor.java | 2 +- src/main/java/microsim/reflection/StringValueExtractor.java | 2 +- .../java/microsim/statistics/reflectors/DoubleInvoker.java | 2 +- .../java/microsim/statistics/reflectors/FloatInvoker.java | 2 +- .../java/microsim/statistics/reflectors/IntegerInvoker.java | 2 +- src/main/java/microsim/statistics/reflectors/LongInvoker.java | 2 +- .../java/microsim/statistics/reflectors/StringInvoker.java | 2 +- 14 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/microsim/engine/SimulationEngine.java b/src/main/java/microsim/engine/SimulationEngine.java index a2806982..52e8f9fb 100644 --- a/src/main/java/microsim/engine/SimulationEngine.java +++ b/src/main/java/microsim/engine/SimulationEngine.java @@ -434,7 +434,7 @@ public void buildModels() { try { currentExperiment = ExperimentManager.getInstance().setupExperiment(currentExperiment, - models.toArray(new SimulationManager[models.size()])); + models.toArray()); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/microsim/event/CollectionTargetEvent.java b/src/main/java/microsim/event/CollectionTargetEvent.java index 1d2d6c64..9843f74e 100644 --- a/src/main/java/microsim/event/CollectionTargetEvent.java +++ b/src/main/java/microsim/event/CollectionTargetEvent.java @@ -75,7 +75,7 @@ public void setForObject(Collection elements, Class objectType, Class cl = objectType; while (cl != null) try { - methodInvoker = cl.getDeclaredMethod(method, null); + methodInvoker = cl.getDeclaredMethod(method); return; } catch (NoSuchMethodException e) { cl = cl.getSuperclass(); @@ -112,7 +112,7 @@ public void fireEvent() { if (methodInvoker != null) { while (itr.hasNext()) { try { - methodInvoker.invoke(itr.next(), null); + methodInvoker.invoke(itr.next()); } catch (InvocationTargetException e) { System.out.println("Object " + methodInvoker + " Method: " + methodInvoker.getName()); diff --git a/src/main/java/microsim/event/SingleTargetEvent.java b/src/main/java/microsim/event/SingleTargetEvent.java index 3f433702..0eeee54b 100644 --- a/src/main/java/microsim/event/SingleTargetEvent.java +++ b/src/main/java/microsim/event/SingleTargetEvent.java @@ -70,7 +70,7 @@ public void setForObject(Object o, String method) throws SimulationException { Class cl = o.getClass(); while (cl != null) try { - methodInvoker = cl.getDeclaredMethod(method, null); + methodInvoker = cl.getDeclaredMethod(method); return; } catch (NoSuchMethodException e) { cl = cl.getSuperclass(); @@ -105,7 +105,7 @@ public String toString() { public void fireEvent() { if (methodInvoker != null) { try { - methodInvoker.invoke(object, null); + methodInvoker.invoke(object); } catch (InvocationTargetException e) { System.out.println("Object " + methodInvoker + " Method: " + methodInvoker.getName()); diff --git a/src/main/java/microsim/gui/probe/MethodsDataModel.java b/src/main/java/microsim/gui/probe/MethodsDataModel.java index f86daf5f..c10db7f8 100644 --- a/src/main/java/microsim/gui/probe/MethodsDataModel.java +++ b/src/main/java/microsim/gui/probe/MethodsDataModel.java @@ -145,7 +145,7 @@ public void invokeMethodAt(int index) { } try { - Object o = m.invoke(targetObj, null); + Object o = m.invoke(targetObj); if (o == null) return; diff --git a/src/main/java/microsim/reflection/DoubleValueExtractor.java b/src/main/java/microsim/reflection/DoubleValueExtractor.java index bb2cef8f..fc81fd58 100644 --- a/src/main/java/microsim/reflection/DoubleValueExtractor.java +++ b/src/main/java/microsim/reflection/DoubleValueExtractor.java @@ -126,7 +126,7 @@ public double getDouble(Object target) { if (method == null) return field.getDouble(target); else - return ((Double) method.invoke(target, null)).doubleValue(); + return ((Double) method.invoke(target)).doubleValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/reflection/FloatValueExtractor.java b/src/main/java/microsim/reflection/FloatValueExtractor.java index 6a9fad50..d3d5818d 100644 --- a/src/main/java/microsim/reflection/FloatValueExtractor.java +++ b/src/main/java/microsim/reflection/FloatValueExtractor.java @@ -125,7 +125,7 @@ public float getFloat(Object target) { if (method == null) return field.getFloat(target); else - return ((Float) method.invoke(target, null)).floatValue(); + return ((Float) method.invoke(target)).floatValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/reflection/IntegerValueExtractor.java b/src/main/java/microsim/reflection/IntegerValueExtractor.java index 3e41019e..b1623089 100644 --- a/src/main/java/microsim/reflection/IntegerValueExtractor.java +++ b/src/main/java/microsim/reflection/IntegerValueExtractor.java @@ -126,7 +126,7 @@ public int getInt(Object target) { if (method == null) return field.getInt(target); else - return ((Integer) method.invoke(target, null)).intValue(); + return ((Integer) method.invoke(target)).intValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/reflection/LongValueExtractor.java b/src/main/java/microsim/reflection/LongValueExtractor.java index af811c46..88b2a708 100644 --- a/src/main/java/microsim/reflection/LongValueExtractor.java +++ b/src/main/java/microsim/reflection/LongValueExtractor.java @@ -125,7 +125,7 @@ public long getLong(Object target) { if (method == null) return field.getLong(target); else - return ((Long) method.invoke(target, null)).longValue(); + return ((Long) method.invoke(target)).longValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/reflection/StringValueExtractor.java b/src/main/java/microsim/reflection/StringValueExtractor.java index 71e9a3da..af9cbe75 100644 --- a/src/main/java/microsim/reflection/StringValueExtractor.java +++ b/src/main/java/microsim/reflection/StringValueExtractor.java @@ -129,7 +129,7 @@ public String getString(Object target) { if (method == null) return (String) field.get(target); else - return (String) method.invoke(target, null); + return (String) method.invoke(target); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/statistics/reflectors/DoubleInvoker.java b/src/main/java/microsim/statistics/reflectors/DoubleInvoker.java index fe0d62a9..bb18a3f8 100644 --- a/src/main/java/microsim/statistics/reflectors/DoubleInvoker.java +++ b/src/main/java/microsim/statistics/reflectors/DoubleInvoker.java @@ -135,7 +135,7 @@ public double getDouble(Object target) { return ((Double) field.get(target)).doubleValue(); } } else - return ((Double) method.invoke(target, null)).doubleValue(); + return ((Double) method.invoke(target)).doubleValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/statistics/reflectors/FloatInvoker.java b/src/main/java/microsim/statistics/reflectors/FloatInvoker.java index 3f0dca05..fc0d5664 100644 --- a/src/main/java/microsim/statistics/reflectors/FloatInvoker.java +++ b/src/main/java/microsim/statistics/reflectors/FloatInvoker.java @@ -132,7 +132,7 @@ public float getFloat(Object target) { return ((Float) field.get(target)).floatValue(); } } else - return ((Float) method.invoke(target, null)).floatValue(); + return ((Float) method.invoke(target)).floatValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/statistics/reflectors/IntegerInvoker.java b/src/main/java/microsim/statistics/reflectors/IntegerInvoker.java index 3ead7828..01337e0d 100644 --- a/src/main/java/microsim/statistics/reflectors/IntegerInvoker.java +++ b/src/main/java/microsim/statistics/reflectors/IntegerInvoker.java @@ -132,7 +132,7 @@ public int getInt(Object target) { return ((Integer) field.get(target)).intValue(); } } else - return ((Integer) method.invoke(target, null)).intValue(); + return ((Integer) method.invoke(target)).intValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/statistics/reflectors/LongInvoker.java b/src/main/java/microsim/statistics/reflectors/LongInvoker.java index bd39feee..e540c1b3 100644 --- a/src/main/java/microsim/statistics/reflectors/LongInvoker.java +++ b/src/main/java/microsim/statistics/reflectors/LongInvoker.java @@ -132,7 +132,7 @@ public long getLong(Object target) { return ((Long) field.get(target)).longValue(); } } else - return ((Long) method.invoke(target, null)).longValue(); + return ((Long) method.invoke(target)).longValue(); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) diff --git a/src/main/java/microsim/statistics/reflectors/StringInvoker.java b/src/main/java/microsim/statistics/reflectors/StringInvoker.java index 680d4895..c6a4baae 100644 --- a/src/main/java/microsim/statistics/reflectors/StringInvoker.java +++ b/src/main/java/microsim/statistics/reflectors/StringInvoker.java @@ -130,7 +130,7 @@ public String getString(Object target) { if (method == null) return (String) field.get(target); else - return (String) method.invoke(target, null); + return (String) method.invoke(target); } catch (InvocationTargetException ie) { StringBuffer message = new StringBuffer(); if (method == null) From 8f3ae03e19ec0a7ac7fb27a642944fe7f71cd437 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Mon, 13 Jul 2026 18:51:15 +0100 Subject: [PATCH 02/17] rm redundant casts --- .../gui/colormap/DoubleRangeColorMap.java | 6 +++--- .../gui/colormap/TripleRangeColorMap.java | 12 ++++++------ .../plot/CollectionBarSimulationPlotter.java | 2 +- .../gui/plot/HistogramSimulationPlotter.java | 2 +- .../Weighted_HistogramSimulationPlotter.java | 2 +- .../gui/plot/Weighted_PyramidPlotter.java | 4 ++-- .../microsim/gui/probe/MethodsDataModel.java | 4 ++-- .../java/microsim/gui/probe/ProbeFrame.java | 5 +---- .../gui/space/LayerObjectGridDrawer.java | 2 +- .../gui/space/LayeredSurfacePanel.java | 18 +++++++++--------- .../gui/space/LayeredSurfaceProperties.java | 8 ++------ .../microsim/gui/utils/ImageGenerator.java | 2 +- .../java/microsim/space/SparseObjectSpace.java | 2 +- .../java/microsim/statistics/TimeSeries.java | 2 +- 14 files changed, 32 insertions(+), 39 deletions(-) diff --git a/src/main/java/microsim/gui/colormap/DoubleRangeColorMap.java b/src/main/java/microsim/gui/colormap/DoubleRangeColorMap.java index 27b05dd6..a874c805 100644 --- a/src/main/java/microsim/gui/colormap/DoubleRangeColorMap.java +++ b/src/main/java/microsim/gui/colormap/DoubleRangeColorMap.java @@ -43,9 +43,9 @@ public DoubleRangeColorMap(int gradients, Color bottomColor, Color topColor, for (int i = 0; i < gradients; i++) { // int[] c = getComponents(getBoundedCol(i * gap)); int[] c = new int[] { 0, 0, 0 }; - c[0] = redStart + (int) ((redEnd - redStart) * i / gradients); - c[1] = greenStart + (int) ((greenEnd - redStart) * i / gradients); - c[2] = blueStart + (int) ((blueEnd - redStart) * i / gradients); + c[0] = redStart + ((redEnd - redStart) * i / gradients); + c[1] = greenStart + ((greenEnd - redStart) * i / gradients); + c[2] = blueStart + ((blueEnd - redStart) * i / gradients); addColor(i, new Color(c[0], c[1], c[2])); } diff --git a/src/main/java/microsim/gui/colormap/TripleRangeColorMap.java b/src/main/java/microsim/gui/colormap/TripleRangeColorMap.java index 99ca3b61..4353a159 100644 --- a/src/main/java/microsim/gui/colormap/TripleRangeColorMap.java +++ b/src/main/java/microsim/gui/colormap/TripleRangeColorMap.java @@ -71,9 +71,9 @@ public TripleRangeColorMap(int gradients, Color bottomColor, Color middleColor, for (int i = 0; i < lowGradients; i++) { // int[] c = getComponents(getBoundedCol(i * gap)); int[] c = new int[] { 0, 0, 0 }; - c[0] = redStart + (int) ((redMiddle - redStart) * i / gradients); - c[1] = greenStart + (int) ((greenMiddle - greenStart) * i / gradients); - c[2] = blueStart + (int) ((blueMiddle - blueStart) * i / gradients); + c[0] = redStart + ((redMiddle - redStart) * i / gradients); + c[1] = greenStart + ((greenMiddle - greenStart) * i / gradients); + c[2] = blueStart + ((blueMiddle - blueStart) * i / gradients); addColor(i, new Color(c[0], c[1], c[2])); } @@ -81,9 +81,9 @@ public TripleRangeColorMap(int gradients, Color bottomColor, Color middleColor, for (int i = lowGradients; i < gradients; i++) { // int[] c = getComponents(getBoundedCol(i * gap)); int[] c = new int[] { 0, 0, 0 }; - c[0] = redMiddle + (int) ((redEnd - redMiddle) * i / gradients); - c[1] = greenMiddle + (int) ((greenEnd - greenMiddle) * i / gradients); - c[2] = blueMiddle + (int) ((blueEnd - blueMiddle) * i / gradients); + c[0] = redMiddle + ((redEnd - redMiddle) * i / gradients); + c[1] = greenMiddle + ((greenEnd - greenMiddle) * i / gradients); + c[2] = blueMiddle + ((blueEnd - blueMiddle) * i / gradients); addColor(i, new Color(c[0], c[1], c[2])); } diff --git a/src/main/java/microsim/gui/plot/CollectionBarSimulationPlotter.java b/src/main/java/microsim/gui/plot/CollectionBarSimulationPlotter.java index 4a8357db..b78f4b97 100644 --- a/src/main/java/microsim/gui/plot/CollectionBarSimulationPlotter.java +++ b/src/main/java/microsim/gui/plot/CollectionBarSimulationPlotter.java @@ -236,7 +236,7 @@ public void onEvent(Enum type) { public void update() { for (int i = 0; i < sources.size(); i++) { - ArraySource cs = (ArraySource) sources.get(i); + var cs = sources.get(i); final String category = categories.get(i); double[] vals = cs.getDoubleArray(); diff --git a/src/main/java/microsim/gui/plot/HistogramSimulationPlotter.java b/src/main/java/microsim/gui/plot/HistogramSimulationPlotter.java index 51d1daa5..96897768 100644 --- a/src/main/java/microsim/gui/plot/HistogramSimulationPlotter.java +++ b/src/main/java/microsim/gui/plot/HistogramSimulationPlotter.java @@ -226,7 +226,7 @@ public void update() { // chart.getXYPlot().getRenderer().setSeriesPaint(s, new Color(r, g, b, 130)); for (int i = 0; i < sources.size(); i++) { - ArraySource cs = (ArraySource) sources.get(i); + var cs = sources.get(i); double[] vals = cs.getDoubleArray(); if (minimum != null && maximum != null) { diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java b/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java index 00ea4be8..f5b34aa4 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java @@ -247,7 +247,7 @@ public void update() { // chart.getXYPlot().getRenderer().setSeriesPaint(s, new Color(r, g, b, 130)); for (int i = 0; i < sources.size(); i++) { - WeightedArraySource cs = (WeightedArraySource) sources.get(i); + var cs = sources.get(i); double[] vals = cs.getDoubleArray(); double[] weights = cs.getWeights(); if (minimum != null && maximum != null) { diff --git a/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java b/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java index 83aebea5..9fa03fec 100644 --- a/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java +++ b/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java @@ -389,8 +389,8 @@ public void update() { double[][] groupRanges = null; // Get the source data - WeightedArraySource leftData = (WeightedArraySource) sources[0]; - WeightedArraySource rightData = (WeightedArraySource) sources[1]; + var leftData = sources[0]; + var rightData = sources[1]; final double[][] vals = new double[][] { leftData.getDoubleArray(), rightData.getDoubleArray() }; final double[][] weights = new double[][] { leftData.getWeights(), rightData.getWeights() }; diff --git a/src/main/java/microsim/gui/probe/MethodsDataModel.java b/src/main/java/microsim/gui/probe/MethodsDataModel.java index c10db7f8..2ed98a49 100644 --- a/src/main/java/microsim/gui/probe/MethodsDataModel.java +++ b/src/main/java/microsim/gui/probe/MethodsDataModel.java @@ -136,7 +136,7 @@ public Object getElementAt(int index) { } public void invokeMethodAt(int index) { - Method m = (Method) methods.get(index); + var m = methods.get(index); if (m.getParameterTypes().length > 0) { JOptionPane.showMessageDialog(null, "Method requires parameters", @@ -159,7 +159,7 @@ public void invokeMethodAt(int index) { } public void invokeMethodAt(int index, Object[] params) { - Method m = (Method) methods.get(index); + var m = methods.get(index); try { Object o = m.invoke(targetObj, params); diff --git a/src/main/java/microsim/gui/probe/ProbeFrame.java b/src/main/java/microsim/gui/probe/ProbeFrame.java index 095dbffa..0e467901 100644 --- a/src/main/java/microsim/gui/probe/ProbeFrame.java +++ b/src/main/java/microsim/gui/probe/ProbeFrame.java @@ -291,10 +291,7 @@ private void refreshData() { jTableVariables.updateUI(); methods.update(); jListMethods.updateUI(); - - for (int i = 0; i < openedPanels.size(); i++) - ((PanelObjectCollection) openedPanels.get(i)).updateList(); - + openedPanels.forEach(PanelObjectCollection::updateList); } void jBtnNewProbe_actionPerformed(ActionEvent e) { diff --git a/src/main/java/microsim/gui/space/LayerObjectGridDrawer.java b/src/main/java/microsim/gui/space/LayerObjectGridDrawer.java index 117a178c..d20276ef 100644 --- a/src/main/java/microsim/gui/space/LayerObjectGridDrawer.java +++ b/src/main/java/microsim/gui/space/LayerObjectGridDrawer.java @@ -124,7 +124,7 @@ private Color getColor(Object agent) throws SecurityException, if (invoker instanceof DoubleInvoker) level = (int) ((DoubleInvoker) invoker).getDouble(agent); else - level = (int) ((IntegerInvoker) invoker).getInt(agent); + level = ((IntegerInvoker) invoker).getInt(agent); int index = colorMap.getColorIndex(level); diff --git a/src/main/java/microsim/gui/space/LayeredSurfacePanel.java b/src/main/java/microsim/gui/space/LayeredSurfacePanel.java index f9ccff6b..7b3d817a 100644 --- a/src/main/java/microsim/gui/space/LayeredSurfacePanel.java +++ b/src/main/java/microsim/gui/space/LayeredSurfacePanel.java @@ -198,7 +198,7 @@ public void paintComponent(Graphics g) { ILayerDrawer lay; for (int i = 0; i < m_layers.size(); i++) { - lay = (ILayerDrawer) m_layers.get(i); + lay = m_layers.get(i); if (lay.isDisplayed()) lay.paint(g, cellLen); } @@ -211,11 +211,11 @@ private void this_mouseClicked(MouseEvent e) { if (e.getClickCount() != 2) return; - int x = (int) (e.getX() / cellLen); - int y = (int) (e.getY() / cellLen); + int x = e.getX() / cellLen; + int y = e.getY() / cellLen; for (int i = m_layers.size() - 1; i >= 0; i--) { - lay = (ILayerDrawer) m_layers.get(i); + lay = m_layers.get(i); if (lay.isDisplayed()) if (lay.performDblClickActionAt(x, y)) return; @@ -224,8 +224,8 @@ private void this_mouseClicked(MouseEvent e) { } private void this_mousePressed(MouseEvent e) { - lastX = (int) (e.getX() / cellLen); - lastY = (int) (e.getY() / cellLen); + lastX = e.getX() / cellLen; + lastY = e.getY() / cellLen; } private void this_mouseDragged(MouseEvent e) { @@ -237,11 +237,11 @@ private void this_mouseReleased(MouseEvent e) { lastY < 0 || lastY > virtualHeigth) return; - int x = (int) (e.getX() / cellLen); - int y = (int) (e.getY() / cellLen); + int x = e.getX() / cellLen; + int y = e.getY() / cellLen; for (int i = m_layers.size() - 1; i >= 0; i--) { - lay = (ILayerDrawer) m_layers.get(i); + lay = m_layers.get(i); if (lay.isDisplayed()) if (lay.performMouseMovedFromTo(lastX, lastY, x, y)) return; diff --git a/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java b/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java index 0571c196..080c69fb 100644 --- a/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java +++ b/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java @@ -83,9 +83,7 @@ public LayeredSurfaceProperties(Frame frame, String title, jCmbSize.addItem("" + i); jCmbSize.setSelectedIndex(cellSize - 1); - java.util.Iterator it = displayLayers.iterator(); - while (it.hasNext()) { - ILayerDrawer lay = (ILayerDrawer) it.next(); + for (var lay : displayLayers) { JCheckBox jc = new JCheckBox(lay.getDescription()); jc.setSelected(lay.isDisplayed()); jMainPanel.add(jc); @@ -143,9 +141,7 @@ void jBtnCancel_actionPerformed(ActionEvent e) { } void jBtnOK_actionPerformed(ActionEvent e) { - ILayerDrawer lay; - for (int i = 0; i < displayLayers.size(); i++) { - lay = (ILayerDrawer) displayLayers.get(i); + for (var lay : displayLayers) { lay.setDisplay(getStatusCheck(lay.getDescription())); } diff --git a/src/main/java/microsim/gui/utils/ImageGenerator.java b/src/main/java/microsim/gui/utils/ImageGenerator.java index 0c8583d4..6cea3393 100644 --- a/src/main/java/microsim/gui/utils/ImageGenerator.java +++ b/src/main/java/microsim/gui/utils/ImageGenerator.java @@ -62,7 +62,7 @@ public static String generate(JPanel panel) { panel.paint(svgGenerator); - return getOutput((SVGGraphics2D) svgGenerator); + return getOutput(svgGenerator); } public static String generate(JFrame frame) { diff --git a/src/main/java/microsim/space/SparseObjectSpace.java b/src/main/java/microsim/space/SparseObjectSpace.java index 3eb56a1e..9f2fa7c5 100644 --- a/src/main/java/microsim/space/SparseObjectSpace.java +++ b/src/main/java/microsim/space/SparseObjectSpace.java @@ -296,7 +296,7 @@ public boolean hasNext() { public Object next() { Map.Entry entry = it.next(); - currentKey = (HashKey) entry.getKey(); + currentKey = entry.getKey(); return entry.getValue(); } diff --git a/src/main/java/microsim/statistics/TimeSeries.java b/src/main/java/microsim/statistics/TimeSeries.java index bfaf7874..97a9bc4e 100644 --- a/src/main/java/microsim/statistics/TimeSeries.java +++ b/src/main/java/microsim/statistics/TimeSeries.java @@ -235,7 +235,7 @@ public Series getSeries(int seriesIndex) { throw new IndexOutOfBoundsException(seriesIndex + " is out of max bound " + series.size()); - return (Series) series.get(seriesIndex); + return series.get(seriesIndex); } /** From 5428dc87e30885c360922931694715aabb29d494 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Mon, 13 Jul 2026 18:53:09 +0100 Subject: [PATCH 03/17] resolve static warnings --- src/main/java/microsim/data/ExperimentManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/microsim/data/ExperimentManager.java b/src/main/java/microsim/data/ExperimentManager.java index 7a2f4753..a5238503 100644 --- a/src/main/java/microsim/data/ExperimentManager.java +++ b/src/main/java/microsim/data/ExperimentManager.java @@ -166,7 +166,7 @@ public Experiment setupExperiment(Experiment experiment, Object... models) throw // expandODB(experiment.inputFolder + File.separator + inputDatabaseName, // outFolder); - File inputDir = new File(experiment.inputFolder); + File inputDir = new File(Experiment.inputFolder); if (inputDir.exists()) { String[] files = inputDir.list(); for (String file : files) { @@ -181,7 +181,7 @@ public Experiment setupExperiment(Experiment experiment, Object... models) throw } else if (isMultiRun) { log.info("Persisting database connection at: " + DatabaseUtils.databaseInputUrl); } else { - DatabaseUtils.databaseInputUrl = experiment.inputFolder + File.separator + "input"; + DatabaseUtils.databaseInputUrl = Experiment.inputFolder + File.separator + "input"; } if (saveExperimentOnDatabase) { From d110d02c0bac6b4013c56857b4f1b4ac47353e46 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 13:43:18 +0100 Subject: [PATCH 04/17] make `IDiscreteChoiceModel` generic over Event This tightens type annotation to make them correct and eliminates some unchecked conversion warnings. --- .../regression/BinomialRegression.java | 16 +++++++--------- .../regression/GeneralisedOrderedRegression.java | 14 ++++++-------- .../regression/IDiscreteChoiceModel.java | 10 ++++------ .../regression/MultinomialRegression.java | 16 +++++++--------- .../statistics/regression/OrderedRegression.java | 14 ++++++-------- 5 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/main/java/microsim/statistics/regression/BinomialRegression.java b/src/main/java/microsim/statistics/regression/BinomialRegression.java index bb72bf98..9f0ed5a5 100644 --- a/src/main/java/microsim/statistics/regression/BinomialRegression.java +++ b/src/main/java/microsim/statistics/regression/BinomialRegression.java @@ -20,7 +20,7 @@ * * @author Justin van de Ven */ -public class BinomialRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { +public class BinomialRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { MultiKeyCoefficientMap map; private List eventList; @@ -52,23 +52,21 @@ public > double getProbability(IDoubleSource iDblSrc, Class< return getProbability(eventList.get(1), iDblSrc, Regressors); } - public & IntegerValuedEnum, E2 extends Enum> double getProbability(E event, - IDoubleSource iDblSrc, Class Regressors) { + public > double getProbability(E1 event, IDoubleSource iDblSrc, Class Regressors) { return getProbabilities(iDblSrc, Regressors).get(event); } - public & IntegerValuedEnum, E2 extends Enum> Map getProbabilities( - IDoubleSource iDblSrc, Class Regressors) { + public > Map getProbabilities(IDoubleSource iDblSrc, Class Regressors) { // probabilities are obtained for discrete alternatives of dependent variable in // increasing order of the feasible set // P(y=1|X) = F(Xb) - Map probs = new LinkedHashMap<>(); - E event; + var probs = new LinkedHashMap(); + E1 event; double prob = calculator.getProbability(map, iDblSrc, Regressors); - event = (E) eventList.get(0); + event = eventList.get(0); probs.put(event, 1.0 - prob); - event = (E) eventList.get(1); + event = eventList.get(1); probs.put(event, prob); return probs; diff --git a/src/main/java/microsim/statistics/regression/GeneralisedOrderedRegression.java b/src/main/java/microsim/statistics/regression/GeneralisedOrderedRegression.java index 7def67c5..28aa220d 100644 --- a/src/main/java/microsim/statistics/regression/GeneralisedOrderedRegression.java +++ b/src/main/java/microsim/statistics/regression/GeneralisedOrderedRegression.java @@ -22,7 +22,7 @@ * yhat_j = 1 if yhatstar_j>=0 and 0 otherwise * P(yhat_j=1|X) = P(yhatstar_j>=0|X) = P(Xb_j-e_j>=0) = F(Xb_j) *****************************************************************/ -public class GeneralisedOrderedRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { +public class GeneralisedOrderedRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { Map maps; private List eventList; @@ -42,22 +42,20 @@ public List getEventList() { return eventList; } - public & IntegerValuedEnum, E2 extends Enum> double getProbability(E event, - IDoubleSource iDblSrc, Class Regressors) { + public > double getProbability(E1 event, IDoubleSource iDblSrc, Class Regressors) { return getProbabilities(iDblSrc, Regressors).get(event); } - public & IntegerValuedEnum, E2 extends Enum> Map getProbabilities( - IDoubleSource iDblSrc, Class Regressors) { + public > Map getProbabilities(IDoubleSource iDblSrc, Class Regressors) { // probabilities are obtained for discrete alternatives of dependent variable in // increasing order of the feasible set // P(y_j) = P(yhat_j-1|X) - P(yhat_j|X) - Map probs = new LinkedHashMap<>(); + var probs = new LinkedHashMap(); double probHere, probPreceding = 1.0; for (int ii = 0; ii < eventList.size() - 1; ii++) { - E event = (E) eventList.get(ii); + var event = eventList.get(ii); if (maps.get(event) == null) throw new RuntimeException( "generalised ordered logit expected but failed to find regression estimates for event " @@ -71,7 +69,7 @@ public & IntegerValuedEnum, E2 extends Enum> Map & IntegerValuedEnum> { - & IntegerValuedEnum> List getEventList(); + List getEventList(); - & IntegerValuedEnum, E extends Enum> double getProbability(T event, IDoubleSource iDblSrc, - Class Regressors); + > double getProbability(E event, IDoubleSource iDblSrc, Class Regressors); - & IntegerValuedEnum, E extends Enum> Map getProbabilities(IDoubleSource iDblSrc, - Class Regressors); + > Map getProbabilities(IDoubleSource iDblSrc, Class Regressors); } diff --git a/src/main/java/microsim/statistics/regression/MultinomialRegression.java b/src/main/java/microsim/statistics/regression/MultinomialRegression.java index cfc71112..c9f55dde 100644 --- a/src/main/java/microsim/statistics/regression/MultinomialRegression.java +++ b/src/main/java/microsim/statistics/regression/MultinomialRegression.java @@ -23,7 +23,7 @@ * Identification is permitted by normalising one category, k, such that * exp(Xb_k) = 1.0 *****************************************************************/ -public class MultinomialRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { +public class MultinomialRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { Map maps; private List eventList; @@ -56,20 +56,18 @@ public List getEventList() { return eventList; } - public & IntegerValuedEnum, E2 extends Enum> double getProbability(E event, - IDoubleSource iDblSrc, Class Regressors) { + public > double getProbability(E1 event, IDoubleSource iDblSrc, Class Regressors) { return getProbabilities(iDblSrc, Regressors).get(event); } - public & IntegerValuedEnum, E2 extends Enum> Map getProbabilities( - IDoubleSource iDblSrc, Class Regressors) { + public > Map getProbabilities(IDoubleSource iDblSrc, Class Regressors) { // P(y_i=1|X) = exp(Xb_i) / sum(exp(Xb_1),...exp(Xb_n)) - Map expScores = new HashMap<>(); - Map probs = new LinkedHashMap<>(); + var expScores = new HashMap(); + var probs = new LinkedHashMap(); double denominator = 1.0; int countEventProbs = 0; - for (E event : (Set) maps.keySet()) { + for (var event : maps.keySet()) { double expScore = Math.exp(calculator.getScore(maps.get(event), iDblSrc, Regressors)); expScores.put(event, expScore); denominator += expScore; @@ -79,7 +77,7 @@ public & IntegerValuedEnum, E2 extends Enum> Map) eventList) { + for (var event : eventList) { Double val = expScores.get(event); probs.put(event, Objects.requireNonNullElse(val, 1.0) / denominator); } diff --git a/src/main/java/microsim/statistics/regression/OrderedRegression.java b/src/main/java/microsim/statistics/regression/OrderedRegression.java index de09bba7..78801ae5 100644 --- a/src/main/java/microsim/statistics/regression/OrderedRegression.java +++ b/src/main/java/microsim/statistics/regression/OrderedRegression.java @@ -28,7 +28,7 @@ * * @author Justin van de Ven */ -public class OrderedRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { +public class OrderedRegression & IntegerValuedEnum> implements IDiscreteChoiceModel { MultiKeyCoefficientMap map; private List eventList; @@ -63,23 +63,21 @@ public List getEventList() { return eventList; } - public & IntegerValuedEnum, E2 extends Enum> double getProbability(E event, - IDoubleSource iDblSrc, Class Regressors) { + public > double getProbability(E1 event, IDoubleSource iDblSrc, Class Regressors) { return getProbabilities(iDblSrc, Regressors).get(event); } - public & IntegerValuedEnum, E2 extends Enum> Map getProbabilities( - IDoubleSource iDblSrc, Class Regressors) { + public > Map getProbabilities(IDoubleSource iDblSrc, Class Regressors) { // probabilities are obtained for discrete alternatives of dependent variable in // increasing order of the feasible set // P(y_j|X) = F(cut_j-Xb) - F(cut_j-1-Xb) - Map probs = new LinkedHashMap<>(); + var probs = new LinkedHashMap(); double score = calculator.getScore(map, iDblSrc, Regressors); double probHere, probPreceding = 0.0; for (int ii = 0; ii < eventList.size() - 1; ii++) { - E event = (E) eventList.get(ii); + var event = eventList.get(ii); String key = Strings.concat("Cut", Integer.toString(ii + 1)); double cutVal = getCoefficient(key); probHere = calculator.getProbability(cutVal - score); @@ -91,7 +89,7 @@ public & IntegerValuedEnum, E2 extends Enum> Map Date: Tue, 14 Jul 2026 14:07:01 +0100 Subject: [PATCH 05/17] DatabaseUtils: eliminate some raw `HashMap` usage --- src/main/java/microsim/data/db/DatabaseUtils.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/microsim/data/db/DatabaseUtils.java b/src/main/java/microsim/data/db/DatabaseUtils.java index d6fe09a0..b22b304e 100644 --- a/src/main/java/microsim/data/db/DatabaseUtils.java +++ b/src/main/java/microsim/data/db/DatabaseUtils.java @@ -5,7 +5,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -253,7 +252,7 @@ public static EntityManager getEntityManger(boolean autoUpdate) { try { // Create the EntityManagerFactory - Map propertyMap = new HashMap(); + var propertyMap = new HashMap(); propertyMap.put("hibernate.connection.url", "jdbc:h2:file:" + databaseInputUrl); entityManagerFactory = Persistence.createEntityManagerFactory("sim-model", propertyMap); @@ -273,7 +272,7 @@ public static void inputSchemaUpdateEntityManger() { try { // Create the EntityManagerFactory - Map propertyMap = new HashMap(); + var propertyMap = new HashMap(); propertyMap.put("hibernate.connection.url", "jdbc:h2:file:" + DatabaseUtils.databaseInputUrl); EntityManager em = Persistence.createEntityManagerFactory("sim-model", propertyMap) .createEntityManager(); @@ -309,7 +308,7 @@ public static EntityManager getOutEntityManger(String persistenceUnitName) { try { // Create the EntityManagerFactory - Map propertyMap = new HashMap(); + var propertyMap = new HashMap(); propertyMap.put("hibernate.connection.url", "jdbc:h2:file:" + DatabaseUtils.databaseOutputUrl); outEntityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName, propertyMap); From 8c345a59242deebf37863bc3df46fdebc8c41c1a Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 15:22:29 +0100 Subject: [PATCH 06/17] `Weighted_HistogramDataset`: add `HistEntry` record This new type holds the information about each series, instead of that information being stored in a `Map` with no type information. This resolves numerous warnings regarding types. --- .../gui/plot/Weighted_HistogramDataset.java | 57 +++++++------------ 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java index 28451af9..8ee7f31b 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java @@ -40,9 +40,8 @@ import java.io.Serializable; import java.util.ArrayList; -import java.util.LinkedHashMap; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; import org.jfree.chart.util.Args; @@ -52,6 +51,9 @@ import org.jfree.data.xy.AbstractIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; +record HistEntry(Comparable key, List bins, int numValues, double binWidth) { +} + /** * A weighted dataset that can be used for creating weighted histograms. */ @@ -62,7 +64,7 @@ public class Weighted_HistogramDataset extends AbstractIntervalXYDataset private static final long serialVersionUID = -6341668077370231153L; /** A list of maps. */ - private List list; + private List entries; /** The histogram type. */ private HistogramType type; @@ -78,7 +80,7 @@ public class Weighted_HistogramDataset extends AbstractIntervalXYDataset * {@link HistogramType}.FREQUENCY. */ public Weighted_HistogramDataset() { - this.list = new ArrayList(); + this.entries = new ArrayList(); this.type = HistogramType.FREQUENCY; totalWeight = 0.; } @@ -156,7 +158,7 @@ public void addSeries(Comparable key, double[] values, double[] weightings, int double lower = minimum; double upper; - List binList = new ArrayList(bins); + var binList = new ArrayList(bins); for (int i = 0; i < bins; i++) { Weighted_HistogramBin bin; // make sure bins[bins.length]'s upper boundary ends at maximum @@ -191,13 +193,8 @@ public void addSeries(Comparable key, double[] values, double[] weightings, int bin.incrementCount(weightings[i]); totalWeight += weightings[i]; } - // generic map for each series - Map map = new LinkedHashMap(); - map.put("key", key); - map.put("bins", binList); - map.put("values.length", values.length); - map.put("bin width", binWidth); - this.list.add(map); + + this.entries.add(new HistEntry(key, Collections.unmodifiableList(binList), values.length, binWidth)); fireDatasetChanged(); } @@ -256,9 +253,8 @@ private double getMaximum(double[] values) { * @throws IndexOutOfBoundsException if series is outside the * specified range. */ - List getBins(int series) { - Map map = (Map) this.list.get(series); - return (List) map.get("bins"); + List getBins(int series) { + return this.entries.get(series).bins(); } /** @@ -269,8 +265,7 @@ List getBins(int series) { * @return The total. */ private int getTotal(int series) { - Map map = (Map) this.list.get(series); - return ((Integer) map.get("values.length")).intValue(); + return this.entries.get(series).numValues(); } /** @@ -281,8 +276,7 @@ private int getTotal(int series) { * @return The bin width. */ private double getBinWidth(int series) { - Map map = (Map) this.list.get(series); - return ((Double) map.get("bin width")).doubleValue(); + return this.entries.get(series).binWidth(); } /** @@ -292,7 +286,7 @@ private double getBinWidth(int series) { */ @Override public int getSeriesCount() { - return this.list.size(); + return this.entries.size(); } /** @@ -308,8 +302,7 @@ public int getSeriesCount() { */ @Override public Comparable getSeriesKey(int series) { - Map map = (Map) this.list.get(series); - return (Comparable) map.get("key"); + return this.entries.get(series).key(); } /** @@ -345,8 +338,7 @@ public int getItemCount(int series) { */ @Override public Number getX(int series, int item) { - List bins = getBins(series); - Weighted_HistogramBin bin = (Weighted_HistogramBin) bins.get(item); + var bin = this.getBins(series).get(item); double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2.; return x; } @@ -366,8 +358,7 @@ public Number getX(int series, int item) { */ @Override public Number getY(int series, int item) { - List bins = getBins(series); - Weighted_HistogramBin bin = (Weighted_HistogramBin) bins.get(item); + var bin = this.getBins(series).get(item); double total = getTotal(series); double binWidth = getBinWidth(series); @@ -396,8 +387,7 @@ public Number getY(int series, int item) { */ @Override public Number getStartX(int series, int item) { - List bins = getBins(series); - Weighted_HistogramBin bin = (Weighted_HistogramBin) bins.get(item); + var bin = this.getBins(series).get(item); return bin.getStartBoundary(); } @@ -415,8 +405,7 @@ public Number getStartX(int series, int item) { */ @Override public Number getEndX(int series, int item) { - List bins = getBins(series); - Weighted_HistogramBin bin = (Weighted_HistogramBin) bins.get(item); + var bin = this.getBins(series).get(item); return bin.getEndBoundary(); } @@ -477,7 +466,7 @@ public boolean equals(Object obj) { if (!Objects.equals(this.type, that.type)) { return false; } - if (!Objects.equals(this.list, that.list)) { + if (!Objects.equals(this.entries, that.entries)) { return false; } return true; @@ -493,11 +482,7 @@ public boolean equals(Object obj) { @Override public Object clone() throws CloneNotSupportedException { Weighted_HistogramDataset clone = (Weighted_HistogramDataset) super.clone(); - int seriesCount = getSeriesCount(); - clone.list = new java.util.ArrayList(seriesCount); - for (int i = 0; i < seriesCount; i++) { - clone.list.add(new LinkedHashMap((Map) this.list.get(i))); - } + clone.entries = new ArrayList(this.entries); return clone; } From 457b0ebdb8ca0406f7ebd2a71bf24dd6e43d75d7 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 15:43:49 +0100 Subject: [PATCH 07/17] `gui::probe`: eliminate raw types --- src/main/java/microsim/gui/probe/MethodsDataModel.java | 4 ++-- src/main/java/microsim/gui/probe/ProbeFrame.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/microsim/gui/probe/MethodsDataModel.java b/src/main/java/microsim/gui/probe/MethodsDataModel.java index 2ed98a49..0fb44fd1 100644 --- a/src/main/java/microsim/gui/probe/MethodsDataModel.java +++ b/src/main/java/microsim/gui/probe/MethodsDataModel.java @@ -48,7 +48,7 @@ * @author Michele Sonnessa *

*/ -public class MethodsDataModel implements ListModel { +public class MethodsDataModel implements ListModel { private static final Logger log = LogManager.getLogger(MethodsDataModel.class); @@ -131,7 +131,7 @@ public int getSize() { return methods.size(); } - public Object getElementAt(int index) { + public Method getElementAt(int index) { return methods.get(index); } diff --git a/src/main/java/microsim/gui/probe/ProbeFrame.java b/src/main/java/microsim/gui/probe/ProbeFrame.java index 0e467901..f33ecfe9 100644 --- a/src/main/java/microsim/gui/probe/ProbeFrame.java +++ b/src/main/java/microsim/gui/probe/ProbeFrame.java @@ -80,7 +80,7 @@ public class ProbeFrame extends JFrame { // Second tab BorderLayout borderLayout2 = new BorderLayout(); JPanel jPaneMethods = new JPanel(); - JList jListMethods = new JList(); + JList jListMethods = new JList<>(); JScrollPane jScrollMethods = new JScrollPane(jListMethods); JButton jBtnInvoke = new JButton(); @@ -92,7 +92,7 @@ public class ProbeFrame extends JFrame { JPanel jNorthPanel = new JPanel(); JLabel jObjectName = new JLabel(""); BorderLayout borderLayout3 = new BorderLayout(); - JComboBox jCmbSuperclass = new JComboBox(); + JComboBox jCmbSuperclass = new JComboBox<>(); /** * This constructor checks if the given object implements the IProbeFields From 2178361d3f9b2fa81711eef23d0e845b0875747b Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 16:08:50 +0100 Subject: [PATCH 08/17] `MultiKeyCoefficientMap` inherits `MultiKey` This is far from ideal as this should be made generic over the key and value type as well as leverage composition. This commit is still useful in itself to avoid many warnings. --- .../microsim/data/MultiKeyCoefficientMap.java | 23 ++++++++++--------- .../regression/RegressionUtils.java | 22 ++++++++---------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/main/java/microsim/data/MultiKeyCoefficientMap.java b/src/main/java/microsim/data/MultiKeyCoefficientMap.java index 0516cd88..6b59e01c 100644 --- a/src/main/java/microsim/data/MultiKeyCoefficientMap.java +++ b/src/main/java/microsim/data/MultiKeyCoefficientMap.java @@ -13,7 +13,8 @@ * * @author Ross Richardson */ -public class MultiKeyCoefficientMap extends MultiKeyMap {// implements Cloneable { +// FIXME: this should be generic over and leverage composition +public class MultiKeyCoefficientMap extends MultiKeyMap { private static final long serialVersionUID = 5049597007431364596L; @@ -50,7 +51,7 @@ public MultiKeyCoefficientMap(String[] keys, String[] values) { * @param keys - a String array listing the names of the categories of keys * @param values - a String array listing the names of the categories of values */ - public MultiKeyCoefficientMap(AbstractHashedMap map, String[] keys, String[] values) { + public MultiKeyCoefficientMap(AbstractHashedMap, Object> map, String[] keys, String[] values) { super(map); this.keys = keys; if (values != null) { @@ -107,7 +108,7 @@ public Object getValue(Object... key) { if (key[0] instanceof MultiKey) return super.get(key[0]); else - return super.get(new MultiKey(new Object[] { key[0] })); + return super.get(new MultiKey<>(new Object[] { key[0] })); case 2: return super.get(key[0], key[1]); case 3: @@ -131,7 +132,7 @@ public Object getValue(Object... key) { // of the type MultiKey(MultiKey()). value = (Object[]) super.get(key[0]); else - value = (Object[]) super.get(new MultiKey(new Object[] { key[0] })); + value = (Object[]) super.get(new MultiKey<>(new Object[] { key[0] })); return extractValueFromVector(toStringKey(key[1]), value); case 3: value = (Object[]) super.get(key[0], key[1]); @@ -184,9 +185,9 @@ public void putValue(Object... keyValues) { // MultiKey is created unnecessarily, which then leads to a // null pointer exception as the MultKeyCoefficientMap does // not have a key entry of the type MultiKey(MultiKey()). - super.put((MultiKey) keyValues[0], keyValues[1]); + super.put((MultiKey) keyValues[0], keyValues[1]); else { - super.put(new MultiKey(new Object[] { keyValues[0] }), keyValues[1]); + super.put(new MultiKey<>(new Object[] { keyValues[0] }), keyValues[1]); } break; case 3: @@ -215,7 +216,7 @@ public void putValue(Object... keyValues) { if (value == null) value = new Object[valuesMap.size()]; putValueToVector((String) keyValues[1], value, keyValues[2]); - super.put(new MultiKey(new Object[] { keyValues[0] }), value); + super.put(new MultiKey<>(new Object[] { keyValues[0] }), value); break; case 4: value = (Object[]) super.get(keyValues[0], keyValues[1]); @@ -259,14 +260,14 @@ public void replaceValue(Object... keyValues) { case 1: throw new IllegalArgumentException("Wrong number of key parameters"); case 2: - MultiKey key0; + MultiKey key0; if (keyValues[0] instanceof MultiKey) { // Ross: If we don't do this check, a new MultiKey of a MultiKey // is created unnecessarily, which then leads to a null pointer // exception as the MultKeyCoefficientMap does not have a key // entry of the type MultiKey(MultiKey()). - key0 = (MultiKey) keyValues[0]; + key0 = (MultiKey) keyValues[0]; } else { - key0 = new MultiKey(new Object[] { keyValues[0] }); + key0 = new MultiKey<>(new Object[] { keyValues[0] }); } if (super.containsKey(key0)) super.remove(key0); @@ -325,7 +326,7 @@ public String[] getValuesNames() { */ @Override public MultiKeyCoefficientMap clone() { - HashedMap mapClone = new HashedMap(this.decorated()); + var mapClone = new HashedMap<>(this.decorated()); return new MultiKeyCoefficientMap(mapClone, this.getKeysNames(), this.getValuesNames()); } } diff --git a/src/main/java/microsim/statistics/regression/RegressionUtils.java b/src/main/java/microsim/statistics/regression/RegressionUtils.java index ac126156..0d5cd3a6 100644 --- a/src/main/java/microsim/statistics/regression/RegressionUtils.java +++ b/src/main/java/microsim/statistics/regression/RegressionUtils.java @@ -666,7 +666,7 @@ public static Map bootstrapMultinomialRegression( int count = 0; String[] multiKeyMapKeyNames = null; // The name of the MultiKey in the MultiKeyCoefficientMaps String[] multiKeyMapValueNames = null; // The name of the values in the MultiKeyCoefficientMaps - Set covariateMultiKeys = null; + Set> covariateMultiKeys = null; T baseT = null; for (T t : possibleEvents) { if (specifiedEvents.contains(t)) { @@ -681,7 +681,7 @@ public static Map bootstrapMultinomialRegression( } else { String[] otherKeyNames = map.getKeysNames(); String[] otherValueNames = map.getValuesNames(); - Set otherMultiKeys = map.keySet(); + var otherMultiKeys = map.keySet(); // Check dimensions match if (multiKeyMapKeyNames.length != otherKeyNames.length) { throw new IllegalArgumentException( @@ -783,16 +783,14 @@ public static Map bootstrapMultinomialRegression( //// regression " // + "covariate name."); // } - //// for(int i = 0; i < tNames.length; i++) { - //// if(subStrings[0].equals(tNames[i])) { - //// covarianceEvents.add(subStrings[0]); //Only check that first substring of - //// key before the 'regular expression' "_" character is an event name. Thus if - //// LowEdu and HighEdu are events, and the covariance matrix contains keys - //// LowEdu_age and HighEdu_age, this will be satisfied, but not if the keys are - //// age_LowEdu and age_HighEdu. This is to prevent confusion over what is the - //// event name and the covariate name. - //// } - //// } + //// for(int i = 0; i < tNames.length; i++) { / + /// if(subStrings[0].equals(tNames[i])) { / covarianceEvents.add(subStrings[0]); + /// //Only check that first substring of / key before the 'regular expression' + /// "_" character is an event name. Thus if / LowEdu and HighEdu are events, and + /// the covariance matrix contains keys / LowEdu_age and HighEdu_age, this will + /// be satisfied, but not if the keys are / age_LowEdu and age_HighEdu. This is + /// to prevent confusion over what is the / event name and the covariate name. / + /// } / } // } return newMap; From 98a538be2db18f262053464d74ece0b6ac047997 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 17:36:21 +0100 Subject: [PATCH 09/17] eliminate a few raw types --- .../java/microsim/gui/space/CellObjectChooser.java | 2 +- .../microsim/gui/space/LayeredSurfaceProperties.java | 2 +- src/main/java/microsim/matching/GlobalMatching.java | 12 +++++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/microsim/gui/space/CellObjectChooser.java b/src/main/java/microsim/gui/space/CellObjectChooser.java index 079f3d0a..69c42460 100644 --- a/src/main/java/microsim/gui/space/CellObjectChooser.java +++ b/src/main/java/microsim/gui/space/CellObjectChooser.java @@ -58,7 +58,7 @@ public class CellObjectChooser extends JDialog { private static final long serialVersionUID = 1L; JPanel panel1 = new JPanel(); BorderLayout borderLayout1 = new BorderLayout(); - JList jListObjects = new JList(); + JList jListObjects = new JList<>(); JPanel jPanel1 = new JPanel(); JButton jBtnCancel = new JButton(); JButton jBtnOK = new JButton(); diff --git a/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java b/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java index 080c69fb..ce26d47a 100644 --- a/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java +++ b/src/main/java/microsim/gui/space/LayeredSurfaceProperties.java @@ -60,7 +60,7 @@ public class LayeredSurfaceProperties extends JDialog { JPanel jButtonPanel = new JPanel(); JButton jBtnCancel = new JButton(); JButton jBtnOK = new JButton(); - JComboBox jCmbSize = new JComboBox(); + JComboBox jCmbSize = new JComboBox<>(); JLabel jLabel1 = new JLabel(); JLabel jLabel2 = new JLabel(); TitledBorder titledBorder1; diff --git a/src/main/java/microsim/matching/GlobalMatching.java b/src/main/java/microsim/matching/GlobalMatching.java index 11fdde47..b4d59e98 100644 --- a/src/main/java/microsim/matching/GlobalMatching.java +++ b/src/main/java/microsim/matching/GlobalMatching.java @@ -43,7 +43,7 @@ public Pair, Set> matching(Collection collection1, Predicate fil throw new IllegalArgumentException("Matching algorithm cannot match not disjuctable collections"); // evaluate list of global candidate pairs - List candidates = new ArrayList<>(); + var candidates = new ArrayList>(); for (T agent1 : c1) { for (T agent2 : c2) { @@ -51,7 +51,7 @@ public Pair, Set> matching(Collection collection1, Predicate fil Double score = doubleClosure.getValue(agent1, agent2); if (Double.isFinite(score)) { - GlobalMatchingPair pair = new GlobalMatchingPair(agent1, agent2, score); + var pair = new GlobalMatchingPair(agent1, agent2, score); candidates.add(pair); } } @@ -62,7 +62,7 @@ public Pair, Set> matching(Collection collection1, Predicate fil // allocate matches for (int ii = 0; ii < candidates.size(); ii++) { - GlobalMatchingPair pair = candidates.get(ii); + var pair = candidates.get(ii); T agent1 = (T) pair.getAgent1(); T agent2 = (T) pair.getAgent2(); if (c1.contains(agent1) && c2.contains(agent2)) { @@ -82,11 +82,13 @@ private GlobalMatching() { } - private static GlobalMatching globalMatching; + // FIXME: remove static instance + private static GlobalMatching globalMatching; + @SuppressWarnings("rawtypes") public static GlobalMatching getInstance() { if (globalMatching == null) - globalMatching = new GlobalMatching(); + globalMatching = new GlobalMatching<>(); return globalMatching; } From 9c0639b5f6053adf0a6abc2027a15bfb5e0f98e7 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 18:02:24 +0100 Subject: [PATCH 10/17] simplify `ScatterplotSimulationPlotterRefreshable::refresh` This avoids using a poorly typed API from jfree. --- .../gui/plot/ScatterplotSimulationPlotterRefreshable.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java b/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java index 83613320..79923734 100644 --- a/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java +++ b/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java @@ -773,10 +773,8 @@ public void setMaxSamples(int maxSamples) { public void refresh() { - List data = dataset.getSeries(); - for (int i = 0; i < data.size(); i++) { - XYSeries series = (XYSeries) data.get(i); - series.clear(); + for (int i = 0; i < dataset.getSeriesCount(); i++) { + dataset.getSeries(i).clear(); } } From c3497e53d159a713a0a3c8d96ef9dafb5b935a97 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 18:04:01 +0100 Subject: [PATCH 11/17] eliminate some raw types in gui --- src/main/java/microsim/engine/SimulationEngine.java | 3 ++- .../java/microsim/gui/plot/Weighted_HistogramDataset.java | 8 ++++---- .../java/microsim/gui/plot/Weighted_PyramidDataset.java | 4 ++-- .../java/microsim/gui/probe/MethodParameterDataModel.java | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/microsim/engine/SimulationEngine.java b/src/main/java/microsim/engine/SimulationEngine.java index 52e8f9fb..617b5f2f 100644 --- a/src/main/java/microsim/engine/SimulationEngine.java +++ b/src/main/java/microsim/engine/SimulationEngine.java @@ -467,13 +467,14 @@ public boolean getModelBuildStatus() { * * @return The list of disposed models. */ + // FIXME: this should return a List> public synchronized Class[] disposeModels() { eventQueue.clear(); modelBuild = false; // Get models' class type and dispose - Class[] cls = new Class[models.size()]; + var cls = new Class[models.size()]; for (int i = 0; i < models.size(); i++) { SimulationManager model = models.get(i); cls[i] = model.getClass(); diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java index 8ee7f31b..53373198 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java @@ -51,7 +51,7 @@ import org.jfree.data.xy.AbstractIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; -record HistEntry(Comparable key, List bins, int numValues, double binWidth) { +record HistEntry(Comparable key, List bins, int numValues, double binWidth) { } /** @@ -117,7 +117,7 @@ public void setType(HistogramType type) { * (null not permitted). * @param bins the number of bins (must be at least 1). */ - public void addSeries(Comparable key, double[] values, double[] weightings, int bins) { + public void addSeries(Comparable key, double[] values, double[] weightings, int bins) { // defer argument checking... double minimum = getMinimum(values); double maximum = getMaximum(values); @@ -139,7 +139,7 @@ public void addSeries(Comparable key, double[] values, double[] weightings, int * @param minimum the lower bound of the bin range. * @param maximum the upper bound of the bin range. */ - public void addSeries(Comparable key, double[] values, double[] weightings, int bins, + public void addSeries(Comparable key, double[] values, double[] weightings, int bins, double minimum, double maximum) { Args.nullNotPermitted(key, "key"); @@ -301,7 +301,7 @@ public int getSeriesCount() { * specified range. */ @Override - public Comparable getSeriesKey(int series) { + public Comparable getSeriesKey(int series) { return this.entries.get(series).key(); } diff --git a/src/main/java/microsim/gui/plot/Weighted_PyramidDataset.java b/src/main/java/microsim/gui/plot/Weighted_PyramidDataset.java index 840b6b59..da816bd7 100644 --- a/src/main/java/microsim/gui/plot/Weighted_PyramidDataset.java +++ b/src/main/java/microsim/gui/plot/Weighted_PyramidDataset.java @@ -233,13 +233,13 @@ public double[][] getDataArray() { } @Override - public List getColumnKeys() { + public List getColumnKeys() { // TODO Auto-generated method stub return Arrays.asList(this.groupNames); } @Override - public Comparable getColumnKey(int column) { + public Weighted_PyramidPlotter.GroupName getColumnKey(int column) { return this.groupNames[column]; } diff --git a/src/main/java/microsim/gui/probe/MethodParameterDataModel.java b/src/main/java/microsim/gui/probe/MethodParameterDataModel.java index 709eb17f..6e2af439 100644 --- a/src/main/java/microsim/gui/probe/MethodParameterDataModel.java +++ b/src/main/java/microsim/gui/probe/MethodParameterDataModel.java @@ -138,7 +138,7 @@ public Object[] getParams() { o = getWrapper(data[i][COL_TYPE].toString(), data[i][COL_VALUE].toString()); if (o == null) { Class cc = Class.forName(data[i][COL_TYPE].toString()); - Constructor c = cc.getDeclaredConstructor(new Class[] { (new String()).getClass() }); + Constructor c = cc.getDeclaredConstructor(new Class[] { (new String()).getClass() }); o = c.newInstance(new Object[] { data[i][COL_VALUE].toString() }); } obs[i] = o; From b63a0177be2c49bc48966049696049e01db5a18f Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 18:09:32 +0100 Subject: [PATCH 12/17] matching: eliminate raw types --- src/main/java/microsim/matching/GlobalMatching.java | 2 +- .../microsim/matching/GlobalMatchingPairComparator.java | 4 ++-- .../java/microsim/matching/IterativeRandomMatching.java | 6 ++++-- .../java/microsim/matching/IterativeSimpleMatching.java | 6 ++++-- src/main/java/microsim/matching/SimpleMatching.java | 6 ++++-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/microsim/matching/GlobalMatching.java b/src/main/java/microsim/matching/GlobalMatching.java index b4d59e98..6cb2869c 100644 --- a/src/main/java/microsim/matching/GlobalMatching.java +++ b/src/main/java/microsim/matching/GlobalMatching.java @@ -58,7 +58,7 @@ public Pair, Set> matching(Collection collection1, Predicate fil } // sort candidate pairs from best to worst candidate matches - Collections.sort(candidates, new GlobalMatchingPairComparator()); + Collections.sort(candidates, new GlobalMatchingPairComparator()); // allocate matches for (int ii = 0; ii < candidates.size(); ii++) { diff --git a/src/main/java/microsim/matching/GlobalMatchingPairComparator.java b/src/main/java/microsim/matching/GlobalMatchingPairComparator.java index 7a0305c1..42c4422b 100644 --- a/src/main/java/microsim/matching/GlobalMatchingPairComparator.java +++ b/src/main/java/microsim/matching/GlobalMatchingPairComparator.java @@ -5,10 +5,10 @@ /** * HELPER CLASS TO ASSIST SORTING OF GlobalMatchingPairs */ -public class GlobalMatchingPairComparator implements Comparator { +public class GlobalMatchingPairComparator implements Comparator> { @Override - public int compare(GlobalMatchingPair o1, GlobalMatchingPair o2) { + public int compare(GlobalMatchingPair o1, GlobalMatchingPair o2) { return Double.compare(o1.getScore(), o2.getScore()); } } diff --git a/src/main/java/microsim/matching/IterativeRandomMatching.java b/src/main/java/microsim/matching/IterativeRandomMatching.java index d8e8c714..7e006270 100644 --- a/src/main/java/microsim/matching/IterativeRandomMatching.java +++ b/src/main/java/microsim/matching/IterativeRandomMatching.java @@ -105,11 +105,13 @@ private IterativeRandomMatching() { } - private static IterativeRandomMatching iterativeRandomMatching; + // FIXME: remove static instance + private static IterativeRandomMatching iterativeRandomMatching; + @SuppressWarnings("rawtypes") public static IterativeRandomMatching getInstance() { if (iterativeRandomMatching == null) - iterativeRandomMatching = new IterativeRandomMatching(); + iterativeRandomMatching = new IterativeRandomMatching<>(); return iterativeRandomMatching; } diff --git a/src/main/java/microsim/matching/IterativeSimpleMatching.java b/src/main/java/microsim/matching/IterativeSimpleMatching.java index a55367d7..8805f69c 100644 --- a/src/main/java/microsim/matching/IterativeSimpleMatching.java +++ b/src/main/java/microsim/matching/IterativeSimpleMatching.java @@ -114,11 +114,13 @@ private IterativeSimpleMatching() { } - private static IterativeSimpleMatching iterativeMatching; + // FIXME: remove static instance + private static IterativeSimpleMatching iterativeMatching; + @SuppressWarnings("rawtypes") public static IterativeSimpleMatching getInstance() { if (iterativeMatching == null) - iterativeMatching = new IterativeSimpleMatching(); + iterativeMatching = new IterativeSimpleMatching<>(); return iterativeMatching; } diff --git a/src/main/java/microsim/matching/SimpleMatching.java b/src/main/java/microsim/matching/SimpleMatching.java index 6d6e84d2..c2d6fe13 100644 --- a/src/main/java/microsim/matching/SimpleMatching.java +++ b/src/main/java/microsim/matching/SimpleMatching.java @@ -93,11 +93,13 @@ private SimpleMatching() { } - private static SimpleMatching simpleMatching; + // FIXME: remove static instance + private static SimpleMatching simpleMatching; + @SuppressWarnings("rawtypes") public static SimpleMatching getInstance() { if (simpleMatching == null) - simpleMatching = new SimpleMatching(); + simpleMatching = new SimpleMatching<>(); return simpleMatching; } From 725c834c3a38df166a2f80c1a3a39d8bb751f852 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 18:26:46 +0100 Subject: [PATCH 13/17] statistics: remove raw types --- .../regression/LinearRegression.java | 21 +++++----- .../regression/RegressionUtils.java | 38 +++++++++---------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/main/java/microsim/statistics/regression/LinearRegression.java b/src/main/java/microsim/statistics/regression/LinearRegression.java index 4c33ddab..7be27a84 100644 --- a/src/main/java/microsim/statistics/regression/LinearRegression.java +++ b/src/main/java/microsim/statistics/regression/LinearRegression.java @@ -12,7 +12,6 @@ import microsim.statistics.IObjectSource; import org.apache.commons.beanutils.PropertyUtils; -import org.apache.commons.collections4.MapIterator; import org.apache.commons.collections4.keyvalue.MultiKey; /** @@ -156,8 +155,8 @@ public static double computeScore(MultiKeyCoefficientMap amap, Map regressors = new HashSet(); - for (Object multiKey : amap.keySet()) { - final String key = (String) ((MultiKey) multiKey).getKey(0); + for (var multiKey : amap.keySet()) { + final String key = (String) multiKey.getKey(0); if (!regressors.add(key)) { throw new IllegalArgumentException("Regressor key " + key + " is not unique! It is possible that the LinearRegression MultiKeyCoefficientMap containins a MultiKey with more than one key. The LinearRegression will not return the correct value when LinearRegression.computeScore(MultiKeyCoefficientMap amap, Map) is used with a LinearRegression instance containing a MultiKeyCoefficientMap with more than one key! Consider using one of the other LinearRegression.getScore() methods instead."); @@ -241,10 +240,10 @@ public static > double computeScore(MultiKeyCoefficientMap coe if (coeffMultiMap.getKeysNames().length == 1) { // (double) check that there is only one key entry in the // MultiKey of coeffMultiMap double sum = 0.; - for (MapIterator iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { + for (var iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey coeffMK = (MultiKey) iterator.getKey(); + var coeffMK = iterator.getKey(); String regressor = coeffMK.getKey(0).toString(); // coeffMK is assumed to only have a single key here double covariate = iDblSrc.getDoubleValue(Enum.valueOf(enumType, regressor)); // Gets value of variable // with key that matches @@ -374,10 +373,10 @@ public static > double computeScore(MultiKeyCoefficientMap coe double sum = 0.; int regressorColumnIndex = -1; - for (MapIterator iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { + for (var iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey coeffMK = (MultiKey) iterator.getKey(); + var coeffMK = iterator.getKey(); boolean coeffMKapplicableForIDblSrc = true; int i = 0; while (i < coeffMultiMapKeysNames.length) { @@ -504,9 +503,9 @@ public static double computeScore(MultiKeyCoefficientMap coeffMultiMap, Object a } double score = 0.; - for (MapIterator iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { + for (var iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey coeffMK = (MultiKey) iterator.getKey(); + var coeffMK = iterator.getKey(); boolean coeffMKapplicable = true; int i = 0; while (i < iMax) { @@ -695,10 +694,10 @@ public static , U extends Enum> double computeScore(MultiKe double sum = 0.; int regressorColumnIndex = -1; String[] coeffMultiMapKeysNames = coeffMultiMap.getKeysNames(); - for (MapIterator iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { + for (var iterator = coeffMultiMap.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey coeffMK = (MultiKey) iterator.getKey(); + var coeffMK = iterator.getKey(); boolean coeffMKapplicableForIDblSrc = true; int i = 0; while (i < coeffMultiMapKeysNames.length) { diff --git a/src/main/java/microsim/statistics/regression/RegressionUtils.java b/src/main/java/microsim/statistics/regression/RegressionUtils.java index 0d5cd3a6..dceffa27 100644 --- a/src/main/java/microsim/statistics/regression/RegressionUtils.java +++ b/src/main/java/microsim/statistics/regression/RegressionUtils.java @@ -5,7 +5,6 @@ import microsim.data.MultiKeyCoefficientMap; import microsim.engine.SimulationEngine; -import org.apache.commons.collections4.MapIterator; import org.apache.commons.collections4.keyvalue.MultiKey; import org.apache.commons.math3.distribution.MultivariateNormalDistribution; import org.apache.commons.math3.linear.Array2DRowRealMatrix; @@ -442,9 +441,9 @@ public static MultiKeyCoefficientMap bootstrap(MultiKeyCoefficientMap map) { double means[] = new double[numRowsInCovarianceMatrix]; double[][] covarianceMatrix = new double[numRowsInCovarianceMatrix][numRowsInCovarianceMatrix]; - for (MapIterator iterator = map.mapIterator(); iterator.hasNext();) { + for (var iterator = map.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey multiKey = (MultiKey) iterator.getKey(); + var multiKey = iterator.getKey(); String regressor = (String) multiKey.getKey(regressorColumnIndex); int rowIndex = indexOfValuesNameMap.get(regressor); Object[] mapValuesRow = ((Object[]) map.getValue(multiKey)); @@ -472,10 +471,10 @@ public static MultiKeyCoefficientMap bootstrap(MultiKeyCoefficientMap map) { valueNames[0] = RegressionColumnNames.COEFFICIENT.toString(); MultiKeyCoefficientMap bootstrapMap = new MultiKeyCoefficientMap(keys, valueNames); - for (MapIterator iterator = map.mapIterator(); iterator.hasNext();) { + for (var iterator = map.mapIterator(); iterator.hasNext();) { iterator.next(); - MultiKey multiKey = (MultiKey) iterator.getKey(); + var multiKey = iterator.getKey(); String regressor = (String) multiKey.getKey(regressorColumnIndex); int rowIndex = indexOfValuesNameMap.get(regressor); bootstrapMap.put(multiKey, means[rowIndex]); @@ -539,13 +538,11 @@ public static MultiKeyCoefficientMap bootstrap(MultiKeyCoefficientMap coefficien int numCovariates = coefficients.size(); String[] covariates = new String[numCovariates]; int n = 0; - for (Object o : coefficients.keySet()) { // Order of iteration not guaranteed??? - if (o instanceof MultiKey) { - covariates[n] = ((MultiKey) o).getKey(0).toString(); // The order in which covariates and their - // corresponding covariances are handled within - // this method is fixed by this ordering. - n++; - } + for (var mk : coefficients.keySet()) { // Order of iteration not guaranteed??? + covariates[n] = mk.getKey(0).toString(); // The order in which covariates and their + // corresponding covariances are handled within + // this method is fixed by this ordering. + n++; } double[][] covarianceMatrixOrdered; @@ -715,7 +712,7 @@ public static Map bootstrapMultinomialRegression( } } // Check that all events have the same MultiKeys (regression covariates) - for (MultiKey mk : otherMultiKeys) { + for (var mk : otherMultiKeys) { if (!covariateMultiKeys.contains(mk)) { throw new IllegalArgumentException("The covariate " + mk.getKey(0) + " specified in the regression coefficient MultiKeyCofficientMap for event " + t @@ -745,8 +742,7 @@ public static Map bootstrapMultinomialRegression( // (one of) the entries of the Map. for (T event : specifiedEvents) { MultiKeyCoefficientMap regCoefficientsMap = eventRegressionCoefficientMap.get(event); - for (Object o : regCoefficientsMap.keySet()) { - MultiKey mk = (MultiKey) o; + for (var mk : regCoefficientsMap.keySet()) { String combinedName = event.toString() + "_" + mk.getKey(0).toString(); enlargedCoefficientMap.putValue(combinedName, regCoefficientsMap.getValue(mk)); } @@ -758,7 +754,7 @@ public static Map bootstrapMultinomialRegression( for (T event : specifiedEvents) { MultiKeyCoefficientMap newCoefficientMap = new MultiKeyCoefficientMap(multiKeyMapKeyNames, multiKeyMapValueNames); - for (MultiKey mk : covariateMultiKeys) { + for (var mk : covariateMultiKeys) { String combinedName = event.toString() + "_" + mk.getKey(0).toString(); // System.out.println("combinedName " + combinedName); double regCoefficient = ((Number) enlargedCoefficientMap.getValue(combinedName)).doubleValue(); @@ -830,8 +826,8 @@ public static & IntegerValuedEnum> Map regressors = new HashSet(); - for (Object multiKey : multinomialCoefficients.keySet()) { - final String key = ((MultiKey) multiKey).getKey(0).toString(); + for (var multiKey : multinomialCoefficients.keySet()) { + final String key = multiKey.getKey(0).toString(); if (!regressors.add(key)) throw new RuntimeException("Regressor key " + key + " in multinomial remapping is not unique."); } @@ -1016,7 +1012,7 @@ public static MultiKeyCoefficientMap appendCoefficientMaps(MultiKeyCoefficientMa } // populate with secondaryMap values - for (Object keyHere : secondaryMap.keySet()) { + for (var keyHere : secondaryMap.keySet()) { Double valHere; if (secondaryMap.getValuesNames().length == 1) { @@ -1038,9 +1034,9 @@ public static MultiKeyCoefficientMap appendCoefficientMaps(MultiKeyCoefficientMa } Object[] keyValueVector = new Object[2]; if (secondaryKeyPrefix == null) - keyValueVector[0] = ((MultiKey) keyHere).getKey(0).toString(); + keyValueVector[0] = keyHere.getKey(0).toString(); else - keyValueVector[0] = secondaryKeyPrefix + ((MultiKey) keyHere).getKey(0).toString(); + keyValueVector[0] = secondaryKeyPrefix + keyHere.getKey(0).toString(); if (invertSecondary) keyValueVector[1] = -valHere; else From d202d034eb320384fe1812755f3945398f178139 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 14 Jul 2026 19:03:08 +0100 Subject: [PATCH 14/17] rm dangling doc comments --- .../java/microsim/engine/SimulationEngine.java | 7 ------- src/main/java/microsim/event/EventQueue.java | 6 ------ .../gui/plot/Weighted_PyramidPlotter.java | 18 ------------------ .../gui/space/LayeredSurfaceFrame.java | 6 ------ .../gui/space/LayeredSurfacePanel.java | 9 --------- 5 files changed, 46 deletions(-) diff --git a/src/main/java/microsim/engine/SimulationEngine.java b/src/main/java/microsim/engine/SimulationEngine.java index 617b5f2f..06cb77a3 100644 --- a/src/main/java/microsim/engine/SimulationEngine.java +++ b/src/main/java/microsim/engine/SimulationEngine.java @@ -139,13 +139,6 @@ public class SimulationEngine extends Thread { private ExperimentBuilder experimentBuilder = null; - /** - * @link dependency - * @stereotype use - * @supplierRole 1.. - **/ - /* #SimModel lnkSimModel; */ - /** * Build a new SimEngine with the given time unit. */ diff --git a/src/main/java/microsim/event/EventQueue.java b/src/main/java/microsim/event/EventQueue.java index 578e2d28..6ddd8130 100644 --- a/src/main/java/microsim/event/EventQueue.java +++ b/src/main/java/microsim/event/EventQueue.java @@ -59,12 +59,6 @@ public class EventQueue { double time = 0; // protected List stepListeners; - /** - * @link dependency - * @supplierRole 1.. - **/ - /* #SimEvent lnkSimEvent; */ - /** Build new event queue with TIME_TICKS time unit. */ public EventQueue() { eventQueue = new PriorityQueue(10); diff --git a/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java b/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java index 9fa03fec..bd78074c 100644 --- a/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java +++ b/src/main/java/microsim/gui/plot/Weighted_PyramidPlotter.java @@ -133,24 +133,6 @@ public Weighted_PyramidPlotter(String title) { this(title, DEFAULT_XAXIS, DEFAULT_YAXIS, DEFAULT_LEFT_CAT, DEFAULT_RIGHT_CAT); } - /** - * Constructor for pyramid objects, showing only the latest data as time moves - * forward. - * Default values are used for the following parameters: category names, age - * group names/ranges, reverseOrder - * It generates one age group per unique age, whose title is that age. - * - * @param title - title of the chart - * @param xaxis - name of the x-axis - * @param yaxis - name of the y-axis - * - * - * public PopulationPyramidPlotter(String title, String xaxis, - * String yaxis) { - * this(title, xaxis, yaxis, DEFAULT_LEFT_CAT, DEFAULT_RIGHT_CAT); - * } - */ - /** * Constructor for pyramid objects, showing only the latest data as time moves * forward. diff --git a/src/main/java/microsim/gui/space/LayeredSurfaceFrame.java b/src/main/java/microsim/gui/space/LayeredSurfaceFrame.java index ecbe195f..28ae6e5e 100644 --- a/src/main/java/microsim/gui/space/LayeredSurfaceFrame.java +++ b/src/main/java/microsim/gui/space/LayeredSurfaceFrame.java @@ -71,12 +71,6 @@ public class LayeredSurfaceFrame extends JInternalFrame implements JPopupMenu popupMenu = new JPopupMenu(); - /** - * @link dependency - * @label open window - */ - /* #LayeredSurfaceProperties lnkLayeredSurfaceProperties; */ - /** * Create a new frame with given dimensions and a cell length of 4 pixels. * diff --git a/src/main/java/microsim/gui/space/LayeredSurfacePanel.java b/src/main/java/microsim/gui/space/LayeredSurfacePanel.java index 7b3d817a..eabce1f5 100644 --- a/src/main/java/microsim/gui/space/LayeredSurfacePanel.java +++ b/src/main/java/microsim/gui/space/LayeredSurfacePanel.java @@ -60,15 +60,6 @@ public class LayeredSurfacePanel extends JPanel { // Used for dragging private int lastX, lastY; - /** - * @link dependency - * @stereotype use - */ - /* #ILayerDrawer lnkILayerDrawer; */ - - /** @link dependency */ - /* #CellObjectChooser lnkCellObjectChooser; */ - /** * Create a panel with dimensions of (100, 100) and a cell length of 4 pixels. */ From c9deeb6789abd00f6fd1a49fbc215e6778497963 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 21 Jul 2026 14:24:53 +0100 Subject: [PATCH 15/17] rm redundant casts --- .../java/microsim/gui/plot/Weighted_HistogramDataset.java | 2 +- src/main/java/microsim/gui/probe/ProbeFrame.java | 2 +- src/main/java/microsim/matching/GlobalMatching.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java index 53373198..50f1f33e 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java @@ -189,7 +189,7 @@ public void addSeries(Comparable key, double[] values, double[] weightings, i binIndex = bins - 1; } } - Weighted_HistogramBin bin = (Weighted_HistogramBin) binList.get(binIndex); + var bin = binList.get(binIndex); bin.incrementCount(weightings[i]); totalWeight += weightings[i]; } diff --git a/src/main/java/microsim/gui/probe/ProbeFrame.java b/src/main/java/microsim/gui/probe/ProbeFrame.java index f33ecfe9..d82de58a 100644 --- a/src/main/java/microsim/gui/probe/ProbeFrame.java +++ b/src/main/java/microsim/gui/probe/ProbeFrame.java @@ -378,7 +378,7 @@ private void invokeMethod() { if (jListMethods.getSelectedIndex() == -1) return; - Method m = (Method) methods.getElementAt(jListMethods.getSelectedIndex()); + var m = methods.getElementAt(jListMethods.getSelectedIndex()); if (!ProbeReflectionUtils.isAnExecutableMethod(m)) { JOptionPane.showMessageDialog(null, "Sorry but this method requires complex arguments.\nThis function is not yet implemented.", diff --git a/src/main/java/microsim/matching/GlobalMatching.java b/src/main/java/microsim/matching/GlobalMatching.java index 6cb2869c..53ff976a 100644 --- a/src/main/java/microsim/matching/GlobalMatching.java +++ b/src/main/java/microsim/matching/GlobalMatching.java @@ -63,8 +63,8 @@ public Pair, Set> matching(Collection collection1, Predicate fil // allocate matches for (int ii = 0; ii < candidates.size(); ii++) { var pair = candidates.get(ii); - T agent1 = (T) pair.getAgent1(); - T agent2 = (T) pair.getAgent2(); + var agent1 = pair.getAgent1(); + var agent2 = pair.getAgent2(); if (c1.contains(agent1) && c2.contains(agent2)) { matching.match(agent1, agent2); c1.remove(agent1); From 0c5e50492d4fe82bfa228cdac46f54b5a86e617f Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Tue, 21 Jul 2026 15:05:04 +0100 Subject: [PATCH 16/17] rm unused imports --- .../microsim/alignment/multiple/LogitScalingAlignment.java | 3 --- .../microsim/gui/plot/IndividualBarSimulationPlotter.java | 1 - .../gui/plot/ScatterplotSimulationPlotterRefreshable.java | 3 --- .../gui/plot/Weighted_HistogramSimulationPlotter.java | 2 -- src/main/java/microsim/gui/shell/MicrosimShell.java | 1 - .../java/microsim/gui/shell/parameter/ParameterFrame.java | 5 ----- .../java/microsim/matching/IterativeMatchingAlgorithm.java | 1 - src/main/java/microsim/matching/IterativeRandomMatching.java | 2 -- src/main/java/microsim/matching/IterativeSimpleMatching.java | 1 - .../microsim/statistics/regression/LinearRegression.java | 1 - .../statistics/weighted/IWeightedDoubleArraySource.java | 2 -- .../statistics/weighted/IWeightedFloatArraySource.java | 2 -- .../statistics/weighted/IWeightedIntArraySource.java | 2 -- .../statistics/weighted/IWeightedLongArraySource.java | 2 -- .../microsim/statistics/weighted/Weighted_CrossSection.java | 1 - 15 files changed, 29 deletions(-) diff --git a/src/main/java/microsim/alignment/multiple/LogitScalingAlignment.java b/src/main/java/microsim/alignment/multiple/LogitScalingAlignment.java index 50fc3edf..1a07f9cb 100644 --- a/src/main/java/microsim/alignment/multiple/LogitScalingAlignment.java +++ b/src/main/java/microsim/alignment/multiple/LogitScalingAlignment.java @@ -2,11 +2,8 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.function.Predicate; -import org.apache.commons.collections4.CollectionUtils; - /** * Logit Scaling alignment (as introduced by P. Stephensen in International * Journal of Microsimulation (2016) 9(3) 89-102), diff --git a/src/main/java/microsim/gui/plot/IndividualBarSimulationPlotter.java b/src/main/java/microsim/gui/plot/IndividualBarSimulationPlotter.java index 8b36f33a..f559a941 100644 --- a/src/main/java/microsim/gui/plot/IndividualBarSimulationPlotter.java +++ b/src/main/java/microsim/gui/plot/IndividualBarSimulationPlotter.java @@ -8,7 +8,6 @@ import microsim.event.CommonEventType; import microsim.event.EventListener; -import microsim.gui.colormap.ColorMap; import microsim.gui.colormap.FixedColorMap; import microsim.reflection.ReflectionUtils; import microsim.statistics.IDoubleSource; diff --git a/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java b/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java index 79923734..675ebdac 100644 --- a/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java +++ b/src/main/java/microsim/gui/plot/ScatterplotSimulationPlotterRefreshable.java @@ -1,10 +1,7 @@ package microsim.gui.plot; -//package microsim.gui.plot; - import java.awt.Color; import java.util.ArrayList; -import java.util.List; import javax.swing.JInternalFrame; diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java b/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java index f5b34aa4..cd93774a 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramSimulationPlotter.java @@ -1,7 +1,5 @@ package microsim.gui.plot; -//package microsim.gui.plot; - import java.awt.Color; import java.util.ArrayList; diff --git a/src/main/java/microsim/gui/shell/MicrosimShell.java b/src/main/java/microsim/gui/shell/MicrosimShell.java index 4f2bcc99..a5648a8a 100644 --- a/src/main/java/microsim/gui/shell/MicrosimShell.java +++ b/src/main/java/microsim/gui/shell/MicrosimShell.java @@ -17,7 +17,6 @@ import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JOptionPane; -import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.filechooser.FileSystemView; diff --git a/src/main/java/microsim/gui/shell/parameter/ParameterFrame.java b/src/main/java/microsim/gui/shell/parameter/ParameterFrame.java index e0b335c3..3cad13c8 100644 --- a/src/main/java/microsim/gui/shell/parameter/ParameterFrame.java +++ b/src/main/java/microsim/gui/shell/parameter/ParameterFrame.java @@ -1,9 +1,6 @@ package microsim.gui.shell.parameter; -import java.awt.Color; -import java.awt.Font; import java.lang.reflect.Field; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -17,8 +14,6 @@ import org.metawidget.inspector.impl.BaseObjectInspector; import org.metawidget.inspector.impl.propertystyle.Property; import org.metawidget.swing.SwingMetawidget; -import org.metawidget.swing.widgetprocessor.binding.beansbinding.BeansBindingProcessor; -import org.metawidget.swing.widgetprocessor.binding.beansbinding.BeansBindingProcessorConfig; import org.metawidget.util.CollectionUtils; public class ParameterFrame extends JInternalFrame { diff --git a/src/main/java/microsim/matching/IterativeMatchingAlgorithm.java b/src/main/java/microsim/matching/IterativeMatchingAlgorithm.java index 1d41bbec..2058ec83 100644 --- a/src/main/java/microsim/matching/IterativeMatchingAlgorithm.java +++ b/src/main/java/microsim/matching/IterativeMatchingAlgorithm.java @@ -1,5 +1,4 @@ package microsim.matching; -//package microsim.matching; import java.util.Collection; import java.util.Comparator; diff --git a/src/main/java/microsim/matching/IterativeRandomMatching.java b/src/main/java/microsim/matching/IterativeRandomMatching.java index 7e006270..faac1ce8 100644 --- a/src/main/java/microsim/matching/IterativeRandomMatching.java +++ b/src/main/java/microsim/matching/IterativeRandomMatching.java @@ -1,5 +1,4 @@ package microsim.matching; -//package microsim.matching; import java.util.ArrayList; import java.util.Collection; @@ -7,7 +6,6 @@ import java.util.Comparator; import java.util.LinkedHashSet; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; diff --git a/src/main/java/microsim/matching/IterativeSimpleMatching.java b/src/main/java/microsim/matching/IterativeSimpleMatching.java index 8805f69c..a3cfdf40 100644 --- a/src/main/java/microsim/matching/IterativeSimpleMatching.java +++ b/src/main/java/microsim/matching/IterativeSimpleMatching.java @@ -1,5 +1,4 @@ package microsim.matching; -//package microsim.matching; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/microsim/statistics/regression/LinearRegression.java b/src/main/java/microsim/statistics/regression/LinearRegression.java index 7be27a84..2663bd7b 100644 --- a/src/main/java/microsim/statistics/regression/LinearRegression.java +++ b/src/main/java/microsim/statistics/regression/LinearRegression.java @@ -12,7 +12,6 @@ import microsim.statistics.IObjectSource; import org.apache.commons.beanutils.PropertyUtils; -import org.apache.commons.collections4.keyvalue.MultiKey; /** * Linear regression object. diff --git a/src/main/java/microsim/statistics/weighted/IWeightedDoubleArraySource.java b/src/main/java/microsim/statistics/weighted/IWeightedDoubleArraySource.java index 7e03cf5f..95c2522e 100644 --- a/src/main/java/microsim/statistics/weighted/IWeightedDoubleArraySource.java +++ b/src/main/java/microsim/statistics/weighted/IWeightedDoubleArraySource.java @@ -1,7 +1,5 @@ package microsim.statistics.weighted; -//package microsim.statistics.weighted; - /** * Used by statistical object to access array of double values. * diff --git a/src/main/java/microsim/statistics/weighted/IWeightedFloatArraySource.java b/src/main/java/microsim/statistics/weighted/IWeightedFloatArraySource.java index 1a110ab4..ef642f56 100644 --- a/src/main/java/microsim/statistics/weighted/IWeightedFloatArraySource.java +++ b/src/main/java/microsim/statistics/weighted/IWeightedFloatArraySource.java @@ -1,7 +1,5 @@ package microsim.statistics.weighted; -//package microsim.statistics.weighted; - /** * Used by statistical object to access array of float values. * diff --git a/src/main/java/microsim/statistics/weighted/IWeightedIntArraySource.java b/src/main/java/microsim/statistics/weighted/IWeightedIntArraySource.java index edee8af6..c8aaeb3e 100644 --- a/src/main/java/microsim/statistics/weighted/IWeightedIntArraySource.java +++ b/src/main/java/microsim/statistics/weighted/IWeightedIntArraySource.java @@ -1,7 +1,5 @@ package microsim.statistics.weighted; -//package microsim.statistics.weighted; - /** * Used by statistical object to access array of integer values. * diff --git a/src/main/java/microsim/statistics/weighted/IWeightedLongArraySource.java b/src/main/java/microsim/statistics/weighted/IWeightedLongArraySource.java index d6d07e4a..36059ef2 100644 --- a/src/main/java/microsim/statistics/weighted/IWeightedLongArraySource.java +++ b/src/main/java/microsim/statistics/weighted/IWeightedLongArraySource.java @@ -1,7 +1,5 @@ package microsim.statistics.weighted; -//package microsim.statistics.weighted; - /** * Used by statistical object to access array of long values. * diff --git a/src/main/java/microsim/statistics/weighted/Weighted_CrossSection.java b/src/main/java/microsim/statistics/weighted/Weighted_CrossSection.java index f5eb3591..8750217c 100644 --- a/src/main/java/microsim/statistics/weighted/Weighted_CrossSection.java +++ b/src/main/java/microsim/statistics/weighted/Weighted_CrossSection.java @@ -1,5 +1,4 @@ package microsim.statistics.weighted; -//package microsim.statistics.weighted; import microsim.statistics.ICollectionFilter; import microsim.statistics.IDoubleSource; From fe512eebfc55c7c1653874b5527a28470a604844 Mon Sep 17 00:00:00 2001 From: Adrien Morison Date: Mon, 27 Jul 2026 10:02:06 +0100 Subject: [PATCH 17/17] HistEntry: implement Serializable since `Weighted_HistogramDataset` does --- .../java/microsim/gui/plot/Weighted_HistogramDataset.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java index 50f1f33e..fe2f0ee3 100644 --- a/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java +++ b/src/main/java/microsim/gui/plot/Weighted_HistogramDataset.java @@ -51,7 +51,9 @@ import org.jfree.data.xy.AbstractIntervalXYDataset; import org.jfree.data.xy.IntervalXYDataset; -record HistEntry(Comparable key, List bins, int numValues, double binWidth) { +record HistEntry(Comparable key, List bins, int numValues, double binWidth) + implements Serializable { + private static final long serialVersionUID = 1L; } /**