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

MathGroup Archive 2009

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

Search the Archive

Re: part assigned sequence behavior puzzling

  • To: mathgroup at smc.vnet.net
  • Subject: [mg105267] Re: part assigned sequence behavior puzzling
  • From: mkr <mileskrains at gmail.com>
  • Date: Wed, 25 Nov 2009 23:00:30 -0500 (EST)
  • References: <heimgd$58a$1@smc.vnet.net> <hej41o$dfp$1@smc.vnet.net>

On Nov 25, 3:22 am, "Sjoerd C. de Vries" <sjoerd.c.devr... at gmail.com>
wrote:
> I don't think you're wrong. I was just as puzzled with this behaviour
> as you. I'd say it's a bug. Just look at the following :
>
> Using extra temporary variables works as expected:
>
> In[283]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[2];
> tmp2 = tmp;
> tmp2[[7]] = Sequence @@ Range[2];
> tmp3 = tmp2;
> tmp3[[7]] = Sequence @@ Range[2];
> tmp3
>
> Out[289]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> Using different locations in tmp works as expected:
>
> In[295]:= tmp = Range[15];
> tmp[[3]] = Sequence @@ Range[2];
> tmp[[5]] = Sequence @@ Range[2];
> tmp[[7]] = Sequence @@ Range[2];
> tmp
>
> Out[299]= {1, 2, 1, 2, 4, 1, 2, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> Temporarily storing tmp somewhere else works as expected:
>
> In[311]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[2];
> tmp2 = tmp;
> tmp = 0;
> tmp = tmp2;
> tmp[[7]] = Sequence @@ Range[2];
> tmp2 = tmp;
> tmp = 0;
> tmp = tmp2;
> tmp[[7]] = Sequence @@ Range[2];
> tmp
>
> Out[321]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> My original hypothesis of what happens here was that Mathematica
> optimizes assignments and remembers what it last assigned to a
> location in an array. If it is the same, it does nothing. This would
> work for all elements except Sequence.
>
> This hypothesis is falsified by the following tests in which I changed
> the ranges:
>
> In[392]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[2];
> tmp[[7]] = Sequence @@ Range[3];
> tmp[[7]] = Sequence @@ Range[4];
> tmp
>
> Out[396]= {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14, 15}
>
> In[397]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[4];
> tmp[[7]] = Sequence @@ Range[3];
> tmp[[7]] = Sequence @@ Range[2];
> tmp
>
> Out[401]= {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> As you can see, only the last range sticks.
>
> A new hypothesis would be to assume that Mathematica stores lists as a
> table of pointers to the list members and that a Sequence not causes
> the list to get extra pointers but that the Sequence is still
> invisible lurking there with a single pointer pointing to it. Copying
> the array may flatten out this structure, so that every member now
> gets his own pointer:
>
> In[402]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
> tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
> tmp[[7]] = Sequence @@ Range[2]; tmp = tmp;
> tmp
>
> Out[406]= {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> This seems to confirm the hypothesis.
>
> The problem seems to be in Set, as Part works OK:
> In[476]:= tmp = Range[15];
> tmp[[7]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
> tmp[[8]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
> tmp[[9]] = Sequence @@ Range[2]; {tmp[[7]], tmp[[8]], tmp[[9]]}
> tmp
>
> Out[477]= {1, 2, 8}
>
> Out[478]= {1, 2, 1}
>
> Out[479]= {1, 2, 1}
>
> Out[480]= {1, 2, 3, 4, 5, 6, 1, 2, 1, 2, 1, 2, 10, 11, 12, 13, 14, 15}
>
> Could you report this to supp... at wolfram.com?
>
> Cheers -- Sjoerd
>
> On Nov 25, 9:31 am, mkr <mileskra... at gmail.com> wrote:
>
>
>
> > I am puzzled by the following behavior:
>
> > tmp = Range[15]
> > tmp[[7]] = Sequence @@ Range[2];
> > tmp[[7]] = Sequence @@ Range[2];
> > tmp[[7]] = Sequence @@ Range[2];
> > tmp
>
> > yields
>
> > {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
> > {1, 2, 3, 4, 5, 6, 1, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> > I would have expected the repeated assignment to have a repeated
> > effect, thus obtaining
>
> > {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
> > {1, 2, 3, 4, 5, 6, 1, 2, 2, 2, 8, 9, 10, 11, 12, 13, 14, 15}
>
> > Where/why am I wrong?- Hide quoted text -
>
> - Show quoted text -

Thanks for the reply.  I have submitted this to WRI tech support as a
possible bug, including reference to your much more thorough analysis
here.


  • Prev by Date: Re: Re: Help with algorithm to find rational
  • Next by Date: Re: Re: Delay Differential Equations
  • Previous by thread: Re: part assigned sequence behavior puzzling
  • Next by thread: Re: part assigned sequence behavior puzzling