2
$\begingroup$

I'm a noob when it comes to DownValues, UpValues, OwnValues, etc. but I figured I would give it a shot in my code because I think it would be beneficial for my work.

What I'm wondering is is it possible to set a DownValue for a compiled function? I've searched the docs and haven't come up with anything about DownValue's for compiled functions. Consider the following example

ClearAll[f, cf]
f[x_] := (x^2 + x)/x
cf[0.] = 1.;
cf = Compile[{x}, Evaluate[f[x]], CompilationTarget -> "C"];
cf[0.]

(*output*)
Indeterminate

The uncompiled function simplifies to an expression that has a clearly defined value at x=0, but the compiled function doesn't know that, so I'm trying to set a downvalue for the compiled function at the apparent singularity to rid this effect. This is only a simple example, the function that's relevant to me is much more complicated unfortunately, but has the same apparent singularity at the origin. If I could set a downvalue for the compiled function, that would be tremendously helpful.

Maybe something with OwnValues would work better here?

edit:

Ah, My ignorance on the types of values is showing. I see setting cf[0.]=1 sets the DownValue for the symbol cf, while setting cf = Compile... sets the OwnValue for cf. So, one possible solution to this would be

ClearAll[f, cf]
f[x_] := (x^2 + x)/x
compiledf =  Compile[{x}, Evaluate[f[x]], CompilationTarget -> "C"];
cf[0.] = 1.;
cf[a_] := compiledf[a];
cf[0.]

(*output*)
1.

But this is a bit of an ad hoc solution. Also the definition of compiledf needs to follow the definition of cf since:

DownValues[cf]

(*output*)
(*{HoldPattern[cf[0.]] :> 1., HoldPattern[cf[a_]] :> compiledf[a]}*)

So compiledf would also need to be passed to a subkernel if cf is ever passed to one, which is a bit inconvenient.

Maybe someone else has a better solution?

$\endgroup$

1 Answer 1

3
$\begingroup$
ClearAll[f, cf]
f[x_] := (x^2 + x)/x

cf[0. | 0] = 1.;
With[{comp = Compile[{x}, Evaluate[f[x]]]},
  cf[a_] := comp[a]
]

cf[0.]  (* 1. *)
cf[0]   (* 1. *)
cf[2]   (* 3. *)
$\endgroup$
1
  • $\begingroup$ awesome. Thank you! $\endgroup$
    – shanedrum
    Commented Jan 11, 2021 at 8:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.