void EnPartCntSample::Init(pdb_setup::Atoms const& atoms, config_setup::Output const& output) { InitVals(output.statistics.settings.hist); if (enableOut) { stepsPerSample = output.state.files.hist.stepsPerHistSample; uint samplesPerFrame = output.statistics.settings.hist.frequency / stepsPerSample + 1; samplesCollectedInFrame = 0; for (uint b = 0; b < BOXES_WITH_U_NB; ++b) { name[b] = GetFName(output.state.files.hist.sampleName, output.state.files.hist.number, output.state.files.hist.letter, b); samplesE[b] = new double [samplesPerFrame]; samplesN[b] = new uint * [var->numKinds]; for (uint k = 0; k < var->numKinds; ++k) { samplesN[b][k] = new uint [samplesPerFrame]; } outF[b].open(name[b].c_str(), std::ofstream::out); } WriteHeader(); } }
void CRusSemStructure::BuildBlackBoxCollocs(long ClauseNo, size_t SetNo) { SetNodeToDeleteFalse(); // идем по всем словосочетаниям, которые нужно построить for (long i=0; i <m_ClauseSetCollocHyps[ClauseNo][SetNo].size(); i++) { const CSemCollocHyp& H = m_ClauseSetCollocHyps[ClauseNo][SetNo][i]; CColloc& Colloc = m_pData->m_RusCollocs[H.m_CollocNo]; if (!Colloc.IsBlackBox) continue; CRusSemNode N; N.m_ClauseNo = ClauseNo; N.SetMainWordNo(-1); bool IsClauseSyntaxTop = false; for (long k=0; k <H.m_Coords.size(); k++) { long NodeNo = FindNodeByWordNo(H.m_Coords[k].m_WordNo, ClauseNo); IsClauseSyntaxTop |= (m_Clauses[ClauseNo].m_ClauseSyntaxTop == NodeNo); assert (NodeNo != -1); assert (m_Nodes[NodeNo].IsPrimitive()); bool bMainItem = (Colloc.m_SemMainWord-1 == H.m_Coords[k].m_CollocItemNo) || ( (k ==0) && (Colloc.m_SemMainWord == -1)); { CRusSemWord W = m_Nodes[NodeNo].m_Words[0]; // adding prepositon for the synthesis and for a better format string Prep = GetPrepOrConjOfNode(m_Nodes[NodeNo]); if (!Prep.empty() && !bMainItem ) W.m_Word = Prep+" "+W.m_Word; N.m_Words.push_back(W); }; // если это главное слово, то нужно изменить характеристики всего словосочетания // если главного слова нет, тогда нужно взять характеристики от первого слова словосочетания if (bMainItem) { N.SetMainWordNo(k); N.SetGrammems ( m_Nodes[NodeNo].m_Words[0].GetAllGrammems() ); string debug = m_pData->GetRusGramTab()->GrammemsToStr( m_Nodes[NodeNo].m_Words[0].GetAllGrammems() ); N.m_GramCodes = m_Nodes[NodeNo].m_GramCodes; N.m_SynReal.m_Preps = m_Nodes[NodeNo].m_SynReal.m_Preps; m_pData->GetPrepsFromArticle (GetRoss(CollocRoss), m_pData->m_RusCollocs[H.m_CollocNo].UnitNo, 0, k, N.m_SynReal.m_Preps); if ( k==0) { N.m_RelOperators=m_Nodes[NodeNo].m_RelOperators; }; }; // удаляем примитивный узел assert (CanBeDeleted(NodeNo)); m_Nodes[NodeNo].m_bToDelete = true;; }; N.AddInterp( CDictUnitInterp(GetRossHolder(CollocRoss), CollocRoss,m_pData->m_RusCollocs[H.m_CollocNo].UnitNo, false,false) ); InitVals(N); long OldNodeNo = FindNodeByWordNo(N.m_Words[N.m_MainWordNo].m_WordNo, ClauseNo); //сохраняю синтаксические отношения, которые былит приписаны OldNodeNo // в виртуальный узел -2 (-1 используется как ошибка) MoveSynRelations(OldNodeNo, -2); //удаляю примитивные узлы, из которых состоит словосочетание, в том числе и OldNodeNo DelNodesToDelete(); // строю новый узел со словосочетанием, куда вошли только что удаленные, // а удалить их нужно было, поскольку функция InsertNode не может добавить узел, который // по словам пересекается с другим существующим уже узлом long nd = InsertNode(N); // теперь вспоминаем синтаксические отношения, приписанные OldNodeNo MoveSynRelations(-2, nd); if (IsClauseSyntaxTop) m_Clauses[ClauseNo].m_ClauseSyntaxTop = nd; }; };