int main(int /*argc*/, char** /*argv*/) { typedef gnash::geometry::SnappingRanges2d<int> Ranges; typedef gnash::geometry::Range2d<int> Bounds; string filename = string(TGTDIR) + string("/") + string(INPUT_FILENAME); MovieTester tester(filename); gnash::LogFile& dbglogfile = gnash::LogFile::getDefaultInstance(); dbglogfile.setVerbosity(1); // Colors we'll use during the test rgba red(255,0,0,255); rgba white(255,255,255,255); // Ranges we'll use during the test Range2d<int> redRange1(100,300,160,360); Range2d<int> redRange2(130,330,190,390); Range2d<int> leftRange(20,300,80,390); Range2d<int> rightRange(200,300,260,390); Ranges invalidated; MovieClip* root = tester.getRootMovie(); assert(root); // FRAME 1 (start) check_equals(root->get_frame_count(), 4); check_equals(root->getPlayState(), MovieClip::PLAYSTATE_PLAY); check_equals(root->get_current_frame(), 0); check_equals(root->getDisplayList().size(), 1); // dejagnu clip invalidated = tester.getInvalidatedRanges(); check( invalidated.contains(76, 4) ); // the "-xtrace enabled-" label... tester.advance(); // FRAME 2, place DisplayObject invalidated = tester.getInvalidatedRanges(); check_equals(root->getPlayState(), MovieClip::PLAYSTATE_PLAY); check_equals(root->get_current_frame(), 1); check_equals(root->getDisplayList().size(), 2); // dejagnu + red square // check invalidated bounds contain the red square at (100,300 - 160,360) check( invalidated.contains(redRange1) ); // check that we have a red square at (100,300 - 160,360) check_pixel(104, 304, 2, red, 2); // UL check_pixel(156, 304, 2, red, 2); // UR check_pixel(156, 356, 2, red, 2); // LL check_pixel(104, 356, 2, red, 2); // LR // and nothing around it... check_pixel( 96, 330, 2, white, 2); // Left check_pixel(164, 330, 2, white, 2); // Right check_pixel(130, 296, 2, white, 2); // Top check_pixel(130, 364, 2, white, 2); // Bottom tester.advance(); // FRAME 3, replace DisplayObject invalidated = tester.getInvalidatedRanges(); check_equals(root->getPlayState(), MovieClip::PLAYSTATE_PLAY); check_equals(root->get_current_frame(), 2); check_equals(root->getDisplayList().size(), 2); // dejagnu + red square // check invalidated bounds to contain: // - the red square (moved) // - the red square (original) // check( invalidated.contains(redRange1) ); check( invalidated.contains(redRange2) ); // but not the area on the right, nor on the left check( ! invalidated.contains(rightRange) ); check( ! invalidated.contains(leftRange) ); // check that we have a red square at (130,330 - 190,390) check_pixel(134, 334, 2, red, 2); // UL check_pixel(186, 334, 2, red, 2); // UR check_pixel(186, 386, 2, red, 2); // LL check_pixel(134, 386, 2, red, 2); // LR // and nothing around it... check_pixel(126, 360, 2, white, 2); // Left check_pixel(194, 360, 2, white, 2); // Right check_pixel(160, 326, 2, white, 2); // Top check_pixel(160, 394, 2, white, 2); // Bottom tester.advance(); // FRAME 4, jump to frame 2 and stop invalidated = tester.getInvalidatedRanges(); check_equals(root->getPlayState(), MovieClip::PLAYSTATE_STOP); check_equals(root->get_current_frame(), 1); check_equals(root->getDisplayList().size(), 2); // dejagnu + red square // check invalidated bounds to contain: // - the red square (moved) // - the red square (original) // check( invalidated.contains(redRange1) ); check( invalidated.contains(redRange2) ); // but not the area on the right, nor on the left xcheck( ! invalidated.contains(rightRange) ); xcheck( ! invalidated.contains(leftRange) ); // check that we have a red square at (100,300 - 160,360) check_pixel(104, 304, 2, red, 2); // UL check_pixel(156, 304, 2, red, 2); // UR check_pixel(156, 356, 2, red, 2); // LL check_pixel(104, 356, 2, red, 2); // LR // and nothing around it... check_pixel( 96, 330, 2, white, 2); // Left check_pixel(164, 330, 2, white, 2); // Right check_pixel(130, 296, 2, white, 2); // Top check_pixel(130, 364, 2, white, 2); // Bottom }
void DOMCharacterDataImpl::deleteData(const DOMNode *node, XMLSize_t offset, XMLSize_t count) { if (castToNodeImpl(node)->isReadOnly()) throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMCharacterDataImplMemoryManager); // Note: the C++ XMLCh * operation throws the correct DOMExceptions // when parameter values are bad. // XMLSize_t len = this->fDataBuf->getLen(); if (offset > len) throw DOMException(DOMException::INDEX_SIZE_ERR, 0, GetDOMCharacterDataImplMemoryManager); // Cap the value of delLength to avoid trouble with overflows // in the following length computations. if (count > len) count = len; // If the length of data to be deleted would extend off the end // of the string, cut it back to stop at the end of string. if (offset + count >= len) count = len - offset; XMLSize_t newLen = len - count; XMLCh* newString; XMLCh temp[4096]; if (newLen >= 4095) newString = (XMLCh*) XMLPlatformUtils::fgMemoryManager->allocate ( (newLen+1) * sizeof(XMLCh) );//new XMLCh[newLen+1]; else newString = temp; XMLString::copyNString(newString, fDataBuf->getRawBuffer(), offset); XMLString::copyString(newString+offset, fDataBuf->getRawBuffer()+offset+count); fDataBuf->set(newString); if (newLen >= 4095) XMLPlatformUtils::fgMemoryManager->deallocate(newString);//delete[] newString; // We don't delete the old string (doesn't work), or alter // the old string (may be shared) // It just hangs around, possibly orphaned. DOMDocumentImpl *doc = (DOMDocumentImpl *)node->getOwnerDocument(); if (doc != 0) { Ranges* ranges = doc->getRanges(); if (ranges != 0) { XMLSize_t sz = ranges->size(); if (sz != 0) { for (XMLSize_t i =0; i<sz; i++) { ranges->elementAt(i)->updateRangeForDeletedText( (DOMNode*)node, offset, count); } } } } }
Parfactor* readParfactor (YAP_Term pfTerm) { // read dist id unsigned distId = YAP_IntOfTerm (YAP_ArgOfTerm (1, pfTerm)); // read the ranges Ranges ranges; YAP_Term rangeList = YAP_ArgOfTerm (3, pfTerm); while (rangeList != YAP_TermNil()) { unsigned range = (unsigned) YAP_IntOfTerm (YAP_HeadOfTerm (rangeList)); ranges.push_back (range); rangeList = YAP_TailOfTerm (rangeList); } // read parametric random vars ProbFormulas formulas; unsigned count = 0; unordered_map<YAP_Term, LogVar> lvMap; YAP_Term pvList = YAP_ArgOfTerm (2, pfTerm); while (pvList != YAP_TermNil()) { YAP_Term formulaTerm = YAP_HeadOfTerm (pvList); if (YAP_IsAtomTerm (formulaTerm)) { string name ((char*) YAP_AtomName (YAP_AtomOfTerm (formulaTerm))); Symbol functor = LiftedUtils::getSymbol (name); formulas.push_back (ProbFormula (functor, ranges[count])); } else { LogVars logVars; YAP_Functor yapFunctor = YAP_FunctorOfTerm (formulaTerm); string name ((char*) YAP_AtomName (YAP_NameOfFunctor (yapFunctor))); Symbol functor = LiftedUtils::getSymbol (name); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, formulaTerm); unordered_map<YAP_Term, LogVar>::iterator it = lvMap.find (ti); if (it != lvMap.end()) { logVars.push_back (it->second); } else { unsigned newLv = lvMap.size(); lvMap[ti] = newLv; logVars.push_back (newLv); } } formulas.push_back (ProbFormula (functor, logVars, ranges[count])); } count ++; pvList = YAP_TailOfTerm (pvList); } // read the parameters const Params& params = readParameters (YAP_ArgOfTerm (4, pfTerm)); // read the constraint Tuples tuples; if (lvMap.size() >= 1) { YAP_Term tupleList = YAP_ArgOfTerm (5, pfTerm); while (tupleList != YAP_TermNil()) { YAP_Term term = YAP_HeadOfTerm (tupleList); assert (YAP_IsApplTerm (term)); YAP_Functor yapFunctor = YAP_FunctorOfTerm (term); unsigned arity = (unsigned) YAP_ArityOfFunctor (yapFunctor); assert (lvMap.size() == arity); Tuple tuple (arity); for (unsigned i = 1; i <= arity; i++) { YAP_Term ti = YAP_ArgOfTerm (i, term); if (YAP_IsAtomTerm (ti) == false) { cerr << "error: constraint has free variables" << endl; abort(); } string name ((char*) YAP_AtomName (YAP_AtomOfTerm (ti))); tuple[i - 1] = LiftedUtils::getSymbol (name); } tuples.push_back (tuple); tupleList = YAP_TailOfTerm (tupleList); } } return new Parfactor (formulas, params, tuples, distId); }
DOMNode *XPathDocumentImpl::insertBefore(DOMNode *newChild, DOMNode *refChild) { // if the newChild is a documenttype node created from domimplementation, set the ownerDoc first if ((newChild->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE) && !newChild->getOwnerDocument()) ((DOMDocumentTypeImpl*)newChild)->setOwnerDocument(this); if(newChild==NULL) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, getMemoryManager()); DOMNodeImpl *thisNodeImpl = castToNodeImpl(this); if (thisNodeImpl->isReadOnly()) throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, getMemoryManager()); DOMNode* thisNode = castToNode(&fParent); if (newChild->getOwnerDocument() != thisNode) throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0, getMemoryManager()); // refChild must in fact be a child of this node (or 0) if (refChild!=0 && refChild->getParentNode() != thisNode) throw DOMException(DOMException::NOT_FOUND_ERR,0, getMemoryManager()); // if the new node has to be placed before itself, we don't have to do anything // (even worse, we would crash if we continue, as we assume they are two distinct nodes) if (refChild!=0 && newChild->isSameNode(refChild)) return newChild; if (newChild->getNodeType() == DOMNode::DOCUMENT_FRAGMENT_NODE) { // SLOW BUT SAFE: We could insert the whole subtree without // juggling so many next/previous pointers. (Wipe out the // parent's child-list, patch the parent pointers, set the // ends of the list.) But we know some subclasses have special- // case behavior they add to insertBefore(), so we don't risk it. // This approch also takes fewer bytecodes. while(newChild->hasChildNodes()) // Move insertBefore(newChild->getFirstChild(),refChild); } else { DOMNode *oldparent=newChild->getParentNode(); if(oldparent!=0) oldparent->removeChild(newChild); // Attach up castToNodeImpl(newChild)->fOwnerNode = thisNode; castToNodeImpl(newChild)->isOwned(true); // Attach before and after // Note: fFirstChild.previousSibling == lastChild!! if (fParent.fFirstChild == 0) { // this our first and only child fParent.fFirstChild = newChild; castToNodeImpl(newChild)->isFirstChild(true); // castToChildImpl(newChild)->previousSibling = newChild; DOMChildNode *newChild_ci = castToChildImpl(newChild); newChild_ci->previousSibling = newChild; } else { if (refChild == 0) { // this is an append DOMNode *lastChild = castToChildImpl(fParent.fFirstChild)->previousSibling; castToChildImpl(lastChild)->nextSibling = newChild; castToChildImpl(newChild)->previousSibling = lastChild; castToChildImpl(fParent.fFirstChild)->previousSibling = newChild; } else { // this is an insert if (refChild == fParent.fFirstChild) { // at the head of the list castToNodeImpl(fParent.fFirstChild)->isFirstChild(false); castToChildImpl(newChild)->nextSibling = fParent.fFirstChild; castToChildImpl(newChild)->previousSibling = castToChildImpl(fParent.fFirstChild)->previousSibling; castToChildImpl(fParent.fFirstChild)->previousSibling = newChild; fParent.fFirstChild = newChild; castToNodeImpl(newChild)->isFirstChild(true); } else { // somewhere in the middle DOMNode *prev = castToChildImpl(refChild)->previousSibling; castToChildImpl(newChild)->nextSibling = refChild; castToChildImpl(prev)->nextSibling = newChild; castToChildImpl(refChild)->previousSibling = newChild; castToChildImpl(newChild)->previousSibling = prev; } } } } changed(); Ranges* ranges = getRanges(); if ( ranges != 0) { XMLSize_t sz = ranges->size(); if (sz != 0) { for (XMLSize_t i =0; i<sz; i++) { ranges->elementAt(i)->updateRangeForInsertedNode(newChild); } } } // If insert succeeded, cache the kid appropriately if(newChild->getNodeType() == DOMNode::ELEMENT_NODE) fMyDocElement=(DOMElement *)newChild; else if(newChild->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE) fMyDocType=(DOMDocumentType *)newChild; return newChild; }
DOMNode *DOMParentNode::insertBefore(DOMNode *newChild, DOMNode *refChild) { DOMNodeImpl *thisNodeImpl = castToNodeImpl(this); if (thisNodeImpl->isReadOnly()) throw DOMException(DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMParentNodeMemoryManager); if (newChild->getOwnerDocument() != fOwnerDocument) throw DOMException(DOMException::WRONG_DOCUMENT_ERR, 0, GetDOMParentNodeMemoryManager); // Prevent cycles in the tree //only need to do this if the node has children if(newChild->hasChildNodes()) { bool treeSafe=true; for(DOMNode *a=castToNode(this)->getParentNode(); treeSafe && a!=0; a=a->getParentNode()) treeSafe=(newChild!=a); if(!treeSafe) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); } // refChild must in fact be a child of this node (or 0) if (refChild!=0 && refChild->getParentNode() != castToNode(this)) throw DOMException(DOMException::NOT_FOUND_ERR,0, GetDOMParentNodeMemoryManager); // if the new node has to be placed before itself, we don't have to do anything // (even worse, we would crash if we continue, as we assume they are two distinct nodes) if (refChild!=0 && newChild->isSameNode(refChild)) return newChild; if (newChild->getNodeType() == DOMNode::DOCUMENT_FRAGMENT_NODE) { // SLOW BUT SAFE: We could insert the whole subtree without // juggling so many next/previous pointers. (Wipe out the // parent's child-list, patch the parent pointers, set the // ends of the list.) But we know some subclasses have special- // case behavior they add to insertBefore(), so we don't risk it. // This approch also takes fewer bytecodes. // NOTE: If one of the children is not a legal child of this // node, throw HIERARCHY_REQUEST_ERR before _any_ of the children // have been transferred. (Alternative behaviors would be to // reparent up to the first failure point or reparent all those // which are acceptable to the target node, neither of which is // as robust. PR-DOM-0818 isn't entirely clear on which it // recommends????? // No need to check kids for right-document; if they weren't, // they wouldn't be kids of that DocFrag. for(DOMNode *kid=newChild->getFirstChild(); // Prescan kid!=0; kid=kid->getNextSibling()) { if (!DOMDocumentImpl::isKidOK(castToNode(this), kid)) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); } while(newChild->hasChildNodes()) // Move insertBefore(newChild->getFirstChild(),refChild); } else if (!DOMDocumentImpl::isKidOK(castToNode(this), newChild)) throw DOMException(DOMException::HIERARCHY_REQUEST_ERR,0, GetDOMParentNodeMemoryManager); else { DOMNode *oldparent=newChild->getParentNode(); if(oldparent!=0) oldparent->removeChild(newChild); // Attach up castToNodeImpl(newChild)->fOwnerNode = castToNode(this); castToNodeImpl(newChild)->isOwned(true); // Attach before and after // Note: fFirstChild.previousSibling == lastChild!! if (fFirstChild == 0) { // this our first and only child fFirstChild = newChild; castToNodeImpl(newChild)->isFirstChild(true); // castToChildImpl(newChild)->previousSibling = newChild; DOMChildNode *newChild_ci = castToChildImpl(newChild); newChild_ci->previousSibling = newChild; } else { if (refChild == 0) { // this is an append DOMNode *lastChild = castToChildImpl(fFirstChild)->previousSibling; castToChildImpl(lastChild)->nextSibling = newChild; castToChildImpl(newChild)->previousSibling = lastChild; castToChildImpl(fFirstChild)->previousSibling = newChild; } else { // this is an insert if (refChild == fFirstChild) { // at the head of the list castToNodeImpl(fFirstChild)->isFirstChild(false); castToChildImpl(newChild)->nextSibling = fFirstChild; castToChildImpl(newChild)->previousSibling = castToChildImpl(fFirstChild)->previousSibling; castToChildImpl(fFirstChild)->previousSibling = newChild; fFirstChild = newChild; castToNodeImpl(newChild)->isFirstChild(true); } else { // somewhere in the middle DOMNode *prev = castToChildImpl(refChild)->previousSibling; castToChildImpl(newChild)->nextSibling = refChild; castToChildImpl(prev)->nextSibling = newChild; castToChildImpl(refChild)->previousSibling = newChild; castToChildImpl(newChild)->previousSibling = prev; } } } } changed(); if (this->getOwnerDocument() != 0) { Ranges* ranges = ((DOMDocumentImpl *)this->getOwnerDocument())->getRanges(); if ( ranges != 0) { XMLSize_t sz = ranges->size(); if (sz != 0) { for (XMLSize_t i =0; i<sz; i++) { ranges->elementAt(i)->updateRangeForInsertedNode(newChild); } } } } return newChild; }
DOMNode *DOMParentNode::removeChild(DOMNode *oldChild) { if (castToNodeImpl(this)->isReadOnly()) throw DOMException( DOMException::NO_MODIFICATION_ALLOWED_ERR, 0, GetDOMParentNodeMemoryManager); if (oldChild == 0 || oldChild->getParentNode() != castToNode(this)) throw DOMException(DOMException::NOT_FOUND_ERR, 0, GetDOMParentNodeMemoryManager); if (this->getOwnerDocument() != 0 ) { //notify iterators NodeIterators* nodeIterators = ((DOMDocumentImpl *)this->getOwnerDocument())->getNodeIterators(); if (nodeIterators != 0) { XMLSize_t sz = nodeIterators->size(); if (sz != 0) { for (XMLSize_t i =0; i<sz; i++) { if (nodeIterators->elementAt(i) != 0) nodeIterators->elementAt(i)->removeNode(oldChild); } } } //fix other ranges for change before deleting the node Ranges* ranges = ((DOMDocumentImpl *)this->getOwnerDocument())->getRanges(); if (ranges != 0) { XMLSize_t sz = ranges->size(); if (sz != 0) { for (XMLSize_t i =0; i<sz; i++) { if (ranges->elementAt(i) != 0) ranges->elementAt(i)->updateRangeForDeletedNode(oldChild); } } } } // Patch linked list around oldChild // Note: lastChild == fFirstChild->previousSibling if (oldChild == fFirstChild) { // removing first child castToNodeImpl(oldChild)->isFirstChild(false); fFirstChild = castToChildImpl(oldChild)->nextSibling; if (fFirstChild != 0) { castToNodeImpl(fFirstChild)->isFirstChild(true); castToChildImpl(fFirstChild)->previousSibling = castToChildImpl(oldChild)->previousSibling; } } else { DOMNode *prev = castToChildImpl(oldChild)->previousSibling; DOMNode *next = castToChildImpl(oldChild)->nextSibling; castToChildImpl(prev)->nextSibling = next; if (next == 0) { // removing last child castToChildImpl(fFirstChild)->previousSibling = prev; } else { // removing some other child in the middle castToChildImpl(next)->previousSibling = prev; } } // Remove oldChild's references to tree castToNodeImpl(oldChild)->fOwnerNode = fOwnerDocument; castToNodeImpl(oldChild)->isOwned(false); castToChildImpl(oldChild)->nextSibling = 0; castToChildImpl(oldChild)->previousSibling = 0; changed(); return oldChild; }
virtual void SetUp() { unsigned int num_constraints = 3; unsigned int num_joints = 7; true_constraints.resize(num_constraints, num_joints); false_constraints.resize(num_constraints, num_joints); std::vector<double> task_values; Ranges true_cmd, false_cmd; true_cmd.resize(num_constraints); false_cmd.resize(num_constraints); for(unsigned int i=0; i<num_constraints; i++) { true_cmd.pos_lo(i) = -1.0; true_cmd.pos_hi(i) = 2.5; task_values.push_back(0.25); false_cmd.pos_lo(i) = -1.0; false_cmd.pos_hi(i) = 2.5; } true_constraints.setTaskValues(task_values); task_values[0] = (0.0); task_values[1] = (-2.0); task_values[2] = (5.5); false_constraints.setTaskValues(task_values); true_constraints.setCommands(true_cmd); false_constraints.setCommands(false_cmd); Feature pan, bottle; pan.name = "pan"; pan.pos = KDL::Vector(0.0, 0.0, 0.0); pan.dir = KDL::Vector(0.0, 0.0, 1.0); pan.contact_dir = KDL::Vector(1.0, 0.0, 0.0); bottle.name = "bottle"; bottle.pos = KDL::Vector(0.0, 0.0, 0.0); bottle.dir = KDL::Vector(0.0, 0.0, 1.0); bottle.contact_dir = KDL::Vector(1.0, 0.0, 0.0); Constraint c1, c2, c3; c1.name = "height of bottle over pan"; c1.setFunction("height"); c1.tool_feature = bottle; c1.object_feature = pan; c2.name = "distance of bottle over pan"; c2.setFunction("distance"); c2.tool_feature = bottle; c2.object_feature = pan; c3.name = "bottle upright"; c3.setFunction("perpendicular"); c3.tool_feature = bottle; c3.object_feature = pan; constraints.resize(3, num_joints); std::vector<Constraint> constraint_vector; constraint_vector.push_back(c1); constraint_vector.push_back(c2); constraint_vector.push_back(c3); constraints.setConstraints(constraint_vector); constraints.setObjectPose(KDL::Frame(KDL::Rotation::RotZ(M_PI/2.0), KDL::Vector(1.0, 1.0, 0.75))); Ranges cmd; cmd.resize(3); // height cmd.weight(0) = 1.0; cmd.pos_lo(0) = 0.1; cmd.pos_hi(0) = 2.0; // distance cmd.weight(1) = 1.0; cmd.pos_lo(1) = 0.0; cmd.pos_hi(1) = 0.1; // upright cmd.weight(2) = 1.0; cmd.pos_lo(2) = 0.95; cmd.pos_hi(2) = 1.2; constraints.setCommands(cmd); }
void EnPhrasalVerb(const Phrase &source, int revision, ostream &out) { Ranges ranges; // find ranges to label for (int start = 0; start < source.size(); ++start) { size_t end = std::numeric_limits<size_t>::max(); if (IsA(source, start, 0, 0, "ask asked asking")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "back backed backing")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "blow blown blew")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "break broke broken")) { end = Found(source, start, 0, "down up in"); } else if (IsA(source, start, 0, 0, "bring brought bringing")) { end = Found(source, start, 0, "down up in"); } else if (IsA(source, start, 0, 0, "call called calling")) { end = Found(source, start, 0, "back up off"); } else if (IsA(source, start, 0, 0, "check checked checking")) { end = Found(source, start, 0, "out in"); } else if (IsA(source, start, 0, 0, "cheer cheered cheering")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "clean cleaned cleaning")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "cross crossed crossing")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "cut cutting")) { end = Found(source, start, 0, "down off out"); } else if (IsA(source, start, 0, 0, "do did done")) { end = Found(source, start, 0, "over up"); } else if (IsA(source, start, 0, 0, "drop dropped dropping")) { end = Found(source, start, 0, "off"); } else if (IsA(source, start, 0, 0, "figure figured figuring")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "fill filled filling")) { end = Found(source, start, 0, "in out up"); } else if (IsA(source, start, 0, 0, "find found finding")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "get got getting gotten")) { end = Found(source, start, 0, "across over back"); } else if (IsA(source, start, 0, 0, "give given gave giving")) { end = Found(source, start, 0, "away back out up"); } else if (IsA(source, start, 0, 0, "hand handed handing")) { end = Found(source, start, 0, "down in over"); } else if (IsA(source, start, 0, 0, "hold held holding")) { end = Found(source, start, 0, "back up"); } else if (IsA(source, start, 0, 0, "keep kept keeping")) { end = Found(source, start, 0, "from up"); } else if (IsA(source, start, 0, 0, "let letting")) { end = Found(source, start, 0, "down in"); } else if (IsA(source, start, 0, 0, "look looked looking")) { end = Found(source, start, 0, "over up"); } else if (IsA(source, start, 0, 0, "make made making")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "mix mixed mixing")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "pass passed passing")) { end = Found(source, start, 0, "out up"); } else if (IsA(source, start, 0, 0, "pay payed paying")) { end = Found(source, start, 0, "back"); } else if (IsA(source, start, 0, 0, "pick picked picking")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "point pointed pointing")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "put putting")) { end = Found(source, start, 0, "down off out together on"); } else if (IsA(source, start, 0, 0, "send sending")) { end = Found(source, start, 0, "back"); } else if (IsA(source, start, 0, 0, "set setting")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "sort sorted sorting")) { end = Found(source, start, 0, "out"); } else if (IsA(source, start, 0, 0, "switch switched switching")) { end = Found(source, start, 0, "off on"); } else if (IsA(source, start, 0, 0, "take took taking")) { end = Found(source, start, 0, "apart back off out"); } else if (IsA(source, start, 0, 0, "tear torn tearing")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "think thought thinking")) { end = Found(source, start, 0, "over"); } else if (IsA(source, start, 0, 0, "thrown threw thrown throwing")) { end = Found(source, start, 0, "away"); } else if (IsA(source, start, 0, 0, "turn turned turning")) { end = Found(source, start, 0, "down off on"); } else if (IsA(source, start, 0, 0, "try tried trying")) { end = Found(source, start, 0, "on out"); } else if (IsA(source, start, 0, 0, "use used using")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "warm warmed warming")) { end = Found(source, start, 0, "up"); } else if (IsA(source, start, 0, 0, "work worked working")) { end = Found(source, start, 0, "out"); } // found range to label if (end != std::numeric_limits<size_t>::max() && end > start + 1) { bool add = true; if (revision == 1 && Exist(source, start + 1, end - 1, 1, "VB VBD VBG VBN VBP VBZ")) { // there's a verb in between add = false; } if (add) { Range range(start + 1, end - 1, "reorder-label"); ranges.push_back(range); } } } OutputWithLabels(source, ranges, out); }
void write_int(Properties &properties, int nbits, int val) { assert(properties.size() == range.size()); FinalCompoundSymbolChances<BitChance,bits> &chances = find_leaf(properties); coder.write_int(chances, nbits, val); }
int read_int(Properties &properties, int nbits) { assert(properties.size() == range.size()); FinalCompoundSymbolChances<BitChance,bits> &chances = find_leaf(properties); return coder.read_int(chances, nbits); }
void write_int(Properties &properties, int min, int max, int val) { if (min == max) { assert(val==min); return; } assert(properties.size() == range.size()); FinalCompoundSymbolChances<BitChance,bits> &chances = find_leaf(properties); coder.write_int(chances, min, max, val); }
int read_int(Properties &properties, int min, int max) { if (min == max) { return min; } assert(properties.size() == range.size()); FinalCompoundSymbolChances<BitChance,bits> &chances = find_leaf(properties); return coder.read_int(chances, min, max); }
int main(int argc, char* argv[]) { #ifdef USE_GOOGLE_PROFILER char *profileFileName = getenv("CPUPROFILE"); if (profileFileName != NULL) { ProfilerStart(profileFileName); } else { ProfilerStart("google_profile.txt"); } #endif // Register inputs and outputs. string samFileName, refFileName, outFileName; CommandLineParser clp; clp.RegisterStringOption("file.sam", &samFileName, "Input SAM file."); clp.RegisterStringOption("reference.fasta", &refFileName, "Reference used to generate reads."); clp.RegisterStringOption("out.sam", &outFileName, "Output SAM file."); clp.RegisterPreviousFlagsAsHidden(); // Register filter criteria options. int minAlnLength = 50; float minPctSimilarity = 70, minPctAccuracy = 70; string hitPolicyStr = "randombest"; bool useScoreCutoff = false; int scoreCutoff = INF_INT; int scoreSignInt = -1; RegisterFilterOptions(clp, minAlnLength, minPctSimilarity, minPctAccuracy, hitPolicyStr, useScoreCutoff, scoreSignInt, scoreCutoff); int seed = 1; clp.RegisterIntOption("seed", &seed, "(1) Seed for random number generator.\n" "If seed is 0, then use current time as seed.", CommandLineParser::Integer); string holeNumberStr; Ranges holeNumberRanges; clp.RegisterStringOption("holeNumbers", &holeNumberStr, "A string of comma-delimited hole number ranges to output hits, " "such as '1,2,10-12'. " "This requires hit titles to be in SMRT read title format."); bool parseSmrtTitle = false; clp.RegisterFlagOption("smrtTitle", &parseSmrtTitle, "Use this option when filtering alignments generated by " "programs other than blasr, e.g. bwa-sw or gmap. " " Parse read coordinates from the SMRT read title. " "The title is in the format /name/hole/coordinates, where" " coordinates are in the format \\d+_\\d+, and represent " "the interval of the read that was aligned."); /* This experimental option can be useful for metagenomics, in which case * there are hundreds of sequences in the target, of which many titles are * long and may contain white spaces (e.g., ' ', '\t'). * In order to save disc space and avoid the (possibly) none unique mapping * between full and short reference names, one may call blasr with * -titleTable option to represent all target sequences in the output * by their indices in the title table.*/ string titleTableName = ""; clp.RegisterStringOption("titleTable", &titleTableName, "Use this experimental option when filtering alignments generated by " "blasr with -titleTable titleTableName, in which case " "reference titles in SAM are represented by their " "indices (e.g., 0, 1, 2, ...) in the title table."); string adapterGffFileName = ""; clp.RegisterStringOption("filterAdapterOnly", &adapterGffFileName, "Use this option to remove reads which can only map to adapters " "specified in the GFF file."); bool verbose = false; clp.RegisterFlagOption("v", &verbose, "Be verbose."); clp.SetExamples( "Because SAM has optional tags that have different meanings" " in different programs, careful usage is required in order " "to have proper output. The \"xs\" tag in bwa-sw is used to " "show the suboptimal score, but in PacBio SAM (blasr) it is " "defined as the start in the query sequence of the alignment.\n" "When \"-smrtTitle\" is specified, the xs tag is ignored, but " "when it is not specified, the coordinates given by the xs and " "xe tags are used to define the interval of a read that is " "aligned. The CIGAR string is relative to this interval."); clp.ParseCommandLine(argc, argv); // Set random number seed. if (seed == 0) { srand(time(NULL)); } else { srand(seed); } scoreSign = (scoreSignInt == -1)?ScoreSign::NEGATIVE:ScoreSign::POSITIVE; Score s(static_cast<float>(scoreCutoff), scoreSign); FilterCriteria filterCriteria(minAlnLength, minPctSimilarity, minPctAccuracy, true, s); filterCriteria.Verbose(verbose); HitPolicy hitPolicy(hitPolicyStr, scoreSign); string errMsg; if (not filterCriteria.MakeSane(errMsg)) { cout << errMsg << endl; exit(1); } // Parse hole number ranges. if (holeNumberStr.size() != 0) { if (not holeNumberRanges.setRanges(holeNumberStr)) { cout << "Could not parse hole number ranges: " << holeNumberStr << "." << endl; exit(1); } } // Open output file. ostream * outFilePtr = &cout; ofstream outFileStrm; if (outFileName != "") { CrucialOpen(outFileName, outFileStrm, std::ios::out); outFilePtr = &outFileStrm; } GFFFile adapterGffFile; if (adapterGffFileName != "") adapterGffFile.ReadAll(adapterGffFileName); SAMReader<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> samReader; FASTAReader fastaReader; // // Initialize samReader and fastaReader. // samReader.Initialize(samFileName); fastaReader.Initialize(refFileName); // // Configure the file log. // string command; CommandLineParser::CommandLineToString(argc, argv, command); string log = "Filter sam hits."; string program = "samFilter"; string versionString = VERSION; AppendPerforceChangelist(PERFORCE_VERSION_STRING, versionString); // // Read necessary input. // vector<FASTASequence> references; fastaReader.ReadAllSequences(references); // If the SAM file is generated by blasr with -titleTable, // then references in the SAM are represented by // their corresponding indices in the title table. // In that case, we need to convert reference titles in fasta file // to their corresponding indices in the title table, such that // references in both SAM and fasta files are represented // by title table indices and therefore can match. if (titleTableName != "") { ConvertTitlesToTitleTableIndices(references, titleTableName); } AlignmentSet<SAMFullReferenceSequence, SAMReadGroup, SAMAlignment> alignmentSet; vector<string> allHeaders = samReader.ReadHeader(alignmentSet); // Process SAM Header. string commandLineString; clp.CommandLineToString(argc, argv, commandLineString); allHeaders.push_back("@PG\tID:SAMFILTER\tVN:" + versionString + \ "\tCL:" + program + " " + commandLineString); for (int i = 0; i < allHeaders.size(); i++) { outFileStrm << allHeaders[i] << endl; } // // The order of references in vector<FASTASequence> references and // AlignmentSet<, , >alignmentSet.references can be different. // Rearrange alignmentSet.references such that they are ordered in // exactly the same way as vector<FASTASequence> references. // alignmentSet.RearrangeReferences(references); // Map reference name obtained from SAM file to indices map<string, int> refNameToIndex; for (int i = 0; i < references.size(); i++) { string refName = alignmentSet.references[i].GetSequenceName(); refNameToIndex[refName] = i; } // // Store the alignments. // SAMAlignment samAlignment; int alignIndex = 0; // // For 150K, each chip produces about 300M sequences // (not including quality values and etc.). // Let's assume that the sam file and reference data can // fit in the memory. // Need to scale for larger sequal data in the future. // vector<SAMAlignment> allSAMAlignments; while (samReader.GetNextAlignment(samAlignment)) { if (samAlignment.rName == "*") { continue; } if (parseSmrtTitle and holeNumberStr.size() != 0) { string movieName; int thisHoleNumber; if (not ParsePBIReadName(samAlignment.qName, movieName, thisHoleNumber)) { cout << "ERROR, could not parse SMRT title: " << samAlignment.qName << "." << endl; exit(1); } if (not holeNumberRanges.contains(UInt(thisHoleNumber))) { if (verbose) cout << thisHoleNumber << " is not in range." << endl; continue; } } if (samAlignment.cigar.find('P') != string::npos) { cout << "WARNING. Could not process SAM record with 'P' in " << "its cigar string." << endl; continue; } vector<AlignmentCandidate<> > convertedAlignments; SAMAlignmentsToCandidates(samAlignment, references, refNameToIndex, convertedAlignments, parseSmrtTitle, false); if (convertedAlignments.size() > 1) { cout << "WARNING. Ignore multiple segments." << endl; continue; } for (int i = 0; i < 1; i++) { AlignmentCandidate<> & alignment = convertedAlignments[i]; //score func does not matter DistanceMatrixScoreFunction<DNASequence, DNASequence> distFunc; ComputeAlignmentStats(alignment, alignment.qAlignedSeq.seq, alignment.tAlignedSeq.seq, distFunc); // Check whether this alignment can only map to adapters in // the adapter GFF file. if (adapterGffFileName != "" and CheckAdapterOnly(adapterGffFile, alignment, refNameToIndex)) { if (verbose) cout << alignment.qName << " filter adapter only." << endl; continue; } // Assign score to samAlignment. samAlignment.score = samAlignment.as; if (not filterCriteria.Satisfy(static_cast<AlignmentCandidate<> *>(&alignment))) { continue; } allSAMAlignments.push_back( samAlignment ); alignment.FreeSubsequences(); } ++alignIndex; } // Sort all SAM alignments by qName, score and target position. sort(allSAMAlignments.begin(), allSAMAlignments.end(), byQNameScoreTStart); unsigned int groupBegin = 0; unsigned int groupEnd = -1; vector<SAMAlignment> filteredSAMAlignments; while(groupBegin < allSAMAlignments.size()) { // Get the next group of SAM alignments which have the same qName // from allSAMAlignments[groupBegin ... groupEnd) GetNextSAMAlignmentGroup(allSAMAlignments, groupBegin, groupEnd); vector<unsigned int> hitIndices = ApplyHitPolicy( hitPolicy, allSAMAlignments, groupBegin, groupEnd); for(unsigned int i = 0; i < hitIndices.size(); i++) { filteredSAMAlignments.push_back(allSAMAlignments[hitIndices[i]]); } groupBegin = groupEnd; } // Sort all SAM alignments by reference name and query name sort(filteredSAMAlignments.begin(), filteredSAMAlignments.end(), byRNameQName); for(unsigned int i = 0; i < filteredSAMAlignments.size(); i++) { filteredSAMAlignments[i].PrintSAMAlignment(outFileStrm); } if (outFileName != "") { outFileStrm.close(); } #ifdef USE_GOOGLE_PROFILER ProfilerStop(); #endif return 0; }