コード例 #1
0
        public void IdentifyComputation()
        {
            //set generic simulator behavior - strategy
            //GenericSimulator.SimulatorBehavior = new MySincSimulatorBehavior2(); //useless - matlab DLL have different static instance
            try
            {
                BroadcastIdentifyStateMessage("Starting calculation ..." + DateTime.Now);
                logger.Log(NLog.LogLevel.Info, "starting calculation ");
                //invoke matlab Identification algorithm - does it use the GenericSimulator instance configured before???
                Class1 class1 = new Class1();
                logger.Log(NLog.LogLevel.Debug, "class1 init");
                //set experiment variables and values
                MWArray v_names = new MWCellArray(new MWCharArray(Enumerable.ToArray(variable_names)));
                MWArray experiment = new MWNumericArray(variable_values);
                //set identification parameters
                MWArray p_names = new MWCellArray(new MWCharArray(Enumerable.ToArray(parameters.Keys)));
                //set worker nodes urls
                //var host = AppHostBase.Instance.Config.ServiceEndpointsMetadataConfig.DefaultMetadataUri;
                //var myrepository = ((AppHostBase) EndpointHost.AppHost).Container.Resolve<WorkersRepository>();
                //MWArray worker_urls = new MWCellArray(new MWCharArray(myrepository.GetByModelName(modelname).Select(x => x.RestUrl).ToArray()));

                MWArray p_val = new MWNumericArray(parameters.Values.Select(parameter => parameter.Value).ToArray());
                MWArray p_min = new MWNumericArray(parameters.Values.Select(parameter => parameter.Min).ToArray());
                MWArray p_max = new MWNumericArray(parameters.Values.Select(parameter => parameter.Max).ToArray());
                MWArray p_is_fixed =
                    new MWLogicalArray(parameters.Values.Select(parameter => !parameter.IsActive).ToArray());
                //calculate identification
                Stopwatch sw = Stopwatch.StartNew();
                if (IAgenerations > 0) //set gaoptions
                {
                    MWArray generations = new MWNumericArray(IAgenerations);
                    MWArray populationsize = new MWNumericArray(IApopulationsize);
                    MWArray tolfun = new MWNumericArray(IAtolfun);
                    class1.identify_gaoptimset(generations, populationsize, tolfun);
                } //otherwise the matlab algorithm has it's own default values
                logger.Log(NLog.LogLevel.Debug, "mwarray init");
                var result = class1.identify_main(experiment, p_names, p_val, p_min, p_max, p_is_fixed, v_names, modelname, masterserviceurl);
                logger.Log(NLog.LogLevel.Debug, "identify_main done");
                sw.Stop();

                /*var fitted_params = result[1];
                var fitted_param_L2Enorm = result[2];
                var fitted_variablevalues = result[3];
                 * */
                //string fittedparams = "";
                //for (int i=1;i < fitted_params.
                //BroadcastIdentifyStateMessage("Elapsed time " + sw.Elapsed.ToString() + " Results: " + result);//fitted_params+" "+fitted_param_L2Enorm+" " + fitted_variablevalues);
                //var myresult = result.ToArray();

                BroadcastIdentifyResult(result.ToArray(),sw.Elapsed,class1.identify_getssq(),class1.identify_getcomputationcycles(),class1.identify_getsimulationtime());

            }
            catch (Exception e)
            {
                //TODO handle matlab exception
                BroadcastIdentifyStateMessage(e.Message+e.StackTrace);
                logger.Log(NLog.LogLevel.Error,"exception during identification "+e.Message+" stacktrace:"+e.StackTrace,e);
                var f = e;//.InnerException;
                while (f.InnerException != null)
                {
                    f = f.InnerException;
                    logger.Log(NLog.LogLevel.Error, "innerexception:" + f.Message + " stacktrace:" + f.StackTrace, f);
                }
            }
            //            StopIdentify();
            FinalizeIdentify();
        }