Exemple #1
0
        private ValueCandidate(NumDataColumn column, Arr <ISymbolInfo> symbolInfos)
        {
            Name = column.Name;

            ElementCandidates = Array(
                new ElementCandidate(column.Name, column.Data.ToArr(), symbolInfos)
                );
        }
Exemple #2
0
        internal bool Propose(
            NumDataColumn independentData,
            Arr <NumDataColumn> outputData,
            out IterationState iterationState
            )
        {
            RequireTrue(_currentIteration >= 0);
            RequireTrue(_currentIteration == 0 || !IsNaN(_currentLogLikelihood));
            RequireFalse(IsComplete);

            double proposedLogLikelihood;

            try
            {
                proposedLogLikelihood = GetProposalLogLikelihood(
                    independentData,
                    outputData
                    );
            }
            catch (Exception ex)
            {
                FaultChain(ex);
                iterationState = default;
                return(false);
            }

            ProcessCurrentProposal(proposedLogLikelihood); // M-H + bookkeeping (parameters)

            var currentChainDataRow = _chainData.Rows[_currentIteration];

            var indexNextModelParameter = _currentIteration == 0
        ? NOT_FOUND
        : _modelParameters.FindIndex(
                mp => IsNaN(currentChainDataRow.Field <double>(ToAcceptColumnName(mp.Name)))
                );

            var isIterationComplete = indexNextModelParameter.IsntFound();

            if (isIterationComplete)
            {
                StorePosterior();                // model outputs collected
            }
            var isLastIteration = (_currentIteration + 1) == _iterations;

            if (isIterationComplete && isLastIteration)
            {
                ++_currentIteration;
                var currentValues = _modelParameters
                                    .Select(mp => (mp.Name, Value: currentChainDataRow.Field <double>(mp.Name)))
                                    .ToArr();
                iterationState = (_currentIteration, currentValues, default);
                return(false);
            }

            if (isIterationComplete)
            {
                UpdateModelOutputs(); // M-H + bookkeeping (error models)

                var doAdjustForAcceptRate =
                    !IsNaN(_targetAcceptRate) &&
                    _currentIteration > _burnIn &&
                    _currentIteration % ACCEPT_RATE_ADJUST_INTERVAL == 0;

                if (doAdjustForAcceptRate)
                {
                    AdjustForAcceptRate();
                }

                // done - advance and initialize next iteration using current
                ++_currentIteration;
                indexNextModelParameter = 0;
                var nextChainDataRow = _chainData.Rows[_currentIteration];
                _modelParameters.Iter(
                    mp => nextChainDataRow[mp.Name] = currentChainDataRow[mp.Name]
                    );
                _modelParameters.Iter(
                    mp => nextChainDataRow[ToLLColumnName(mp.Name)] = currentChainDataRow[ToLLColumnName(mp.Name)]
                    );
                currentChainDataRow = nextChainDataRow;
            }

            _currentProposal = _modelParameters[indexNextModelParameter].GetProposal();

            var proposedValues = _modelParameters
                                 .Select(mp => (
                                             mp.Name,
                                             Value: mp.Name == _currentProposal.Name
            ? _currentProposal.Value
            : currentChainDataRow.Field <double>(mp.Name)
                                             )
                                         )
                                 .ToArr();

            if (isIterationComplete) // meaning was completed...
            {
                // ...so include update for client
                var currentValues = _modelParameters
                                    .Select(mp => (mp.Name, Value: currentChainDataRow.Field <double>(mp.Name)))
                                    .ToArr();
                iterationState = (_currentIteration, currentValues, proposedValues);
                return(true);
            }

            iterationState = (_currentIteration, default, proposedValues);