Parameters: mark out the base operations of a Scale

Scales are defined as descriptor records and will be used as const.
Besides some information functions, a Scale
 * allows to conform a value to be compliant with the Scale's constraints
 * can ''join'' and thus apply a ''feed'' on top of a ''base value'';
   this is the foundation for applying an automation function, while
   handling multiplicative and logarithmic cases properly
This commit is contained in:
Fischlurch 2026-09-11 23:22:03 +02:00
parent 50ef9dd985
commit 4e4222ebc7
4 changed files with 157 additions and 31 deletions

View file

@ -27,9 +27,9 @@
** mostly at start and then hold and use the memory, the allocation is never ** mostly at start and then hold and use the memory, the allocation is never
** actually _closed_ — implying that further allocations can be added during ** actually _closed_ — implying that further allocations can be added during
** the whole life time, which may possibly even trigger a further base allocation ** the whole life time, which may possibly even trigger a further base allocation
** if storage space in the last Extent is exhausted. In theory, it would be possible ** if storage space if the last Extent is exhausted. In theory, it would be possible
** to use a custom allocation (in the AllocationCluster::StorageManager::Extents, ** to use a custom allocation (in the AllocationCluster::StorageManager::Extents,
** which is a lib::LinkedElements and could be parametrised with a allocator template). ** which is a lib::LinkedElements and could be parametrised with an allocator template).
** Allocations are never discarded, and thus any alloted memory will be kept until ** Allocations are never discarded, and thus any alloted memory will be kept until
** the whole AllocationCluster is destroyed as a compound. ** the whole AllocationCluster is destroyed as a compound.
** \par using as STL allocator ** \par using as STL allocator

View file

@ -63,12 +63,98 @@ namespace par {
optional<VAL> minUse{}; optional<VAL> minUse{};
optional<VAL> maxUse{}; optional<VAL> maxUse{};
optional<VAL> neutral{}; optional<VAL> neutral{};
optional<VAL> defaultVal{}; optional<VAL> defVal{};
/////////////////////////////OOO »Sentinels« and nominal scales? /////////////////////////////OOO »Sentinels« and nominal scales?
bool zyclic{false}; bool zyclic{false};
/* ===== information functions ===== */
bool isValid() const;
/* ===== conforming operations ===== */
VAL conform (VAL const&) const;
template<typename SRC>
VAL join (VAL const&, SRC const&, Scale<SRC> const&) const;
VAL join (VAL const&, VAL const&) const;
}; };
/* ===== information functions ===== */
/** self consistency check */
template<typename VAL>
inline bool
Scale<VAL>::isValid() const
{
return ((not minVal or not maxVal)
or *minVal <= *maxVal
)
and (not minUse
or (not minVal or *minVal <= *minUse)
)
and (not maxUse
or (not maxVal or *maxUse <= *maxVal)
)
and ((not minUse or not maxUse)
or *minUse <= *maxUse
)
and (not neutral
or ( (not maxVal or *neutral <= *maxVal)
and (not minVal or *minVal <= *neutral)
)
)
and (not defVal
or ( (not maxVal or *defVal <= *maxVal)
and (not minVal or *minVal <= *defVal)
)
)
and (not zyclic
or (minVal and maxVal)
or (minVal and neutral)
or (neutral and maxVal)
)
;
}
/* ===== conforming operations ===== */
/**
* Accommodate a raw value from the underlying domain,
* so that it conforms with this Scale definition.
*/
template<typename VAL>
inline VAL
Scale<VAL>::conform (VAL const& rawVal) const
{
UNIMPLEMENTED ("Scale conforming");
}
/**
* Join and combine an additional feed value with an anchor value.
* @note actual joining operation is picked based on both scales and types involved.
* @remark notably multiplicative contributions and logarithmic scales to be considered.
*/
template<typename VAL>
template<typename SRC>
inline VAL
Scale<VAL>::join (VAL const& value, SRC const& feed, Scale<SRC> const& feedScale) const
{
UNIMPLEMENTED ("join a feed with a base value, observing Scale constraints");
}
/**
* Simplified join() variant, assuming the feed is based on the same scale.
*/
template<typename VAL>
inline VAL
Scale<VAL>::join (VAL const& vaule, VAL const& feed) const
{
UNIMPLEMENTED ("join a feed with a base value within same Scale");
}
}} // namespace lib::par }} // namespace lib::par
#endif /*LIB_PAR_SCALE_H*/ #endif /*LIB_PAR_SCALE_H*/

