Updates 2019/04/30

Well, I didn't quite manage to get this post out the door before going on holiday over Easter. Collection handling is much improved in the flow, a new tool for handling spreadsheets, the Spreadsheet processor, has been added, a new merge transformer for spreadsheets added (SpreadSheetMethodMerge), and lots of little fixes and improvements.


  • Added the -close-connection option to the DatabaseConnection standalone, which closes the connection one the flow wraps up. This is required for SQLite to release the database file properly. Otherwise ADAMS has to be restarted.

  • Errors and warnings that occur when processing the first line in the compact flow format are now being propagated properly, i.e., displayed in the user interface. External actors cano now report these errors again.

  • Pasting actors in the Flow editor now updates the display again to show the modified state.

  • The Debug execution listener in the flow now ensures that it is visible when a breakpoint is triggered.

  • The Find usages action from the Flow editor's popup menu now also finds nested variables and storage names. It also allows jumping to actors now that are in external flows, which don't have a root Flow actor and therefore miss a UI parent component context.

  • adams-imaging: The additionalObject option of the ImageObjectOverlap transformer now works when no label key was provided.

  • adams-spreadsheet: charts used by the Spreadsheet file viewer now plot all the data points with differing X/Y pairs, not just with differing X.

  • adams-weka and adams-weka-lts:

    • The Multi-Experimenter now handles the split generators correctly in the user interface, the train/test split experiment now works again, some minor user interface bugs fixed.

    • Hermione now stops the run if there are no optimization handlers defined, e.g., when loading invalid classnames.

    • In the Preprocess tab of the Weka Investigator, you can now filter the attribute names using the provided filter text field.


  • added flow_start_timestamp programmatic variable

  • upgraded RSyntaxTextArea dependency to 2.6.1

  • upgraded matrix-algorithms dependency to 0.0.15

  • removed the Quick edit tab in the Flow editor, due to strange lockups in the GenericObjectEditor.

  • The ReportHandler in the Preview browser now allows the report file reader to be configured, to display a wider range of report file formats.

  • adams-spreadsheet:

    • The DefaultXY JFreeChart dataset now allows X to be empty, uses row index for X in this case.

    • The SpreadSheetDisplay now accepts objects implementing the SpreadSheetSupporter interface as well.

  • adams-weka and adams-weka-lts:

    • The Instance tab in the Weka Investigator now allows the selection of an attribute to use for coloring instances (each unique value represents a color).

    • On the Preprocess tab in the Weka Investigator, you can now select the menu item Use selected as class from the split button of the attribute selection panel. Batch-filtering now only works if the datasets are actually compatible. The table listing the attribute names now also lists their types in a separate column.

    • Any GOE panel handling Weka classifiers now has an additional popup menu item called Enclose, which allows you to enclose the current classifier within a SingleClassifierEnhancer scheme (eg FilteredClassifier).

  • adams-heatmap:

    • The Heatmap class now implements SpreadSheetSupporter;

    • The HeatmapToSpreadSheet conversion now simply calls the toSpreadSheet() method.


  • Added the ProgrammaticTokenListener transformer for hooking into flow with non-flow code, allowing the listening to the data flowing through, e.g., for updating Swing user interface components.

  • Added the ArrayCovariance array statistic.

  • Added jshell-scripting dependency and JShell menu item (you need to switch to Developer mode). In order to execute a script it needs to be saved first.

  • Added ArrayToCollection transformer for turning an array into a collection.

  • Added CollectionAppend transformer to append a collection in storage with the one passing through.

  • Added CollectionProcess control actor for processing collections similar to ArrayProcess.

  • adams-imaging:

    • added the ColorProvider transformer which outputs a Color object whenever a token passes through.

    • added PngIsComplete file in use check scheme (looks for IEND end of file marker).

  • adams-spreadsheet:

    • The SpreadSheetMethodMerge transformer allows merging of spreadsheets via a class hierarchy of merge algorithms, similar to the SpreadSheetMerge transformer.

    • The Spreadsheet processor tool allows you to easily load spreadsheet data (file, database, clipboard), process it (query, flow) and output it (file, chart, clipboard). It also allows you to save configurations to easily re-use processing in certain scenarios.

  • adams-pdf: The PDFGenerate transformer allows PDF generation using specified generator scheme. Similar to PDFCreate, but depending on the generator, is not limited to processing files.

  • adams-heatmap: added conversions for computing correlation and covariance between columns of a spreadsheet: ColumnCorrelationToHeatmap and ColumnCovarianceToHeatmap.

  • adams-weka and adams-weka-lts:

    • The Classify tab of the Weka Investigator now has tree visualization output and GraphML output using the JGraphT library.

    • Added MSLE (mean squared logarithmic error) evaluation metric.

    • Added MSLE to Hermione as measure to be used for evaluation.

    • Added evaluation post-processors to remove worst predictions: RemoveWorst (using percentage), RemoveWorstStdDev (based on mean and stdev of actual class values).

  • adams-spectral-2dim-core:

    • added the DeleteDbSampleDataValue transformer for removing specific fields from the database for a sample ID.

    • added the SampleDataValueDbWriter transformer for writing specific sample data fields to the database.

