using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;

namespace EvoBoat.EvoAlg
{
    public interface ICloneable<T>
    {
        T Clone();
    }    
    
    public interface IVector<e> : IEnumerable<e>
    {
        int Length { get; }
        e this[int index] { get; set; }
    }

    /// <summary>
    /// specification of a general algorithm
    /// </summary>
    /// <typeparam name="R">output type</typeparam>
    public interface IAlg<P, S, R>
        where P : IProblem<S, R>
        where S : ISolution<R>
    {
        string Name { get; set; }
        P Problem { get; set; }
        int Nfe { get; }
        int Iter { get; }
        int Size { get; set; }
        IEnumerable<S> Pop { get; }
        S Best { get; }
        //void SetParameters(); //参数配置
        void InitPop(); //初始化种群
        void Evolve(); //一次迭代演化
        void Reset(); //重置算法
        S Solve(int iters); //指定最大迭代次数求解问题
        S Solve(int iters, out long time); //指定最大迭代次数求解问题,并输出计算用时
        //ISolution<R> SolveAndWatch(int iters, out long time, out List<double> data, int interval = 1); //指定最大迭代次数求解问题,记录指定间隔的迭代结果,并输出计算用时
        S SolveF(int nfes); //指定最大函数估值次数求解问题
        S SolveF(int nfes, out long time); //指定最大函数估值次数求解问题,并输出计算用时
        //ISolution<R> SolveFAndWatch(int nfes, out long time, out List<double> data, int inteval); //指定最大函数估值次数求解问题,记录指定间隔的迭代结果,并输出计算用时
        //ISolution<R> SolveFAndWatch(int nfes, double th, out long num, out List<double> data, int interval); //指定最大函数估值次数和预期精度求解问题,记录指定间隔的迭代结果,并输出到达预期精度的估值次数

        //List<PropertyInfo> ParameterProperties { get; set; }
    }
}