View file

@ -18,7 +18,7 @@
#include "test/run.hpp" #include "test/run.hpp"
//#include "test/test-helper.hpp" //#include "test/test-helper.hpp"
#include "lib/par/parameter.hpp" #include "lib/par/scale.hpp"
#include "test/diagnostic-output.hpp"/////////////TODO #include "test/diagnostic-output.hpp"/////////////TODO
//#include <utility> //#include <utility>
@ -58,14 +58,21 @@ namespace test{
run (Arg) run (Arg)
{ {
simpleUsage(); simpleUsage();
verify_typeMarker(); verify_Bounds();
} }
void void
simpleUsage() simpleUsage()
{ {
UNIMPLEMENTED ("nebbich"); Scale<int> scale = {.minVal = -5, .maxVal = 23};
CHECK (scale.isValid());
CHECK (-5 == scale.conform (-55));
CHECK (23 == scale.conform (+55));
CHECK ( 5 == scale.join (2,3) );
CHECK (-5 == scale.join (23,-55));
} }
@ -73,7 +80,7 @@ namespace test{
* @todo WIP 9/26 🔁 define ⟶ implement * @todo WIP 9/26 🔁 define ⟶ implement
*/ */
void void
verify_typeMarker() verify_Bounds()
{ {
} }
}; };

View file

