I am working on creating a demonstration and came across an instance where my code works fine on my machine locally but breaks down when deployed to the cloud (so that it can be publicly accessed). I really do want to deploy it; can someone help make it render/work from the cloud?
Here is the code:
Func[x_, u1_, u2_] := Exp[-(x - u1)^2/2] + Exp[-(x - u2)^2/2]
Sensor[loc_, u1_, u2_] := Graphics3D@{Red, PointSize[0.05], Point@Join[loc,{Func[loc[[1]], u1, u2]}]}
SurfPlot[f_, u1_, u2_, sens1_, sens2_] := Show[Plot3D[f, {x, -5, 5}, {y, -5, 5}, PlotPoints
-> 50, PlotRange -> {{-5, 5}, {-5, 5}}], Sensor[sens1, u1, u2], Sensor[sens2, u1, u2]]
TwoDPlot[u1_, u2_] := Plot[{Exp[-(x - u1)^2/2], Exp[-(x - u2)^2/2]}, {x, -5, 5}, PlotRegion -> Full]
That sets up a 3D surface and two red points on the surface; also a 2D representation of them is made. Next, I want to be able to move the two "sensors" around in manipulate, so I am going to set up a LocatorPane
.
LocSlider[loc_, init_] := {{loc, init, "Position of Sensor"}, {-5,-5}, {5, 5}, ControlType -> None}
LocBox = {Gray, EdgeForm[Black], Rectangle[{-5, -5}, {5, 5}]};
SensorBullsEye := {Black, Line[{{-5, #[[2]]}, {5, #[[2]]}}], Line[{{#[[1]], -5}, {#[[1]], 5}}]} &;
There is a relationship between the 2D plot and the location of the sensors so after defining a helper function for that, I call Manipulate
.
Phase[u1_, u2_] := Abs[u2 - u1]
SenseDiff[{x1_, x2_}] := Abs[x2 - x1]
Manipulate[
GraphicsGrid[{{SurfPlot[Func[x, u1, u2], u1, u2, xy1, xy2],
TwoDPlot[u1,
u2 - (Phase[u1, u2] - SenseDiff[First /@ {xy1, xy2}])]}},
ImageSize -> Large],
{{u1, -2.5, ""}, 0, 0, ControlType -> None}, {{u2, 2.5, ""}, 0, 0,
ControlType -> None},
Evaluate@LocSlider[xy1, {2, 2}], Evaluate@LocSlider[xy2, {-2, -2}],
Dynamic[LocatorPane[Dynamic[{xy1, xy2}],
Graphics[{LocBox, {Dynamic[SensorBullsEye /@ {xy1, xy2}]}},
ImageSize -> 100]]], SaveDefinitions -> True]
This works fine locally on my Mac, but it hangs when published using WolframCloud.
Here is the published version. Can someone show me what I can do better to make the deployed version work? I found this answer but I haven't played around with the CDF format much. What are some general principles to keep in mind when writing notebooks that are intended to deployed/interactive?
I understand that WolframCloud has kernel memory and computation limitations, so my intention is not to use it as a real-time computing resource for anything like data-science. But I feel something simple like this should be do-able.