Parameter = {
data        = xy    // 测试数据源 data后跟一组可以传递是矩阵变量数据,如果有m组测试数据,且每组测得n种变量,则xy为m*n的矩阵变量,设置为空表示求解非线性方程组,注意求解方程时此参数必须设置为空
varCount   = 4     // 需要求解变量的个数
varType    = 1     // 需要求解变量类型(1为浮点数,0为整数),可以设置数字,可以是矩阵变量,可以是逗号分隔的数据,如果不设置,程序默认所有变量为浮点数
varInital  = 1     // 需要求解变量的初始值,可以设置数字,可以是矩阵变量,可以是以逗号分隔的数据,如果不设置程序自动初始化
varMax     = 10000 // 需要求解变量的最大值,可以设置数字,可以是矩阵变量,可以是以逗号分隔的数据
varMin     = -10000// 需要求解变量的最小值,可以设置数字,可以是矩阵变量,可以是以逗号分隔的数据
varName    = a0    // 这个参数不是必须的,此参数表示计算完毕后优化变量存储到指定名称的矩阵变量里
errorCount = 1     // 误差函数里返回误差的个数
autoDiff   = 1     // 是否采用自动求导,如果为1则是,为0表示否
autoUpdate = 1     // 是否程序自动加法更新,如果此参数为0,程序更新时,采用自定义的Update函数进行更新
solveType  = Grad  // DogLeg, LM, Grad, Adma, Nadam, AMSGrad, Adadelta, GradNoEqu, Fun
Alpha = 6.9        //Adma, Nadam, AMSGrad, Adadelta算法最大学习速率
Beta1 = 0.9        //Adma, Nadam, AMSGrad, Adadelta算法比例参数,一般在0.9左右
Beta2 = 0.99       //Adma, Nadam, AMSGrad, Adadelta算法比例参数,一般在0.9左右
efficError = 1e-16 //一个控制求解效率的误差,一般来说,此值越接近0,求解越慢,精度越高
seedCount  = 90    // 种子数，此数值越大越耗时,但越有可能找到可能的解，此数值最好设置为threadNum的整数倍
randSeed   = 20200118 //一个随机数种子,如果不设置,系统将随机设置
threadNum  = 6     // 求解器的线程数量
sumLoop    = 64    // 循环次数，此值越大，一般越耗时，但求解精度一般可越高
iterLoop   = 1024  // 迭代次数，此值越大，一般越耗时，但求解精度一般可越高
repeatLoop = 16    // 允许多少次可以找不到解，此数值应该小于等于sumLoop，一般地，这个值越接近1，求解速度越快，但精度越低，反之，数值设置越大，求解越慢，精度越高
stopError  = 1e-12 // 满足条件的最小误差和
}

Code = {
Public Sub ErrorFun(  ByRef var() As Double,
			ByRef data() As Double,
			ByRef other As ArrayList,
			ByRef f() As Double)
    '误差函数
    'var为按顺序传递的拟合变量
    'data为实际测试使用数据
    'other存储关键字里定义的额外变量,一般情况没有使用
    'f为返回的误差,如果有m个误差,则a数组大小为m
End Sub
	
Public Sub ErrorJacobi(ByRef var() As Double,
			   ByRef data() As Double,
			   ByRef other As ArrayList,
			   ByRef jacob(,) As Double)
    '误差导数
    'var为按顺序传递的拟合变量
    'data为实际测试使用数据
    'other存储关键字里定义的额外变量,一般情况没有使用
    'jacob为返回的误差的雅克比矩阵,如果误差有m个,变量a的大小为n,返回雅克比为m * n的矩阵
    '当采用自动求导时,忽略本函数
End Sub
	
Public Sub Update(	ByRef var() As Double,
			ByRef dvar() As Double,
			ByRef max() As Double,
			ByRef min() As Double,
			ByRef isint() As Boolean,
			ByRef r As System.Random,
			ByRef var1() As Double)
    '变量加法更新,需要自定义加法更新准则时,可以使用此函数, 一般情况 var1 = var + dvar
    'var为原始值
    'dvar为var对应更新量
    'max为变量最大值
    'min为变量最小值
    'isint当前变量是否为整数
    'r当前随机对象
    'var1更新后的值
End Sub

Public Sub NormVar( ByRef var() As Double,
			ByRef other As ArrayList)
    '每次优化变量更新后,将调用此函数,这里如果对变量有什么要求,可以在这里进行修改
    'var待修改的变量,如果没有修改,不要在本函数下添加任何代码
    'other存储关键字里定义的额外变量,一般情况没有使用
    
End Sub

Public Sub CostFun(  ByRef x As Double,
			ByRef r As Double,
			ByRef dx As Double)
	'定义的代价函数
	'x为输入的误差
	'r为输出误差
	'dx为r对x的导数
	'下面默认以平方为代价函数,如果有其它函数,可以自行定义
	r = x * x
	dx= x + x
End Sub

Public Sub RunStart( ByRef data(,) As Double,
			ByRef other As ArrayList)
	'这个函数在整个程序运行前执行,这里可以对输入数据data以及other进行相应数据设置
End Sub

Public Sub RunEnd(	ByRef optVar() As Double，
			ByRef minError As Double,
			ByRef loopSum As Integer,
			ByRef costTime As Integer,
			ByRef data(,) As Double, 
	  		ByRef other As ArrayList)
	'本函数将在优化结束后进行调用,主要返回一些优化结果
	'optVar为最终优化得到的最佳优化变量值
	'minError为最终优化的最小误差
	'loopSum为最终优化的循环次数
	'costTime为整个优化耗时(ms)
	'data为实际测试使用数据
	'other存储关键字里定义的额外变量,一般情况没有使用
End Sub
	
}