@ -85424,7 +85424,8 @@
</node> </node>
<node CREATED="1788904412352" ID="ID_1436845505" MODIFIED="1788904424447" TEXT="ein &#xe4;hnliches Verdikt gilt f&#xfc;r zyklische Werte"/> <node CREATED="1788904412352" ID="ID_1436845505" MODIFIED="1788904424447" TEXT="ein &#xe4;hnliches Verdikt gilt f&#xfc;r zyklische Werte"/>
</node> </node>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1788912980176" ID="ID_320664672" MODIFIED="1788913437098" TEXT="Beschlu&#xdf;: gel&#xe4;ufige Sonderf&#xe4;lle explizit mit aufnehmen"> <node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1788912980176" ID="ID_320664672" MODIFIED="1789160197623" TEXT="Beschlu&#xdf;: gel&#xe4;ufige Sonderf&#xe4;lle explizit mit aufnehmen">
<linktarget COLOR="#852a28" DESTINATION="ID_320664672" ENDARROW="Default" ENDINCLINATION="-765;515;" ID="Arrow_ID_1819779589" SOURCE="ID_1480074646" STARTARROW="None" STARTINCLINATION="199;8;"/>
<font ITALIC="true" NAME="SansSerif" SIZE="14"/> <font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/> <icon BUILTIN="yes"/>
<node CREATED="1788913085119" ID="ID_321653591" MODIFIED="1788913092162" TEXT="Zahlenwert-artige Skalen"/> <node CREATED="1788913085119" ID="ID_321653591" MODIFIED="1788913092162" TEXT="Zahlenwert-artige Skalen"/>
@ -85551,9 +85552,10 @@
</node> </node>
</node> </node>
</node> </node>
<node CREATED="1788917794598" ID="ID_29123926" MODIFIED="1788917818108" TEXT="ValueChain"> <node CREATED="1788917794598" ID="ID_29123926" MODIFIED="1789161706991" TEXT="Value-Chaining">
<node CREATED="1789161718416" ID="ID_343593959" MODIFIED="1789165376887" TEXT="join (value, feed[, feedScale const&amp;])"/>
<node CREATED="1788917819659" ID="ID_1748818920" MODIFIED="1788917847680" TEXT="wird ben&#xf6;tigt um die Automations-Provision auf einen Basis-Wert anzuwenden"/> <node CREATED="1788917819659" ID="ID_1748818920" MODIFIED="1788917847680" TEXT="wird ben&#xf6;tigt um die Automations-Provision auf einen Basis-Wert anzuwenden"/>
<node CREATED="1788917877107" ID="ID_665324760" MODIFIED="1788918801557" TEXT="h&#xe4;ngt ab..."> <node CREATED="1788917877107" ID="ID_665324760" MODIFIED="1788917877107" TEXT="h&#xe4;ngt ab...">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -85564,8 +85566,15 @@
</html></richcontent> </html></richcontent>
<node CREATED="1788917882892" ID="ID_52090158" MODIFIED="1788917894364" TEXT="von der Metrik des Ergebnis-Parameters"/> <node CREATED="1788917882892" ID="ID_52090158" MODIFIED="1788917894364" TEXT="von der Metrik des Ergebnis-Parameters"/>
<node CREATED="1788917904223" ID="ID_1099728874" MODIFIED="1788917932855" TEXT="ggfs von einer abweichenden Scale der Automations-Provision"/> <node CREATED="1788917904223" ID="ID_1099728874" MODIFIED="1788917932855" TEXT="ggfs von einer abweichenden Scale der Automations-Provision"/>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1789164533222" ID="ID_1017590695" MODIFIED="1789164556832" TEXT="Problem: kann auch vom Typ des Beitrags (und des Basis-Werts) abh&#xe4;ngen">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1789164561486" ID="ID_376197998" MODIFIED="1789164593909" TEXT="bedeutet: die darauf aufbauende Provision mu&#xdf; ggfs. einen double-Dispatch machen"/>
<node CREATED="1789165221192" ID="ID_388299163" MODIFIED="1789165234448" TEXT="die Basis-Implementierung mu&#xdf; dann generisch sein und von Scale bereitgestellt werden"/>
<node CREATED="1789165187065" ID="ID_1109273270" MODIFIED="1789165213989" TEXT="Konsequenz &#x27f9; die Scale mu&#xdf; hier zwei Typ-Parameter nehmen"/>
<node CREATED="1789165444623" ID="ID_1649021234" MODIFIED="1789165459491" TEXT="vereinfachte Variante f&#xfc;r identische Scale"/>
</node> </node>
<node CREATED="1788918491304" ID="ID_991615591" MODIFIED="1788918753513" TEXT="Beschlu&#xdf;: hier Heuristik &#x2014; keine eigene Taxonomie"> </node>
<node CREATED="1788918491304" ID="ID_991615591" MODIFIED="1788918491304" TEXT="Beschlu&#xdf;: hier Heuristik &#x2014; keine eigene Taxonomie">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -85593,7 +85602,8 @@
<node CREATED="1789072817738" ID="ID_621244531" MODIFIED="1789072844560" TEXT="man k&#xf6;nnte &#xbb;Scales&#xab; ins Zentrum stellen &#x2014; oder als Rand-Thema betrachten"/> <node CREATED="1789072817738" ID="ID_621244531" MODIFIED="1789072844560" TEXT="man k&#xf6;nnte &#xbb;Scales&#xab; ins Zentrum stellen &#x2014; oder als Rand-Thema betrachten"/>
<node CREATED="1789073532638" ID="ID_1112609990" MODIFIED="1789073555185" TEXT="Eine Frage des &#xbb;Navigierens&#xab; : was verbaut man sich und womit verspielt man sich"/> <node CREATED="1789073532638" ID="ID_1112609990" MODIFIED="1789073555185" TEXT="Eine Frage des &#xbb;Navigierens&#xab; : was verbaut man sich und womit verspielt man sich"/>
</node> </node>
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789002615502" ID="ID_1161327543" LINK="https://claude.ai/share/784807f3-8fb3-4c1f-85c0-95355e79a9db" MODIFIED="1789082794573" TEXT="eine Design-Konversation mit Claude gef&#xfc;hrt"> <node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789002615502" ID="ID_1161327543" LINK="https://claude.ai/share/784807f3-8fb3-4c1f-85c0-95355e79a9db" MODIFIED="1789082726792" TEXT="eine Design-Konversation mit Claude gef&#xfc;hrt">
<linktarget COLOR="#51bbdf" DESTINATION="ID_1161327543" ENDARROW="Default" ENDINCLINATION="231;13;" ID="Arrow_ID_994670578" SOURCE="ID_383248634" STARTARROW="None" STARTINCLINATION="-183;-140;"/>
<icon BUILTIN="wizard"/> <icon BUILTIN="wizard"/>
<node CREATED="1789002670195" ID="ID_1638903618" MODIFIED="1789074297728" TEXT="Schritt-1 : gebe ihm nur high-level Kontext"> <node CREATED="1789002670195" ID="ID_1638903618" MODIFIED="1789074297728" TEXT="Schritt-1 : gebe ihm nur high-level Kontext">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -85867,7 +85877,8 @@
</node> </node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1789082704022" ID="ID_1925473607" MODIFIED="1789082723794" TEXT="mu&#xdf; eine Registry bereits jetzt bauen"> <node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1789082704022" ID="ID_1925473607" MODIFIED="1789082723794" TEXT="mu&#xdf; eine Registry bereits jetzt bauen">
<icon BUILTIN="yes"/> <icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789082726792" ID="ID_383248634" MODIFIED="1789082813652" TEXT="Frage im bestehenden Chat nochmal nach &#x2014; mit konkretem Implementierungs-Szenario"> <node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789082726792" ID="ID_383248634" MODIFIED="1789082726792" TEXT="Frage im bestehenden Chat nochmal nach &#x2014; mit konkretem Implementierungs-Szenario">
<arrowlink COLOR="#51bbdf" DESTINATION="ID_1161327543" ENDARROW="Default" ENDINCLINATION="231;13;" ID="Arrow_ID_994670578" STARTARROW="None" STARTINCLINATION="-183;-140;"/>
<icon BUILTIN="wizard"/> <icon BUILTIN="wizard"/>
<node CREATED="1789082815287" ID="ID_104427970" MODIFIED="1789082927619" TEXT="beschreibe Registrierung des Scale-Desriptors"> <node CREATED="1789082815287" ID="ID_104427970" MODIFIED="1789082927619" TEXT="beschreibe Registrierung des Scale-Desriptors">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
@ -85916,11 +85927,19 @@
<node CREATED="1789083115404" ID="ID_564486206" MODIFIED="1789083136019" TEXT="Sichtbarkeit der neuen Scale-Definition &#x27f9; Argument stichhaltig"> <node CREATED="1789083115404" ID="ID_564486206" MODIFIED="1789083136019" TEXT="Sichtbarkeit der neuen Scale-Definition &#x27f9; Argument stichhaltig">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
<node COLOR="#5b280f" CREATED="1789083137852" ID="ID_1965196365" MODIFIED="1789083170965" TEXT="Interne Index-Organisation in der Deque &#x27f9; nicht durch das Argument gedeckt"> <node COLOR="#5b280f" CREATED="1789083137852" ID="ID_1965196365" MODIFIED="1789155688917" TEXT="Interne Index-Organisation in der Deque &#x27f9; nicht durch das Argument gedeckt">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
w&#228;hrend dem Neuhinzuf&#252;gen k&#246;nnten Render-Worker concurrent den Index verwenden &#8212; hierf&#252;r gibt es aber keinerlei Konsistenz-Garantie (nur die Payload Storage-Adressen in der Deque sind garantiert stabil) &#10233; &#187;undefined behaviour&#171;
</p>
</body>
</html></richcontent>
<icon BUILTIN="button_cancel"/> <icon BUILTIN="button_cancel"/>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789083189238" ID="ID_735608493" MODIFIED="1789083464492" TEXT="Claude schl&#xe4;gt als Alternative eine globale Index-Tabelle vor, mit atomic-Slots f&#xfc;r &#xbb;Extents&#xab;"> <node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789083189238" ID="ID_735608493" MODIFIED="1789083189238" TEXT="Claude schl&#xe4;gt als Alternative eine globale Index-Tabelle vor, mit atomic-Slots f&#xfc;r &#xbb;Extents&#xab;">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head/> <head/>
<body> <body>
@ -85933,27 +85952,24 @@
address computation touches nothing a writer mutates. address computation touches nothing a writer mutates.
</p> </p>
<div> <div>
<div role="group" aria-label="cpp code" tabindex="0"> <pre><font size="2">
<div> class ScaleRegistry
<div>
<pre>
<font size="2">class ScaleRegistry
{ {
static constexpr size_t CHUNK = 256; static constexpr size_t CHUNK = 256;
static constexpr size_t MAX = 256; // &#8793; 65536 scales static constexpr size_t MAX = 256; // &amp;#8793; 65536 scales
struct Chunk { ScaleDescriptor slot[CHUNK]; }; struct Chunk { ScaleDescriptor slot[CHUNK]; };
std::array<std atomic="#DEFAULT" size="2"><chunk size="2">, MAX&gt; chunk_{}; std::array&lt;std atomic=&quot;#DEFAULT&quot; size=&quot;2&quot;&gt;&lt;chunk size=&quot;2&quot;&gt;, MAX&amp;gt; chunk_{};
std::mutex writeGuard_; // writers only std::mutex writeGuard_; // writers only
size_t next_ {0}; // guarded size_t next_ {0}; // guarded
public: public:
ScaleDescriptor const&amp; ScaleDescriptor const&amp;amp;
operator[] (ScaleID id) const // lock-free, engine path operator[] (ScaleID id) const // lock-free, engine path
{ {
return chunk_[id / CHUNK].load (std::memory_order_acquire) return chunk_[id / CHUNK].load (std::memory_order_acquire)
-&gt;slot[id % CHUNK]; -&amp;gt;slot[id % CHUNK];
} }
ScaleID ScaleID
@ -85961,16 +85977,13 @@
{ {
std::lock_guard lock{writeGuard_}; std::lock_guard lock{writeGuard_};
size_t id = next_++; size_t id = next_++;
auto&amp; head = chunk_[id / CHUNK]; auto&amp;amp; head = chunk_[id / CHUNK];
if (not head.load (std::memory_order_relaxed)) if (not head.load (std::memory_order_relaxed))
head.store (new Chunk{}, std::memory_order_release); head.store (new Chunk{}, std::memory_order_release);
head.load (std::memory_order_relaxed)-&gt;slot[id % CHUNK] = std::move(def); head.load (std::memory_order_relaxed)-&amp;gt;slot[id % CHUNK] = std::move(def);
return ScaleID{id}; return ScaleID{id};
} }
};</font></pre> };</font></pre>
</div>
</div>
</div>
</div> </div>
<p> <p>
@ -85998,6 +86011,7 @@
</p> </p>
</body> </body>
</html></richcontent> </html></richcontent>
<arrowlink COLOR="#426aa5" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="28;-70;" ID="Arrow_ID_1818399541" STARTARROW="None" STARTINCLINATION="-393;12;"/>
<icon BUILTIN="wizard"/> <icon BUILTIN="wizard"/>
</node> </node>
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789083492013" ID="ID_816421539" MODIFIED="1789083498973" TEXT="zwei weitere Vorschl&#xe4;ge"> <node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1789083492013" ID="ID_816421539" MODIFIED="1789083498973" TEXT="zwei weitere Vorschl&#xe4;ge">
@ -86024,6 +86038,10 @@
</node> </node>
</node> </node>
</node> </node>
<node CREATED="1789159365103" ID="ID_435108847" MODIFIED="1789159397705" TEXT="sollte dann wohl gleich eine generische Registry sein...">
<linktarget COLOR="#426aa5" DESTINATION="ID_435108847" ENDARROW="Default" ENDINCLINATION="28;-70;" ID="Arrow_ID_1818399541" SOURCE="ID_735608493" STARTARROW="None" STARTINCLINATION="-393;12;"/>
<node CREATED="1789159448086" ID="ID_1755995276" MODIFIED="1789159547368" TEXT="Feste Index-Tabelle + heap-allozierte Extents"/>
</node>
</node> </node>
</node> </node>
</node> </node>
@ -86231,6 +86249,21 @@
<icon BUILTIN="hourglass"/> <icon BUILTIN="hourglass"/>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1789159639409" ID="ID_654373559" MODIFIED="1789159678163" TEXT="Scale-Eigenschaften abstecken per ParameterScale_test">
<icon BUILTIN="pencil"/>
<node CREATED="1789159687318" ID="ID_1480074646" MODIFIED="1789160197623" TEXT="Hier nur rein die Scale-Descriptoren und das intendierte Verhalten">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...nicht aber die Registrierung und Einbindung in die Parameter
</p>
</body>
</html></richcontent>
<arrowlink COLOR="#852a28" DESTINATION="ID_320664672" ENDARROW="Default" ENDINCLINATION="-765;515;" ID="Arrow_ID_1819779589" STARTARROW="None" STARTINCLINATION="199;8;"/>
<icon BUILTIN="idea"/>
</node>
</node>
</node> </node>
</node> </node>
</node> </node>