Switch for application connections
Summary
This MR proposes a mechanism to easily switch between in-memory and on-disk application connections.
Rationale
The goal is to facilitate the development of OTB processing chains in Python.
Implementation Details
Classes and files
With the function Application::ConnectImage()
, a specific kind of connection has been implemented in InputImageParameter
(the InputImageListParameter is also supported), it contains:
- an
Application
pointer - a key for the OutputImageParameter to connect
- a boolean to set the connection mode: in-memory / on-disk
It allows to build a kind of application pipeline, where we can propagate calls from the last application to the upstream applications. The method Application::Execute()
has been modified to propagate Execute()
calls. It follows a simple procedure:
- Discover the list of upstream applications
- Call
Execute()
on each of them - Handle the input images that have a connection:
- in-memory mode: pass the image pointer from upstream application to InputImageParameter and disable the OutputImageParameter where it comes from
- on-disk mode: pass the filename from upstream application to InputImageParameter and enable the OutputImageParameter where it comes from
- Call
WriteOutput()
on each upstream application - Call our own
Application::DoExecute()
This removes the need to call Execute()
after each upstream application, we just call ExecuteAndWriteOutput()
on the latest application.
The function Application::PropagateConnectMode(bool)
has been added to switch between the in-memory (default) and on-disk modes. When no temporary filename has been given in the output image, the connection will always default to in-memory.
Here is a snippet of what we can do in Python:
# in-memory
app1 = otb.Registry.CreateApplication("Smoothing")
app2 = otb.Registry.CreateApplication("Smoothing")
app1.IN = input_image
app2.ConnectImage("in", app1, "out")
app2.OUT = output_image
app2.ExecuteAndWriteOutput()
# on-disk
app1 = otb.Registry.CreateApplication("Smoothing")
app2 = otb.Registry.CreateApplication("Smoothing")
app1.IN = input_image
app1.OUT = temp_image
app2.ConnectImage("in", app1, "out")
app2.OUT = output_image
app2.PropagateConnectMode(False)
app2.ExecuteAndWriteOutput()
Tests
The test pyTvConnectApplications
has been updated to demonstrate the new features.
Documentation
TODO: the Python CookBook recipe needs to be updated
Additional notes
Some optional todos:
- the function
CompositeApplication::Connect()
should be deprecated and renamed (perhapsLink()
, orLinkParameter()
) to avoid any confusion.
Copyright
The copyright owner is COPYRIGHT OWNER (OR OWNER'S AGENT) and has signed the ORFEO ToolBox Contributor License Agreement.
Check before merging:
- All discussions are resolved
- At least 2
👍 votes from core developers, no👎 vote. - The feature branch is (reasonably) up-to-date with the base branch
- Dashboard is green
- Copyright owner has signed the ORFEO ToolBox Contributor License Agreement