Updates 2019/03/15

Fixed a bunch of little bugs and also worked on many minor improvements in the user interface.

A new Weka classifier got added: XGBoost, though currently only available for Linux/Mac.

The database backend within ADAMS has been further abstracted and now allows mirroring (ie replicating the queries on another server). Useful when trying to use a backup database server.


  • Pasting of actors no longer generates long name suffixes consisting of (x) (y) (z) ...

  • EnterManyValues: date types now get inserted with their string representation into a map.

  • Histoy lists, like used in the Weka Investigator, now prompt the user when selecting Remove all from the popup menu, whether they really want to remove X entries.

  • The generates() method of the StringConstants source now outputs the class that the selected conversion generates (proper compatibility check).

  • The Close/cleanup and Remove graphical output actions in the Flow editor now close any Debug views as well.

  • Row plots in spreadsheet tables (eg Spreadsheet file viewer) no longer sub-sample points if the same number of points was selected.

  • Fixed incorrect path handling when placeholders present: Command, Exec, Java, SimpleStringReplace, StringInsert, StringReplace.

  • Command source now launches the commands again.

  • adams-python: fixed incorrect path handling when placeholders present: PipExec, PythonExec, PythonVenvExec.

  • adams-spreadsheet:

    • fixed incorrect path handling when placeholders present: SpreadSheetInsertColumn, SpreadSheetInsertRow, SpreadSheetReplaceCellValue.

    • entering multiple values through the GenericArrayEditor now works again in the Spreadsheet file viewer (Java decided to place the dialog behind all other windows).

  • adams-rats: fixed incorrect path handling when placeholders present: Exec (rat input and output).

  • adams-weka and adams-weka-lts: Row plots in instances tables (eg Weka Investigator) no longer sub-sample points if the same number of points was selected.


  • Changed the Compare actors menu item in the Flow editor's tree popup menu into a sub-menu with Just actors (original functionality) and Sub-flows (additional) as menu items.

  • Added support for unordered ranges: adams.core.UnorderedRange

  • External actor files are now being monitored and reloaded/reexpanded if necessary through the GenericObjectEditor.

  • The ArrayProcess control actor now has an optional variable for storing the index of the current element being processed (1-based index).

  • Added FILE_FORWARD_SLASHES variable type, which generates a filename with forward slashes. Affects transformers/standalones: SetVariable, SetManyVariables.

  • The Switch control now has a lenient option, which drops the requirement of the token having a payload (eg the Start source generates a null token, simply to kick off things).

  • Removed module adams-phmm4weka.

  • adams-spreadsheet:

    • Added support for unordered ranges: adams.data.spreadsheet.SpreadSheetUnorderedColumnRange

    • The SpreadSheetReorderColumns transformer now uses SpreadSheetUnorderedColumnRange for its order option.

    • The SpreadSheetJoinColumns conversion now uses SpreadSheetUnorderedColumnRange for its columns option, allowing for out-of-order joins.

    • Disabled Spreadsheet Explorer in the menu for the time being.

    • Added support for overlaying a diagonal in the scatter plot (via a second data series): enable addDiagonalSeries in the DefaultXY dataset. Affects JFreeChartPlot and JFreeChartFileWriter.

    • Added History button to the Query tab.

  • adams-weka and adams-weka-lts:

    • Added support for unordered attribute ranges: adams.data.weka.WekaUnorderedAttributeRange

    • The Weka Investigator now allows moving its tabs (like Preprocessing and Classify) via the Move tab to submenu in the tab's popup menu.

  • adams-spectral-2dim-core:

    • added ability to Update Sample data dialog to work off sample IDs obtained from a spreadsheet.

    • SpectrumT and SampleDataT are no longer directly accessed, but through facades, which allows swapping out of backend (e.g., introduce mirroring).

  • adams-rats:

    • The RatControl actor now has a Console button in the user interface, which allows the display of the last X lines that occurred in the console.

    • The type of log object generated from errors and sent to the log actor (if available) is now defined via the AbstractLogObjectGenerator class hierarchy.

  • adams-cntk-weka and adams-cntk-weka-lts: moved CNTKPyroProxy classifier from into new module adams-python-weka(-lts) and renamed it to PyroProxy, as it is framework-agnostic.

  • adams-pdf: The PDF Viewer switched from multi-tab layout to multi-page.


  • Added the DeleteVariable and DeleteStorageValue standalones.

  • Added the Configure option handler tool (developer mode) that allows configuring any option handler.

  • adams-weka and adams-weka-lts: i

    • added the GraphSource serialized object preview handler for weka.core.Drawable objects, which outputs the graph source code (dot or XML BIF).

    • added the GraphSource output for the Investigator's Classify/Cluster tabs, which outputs the graph source (dot or XML BIF) for weka.core.Drawable classifiers/clusterers.

    • added WekaDatasetsMerge transformer, an alternative to WekaInstancesMerge for merging multiple Weka Instances objects into one (side-by-side). This transformer can be selected in the Weka Investigator now as well for merging datasets (Preprocess panel, data table actions).

    • The XGBoost classifier got added (using https://github.com/dmlc/xgboost) - currently only for Linux/Mac.

    • The Weka Multi-Experimenter now has a table-based results panel as well.

  • adams-spectral-2dim-core:

    • added List Sample data dialog which lists all sample data for the selected spectra in a single table.

    • added Delete Sample data dialog which allows removal of specified sample data values from the selected spectra.

    • no longer storing Dummy report flag in sample data table.

  • adams-spreadsheet:

    • spreadsheet tables now allow sorting on multiple columns using via the Sort... menu item of the table's popup menu.

    • added query panel for meta-data to the SQL Workbench tool

Updates 2019/01/30

A lot of minor UI improvements and dependency refreshments happened since the release in December last year. New in the flow is EXIF tag support and communication with Python processes across the network using Pyro4 (Python Remote Object, https://github.com/irmen/Pyro4).


  • Multi page panes are now showing border again when focused, to make it easier to see which widget has the focus.

  • The Preview browser did not maintain correctly its internal list of content handlers, resulting in apparently random preview handlers getting selected.

  • The SQL Workbench now disables the user interface while a query is being executed.

  • Chooser panels (eg for dates, files or colors) now change the font color to RED if the entered value is not in a valid format and will revert to the default value when opening the dialog via the ... button. The Use default menu item was added to allow the user to revert back to the default value.

  • EnterManyValues now shows the tool tip of the underlying component if there was no explicit help string entered.

  • The sources EnterValue, EnterManyValues, SelectDirectory and SelectFile now honor any information recovered from restoration files during non-interactive and/or headless operation.

  • adams-weka and adams-weka-lts: the transformers WekaFilter, WekaClassifying and WekaClustering are now threadsafe when using the internally used Weka object (previously, when using a shared model in storage in concurrent situations, it could end up in an unsuable state).

  • adams-net: upgraded tika-core to 1.20 due to https://nvd.nist.gov/vuln/detail/CVE-2018-17197

  • adams-ml: The CrossValidation scheme for preparing file-based datasets now generates correct leave-one-out datasets.

  • adams-groovy: Upgraded Groovy to 2.5.5 to make the Groovy Console work with Java versions 9 and later.

  • adams-video: fixed user interface issues in VLCjPlayer and Annotator


  • Retired the obsolete NamedSetup framework.

  • The Find in files tool now has all its operations in a button with a drop-down list, using a class hierarchy. New actions are: Copy to... and Move to.... The View... action now uses the Preview browser.

  • How graphical actors are being displays is now handled by a class hierarchy, replacing the displayInEditor option. The default scheme (appropriately named Default) just displaying it on top of all windows. With DisplayInEditor, the window gets displayed in Flow editor window. NoDisplay suppresses the display completely and Background displays behind all other windows. The ChangeDisplayType actor processor allows you to change the type(s) to a new one.

  • The menu item MakeInteractive of the Flow editor tree popup allows one to turn one or more SetVariable standalones into an interactive sub-flow (Trigger/EnterManyValues/MapToVariables).

  • The DefaultValueDefinition used by EnterManyValues now offers an option to output paths (file or directory) with forward slashes.

  • All value definitions, as used by EnterManyValues can be now disabled/enabled, which makes it easier to maintain testing/production ones side by side.

  • The LocalScopeTransformer and LocalScopeTrigger control actors now add the programmatic variables to their local scope when using EMPTY for variable propagation: flow_filename_long, flow_filename_short, flow_filename_restore, flow_dir, flow_id, is_headless, has_gui, project_name, project_home, project_modules

  • The JsonFileReader can now enforce output type (OBJECT or ARRAY) if know beforehand, default is ANY (no enforcement)

  • Added ability to flag a flow as active and manage that one through the Active menu and the buttons in the toolbar that have the little A in the bottom right corner. This is useful when editing external flows, as the switching back to the main flow is now no longer necessary.

  • The pause/resume and stop buttons are now also available through a debug flow perspective.

  • Removed the Run/Debug flow notification area actions.

  • adams-spreadsheet: the sinks JFreeChartFileWriter and JFreeChartPlot now allow the selection of shapes for the data point markers, the background color is now white (aligned with other ADAMS plots) and the plot color can be selected as well.

  • adams-weka and adams-weka-lts:

    • The WekaEvaluationSummary transformer now has options for custom titles for summary, confusion matrix and class details.

    • Updated Weka dependencies to 3.9.3-fork-0.0.4 and 3.9.0-fork-0.0.9 respectively (fixes duplicate output when using Logback or log4j; AbstractClassifier.forName no longer casts to AbstractClassifier, but Classifier).

  • adams-jython: upgraded Jython to 2.7.1b3.


  • adams-imaging:

    • added image reader/writer using the Apache Commons Imaging library, added preview handlers for images and meta-data using this library as well. This will eventually replace the Sanselan-based classes.

    • The ExifTagOperation transformer allows you to work on the EXIF data in files, e.g., read/write/remove fields or check for fields. The HasExifTag boolean condition checks whether the specified tag is present.

  • adams-python:

  • adams-maps: added GPSDistance conversion for computing distance (in meters) between two GPS points.

Updates 2018/12/20

Just a short list of updates, due to upcoming release. Main new feature is an SQL workbench for running SELECT, UPDATE, DELETE queries from within ADAMS.


  • adams-rest: added missing Maven dependencies to make it work with Java 9+.


  • Added button to the control panel for debugging flows, to highlight the current actor in the editor window.

  • adams-weka: upgraded Weka dependency to 3.9.3-fork-0.0.3, fixes duplicate output in console for LogBack and log4j

  • adams-weka-lts: upgraded Weka dependency to 3.9.0-fork-0.0.8, fixes duplicate output in console for LogBack and log4j


  • adams-weka and adams-weka-lts: added menu item for Weka's SimpleCLI

  • adams-spreadsheet: added SQL Workbench for running SQL queries on SQL databases.

Updates 2018/12/07

A fair amount of work was going on in the Weka-related modules, with a new Compare tab getting introduced to the Weka Investigator and a number of new filters. The content handlers in the Preview browser can be customized now, provided they have customizable options.


  • When swapping SetVariable transformer with standalone (and vice versa), the transfer for variable of variableValue now works. Also added transfer for expandValue, valueType properties.

  • String content on the clipboard is now only parsed in the Flow editor when performing an actual paste. This is to avoid lengthy wait times when switching between flows or generating popup menu when the clipboard content is large.

  • Pasting from clipboard in file or directory chooser panels now updates the history as well.

  • adams-rats: meta ratinput/output schemes now call the base initReception/Transmission methods; the Cron input scheme now installs the cronjob in the initReception method (to avoid race conditions), DeQueue configures queue in initReception, Socket sets up server socket in initReception, Subscribe configures subscription in initReception.

  • Updating a value using a field with a different data type as currently stored in a report didn't update the field itself, the old key was kept instead. Problematic when updating reference data for spectra, attempting to fix the data type of values.

  • adams-spreadsheet: fixed the quick info of the SpreadSheetAddRowID conversion.

  • adams-spectral-2dim-core: the Preview browser now handles simple spectrum files (.spec) again.

  • adams-weka and adams-weka-lts:

    • fixed setting of numZeroes in RemoveWithZeroes filter.

    • the WekaFileChooser now lists all loaders/savers again

  • adams-net: fixed generation of output file name in SFTPGet transformer.

  • adams-rats: bulk actions now only get applied to checked ones, not all; checking/unchecking RatControl panel now uncheckings the RatsControl panel.


  • NumericStringCompare, as used by the Sort transformer, now providers better error messages when regexp replacement fails.

  • Content handlers in the Preview browser can be customized now (only some offer cutomizable options)

  • The Flow editor now has an Actors help menu item, which brings up class help just for actors. Additional copy operations got movied into Copy... sub-menu to keep menu cleaner, also added the Copy acto name action to sub-menu.

  • adams-spreadsheet: The spreadsheet table now has menu items in the header popup menu for setting column width/widths manually.

  • adams-spectral-3way-core: added option to the SimpleEEMReader to denormalize the amplitudes using the stored normalization factor.

  • adams-python: PythonEnvironment now allows updating the PYTHONPATH environment variable (append, prepend, replace).

  • adams-imaging:

    • The Grid scheme of the SubImages BufferedImageTransformer algorithm now offers options for overlaps on x and y axis, to avoid cutting through objects of interest.

    • Renamed transformer ImageReader to ImageFileReader and sink ImageWriter to ImageFileWriter to make them consistent with other actors that read/write files.

  • adams-weka and adams-weka-lts:

    • added dataset-weights-weka-package 2015.6.16 dependency

    • SimpleArffLoader and SimpleArffSaver now handle instance weights

    • The Weka Investigator now has a popup menu on tabs (right-click) and also allows saving/loading of parameters of individual tabs. Data tab can display extra column with instance weights now. Closing tabs no longer prompts a dialog, as closing can be undone now (via Tab menu).


  • Added InList boolean condition for checking whether incoming string is in list of strings.

  • The CollectionToArray transformar turns any collection (eg java.util.List or java.util.Set) into an array.

  • The StorageCollectionInsert transformer updates a collection object in storage with the object(s) passing through.

  • The Find in files interface allows you to search for files in a directory that contain a certain search string. Search text can be either a simple string or a regular expression.

  • adams-ml: added the CrossValidation scheme to the file-based dataset generation for generating cross-validation folds.

  • adams-weka and adams-weka-lts:

    • The WeightsBasedResample filter (package weka.filters.unsupervised.instance) allows you to resample a dataset using its weights.

    • The AccumulatedLWLWeights filter (package weka.filters.unsupervised.instance) generates weights for dataset using LWL-based approach, accumulating them and normalizing them to [0;1].

    • The RemoveWithWeights filter (package weka.filters.unsupervised.instance) removes instances outside the specified range.

    • The new Compare tab in the Weka Investigator allows you to compare two datasets via a common ID attribute (string or nominal): lists common IDs and ones that are only in first or second dataset, visual comparison of internal numeric values in separate tab (mainly aimed at spectral data).

  • adams-imaging: added simple framework for generating negative regions (regions without annotations) using annotated images as input for automating negative region generation: NegativeRegions transformer and class hierarchy of schemes.

Updates 2018-11-09

Not really a theme this time, some libraries got upgraded to fix security vulnerabilities, a general framework for file-based dataset generation (with CNTK Faster-RCNN a concrete implementation), the Weka Investigator got two new tabs (Fast ICA, Data query) and other bits and bobs.


  • adams-visualstats: setting x/y index in the scatter plot no longer shifts the panel (getX/getY where overriding the methods of the JComponent class)

  • adams-weka and adams-weka-lts: The WekaTrainClusterer transformer now displays the selected post-processor correctly in its quick info.


  • upgraded commons-compress dependency to 1.18 due to security vulnerability: https://nvd.nist.gov/vuln/detail/CVE-2018-11771

  • The Copy transformer now has option for specifying type of copy.

  • The StringMatcher transformer as a new flag outputIndices for outputting the 1-based indices instead of the strings.

  • The File commander now has an extra column listing the file extension, to make sorting by file type easier.

  • The Preview browser now offers a simple note-taking functionality: adding notes via popup menu in files list; clearing/viewing/saving of notes via main menu.

  • adams-pdf: upgraded pdfbox to 2.0.12+ to fix https://nvd.nist.gov/vuln/detail/CVE-2018-11797

  • adams-rsync: upgraded rsync4j to 3.1.2-13 (OpenSSH 7.9 binaries for Windows)

  • adams-weka:

    • upgraded Weka to 3.9.3-fork-0.0.2

    • upgraded matrix-algorithms to 0.0.12

    • The ClusterCenters clusterer post-processor now allows computation of median for numeric attributes and most common label for nominal ones.

  • adams-weka-lts:

    • upgraded Weka to 3.9.0-fork-0.0.7

    • upgraded matrix-algorithms to 0.0.12

    • The ClusterCenters clusterer post-processor now allows computation of median for numeric attributes and most common label for nominal ones.

  • adams-spectral-3way-core:

    • SimpleXYZReader and SimpleXYZWriter now support gzip compression

    • feature generators are now more robust when trying to access incorrect report values.

  • adams-spreadsheet:

    • SpreadSheetAddFormulaColumn now has a placeholder for the last row

    • SpreadSheetAddFormulaRow now has a placeholder for the last column

    • The expression language for LookUpUpdate now has has/remove methods for checking whether a variable is present and to remove it respectively.


  • Added a transformer for reversing array order: ArrayReverse

  • adams-imaging: transformer for cleaning up overlapping images: DeleteOverlappingImageObjects

  • adams-cntk: added preview handler for CNTK FasterRCNN ROIs: CNTKFasterRcnnRois

  • adams-weka and adams-weka-lts:

    • added experimental FastICA (independent component analysis) support to the Investigator as new tab (ICA).

    • added the WekaClustererPostProcessor transformer to allow for multiple post-processing of a container output by a WekaTrainClusterer actor.

    • added the following clusterer post-processors: AddCluster (adds the predicted cluster), ClusterCounts (records how many instances get clustered in a certain cluster).

    • added new tab to the Weka Investigator for sql-like queries: Data query

  • adams-spectral-2dim-core: added experimental FastICA support to the SpectrumExplorer.

  • adams-ml: added simple framework for preparing/generating datasets from files, using: PrepareFileBasedDataset and GenerateFileBasedDataset.

  • adams-cntk: added file-based dataset generator plugin CNTKFasterRCNN.

  • adams-spectral-3way-core:

    • added Shift filter, which allows shifting of x, y or z values.

    • Upgraded multiway-algorithms dependency to 0.0.8

Updates 2018/10/19

Quite a bit of work underneath the hood has happened, UI improvements relating to the Flow editor, improved previewing for spectral data types and lots of little changes and fixes.


  • The ListStructureModifyingActors actor processor now skips disabled actors (used when debugging).

  • GOE editors that handle actor references like callable actors now skip any actors that are disabled.

  • Rearranged the Flow editor tree popup menu a bit to streamline usage: combined external actor operations; moved less commonly used operations down.

  • Added support for Flow editor tree popup menu extensions, ie menu items that get inserted after/before an existing menu item (Tree.PopupMenuExtensions in FlowEditor.props settings file).

  • The FileInfoHandler of the Preview Browser switched to using java.nio.file.Files.XXX methods (due to bug in java.io.File.XXX methods, see https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6203387); added owner, posix permissions, regular file, symbolic link to the output.

  • Recent refactoring of the generic plot panel and its axes, resulted in invalid formattters getting assigned. This resulted in the Memory monitor x axis showing the HH:mm plus the Java Epoch.

  • BOMs (byte order marks; used by UTF variants) are now handled properly by the CsvSpreadSheetReader, the generic loading of text files and the various TextFileReader schemes.

  • adams-imaging:

    • Annotating objects is no longer generating negative heights or widths when not starting selection rectangle in top-right corner.

    • The Objects sub-image algorithm now ensures that the sub-image dimensions do not exceed the original image.

  • adams-ml: The ConfusionMatrix transformer now handles unclassified predictions (aka missing values).

  • adams-spreadsheet:

    • SpreadSheetDisplay now adheres to the useOptimalColumnWidth flag.

    • Spreadsheet file viewer: now hides rows with missing values when applying filters; Copy column now copies only the visible cell values instead of all.

    • The SpreadSheetMerge transformer now removes duplicate unique columns correctly (failed to remove correct ones if no prefix/ID was used), when using the keepOnlySingleUniqueID flag.

  • adams-weka and adams-weka-lts:

    • WekaPredictionsToSpreadSheet (also used in generating the confusion matrix view in the Investigator) now ensures that labels are treated as strings now, to avoid numeric conversions for labels like '00' or '07'.

    • WekaPredictionsToSpreadSheet, WekaPredictionsToInstances and the Investigator now correctly align the original instances with the predictions of cross-validation when using a grouped split generator.

  • adams-spectral-2dim-core: The OpusSpectrumReaderExt now applies the scaling factor for Y defined in the file when reading the amplitudes.


  • Switched from Swing widgets to ADAMS ones: JButton, JCheckBox, JComboBox, JTextArea, JTextField, JTextPane. This makes it easier to introduce additional functionality in the top-level class.

  • The Command and Exec sources and the Exec sink now support setting of custom environment variables.

  • Added option for conversion to be applied to values, to have better control over types for hashset-handlers: HashSetInit (standalone/transformer), HashSetAdd (transformer), HashSet (boolean condition).

  • The parsers for BooleanExpression, MathematicalExpression and StringExpression now allow expression variables (not to be confused with flow variables) to be strings consisting of alphanumeric chars and "_" (but must start with uppercase letter to distinguish them from built-in functions), as well as enclosing via single quotes instead of just "[]".

  • Report tables are now using a case-insensitive sort on the field names.

  • The NewReport source now uses BaseClassname instead of String for the report classname.

  • BaseClassname now has its own GOE editor, which allows you to search for classes.

  • The GenericArrayEditor now allows the sorting (asc/desc) of the elements.

  • The SetContainerValue control actor now allows storage of non-standard, additional meta-data via the force flag.

  • adams-rats: The Exec input and output now support setting of custom environment variables.

  • adams-spreadsheet: The LookUpUpdate parser now allows enclosing of expression variables in "[]" as well, aligning it with the other parsers.

  • adams-spectral-3way-core: upgraded multiway-algorithms dependency to 0.0.7.

  • adams-spectral-2dim-core:

    • Added -lenient flag to the InstanceGenerator transformer to only log errors instead of returning them (and possibly stopping the flow).

    • The spectrum preview in the Preview browser and the object renderer when debugging a flow now display spectrum and sample data via a tabbed pane, rather than just the spectrum.

  • adams-compress: upgraded unrar dependency to 3.0.0

  • adams-net:

    • removed obsolete org.apache.httpcomponents/httpclient dependency

    • upgraded tika-core dependency to 1.19.1


  • Added the PullUpActor tree editor popup menu and keyboard action, which moves all sub-actors of a mutable actor handler (like Tee or Trigger) up one level and removes the enclosing actor handler.

  • Added little test dialog for date formatting/parsing in Developer user mode in the Maintenance menu.

  • adams-ml: added basic filter framework for spreadsheet-based datasets, SavitzkyGolay, PLS, MultiStream, MultiBatch.

  • adams-weka and adams-weka-lts: added OuterProductAnalysis filter (Fabricio S.Terra, Raphael A.Viscarra Rossel, Jose A.M.Dematte (2019). Spectral fusion by Outer Product Analysis (OPA) to improve predictions of soil organic C. Geoderma. 335:35-46. URL https://doi.org/10.1016/j.geoderma.2018.08.005.).

  • adams-spectral-2dim-core:

    • Added new AbstractMultiSpectrumFilter schemes: Add and Subtract.

    • Source for listing sample IDs of sample data with no associated spectra: OrphanedSampleDataIdSupplier

    • Added handlers in the Preview browser for spectrum formats: ASCIIXY, CML, DPT, JCampDX, JCampDX2, Json, MPS, Opus, OpusExt, Relab, SPA, SPC, SpecLib.

Updates 2018/09/16

It has been a while, I know. Been visiting clients and preparing to go live with some large ADAMS-based systems. On the data transformation side of things, there are a few more PLS variants available. For image processing, there is now better support for VIA/VGG annotations and data available. The experimental CNTK Java integration has been removed, too hard to maintain as it is tied to a specific CNTK version.


  • The Flow editor no longer saves expanded external flows.


  • The Copy (plain text) operation in the Flow editor tree popup menu now uses the compact format as well.

  • The Flow control actor now allows to specify a restart manager. This allows the monitoring of flow(s)/setup file(s) by a flow that runs as a background service (daemon or Windows service), triggering its restart.

  • Added a GOE editor for the BaseInterval class.

  • adams-rsync: updated the rsync4j library to 3.1.12-12

  • adams-weka: upgraded multisearch library to 2018.8.16

  • adams-weka and adams-lts:

    • upgraded matrix-algorithms to 0.0.11

    • the filter PartitionedMultiFilter2 now allows specification of prefixes for the filters rather than just using 'filtered'

  • adams-imaging:

    • MergeObjectLocations can now just merge all locations when using minOverlapRatio=0.0 and overlapAction=KEEP

    • ViaAnnotations transformer has been removed.

  • adams-cntk: removed the experimental CNTK Java bindings, as they too hard to maintain and strictly limited to a specific release of CNTK.

  • adams-cntk-weka and adams-cntk-weka-lts: removed any code that relied on the experimental CNTK Java bindings.


  • Added menu item Copy actor path to the Flow editor's popup menu.

  • Added class hierarchy for conversions that swap out objects and concrete SwapObjects implementation for replacing one object with another, using their command-lines.

  • adams-meta:

    • added actor wrappers for auto-generated actors, which can get removed using the RemoveAutogeneratedActors processor: AutogeneratedStandalone, AutogeneratedSource, AutogeneratedTransformer, AutogeneratedSink

    • added actor wrappers for inactive actors (actors that don't get executed, but kept for reference), which can get activated again using the ReactivateActors processor: InactiveStandalone, InactiveSource, InactiveTransformer, InactiveSink

  • adams-net:

    • added MarkdownToHTML conversion for converting Markdown string into HTML string

  • adams-weka and adams-lts:

    • added more PLS algorithms: DIPLS, PRM, VCPLS

    • added SwapPLS conversion for replacing PLS algorithm (with optional migration of number of components)

  • adams-imaging:

  • adams-spectral-2dim-core: added the RowWiseSpreadSheetSampleDataReader sample data reader.

Updates 2018/07/26

The last few weeks I have been busy preparing the migration of a large, commercial ADAMS-based application for processing spectral data to a newer version. This new version uses Rats instead of cronjobs to improve processing speed of data and making predictions. Due to these flows now containing several 10,000 actors, a lot of speed improvements were necessary to make them easier to view and edit in the Flow editor. That introduced also a number of bugs (a lot of rewriting happened behind the scenes), but it has stabilized a lot now.


  • The undo is now fixed in the Flow editor, with the flow no longer disappearing when performing an undo operation. Due to changes of the underlying data structure introduced the last couple of weeks, for speeding up the read/write of flows from/to disk.

  • Using now nested lists for copying/pasting actors on the clipboard for better performance, also using a faster check whether nodes are on clipboard for pasting.

  • The popup menu in the GOE failed on java.io.File objects due to a wrong cast to PlaceholderFile, which got fixed.

  • The GOE could end in an endless loop, firing property events that hammered the Swing thread, resulting in a lock up of the user interface. Removing an unnecessary call for firing property events, the lock up disappeared.

  • Reading of flows in the old nested format now works again.

  • File choosers that allow the editing of options of the selected file type (reader/writer) now ensure that the selected filter and the last handler used are of the same class when showing the dialog, resetting the last handler if that's not the case. Otherwise, cases can occur where the selected filter is not presented in the GenericObjectEditor.

  • adams-weka and adams-weka-lts:

    • The WekaFilter transformer no longer re-initializes the filter if loading from disk/actor/storage and initializeOnce is checked.

    • The CrossValidationFoldGenerator classes now report back the actual number of folds in use (eg when using -1 for LOO, this depends on the data), which in turn makes the WekaCrossValidationExecution work properly when using GroupedCrossValidationFoldGenerator in conjunction with LOO.

    • search methods that implement RankedOutputSearch (eg PrincipalComponents) now output the attribute importance from the ranking instead of the attribute index

  • adams-rats:

    • The Rat actor now disables the performLazySetup option if the sub-flow contains at least one Breakpoint actor (debugging doesn't work in conjunction with lazy setup).

    • The Subscribe rat input now ignores any notifications if the Rat actor is paused.

    • The RatControl actor how has optional support for bulk actions, ie checked Rat actors can be paused/resumed/stopped/started.

  • adams-spectral-2dim-core: fixed selection of instance generator when exporting visible spectra in the Spectrum Explorer: it is now possible to select from a class hierarchy


  • Introduced the adams.flow.processor.ActorProcessor interface, replacing the usage of the AbstractActorProcessor class.

  • The DeserializeToStorage standalone now accepts pairs of storage name / file name to reduce the number of actors necessary when loading lots of models. Storage name and/or file name can be variables as well.

  • The Flow editor now prompts whether to perform checks before saving a when it is considered large (default is 200 actors); occurs on a per-flow basis and can be reverted by simply checking/unchecking the checkbox in the menu.

  • Actors that implement the AtomicExecution interface (eg Tee or Branch) now allow the user to specify a timeout after which the sub-flow gets stopped nonetheless (when finishedBeforeStopping is set).

  • Upgraded lanterna to 3.0.1 (for providing an ncurses-like terminal interface).

  • adams-spreadsheet: The SpreadSheetSetCell transformer can use a cell finder now to locate the cells to update with the specified value as well (eg for updating all cells with missing values or a value less than a certain minimum).

  • adams-weka and adams-weka-lts: switched to updated Weka versions (3.9.2-fork-0.0.2 and 3.9.0-fork-0.0.5 respectively) that include patch for MyHeap usage in weka.core.neighboursearch.LinearNNSearch, avoiding the the number of elements cannot exceed the initially set maximum limit exception.


  • added Clear clipboard to menu of Flow editor

  • added MapToReport conversion

  • Added the ListObjectCommandlines actor processor for listing object command-lines of a specific class.

  • Added actor processor for updating the number of threads used by classes: ChangeNumThreads

  • adams-spreadsheet:

    • The SpreadSheetCellSelector transformer lets you select cells in a spreadsheet to forward in the flow.

    • The SpreadSheetRandomSystematicSample transformer picks a random systematic sample of rows from the incoming spreadsheet.

    • added Clear clipboard to menu of Spreadsheet file viewer

  • adams-weka and adams-weka-lts:

    • The PredictionTrend output generator for the classification tab of the Weka Investigator plots actual and predicted values in a single plot, sorted by actual. This allows spotting of trends.

    • Added NIPALS and SparsePLS

  • adams-meta: The ProcessorActor transformer allows you to process an incoming flow with a specific actor processor (eg listing variables or command-lines).

  • adams-spectral-2dim-core: added instance generator based solely on report fields and with dedicated class field: FieldInstanceGeneratorWithClass