private ValueCandidate(NumDataColumn column, Arr <ISymbolInfo> symbolInfos) { Name = column.Name; ElementCandidates = Array( new ElementCandidate(column.Name, column.Data.ToArr(), symbolInfos) ); }
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);