# forum.alglib.net

ALGLIB forum
 It is currently Fri Oct 18, 2019 1:13 am

 All times are UTC

### Forum rules

1. This forum can be used for discussion of both ALGLIB-related and general numerical analysis questions
2. This forum is English-only - postings in other languages will be removed.

 Page 1 of 1 [ 10 posts ]
 Print view Previous topic | Next topic
Author Message
 Post subject: optimization with alglibPosted: Fri Jun 03, 2011 2:15 am

Joined: Fri Jun 03, 2011 2:05 am
Posts: 2
Hello,
At the beginning I would like to thank you very much for creating such a great library.
I’m trying to implement Zhang camera calibration algorithm and I would like to use your IMPROVED LEVENBERG-MARQUARDT METHOD FOR NON-LINEAR LEAST SQUARES OPTIMIZATION. But I don’t know if I’m using it right.

I need to minimize the sum of squares of such equation F = m – H*M

What gives me 3 equations:

x, y, z - are coordinates of projected point m on image
X, Y, Z - are coordinates of equivalent point M on the model.

a, b, c, d, e, f, g, h, j – are parameters of homography H that have to be optimized to make the difference in function F as small as possible.

I’m interested in using just function vector.
Should the function1_fvec look like this? (z and Z are always 1 so I made the equations shorter).

public static void function1_fvec(double[,] point_m, double[,] H, double[,] point_M, double[] fi, object obj)
{
fi[0] = point_m[0, 0] - H[0, 0] * point_M[0, 0] - H[0, 1] * point_M[1, 0] - H[0, 2];
fi[1] = point_m[1, 0] - H[1, 0] * point_M[0, 0] - H[1, 1] * point_M[1, 0] - H[1, 2];
fi[2] = point_m[2, 0] - H[2, 0] * point_M[0, 0] - H[2, 1] * point_M[1, 0] - H[2, 2];
}

Let say I have 100points m and 100pts M. Can you please show me steps of how can I minimize
sumOfSq = (m1 – HM1)^2 + (m2 – HM2)^2 + … + (m100 – HM100) ?

PS. let say the startin point is p=(400,300)
PS2. I read http://www.alglib.net/translator/man/ma ... _minlm_d_v
But it doesn’t work and I don’t know where is a mistake..

Top

 Post subject: Re: optimization with alglibPosted: Fri Jun 03, 2011 6:57 am

Joined: Fri May 07, 2010 7:06 am
Posts: 849
You have to reformulate your problem in order to fit into Levenberg-Marquardt framework.

LM optimizer accepts function1_fvec(double[] x, double[] fi, object obj), where:
x is a vector of parameters (it should contain H)
fi is a vector of functions - you have 3*100 functions
obj is additional parameter passed to the function - you should use it to pass list of points (m and M) to your function

Your code should be something like:

Code:
public static void function1_fvec(double[] x, double[] fi, object obj)
{
my_special_type my_object = (my_special_type)obj;
for(i=0; i<100; i++)
{
fi[3*i+0] = my_object.point_m[0, i] - x[0] * my_object.point_M[0, i] - x[1] * my_object.point_M[1, i] - x[2] * my_object.point_M[2, i];
fi[3*i+1] = my_object.point_m[1, i] - x[3] * my_object.point_M[0, i] - x[4] * my_object.point_M[1, i] - x[5] * my_object.point_M[2, i];
fi[3*i+2] = my_object.point_m[2, i] - x[6] * my_object.point_M[0, i] - x[7] * my_object.point_M[1, i] - x[8] * my_object.point_M[2, i];
}
}

where my_special_type is a class used to pass data to function1_fvec. It has only two fields - point_m and point_M, and its only purpose is to be container for these data. This object is passed as one of the parameters to minlmoptimize().

Top

 Post subject: Re: optimization with alglibPosted: Sun Jun 05, 2011 4:27 pm

Joined: Fri Jun 03, 2011 2:05 am
Posts: 2
It's alive! IT'S ALIVE!! <sinister laugh> :)

