Library: cover statistic functions and linear regression
This commit is contained in:
parent
1f5518e2c8
commit
aa93bf9285
4 changed files with 252 additions and 63 deletions
|
|
@ -100,7 +100,7 @@ namespace lib {
|
|||
|
||||
inline int rani() { return defaultGen.i32(); }
|
||||
inline uint64_t ranu() { return defaultGen.u64(); }
|
||||
inline double rado() { return defaultGen.uni(); }
|
||||
inline double runi() { return defaultGen.uni(); }
|
||||
|
||||
|
||||
/** inject true randomness into the #defaultGen */
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include "lib/error.hpp"
|
||||
#include "lib/nocopy.hpp"
|
||||
#include "lib/iter-adapter.hpp"
|
||||
#include "lib/format-string.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
|
|
@ -119,14 +120,17 @@ namespace stat{
|
|||
|
||||
|
||||
using iterator = const D*;
|
||||
using const_iterator = iterator;
|
||||
|
||||
size_t size() const { return e_ - b_; }
|
||||
bool empty() const { return b_ == e_;}
|
||||
|
||||
iterator begin() const { return b_; }
|
||||
iterator end() const { return e_; }
|
||||
friend const_iterator begin (DataSpan const& span){ return span.begin();}
|
||||
friend const_iterator end (DataSpan const& span){ return span.end(); }
|
||||
|
||||
D const& operator[](size_t i) const { return b_ + i; }
|
||||
D const& operator[](size_t i) const { return *(b_ + i); }
|
||||
D const& at(size_t i) const
|
||||
{
|
||||
if (i >= size())
|
||||
|
|
@ -136,6 +140,12 @@ namespace stat{
|
|||
}
|
||||
};
|
||||
|
||||
/** deduction guide: derive content from container. */
|
||||
template<class CON>
|
||||
DataSpan (CON const& container) -> DataSpan<typename lib::meta::ValueTypeBinding<CON>::value_type>;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** summation of variances, for error propagation: √Σe² */
|
||||
|
|
@ -318,7 +328,7 @@ namespace stat{
|
|||
inline auto
|
||||
computeLinearRegression (RegressionData const& points)
|
||||
{
|
||||
return computeLinearRegression(DataSpan<RegressionPoint>{points});
|
||||
return computeLinearRegression (DataSpan<RegressionPoint>{points});
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -359,7 +369,7 @@ namespace stat{
|
|||
inline auto
|
||||
computeTimeSeriesLinearRegression (VecD const& series)
|
||||
{
|
||||
return computeTimeSeriesLinearRegression(DataSpan<double>{series});
|
||||
return computeTimeSeriesLinearRegression (DataSpan<double>{series});
|
||||
}
|
||||
|
||||
}} // namespace lib::stat
|
||||
|
|
|
|||
|
|
@ -28,39 +28,26 @@
|
|||
#include "lib/test/run.hpp"
|
||||
#include "lib/test/test-helper.hpp"
|
||||
#include "lib/stat/statistic.hpp"
|
||||
//#include "lib/time/timevalue.hpp"
|
||||
//#include "lib/error.hpp"
|
||||
//#include "lib/util-foreach.hpp"
|
||||
#include "lib/iter-explorer.hpp"
|
||||
#include "lib/format-util.hpp"
|
||||
#include "lib/random.hpp"
|
||||
#include "lib/util.hpp"
|
||||
#include "lib/format-cout.hpp" ///////////////////////TODO
|
||||
#include "lib/test/diagnostic-output.hpp" ///////////////////////TODO
|
||||
|
||||
//#include <functional>
|
||||
//#include <string>
|
||||
|
||||
//using util::for_each;
|
||||
//using lumiera::Error;
|
||||
//using lumiera::LUMIERA_ERROR_EXCEPTION;
|
||||
//using lumiera::error::LUMIERA_ERROR_ASSERTION;
|
||||
//using lib::time::TimeVar;
|
||||
//using lib::time::Time;
|
||||
|
||||
//using boost::algorithm::is_lower;
|
||||
//using boost::algorithm::is_digit;
|
||||
//using std::function;
|
||||
//using std::string;
|
||||
|
||||
|
||||
namespace lib {
|
||||
namespace stat{
|
||||
namespace test{
|
||||
|
||||
template<class T>
|
||||
class Wrmrmpft
|
||||
{
|
||||
T tt_;
|
||||
};
|
||||
|
||||
struct Murpf { };
|
||||
namespace {
|
||||
const size_t NUM_POINTS = 1'000;
|
||||
}
|
||||
|
||||
using lib::test::roughEQ;
|
||||
using util::isnil;
|
||||
using error::LUMIERA_ERROR_INVALID;
|
||||
|
||||
|
||||
/**************************************************************//**
|
||||
|
|
@ -82,36 +69,118 @@ namespace test{
|
|||
}
|
||||
|
||||
|
||||
/** @test prints "sizeof()" including some type name. */
|
||||
void
|
||||
check_baseStatistics ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/** @test a simplified preview on C++20 ranges */
|
||||
void
|
||||
demonstrate_DataSpan()
|
||||
{
|
||||
auto dat = VecD{0,1,2,3,4,5};
|
||||
|
||||
DataSpan all{dat};
|
||||
CHECK (not isnil (all));
|
||||
CHECK (dat.size() == all.size());
|
||||
|
||||
auto i = all.begin();
|
||||
CHECK (i != all.end());
|
||||
CHECK (0 == *i);
|
||||
++i;
|
||||
CHECK (1 == *i);
|
||||
|
||||
DataSpan innr{*i, dat.back()};
|
||||
CHECK (util::join(innr) == "1, 2, 3, 4"_expect);
|
||||
CHECK (2 == innr.at(1));
|
||||
CHECK (2 == innr[1]);
|
||||
CHECK (4 == innr[3]);
|
||||
CHECK (5 == innr[4]); // »undefined behaviour«
|
||||
|
||||
VERIFY_ERROR (INVALID, innr.at(4) )
|
||||
|
||||
CHECK (1+2+3+4 == lib::explore(innr).resultSum());
|
||||
}
|
||||
|
||||
|
||||
/** @test check the VERIFY_ERROR macro,
|
||||
* which ensures a given error is raised.
|
||||
/** @test helpers to calculate mean and standard derivation */
|
||||
void
|
||||
check_baseStatistics ()
|
||||
{
|
||||
auto dat = VecD{4,2,5,8,6};
|
||||
DataSpan all = lastN(dat, dat.size());
|
||||
DataSpan rst = lastN(dat, 4);
|
||||
CHECK (2 == *rst.begin());
|
||||
CHECK (4 == rst.size());
|
||||
CHECK (5 == all.size());
|
||||
|
||||
CHECK (5.0 == average (all));
|
||||
CHECK (5.25 == average(rst));
|
||||
|
||||
// Surprise : divide by N-1 since it is a guess for the real standard derivation
|
||||
CHECK (sdev (all, 5.0) == sqrt(20/(5-1)));
|
||||
|
||||
CHECK (5.0 == averageLastN (dat,20));
|
||||
CHECK (5.0 == averageLastN (dat, 5));
|
||||
CHECK (5.25 == averageLastN (dat, 4));
|
||||
CHECK (7.0 == averageLastN (dat, 2));
|
||||
CHECK (6.0 == averageLastN (dat, 1));
|
||||
CHECK (0.0 == averageLastN (dat, 0));
|
||||
}
|
||||
|
||||
|
||||
/** @test attribute a weight to each data point going into linear regression
|
||||
* - using a simple scenario with three points
|
||||
* - a line with gradients would run through the end points (1,1) ⟶ (5,5)
|
||||
* - but we have a middle point, offset by -2 and with double weight
|
||||
* - thus the regression line is overall shifted by -1
|
||||
* - standard derivation is √3 and correlation 81%
|
||||
* (both plausible and manually checked
|
||||
*/
|
||||
void
|
||||
check_wightedLinearRegression()
|
||||
{
|
||||
RegressionData points{{1,1, 1}
|
||||
,{5,5, 1}
|
||||
,{3,1, 2}
|
||||
};
|
||||
|
||||
auto [socket,gradient
|
||||
,predicted,deltas
|
||||
,correlation
|
||||
,maxDelta
|
||||
,sdev] = computeLinearRegression (points);
|
||||
|
||||
CHECK (socket == -1);
|
||||
CHECK (gradient == 1);
|
||||
CHECK (util::join (predicted) == "0, 4, 2"_expect );
|
||||
CHECK (util::join (deltas) == "1, 1, -1"_expect );
|
||||
CHECK (maxDelta == 1);
|
||||
CHECK (correlation == "0.81649658"_expect );
|
||||
CHECK (sdev == "1.7320508"_expect );
|
||||
}
|
||||
|
||||
|
||||
/** @test check a local manipulations,
|
||||
* which are undone when leaving the scope.
|
||||
|
||||
/** @test regression over a series of measurement data
|
||||
* - use greater mount of data generated with randomness
|
||||
* - actually a power function is _hidden in the data_
|
||||
*/
|
||||
void
|
||||
check_TimeSeriesLinearRegression()
|
||||
{
|
||||
auto dirt = [] { return runi() - 0.5; };
|
||||
auto fun = [&](uint i){ auto x = double(i)/NUM_POINTS;
|
||||
return x*x;
|
||||
};
|
||||
VecD data;
|
||||
data.reserve (NUM_POINTS);
|
||||
for (uint i=0; i<NUM_POINTS; ++i)
|
||||
data.push_back (fun(i) + dirt());
|
||||
|
||||
auto [socket,gradient,correlation] = computeTimeSeriesLinearRegression (data);
|
||||
|
||||
// regression line should roughly connect 0 to 1,
|
||||
// yet slightly shifted downwards, cutting through the parabolic curve
|
||||
CHECK (roughEQ (gradient*NUM_POINTS, 1, 0.08));
|
||||
CHECK (roughEQ (socket, -0.16, 0.3 ));
|
||||
CHECK (correlation > 0.65);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -57412,6 +57412,7 @@
|
|||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1710187630035" ID="ID_552644754" MODIFIED="1710187676838" TEXT="Idee: reproduzierbares Schma per DI">
|
||||
<linktarget COLOR="#ff0029" DESTINATION="ID_552644754" ENDARROW="Default" ENDINCLINATION="-438;679;" ID="Arrow_ID_440516587" SOURCE="ID_629444459" STARTARROW="None" STARTINCLINATION="-377;-45;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1710193419628" ID="ID_1554210735" MODIFIED="1710193431797" TEXT="Problem: brauche eine Art von Abstraktion">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
|
|
@ -57441,6 +57442,11 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1710518560044" ID="ID_759729758" MODIFIED="1710518563223" TEXT="Statistik">
|
||||
<node COLOR="#435e98" CREATED="1710518415013" ID="ID_1377396763" MODIFIED="1710518579825" TEXT="Statistik-Hilfsmittel (von Yoshimi-test)">
|
||||
<arrowlink COLOR="#1a2cc4" DESTINATION="ID_746814828" ENDARROW="Default" ENDINCLINATION="-506;-158;" ID="Arrow_ID_1221012838" STARTARROW="None" STARTINCLINATION="1439;113;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1695850005910" ID="ID_673181142" MODIFIED="1695851233120" TEXT="»Either« : lib::Result">
|
||||
|
|
@ -57942,6 +57948,25 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710518610461" FOLDED="true" ID="ID_629444459" MODIFIED="1710518761306" TEXT="Zufallszahlen-Sequenzen">
|
||||
<arrowlink COLOR="#ff0029" DESTINATION="ID_552644754" ENDARROW="Default" ENDINCLINATION="-438;679;" ID="Arrow_ID_440516587" STARTARROW="None" STARTINCLINATION="-377;-45;"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1710518675324" ID="ID_403251284" MODIFIED="1710518761067" TEXT="eine Menge offener Fragen hier">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...ich brauche ein Ausführungs-Framework, damit man die einzelnen Fälle <i>zu Greifen bekommt. </i>
|
||||
</p>
|
||||
<p>
|
||||
Das impliziert leider auch eine Überarbeitung des Test-Frameworks
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1701698319632" ID="ID_883682364" MODIFIED="1701699545121" TEXT="Hash-Berechnung">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
|
|
@ -111983,6 +112008,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<linktarget COLOR="#9d4168" DESTINATION="ID_1402055509" ENDARROW="Default" ENDINCLINATION="-761;122;" ID="Arrow_ID_397225736" SOURCE="ID_1781115298" STARTARROW="None" STARTINCLINATION="-165;-9;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710079800390" ID="ID_746814828" MODIFIED="1710124936401" TEXT="meine Statistik- und CSV Hilfsmittel von Yoshimi-Test einbringen">
|
||||
<linktarget COLOR="#1a2cc4" DESTINATION="ID_746814828" ENDARROW="Default" ENDINCLINATION="-506;-158;" ID="Arrow_ID_1221012838" SOURCE="ID_1377396763" STARTARROW="None" STARTINCLINATION="1439;113;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1710085462347" ID="ID_963243204" MODIFIED="1710114559233" TEXT="zusammenhängenden Code-Cluster identifizieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -112040,16 +112066,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="stop-sign"/>
|
||||
<node CREATED="1710358112019" ID="ID_1362698564" MODIFIED="1710358136409" TEXT="prüft zunächst ob eine dynamische Konvertierung gemacht werden soll">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
was auch immer das ist....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1710358137910" ID="ID_681291528" MODIFIED="1710358179069" TEXT="delegiert an boost::detail::lexical_converter_impl<string,double>"/>
|
||||
<node CREATED="1710362079615" ID="ID_274127702" MODIFIED="1710362103264" TEXT="definiert im Header <boost>/detail/lcast_precision.hpp">
|
||||
|
|
@ -112059,16 +112082,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1710362330238" ID="ID_341040992" MODIFIED="1710362904452" STYLE="bubble">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
empirisch(debug) ⟹ <b>17</b> Stellen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<edge COLOR="#fdfdda"/>
|
||||
<linktarget COLOR="#fdfcda" DESTINATION="ID_341040992" ENDARROW="Default" ENDINCLINATION="-296;23;" ID="Arrow_ID_1692132249" SOURCE="ID_897752203" STARTARROW="None" STARTINCLINATION="133;-9;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
|
|
@ -112129,6 +112149,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710516999984" ID="ID_476868581" MODIFIED="1710517031610" TEXT="stat::DataSpan mit Lumiera-Iterator-Framework kompatibel machen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1710517020971" ID="ID_1049280485" MODIFIED="1710517029789" TEXT="das ist ein Vorgriff auf C++20">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1710351128227" ID="ID_1587957134" MODIFIED="1710351136356" TEXT="Ergänzungen">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#338800" CREATED="1710351138211" ID="ID_424130600" MODIFIED="1710351150207" TEXT="Hilfsfunktionen zum Feststellen der Permissions einer Datei">
|
||||
|
|
@ -112136,16 +112162,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1710351151183" ID="ID_1693319710" MODIFIED="1710352549516" TEXT="DataFile kann auch leer verwendet werden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Das ist naheliegend und kompromittiert das Design nicht wesentlich; File-Operationen können ohnehin immer Fehler auslösen, und da ein Pfad invalid sein kann, ist auch das Original-Design der Tabelle in dieser Hinsicht inhärent stateful.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#254cae" DESTINATION="ID_1693319710" ENDARROW="Default" ENDINCLINATION="138;10;" ID="Arrow_ID_1520501008" SOURCE="ID_101637286" STARTARROW="None" STARTINCLINATION="112;7;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node COLOR="#435e98" CREATED="1710351177329" ID="ID_1224481019" MODIFIED="1710352477647" TEXT="leer-Check vor Speichern"/>
|
||||
|
|
@ -112165,8 +112188,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710085571918" ID="ID_1847964804" MODIFIED="1710466417063" TEXT="per Unit-Test dokumentieren">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1710085571918" ID="ID_1847964804" MODIFIED="1710540062343" TEXT="per Unit-Test dokumentieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1710167567738" ID="ID_116953186" MODIFIED="1710168515030" TEXT="neue Test-Gruppe: 16calculation.tests">
|
||||
<node CREATED="1710167587540" ID="ID_1196727143" MODIFIED="1710167645967" TEXT="group=calculation"/>
|
||||
<node CREATED="1710167598409" ID="ID_498080750" MODIFIED="1710167615767" TEXT="Mathematik, aber auch Farbräume und Signalverarbeitung"/>
|
||||
|
|
@ -112205,12 +112228,99 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710163672834" ID="ID_778295326" MODIFIED="1710170479867" TEXT="Statistic_test">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1710168517151" MODIFIED="1710168517151" TEXT="demonstrate_DataSpan();"/>
|
||||
<node CREATED="1710168517152" MODIFIED="1710168517152" TEXT="check_baseStatistics();"/>
|
||||
<node CREATED="1710168517152" MODIFIED="1710168517152" TEXT="check_wightedLinearRegression();"/>
|
||||
<node CREATED="1710168517153" MODIFIED="1710168517153" TEXT="check_TimeSeriesLinearRegression();"/>
|
||||
<node COLOR="#338800" CREATED="1710163672834" ID="ID_778295326" MODIFIED="1710540059049" TEXT="Statistic_test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1710168517151" ID="ID_1042392130" MODIFIED="1710521615974" TEXT="demonstrate_DataSpan();">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1710168517152" ID="ID_1036173633" MODIFIED="1710521618306" TEXT="check_baseStatistics();">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1710168517152" ID="ID_94574358" MODIFIED="1710527674592" TEXT="check_wightedLinearRegression();">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1710527676263" ID="ID_1304264691" MODIFIED="1710527771734" TEXT="puh.... wie soll ich das checken?">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1710527686358" ID="ID_578749972" MODIFIED="1710527696032" TEXT="mache ein einfaches Beispiel mit drei Punkten"/>
|
||||
<node CREATED="1710527696884" ID="ID_1701973261" MODIFIED="1710527724293" TEXT="so daß eine Gerade mit γ ≡ 1 herauskommt"/>
|
||||
<node CREATED="1710527728265" ID="ID_1179926059" MODIFIED="1710527740113" TEXT="und setzte einen Punkt mit doppeltem Gewicht genau in die MItte"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1710527745446" ID="ID_402036102" MODIFIED="1710527767468" TEXT="Standardabweiung und Pearson-r manuell auf anderem Weg nachgerechnet">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1710168517153" ID="ID_468799042" MODIFIED="1710540057809" TEXT="check_TimeSeriesLinearRegression();">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1710528618057" ID="ID_489706079" MODIFIED="1710528641029" TEXT="hier ein echter Massen-Einsatz!">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1710540014382" ID="ID_894416651" MODIFIED="1710540030024" TEXT="verwende eine (durchängende) quadratische Parabel"/>
|
||||
<node CREATED="1710540031084" ID="ID_1083740105" MODIFIED="1710540039706" TEXT="grrr... warum ist das so mühsam">
|
||||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1710540040963" ID="ID_112707628" MODIFIED="1710540056517" TEXT="Funktionen für näherungsweise Gleichheit eingeführt">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1710517964580" HGAP="-27" ID="ID_234167038" MODIFIED="1710517984971" TEXT="Backport festgestellter Defekte + Ergänzungen" VSHIFT="13">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1710517986209" ID="ID_1481713125" MODIFIED="1710518006846" TEXT="Yoshimi-test hat keine Unit-Tests — und das merkt man">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
</node>
|
||||
<node CREATED="1710518009974" ID="ID_675745994" MODIFIED="1710518070105" TEXT="DataFile: Inkonsistenz in der Index-Handhabung nach Manipulation der Daten_Arrays">
|
||||
<node CREATED="1710518102770" ID="ID_1584674917" MODIFIED="1710518254793" TEXT="kann es nur etwas abmildern — nicht beheben">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...das ist grundsätzlicher Natur; da ich die eingebetteten Daten-Vectoren bewußt und explizit zugänglich gehalten habe (um auf weitergehende Zugriffsfunktionen verzichten zu können), kann man die Invarianten des Containers jederzeit unterlaufen. Ich habe jetzt nur eine <i>Mitigation </i>eingebaut, insofern das Hinzufügen neuer Zeilen die eingebetteten Daten beschneidet
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1710518369757" ID="ID_733042658" MODIFIED="1710519424028" TEXT="man könnte aggresiver vorgehen in DataFIle::formatCSVRow">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Denn hier erfolgt der Feldzugriff sozusagen naïv, unter den Annahme daß niemand an den Einzeldaten manipuliert hat. Da die gesamte Semantik der Tabelle von <i>der letzten Zeile her </i>aufgebaut ist, wäre es korrekter, wenn man hier den Index an der nominellen DataFile::size() rückwärts verankern würde. Diese Überlegung zeigt aber, daß auch schon diese DataFile::size() unter der gleichen Annahme operiert, und damit zu einer Menge weiterere Inkonsistenzen führt
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1710518083796" ID="ID_1388841310" MODIFIED="1710519615785" TEXT="letztlich gilt hier: „selber schuld“">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Das Desig ist bewußt minimalistisch (und damit handwerklich orientiert): Es ist ein Werkzeug, keine Komponente aus dem Baukasten.
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
entweder man müßte die Daten-Vectoren komplett einkapseln, würde dann aber ein gutes Stück der Eleganz in Statistik-Berechnungen verlieren
|
||||
</li>
|
||||
<li>
|
||||
zudem müßte man dann das Konzept eines »Cursors« einführen
|
||||
</li>
|
||||
<li>
|
||||
oder man müßte überall komplexen Prüfcode einbauen, der auch explizit Performance kostet
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1710519627093" ID="ID_1490141836" MODIFIED="1710519646671" TEXT="Fehler im Index-Operator[] von DataRange">
|
||||
<node CREATED="1710519649274" ID="ID_500284425" MODIFIED="1710519659629" TEXT="...der zeigt, daß dieser noch nie verwendet wurde"/>
|
||||
<node COLOR="#ff00e3" CREATED="1710519660385" ID="ID_26478609" MODIFIED="1710519687625" TEXT="tja... Tests für Männer">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue