Invocation: groundwork for a Parameter-Build-Spec

...which in turn would then allow
 * to refer to extended parameters within scope
 * to build a Param(Agent)Node, which builds a parameter tuple
   by invoking the given parameter-functors

Can now demonstrate in the test
 * define several »slots«, each with either value or functor
 * apply these functors to a `TurnoutSystem`
This commit is contained in:
Fischlurch 2024-12-29 03:23:59 +01:00
parent 3406b6abf5
commit f990f97c41
6 changed files with 153 additions and 14 deletions

View file

@ -47,6 +47,7 @@ namespace error = lumiera::error;
#include "lib/time/timequant.hpp"
#include "lib/time/quantiser.hpp"
#include "lib/time/timecode.hpp"
#include "lib/time/mutation.hpp"
#include "common/advice.hpp"
@ -98,6 +99,20 @@ namespace time {
return retrieveQuantiser (gridID);
}
/**
* @remark Handles the common case to determine the frame number relative to some time grid.
* The regular path for this conversion would be to have a quantiser for this grid,
* to construct a QuTime and then a FrameNr instance based on this QuTime. Assuming
* that the grid is actually well-known and was registered via Advice-System with
* a symbolic ID, the quantiser can directly be retrieved and applied to convert.
*/
FrameCnt
FrameNr::quant (Time const& time, Symbol gridID)
{
return Quantiser::retrieve(gridID)->gridPoint (time);
}
/** build a time mutation to \em nudge the target time value in steps based on a pre-defined grid.
* @param adjustment number of grid steps to apply as offset

View file

@ -107,6 +107,9 @@ namespace time {
FrameNr (QuTime const& quantisedTime);
/** convenience shortcut: time grid to frame number */
static FrameCnt quant (Time const&, Symbol gridID);// defined in common-services.cpp
using TCode::operator string;
// CountVal implicitly convertible to long ///////////TICKET #882 : outch! should be a 64bit type!
};

View file

