{"action":"created","issue":{"url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/142","repository_url":"https://api.github.com/repos/apache/incubator-apex-malhar","labels_url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/142/labels{/name}","comments_url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/142/comments","events_url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/142/events","html_url":"https://github.com/apache/incubator-apex-malhar/pull/142","id":122632578,"number":142,"title":"MLHR-1914: Add base operators to ease operator API","user":{"login":"brennonyork","id":2230193,"avatar_url":"https://avatars.githubusercontent.com/u/2230193?v=3","gravatar_id":"","url":"https://api.github.com/users/brennonyork","html_url":"https://github.com/brennonyork","followers_url":"https://api.github.com/users/brennonyork/followers","following_url":"https://api.github.com/users/brennonyork/following{/other_user}","gists_url":"https://api.github.com/users/brennonyork/gists{/gist_id}","starred_url":"https://api.github.com/users/brennonyork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brennonyork/subscriptions","organizations_url":"https://api.github.com/users/brennonyork/orgs","repos_url":"https://api.github.com/users/brennonyork/repos","events_url":"https://api.github.com/users/brennonyork/events{/privacy}","received_events_url":"https://api.github.com/users/brennonyork/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":8,"created_at":"2015-12-17T00:05:52Z","updated_at":"2016-02-19T20:23:17Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/apache/incubator-apex-malhar/pulls/142","html_url":"https://github.com/apache/incubator-apex-malhar/pull/142","diff_url":"https://github.com/apache/incubator-apex-malhar/pull/142.diff","patch_url":"https://github.com/apache/incubator-apex-malhar/pull/142.patch"},"body":"Resolves base operators by adding a set of operator primitives with which developers can build from. This adds:\r\n\r\n* `simple`\r\n  * `SingleInputOutput`\r\n  * `SingleInputMultiOutput`\r\n  * `MultiInputSingleOutput`\r\n* `complex`\r\n  * `SingleInputListOutput`\r\n  * `DirectMultiInputOutput`\r\n  * `AllWayMultiInputOutput`\r\n  * `AllWayMultiInputListOutput`"},"comment":{"url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/comments/186390437","html_url":"https://github.com/apache/incubator-apex-malhar/pull/142#issuecomment-186390437","issue_url":"https://api.github.com/repos/apache/incubator-apex-malhar/issues/142","id":186390437,"user":{"login":"brennonyork","id":2230193,"avatar_url":"https://avatars.githubusercontent.com/u/2230193?v=3","gravatar_id":"","url":"https://api.github.com/users/brennonyork","html_url":"https://github.com/brennonyork","followers_url":"https://api.github.com/users/brennonyork/followers","following_url":"https://api.github.com/users/brennonyork/following{/other_user}","gists_url":"https://api.github.com/users/brennonyork/gists{/gist_id}","starred_url":"https://api.github.com/users/brennonyork/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brennonyork/subscriptions","organizations_url":"https://api.github.com/users/brennonyork/orgs","repos_url":"https://api.github.com/users/brennonyork/repos","events_url":"https://api.github.com/users/brennonyork/events{/privacy}","received_events_url":"https://api.github.com/users/brennonyork/received_events","type":"User","site_admin":false},"created_at":"2016-02-19T20:23:17Z","updated_at":"2016-02-19T20:23:17Z","body":"All, maybe I wasn't too clear on what I was working towards with this and, let me reiterate here, so you all can correct me if I went off the deep end or not.\r\n\r\nThis premise of this is to define a series of operators with a unified `input` and `output` interface (i.e. a list of inputs and outputs) such that, from there, app developers don't need to worry about the names of inputs as they're done for them. All they need are the understanding of the function that they want the operator to perform. The premise for this is to move Apex into a more functional programming model which will, at the end, allow for a cleaner developer API such as what Spark has (e.g. `DataFrame.map().filter().joinByKey().reduce()`).\r\n\r\nFirst, by eliminating the `input` and `output` labeling one can then being to provide a higher level API to building a DAG. Second, it allows the more functional operators to exist to build the aforementioned DAG builder API.\r\n\r\nCompletely recognize that there are some glaring issues (like lists of input / output ports being recognized by the Apex engine (which we can fix there too)) so more than happy to work all those out. I'd really like feedback on the overall premise of where I'm going with this PR though wholly recognizing that I might've gone overboard, but I also saw some of the more advanced operators as necessary for various neural net computations as they much more readily model a single neural unit of computation (i.e. `AllWayMultiInputOutputOperator`).\r\n\r\nSome of the more syntactic errors I can easily work on now (i.e. `protected => public`), but wanted to get this out there. Also, recognize we're on the `master` branch now, but figured we can complete the discussion here and, whether we close the PR or not, I can always work the fixes then target `master` for the final acceptance. Thoughts? Would love to get opinions and more than happy to dive deeper into why these operators are useful agnostic of the above usability / API moves (i.e. what we've built for our use case inside C1). "}}