KstDataObjectPtr KstCPlugin::makeDuplicate(KstDataObjectDataObjectMap& duplicatedMap) { KstCPluginPtr plugin = new KstCPlugin; // use same inputs for (KstVectorMap::ConstIterator iter = _inputVectors.begin(); iter != _inputVectors.end(); ++iter) { plugin->inputVectors().insert(iter.key(), iter.data()); } for (KstScalarMap::ConstIterator iter = _inputScalars.begin(); iter != _inputScalars.end(); ++iter) { plugin->inputScalars().insert(iter.key(), iter.data()); } for (KstStringMap::ConstIterator iter = _inputStrings.begin(); iter != _inputStrings.end(); ++iter) { plugin->inputStrings().insert(iter.key(), iter.data()); } // create new outputs for (KstVectorMap::ConstIterator iter = outputVectors().begin(); iter != outputVectors().end(); ++iter) { KstWriteLocker blockVectorUpdates(&KST::vectorList.lock()); KstVectorPtr v = new KstVector(KstObjectTag(iter.data()->tag().tag() + "'", iter.data()->tag().context()), 0, plugin.data()); // FIXME: unique tag generation plugin->outputVectors().insert(iter.key(), v); } for (KstScalarMap::ConstIterator iter = outputScalars().begin(); iter != outputScalars().end(); ++iter) { KstScalarPtr s = new KstScalar(KstObjectTag(iter.data()->tag().tag() + "'", iter.data()->tag().context()), plugin.data()); // FIXME: unique tag generation plugin->outputScalars().insert(iter.key(), s); } for (KstStringMap::ConstIterator iter = outputStrings().begin(); iter != outputStrings().end(); ++iter) { KstStringPtr s = new KstString(KstObjectTag(iter.data()->tag().tag() + "'", iter.data()->tag().context()), plugin.data()); // FIXME: unique tag generation plugin->outputStrings().insert(iter.key(), s); } // set the same plugin plugin->setPlugin(_plugin); plugin->setTagName(KstObjectTag(tag().tag() + "'", tag().context())); // FIXME: unique tag generation method duplicatedMap.insert(this, KstDataObjectPtr(plugin)); return KstDataObjectPtr(plugin); }
KstDataObjectPtr KstPlugin::makeDuplicate(KstDataObjectDataObjectMap& duplicatedMap) { KstPluginPtr plugin = new KstPlugin; // use same inputs for (KstVectorMap::ConstIterator iter = _inputVectors.begin(); iter != _inputVectors.end(); ++iter) { plugin->inputVectors().insert(iter.key(), iter.data()); } for (KstScalarMap::ConstIterator iter = _inputScalars.begin(); iter != _inputScalars.end(); ++iter) { plugin->inputScalars().insert(iter.key(), iter.data()); } for (KstStringMap::ConstIterator iter = _inputStrings.begin(); iter != _inputStrings.end(); ++iter) { plugin->inputStrings().insert(iter.key(), iter.data()); } // create new outputs for (KstVectorMap::ConstIterator iter = outputVectors().begin(); iter != outputVectors().end(); ++iter) { KstVectorPtr v = new KstVector(iter.data()->tagName() + "'", 0, plugin.data()); plugin->outputVectors().insert(iter.key(), v); KST::addVectorToList(v); } for (KstScalarMap::ConstIterator iter = outputScalars().begin(); iter != outputScalars().end(); ++iter) { KstScalarPtr s = new KstScalar(iter.data()->tagName() + "'", plugin.data()); plugin->outputScalars().insert(iter.key(), s); } for (KstStringMap::ConstIterator iter = outputStrings().begin(); iter != outputStrings().end(); ++iter) { KstStringPtr s = new KstString(iter.data()->tagName() + "'", plugin.data()); plugin->outputStrings().insert(iter.key(), s); } // set the same plugin plugin->setPlugin(_plugin); plugin->setTagName(tagName() + "'"); duplicatedMap.insert(this, KstDataObjectPtr(plugin)); return KstDataObjectPtr(plugin); }
void EventMonitorEntry::replaceDependency(KstDataObjectPtr oldObject, KstDataObjectPtr newObject) { QString newExp = _event; // replace all occurences of outputVectors, outputScalars from oldObject for (KstVectorMap::ConstIterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { const QString oldTag = j.data()->tagName(); const QString newTag = newObject->outputVectors()[j.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } for (KstScalarMap::ConstIterator j = oldObject->outputScalars().begin(); j != oldObject->outputScalars().end(); ++j) { const QString oldTag = j.data()->tagName(); const QString newTag = newObject->outputScalars()[j.key()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } // and dependencies on vector stats for (KstVectorMap::ConstIterator j = oldObject->outputVectors().begin(); j != oldObject->outputVectors().end(); ++j) { const QDict<KstScalar>& scalarMap(newObject->outputVectors()[j.key()]->scalars()); QDictIterator<KstScalar> scalarDictIter(j.data()->scalars()); for (; scalarDictIter.current(); ++scalarDictIter) { const QString oldTag = scalarDictIter.current()->tagName(); const QString newTag = scalarMap[scalarDictIter.currentKey()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } // and dependencies on matrix stats for (KstMatrixMap::ConstIterator j = oldObject->outputMatrices().begin(); j != oldObject->outputMatrices().end(); ++j) { const QDict<KstScalar>& scalarMap(newObject->outputMatrices()[j.key()]->scalars()); QDictIterator<KstScalar> scalarDictIter(j.data()->scalars()); for (; scalarDictIter.current(); ++scalarDictIter) { const QString oldTag = scalarDictIter.current()->tagName(); const QString newTag = scalarMap[scalarDictIter.currentKey()]->tagName(); newExp = newExp.replace("[" + oldTag + "]", "[" + newTag + "]"); } } setEvent(newExp); setDirty(); // events have no _inputVectors }
bool EventMonitorEntry::uses(KstObjectPtr p) const { // check VectorsUsed in addition to _input*'s if (KstVectorPtr vect = kst_cast<KstVector>(p)) { for (KstVectorMap::ConstIterator j = _vectorsUsed.begin(); j != _vectorsUsed.end(); ++j) { if (j.data() == vect) { return true; } } } else if (KstDataObjectPtr obj = kst_cast<KstDataObject>(p) ) { // check all connections from this expression to p for (KstVectorMap::ConstIterator j = obj->outputVectors().begin(); j != obj->outputVectors().end(); ++j) { for (KstVectorMap::ConstIterator k = _vectorsUsed.begin(); k != _vectorsUsed.end(); ++k) { if (j.data() == k.data()) { return true; } } } } return KstDataObject::uses(p); }
bool KstEquation::FillY(bool force) { int v_shift=0, v_new; int i0=0; int ns; writeLockInputsAndOutputs(); // determine value of Interp if (_doInterp) { ns = (*_xInVector)->length(); for (KstVectorMap::ConstIterator i = VectorsUsed.begin(); i != VectorsUsed.end(); ++i) { if (i.data()->length() > ns) { ns = i.data()->length(); } } } else { ns = (*_xInVector)->length(); } if (_ns != (*_xInVector)->length() || ns != (*_xInVector)->length() || (*_xInVector)->numShift() != (*_xInVector)->numNew()) { _ns = ns; KstVectorPtr xv = *_xOutVector; KstVectorPtr yv = *_yOutVector; if (!xv->resize(_ns)) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } if (!yv->resize(_ns)) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } yv->zero(); i0 = 0; // other vectors may have diffent lengths, so start over v_shift = _ns; } else { // calculate shift and new samples // only do shift optimization if all used vectors are same size and shift v_shift = (*_xInVector)->numShift(); v_new = (*_xInVector)->numNew(); for (KstVectorMap::ConstIterator i = VectorsUsed.begin(); i != VectorsUsed.end(); ++i) { if (v_shift != i.data()->numShift()) { v_shift = _ns; } if (v_new != i.data()->numNew()) { v_shift = _ns; } if (_ns != i.data()->length()) { v_shift = _ns; } } if (v_shift > _ns/2 || force) { i0 = 0; v_shift = _ns; } else { KstVectorPtr xv = *_xOutVector; KstVectorPtr yv = *_yOutVector; for (int i = v_shift; i < _ns; i++) { yv->value()[i - v_shift] = yv->value()[i]; xv->value()[i - v_shift] = xv->value()[i]; } i0 = _ns - v_shift; } } _numShifted = (*_yOutVector)->numShift() + v_shift; if (_numShifted > _ns) { _numShifted = _ns; } _numNew = _ns - i0 + (*_yOutVector)->numNew(); if (_numNew > _ns) { _numNew = _ns; } (*_xOutVector)->setNewAndShift(_numNew, _numShifted); (*_yOutVector)->setNewAndShift(_numNew, _numShifted); double *rawxv = (*_xOutVector)->value(); double *rawyv = (*_yOutVector)->value(); KstVectorPtr iv = (*_xInVector); Equation::Context ctx; ctx.sampleCount = _ns; ctx.xVector = iv; if (!_pe) { if (_equation.isEmpty()) { unlockInputsAndOutputs(); return true; } QMutexLocker ml(&Equation::mutex()); yy_scan_string(_equation.latin1()); int rc = yyparse(); _pe = static_cast<Equation::Node*>(ParsedEquation); if (_pe && rc == 0) { Equation::FoldVisitor vis(&ctx, &_pe); KstStringMap sm; _pe->collectObjects(VectorsUsed, ScalarsUsed, sm); ParsedEquation = 0L; } else { delete (Equation::Node*)ParsedEquation; ParsedEquation = 0L; _pe = 0L; unlockInputsAndOutputs(); return false; } } for (ctx.i = i0; ctx.i < _ns; ++ctx.i) { rawxv[ctx.i] = iv->value(ctx.i); ctx.x = iv->interpolate(ctx.i, _ns); rawyv[ctx.i] = _pe->value(&ctx); } if (!(*_xOutVector)->resize(iv->length())) { // FIXME: handle error? unlockInputsAndOutputs(); return false; } unlockInputsAndOutputs(); return true; }
KstObject::UpdateType EventMonitorEntry::update(int updateCounter) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); bool force = dirty(); setDirty(false); if (KstObject::checkUpdateCounter(updateCounter) && !force) { return lastUpdateResult(); } writeLockInputsAndOutputs(); if (!_pExpression) { reparse(); } KstVectorPtr xv = *_xVector; KstVectorPtr yv = *_yVector; int ns = 1; for (KstVectorMap::ConstIterator i = _vectorsUsed.begin(); i != _vectorsUsed.end(); ++i) { ns = kMax(ns, i.data()->length()); } double *rawValuesX = 0L; double *rawValuesY = 0L; if (xv && yv) { if (xv->resize(ns)) { rawValuesX = xv->value(); } if (yv->resize(ns)) { rawValuesY = yv->value(); } } Equation::Context ctx; ctx.sampleCount = ns; ctx.x = 0.0; if (needToEvaluate()) { if (_pExpression) { for (ctx.i = _numDone; ctx.i < ns; ++ctx.i) { const double value = _pExpression->value(&ctx); if (value != 0.0) { // The expression evaluates to true log(ctx.i); if (rawValuesX && rawValuesY) { rawValuesX[ctx.i] = ctx.i; rawValuesY[ctx.i] = 1.0; } } else { if (rawValuesX && rawValuesY) { rawValuesX[ctx.i] = ctx.i; rawValuesY[ctx.i] = 0.0; } } } _numDone = ns; logImmediately(); } } else { _numDone = ns; } if (xv) { xv->setDirty(); xv->update(updateCounter); } if (yv) { yv->setDirty(); yv->update(updateCounter); } unlockInputsAndOutputs(); return setLastUpdateResult(NO_CHANGE); }