@ -43,6 +43,9 @@
#include "steam/engine/turnout.hpp"
#include "steam/engine/turnout-system.hpp"
#include "steam/engine/feed-manifold.hpp" ////////////TODO wegdamit
#include "lib/meta/function.hpp"
#include "lib/meta/variadic-helper.hpp"
#include "lib/meta/tuple-helper.hpp"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1367 : Rebuild the Node Invocation
//#include "vault/gear/job.h"
//#include "steam/engine/exit-node.hpp"
@ -64,6 +67,8 @@ namespace steam {
namespace engine {
using std::move;
using std::forward;
using std::make_tuple;
using std::tuple;
using lib::Several;////TODO RLY?
@ -73,11 +78,53 @@ namespace engine {
{
using Functors = tuple<FUNZ...>;
using ResTypes = typename lib::meta::ElmTypes<Functors>::template Apply<lib::meta::_FunRet>;
using ParamTup = lib::meta::Tuple<ResTypes>;
Functors functors_;
ParamBuildSpec (Functors&& funz)
: functors_{move (funz)}
{ }
template<typename FUN>
auto
addSlot (FUN&& paramFun)
{
return ParamBuildSpec<ANK,FUNZ...,FUN>{std::tuple_cat (move(functors_)
,make_tuple (forward<FUN>(paramFun)))};
}
template<typename PAR>
auto
addValSlot (PAR paramVal)
{
return addSlot ([paramVal](TurnoutSystem&){ return paramVal; });
}
template<size_t slot>
class Slot
: util::MoveOnly
{
ParamBuildSpec& spec_;
Slot (ParamBuildSpec& spec)
: spec_{spec}
{ }
friend class ParamBuildSpec;
public:
auto
invokeParamFun (TurnoutSystem& turnoutSys)
{
return std::get<slot> (spec_.functors_) (turnoutSys);
}
};
template<size_t idx>
Slot<idx>
slot()
{ return *this; }
};
auto

View file

@ -62,6 +62,9 @@ namespace engine {
{
public:
using FrontBlock = lib::HeteroData<Time,ProcessKey>;
enum {SLOT_TIME = 0
,SLOT_KEY = 1
};
private:
FrontBlock invoParam_;
@ -70,6 +73,12 @@ namespace engine {
TurnoutSystem (Time absoluteNominalTime, ProcessKey procKey =0)
: invoParam_{FrontBlock::build (absoluteNominalTime,procKey)}
{ }
Time
getNomTime()
{
return invoParam_.get<SLOT_TIME>();
}
};

View file

@ -24,7 +24,9 @@
#include "steam/engine/turnout-system.hpp"
#include "steam/engine/turnout.hpp"
#include "steam/engine/diagnostic-buffer-provider.hpp"
#include "steam/asset/meta/time-grid.hpp"
#include "lib/several-builder.hpp"
#include "lib/time/timecode.hpp"
#include "lib/test/diagnostic-output.hpp"/////////////////////TODO
//#include "lib/util.hpp"
@ -32,6 +34,8 @@
//using std::string;
using lib::Several;
using lib::makeSeveral;
using lib::time::Time;
using lib::time::FSecs;
namespace steam {
@ -105,8 +109,26 @@ namespace test {
void
feedParamNode()
{
auto spec = buildParamSpec();
SHOW_TYPE(decltype(spec))
steam::asset::meta::TimeGrid::build("grid_sec", 1);
auto fun1 = [](TurnoutSystem& turSys)
{
return lib::time::FrameNr::quant (turSys.getNomTime(), "grid_sec");
};
auto spec = buildParamSpec()
.addValSlot (LIFE_AND_UNIVERSE_4EVER)
.addSlot (move (fun1))
;
using Spec = decltype(spec);
SHOW_TYPE(Spec)
SHOW_TYPE(Spec::ParamTup)
TurnoutSystem turnoutSys{Time{FSecs(5,2)}};
auto v0 = spec.slot<0>().invokeParamFun (turnoutSys);
auto v1 = spec.slot<1>().invokeParamFun (turnoutSys);
SHOW_EXPR(v0)
SHOW_EXPR(v1)
TODO ("implement a simple Builder for ParamAgent-Node");
TODO ("then use both together to demonstrate a param data feed here");
}

View file

@ -86884,7 +86884,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<head/>
<body>
<p>
Das mu&#223; so sein aus Gr&#252;nden der logischen Konsistenz: Der Invocation-Mechanismus der Render-Engine ist generisch, und das bedeutet, er kann nichts implizit &#252;ber das zu rendernde Modell wissen; zwar wird f&#252;r den Build-Vorgang in <i>absolute Placements</i>&#160; reduziert, aber diese beziehen sich immer noch auf eine bestimmte Timeline &#8212; ebenso wie der Render-Vorgang, der <i>auf einer Timeline</i>&#160; abl&#228;uft. Das bedeutet, <i>f&#252;r den Rendervorgang</i>&#160;ist das Koordinatensystem <i>implizit</i>, und er gibt nur eine <b>absolute nominal Time</b>&#160;relativ dazu an; jedoch wird dieser implizite Kontext in der Job-Planung &#252;bersetzt in den Zugriff auf eine bestimmte <i>konkrete Exit-Node.</i>&#160;Insofern kann dann ein Job komplett generisch auf der Render-Engine laufen, denn er tarnsportiert sowohl die <i>absolute nominal Time,</i>&#160;alsauch die <i>konkrete ExitNode</i>. Das Turnout-System selber ist ebenfalls generisch, und das hei&#223;t, es wird nur sinnvoll in Verbindung mit einer ExitNode zur Auff&#252;hrung gebracht
Das mu&#223; so sein aus Gr&#252;nden der logischen Konsistenz: Der Invocation-Mechanismus der Render-Engine ist generisch, und das bedeutet, er kann nichts implizit &#252;ber das zu rendernde Modell wissen; zwar wird f&#252;r den Build-Vorgang in <i>absolute Placements </i>reduziert, aber diese beziehen sich immer noch auf eine bestimmte Timeline &#8212; ebenso wie der Render-Vorgang, der <i>auf einer Timeline </i>abl&#228;uft. Das bedeutet, <i>f&#252;r den Rendervorgang </i>ist das Koordinatensystem <i>implizit</i>, und er gibt nur eine <b>absolute nominal Time</b>&#160;relativ dazu an; jedoch wird dieser implizite Kontext in der Job-Planung &#252;bersetzt in den Zugriff auf eine bestimmte <i>konkrete Exit-Node.</i>&#160;Insofern kann dann ein Job komplett generisch auf der Render-Engine laufen, denn er tarnsportiert sowohl die <i>absolute nominal Time, </i>alsauch die <i>konkrete ExitNode</i>. Das Turnout-System selber ist ebenfalls generisch, und das hei&#223;t, es wird nur sinnvoll in Verbindung mit einer ExitNode zur Auff&#252;hrung gebracht
</p>
</body>
</html></richcontent>
@ -88249,6 +88249,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<node CREATED="1735434392994" ID="ID_276802280" MODIFIED="1735434450300" TEXT="getNomTime()"/>
<node CREATED="1735434466608" ID="ID_1767556385" MODIFIED="1735434474355" TEXT="getProcKey()"/>
</node>
<node CREATED="1735319814705" ID="ID_1191574208" MODIFIED="1735321333153" TEXT="Zugang zu Chain-Datablock Typ-Konstruktor aus dem NodeBuilder">
<richcontent TYPE="NOTE"><html>
@ -88473,6 +88475,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</ul>
</body>
</html></richcontent>
<node COLOR="#6e4398" CREATED="1735433957835" HGAP="34" ID="ID_1295659864" MODIFIED="1735434125854" TEXT="naja... etwas Mitleid darf man schon haben" VSHIFT="3">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...hab jetzt die Abk&#252;rzung eingebaut FrameNr::quant (time, &quot;Grid&quot;)
</p>
<p>
.... somit spart man sich das Konstruiren der QuTime, und einer FrameNr instanz, blo&#223; um dann letztlich in einen int64_t umzuwandeln. Ich halte das f&#252;r vertretbar, da dennoch das Grid explizit genannt sein mu&#223;...
</p>
</body>
</html></richcontent>
<font NAME="SansSerif" SIZE="11"/>
<icon BUILTIN="ksmiletris"/>
</node>
</node>
<node CREATED="1733585833256" ID="ID_423093899" MODIFIED="1733585852018" TEXT="der Test erzeugt eine zuf&#xe4;llige nominal Time"/>
<node CREATED="1733585871755" ID="ID_1296941844" MODIFIED="1733586199513" TEXT="der Quantiser mu&#xdf; aber in den Render-Nodes liegen">
@ -94165,7 +94182,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="pencil"/>
<node CREATED="1735416170297" ID="ID_736958022" MODIFIED="1735416236279" TEXT="brauche ParamBuildSpec">
<linktarget COLOR="#bb1f2e" DESTINATION="ID_736958022" ENDARROW="Default" ENDINCLINATION="-25;-162;" ID="Arrow_ID_44922252" SOURCE="ID_1577179744" STARTARROW="None" STARTINCLINATION="32;153;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735422554816" ID="ID_197118422" MODIFIED="1735422583207" TEXT="Aufgabe: schrittweise aufbauenbar">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735422554816" ID="ID_197118422" MODIFIED="1735438575232" TEXT="Aufgabe: schrittweise aufbaubar">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1735422591091" ID="ID_1649575055" MODIFIED="1735422735480" TEXT="Diskrepanz zu den HeteroData Chain-Blocks">
<richcontent TYPE="NOTE"><html>
@ -94175,8 +94192,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
Zur Erinnerung: HeteroData ist ein low-level Daten-Layout, das ich speziell f&#252;r den Anwendungsfall im Turnout mir ausgedacht habe; es beruht auf einer single-linked-List von Datenbl&#246;cken, in denen jeweils ein Datentupel sitzt. Und hier liegt das Problem: diese Chain-Bl&#246;cke sollen nun schrittweise &#252;ber eine Builder-Notation aufgebaut werden &#8212; aber die Konstruktor-Funktion in HeteroData erwartet die Angabe des <i>ganzen Tupel-Typs auf einmal.</i>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1735428828881" ID="ID_144632434" MODIFIED="1735428918508" TEXT="soll aber aus konkreten Funktoren schrittweise erstellt werden">
@ -94205,8 +94221,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<arrowlink COLOR="#637488" DESTINATION="ID_870944737" ENDARROW="Default" ENDINCLINATION="310;0;" ID="Arrow_ID_1871378220" STARTARROW="None" STARTINCLINATION="145;9;"/>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735430768108" ID="ID_1744058203" MODIFIED="1735430784322" TEXT="cross-builder-Funktionen in ParamBuildSpec selber">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1735430768108" ID="ID_1744058203" MODIFIED="1735438563756" TEXT="cross-builder-Funktionen in ParamBuildSpec selber">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
@ -94227,8 +94243,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
also ein Instanz-Typ allein legt alles fest; keine Indirektion oder Virtualisierung
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1735427390364" ID="ID_986815728" MODIFIED="1735427699072" TEXT="die Funktor-Typen m&#xfc;ssen wir speichern">
<richcontent TYPE="NOTE"><html>
@ -94248,8 +94263,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
...weil wir allein mit einer solchen ParamBuildSpec auf ein TurnoutSystem losgehen wollen; eine Hetero-Data prefix-Chain ist damit notwendig, als Anker-Punkt um einen konkreten Konstruktor f&#252;r einen Chain-Block zu generieren, den wir in den aktuellen StackFrame legen wollen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1735427835239" ID="ID_162062555" MODIFIED="1735427854369" TEXT="alle anderen Infos lassen sich ableiten">
<icon BUILTIN="idea"/>
@ -94277,11 +94291,36 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
&#10233; Ankerpunkt mu&#223; ein nested type <font color="#320bca" face="Monospaced">TurnoutSystem::FrontBlock </font>sein
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#637488" DESTINATION="ID_870944737" ENDARROW="Default" ENDINCLINATION="310;0;" ID="Arrow_ID_1871378220" SOURCE="ID_1331974543" STARTARROW="None" STARTINCLINATION="145;9;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735438595508" ID="ID_696254160" MODIFIED="1735438784764" TEXT="Implementierung">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1735438607044" ID="ID_1948837984" MODIFIED="1735438628651" TEXT="Builder-Anker: buildParamSpec()">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1735438630343" ID="ID_1798062923" MODIFIED="1735438645863" TEXT="cross-builder-Funktionen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1735438647474" ID="ID_1189899375" MODIFIED="1735438665977" TEXT="Typ-Ableitung f&#xfc;r Parameter-Werte">
<icon BUILTIN="button_ok"/>
<node CREATED="1735438678865" ID="ID_548533062" MODIFIED="1735438686677" TEXT="&#xe4;hnlich wie f&#xfc;r die FeedManifold"/>
<node CREATED="1735438687997" ID="ID_283878162" MODIFIED="1735438699784" TEXT="verwendet lib::meta::ElmTypes :: Apply"/>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1735438707680" ID="ID_1085577180" MODIFIED="1735438715228" TEXT="Zugriffs-Slot">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1735438717070" ID="ID_1429780349" MODIFIED="1735438724209" TEXT="jeweiligen Funktor aufrufen">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735438726120" ID="ID_1670785950" MODIFIED="1735438739642" TEXT="Daten-Accessor konstruieren">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735438743590" ID="ID_973914193" MODIFIED="1735438756220" TEXT="Storage-Tupel erzeugen">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1735416468553" ID="ID_1257939291" MODIFIED="1735416600613" TEXT="dient als Basis f&#xfc;r einen ParamNode-Builder">
<arrowlink COLOR="#5747d2" DESTINATION="ID_329885446" ENDARROW="Default" ENDINCLINATION="-844;-25;" ID="Arrow_ID_1824926310" STARTARROW="None" STARTINCLINATION="-633;42;"/>
@ -97712,6 +97751,10 @@ StM_bind(Builder&lt;R1&gt; b1, Extension&lt;R1,R2&gt; extension)
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1735417346027" ID="ID_1555206108" MODIFIED="1735417364905" TEXT="zun&#xe4;chst eine ParamBuildSpec anlegen">
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1735434511762" ID="ID_303778551" MODIFIED="1735434520154" TEXT="einfache Automations-Funktion">
<node CREATED="1735434522544" ID="ID_686486120" LINK="#ID_1295659864" MODIFIED="1735434554616" TEXT="brauche Zeit-Quantisierung"/>
<node CREATED="1735434579728" ID="ID_1335340741" LINK="#ID_276802280" MODIFIED="1735434603176" TEXT="brauche Accessor in TurnoutSystem"/>
</node>
</node>
</node>
</node>