void TAO_Notify_EventTypeSeq::intersection (const TAO_Notify_EventTypeSeq& rhs, const TAO_Notify_EventTypeSeq& lhs) { // linear search. TAO_Notify_EventTypeSeq::CONST_ITERATOR rhs_iter (rhs); TAO_Notify_EventType* rhs_event_type; TAO_Notify_EventTypeSeq::CONST_ITERATOR lhs_iter (lhs); TAO_Notify_EventType* lhs_event_type; for (rhs_iter.first (); rhs_iter.next (rhs_event_type); rhs_iter.advance ()) { for (lhs_iter.first (); lhs_iter.next (lhs_event_type); lhs_iter.advance ()) { if (*rhs_event_type == *lhs_event_type) // if both are same add to this object. this->insert (*rhs_event_type); } } }
const std::vector<bool> apply_boolean_opp(const TSeries<TDATE,TDATA1,TSDIM,TSDATABACKEND,DatePolicy>& lhs, const TSeries<TDATE,TDATA2,TSDIM,TSDATABACKEND,DatePolicy>& rhs, opptype opp) { typedef typename Promotion<TDATA1,TDATA2>::ResultT ResultT; std::vector<bool> ans; if(lhs.ncol() != rhs.ncol()) return ans; // find date intersection RangeSpecifier<TDATE,TSDIM> range(lhs.getDates(), rhs.getDates(), lhs.nrow(), rhs.nrow() ); if(!range.getSize()) return ans; // allocate new answer ans.reserve(range.getSize()*lhs.ncol()); std::vector<bool>::iterator ans_data = ans.begin(); TDATA1* lhs_data = lhs.getData(); TDATA2* rhs_data = rhs.getData(); for(TSDIM col = 0; col < lhs.ncol(); col++) { RangeIterator<const TDATA1*, const TSDIM*> lhs_iter(lhs_data, range.getArg1()); RangeIterator<const TDATA2*, const TSDIM*> rhs_iter(rhs_data, range.getArg2()); for(TSDIM i = 0; i < range.getSize(); i++) { ans_data[i] = opp( static_cast<ResultT>(*lhs_iter++), static_cast<ResultT>(*rhs_iter++)); } // increment column ans_data += range.getSize(); lhs_data += lhs.nrow(); rhs_data += rhs.nrow(); } return ans; }
const TSeries<TDATE, typename Promotion<TDATA1,TDATA2>::ResultT,TSDIM,TSDATABACKEND,DatePolicy> apply_opp(const TSeries<TDATE,TDATA1,TSDIM,TSDATABACKEND,DatePolicy>& lhs, const TSeries<TDATE,TDATA2,TSDIM,TSDATABACKEND,DatePolicy>& rhs, opptype opp) { typedef typename Promotion<TDATA1,TDATA2>::ResultT ResultT; if(lhs.ncol() != rhs.ncol()) return TSeries<TDATE,ResultT,TSDIM,TSDATABACKEND,DatePolicy>(); // find date intersection RangeSpecifier<TDATE,TSDIM> range(lhs.getDates(), rhs.getDates(), lhs.nrow(), rhs.nrow() ); if(!range.getSize()) return TSeries<TDATE,ResultT,TSDIM,TSDATABACKEND,DatePolicy>(); // allocate new answer TSeries<TDATE,ResultT,TSDIM,TSDATABACKEND,DatePolicy> ans(range.getSize(),lhs.ncol()); // copy over dates std::copy(range.getDates(),range.getDates()+range.getSize(),ans.getDates()); // set new colnames std::vector<std::string> lhs_cnames = lhs.getColnames(); std::vector<std::string> rhs_cnames = rhs.getColnames(); std::vector<std::string> ans_cnames; if(lhs_cnames==rhs_cnames) { ans_cnames = lhs_cnames; } else { // loop through and combine colnames from lhs and rhs if(lhs_cnames.size() && rhs_cnames.size()) { for(size_t i = 0; i < lhs_cnames.size(); i++) { ans_cnames.push_back( lhs_cnames[i] + rhs_cnames[i] ); } } else { ans_cnames = lhs_cnames.size() ? lhs_cnames : rhs_cnames; } } ans.setColnames(ans_cnames); ResultT* ans_data = ans.getData(); TDATA1* lhs_data = lhs.getData(); TDATA2* rhs_data = rhs.getData(); for(TSDIM col = 0; col < lhs.ncol(); col++) { RangeIterator<const TDATA1*, const TSDIM*> lhs_iter(lhs_data, range.getArg1()); RangeIterator<const TDATA2*, const TSDIM*> rhs_iter(rhs_data, range.getArg2()); for(TSDIM i = 0; i < range.getSize(); i++) { ans_data[i] = opp( static_cast<ResultT>(*lhs_iter++), static_cast<ResultT>(*rhs_iter++)); } // increment column ans_data+= ans.nrow(); lhs_data+= lhs.nrow(); rhs_data+= rhs.nrow(); } return ans; }
inline const TSeries<TDATE,ReturnType,TSDIM,TSDATABACKEND,DatePolicy> window_function(const TSeries<TDATE,TDATA,TSDIM,TSDATABACKEND,DatePolicy>& lhs, const TSeries<TDATE,TDATA,TSDIM,TSDATABACKEND,DatePolicy>& rhs, const size_t window) { TSDIM lhs_ncol = lhs.ncol(); TSDIM rhs_ncol = rhs.ncol(); if(lhs_ncol != rhs_ncol && lhs_ncol != 1 && rhs_ncol != 1) return TSeries<TDATE,ReturnType,TSDIM,TSDATABACKEND,DatePolicy>(); // find date intersection RangeSpecifier<TDATE,TSDIM> range(lhs.getDates(), rhs.getDates(), lhs.nrow(), rhs.nrow() ); if(!range.getSize()) return TSeries<TDATE,ReturnType,TSDIM,TSDATABACKEND,DatePolicy>(); TSDIM ans_ncol = (lhs_ncol > rhs_ncol) ? lhs_ncol : rhs_ncol; // allocate new answer TSDIM ans_nrow = range.getSize() - (window - 1); if(ans_nrow <= 0) return TSeries<TDATE,ReturnType,TSDIM,TSDATABACKEND,DatePolicy>(); TSeries<TDATE,ReturnType,TSDIM,TSDATABACKEND,DatePolicy> ans(ans_nrow, ans_ncol); // copy over dates std::copy(range.getDates() + (window - 1), range.getDates()+range.getSize(), ans.getDates()); // set new colnames std::vector<std::string> lhs_cnames = lhs.getColnames(); std::vector<std::string> rhs_cnames = rhs.getColnames(); std::vector<std::string> ans_cnames; // FIXME: this will take some work to get correct if(lhs_cnames==rhs_cnames) { ans_cnames = lhs_cnames; } else { ans_cnames = lhs_cnames.size() ? lhs_cnames : rhs_cnames; } ans.setColnames(ans_cnames); ReturnType* ans_data = ans.getData(); TDATA* lhs_data = lhs.getData(); TDATA* rhs_data = rhs.getData(); for(TSDIM col = 0; col < lhs.ncol(); col++) { RangeIterator<const TDATA*, const TSDIM*> lhs_iter(lhs_data, range.getArg1()); RangeIterator<const TDATA*, const TSDIM*> rhs_iter(rhs_data, range.getArg2()); windowIntersectionApply<ReturnType,F>::apply(ans_data, lhs_iter, rhs_iter, range.getSize(), window); // increment column ans_data+= ans.nrow(); lhs_data+= lhs.nrow(); rhs_data+= rhs.nrow(); } return ans; }