void ViterbiPercentageNode::AddTransition( AbstractViterbiNode* fromNode, double weight) { ZViterbiNode::AddTransition(fromNode, weight); for (const ViterbiPercentagePathItem& pretendent : static_cast<ViterbiPercentageNode*>( fromNode)->pathItems) { ViterbiPercentagePathItem toInsert( pretendent.bestWeight + weight, this, &pretendent); pathItems.insert(toInsert); currentSum += toInsert.expWeight; } // Cut bool shouldCut = pathItems.size() > 0; double cutThreshold = VITERBI_PERCENTAGE_VALUE * this->partitionFunction; while (shouldCut) { auto minElement = pathItems.begin(); double substractedSum = currentSum - minElement->expWeight; if (substractedSum > cutThreshold || pathItems.size() > MAX_NUMBER_OF_PATHS) { currentSum = substractedSum; pathItems.erase(minElement); } else { shouldCut = false; } } }
void ViterbiPercentageNode::Initialize(int i_layer, int i_stateIndex, double initialLogWeight) { ZViterbiNode::Initialize(i_layer, i_stateIndex, initialLogWeight); ViterbiPercentagePathItem toInsert(initialLogWeight, this, 0); pathItems.insert(toInsert); currentSum = this->partitionFunction; }
void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMarker) { ASSERT(newMarker.endOffset() >= newMarker.startOffset()); if (newMarker.endOffset() == newMarker.startOffset()) return; m_possiblyExistingMarkerTypes.add(newMarker.type()); MarkerList* list = m_markers.get(node); if (!list) { list = new MarkerList; list->append(RenderedDocumentMarker(newMarker)); m_markers.set(node, list); } else { RenderedDocumentMarker toInsert(newMarker); size_t numMarkers = list->size(); size_t i; // Iterate over all markers whose start offset is less than or equal to the new marker's. // If one of them is of the same type as the new marker and touches it or intersects with it // (there is at most one), remove it and adjust the new marker's start offset to encompass it. for (i = 0; i < numMarkers; ++i) { DocumentMarker marker = list->at(i); if (marker.startOffset() > toInsert.startOffset()) break; if (marker.type() == toInsert.type() && marker.endOffset() >= toInsert.startOffset()) { toInsert.setStartOffset(marker.startOffset()); list->remove(i); numMarkers--; break; } } size_t j = i; // Iterate over all markers whose end offset is less than or equal to the new marker's, // removing markers of the same type as the new marker which touch it or intersect with it, // adjusting the new marker's end offset to cover them if necessary. while (j < numMarkers) { DocumentMarker marker = list->at(j); if (marker.startOffset() > toInsert.endOffset()) break; if (marker.type() == toInsert.type()) { list->remove(j); if (toInsert.endOffset() <= marker.endOffset()) { toInsert.setEndOffset(marker.endOffset()); break; } numMarkers--; } else j++; } // At this point i points to the node before which we want to insert. list->insert(i, RenderedDocumentMarker(toInsert)); } // repaint the affected node if (node->renderer()) node->renderer()->repaint(); }
LRESULT CFilterEdit::OnPaste(WPARAM, LPARAM) { if (OpenClipboard()) { HANDLE hData = GetClipboardData (CF_TEXT); CString toInsert((const char*)GlobalLock(hData)); GlobalUnlock(hData); CloseClipboard(); // elimate control chars, especially newlines toInsert.Replace(_T('\t'), _T(' ')); // only insert first line toInsert.Replace(_T('\r'), _T('\n')); int pos = 0; toInsert = toInsert.Tokenize(_T("\n"), pos); toInsert.Trim(); // get the current text CString text; GetWindowText(text); // construct the new text int from, to; GetSel(from, to); text.Delete(from, to - from); text.Insert(from, toInsert); from += toInsert.GetLength(); // update & notify controls SetWindowText(text); SetSel(from, from, FALSE); SetModify(TRUE); GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), EN_CHANGE), (LPARAM)GetSafeHwnd()); } return 0; }
void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMarker) { ASSERT(newMarker.endOffset() >= newMarker.startOffset()); if (newMarker.endOffset() == newMarker.startOffset()) return; m_possiblyExistingMarkerTypes.add(newMarker.type()); OwnPtr<MarkerLists>& markers = m_markers.add(node, nullptr).storedValue->value; if (!markers) { markers = adoptPtr(new MarkerLists); markers->grow(DocumentMarker::MarkerTypeIndexesCount); } DocumentMarker::MarkerTypeIndex markerListIndex = MarkerTypeToMarkerIndex(newMarker.type()); if (!markers->at(markerListIndex)) { markers->insert(markerListIndex, adoptPtr(new MarkerList)); } OwnPtr<MarkerList>& list = markers->at(markerListIndex); if (list->isEmpty() || list->last()->endOffset() < newMarker.startOffset()) { list->append(RenderedDocumentMarker::create(newMarker)); } else { DocumentMarker toInsert(newMarker); if (toInsert.type() != DocumentMarker::TextMatch) { mergeOverlapping(list.get(), toInsert); } else { MarkerList::iterator pos = std::lower_bound(list->begin(), list->end(), &toInsert, startsFurther); list->insert(pos - list->begin(), RenderedDocumentMarker::create(toInsert)); } } // repaint the affected node if (node->renderer()) node->renderer()->doNotUseInvalidatePaintForWholeRendererSynchronously(); }
void DocumentMarkerController::addMarker(Node* node, const DocumentMarker& newMarker) { ASSERT(newMarker.endOffset() >= newMarker.startOffset()); if (newMarker.endOffset() == newMarker.startOffset()) return; if (auto* renderer = node->renderer()) { // FIXME: Factor the marker painting code out of InlineTextBox and teach simple line layout to use it. if (is<RenderText>(*renderer)) downcast<RenderText>(*renderer).ensureLineBoxes(); else if (is<RenderBlockFlow>(*renderer)) downcast<RenderBlockFlow>(*renderer).ensureLineBoxes(); } m_possiblyExistingMarkerTypes.add(newMarker.type()); std::unique_ptr<MarkerList>& list = m_markers.add(node, nullptr).iterator->value; if (!list) { list = std::make_unique<MarkerList>(); list->append(RenderedDocumentMarker(newMarker)); #if PLATFORM(IOS) } else if (newMarker.type() == DocumentMarker::DictationPhraseWithAlternatives || newMarker.type() == DocumentMarker::DictationResult) { // We don't merge dictation markers. size_t i; size_t numberOfMarkers = list->size(); for (i = 0; i < numberOfMarkers; ++i) { DocumentMarker marker = list->at(i); if (marker.startOffset() > newMarker.startOffset()) break; } list->insert(i, RenderedDocumentMarker(newMarker)); #endif } else { RenderedDocumentMarker toInsert(newMarker); size_t numMarkers = list->size(); size_t i; // Iterate over all markers whose start offset is less than or equal to the new marker's. // If one of them is of the same type as the new marker and touches it or intersects with it // (there is at most one), remove it and adjust the new marker's start offset to encompass it. for (i = 0; i < numMarkers; ++i) { DocumentMarker marker = list->at(i); if (marker.startOffset() > toInsert.startOffset()) break; if (marker.type() == toInsert.type() && marker.endOffset() >= toInsert.startOffset()) { toInsert.setStartOffset(marker.startOffset()); list->remove(i); numMarkers--; break; } } size_t j = i; // Iterate over all markers whose end offset is less than or equal to the new marker's, // removing markers of the same type as the new marker which touch it or intersect with it, // adjusting the new marker's end offset to cover them if necessary. while (j < numMarkers) { DocumentMarker marker = list->at(j); if (marker.startOffset() > toInsert.endOffset()) break; if (marker.type() == toInsert.type()) { list->remove(j); if (toInsert.endOffset() <= marker.endOffset()) { toInsert.setEndOffset(marker.endOffset()); break; } numMarkers--; } else j++; } // At this point i points to the node before which we want to insert. list->insert(i, RenderedDocumentMarker(toInsert)); } // repaint the affected node if (node->renderer()) node->renderer()->repaint(); }
void insert(const typename t_base::key_type& key, const typename t_base::mapped_type& value) { blub::pair<typename t_base::key_type, typename t_base::mapped_type> toInsert(key, value); t_base::insert(toInsert); }
void Gui::saveAndIncrVersion() { ProjectPtr project = getApp()->getProject(); QString path = project->getProjectPath(); QString name = project->getProjectFilename(); int currentVersion = 0; int positionToInsertVersion; bool mustAppendFileExtension = false; // extension is everything after the last '.' int lastDotPos = name.lastIndexOf( QLatin1Char('.') ); if (lastDotPos == -1) { positionToInsertVersion = name.size(); mustAppendFileExtension = true; } else { //Extract the current version number if any QString versionStr; int i = lastDotPos - 1; while ( i >= 0 && name.at(i).isDigit() ) { versionStr.prepend( name.at(i) ); --i; } ++i; //move back the head to the first digit if ( !versionStr.isEmpty() ) { name.remove( i, versionStr.size() ); --i; //move 1 char backward, if the char is a '_' remove it if ( (i >= 0) && ( name.at(i) == QLatin1Char('_') ) ) { name.remove(i, 1); } currentVersion = versionStr.toInt(); } positionToInsertVersion = i; } //Incr version ++currentVersion; QString newVersionStr = QString::number(currentVersion); //Add enough 0s in the beginning of the version number to have at least 3 digits int nb0s = 3 - newVersionStr.size(); nb0s = std::max(0, nb0s); QString toInsert( QLatin1Char('_') ); for (int c = 0; c < nb0s; ++c) { toInsert.append( QLatin1Char('0') ); } toInsert.append(newVersionStr); if (mustAppendFileExtension) { toInsert.append( QString::fromUtf8("." NATRON_PROJECT_FILE_EXT) ); } if ( positionToInsertVersion >= name.size() ) { name.append(toInsert); } else { name.insert(positionToInsertVersion, toInsert); } project->saveProject(path, name, 0); QString filename = path + QLatin1Char('/') + name; updateRecentFiles(filename); } // Gui::saveAndIncrVersion