+1 to this suggestion.  Voting should be seen as a last resort to
resolve differences in the community.  Perhaps a small POC of both
approaches (or maybe others as well) might help the community discuss
options in a more concrete way.  Sometimes is very difficult to "see"
the differences between approaches in an email thread compared to 2
branches of code. 

- Bob


On 9/30/2018 6:17 AM, Marco de Abreu wrote:
> Maybe we can take a step back and rather look at how we would like our
> users and mxnet developers to use the API. Imagine like a mock or pseudo
> code where we write a few examples with the "perfect" Java API. After that,
> we think about the technical implementation details and how it can be done
> (I know that we already had a lot of technical discussion, it's just a
> method to get a second perspective).
>
> Our current discussion is around the technical limitations and possible
> overhead a Java API might cause, but I think it's most important that a
> user is actually able to use it. I think we have all been at the point
> where we tried to use a package and the API was so strange that we just
> picked an alternative.
>
> We should think a bit long term here. Java is a HUGE market with a big user
> base, especially in the Enterprise segment. So, theoretically speaking,
> even if we duplicate everything and decouple it from scala entirely, we
> might have a good chance that - given a good design - other people will
> step up and help maintaining and extending the API. If the process to
> change anything in that API is super cryptic, we might block future efforts
> because the entry barrier is too high.
>
> I think our python API is the best example. We are finally at a state where
> it's super easy to extend, the usability is good (especially around gluon)
> and it fits into the languages' idioms. Let's try to take that experience
> and apply it to the Java API. This might be more work initially and create
> redundancy, but we have seen that a good API (external as well as internal)
> design increases contributions and attracts more users.
>
> I won't take any side here because I'm unfamiliar with the scala side of
> mxnet, just wanted to add an external viewpoint.
>
> -Marco
>
> YiZhi Liu <eazhi....@gmail.com> schrieb am So., 30. Sep. 2018, 05:15:
>
>> Yes agreement and disagreement stay at  technical level only:)
>>
>> Back to the problem, they are unnecessary but good in terms of,
>> 1. Still not good for java users to write 3 nulls in a function call with 5
>> or 4 args
>> 2. Every function call with a “tail” null for arg “out”. I would say, makes
>> it seems not a serious api design to our users
>> 3. Users have uniformed experience, nothing surprising.
>>
>> Given the reasons I listed before, I don’t see things bad for this.
>>
>> I agree we can vote. I suggest to have two votes, one for builder, one for
>> separating java and scala objects.
>>
>> On Sat, Sep 29, 2018 at 7:43 PM Naveen Swamy <mnnav...@gmail.com> wrote:
>>
>>> Ah! we agree on something :) lets get more opinions, I am happy to go
>> with
>>> it.
>>>
>>> On Sat, Sep 29, 2018 at 10:40 PM YiZhi Liu <eazhi....@gmail.com> wrote:
>>>
>>>> Also sometimes people may not be at the same page when talking about
>>> option
>>>> #2. What I insist is the builder classes for each operator. Otherwise I
>>>> actually more support Naveen’s approach - not to totally separate java
>>> and
>>>> scala objects.
>>>>
>>>> On Sat, Sep 29, 2018 at 7:35 PM YiZhi Liu <eazhi....@gmail.com> wrote:
>>>>
>>>>> No you haven't answered my question "Since you agree to have 30+
>>>>> operators have Builder, what prevents from
>>>>> having all of them have Builder?"
>>>>> On Sat, Sep 29, 2018 at 7:30 PM Naveen Swamy <mnnav...@gmail.com>
>>> wrote:
>>>>>> I think we have had enough of an debate between the two of us and I
>>>> have
>>>>>> already listed my reasons, I will stop here and see what others say
>>>>> given
>>>>>> my reasoning.
>>>>>>
>>>>>> -1 to #2)
>>>>>>
>>>>>> Also, by lecture I meant to say  "I don't want to list all the
>>> problems
>>>>>> with unnecessary complications and talk about how to design
>> software"
>>>>>> On Sat, Sep 29, 2018 at 10:15 PM YiZhi Liu <eazhi....@gmail.com>
>>>> wrote:
>>>>>>> And if we find incorrect declaration, we fix it, not simply
>>> assuming
>>>>>>> many of them also has problem and we cannot rely on them -
>>> otherwise
>>>>>>> the type-safe APIs in Scala also does not make sense.
>>>>>>> On Sat, Sep 29, 2018 at 7:10 PM YiZhi Liu <eazhi....@gmail.com>
>>>> wrote:
>>>>>>>> It also makes sense to me if we have it under namespace
>> NDArray,
>>>> not
>>>>>>>> creating new JavaNDArray. But again, uniform experience is
>>>> important.
>>>>>>>> What I responded is your comment "keep scala macros minimum", I
>>>> don't
>>>>>>>> think "scala macro" equals "cryptic code". Even though it does,
>>>> what
>>>>>>>> we need to do is to find an alternative way to do code
>>> generation,
>>>>> not
>>>>>>>> making code generation minimum.
>>>>>>>>
>>>>>>>> Since you agree to have 30+ operators have Builder, what
>> prevents
>>>>> from
>>>>>>>> having all of them have Builder?
>>>>>>>> - They're auto-generated, the auto-generation "cryptic" code is
>>>>> anyway
>>>>>>>> there. And "two different paths of code" (though I don't
>> totally
>>>>>>>> agree) is anyway there.
>>>>>>>> - What else? 200+ classes is a very tiny increasing in file
>> size
>>>>>>>> (~3MB) compare to current status. And won't have any
>> performance
>>>>> issue
>>>>>>>> on modern JVM.
>>>>>>>>
>>>>>>>> Just remind, technical discussion is not about who gives who a
>>>>> lecture.
>>>>>>>> On Sat, Sep 29, 2018 at 6:41 PM Naveen Swamy <
>> mnnav...@gmail.com
>>>>> wrote:
>>>>>>>>> Well, I am not sure(I don't think) we need Builder for every
>>> API
>>>> in
>>>>>>>>> NDArray. For APIs that take long list of parameters, I agree
>> to
>>>> add
>>>>>>> Builder.
>>>>>>>>> Look at the API distribution based on number of arguments
>> here:
>>> https://gist.github.com/nswamy/2dea72e514cc7bfc675f68aef9fe78bb
>>>>>>>>> about 30 APIs have 7 or more arguments.. I agree to add
>>> Builders
>>>>> for
>>>>>>> these
>>>>>>>>> APIs not separately but to the existing Scala APIs but not
>>>>> separately
>>>>>>> only
>>>>>>>>> for Java.
>>>>>>>>> APIs sorted by number of arguments is here, take a look :
>>>>>>>>>
>>> https://gist.github.com/nswamy/e941cb94658b3960eec40bf00b970ac5
>>>>>>>>> Many of the arguments i think are actually mandatory but
>>>>> incorrectly
>>>>>>>>> declared optional on the backend, for example look at
>> SwapAxis
>>>>>>>>> "def SwapAxis (data : NDArray, dim1 : Option[Int] = None,
>> dim2
>>> :
>>>>>>>>> Option[Int] = None, out : Option[NDArray] = None) :
>>>>> NDArrayFuncReturn"
>>>>>>>>> Why is dim1 and dim2 Optional, this is an error in the
>>>> declaration
>>>>> on
>>>>>>> the
>>>>>>>>> backend, I think there might be many of these?
>>>>>>>>>
>>>>>>>>> My answers to your other responses are below inline:
>>>>>>>>>
>>>>>>>>> On Sat, Sep 29, 2018 at 3:37 PM YiZhi Liu <
>> eazhi....@gmail.com
>>>>> wrote:
>>>>>>>>>> Some of my comments inline:
>>>>>>>>>>
>>>>>>>>>>> Why can we not create the builder just for these APIs(
>>> which
>>>> we
>>>>>>>>>> discussed), why is it necessary to add 200 Apis
>>>>>>>>>> It is about unified user-experience. And we get rid of
>>> annoying
>>>>> extra
>>>>>>>>>> "out=null" in every operator.
>>>>>>>>>>
>>>>>>>>>>> Are you suggesting to create builder for each and every
>>> API?
>>>>>>>>>> Only for those are necessary. For NDArray.XXX, yes.
>>>>>>>>>>
>>>>>>>>> I think this is a ridiculous list of Builders, I think we can
>>>> keep
>>>>> the
>>>>>>>>> 'out' parameter
>>>>>>>>>
>>>>>>>>>> 1) The NDArray APIs in question are not following
>> functional
>>>>> style of
>>>>>>>>>> programming, in fact they are just static methods defined
>> on
>>> an
>>>>>>>>>> NDArray object - so Scala users are not losing much by
>> using
>>>>> null in
>>>>>>>>>> place of None.
>>>>>>>>>> You can create a implicit to maintain backward
>> compatibility
>>>>>>>>>> - I doubt implicit can work in such case from None -> null.
>>>>>>>>>>
>>>>>>>>> It is just writing getOrElse in your implicit, so it will
>> work.
>>>>>>>>> scala> implicit def optionStringToString(a: Option[String]):
>>>>> String = {
>>>>>>>>>      | a.getOrElse(null)
>>>>>>>>>      | }
>>>>>>>>>
>>>>>>>>> 2) It is adding 220+ APIs(I understand it is generated) for
>>>> NDArray
>>>>>>> alone
>>>>>>>>>> - As I explained how it can improve user experiences
>>>>>>>>>>
>>>>>>>>> I don't think we need to write builders for 221 APIs we have,
>>> may
>>>>> be
>>>>>>> for 30
>>>>>>>>> or so. Uniform experience is good goal but it also has to be
>>>>> practical
>>>>>>> and
>>>>>>>>> make sense.
>>>>>>>>>
>>>>>>>>> 3) this is adding another 100s of APIs unnecessarily, we are
>>>>> starting
>>>>>>> with
>>>>>>>>>> NDArray but we can't stop there, we will have to do this
>> for
>>>>> Symbol,
>>>>>>>>>> Executor, Iterators, etc., .
>>>>>>>>>> - This is a good point, actually I prefer not to make
>>>>> JavaExecutor,
>>>>>>>>>> JavaIterators
>>>>>>>>>>
>>>>>>>>> What I was aiming is also users have the same experience
>> across
>>>>>>> Interfaces
>>>>>>>>> - now you are forgoing uniform experience, so like you said
>> its
>>>> all
>>>>>>>>> trade-off and a good trade-off doesn't cause too much
>> overhead/
>>>>>>>>>
>>>>>>>>>> 4) I don't want to be fixing bugs and maintaining code in 2
>>>>> places.
>>>>>>>>>> - Type-safe parsing is shared. I think Qing is more
>> qualified
>>>> to
>>>>>>> comment.
>>>>>>>>> It creates two different paths of code for Scala and Java -
>> how
>>>> is
>>>>> it
>>>>>>> going
>>>>>>>>> to be shared. I am afraid we are going to make it more
>>>> complicated
>>>>> than
>>>>>>>>> necessary by duplicating code.
>>>>>>>>>
>>>>>>>>> 5) I want the cryptic code(# scala macros) to a minimum.
>>>>>>>>>> - MXNet decides to do operator generation in frontend
>>> bindings.
>>>>> It's
>>>>>>>>>> the developers' responsibility to understand the techniques
>>>> they
>>>>> are
>>>>>>>>>> using. Maybe not a so proper analogy - "I don't know RL /
>> RL
>>> is
>>>>> hard
>>>>>>>>>> to tune / ..." is not a reason for "I want to keep RL
>>>>> implementation
>>>>>>>>>> in MXNet as a small part as possible"
>>>>>>>>>>
>>>>>>>>>> Now, this is a response I don't like. I don't know where
>> you
>>>> were
>>>>>>> going
>>>>>>>>> with your analogy but know that it sounds condescending - I
>> am
>>>>> going to
>>>>>>>>> ignore(assuming good intentions) that and explain what I
>> mean.
>>>>>>>>> I here is I the developer/user who deploys MXNet code in
>>>>> production and
>>>>>>>>> have to deal with the aftermath myself not you(MXNet
>>> developers).
>>>>>>>>> From your comment it occurs to me you probably have never
>> been
>>> on
>>>>>>>>> pager-duty. I have been on pager-duty both for the code I
>> wrote
>>>> and
>>>>>>> those
>>>>>>>>> that was written by others and thrown over the fence.
>>>>>>>>> If you get woken up by a beep at the middle of the night,
>> that
>>> is
>>>>> not
>>>>>>> the
>>>>>>>>> time to prove your intelligence. Its time to mitigate the
>> issue
>>>>> asap
>>>>>>> for
>>>>>>>>> that your code needs to be easy to follow, should follow well
>>>>> defined
>>>>>>>>> patterns, etc., -- i don't need to give you a lecture.
>>>>>>>>> IMHO It is extremely important for frameworks like Apache
>> MXNet
>>>>> which
>>>>>>> are
>>>>>>>>> used by others for their production to keep code simple and
>>>>> *cryptic
>>>>>>> code
>>>>>>>>> to a minimum* and yes you(we - MXNet developers) are not
>>>> answering
>>>>> the
>>>>>>>>> beepers when your(MXNet) users deploy their code in their
>>>>> production so
>>>>>>>>> make their life simple.
>>>>>>>>>
>>>>>>>>> 6) increased compilation time & bad developer experience -
>> the
>>>>> time to
>>>>>>>>>> compile has gone up quite a bit since we added the APIs
>> last
>>>>> release
>>>>>>> on my
>>>>>>>>>> 3 year old laptop already.. I think adding 400+ APIs
>>>>> unnecessarily
>>>>>>> would
>>>>>>>>>> significantly increase build time and bad developer
>>> experience
>>>>>>>>>> - I don't think increasing such a bit compilation time is a
>>>>> problem
>>>>>>>>>> compared to bad user experience.
>>>>>>>>> I am not suggesting bad user experience but to take a
>> practical
>>>>>>> approach -
>>>>>>>>> having a bad developer experience is not great either.
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> 7) I want to keep the core of the framework to be in Scala -
>>>>> because it
>>>>>>>>>> allows you to write concise code - Yes it has a bit of
>>> learning
>>>>>>> curve, not
>>>>>>>>>> everyone needs to know. I would rather invest in
>> solidifying
>>>> the
>>>>>>> Scala APIs
>>>>>>>>>> and add more features in Scala(RNN, Support
>>>>>>> GluonHybridizedBlock...there is
>>>>>>>>>> quite bit of work ) - do you want to rewrite everything in
>>>> Scala
>>>>> and
>>>>>>> Java.
>>>>>>>>>> - I agree with "don't rewrite everything in Scala and
>> Java",
>>>> IMO
>>>>>>>>>> JavaNDArray is the only one good to have. JShape, JContext,
>>>> etc.
>>>>> are
>>>>>>>>>> not so necessary.
>>>>>>>>>>
>>>>>>>>>> Either you go all Java or make accommodation in Scala code
>> to
>>>>> work
>>>>>>> for
>>>>>>>>> APIs so your users know what to expect(uniform experience
>>>> across).
>>>>>>>>>> 8) Also, the discussion is not creating NDArray class for
>>> Java,
>>>>> just
>>>>>>>>>> generate certain APIs to cater for Java incompatibility.
>>>>>>>>>> - Yes I agree it's about "generate certain APIs to cater
>> for
>>>> Java
>>>>>>>>>> incompatibility", though I think NDArray.api.XXX does not
>>> meet
>>>>> Java
>>>>>>>>>> users' demands.
>>>>>>>>>>
>>>>>>>>> On Sat, Sep 29, 2018 at 12:05 PM Naveen Swamy <
>>>> mnnav...@gmail.com>
>>>>>>> wrote:
>>>>>>>>>>> I know it is about trade-off.  I am suggesting a
>> trade-off
>>> ,
>>>>> how
>>>>>>> many
>>>>>>>>>> apis do we have that takes too many parameters ?
>>>>>>>>>>> From what I recall its around 20. Why can we not create
>> the
>>>>>>> builder just
>>>>>>>>>> for these APIs( which we discussed), why is it necessary to
>>> add
>>>>> 200
>>>>>>> Apis ?
>>>>>>>>>>> Are you suggesting to create builder for each and every
>>> API?
>>>>>>>>>>> I disagree with your opinion that they are not important
>>> and
>>>>> would
>>>>>>> like
>>>>>>>>>> to hear from others.
>>>>>>>>>>> I am curious to see how the #2 looks like compared to #1
>>>>>>>>>>> Andrew/Qing, can you paste the generated Apis that you
>> have
>>>> for
>>>>>>> both
>>>>>>>>>> Scala and Java in a gist please.
>>>>>>>>>>>> On Sep 29, 2018, at 2:41 PM, YiZhi Liu <
>>>> eazhi....@gmail.com>
>>>>>>> wrote:
>>>>>>>>>>>> Naveen, software designing is all about tradeoff, every
>>>>> feature
>>>>>>> we
>>>>>>>>>>>> introduce causes more compiling time, more efforts to
>>>>> maintain,
>>>>>>> etc.
>>>>>>>>>>>> The main difference is.
>>>>>>>>>>>>
>>>>>>>>>>>> Option #1: Java users do
>>>>>>>>>>>> NDArray.BatchNorm(data, gamma, beta, null, null, null,
>>>> null,
>>>>>>> null,
>>>>>>>>>>>> null, null, null, null, null, null);
>>>>>>>>>>>> (and because every operator has an argument "out",
>> users
>>>>> need to
>>>>>>> add
>>>>>>>>>>>> an extra "null" to the function call almost every
>> time.)
>>>>>>>>>>>> Option #2, Java users do
>>>>>>>>>>>>
>> JavaNDArray.BatchNorm(data).setGamma(gamma).setBeta(beta).invoke();
>>>>>>>>>>>> I don't think any of the reasons you listed is so
>>> important
>>>>> as
>>>>>>> the
>>>>>>>>>>>> benefit above we got from option #2.
>>>>>>>>>>>>> On Sat, Sep 29, 2018 at 8:24 AM Naveen Swamy <
>>>>>>> mnnav...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>>>> Java APIs are not like Clojure - The current proposal
>> is
>>>>> only to
>>>>>>>>>> build a
>>>>>>>>>>>>> few thin wrappers for Inference.
>>>>>>>>>>>>>
>>>>>>>>>>>>> To better represent the two cases and this discussion
>> in
>>>>>>> particular,
>>>>>>>>>> here
>>>>>>>>>>>>> is an example API
>>>>>>>>>>>>>
>>>>>>>>>>>>> 1) def Activation (data : org.apache.mxnet.NDArray,
>>>>> act_type :
>>>>>>>>>> String, out
>>>>>>>>>>>>> : Option[NDArray] = None) :
>>>>> org.apache.mxnet.NDArrayFuncReturn
>>>>>>>>>>>>> or
>>>>>>>>>>>>> 2) def Activation (data : org.apache.mxnet.NDArray,
>>>>> act_type :
>>>>>>>>>> String, out
>>>>>>>>>>>>> : NDArray) : org.apache.mxnet.NDArrayFuncReturn
>>>>>>>>>>>>>
>>>>>>>>>>>>> The discussion is should we add(generate) 200+ APIs to
>>>> make
>>>>> it
>>>>>>> Java
>>>>>>>>>>>>> compatible, ie., remove the Option class and the None
>>>>> default
>>>>>>> value
>>>>>>>>>> which
>>>>>>>>>>>>> Java does not understand from Option 1)
>>>>>>>>>>>>>
>>>>>>>>>>>>> my suggestion was to remove the Option class and
>> create
>>> a
>>>>>>> implicit for
>>>>>>>>>>>>> backward compatibility and use null instead of None,
>>>> Andrew
>>>>> and
>>>>>>> I
>>>>>>>>>> disagreed
>>>>>>>>>>>>> on this, so I suggested to raise a discussion on dev@
>>> to
>>>>> get
>>>>>>> more
>>>>>>>>>> opinions
>>>>>>>>>>>>> and one of us will disagree and commit. Thanks for
>>> raising
>>>>> it :)
>>>>>>>>>>>>> | * def Activation (data : org.apache.mxnet.NDArray,
>>>>> act_type :
>>>>>>>>>> String, out
>>>>>>>>>>>>> : NDArray = null) :
>> org.apache.mxnet.NDArrayFuncReturn |
>>>>>>>>>>>>> --
>>>>>>>>>>>>>
>>>>>>>>>>>>> 1) It is not true that Scala users will lose
>>>>> *default/optional*
>>>>>>>>>> arguments -
>>>>>>>>>>>>> if we followed the above, they will use null or None,
>>>>> though I
>>>>>>> do not
>>>>>>>>>> like
>>>>>>>>>>>>> using nulls, this is a fine compromise.
>>>>>>>>>>>>> To keep backward compatibility we can create a
>> implicit
>>> to
>>>>>>> convert
>>>>>>>>>>>>> Option.None to nulls and Option.Some-> Option.get(),
>> so
>>>> you
>>>>> are
>>>>>>> not
>>>>>>>>>> going
>>>>>>>>>>>>> to break users who might have been using the APIs that
>>>> were
>>>>>>> released
>>>>>>>>>> in
>>>>>>>>>>>>> 1.3. The current incompatibility is only this w.r.t.
>>>>> NDArrays.
>>>>>>>>>>>>> 2) Now about the Scala Macros - they are not simple to
>>>> read
>>>>> or
>>>>>>> use,
>>>>>>>>>> When I
>>>>>>>>>>>>> and Qing started working on the #Scala Macros to
>> improve
>>>> the
>>>>>>> APIs, it
>>>>>>>>>> took
>>>>>>>>>>>>> us a good amount of time to get a hang of it. I don't
>>> want
>>>>> to
>>>>>>> add
>>>>>>>>>>>>> additional code when not necessary.
>>>>>>>>>>>>>
>>>>>>>>>>>>> My suggestion and vote is to modify existing
>> Macro(i.e.,
>>>> #1
>>>>>>> from the
>>>>>>>>>>>>> original email with the necessary clarification above)
>>> and
>>>>> make
>>>>>>> it
>>>>>>>>>>>>> compatible with Java
>>>>>>>>>>>>> Here are my reasons
>>>>>>>>>>>>> 1) The NDArray APIs in question are not following
>>>> functional
>>>>>>> style of
>>>>>>>>>>>>> programming, in fact they are just static methods
>>> defined
>>>>> on an
>>>>>>>>>> NDArray
>>>>>>>>>>>>> object - so Scala users are not losing much by using
>>> null
>>>> in
>>>>>>> place of
>>>>>>>>>> None.
>>>>>>>>>>>>> You can create a implicit to maintain backward
>>>> compatibility
>>>>>>>>>>>>> 2) It is adding 220+ APIs(I understand it is
>> generated)
>>>> for
>>>>>>> NDArray
>>>>>>>>>> alone
>>>>>>>>>>>>> 3) this is adding another 100s of APIs unnecessarily,
>> we
>>>> are
>>>>>>> starting
>>>>>>>>>> with
>>>>>>>>>>>>> NDArray but we can't stop there, we will have to do
>> this
>>>> for
>>>>>>> Symbol,
>>>>>>>>>>>>> Executor, Iterators, etc., .
>>>>>>>>>>>>> 3) I don't want to be fixing bugs and maintaining code
>>> in
>>>> 2
>>>>>>> places.
>>>>>>>>>>>>> 4) I want the cryptic code(# scala macros) to a
>> minimum.
>>>>>>>>>>>>> 5) increased compilation time & bad developer
>>> experience -
>>>>> the
>>>>>>> time to
>>>>>>>>>>>>> compile has gone up quite a bit since we added the
>> APIs
>>>> last
>>>>>>> release
>>>>>>>>>> on my
>>>>>>>>>>>>> 3 year old laptop already.. I think adding 400+ APIs
>>>>>>> unnecessarily
>>>>>>>>>> would
>>>>>>>>>>>>> significantly increase build time and bad developer
>>>>> experience
>>>>>>>>>>>>> 6) I want to keep the core of the framework to be in
>>>> Scala -
>>>>>>> because
>>>>>>>>>> it
>>>>>>>>>>>>> allows you to write concise code - Yes it has a bit of
>>>>> learning
>>>>>>>>>> curve, not
>>>>>>>>>>>>> everyone needs to know. I would rather invest in
>>>>> solidifying the
>>>>>>>>>> Scala APIs
>>>>>>>>>>>>> and add more features in Scala(RNN, Support
>>>>>>>>>> GluonHybridizedBlock...there is
>>>>>>>>>>>>> quite bit of work ) - do you want to rewrite
>> everything
>>> in
>>>>>>> Scala and
>>>>>>>>>> Java.
>>>>>>>>>>>>> 7) Also, the discussion is not creating NDArray class
>>> for
>>>>> Java,
>>>>>>> just
>>>>>>>>>>>>> generate certain APIs to cater for Java
>> incompatibility.
>>>>>>>>>>>>> @Andrew: To your response to Qing's comments - you
>>> cannot
>>>>> just
>>>>>>>>>> consider it
>>>>>>>>>>>>> as just generating NDArray's APIs and instead I
>> suggest
>>> to
>>>>> take
>>>>>>> a
>>>>>>>>>> wholistic
>>>>>>>>>>>>> view of all the various implications.
>>>>>>>>>>>>>
>>>>>>>>>>>>> @Chris: Yes, Scala has a bit of learning curve - the
>>> goal
>>>>> is not
>>>>>>>>>> having
>>>>>>>>>>>>> every developer to deal with how these APIs are
>>> generated,
>>>>>>>>>>>>> the problem exists either ways with the above
>> proposal.
>>> I
>>>>> might
>>>>>>> agree
>>>>>>>>>> if we
>>>>>>>>>>>>> were to move away completely(with a thorough
>> discussion
>>>> and
>>>>>>> valid
>>>>>>>>>> reasons)
>>>>>>>>>>>>> and instead use AspectJ or similar to write these
>> APIs,
>>>> the
>>>>>>>>>> discussion is
>>>>>>>>>>>>> about using Scala Macros to generate 2 different types
>>> of
>>>>> APIs
>>>>>>> which
>>>>>>>>>> are
>>>>>>>>>>>>> functionally not different and usability wise are very
>>>> very
>>>>>>> similar,
>>>>>>>>>> look
>>>>>>>>>>>>> at the example.
>>>>>>>>>>>>> Thanks for your input, I will deposit your 0.02$ in
>> our
>>>> JIRA
>>>>>>> bank :)
>>>>>>>>>>>>> @Carin: It requires more effort to use AspectJ or
>>> similar
>>>> to
>>>>>>> generate
>>>>>>>>>> APIs
>>>>>>>>>>>>> using reflection or at compile time, here we need to
>>>>> generate at
>>>>>>>>>> compile
>>>>>>>>>>>>> time so Java users have the API signature on their
>> IDEs.
>>>>>>>>>>>>> Thanks, Naveen
>>>>>>>>>>>>>
>>>>>>>>>>>>> P.S: I am traveling and my responses will be delayed.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Fri, Sep 28, 2018 at 10:25 AM Carin Meier <
>>>>>>> carinme...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>>>>> Sorry bad paste on the gist - here is the good one
>>>>>>>>>>>>>>
>> https://gist.github.com/gigasquid/01cd48f563db4739910592dd9ac9db20
>>>>>>>>>>>>>>> On Fri, Sep 28, 2018 at 10:24 AM Carin Meier <
>>>>>>> carinme...@gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>>>>>> +1 on option #2
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> In the case of minimizing the the overhead for code
>>>>>>> maintenance, I
>>>>>>>>>> wanted
>>>>>>>>>>>>>>> to suggest the option of investigating generating
>> code
>>>>> from
>>>>>>> the Java
>>>>>>>>>>>>>>> Reflection for the Java APIs.  I did a quick gist
>> from
>>>>>>> Clojure of
>>>>>>>>>> what
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> generated classes look like from the current Scala
>>>>> Symbol.api
>>>>>>> for
>>>>>>>>>>>>>>> FullyConnected here
>>>>>>>>>>>>>>>
>>>> https://gist.github.com/gigasquid/01cd48f563db4739910592
>>>>>>>>>>>>>>> I looks like that there is always a base Java class
>>>>> generated
>>>>>>> will
>>>>>>>>>> all
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>> arguments. If this is the case, then there is a
>>>>> possibility to
>>>>>>>>>> generate a
>>>>>>>>>>>>>>> Java api based on this Java method automatically
>> with
>>>>> just a
>>>>>>>>>> conversion
>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>> the Scala option and it might be reusable for all
>> the
>>>>>>> packages.
>>>>>>>>>>>>>>> Not sure if it will work for this use case, but
>>> thought
>>>> I
>>>>>>> would
>>>>>>>>>> bring it
>>>>>>>>>>>>>>> up in case it's helpful.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> - Carin
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Fri, Sep 28, 2018 at 7:05 AM Davydenko, Denis
>>>>>>>>>> <d...@amazon.com.invalid
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> +1 on option #2. Having clear Java interface for
>>>> NDArray,
>>>>>>> from my
>>>>>>>>>>>>>>>> perspective, would be a better experience for Java
>>>> users
>>>>> as
>>>>>>> it
>>>>>>>>>> won't
>>>>>>>>>>>>>>>> require them to deal with Scala code in any
>> capacity.
>>>>>>> Overhead of
>>>>>>>>>> extra
>>>>>>>>>>>>>>>> code for additional macros is justified, in my
>> mind,
>>> as
>>>>> it
>>>>>>> will be
>>>>>>>>>>>>>>>> introduced with option #1 either way, just in a
>>>> different
>>>>>>> place.
>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>> Denis
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 9/27/18, 6:14 PM, "YiZhi Liu" <
>>> eazhi....@gmail.com
>>>>>>> wrote:
>>>>>>>>>>>>>>>>  I vote for "2.) Leave the existing macro in place
>>> and
>>>>> add
>>>>>>> another
>>>>>>>>>>>>>>>>  which generates a Java friendly version"
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>  @Qing @Andrew, could you give some examples, so
>> that
>>>>> people
>>>>>>> can
>>>>>>>>>>>>>> better
>>>>>>>>>>>>>>>>  understand how it provides "best possible
>>> experience"
>>>> to
>>>>>>> Java
>>>>>>>>>> users.
>>>>>>>>>>>>>>>>  I have no strong preference between having
>>> JavaShape &
>>>>>>> JavaContext
>>>>>>>>>>>>>> or
>>>>>>>>>>>>>>>> not.
>>>>>>>>>>>>>>>>  On Thu, Sep 27, 2018 at 5:56 PM Andrew Ayres <
>>>>>>>>>>>>>>>> andrew.f.ay...@gmail.com> wrote:
>>>>>>>>>>>>>>>>> That's not really the conversation I'm wanting to
>>>> have.
>>>>> I
>>>>>>> want a
>>>>>>>>>>>>>>>> discussion
>>>>>>>>>>>>>>>>> about the macros with respect to NDArray so that
>> we
>>>> can
>>>>> get
>>>>>>>>>>>>>>>> agreement on
>>>>>>>>>>>>>>>>> our path forward with respect to implementing the
>>>>> NDArray
>>>>>>> wrapper.
>>>>>>>>>>>>>>>>> The design that was put forth and agreed to was
>> for
>>> a
>>>> a
>>>>> Java
>>>>>>>>>>>>>>>> wrapper around
>>>>>>>>>>>>>>>>> the Scala API. Adding a bunch of Java friendly
>>> methods
>>>>>>> inside the
>>>>>>>>>>>>>>>> Scala
>>>>>>>>>>>>>>>>> code would create a mess for users. Maintenance
>>> would
>>>> be
>>>>>>>>>>>>>>>> essentially the
>>>>>>>>>>>>>>>>> same for both because either way you're going to
>> be
>>>>>>> updating Java
>>>>>>>>>>>>>>>> methods
>>>>>>>>>>>>>>>>> when you make Scala changes.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Let's please stick with the issue in the original
>>>> email.
>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>> Andrew
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On Thu, Sep 27, 2018 at 5:22 PM Qing Lan <
>>>>>>> lanking...@live.com>
>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I would like to loop this back a layer. Current,
>>>> there
>>>>> is a
>>>>>>>>>>>>>>>> discussion in
>>>>>>>>>>>>>>>>>> the MXNet Scala community on the ways to
>> implement
>>>> the
>>>>> Java
>>>>>>>>>>>>>> APIs.
>>>>>>>>>>>>>>>> Currently
>>>>>>>>>>>>>>>>>> there are two thoughts:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> 1. Make Scala Java Friendly (Create Java
>> compatible
>>>>>>> methods in
>>>>>>>>>>>>>>>> the Scala
>>>>>>>>>>>>>>>>>> Class. such as NDArray with Java compatible
>>>>> constructor)
>>>>>>>>>>>>>>>>>> 2. Make Java friendly wrappers in Scala (Andrew's
>>>>>>> explanation
>>>>>>>>>>>>>>>> below)
>>>>>>>>>>>>>>>>>> The first approach require minimum input from our
>>>> side
>>>>> to
>>>>>>>>>>>>>>>> implement
>>>>>>>>>>>>>>>>>> however bring user a bunch of useless api they
>> may
>>>> not
>>>>>>> want to
>>>>>>>>>>>>>>>> use. It also
>>>>>>>>>>>>>>>>>> makes Scala package heavier. The good thing is
>>> these
>>>>> two
>>>>>>>>>>>>>> packages
>>>>>>>>>>>>>>>> require
>>>>>>>>>>>>>>>>>> minimum maintenance cost. As a tradeoff, if any
>>> time
>>>>> in the
>>>>>>>>>>>>>>>> future we want
>>>>>>>>>>>>>>>>>> to make Java big (make Java as the primary
>> language
>>>>>>> supported by
>>>>>>>>>>>>>>>> MXNet),
>>>>>>>>>>>>>>>>>> then the migration from Scala to Java will be
>>>> harmful.
>>>>>>> Spark
>>>>>>>>>>>>>>>> consider this
>>>>>>>>>>>>>>>>>> carefully and decide not to change much on their
>>>> Scala
>>>>>>> code base
>>>>>>>>>>>>>>>> to make it
>>>>>>>>>>>>>>>>>> more Java.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> The second approach will make unique NDArray,
>>> Shape,
>>>>>>> Context and
>>>>>>>>>>>>>>>> more. The
>>>>>>>>>>>>>>>>>> good thing about this is we can always holds a
>>>> version
>>>>>>> control
>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>> Java.
>>>>>>>>>>>>>>>>>> Some breaking changes on Scala may not influence
>>> much
>>>>> on
>>>>>>> Java.
>>>>>>>>>>>>>> It
>>>>>>>>>>>>>>>> did the
>>>>>>>>>>>>>>>>>> best way to decouple the module and good for us
>> to
>>>>> build
>>>>>>> unique
>>>>>>>>>>>>>>>> pipeline
>>>>>>>>>>>>>>>>>> for Java. The bad thing with this design is the
>>>>>>> maintenance cost
>>>>>>>>>>>>>>>> as we need
>>>>>>>>>>>>>>>>>> to keep two code bases, but it also make Java
>> side
>>>>> easy to
>>>>>>>>>>>>>> change
>>>>>>>>>>>>>>>> to make
>>>>>>>>>>>>>>>>>> it better compatible with users.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>> Qing
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> On 9/27/18, 3:25 PM, "Andrew Ayres" <
>>>>>>> andrew.f.ay...@gmail.com>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>  Hi,
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>  Currently, we're working to implement a new Java
>>> API
>>>>> and
>>>>>>>>>>>>>>>> would like
>>>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>  feedback from the community on an implementation
>>>>> detail.
>>>>>>> In
>>>>>>>>>>>>>>>> short, the
>>>>>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>  Java API will use the existing Scala API (in a
>>>> manner
>>>>>>>>>>>>>> similar
>>>>>>>>>>>>>>>> to how
>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>  current Clojure API works). This basically means
>>>> that
>>>>>>> we're
>>>>>>>>>>>>>>>> making Java
>>>>>>>>>>>>>>>>>>  friendly wrappers to call the existing Scala
>> API.
>>>>>>>>>>>>>>>>>>  The feedback we're looking for is on the
>>>>> implementation of
>>>>>>>>>>>>>>>> NDArray.
>>>>>>>>>>>>>>>>>> Scala's
>>>>>>>>>>>>>>>>>>  NDArray has a significant amount of code which
>> is
>>>>>>> generated
>>>>>>>>>>>>>>>> via macros
>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>  we've got two viable paths to move forward:
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>  1.) Change the macro to generate Java friendly
>>>>> methods  -
>>>>>>> To
>>>>>>>>>>>>>>>> do this
>>>>>>>>>>>>>>>>>> we'll
>>>>>>>>>>>>>>>>>>  modify the macro so that the generated methods
>>> won't
>>>>> have
>>>>>>>>>>>>>>>>>> default/optional
>>>>>>>>>>>>>>>>>>  arguments. There may also have to be some
>> changes
>>> to
>>>>>>>>>>>>>>>> parameter types to
>>>>>>>>>>>>>>>>>>  make them Java friendly. The big advantage here
>> is
>>>>> that
>>>>>>>>>>>>>>>> ongoing
>>>>>>>>>>>>>>>>>> maintenance
>>>>>>>>>>>>>>>>>>  will easier. The disadvantages are that we'll be
>>>>> changing
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> existing
>>>>>>>>>>>>>>>>>>  Scala NDArray Infer API (it's marked
>> experimental)
>>>> and
>>>>>>> Scala
>>>>>>>>>>>>>>>> users will
>>>>>>>>>>>>>>>>>>  lose the ability to use the default and optional
>>>>>>> arguments.
>>>>>>>>>>>>>>>>>>  2.) Leave the existing macro in place and add
>>>> another
>>>>>>> which
>>>>>>>>>>>>>>>> generates a
>>>>>>>>>>>>>>>>>>  Java friendly version - The biggest issue here
>> is
>>>> that
>>>>>>> we'll
>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>> doubling
>>>>>>>>>>>>>>>>>>  the number of macros that we've got to maintain.
>>>> It'll
>>>>>>>>>>>>>> become
>>>>>>>>>>>>>>>> even more
>>>>>>>>>>>>>>>>>>  overhead once we start expanding the Java API
>> with
>>>>> more
>>>>>>>>>>>>>>>> classes that
>>>>>>>>>>>>>>>>>> use
>>>>>>>>>>>>>>>>>>  generated code like this. The advantages are
>> that
>>>> the
>>>>>>>>>>>>>>>> existing Scala
>>>>>>>>>>>>>>>>>>  NDArray Infer API would remain unchanged for
>> Scala
>>>>> users
>>>>>>> and
>>>>>>>>>>>>>>>> that the
>>>>>>>>>>>>>>>>>> new
>>>>>>>>>>>>>>>>>>  macro could be optimized to give the best
>> possible
>>>>>>>>>>>>>> experience
>>>>>>>>>>>>>>>> to the
>>>>>>>>>>>>>>>>>> Java
>>>>>>>>>>>>>>>>>>  API.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>  Thanks,
>>>>>>>>>>>>>>>>>>  Andrew
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>  --
>>>>>>>>>>>>>>>>  Yizhi Liu
>>>>>>>>>>>>>>>>  DMLC member
>>>>>>>>>>>>>>>>  Amazon Web Services
>>>>>>>>>>>>>>>>  Vancouver, Canada
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Yizhi Liu
>>>>>>>>>>>> DMLC member
>>>>>>>>>>>> Amazon Web Services
>>>>>>>>>>>> Vancouver, Canada
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Yizhi Liu
>>>>>>>>>> DMLC member
>>>>>>>>>> Amazon Web Services
>>>>>>>>>> Vancouver, Canada
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Yizhi Liu
>>>>>>>> DMLC member
>>>>>>>> Amazon Web Services
>>>>>>>> Vancouver, Canada
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Yizhi Liu
>>>>>>> DMLC member
>>>>>>> Amazon Web Services
>>>>>>> Vancouver, Canada
>>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Yizhi Liu
>>>>> DMLC member
>>>>> Amazon Web Services
>>>>> Vancouver, Canada
>>>>>
>>>> --
>>>> Yizhi Liu
>>>> DMLC member
>>>> Amazon Web Services
>>>> Vancouver, Canada
>>>>
>> --
>> Yizhi Liu
>> DMLC member
>> Amazon Web Services
>> Vancouver, Canada
>>

Reply via email to