I have a list of pure functions (If[Conditional[#[[1]]],Action]&
statements) and I want to compose them into one large pure function
If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
They are to be applied to a list of values, and the conditionals checked
for multiple columns for a given element of a list.
I'm having problems joining these things together - to the point that I've
considered converting them all to strings and doing the tedious
(hackie) string manipulations to get the final function in the right form.
Any recommendations on how to do this? I found Composition[] but it nests
the functions - and I want to combine them.
> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
> statements) and I want to compose them into one large pure function
> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
> They are to be applied to a list of values, and the conditionals checked
> for multiple columns for a given element of a list.
> I'm having problems joining these things together - to the point that I've
> considered converting them all to strings and doing the tedious
> (hackie) string manipulations to get the final function in the right form.
> Any recommendations on how to do this? I found Composition[] but it nests
> the functions - and I want to combine them.
> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
> statements) and I want to compose them into one large pure function
> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
> They are to be applied to a list of values, and the conditionals checked
> for multiple columns for a given element of a list.
> I'm having problems joining these things together - to the point that I've
> considered converting them all to strings and doing the tedious
> (hackie) string manipulations to get the final function in the right form.
> Any recommendations on how to do this? I found Composition[] but it nests
> the functions - and I want to combine them.
it is not clear what you mean by "combining" the functions, but whatever you want to do, I would never suggest to convert to string and back. It is one of the great strengths of Mathematica that you can treat Mathematica code just a any other expression, although the evaluation scheme makes it somewhat tricky to manipulate code without evaluating it. Here is an example which does something along the lines you described:
There might be somewhat simpler or clearer ways to do such manipulations. Which "tricks" you use to avoid the evaluation of the code you manipulate are also a matter of taste, it's usually some combination of Hold, Unevaluated, With that you'll need. If you want a solution for your very problem, you would need to send a full example of input and desired output...
> Quick aside - I recognize that given the function in position two, the
> function in position one is irrelevant (redundant). If the composition
> algorithm could check for and discard any *sequential* irrelevancies that
> would be even better. If, however, the third function were put sequentially
> between functions one and two, then all three statements would be relevant.
The following should do what you want. I decided to store the intermediate results as I think it is somewhat easier to follow what happens. This is just what I came up with at first try, as usual there are plenty possibilities to achieve the same thing, some of which might be much more elegant. The code is also not bullet proof, but I didn't want to introduce additional complexity for making it more safe or general. Anyway I hope it is good enough to get you started:
(*extract the held conditions and bodies (in this case just values) *)
heldConditions=Cases[list1,Function[If[c_,_]]:>Hold[c]]
heldBodies=Cases[list1,Function[If[_,b_]]:>Hold[b]]
(* create the "accumulated" conditions, still wrapped with Hold *)
accumulatedConditions=ReplaceAll[
Hold/@Rest[FoldList[And,True,heldConditions]],
Hold[LessEqual[x___]]:>LessEqual[x]
]
(* finally compose the resulting functions from the accumulated conditions and the stored "bodies" *)
targetList=Function/@Flatten/@Hold@@@Transpose[{accumulatedConditions,heldB odies}]/.Hold->If
> Quick aside - I recognize that given the function in position two, the
> function in position one is irrelevant (redundant). If the composition
> algorithm could check for and discard any *sequential* irrelevancies that
> would be even better. If, however, the third function were put sequentially
> between functions one and two, then all three statements would be relevant.
>>> They are to be applied to a list of values, and the conditionals checked
>>> for multiple columns for a given element of a list.
>>> I'm having problems joining these things together - to the point that
>>> I've considered converting them all to strings and doing the tedious
>>> (hackie) string manipulations to get the final function in the right form.
>>> Any recommendations on how to do this? I found Composition[] but it
>>> nests the functions - and I want to combine them.
I have developed some relevant techniques for handling this sort of
problem, but in order to suggest what to do, I need to see more
details of what the desired result should look like. Could you please
illustrate that with an example of (manually) combining two or three
pure functions, showing what you would like the resulting function to
look like?
On Wed, Aug 22, 2012 at 5:19 AM, awnl <a...@gmx-topmail.de> wrote:
> Hi,
>> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
>> statements) and I want to compose them into one large pure function
>> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
>> They are to be applied to a list of values, and the conditionals checked
>> for multiple columns for a given element of a list.
>> I'm having problems joining these things together - to the point that I've
>> considered converting them all to strings and doing the tedious
>> (hackie) string manipulations to get the final function in the right form.
>> Any recommendations on how to do this? I found Composition[] but it nests
>> the functions - and I want to combine them.
> it is not clear what you mean by "combining" the functions, but whatever
> you want to do, I would never suggest to convert to string and back. It
> is one of the great strengths of Mathematica that you can treat
> Mathematica code just a any other expression, although the evaluation
> scheme makes it somewhat tricky to manipulate code without evaluating
> it. Here is an example which does something along the lines you described:
> There might be somewhat simpler or clearer ways to do such
> manipulations. Which "tricks" you use to avoid the evaluation of the
> code you manipulate are also a matter of taste, it's usually some
> combination of Hold, Unevaluated, With that you'll need. If you want a
> solution for your very problem, you would need to send a full example of
> input and desired output...
Quick aside - I recognize that given the function in position two, the
function in position one is irrelevant (redundant). If the composition
algorithm could check for and discard any *sequential* irrelevancies that
would be even better. If, however, the third function were put sequentially
between functions one and two, then all three statements would be relevant.
On Wed, Aug 22, 2012 at 3:19 AM, Ray Koopman <koop...@sfu.ca> wrote:
> On Aug 21, 11:26 pm, Earl Mitchell <earl.j.mitch...@gmail.com> wrote:
> > Hi All,
> > I have a list of pure functions (If[Conditional[#[[1]]],Action]&
> > statements) and I want to compose them into one large pure function
> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
> > They are to be applied to a list of values, and the conditionals checked
> > for multiple columns for a given element of a list.
> > I'm having problems joining these things together - to the point that
> I've
> > considered converting them all to strings and doing the tedious
> > (hackie) string manipulations to get the final function in the right
> form.
> > Any recommendations on how to do this? I found Composition[] but it
> nests
> > the functions - and I want to combine them.
At this point all you need to do is extract the action from one of the
functions, or all of them if they are different, and perform based on the
result of the conditional. Putting it all together:
> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
> statements) and I want to compose them into one large pure function
> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
> They are to be applied to a list of values, and the conditionals checked
> for multiple columns for a given element of a list.
> I'm having problems joining these things together - to the point that I've
> considered converting them all to strings and doing the tedious
> (hackie) string manipulations to get the final function in the right form.
> Any recommendations on how to do this? I found Composition[] but it nests
> the functions - and I want to combine them.
I ended up getting the solution to this guy earlier in the thread. I've
resent it below for reference.
If anyone is interested in taking on a side-M project (creating an M
version of the RandomForest algorithm is the current task) send me a
personal e-mail at earl.j.mitch...@gmail.com.
This group is excellent, thanks again -
Mitch
On Wed, Aug 22, 2012 at 9:16 AM, Earl Mitchell <earl.j.mitch...@gmail.com>wrote:
> Thanks again - I think I got it. The solution - slightly modified from
> what Albert sent - was this (and if there are obvious improvements to what
> I do here I'd love to hear them, learning a lot even though I program in M
> every day!):
>> At this point all you need to do is extract the action from one of the
>> functions, or all of them if they are different, and perform based on the
>> result of the conditional. Putting it all together:
>> On Wed, Aug 22, 2012 at 2:27 AM, Earl Mitchell <earl.j.mitch...@gmail.com
>> > wrote:
>>> Hi All,
>>> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
>>> statements) and I want to compose them into one large pure function
>>> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
>>> They are to be applied to a list of values, and the conditionals checked
>>> for multiple columns for a given element of a list.
>>> I'm having problems joining these things together - to the point that
>>> I've
>>> considered converting them all to strings and doing the tedious
>>> (hackie) string manipulations to get the final function in the right
>>> form.
>>> Any recommendations on how to do this? I found Composition[] but it
>>> nests
>>> the functions - and I want to combine them.
Thanks again - I think I got it. The solution - slightly modified from
what Albert sent - was this (and if there are obvious improvements to what
I do here I'd love to hear them, learning a lot even though I program in M
every day!):
> At this point all you need to do is extract the action from one of the
> functions, or all of them if they are different, and perform based on the
> result of the conditional. Putting it all together:
> On Wed, Aug 22, 2012 at 2:27 AM, Earl Mitchell <earl.j.mitch...@gmail.com>wrote:
>> Hi All,
>> I have a list of pure functions (If[Conditional[#[[1]]],Action]&
>> statements) and I want to compose them into one large pure function
>> If[FirstConditional[#[[1]]]&&SecondConditional[#[[6]]]&&ThirdConditional[#[ [foo]]],Action]&.
>> They are to be applied to a list of values, and the conditionals checked
>> for multiple columns for a given element of a list.
>> I'm having problems joining these things together - to the point that I've
>> considered converting them all to strings and doing the tedious
>> (hackie) string manipulations to get the final function in the right form.
>> Any recommendations on how to do this? I found Composition[] but it
>> nests
>> the functions - and I want to combine them.