Re: NMinimize problem: fct minimized uses FindRoot
- To: mathgroup at smc.vnet.net
- Subject: [mg123753] Re: NMinimize problem: fct minimized uses FindRoot
- From: Oliver Ruebenkoenig <ruebenko at wolfram.com>
- Date: Sat, 17 Dec 2011 02:47:13 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201112161047.FAA06783@smc.vnet.net> <alpine.LRH.2.00.1112160525020.26730@wopr.wolfram.com>
On Fri, 16 Dec 2011, Oliver Ruebenkoenig wrote: > > > On Fri, 16 Dec 2011, Oleksandr Rasputinov wrote: > >> On Thu, 15 Dec 2011 10:06:01 -0000, Oliver Ruebenkoenig >> <ruebenko at wolfram.com> wrote: >> >>> >>> Just for comepletness sake: >>> >>> this does work >>> >>> cf = Compile[{{n, _Integer}}, >>> Module[{res = 0}, Do[res += i; If[res > 10, Throw[0, cfe]], {i, n}]; >>> res]] >>> >>> Catch[cf[111], cfe] >>> >>> >>> Related: >>> http://stackoverflow.com/questions/8184548/do-return-behave-differently-in-compile-why/8194565#8194565 >>> >>> Oliver >>> >> >> Well, sort of. >> cf // InputForm >> >> reveals the MainEvaluate call (opcode 46): > > That does not matter - this is evaluated only once; and you want to go back > to the evaluator anyways. > > Calls to MainEvaluate in compiled code are evil if they appear in a loop. > > Needs["CompiledFunctionTools`"] > CompilePrint[cf] Ah, and I forgot you can avoid that (insignificant) MainEval call with cf2 = Compile[{{n, _Integer}}, Module[{res = 0}, Do[res += i; If[res > 10, Internal`CompileError[]], {i, n}]; res], "RuntimeOptions" -> {"WarningMessages" -> False, "RuntimeErrorHandler" -> Function[Throw[$Failed, cfe]]} ] Oliver > > >> >> CompiledFunction[{8, 8., 5468}, {_Integer}, {{2, 0, 0}, {2, 0, 2}}, {{0, >> {2, 0, 1}}, {10, {2, 0, 5}}}, {1, 7, 0, 0, 0}, >> {{6, 1, 2}, {6, 0, 3}, {6, 1, 4}, {3, 7}, {12, 2, 4, 6}, {6, 6, 2}, {25, >> 5, 2, 0}, {2, 0, 3}, >> {46, Function[{n}, Throw[0, cfe]], {i, 2, 0, 4, Block}, 2, 0, 0, 6, 0, >> 17}, {3, 1}, {4, 4, 3, -6}, {1}}, >> Function[{n}, Module[{res = 0}, Do[res += i; If[res > 10, Throw[0, cfe]], >> {i, n}]; res]], Evaluate] >> >> so the advantage of the two-argument Throw in this case appears limited >> versus, say, >> >> cf = Compile[{{n, _Integer}}, >> Catch@Module[{res = 0}, >> Do[res += i; If[res > 10, Throw[0]], {i, n}]; >> res >> ] >> ] >> >> which does the same thing without requiring any MainEvaluate calls. > > But is less flexible concerning that possibilities where to Catch. > >> >> Also: >> >> cf2 = Compile[{{n, _Integer}}, >> Catch[ >> Module[{res = 0}, >> Do[res += i; If[res > 10, Throw[0, cfe]], {i, n}]; >> res >> ], cfe >> ] >> ] >> >> Catch::argx: Catch called with 2 arguments; 1 argument is expected. >> >> cf2 // InputForm > > Yes, this seems to me much more of an issue. > > I'd cautiously say, that this might be improvable. But I am not sure. I think > the issue is that the second arg is a expr, which the compiler does not know > how to deal with. But perhaps if a "string" type were added then something > like this might work > > cf2 = Compile[{{n, _Integer}}, > Catch[ > Module[{res = 0}, > Do[res += i; If[res > 10, Throw[0, "cfe"]], {i, n}]; > res > ], "cfe" > ] > ] > > But this is speculation. > > >> >> CompiledFunction[{8, 8., 5468}, {_Integer}, {{2, 0, 0}, {3, 0, 0}}, {}, >> {0, 1, 1, 0, 0}, >> {{46, Function[{n}, Catch[Module[{res = 0}, Do[res += i; If[res > 10, >> Throw[0, cfe]], {i, n}]; res], cfe]], 2, 0, 0, 3, 0, 0}, {1}}, >> Function[{n}, Catch[Module[{res = 0}, Do[res += i; If[res > 10, Throw[0, >> cfe]], {i, n}]; res], cfe]], Evaluate] >> >> which is not compiled at all. So neither Throw/Catch nor Return can accept >> two arguments when used in compiled code proper (i.e. not wrapped in >> MainEvaluate). The advantage of the latter, of course, is that the > > But this is only a problem if you want to Catch inside compile. So I think > the way to go is to re-write slow parts of code with compile and then the > control structure in top level. Perhaps some else has another idea? > >> location it returns to is indicated by context without requiring a second >> argument to describe it, which is just as well since the locations Return >> will or will not return to appear to be somewhat arbitrary choices as you >> point out in your StackOverflow posting. I suppose one can use Label/Goto >> to replicate the behaviour of two-argument forms in compiled code if >> absolutely necessary, although this seems fairly anachronistic. > > Yes, that might be possible - but hm... ;-) >
- References:
- Re: NMinimize problem: fct minimized uses FindRoot
- From: "Oleksandr Rasputinov" <oleksandr_rasputinov@hmamail.com>
- Re: NMinimize problem: fct minimized uses FindRoot