I'll try to make a short example of the crash (although I'm having
trouble doing so) and filing an issue as soon as possible.

On 24 April 2015 at 16:28, Stefan Karpinski <[email protected]> wrote:
> Any segfault is always a bug. Would you mind filing an issue with a
> self-contained example that can produce the segfault (plus Julia version
> info)?
>
> On Fri, Apr 24, 2015 at 5:26 AM, Archibald Pontier
> <[email protected]> wrote:
>>
>> Hi again,
>>
>> I found a way to prevent my code from crashing and it's really unexpected.
>> I modified some global variable which only affects functions that are called
>> by my emloop function and somehow it works. I have no idea why did this
>> affect my code though, and especially what it made it segfault instead of
>> just return an error. So now the serial version works, I'm still struggling
>> with pmap with plenty of "result shape unspecified" errors but that's ok.
>>
>> All the best,
>> Archibald
>>
>>
>> On Friday, 24 April 2015 10:36:15 UTC+2, Archibald Pontier wrote:
>>>
>>> Hi everyone,
>>>
>>> Julia is (sometimes) segfaulting when running this function :
>>>
>>> function emloop(img, Sigma, mu, t, model, imgc, bg, FullTs)
>>>   EMiter = 1;
>>>   Check = typemax(Float64);
>>> GModels, Genes,
>>>   (x, y) = size(img);
>>>   D = zeros(x, y); E = zeros(x, y); B = zeros(x, y);
>>>
>>>   # And we start the EM loop
>>>   while EMiter <= maxEM && Check > ϵ
>>>     # Calculate the betas & find the optimal transformation for the
>>> current iteration
>>>     (D, E, B) = fastBetas(model, [], mu, Sigma, img);
>>>     nt = findTransform(model, B, Gray((bg.r + bg.g + bg.b)/3), FullTs);
>>>
>>>     # Now calculate the optimal parameters for the appearance model
>>>     OldMu = mu;                  # For termination purposes
>>>     (mu, Sigma) = calcTheta(img, D, E, B);
>>>
>>>     # Apply the transformation found to the image
>>>     img = RigidTransform(img, nt, bg, true, true);
>>>
>>>     # Deal with the transformation
>>>     Oldt = t;
>>>     t += nt;
>>>     t.tx %= x;
>>>     t.ty %= y;
>>>
>>>     # Termination criteria
>>>     NormOldTT = sqrt((Oldt.tx - t.tx)^2 + (Oldt.ty - t.ty)^2 + (Oldt.θ -
>>> t.θ)^2);
>>>     CheckMu = norm(OldMu.D - mu.D) + norm(OldMu.E - mu.E) + norm(OldMu.B
>>> - mu.B)
>>>     Check = CheckMu + NormOldTT # Giving lots of weight to the
>>> transformation
>>>
>>>     EMiter += 1;
>>>   end
>>>
>>>   return emdata(D, E, B, img, θ(Sigma, mu), t);
>>> end
>>>
>>> Some context: img is and Image{RGB{Float64}}, Sigma and mu are custom
>>> types :
>>> type Σ
>>>   D::Array{Float64, 2}
>>>   E::Array{Float64, 2}
>>>   B::Array{Float64, 2}
>>> end
>>>
>>> type μ
>>>   D::Array{Float64, 1}
>>>   E::Array{Float64, 1}
>>>   B::Array{Float64, 1}
>>> end
>>>
>>> t is another custom type to represent a rigid body transformation
>>> (translation_x, translation_y, rotation_angle), bg is, for example, RGB(0.0,
>>> 0.0, 0.0) (black), and FullTs is an array of transformations, namely all the
>>> transformations we consider.
>>>
>>> It's weird for multiple reasons: first of all, this code was running fine
>>> when not in a separate function returning a custom type (the custom type in
>>> the return is to ease the access since I want to call this function for an
>>> array of images with pmap and output all that which is not practical).
>>> Furthermore, sometimes it crashes with a segfault, sometimes with an
>>> undefined reference on this line, not always after the same EM iteration:
>>> CheckMu = norm(OldMu.D - mu.D) + norm(OldMu.E - mu.E) + norm(OldMu.B -
>>> mu.B)
>>>
>>> Thanks in advance for the help,
>>> Archibald
>
>

Reply via email to