annotate data/model/SparseValueModel.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents 59e7fe1b1003
children a1cd5abcb38b
rev   line source
Chris@147 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@147 2
Chris@147 3 /*
Chris@147 4 Sonic Visualiser
Chris@147 5 An audio file viewer and annotation editor.
Chris@147 6 Centre for Digital Music, Queen Mary, University of London.
Chris@147 7 This file copyright 2006 Chris Cannam.
Chris@147 8
Chris@147 9 This program is free software; you can redistribute it and/or
Chris@147 10 modify it under the terms of the GNU General Public License as
Chris@147 11 published by the Free Software Foundation; either version 2 of the
Chris@147 12 License, or (at your option) any later version. See the file
Chris@147 13 COPYING included with this distribution for more information.
Chris@147 14 */
Chris@147 15
Chris@147 16 #ifndef _SPARSE_VALUE_MODEL_H_
Chris@147 17 #define _SPARSE_VALUE_MODEL_H_
Chris@147 18
Chris@147 19 #include "SparseModel.h"
Chris@150 20 #include "base/UnitDatabase.h"
Chris@147 21
Chris@606 22 #include "system/System.h"
Chris@257 23
Chris@147 24 /**
Chris@147 25 * Model containing sparse data (points with some properties) of which
Chris@147 26 * one of the properties is an arbitrary float value. The other
Chris@147 27 * properties depend on the point type.
Chris@147 28 */
Chris@147 29
Chris@147 30 template <typename PointType>
Chris@147 31 class SparseValueModel : public SparseModel<PointType>
Chris@147 32 {
Chris@147 33 public:
Chris@929 34 SparseValueModel(int sampleRate, int resolution,
Chris@256 35 bool notifyOnAdd = true) :
Chris@256 36 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@256 37 m_valueMinimum(0.f),
Chris@256 38 m_valueMaximum(0.f),
Chris@256 39 m_haveExtents(false)
Chris@256 40 { }
Chris@256 41
Chris@929 42 SparseValueModel(int sampleRate, int resolution,
Chris@147 43 float valueMinimum, float valueMaximum,
Chris@147 44 bool notifyOnAdd = true) :
Chris@147 45 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
Chris@147 46 m_valueMinimum(valueMinimum),
Chris@256 47 m_valueMaximum(valueMaximum),
Chris@256 48 m_haveExtents(true)
Chris@147 49 { }
Chris@147 50
Chris@147 51 using SparseModel<PointType>::m_points;
Chris@147 52 using SparseModel<PointType>::modelChanged;
Chris@301 53 using SparseModel<PointType>::getPoints;
Chris@345 54 using SparseModel<PointType>::tr;
Chris@345 55
Chris@345 56 QString getTypeName() const { return tr("Sparse Value"); }
Chris@147 57
Chris@147 58 virtual float getValueMinimum() const { return m_valueMinimum; }
Chris@147 59 virtual float getValueMaximum() const { return m_valueMaximum; }
Chris@147 60
Chris@147 61 virtual QString getScaleUnits() const { return m_units; }
Chris@147 62 virtual void setScaleUnits(QString units) {
Chris@147 63 m_units = units;
Chris@147 64 UnitDatabase::getInstance()->registerUnit(units);
Chris@147 65 }
Chris@147 66
Chris@147 67 virtual void addPoint(const PointType &point)
Chris@147 68 {
Chris@147 69 bool allChange = false;
Chris@256 70
Chris@606 71 if (!ISNAN(point.value) && !ISINF(point.value)) {
Chris@256 72 if (!m_haveExtents || point.value < m_valueMinimum) {
Chris@256 73 m_valueMinimum = point.value; allChange = true;
Chris@296 74 // std::cerr << "addPoint: value min = " << m_valueMinimum << std::endl;
Chris@256 75 }
Chris@256 76 if (!m_haveExtents || point.value > m_valueMaximum) {
Chris@256 77 m_valueMaximum = point.value; allChange = true;
Chris@296 78 // std::cerr << "addPoint: value max = " << m_valueMaximum << " (min = " << m_valueMinimum << ")" << std::endl;
Chris@256 79 }
Chris@256 80 m_haveExtents = true;
Chris@256 81 }
Chris@147 82
Chris@147 83 SparseModel<PointType>::addPoint(point);
Chris@147 84 if (allChange) emit modelChanged();
Chris@147 85 }
Chris@147 86
Chris@147 87 virtual void deletePoint(const PointType &point)
Chris@147 88 {
Chris@147 89 SparseModel<PointType>::deletePoint(point);
Chris@147 90
Chris@147 91 if (point.value == m_valueMinimum ||
Chris@147 92 point.value == m_valueMaximum) {
Chris@147 93
Chris@147 94 float formerMin = m_valueMinimum, formerMax = m_valueMaximum;
Chris@147 95
Chris@147 96 for (typename SparseModel<PointType>::PointList::const_iterator i
Chris@147 97 = m_points.begin();
Chris@147 98 i != m_points.end(); ++i) {
Chris@147 99
Chris@147 100 if (i == m_points.begin() || i->value < m_valueMinimum) {
Chris@147 101 m_valueMinimum = i->value;
Chris@296 102 // std::cerr << "deletePoint: value min = " << m_valueMinimum << std::endl;
Chris@147 103 }
Chris@147 104 if (i == m_points.begin() || i->value > m_valueMaximum) {
Chris@147 105 m_valueMaximum = i->value;
Chris@296 106 // std::cerr << "deletePoint: value max = " << m_valueMaximum << std::endl;
Chris@147 107 }
Chris@147 108 }
Chris@147 109
Chris@147 110 if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) {
Chris@147 111 emit modelChanged();
Chris@147 112 }
Chris@147 113 }
Chris@147 114 }
Chris@147 115
Chris@318 116 virtual void toXml(QTextStream &stream,
Chris@318 117 QString indent = "",
Chris@314 118 QString extraAttributes = "") const
Chris@147 119 {
Chris@318 120 std::cerr << "SparseValueModel::toXml: extraAttributes = \""
Chris@318 121 << extraAttributes.toStdString() << std::endl;
Chris@318 122
Chris@314 123 SparseModel<PointType>::toXml
Chris@318 124 (stream,
Chris@318 125 indent,
Chris@147 126 QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"")
Chris@147 127 .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum)
Chris@147 128 .arg(this->encodeEntities(m_units)));
Chris@147 129 }
Chris@147 130
Chris@147 131 protected:
Chris@147 132 float m_valueMinimum;
Chris@147 133 float m_valueMaximum;
Chris@256 134 bool m_haveExtents;
Chris@147 135 QString m_units;
Chris@147 136 };
Chris@147 137
Chris@147 138
Chris@147 139 #endif
Chris@147 140