forum.alglib.net
http://forum.alglib.net/

segfault in minlmresults
http://forum.alglib.net/viewtopic.php?f=2&t=510
Page 1 of 1

Author:  entee [ Sat Dec 31, 2011 1:59 pm ]
Post subject:  segfault in minlmresults

Hi!

I made this simple code from http://www.alglib.net/translator/man/manual.cpp.html#example_minlm_d_v
It segfaults at "minlmresults(state, x, rep);"
Code:
using namespace alglib;
...
    ae_int_t maxits = 20;
    minlmstate state;
    minlmreport rep;

    real_1d_array x = "[1,0,0,0,0,1,0,0,0,0,1,0]";

    minlmcreatev(12, x, 0.0001, state);
    minlmsetcond(state, 0.0, 0.0, 0.0, maxits);
    alglib::minlmoptimize(state, fvec,NULL,this);
    qDebug() <<"minlm5";
    minlmresults(state, x, rep);
   ...
}

static void fvec(const real_1d_array &x, real_1d_array &fi, void *ptr){
...
}

What is that I make wrong?

Author:  entee [ Sun Jan 01, 2012 9:18 am ]
Post subject:  Re: segfault in minlmresults

QtCreator say this (in Debug mode):
Code:
Level Function                   File       Line   Address
0   __GI___libc_free             malloc.c   3709   0x7ffff4d53d29   
1   alglib_impl::aligned_free    ap.cpp      183   0x58c16e   
2   alglib_impl::ae_free         ap.cpp      212   0x58c1ef   
3   alglib_impl::ae_db_free      ap.cpp      486   0x58c781   
4   alglib_impl::ae_vector_clear ap.cpp      641   0x58cac2   
5   alglib_impl::minlmresults    optimization.cpp   14195   0x49be19   
6   alglib::minlmresults         optimization.cpp   5019   0x484465   
7   Process::run                 process.cpp 108   0x4133d8   
8   ??            /usr/lib/x86_64-linux-gnu/libQtCore.so.4   0   0x7ffff6190d05   
9   start_thread                 pthread_create.c   304   0x7ffff5a2cefc   
10  clone                        clone.S     112   0x7ffff4db889d   
11  ??                                         0      

My code is in level 7

Author:  Sergey.Bochkanov [ Sun Jan 01, 2012 10:00 am ]
Post subject:  Re: segfault in minlmresults

The most probable reason is that you've accidentally corrupted memory somewhere in the fvec(). It can be array bounds violation, incorrect operation with pointers or something else. The corruption does not reveal itself until first operation with dynamic memory, which is done in the minlmresults().

I've checked code similar to yours on my machine, it works fine. So I suppose that you should check fvec() for errors, especially array-related errors.

Author:  entee [ Sun Jan 01, 2012 10:29 am ]
Post subject:  Re: segfault in minlmresults

Here is my fvec(). I've cut some line from it (//...) , they are very similar, so I think they are irrelevant.
Indexes of fi are continuous.
Do you see mistake?

Mat is opencv's Mat.

