MathGroup Archive 2011

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

Search the Archive

Re: NMinimize problem: fct minimized uses FindRoot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg123744] Re: NMinimize problem: fct minimized uses FindRoot
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Sat, 17 Dec 2011 02:44:06 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <201112101227.HAA19219@smc.vnet.net>
  • Reply-to: drmajorbob at yahoo.com

If posters put forth examples where Return was, say, only 1% pointless...  
we could have a different discussion. Until that happens, I'll stick to my  
current opinion.

(And no, I don't plan to search thousands of archived posts to prove  
myself wrong.)

Bobby

On Fri, 16 Dec 2011 06:07:47 -0600, Andrzej Kozlowski <akoz at mimuw.edu.pl>  
wrote:

> You are absolutely right, but that is mostly due to the fact that the  
> use of Return and Throw in the posted examples was 100% pointless.
>
> It's a very different matter in cases when you really do need to  
> interrupt a control structure. If you look in the list archives you will  
> find many examples of compiled procedural code posted by Daniel  
> Lichtblau where Throw is used and where is going to be a lot harder to  
> produce equivalent code that matches the performance and avoids the use  
> of Throw, Return or Break.
>
> Andrzej
>
>
>
> On 16 Dec 2011, at 11:47, DrMajorBob wrote:
>
>> The third code below is far superior... and not just as a matter of  
>> speed:
>>
>> temp = RandomInteger[{0, 100}, #] & /@ RandomInteger[{1, 100}, 100000];
>> returnExample[x_] :=
>>  Module[{max, min}, If[Total[x] < 100, Return[0]];
>>   {max, min} = {Max[x], Min[x]};
>>   max^min]
>> throwExample[x_] := Module[{max, min}, If[Total[x] < 100, Throw[0]];
>>   {max, min} = {Max[x], Min[x]};
>>   max^min]
>> simple[x_] := If[Total@x < 100, 0, {Max@x, Min@x}]
>>
>> Timing[returnExample /@ temp;]
>> Timing[Catch[throwExample[#]] & /@ temp;]
>> Timing[simple /@ temp;]
>>
>> {1.61005, Null}
>>
>> {1.73297, Null}
>>
>> {0.458204, Null}
>>
>> Others have suggested Throw and Catch... but I almost never use THOSE,
>> either.
>>
>> Bobby
>>
>> On Thu, 15 Dec 2011 12:38:09 -0600, W Craig Carter <ccarter at mit.edu>  
>> wrote:
>>
>>> Hello,
>>> I didn't understand the rationale for the "do not use Return" maxim, so
>>> I constructed a little experiment:
>>>
>>> (****** snip start *******)
>>> (*list of lists of random lengths*)
>>> temp = RandomInteger[{0, 100}, #] & /@ RandomInteger[{1, 100}, 100000];
>>>
>>> (*artificial examples of using Throw or Return*)
>>>
>>> returnExample[x_] := Module[
>>>  {max, min},
>>>  If[Total[x] < 100, Return[0]];
>>>  {max, min} = {Max[x], Min[x]};
>>>  max^min
>>>  ]
>>>
>>> throwExample[x_] := Module[
>>>  {max, min},
>>>  If[Total[x] < 100, Throw[0]];
>>>  {max, min} = {Max[x], Min[x]};
>>>  max^min
>>>  ]
>>>
>>> (*timings*)
>>> Timing[returnExample /@ temp;]
>>> (*I get: {1.08535, Null}*)
>>>
>>> Timing[Catch[throwExample[#]] & /@ temp;]
>>>
>>> (*I get: {1.20134, Null}*)
>>>
>>> (*******snip end********)
>>>
>>> OK, this is artificial, but how do I understand why Return is eschewed
>>> when it appears to be faster and its construction is simpler?
>>>
>>> Thanks, Craig
>>>
>>>
>>> W Craig Carter
>>> Professor of Materials Science, MIT
>>>
>>>
>>>
>>> On Dec 14, 2011, at Wed, Dec 14, 11 ---6:00 AM, DrMajorBob wrote:
>>>
>>>> There's a large gap between "explained and justified" versus "worth  
>>>> the
>>>> trouble" or even "sensible".
>>>>
>>>> Do not use Return. It isn't worth the spit you'll need to polish it.
>>>>
>>>> Bobby
>>>>
>>>> On Tue, 13 Dec 2011 04:39:04 -0600, Andrzej Kozlowski
>>>> <akoz at mimuw.edu.pl>
>>>> wrote:
>>>>
>>>>>
>>>>> On 12 Dec 2011, at 12:43, Oleksandr Rasputinov wrote:
>>>>>
>>>>>> For example, the erroneous usage:
>>>>>>
>>>>>> Block[{a = 1, b = 2}, Return[a]; Return[b]]
>>>>>>
>>>>>> gives:
>>>>>>
>>>>>> Return[1]
>>>>>>
>>>>>> but a correct usage:
>>>>>>
>>>>>> Do[Block[{a = 1, b = 2}, Return[a]; Return[b]], {1}]
>>>>>>
>>>>>> gives (because of the enclosing Do):
>>>>>>
>>>>>> 1
>>>>>
>>>>> This is not quite the whole story. For example, while the above use  
>>>>> of
>>>>> Return in Block does not work, this one (in a function call) does:
>>>>>
>>>>> f[] := Block[{a = 1, b = 2}, Return[a]; Return[b]]
>>>>>
>>>>> f[]
>>>>>
>>>>> 1
>>>>>
>>>>> Moreover, if you replace the Do loop in your example with a While  
>>>>> loop,
>>>>> you will get:
>>>>>
>>>>> n = 1; While[n < 10, Block[{a = 1, b = 2}, Return[a]; Return[b]]]
>>>>>
>>>>> Return[1]
>>>>>
>>>>> All of this is purposeful design and can be explained and justified  
>>>>> but
>>>>> I don't think it's worth the bother since Mathematica has far  
>>>>> superior
>>>>> means of flow control than this clumsy and arcane construct.
>>>>>
>>>>> Andrzej
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> DrMajorBob at yahoo.com
>>>>
>>>
>>
>>
>> --
>> DrMajorBob at yahoo.com
>>
>


-- 
DrMajorBob at yahoo.com



  • Prev by Date: Re: NMinimize problem: fct minimized uses FindRoot
  • Next by Date: Re: NMinimize problem: fct minimized uses FindRoot
  • Previous by thread: Re: NMinimize problem: fct minimized uses FindRoot
  • Next by thread: Re: NMinimize problem: fct minimized uses FindRoot