Very helpful. Thanks.

Not that I need this capability, but is there the potential to create a 
OpService#run method that would take, for example, alternating strings and 
objects to allow calls to be "more explicit" or "transparent" (i.e., 
OpService#runExplicit("myOp", "max", max, "min", min) and potentially more 
extensible in case order of arguments change or there end up being additional 
optional arguments. Obviously you link yourself to names as opposed to order. I 
guess there is always a give and take with these things.

I could try and draft up such a method if you think it useful and doesn't go 
against what you are trying to shoot for.

Cheers,

Jay



On Oct 3, 2014, at 12:39 PM, Curtis Rueden <ctrue...@wisc.edu> wrote:

> Hi Jay,
> 
> > 1) When should we use the "Command" style method of doing things where
> > all information is specified using the @Parameter methodology and run
> > via the "run" method, and when should we use the "Function" style of
> > things with a typed input and output "compute" method?
> > Advantages/disadvantages of each? Can you get by with either?
> 
> We started OPS with the "Command" paradigm, then found that for the vast 
> majority of ops, there was one "special" input over which you want to iterate 
> (either per pixel, or in a multi-threaded context, or both), and one main 
> output of the op. That common case is a Function (you extend either 
> AbstractStrictFunction or AbstractOutputFunction, depending on whether you 
> want to force the caller to pass in a preallocated output or not).
> 
> In short: use Function if you want your op to usable by the "map" op to 
> execute it iteratively over an entire image (e.g., an Iterable or 
> IterableInterval). Use a plain Op if you don't need that, don't care or are 
> lazy.
> 
> As always in programming: model your code after existing code ("when in 
> Rome") for best results.
> 
> > 2) I couldn't see how some of the @Parameter objects would be or are
> > injected or set.
> 
> Calling OpService#run to execute the op automatically finds the best matching 
> op, and then injects the parameter values in the specified order.
> 
> > how are potential ambiguities resolved when trying to set two
> > parameters of the same type?
> ...
> > Order that it is listed in the Op class def and order of args provided
> > to the ops.run() methods? 
> 
> Yes. The order defined in the class must match the order of arguments given 
> to the OpService#run method.
> 
> Call OpService#help(String) for a full list of ops with the given name, 
> including expected parameters.
> 
> Regards,
> Curtis
> 
> On Thu, Oct 2, 2014 at 4:53 PM, Jay Warrick <warr...@wisc.edu> wrote:
> Curtis - Sweet! I like it. I can see myself making small packages of Ops for 
> things we do in our research that we could easily make available for others. 
> It's also a great way for us to reuse capabilities across different JEX 
> functions we create that allows us to share them with the rest of the 
> community instead of just creating static methods hoarded in various "utility 
> classes" in our software, not that we would ever do that :-)
> 
> Curtis and everyone else :-) - First of all, thanks to all for their hard 
> work to lay the foundation for this really useful Ops package. 2 things, 
> though, I would appreciate some help with. Although I've looked at most of 
> the Ops and the tutorials on creating and using Ops, I still have a couple 
> questions.
> 
> 1) When should we use the "Command" style method of doing things where all 
> information is specified using the @Parameter methodology and run via the 
> "run" method, and when should we use the "Function" style of things with a 
> typed input and output "compute" method? Advantages/disadvantages of each? 
> Can you get by with either?
> 
> 2) I couldn't see how some of the @Parameter objects would be or are injected 
> or set. What is the "sleekest" method for setting these parameters if I 
> wanted to use these Ops in my own program without resorting to setting 
> private Parameter fields accessible etc (e.g., the @Parameter private T 
> threshold;" of the ApplyConstantThreshold.java Op)? Am I forgetting some 
> tool/method for easily injecting/setting Op/Command parameters? It seems like 
> calls to ij.op().<whatever> only pass parameters to compute method and don't 
> do any @Parameter object injection/setting. Am I wrong? Or, eventually, would 
> these Ops have getters and setters. Are getters and setters automatically 
> generated already that I'm not aware of by just looking over the code?
> 
> Thanks,
> 
> Jay
> 
> 
> 
> 
> On Oct 2, 2014, at 12:35 PM, Curtis Rueden <ctrue...@wisc.edu> wrote:
> 
>> Hi Jay,
>> 
>> > Am I right that Ops sort of occupies the niche between ImgLib2 and
>> > ImageJ Plugins... something that makes it easier to do the image
>> > manipulations but can be reused a bit more easily given they don't
>> > require many of the Service parameters and preprocessors that many of
>> > the plugins take/need?
>> 
>> Yes, OPS is intended for pure image processing operations and functions. The 
>> rule of thumb is that they be deterministic, and have no side effects. So 
>> you give same inputs, you get same outputs, every time. Many of them are 
>> also multithreadable, though that is not a requirement. And OPS are also 
>> supposed to be "static" rather than dynamic -- i.e., they shouldn't have a 
>> variable number of input or output parameters, unlike commands in general.
>> 
>> That said, OPS are still allowed to depend on services, but it is expected 
>> that the service methods you call will not compromise the determinism of the 
>> op -- i.e., only utility methods of services should really be used. Perhaps 
>> in the future we could add annotations to each service method indicating 
>> what sort of method it is, and hence where it is "safe" to use.
>> 
>> I want to thank you for your feedback and discussion from a few months ago, 
>> regarding reuse of ImageJ2 commands in JEX. Your perspective provided some 
>> of the inspiration for the design of OPS, because it became clear that we 
>> need a "pure functional" layer for image processing that does not rely on 
>> side effects from services, etc. The idea is that KNIME Image Processing, 
>> CellProfiler, OMERO, JEX, etc., can all consume and expose the ops with the 
>> assumption that they will behave well (work headless, etc.).
>> 
>> Regards,
>> Curtis
>> 
>> 
>> On Thu, Oct 2, 2014 at 12:08 PM, Jay Warrick <warr...@wisc.edu> wrote:
>> Looks promising. Am I right that Ops sort of occupies the niche between 
>> ImgLib2 and ImageJ Plugins... something that makes it easier to do the image 
>> manipulations but can be reused a bit more easily given they don't require 
>> many of the Service parameters and preprocessors that many of the plugins 
>> take/need?
>> 
>> On Oct 1, 2014, at 4:58 PM, Curtis Rueden <ctrue...@wisc.edu> wrote:
>> 
>>> Hi everyone,
>>> 
>>> The ImageJ2 and KNIME Image Processing teams met in Madison during the week 
>>> of September 15 - 19, to work on ImageJ OPS, which seeks to be a unifying 
>>> library for scientific image processing.
>>> 
>>> On behalf of the OPS development team, I am pleased to announce the results 
>>> of that hackathon, including accomplishments, project goals and milestones. 
>>> See the news post for full details:
>>> 
>>> http://imagej.net/2014-10-01_-_ImageJ_OPS_Hackathon
>>> 
>>> Regards,
>>> Curtis Rueden
>>> ImageJ2 project lead
>>> _______________________________________________
>>> ImageJ-devel mailing list
>>> ImageJ-devel@imagej.net
>>> http://imagej.net/mailman/listinfo/imagej-devel
>> 
>> 
> 
> 

_______________________________________________
ImageJ-devel mailing list
ImageJ-devel@imagej.net
http://imagej.net/mailman/listinfo/imagej-devel

Reply via email to