function [x,options] = seminf(fun, ntheta, x0, options, vlb, vub, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10) 
%SEMINF Solves semi-infinite constrained optimization problems.
%	SEMINF solves problems of the form:
%
%		min { f(x) | g(x)<=0 | phi(x,w)<=0 | vlb<=x<=vub }
%          	 x
%	for all w in an interval. 
%
%	X=SEMINF('FUN',N,X0) starts at X0 and finds minimum to the function
%	constrained by N semi-infinite constraints in FUN (usually an M-file: FUN.M).
%	The function 'FUN' should return two arguments: a scalar value of the 
%	function to be minimized, F, a matrix of constraints, G,  and  N
%	semi-infinite constraints evaluated over an interval, PHI1, PHI2, ..: 
%	[F,G,PHI1,PHI2,...,PHIN,S]=FUN(X,S). 
%	F is minimized such that G < zeros(G), PHI1 < zeros(PHI1), ...
%	S is a recommended sampling interval which may or may not be used. 
%
%	X=SEMINF('FUN',N,X,OPTIONS) allows a vector of optional parameters to 
%	be defined. For more information type HELP FOPTIONS.
%	
%	X=SEMINF('FUN',N,X,OPTIONS,VLB,VUB) defines a set of lower and upper
%	bounds on the design variables, X, so that the solution is always in 
%	the range VLB < X < VUB. 
%	
%	Copyright (c) 1990 by the MathWorks, Inc.
%	Andy Grace 7-9-90.

%
%	X=SEMINF('FUN',N,X,OPTIONS,VLB,VUB,P1,P2,..) allows
%	coefficients, P1, P2, ... to be passed directly to FUN:
%	[...]=FUN(X,S,P1,P2,...). Empty arguments ([]) are ignored.


if nargin < 4, options=[]; end
if nargin < 5, vlb=[]; end
if nargin < 6, vub=[]; end
options = foptions(options);
options(7) = 5; 

fun2  =  '[f, g';
for i=1:ntheta
	fun2 = [fun2, ',t',int2str(i)];
end
fun2 = [fun2, ', s]=', fun '(x, s'];
for i=1:nargin - 6
                fun2 = [fun2,',P',int2str(i)];
end
fun2 = [fun2, ');'];

evalstr = [ '[f,g,NPOINT,NEWLAMBDA,OLDLAMBDA,LOLD,s] = semifun(x,LAMBDA,NEWLAMBDA,OLDLAMBDA, POINT, '''' ',fun2, ' '''',',int2str(ntheta),',FLAG,s'];
for i=1:nargin - 6
	evalstr = [evalstr, ',P', int2str(i)];
end
evalstr = [evalstr, ');'];

evalstr2 = ['[x,options] = constr('' ',evalstr,' '',x0,options,vlb,vub,[]'];
for i=1:nargin - 6
	evalstr2 = [evalstr2, ',P', int2str(i)];
end
evalstr2 = [evalstr2, ');'];

eval(evalstr2)