Thank you so much! It works really good and gives me well optimized parameters.

But to be 100% sure that I’m squeezing out the best performance I would like to ask you a few control questions:

1.What is the DiffStep in minlmcreatev()?

2. minlmsetscale the is the damping factor ? in http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm#Choice_of_damping_parameter ?

Top

 Post subject: Re: optimization with alglibPosted: Mon Jun 06, 2011 7:15 am

Joined: Fri May 07, 2010 7:06 am
Posts: 849
1. DiffStep should be some small value - small when compared to the scale of the variables (see below). It can be 0.001 or something else.
2. minlmsetscale() influences: stopping criteria, damping parameter (algorithm will use different per-variable damping), numerical differentiation. You should calculate "most typical magnitude" of your variables and use it as parameter to minlmsetscale().

Top

 Post subject: Re: optimization with alglibPosted: Fri Aug 05, 2011 2:37 pm

Joined: Fri Aug 05, 2011 2:25 pm
Posts: 2
Sergey.Bochkanov wrote:
You have to reformulate your problem in order to fit into Levenberg-Marquardt framework.

LM optimizer accepts function1_fvec(double[] x, double[] fi, object obj), where:
x is a vector of parameters (it should contain H)
fi is a vector of functions - you have 3*100 functions
obj is additional parameter passed to the function - you should use it to pass list of points (m and M) to your function

Your code should be something like:

Code:
public static void function1_fvec(double[] x, double[] fi, object obj)
{
my_special_type my_object = (my_special_type)obj;
for(i=0; i<100; i++)
{
fi[3*i+0] = my_object.point_m[0, i] - x[0] * my_object.point_M[0, i] - x[1] * my_object.point_M[1, i] - x[2] * my_object.point_M[2, i];
fi[3*i+1] = my_object.point_m[1, i] - x[3] * my_object.point_M[0, i] - x[4] * my_object.point_M[1, i] - x[5] * my_object.point_M[2, i];
fi[3*i+2] = my_object.point_m[2, i] - x[6] * my_object.point_M[0, i] - x[7] * my_object.point_M[1, i] - x[8] * my_object.point_M[2, i];
}
}

where my_special_type is a class used to pass data to function1_fvec. It has only two fields - point_m and point_M, and its only purpose is to be container for these data. This object is passed as one of the parameters to minlmoptimize().

Good afternoon, I have a similar problem: I must pass additional data to the function, but minlmoptimize doesn't accept data pointer as one of parameters, nor if I pass a dummy void* pointer. I've seen there are five instances of overloaded function minlmoptimize, but none of them seems to accept that pointer.
I attach here the code that gives me the error. It's just the modified example of LM optimization without gradient:

Code:
void *ptr;//dummy pointer

double epsg = 0.0000000001;
double epsf = 0;
double epsx = 0;
ae_int_t maxits = 0;
minlmstate state;
minlmreport rep;
minlmcreatev(m, X, 0.0001, state);
minlmsetcond(state, epsg, epsf, epsx, maxits);
minlmoptimize(state, function1_fvec, rep, ptr);//here I have a compiler error; it just accepts  minlmoptimize(state, function1_fvec);
minlmresults(state, X, rep);

printf("%d\n", int(rep.terminationtype)); // EXPECTED: 4
printf("%s\n", X.tostring(2).c_str()); // EXPECTED: [-3,+3]
return 0;

What should I do in order to pass my additional data structure (not reported here)?
I forgot to mention I'm using C/C++ in Visual Studio 2010.

Thank you for the attention.

Have a nice day.

Top

 Post subject: Re: optimization with alglibPosted: Sat Aug 06, 2011 6:18 pm

Joined: Fri May 07, 2010 7:06 am
Posts: 849
Code:
minlmoptimize(state, function1_fvec, rep, ptr);//here I have a compiler error; it just accepts  minlmoptimize(state, function1_fvec);

You've incorrectly specified third parameter. It should be either pointer to callback used for reports (function which is called after each iteration). Code below should work:

Code:
minlmoptimize(state, function1_fvec, my_delegate_for_iteration_reports, ptr);

