* usage: optimizer ndim mpts itermax
.control
setplot const
unlet scl
unlet funcval
unlet funcvals
let rtol=0
let ftol=0
let tiny=1e-12
let ndim = $argv[1]
let mpts = $argv[2]

let itermax = $argv[3]
*let itermax = $argv[2]
let mpts = ndim+1
let ptry = vector(ndim)
let y = vector(mpts)
let psum = vector(ndim)
let funcvals = vector(itermax+1)
echo "starting optimization ....."
let cnt=0
init
while cnt lt itermax
	sort
	let rtol=2*(abs(y[ihi])-y[ilo])/(abs(y[ihi])+abs(y[ilo])+ tiny)
	if rtol lt ftol
		let temp = y[0]
		let y[0]=y[ilo]
		let y[ilo]=temp
		break
	end
	let cnt=cnt+1
	amotry -1
	if ytry le y[ilo]
		amotry 2
	else
		if ytry ge y[inhi]
			let ysave=y[ihi]
			amotry 0.5
			if ytry ge ysave
				let m=0
				echo "do multiple contraction................................."
				while m lt mpts
				 	if m ne ilo
						let p[m]=0.5*(p[m]+p[ilo])
						let psum=p[m]
						let ptry=psum
						func
						let y[m]=funcval
					end
					let m=m+1
				end
				cpt_psum
			end
		end
	end
end
setplot const
echo
echo "best funcvalues:"
echo "================"
print y
echo
echo "best points:"
echo "============"
print p
let scl = vector(cnt)
setscale scl
plot funcvals
.endc

