Re: NMinimize problem: fct minimized uses FindRoot
- To: mathgroup at smc.vnet.net
- Subject: [mg123761] Re: NMinimize problem: fct minimized uses FindRoot
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sat, 17 Dec 2011 02:49:59 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201112101227.HAA19219@smc.vnet.net> <201112161047.FAA06773@smc.vnet.net>
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 >
- References:
- NMinimize problem: fct minimized uses FindRoot
- From: "Doug Tinkham" <dtinkham@live.ca>
- Re: NMinimize problem: fct minimized uses FindRoot
- From: DrMajorBob <btreat1@austin.rr.com>
- NMinimize problem: fct minimized uses FindRoot