/* * traj.c * * * Created by Rakshit on 15/02/06. * Copyright 2006 __MyCompanyName__. All rights reserved. * */ #include "IpStdCInterface.h" #include "assert.h" #include "stdio.h" #include "stdlib.h" #include "math.h" inline Number square(Number x) {return x * x;} /*Declaring functions*/ /* function for evaluating objective function*/ Bool eval_f(Index n, Number* x, Bool new_x,Number* obj_value, UserDataPtr data); /*function for evaluating gradient of objective function*/ Bool eval_grad_f(Index n, Number* x, Bool new_x,Number* grad_f, UserDataPtr data); /*function for evaluating constraint function*/ Bool eval_g(Index n, Number* x, Bool new_x,Index m, Number* g, UserDataPtr data); /*function for evaluating jacobian of Constraint function*/ Bool eval_jac_g(Index n, Number *x, Bool new_x,Index m, Index nele_jac,Index *iRow, Index *jCol, Number *values,UserDataPtr data); /*fucntion for evaluating hessian of the langrangian function*/ Bool eval_h(Index n, Number *x, Bool new_x, Number obj_factor,Index m, Number *lambda, Bool new_lambda,Index nele_hess, Index *iRow, Index *jCol,Number *values, UserDataPtr data); typedef struct { Number a,b,c; Number StartVert[2][3]; Number EndVert[2][3]; }Udata; int main() { Index n=-1; Index m=-1; Number* xu=NULL; Number* xl=NULL; Number* gu=NULL; Number* gl=NULL; IpoptProblem myprob=NULL; enum ApplicationReturnStatus status; Number g,s; UserDataPtr data; Udata *v; Number* x=NULL; Number* multxu=NULL; Number* multxl=NULL; Number obj; Index i; v= (Udata*)malloc(sizeof(Udata)); v->a=1; v->b=1; v->c=1; v->StartVert[0][0]=0; v->StartVert[0][1]=0; v->StartVert[0][2]=0; v->StartVert[1][0]=0; v->StartVert[1][1]=0; v->StartVert[1][2]=0; v->EndVert[0][0]=0; v->EndVert[0][1]=0; v->EndVert[0][2]=0; v->EndVert[1][0]=0; v->EndVert[1][1]=0; v->EndVert[1][2]=0; data=v; /*printf(" data a of v is %f ",((Udata*)data)->a);*/ printf("\n enter the no. of points "); scanf("%d",&n); printf("\n n is %d ",n); /*n=3;*/ xu = (Number*)malloc(sizeof(Number)*3*n); xl = (Number*)malloc(sizeof(Number)*3*n); for(i=0;i<3*n;i++) { xl[i]=-2e19; xu[i]=2e19; } printf("\n enter the upper bounds of constraints G and S "); scanf("%lf %lf",&g,&s); /*g=5; s=5;*/ m=2*n+3; gu = (Number*)malloc(sizeof(Number)*m); gl = (Number*)malloc(sizeof(Number)*m); gl[0]=-2e19; gu[0]=g*g; gl[1]=-2e19; gu[1]=g*g; gl[2]=-2e19; gu[2]=s*s; gl[3]=-2e19; gu[3]=s*s; gl[4]=-2e19;gu[4]=s*s; gl[5]=-2e19;gu[5]=s*s; for(i=0;ia; b=user_data->b; c=user_data->c; *obj_val=-((x[3*(h/2)]*a)+(x[(3*(h/2))+1]*b)+(x[(3*(h/2))+2]*c)); //evaluating Objective Function return TRUE; } Bool eval_grad_f(Index n, Number* x, Bool new_x,Number* grad_f, UserDataPtr data) { Index i,h; Udata *user_data=(Udata *)data; h=n/3; for(i=0;i<3*h;i++) { if(i==3*(h/2)) grad_f[i]=-user_data->a; else if(i==(3*(h/2))+1) grad_f[i]=-user_data->b; else if(i==(3*(h/2))+2) grad_f[i]=-user_data->c; else grad_f[i]=0; } return TRUE; } Bool eval_g(Index n, Number* x, Bool new_x,Index m, Number* g, UserDataPtr data) { Index i,h; Udata *user_data=(Udata *)data; h=n/3; assert(m==2*h+3); /*printf("n is %d ",n);*/ /*for(i=0;i<3*n;i++) { printf("\n values before are %f \n",x[i]); }*/ g[0]=square(x[0]-user_data->StartVert[1][0])+square(x[1]-user_data->StartVert[1][1])+square(x[2]-user_data->StartVert[1][2]); g[1]=square(user_data->EndVert[0][0]-x[3*h-3])+square(user_data->EndVert[0][1]-x[3*h-2])+square(user_data->EndVert[0][2]-x[3*h-1]); g[2]=square(x[3]-2*x[0]+user_data->StartVert[1][0])+square(x[4]-2*x[1]+user_data->StartVert[1][1])+square(x[5]-2*x[2]+user_data->StartVert[1][2]); g[3]=square(user_data->EndVert[0][0]-2*x[3*h-3]+x[3*h-6])+square(user_data->EndVert[0][1]-2*x[3*h-2]+x[3*h-5])+square(user_data->EndVert[0][2]-2*x[3*h-1]+x[3*h-4]); g[4]=square(x[0]-2*user_data->StartVert[1][0]+user_data->StartVert[0][0])+square(x[1]-2*user_data->StartVert[1][1]+user_data->StartVert[0][1])+square(x[2]-2*user_data->StartVert[1][2]+user_data->StartVert[0][2]); g[5]=square(user_data->EndVert[1][0]-2*user_data->EndVert[0][0]+x[3*h-3])+square(user_data->EndVert[1][1]-2*user_data->EndVert[0][1]+x[3*h-2])+square(user_data->EndVert[1][2]-2*user_data->EndVert[0][2]+x[3*h-1]); for(i=0;iStartVert[1][i]); } for(i=0;i<3;i++) { values[i+3]=-2*(user_data->EndVert[0][i]-x[3*h-(3-i)]); } for(i=0;i<3;i++) { values[i+6]=-4*(x[i+3]-2*x[i]+user_data->StartVert[1][i]); } for(i=0;i<3;i++) { values[i+9]=2*(x[i+3]-2*x[i]+user_data->StartVert[1][i]); } for(i=0;i<3;i++) { values[i+12]=2*(user_data->EndVert[0][i]-2*x[3*h-(3-i)]+x[3*h-(6-i)]); } for(i=0;i<3;i++) { values[i+15]=-4*(user_data->EndVert[0][i]-2*x[3*h-(3-i)]+x[3*h-(6-i)]); } for(i=0;i<3;i++) { values[i+18]=2*(x[i]-2*user_data->StartVert[1][i]+user_data->StartVert[0][i]); } for(i=0;i<3;i++) { values[i+21]=2*(user_data->EndVert[1][i]-2*user_data->EndVert[0][i]+x[3*h-(3-i)]); } for(i=0;i<(h-1);i++) { values[24+(6*i)]=-2*(x[3*i+3]-x[3*i]); values[24+(6*i)+1]=-2*(x[3*i+4]-x[3*i+1]); values[24+(6*i)+2]=-2*(x[3*i+5]-x[3*i+2]); values[24+(6*i)+3]=2*(x[3*i+3]-x[3*i]); values[24+(6*i)+4]=2*(x[3*i+4]-x[3*i+1]); values[24+(6*i)+5]=2*(x[3*i+5]-x[3*i+2]); } for(i=0;i