Code:
static void fvec(const real_1d_array &x, real_1d_array &fi, void *ptr){

    Process *pr=(Process *) ptr;
    double q[4][4] = { { x[0],x[1],x[2],x[3] },{ x[4],x[5],x[6],x[7] },{ x[8],x[9],x[10],x[11] },{0,0,0,1} };
    Mat A = Mat(4,4, CV_64FC1);
    for(int i = 0; i<4; ++i)
        for(int j = 0; j < 4; ++j){
            A.at<double>(i,j) = q[i][j];
        }
    if(determinant(A) < 0.0){
        fi[0]=alglib::maxrealnumber;
        return;
    }

    fi[0] = q[0][0] * pr->q_p->x + q[0][1] * pr->q_p->y + q[0][2] * pr->q_p->z + q[0][3] * pr->q_p->mu - pr->eqr[0][0];

    fi[1] = pow(q[0][0], 2.0) * pr->q_p->x2
        + 2 * q[0][0] * q[0][1] * pr->q_p->xy
        + 2 * q[0][0] * q[0][2] * pr->q_p->xz
        + 2 * q[0][0] * q[0][3] * pr->q_p->x
        + pow(q[0][1], 2.0) * pr->q_p->y2
        + 2 * q[0][1] * q[0][2] * pr->q_p->yz
        + 2 * q[0][1] * q[0][3] * pr->q_p->y
        + pow(q[0][2], 2.0) * pr->q_p->z2
        + 2 * q[0][2] * q[0][3] * pr->q_p->z
        + pow(q[0][3], 2.0) * pr->q_p->mu
        - pr->eqr[1][0];

    fi[2] = 3 * q[0][0] * pow(q[0][2], 2.0) * pr->q_p->xz2
        + 3 * q[0][1] * pow(q[0][2], 2.0) * pr->q_p->yz2
        + 3 * pow(q[0][0], 2.0) * q[0][1] * pr->q_p->x2y
        + 3 * pow(q[0][1], 2.0) * q[0][2] * pr->q_p->y2z
        + 3 * pow(q[0][0], 2.0) * q[0][2] * pr->q_p->x2z
        + 3 * q[0][0] * pow(q[0][1], 2.0) * pr->q_p->xy2
        + 6 * q[0][0] * q[0][1] * q[0][3] * pr->q_p->xy
        + 6 * q[0][0] * q[0][1] * q[0][2] * pr->q_p->xyz
        + 3 * pow(q[0][1], 2.0) * q[0][3] * pr->q_p->y2
        + 3 * q[0][1] * pow(q[0][3], 2.0) * pr->q_p->y
        + 3 * pow(q[0][2], 2.0) * q[0][3] * pr->q_p->z2
        + 3 * q[0][0] * pow(q[0][3], 2.0) * pr->q_p->x
        + 3 * q[0][2] * pow(q[0][3], 2.0) * pr->q_p->z
        + 3 * pow(q[0][0], 2.0) * q[0][3] * pr->q_p->x2
        + pow(q[0][1], 3.0) * pr->q_p->y3
        + pow(q[0][3], 3.0) * pr->q_p->mu
        + 6 * q[0][0] * q[0][2] * q[0][3] * pr->q_p->xz
        + 6 * q[0][1] * q[0][2] * q[0][3] * pr->q_p->yz
        + pow(q[0][0], 3.0) * pr->q_p->x3
        + pow(q[0][2], 3.0) * pr->q_p->z3
        - pr->eqr[2][0];


    fi[3] = q[1][0] * pr->q_p->x + q[1][1] * pr->q_p->y + q[1][2] * pr->q_p->z + q[1][3] * pr->q_p->mu - pr->eqr[0][1];

    //...

    fi[18] = q[0][0] * q[1][0] * q[2][1] * pr->q_p->x2y
        + q[0][1] * q[1][0] * q[2][3] * pr->q_p->xy
        + q[0][1] * q[1][1] * q[2][0] * pr->q_p->xy2
        + q[0][1] * q[1][1] * q[2][2] * pr->q_p->y2z
        + q[0][1] * q[1][2] * q[2][0] * pr->q_p->xyz
        + q[0][1] * q[1][2] * q[2][3] * pr->q_p->yz
        + q[0][1] * q[1][3] * q[2][0] * pr->q_p->xy
        + q[0][1] * q[1][3] * q[2][2] * pr->q_p->yz
        + q[0][0] * q[1][1] * q[2][3] * pr->q_p->xy
        + q[0][1] * q[1][2] * q[2][1] * pr->q_p->y2z
        + q[0][1] * q[1][2] * q[2][2] * pr->q_p->yz2
        + q[0][1] * q[1][0] * q[2][2] * pr->q_p->xyz
        + q[0][0] * q[1][0] * q[2][2] * pr->q_p->x2z
        + q[0][0] * q[1][1] * q[2][0] * pr->q_p->x2y
        + q[0][0] * q[1][1] * q[2][1] * pr->q_p->xy2
        + q[0][0] * q[1][1] * q[2][2] * pr->q_p->xyz
        + q[0][0] * q[1][2] * q[2][0] * pr->q_p->x2z
        + q[0][0] * q[1][2] * q[2][1] * pr->q_p->xyz
        + q[0][0] * q[1][2] * q[2][2] * pr->q_p->xz2
        + q[0][1] * q[1][1] * q[2][3] * pr->q_p->y2
        + q[0][3] * q[1][2] * q[2][3] * pr->q_p->z
        + q[0][1] * q[1][1] * q[2][1] * pr->q_p->y3
        + q[0][0] * q[1][0] * q[2][0] * pr->q_p->x3
        + q[0][0] * q[1][0] * q[2][3] * pr->q_p->x2
        + q[0][0] * q[1][3] * q[2][0] * pr->q_p->x2
        + q[0][0] * q[1][3] * q[2][3] * pr->q_p->x
        + q[0][2] * q[1][2] * q[2][3] * pr->q_p->z2
        + q[0][3] * q[1][0] * q[2][3] * pr->q_p->x
        + q[0][3] * q[1][1] * q[2][1] * pr->q_p->y2
        + q[0][3] * q[1][1] * q[2][3] * pr->q_p->y
        + q[0][2] * q[1][3] * q[2][2] * pr->q_p->z2
        + q[0][1] * q[1][3] * q[2][1] * pr->q_p->y2
        + q[0][1] * q[1][3] * q[2][3] * pr->q_p->y
        + q[0][2] * q[1][2] * q[2][2] * pr->q_p->z3
        + q[0][3] * q[1][3] * q[2][0] * pr->q_p->x
        + q[0][2] * q[1][3] * q[2][3] * pr->q_p->z
        + q[0][3] * q[1][0] * q[2][0] * pr->q_p->x2
        + q[0][3] * q[1][3] * q[2][3] * pr->q_p->mu
        + q[0][3] * q[1][3] * q[2][2] * pr->q_p->z
        + q[0][3] * q[1][3] * q[2][1] * pr->q_p->y
        + q[0][3] * q[1][2] * q[2][2] * pr->q_p->z2
        + q[0][0] * q[1][2] * q[2][3] * pr->q_p->xz
        + q[0][0] * q[1][3] * q[2][1] * pr->q_p->xy
        + q[0][0] * q[1][3] * q[2][2] * pr->q_p->xz
        + q[0][1] * q[1][0] * q[2][0] * pr->q_p->x2y
        + q[0][1] * q[1][0] * q[2][1] * pr->q_p->xy2
        + q[0][2] * q[1][0] * q[2][1] * pr->q_p->xyz
        + q[0][2] * q[1][0] * q[2][2] * pr->q_p->xz2
        + q[0][3] * q[1][0] * q[2][1] * pr->q_p->xy
        + q[0][3] * q[1][0] * q[2][2] * pr->q_p->xz
        + q[0][3] * q[1][1] * q[2][0] * pr->q_p->xy
        + q[0][3] * q[1][1] * q[2][2] * pr->q_p->yz
        + q[0][3] * q[1][2] * q[2][0] * pr->q_p->xz
        + q[0][3] * q[1][2] * q[2][1] * pr->q_p->yz
        + q[0][2] * q[1][0] * q[2][3] * pr->q_p->xz
        + q[0][2] * q[1][1] * q[2][0] * pr->q_p->xyz
        + q[0][2] * q[1][1] * q[2][1] * pr->q_p->y2z
        + q[0][2] * q[1][1] * q[2][2] * pr->q_p->yz2
        + q[0][2] * q[1][1] * q[2][3] * pr->q_p->yz
        + q[0][2] * q[1][2] * q[2][0] * pr->q_p->xz2
        + q[0][2] * q[1][2] * q[2][1] * pr->q_p->yz2
        + q[0][2] * q[1][3] * q[2][0] * pr->q_p->xz
        + q[0][2] * q[1][3] * q[2][1] * pr->q_p->yz
        + q[0][2] * q[1][0] * q[2][0] * pr->q_p->x2z
        - pr->p_p->xyz;



    Mat B = A.inv();
    for(int i = 0; i<4; ++i)
        for(int j = 0; j < 4; ++j){
            q[i][j] = B.at<double>(i,j);
        }



    fi[19] = q[0][0] * pr->p_p->x + q[0][1] * pr->p_p->y + q[0][2] * pr->p_p->z + q[0][3] * pr->p_p->mu - pr->ieqr[0][0];
    fi[20] = pow(q[0][0], 2.0) * pr->p_p->x2 + 2 * q[0][0] * q[0][1] * pr->p_p->xy
        + 2 * q[0][0] * q[0][2] * pr->p_p->xz
        + 2 * q[0][0] * q[0][3] * pr->p_p->x
        + pow(q[0][1], 2.0) * pr->p_p->y2
        + 2 * q[0][1] * q[0][2] * pr->p_p->yz
        + 2 * q[0][1] * q[0][3] * pr->p_p->y
        + pow(q[0][2], 2.0) * pr->p_p->z2
        + 2 * q[0][2] * q[0][3] * pr->p_p->z
        + pow(q[0][3], 2.0) * pr->p_p->mu
        - pr->ieqr[1][0];

    //...

    fi[37] = q[0][0] * q[1][0] * q[2][1] * pr->p_p->x2y
        + q[0][1] * q[1][0] * q[2][3] * pr->p_p->xy
        + q[0][1] * q[1][1] * q[2][0] * pr->p_p->xy2
        + q[0][1] * q[1][1] * q[2][2] * pr->p_p->y2z
        + q[0][1] * q[1][2] * q[2][0] * pr->p_p->xyz
        + q[0][1] * q[1][2] * q[2][3] * pr->p_p->yz
        + q[0][1] * q[1][3] * q[2][0] * pr->p_p->xy
        + q[0][1] * q[1][3] * q[2][2] * pr->p_p->yz
        + q[0][0] * q[1][1] * q[2][3] * pr->p_p->xy
        + q[0][1] * q[1][2] * q[2][1] * pr->p_p->y2z
        + q[0][1] * q[1][2] * q[2][2] * pr->p_p->yz2
        + q[0][1] * q[1][0] * q[2][2] * pr->p_p->xyz
        + q[0][0] * q[1][0] * q[2][2] * pr->p_p->x2z
        + q[0][0] * q[1][1] * q[2][0] * pr->p_p->x2y
        + q[0][0] * q[1][1] * q[2][1] * pr->p_p->xy2
        + q[0][0] * q[1][1] * q[2][2] * pr->p_p->xyz
        + q[0][0] * q[1][2] * q[2][0] * pr->p_p->x2z
        + q[0][0] * q[1][2] * q[2][1] * pr->p_p->xyz
        + q[0][0] * q[1][2] * q[2][2] * pr->p_p->xz2
        + q[0][1] * q[1][1] * q[2][3] * pr->p_p->y2
        + q[0][3] * q[1][2] * q[2][3] * pr->p_p->z
        + q[0][1] * q[1][1] * q[2][1] * pr->p_p->y3
        + q[0][0] * q[1][0] * q[2][0] * pr->p_p->x3
        + q[0][0] * q[1][0] * q[2][3] * pr->p_p->x2
        + q[0][0] * q[1][3] * q[2][0] * pr->p_p->x2
        + q[0][0] * q[1][3] * q[2][3] * pr->p_p->x
        + q[0][2] * q[1][2] * q[2][3] * pr->p_p->z2
        + q[0][3] * q[1][0] * q[2][3] * pr->p_p->x
        + q[0][3] * q[1][1] * q[2][1] * pr->p_p->y2
        + q[0][3] * q[1][1] * q[2][3] * pr->p_p->y
        + q[0][2] * q[1][3] * q[2][2] * pr->p_p->z2
        + q[0][1] * q[1][3] * q[2][1] * pr->p_p->y2
        + q[0][1] * q[1][3] * q[2][3] * pr->p_p->y
        + q[0][2] * q[1][2] * q[2][2] * pr->p_p->z3
        + q[0][3] * q[1][3] * q[2][0] * pr->p_p->x
        + q[0][2] * q[1][3] * q[2][3] * pr->p_p->z
        + q[0][3] * q[1][0] * q[2][0] * pr->p_p->x2
        + q[0][3] * q[1][3] * q[2][3] * pr->p_p->mu
        + q[0][3] * q[1][3] * q[2][2] * pr->p_p->z
        + q[0][3] * q[1][3] * q[2][1] * pr->p_p->y
        + q[0][3] * q[1][2] * q[2][2] * pr->p_p->z2
        + q[0][0] * q[1][2] * q[2][3] * pr->p_p->xz
        + q[0][0] * q[1][3] * q[2][1] * pr->p_p->xy
        + q[0][0] * q[1][3] * q[2][2] * pr->p_p->xz
        + q[0][1] * q[1][0] * q[2][0] * pr->p_p->x2y
        + q[0][1] * q[1][0] * q[2][1] * pr->p_p->xy2
        + q[0][2] * q[1][0] * q[2][1] * pr->p_p->xyz
        + q[0][2] * q[1][0] * q[2][2] * pr->p_p->xz2
        + q[0][3] * q[1][0] * q[2][1] * pr->p_p->xy
        + q[0][3] * q[1][0] * q[2][2] * pr->p_p->xz
        + q[0][3] * q[1][1] * q[2][0] * pr->p_p->xy
        + q[0][3] * q[1][1] * q[2][2] * pr->p_p->yz
        + q[0][3] * q[1][2] * q[2][0] * pr->p_p->xz
        + q[0][3] * q[1][2] * q[2][1] * pr->p_p->yz
        + q[0][2] * q[1][0] * q[2][3] * pr->p_p->xz
        + q[0][2] * q[1][1] * q[2][0] * pr->p_p->xyz
        + q[0][2] * q[1][1] * q[2][1] * pr->p_p->y2z
        + q[0][2] * q[1][1] * q[2][2] * pr->p_p->yz2
        + q[0][2] * q[1][1] * q[2][3] * pr->p_p->yz
        + q[0][2] * q[1][2] * q[2][0] * pr->p_p->xz2
        + q[0][2] * q[1][2] * q[2][1] * pr->p_p->yz2
        + q[0][2] * q[1][3] * q[2][0] * pr->p_p->xz
        + q[0][2] * q[1][3] * q[2][1] * pr->p_p->yz
        + q[0][2] * q[1][0] * q[2][0] * pr->p_p->x2z
        - pr->q_p->xyz;

}

Thanks for your help

Author:  Sergey.Bochkanov [ Sun Jan 01, 2012 12:34 pm ]
Post subject:  Re: segfault in minlmresults

Your code accesses fi[37], but LM optimizer expects that there are only 12 functions (you have passed 12, not 38, when creating optimizer object).

Author:  entee [ Sun Jan 01, 2012 3:51 pm ]
Post subject:  Re: segfault in minlmresults

I've 12 parameter, but I've 38 function.
So I need "minlmcreatev(38 ...)"

Thank you

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/