//________________________________________________________________________ void notevisitor::print (ostream& out) const { if (isGrace()) out << "grace "; if (isCue()) out << "cue "; int type = getType(); if (type == kUndefinedType) out << "type undefined"; else if (type == kUnpitched) { out << "unpitched note - duration " << getDuration() << " "; } else if (type == kRest) { out << "rest - duration " << getDuration() << " "; } else if (type == kPitched) { out << "note " << getStep(); int alter = int(getAlter()); float diff = getAlter() - alter; if (diff >= 0.5) alter++; else if (diff <= -0.5) alter--; while (alter < 0) { out << 'b'; alter++; } while (alter > 0) { out << '#'; alter--; } out << getOctave() << " (" << getMidiPitch() << ")"; out << " - duration " << getDuration() << " "; } else out << "unknown type " << type << " "; if (inChord()) out << "in chord "; if (getTie() & StartStop::start) out << "- tie start "; if (getTie() & StartStop::stop) out << "- tie stop "; string instr = getInstrument(); if (!instr.empty()) out << "instrument " << instr << " "; if (getDynamics() >= 0) out << "dynamics " << getDynamics(); }
/** * Writes a string that can be used in Fit.IFunction to create a copy of this * IFunction * @return string representation of the function */ std::string IFunction::asString() const { std::ostringstream ostr; ostr << "name=" << this->name(); // print the attributes std::vector<std::string> attr = this->getAttributeNames(); for (const auto &attName : attr) { std::string attValue = this->getAttribute(attName).value(); if (!attValue.empty() && attValue != "\"\"") { ostr << ',' << attName << '=' << attValue; } } // print the parameters for (size_t i = 0; i < nParams(); i++) { const ParameterTie *tie = getTie(i); if (!tie || !tie->isDefault()) { ostr << ',' << parameterName(i) << '=' << getParameter(i); } } // collect non-default constraints std::string constraints; for (size_t i = 0; i < nParams(); i++) { const IConstraint *c = getConstraint(i); if (c && !c->isDefault()) { std::string tmp = c->asString(); if (!tmp.empty()) { if (!constraints.empty()) { constraints += ","; } constraints += tmp; } } } // print constraints if (!constraints.empty()) { ostr << ",constraints=(" << constraints << ")"; } // collect the non-default ties std::string ties; for (size_t i = 0; i < nParams(); i++) { const ParameterTie *tie = getTie(i); if (tie && !tie->isDefault()) { std::string tmp = tie->asString(this); if (!tmp.empty()) { if (!ties.empty()) { ties += ","; } ties += tmp; } } } // print the ties if (!ties.empty()) { ostr << ",ties=(" << ties << ")"; } return ostr.str(); }
/** * Prepare the function for a fit. */ void CompositeFunction::setUpForFit() { IFunction::setUpForFit(); // set up the member functions for (size_t i = 0; i < nFunctions(); i++) { getFunction(i)->setUpForFit(); } // unfortuately the code below breaks some system tests (IRISFuryAndFuryFit) // it looks as if using numeric derivatives can give different fit results // to fit with analytical ones // // if parameters have non-constant ties enable numerical derivatives // for(size_t i = 0; i < nParams(); ++i) //{ // ParameterTie* tie = getTie( i ); // if ( tie && !tie->isConstant() ) // { // useNumericDerivatives( true ); // break; // } //} // instead of automatically switching to numeric derivatives // log a warning about a danger of not using it if (!getAttribute("NumDeriv").asBool()) { for (size_t i = 0; i < nParams(); ++i) { ParameterTie *tie = getTie(i); if (tie && !tie->isConstant()) { g_log.warning() << "Numeric derivatives should be used when " "non-constant ties defined.\n"; break; } } } }
/** Remove a function * @param i :: The index of the function to remove */ void CompositeFunction::removeFunction(size_t i) { if (i >= nFunctions()) { throw std::out_of_range("Function index (" + std::to_string(i) + ") out of range (" + std::to_string(nFunctions()) + ")."); } IFunction_sptr fun = getFunction(i); // Reduction in parameters size_t dnp = fun->nParams(); for (size_t j = 0; j < nParams();) { ParameterTie *tie = getTie(j); if (tie && tie->findParametersOf(fun.get())) { removeTie(j); } else { j++; } } // Shift down the function indeces for parameters for (auto it = m_IFunction.begin(); it != m_IFunction.end();) { if (*it == i) { it = m_IFunction.erase(it); } else { if (*it > i) { *it -= 1; } ++it; } } m_nParams -= dnp; // Shift the parameter offsets down by the total number of i-th function's // params for (size_t j = i + 1; j < nFunctions(); j++) { m_paramOffsets[j] -= dnp; } m_paramOffsets.erase(m_paramOffsets.begin() + i); m_functions.erase(m_functions.begin() + i); }
/** * Writes a string that can be used in Fit.IFunction to create a copy of this IFunction * @param fmt :: Formatting flag. Set to true to ctreated formatted output. * @return string representation of the function */ std::string IFunction::asString(bool fmt, size_t level)const { std::string nl = fmt? "\n" : ""; std::string padding = fmt && level ? std::string(level*2,' ') : ""; std::string padding2 = padding + " "; std::ostringstream ostr; // write function name ostr << padding << this->name() << "(" << nl; bool needComma = false; // write function attributes std::vector<std::string> attr = this->getAttributeNames(); for(size_t i=0;i<attr.size();i++) { std::string attName = attr[i]; std::string attValue = this->getAttribute(attr[i]).value(); if (!attValue.empty()) { if (needComma) { ostr << ',' << nl; } needComma = true; ostr << padding2 << attName << '=' << attValue; } } // write function parameters for(size_t i=0;i<nParams();i++) { if (needComma) { ostr << ',' << nl; } needComma = true; ostr << padding2 << parameterName(i) << '=' << getParameter(i); } // write constraints std::string constraints; for(size_t i=0;i<nParams();i++) { const IConstraint* c = getConstraint(i); if (c) { std::string tmp = c->asString(); if (!tmp.empty()) { if (!constraints.empty()) { constraints += ","; } constraints += tmp; } } } if (!constraints.empty()) { ostr << ",constraints=(" << constraints << ")"; } // write ties std::string ties; for(size_t i=0;i<nParams();i++) { const ParameterTie* tie = getTie(i); if (tie) { std::string tmp = tie->asString(this); if (!tmp.empty()) { if (!ties.empty()) { ties += ","; } ties += tmp; } } } if (!ties.empty()) { ostr << ",ties=(" << ties << ")"; } ostr << nl << padding << ")"; return ostr.str(); }