Ah, I see.

But in that case, we should probably distinguish between a concept,
its machine implementation and a specific instance. Perhaps:

Arrays can be infinite in dimension.

A machine implementation of arrays will be finite in some sense or another.

A specific instance of an array will have a fixed sequence of dimensions.

Something analogous happens with ordinal fractions, except I do not
know of any implementations (though some small things should be easy
enough).

But I have not digested enough of that essay to really say much more.
(Among other things, I am not yet sure of when some of the "don't do
that" proscriptions are about the examples and when they are about the
abstractions the examples are supposed to be illustrating.)

Thanks,

-- 
Raul

On Thu, Apr 13, 2017 at 5:09 PM, R.E. Boss <[email protected]> wrote:
> https://www.academia.edu/10031088/ORDINAL_FRACTIONS_-_the_algebra_of_data
> or google "ordinal fractions"
>
>
> R.E. Boss
>
>
>> -----Original Message-----
>> From: Chat [mailto:[email protected]] On Behalf Of Raul
>> Miller
>> Sent: donderdag 13 april 2017 22:34
>> To: Chat forum <[email protected]>
>> Subject: Re: [Jchat] [Jprogramming] matching & cancelling transactions
>>
>> [Forum changed to chat, since I am not writing J here and see no likelihood
>> that I will in this thread.]
>>
>> As described, ordinal fractions contain no information:
>>
>> Ordinal fractions do not have elements, and they all have the same shape.
>>
>> Presumably there is some gimmick to stuff information into them, and
>> presumably that "may contain a data element" is part of it. (But if ordinal
>> fractions do not have elements, I am not at all clear on what distinction is
>> being made here, nor why.)
>>
>> --
>> Raul
>>
>>
>> On Thu, Apr 13, 2017 at 4:23 PM, 'Bo Jacoby' via Programming
>> <[email protected]> wrote:
>> > Hi Louis.
>> > Thanks for asking. I regret not knowing the answer.
>> > An ordinal fraction is like an array in J, with minor differences.
>> >    - Arrays have names. Ordinal fractions have numbers.
>> >    - An array has a finite number of dimensions. An ordinal fraction has an
>> infinite number of dimensions.
>> >    - Arrays may have different shapes. All ordinal fractions have the same
>> shape: 9 9 9 9 . . .
>> >    - Arrays have zero-origin indexing (0 1 . . .  n). Ordinal fractions 
>> > have one-
>> origin indexing (1 2 3 4 5 6 7 8 9).
>> >
>> >    - Arrays have elements. Ordinal fractions do not have elements.
>> >    - Arrays may have subarrays. All ordinal fractions have subordinate 
>> > ordinal
>> fractions.
>> >    - Array elements contain data. Any ordinal fraction may contain a data
>> element.
>> > Ordinal fractions were invented (by me) in 1980, but have had limited
>> dissemination so far. I made programs in fortran and pascal and basic for
>> manipulating ordinal fraction files, but I have not managed to do it in J. 
>> The
>> programs were general, because the logic is in the data file and not in the
>> program. I have been alone doing this.
>> > Thanks! Bo.
>> >
>> >
>> >
>> >
>> >     Den 20:08 torsdag den 13. april 2017 skrev Louis de Forcrand
>> <[email protected]>:
>> >
>> >
>> >  Hi Bo,
>> > This is cool.
>> >
>> > As for the way you suggest using it here, isn't it equivalent to (without 
>> > the
>> first six rows of your data):
>> >
>> > (~.@[ ,. +//.)/@|:
>> > ?
>> >
>> > Louis
>> >
>> >> On 12 Apr 2017, at 21:57, 'Bo Jacoby' via Programming
>> <[email protected]> wrote:
>> >>
>> >> Hi Joe!
>> >> My favorite datastructure is ORDINAL FRACTIONS - the algebra of data
>> >>
>> >> |
>> >> |
>> >> |
>> >> |  |    |
>> >>
>> >>  |
>> >>
>> >>  |
>> >> |
>> >> |    |
>> >> ORDINAL FRACTIONS - the algebra of data
>> >> This paper was submitted to the 10th World Computer Congress, IFIP 1986
>> conference, but rejected by the referee....  |  |
>> >>
>> >>  |
>> >>
>> >>  |
>> >>
>> >>
>> >> Your data are coded like this
>> >> 10 Joe
>> >> 20 Bob
>> >> 30 Jane
>> >> 01 blue
>> >> 02 red
>> >> 03 purple
>> >> 11 1
>> >> 11 -1
>> >> 11 1
>> >> 22 1
>> >> 22 1
>> >> 22 3
>> >> 22 -1
>> >> 22 -1
>> >> 33 5
>> >> 33 -2
>> >> 33 2
>> >> (Written with double CRs because the mail program has a history of
>> deleting my CRs).
>> >> Summation gives the result
>> >> 10 Joe
>> >> 20 Bob
>> >> 30 Jane
>> >> 01 blue
>> >> 02 red
>> >> 03 purple
>> >> 11 1
>> >> 22 3
>> >>
>> >> 33 5
>> >> I have not done the summation in J, but I'd like to do it.
>> >> Perhaps this helps you.
>> >> Bo.
>> >>
>> >>
>> >>
>> >>    Den 0:04 torsdag den 13. april 2017 skrev chris burke
>> <[email protected]>:
>> >>
>> >>
>> >> Incidentally, for production code, I suggest starting by removing any 
>> >> sales
>> >> not matched in returns and vice versa, so that the matching algorithm is
>> >> applied only to potential matches.
>> >>
>> >>> On Wed, Apr 12, 2017 at 2:53 PM, chris burke <[email protected]>
>> wrote:
>> >>>
>> >>> Great.
>> >>>
>> >>> In case you need more complicated handling of the "gray area"
>> >>> transactions, I believe they would be relatively few in number, so most
>> of
>> >>> the time you could do the matching efficiently, then check for any keys
>> >>> with returns preceding sales. For those, setting aside the first such
>> >>> return and repeating should clear them quickly.
>> >>>
>> >>> Timing should be well under 1 second for a million records.
>> >>>
>> >>>> On Wed, Apr 12, 2017 at 1:57 PM, Joe Bogner <[email protected]>
>> wrote:
>> >>>>
>> >>>> Just for completeness, I added a line that incorporates the sequence
>> check
>> >>>> into the cancel logic. Works great
>> >>>>
>> >>>> NB. hui progressive index
>> >>>> NB. http://code.jsoftware.com/wiki/Essays/Progressive_Index-Of
>> >>>> oc=: i.~ (] - {) /:@/:
>> >>>> pi=: #@[ ({. i.&(,.oc) }.) [ i. ,
>> >>>>
>> >>>> NB. argument is 3-col table of seq,key,qty
>> >>>> NB. result is the unmatched transactions
>> >>>> matchtrans=: 3 : 0
>> >>>> msk=. 0<{:"1 y
>> >>>> sales=. msk#y
>> >>>> returns=. (-.msk)#y
>> >>>> ndx=. (}."1 sales) pi | }."1 returns
>> >>>> cancels=. ndx<#sales
>> >>>> NB. ensure cancel is after sale
>> >>>> cancels =. cancels *. (({."1 (<<(cancels)#ndx){sales) < ({."1
>> >>>> (cancels#returns)))
>> >>>> ((<<<cancels#ndx){sales),(-.cancels)#returns
>> >>>> )
>> >>>>
>> >>>>
>> >>>>> On Wed, Apr 12, 2017 at 4:14 PM, Joe Bogner
>> <[email protected]> wrote:
>> >>>>>
>> >>>>> Chris, this looks promising. Thanks for sharing. It's nearly instant on
>> >>>> a
>> >>>>> million rows.
>> >>>>>
>> >>>>> Which row had a return before a transaction? seq 10 was an example
>> of a
>> >>>>> partial return. The hypothetical customer returned 2 out of the 5
>> >>>> purchased
>> >>>>> prior. I added that example since technically per the original spec it
>> >>>>> wouldn't be cancelled out in this pass.  It's a gray area so I may be
>> >>>> able
>> >>>>> to use this approach, especially since I don't see how to incorporate
>> >>>> the
>> >>>>> time element into the progressive index.
>> >>>>>
>> >>>>> Thanks again
>> >>>>>
>> >>>>>
>> >>>>> On Wed, Apr 12, 2017 at 3:52 PM, chris burke
>> <[email protected]>
>> >>>> wrote:
>> >>>>>
>> >>>>>> This might be done by comparing matrices of sales and returns. The
>> >>>>>> function
>> >>>>>> below seems to be close to what you want. It doesn't exactly match
>> your
>> >>>>>> example, but your example has cases where returns are made
>> before the
>> >>>>>> transactions. Was this intentional?
>> >>>>>>
>> >>>>>> The code should run faster than a looping solution.
>> >>>>>>
>> >>>>>> Code:
>> >>>>>>
>> >>>>>> NB. hui progressive index
>> >>>>>> NB. http://code.jsoftware.com/wiki/Essays/Progressive_Index-Of
>> >>>>>> oc=: i.~ (] - {) /:@/:
>> >>>>>> pi=: #@[ ({. i.&(,.oc) }.) [ i. ,
>> >>>>>>
>> >>>>>> NB. argument is 3-col table of seq,key,qty
>> >>>>>> NB. result is the unmatched transactions
>> >>>>>> matchtrans=: 3 : 0
>> >>>>>> msk=. 0<{:"1 y
>> >>>>>> sales=. msk#y
>> >>>>>> returns=. (-.msk)#y
>> >>>>>> ndx=. (}."1 sales) pi | }."1 returns
>> >>>>>> cancels=. ndx<#sales
>> >>>>>> ((<<<cancels#ndx){sales),(-.cancels)#returns
>> >>>>>> )
>> >>>>>>
>> >>>>>> Example:
>> >>>>>>
>> >>>>>>    dat=: ".;._2 (0 : 0)
>> >>>>>> 1 1 1
>> >>>>>> 2 1 _1
>> >>>>>> 3 1 1
>> >>>>>> 4 2 1
>> >>>>>> 5 2 1
>> >>>>>> 6 2 3
>> >>>>>> 7 2 _1
>> >>>>>> 8 2 _1
>> >>>>>> 9 3 5
>> >>>>>> 10 3 _2
>> >>>>>> 11 3 2
>> >>>>>> )
>> >>>>>>
>> >>>>>>    matchtrans dat
>> >>>>>> 3 1 1
>> >>>>>> 6 2 3
>> >>>>>> 9 3 5
>> >>>>>>
>> >>>>>>
>> >>>>>> On Wed, Apr 12, 2017 at 9:35 AM, Joe Bogner
>> <[email protected]>
>> >>>> wrote:
>> >>>>>>
>> >>>>>>> I have a problem I'm trying to solve in different languages. I have a
>> >>>>>>> solution in SQL and also in kdb which largely resembles the SQL
>> >>>>>> solution.
>> >>>>>>> I'm curious what a J solution would look like. More specifically, I'm
>> >>>>>>> interested in picking the brains of others here to see if this type
>> >>>> of
>> >>>>>>> problem can be solved without looping (some form of scan?).
>> >>>>>>>
>> >>>>>>> EDIT: Initially I wrote this up thinking the J solution would
>> >>>> difficult,
>> >>>>>>> but it was actually fairly straightforward -- about 15 minutes, but
>> >>>>>> still
>> >>>>>>> would like to see if there are alternatives. If nothing else, maybe
>> >>>> an
>> >>>>>>> interesting problem to share.
>> >>>>>>>
>> >>>>>>> Example data:
>> >>>>>>>
>> >>>>>>> A store has a transaction log with a sequence for each transaction.
>> >>>> The
>> >>>>>>> transaction log records a key for a unique customer/item
>> combination.
>> >>>>>> The
>> >>>>>>> transaction log records how many units were purchased or
>> returned.
>> >>>>>>>
>> >>>>>>> Goal:
>> >>>>>>> Attempt to match up related transactions and cancel out instances
>> >>>> when
>> >>>>>> the
>> >>>>>>> customer/item combination is returned at the same quantity as a
>> >>>> previous
>> >>>>>>> transaction
>> >>>>>>>
>> >>>>>>> Examples:
>> >>>>>>>
>> >>>>>>> Joe buys 1 blue pen, which is defective, then returns the 1
>> defective
>> >>>>>> blue
>> >>>>>>> pen, then buys another blue pen. EXPECTED: cancel out first two
>> >>>>>>> transactions and leave the the last one for 1 pen
>> >>>>>>>
>> >>>>>>> Bob buys 2 red pens in two separate transactions. He then buys 3
>> >>>> more.
>> >>>>>> He
>> >>>>>>> returns the first two purchases as two separate return transactions.
>> >>>>>>> EXPECTED: cancel out all transactions except the one for qty 3
>> >>>>>>>
>> >>>>>>> Jane buys 5 purple pens and subsequently returns two of them.
>> She
>> >>>> buys
>> >>>>>> two
>> >>>>>>> more. EXPECTED: No transactions match exactly, so nothing is
>> >>>> cancelled
>> >>>>>> out
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> Data:
>> >>>>>>>
>> >>>>>>> data=: 0 : 0
>> >>>>>>> seq key qty
>> >>>>>>> 1 1 1
>> >>>>>>> 2 1 _1
>> >>>>>>> 3 1 1
>> >>>>>>> 4 2 1
>> >>>>>>> 5 2 1
>> >>>>>>> 6 2 3
>> >>>>>>> 7 2 _1
>> >>>>>>> 8 2 _1
>> >>>>>>> 9 3 5
>> >>>>>>> 10 3 _2
>> >>>>>>> 11 3 2
>> >>>>>>> )
>> >>>>>>> tbl =: ,. ' ' cut every cutLF data
>> >>>>>>> 'seqs keys qtys' =: |: ". every }. tbl
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> Goal:
>> >>>>>>>
>> >>>>>>> goals =: 0 : 0
>> >>>>>>>
>> >>>>>>> goal
>> >>>>>>>
>> >>>>>>> cancelled
>> >>>>>>>
>> >>>>>>> credit
>> >>>>>>>
>> >>>>>>> ok
>> >>>>>>>
>> >>>>>>> cancelled
>> >>>>>>>
>> >>>>>>> cancelled
>> >>>>>>>
>> >>>>>>> ok
>> >>>>>>>
>> >>>>>>> credit
>> >>>>>>>
>> >>>>>>> credit
>> >>>>>>>
>> >>>>>>> ok
>> >>>>>>>
>> >>>>>>> ok
>> >>>>>>>
>> >>>>>>> ok
>> >>>>>>>
>> >>>>>>> )
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> tbl,.(cutLF goals)
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |seq|key|qty|goal |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |1 |1 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |2 |1 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |3 |1 |1 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |4 |2 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |5 |2 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |6 |2 |3 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |7 |2 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |8 |2 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |9 |3 |5 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |10 |3 |_2 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |11 |3 |2 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> One approach:
>> >>>>>>>
>> >>>>>>> applycredits =: 3 : 0
>> >>>>>>>
>> >>>>>>> goals=.(<'goal')
>> >>>>>>>
>> >>>>>>> creditids=.0
>> >>>>>>>
>> >>>>>>> for_i. (i. # seqs) do.
>> >>>>>>>
>> >>>>>>>  key=.i{keys
>> >>>>>>>
>> >>>>>>>  seq=.i{seqs
>> >>>>>>>
>> >>>>>>>  qty=.i{qtys
>> >>>>>>>
>> >>>>>>>  nextcredit =.| {. qtys #~ ((key=keys)*(seqs>seq)*(qtys<0))
>> >>>>>>>
>> >>>>>>>  if. nextcredit = qty do.
>> >>>>>>>
>> >>>>>>>  goals=.goals,<'cancelled'
>> >>>>>>>
>> >>>>>>>  creditids =. creditids, seqs #~ ((key=keys)*(seqs>seq)*(qtys<0))
>> >>>>>>>
>> >>>>>>>  elseif. creditids e.~ seq do.
>> >>>>>>>
>> >>>>>>>    goals=.goals,<'credit'
>> >>>>>>>
>> >>>>>>>  elseif. do.
>> >>>>>>>
>> >>>>>>>    goals=.goals,<'ok'
>> >>>>>>>
>> >>>>>>> end.
>> >>>>>>>
>> >>>>>>> end.
>> >>>>>>>
>> >>>>>>> goals
>> >>>>>>>
>> >>>>>>> )
>> >>>>>>>
>> >>>>>>> tbl ,. ( applycredits 0 )
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |seq|key|qty|goal |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |1 |1 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |2 |1 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |3 |1 |1 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |4 |2 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |5 |2 |1 |cancelled|
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |6 |2 |3 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |7 |2 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |8 |2 |_1 |credit |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |9 |3 |5 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |10 |3 |_2 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>> |11 |3 |2 |ok |
>> >>>>>>>
>> >>>>>>> +---+---+---+---------+
>> >>>>>>>
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> (cutLF goals) -: ( applycredits 0 )
>> >>>>>>>
>> >>>>>>> 1
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> thanks for any input
>> >>>>>>> ------------------------------------------------------------
>> >>>> ----------
>> >>>>>>> For information about J forums see
>> http://www.jsoftware.com/forum
>> >>>> s.htm
>> >>>>>> ----------------------------------------------------------------------
>> >>>>>> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>>>>>
>> >>>>>
>> >>>>>
>> >>>> ----------------------------------------------------------------------
>> >>>> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>>>
>> >>>
>> >>>
>> >> ----------------------------------------------------------------------
>> >> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >>
>> >>
>> >> ----------------------------------------------------------------------
>> >> For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >
>> > ----------------------------------------------------------------------
>> > For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> >
>> >
>> > ----------------------------------------------------------------------
>> > For information about J forums see
>> http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to