Top

 Post subject: Re: optimization with alglibPosted: Sat Aug 06, 2011 8:31 pm

Joined: Fri Aug 05, 2011 2:25 pm
Posts: 2
Thank you for the answer, anyway I solved in a "brute force" way: while I was analyzing the code I saw that in the header both report pointer and additional data one were set to NULL, so I just had to remove "NULL" from data pointer and pass my data pointer in main method. Everything worked, as in method implementation report and data pointer are supported.

Maybe I'll use your "cleaner" solution in future.
Now I wonder if it's possible to set linear constraints instead of box ones, or even emulate linear constraints through penalities in objective function.

Thank you again.

Sincerely,

Fabio

Top

 Post subject: Re: optimization with alglibPosted: Fri Sep 04, 2015 2:48 pm

Joined: Fri Sep 04, 2015 2:13 pm
Posts: 1
As a new user of ALGLIB, let me add my thanks for your efforts to assemble this comprehensive tool.

I have a problem that is identical to that posted by 157679, which is the first post in this discussion.

Unfortunately, I don't understand the last sentence in your reply: "This object is passed as one of the parameters to minlmoptimize()." I cannot find how to pass any additional parameters to minlmoptimize.

The example code for minlm_d_v works fine in my application (which is in c++), but I would like to use the pointer argument in function1_fvec() to access the arrays m and H for use in the minimization to obtain the coefficients M, using the terminology of the earlier post.

I'm sure this is a trivially simple problem, but the solution has eluded me for more than a day, so I would greatly appreciate your help with it.

Top

 Post subject: Re: optimization with alglibPosted: Thu Feb 28, 2019 9:44 am

Joined: Thu Feb 28, 2019 4:54 am
Posts: 1
Hello! I have a problem with minlmoptimize function. When call it from main or function like in the example:
...
int main(int argc, char **argv)
{
minlmcreatev(2, x, 0.0001, state);
minlmsetbc(state, bndl, bndu);
minlmsetcond(state, epsx, maxits);

alglib::minlmoptimize(state, function1_fvec);

minlmresults(state, x, rep);
return 0;
}

Everything works great !!!

But calling from class method,

void Inversion_::inversion()
{
minlmcreatev(2, x, 0.0001, state);
minlmsetbc(state, bnd_min, bnd_max);
minlmsetcond(state, epsx, maxits);

alglib::minlmoptimize(state, function1_fvec);
//no instance of overloaded function "alglib::minlmoptimize" matches the argument list
//argument types are: (alglib::minlmstate, void(const alglib::real_1d_array &x, alglib::real_1d_array &fi, void *ptr))

minlmresults(state, x, rep);
}

I get this ... no instance of overloaded function "" matches the argument list

Apparently the pointer in the argument should be redefined or something like this, but i cant understand how. Please, can you help to solve the problem?

class Inversion_
{
real_1d_array x;
real_1d_array bnd_min; // Minimal Pu = 0 pu
real_1d_array bnd_max; // Maximal Pu = 60 pu
double epsx = 0.00001;
ae_int_t maxits = 0;
minlmstate state;
minlmreport rep;
public:
Inversion_();
void inversion();
void function1_fvec(const alglib::real_1d_array &x, alglib::real_1d_array &fi, void *ptr);
};

Top

 Post subject: Re: optimization with alglibPosted: Fri Mar 01, 2019 9:45 am

Joined: Fri May 07, 2010 7:06 am
Posts: 849
Hi!

In C++ class methods are different from "regular functions". You can not pass pointer to class method where regular function is expected.

If you want to pass a class method to ALGLIB, you can write your own "adapter function" which uses ptr parameter to call desired method.

Top

 Display posts from previous: All posts1 day7 days2 weeks1 month3 months6 months1 year Sort by AuthorPost timeSubject AscendingDescending
 Page 1 of 1 [ 10 posts ]

 All times are UTC

#### Who is online

Users browsing this forum: No registered users and 2 guests

 You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot post attachments in this forum

Search for: