#!/usr/bin/perl

use lib 'd:/Programs/Perl/lib';

use strict;
use Sci::Optimize;

my $iPrintLevel = 0;

my $m = 6;
my @v = ([-0.1, -0.1], [-0.1, -0.0], [-0.1, 0.1],
		 [ 0.0, -0.1], [ 0.0, -0.0], [ 0.0, 0.1],
		 [ 0.1, -0.1], [ 0.1, -0.0], [ 0.1, 0.1]
		 );
my @y;
my $ndata = @v;
for(my $i = 0 ; $i < $ndata ; $i++) {
	$y[$i] = &U($v[$i][0], $v[$i][1]);
}

my $Opt = new Optimize;
my ($pCi, $S2) = $Opt->Optimize(
					"lsqLCFunctions", \@v, \@y, $m,
					sub { &Func(@_); },
					$iPrintLevel
					);
print "Optimized at S2=$S2\n";
for(my $i = 0 ; $i < $m ; $i++) {
	print "  a$i=$pCi->[$i]\n";
}

#my $OutFile = "a.csv";
#open(OUT, ">$OutFile") or die "Can not write to [$OutFile].\n";
#	my $yobs = YObs($x);
#	my $ycal = $Opt->YCal($x);
#close(OUT);
exit;

#==============================================
# 
#==============================================
sub Func
{
	my ($idx, $v) = @_;
	if($idx == 0) {
		return 1.0;
	}
	elsif($idx == 1) {
		return $v->[0];
	}
	elsif($idx == 2) {
		return $v->[1];
	}
	elsif($idx == 3) {
		return $v->[0]*$v->[0];
	}
	elsif($idx == 4) {
		return $v->[0]*$v->[1];
	}
	elsif($idx == 5) {
		return $v->[1]*$v->[1];
	}

print "invalid idx=$idx\n";
exit;
}

sub U
{
	my ($x, $y) = @_;
	my $uobs = 1.0 + 0.1 * $x + 0.2 * $y + 1.0 * $x*$x + 0.2 * $x*$y + 0.5 * $y*$y;
	return $uobs;
}
