Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Non-sequential composition of pure functions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg127797] Re: Non-sequential composition of pure functions
  • From: Ray Koopman <koopman at sfu.ca>
  • Date: Thu, 23 Aug 2012 02:53:23 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net

----- On Wed, Aug 22, 2012 at 08:04 AM, Earl Mitchell <earl.j.mitchell at gmail.com> wrote:
> Thanks Ray,
>
> This doesn't quite answer my question (though it is due to the lack of
> clarity I had in my original example).  The exact problem I have is this:
>
> I have the following list of functions:
>
> list1={If[#1[[4]] <= 6, 4.52] &, If[#1[[4]] <= 0, 4.47] &, If[#1[[5]] <= 0,
> 4.40] &,
>   If[#1[[1]] <= 0, 4.02`] &, If[#1[[3]] <= 0, 4.30] &}
>
> I want to produce the following list of functions:
>
> targetlist= {
> If[#1[[4]] <= 6, 4.52] &,
> If[(#1[[4]] <= 6) && (#1[[4]] <= 0), 4.47] &,
>
> If[(#1[[4]] <= 6) && (#1[[4]] <= 0) && (#1[[5]] <= 0), 4.40] &,
> If[(#1[[4]] <= 6) && (#1[[4]] <= 0) && (#1[[5]] <= 0) && (#1[[1]] <=
> 0), 4.02`] &,
>
> If[(#1[[4]] <= 6) && (#1[[4]] <= 0) && (#1[[5]] <= 0) && (#1[[1]] <= 0) && > (#1[[3]] <= 0), 4.30] &
>
> }
>
> 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.
>
> Thanks!
>
> Mitch

In[1]:= list1 = {
If[#[[4]] <= 6, 4.52]&,
If[#[[4]] <= 0, 4.47]&,
If[#[[5]] <= 0, 4.40]&,
If[#[[1]] <= 0, 4.02]&,
If[#[[3]] <= 0, 4.30]&};

In[2]:= f =
Table[With[{ positions = list1[[Range@j,1,1,1,2]],
            comparands = list1[[Range@j,1,1,2]],
                result = list1[[      j,1,2]] },
      Function[
        If[Inner[LessEqual,#[[positions]],comparands,And], result]]],
      {j,5}]

Out[2]=
{If[Inner[LessEqual, #1[[{4}]], {6}, And], 4.52]&,
 If[Inner[LessEqual, #1[[{4,4}]], {6,0}, And], 4.47]&,
 If[Inner[LessEqual, #1[[{4,4,5}]], {6,0,0}, And], 4.4]&,
 If[Inner[LessEqual, #1[[{4,4,5,1}]], {6,0,0,0}, And], 4.02]&,
 If[Inner[LessEqual, #1[[{4,4,5,1,3}]], {6,0,0,0,0}, And], 4.3]&}

In[3]:= f[[#]]@{x1,x2,x3,x4,x5}& /@ Range@5

Out[3]=
{If[x4 =E2=89=A4 6, 4.52],
 If[x4 =E2=89=A4 6 && x4 =E2=89=A4 0, 4.47],
 If[x4 =E2=89=A4 6 && x4 =E2=89=A4 0 && x5 =E2=89=A4 0, 4.4],
 If[x4 =E2=89=A4 6 && x4 =E2=89=A4 0 && x5 =E2=89=A4 0 && x1 =E2=89=A4 0, 4.02],
 If[x4 =E2=89=A4 6 && x4 =E2=89=A4 0 && x5 =E2=89=A4 0 && x1 =E2=89=A4 0 && x3 =E2=89=A4 0, 4.3]}

>
> On Wed, Aug 22, 2012 at 3:19 AM, Ray Koopman <koopman at sfu.ca> wrote:
>
>> On Aug 21, 11:26 pm, Earl Mitchell <earl.j.mitch... at 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!
>>>
>>> Mitch
>>
>> In[1]:= f1 = If[c1@#, a1]&;
>>         f2 = If[c2@#, a2]&;
>>         f3 = If[c3@#, a3]&;
>>
>> In[4]:= If[And @@ MapThread[#1@#2&,
>>         { {f1,f2,f3}[[All,1,1,0]], {x1,x2,x3} }], action]
>>
>> Out[4]= If[c1[x1] && c2[x2] && c3[x3], action]




  • Prev by Date: Re: Constraining a Location to Move Along a Plot in a Manipulate
  • Next by Date: Re: How to use Pick[]; Is this a bug?
  • Previous by thread: Re: Non-sequential composition of pure functions
  • Next by thread: Re: Non-sequential composition of pure functions