diff --git a/include/wrapper/Messaging.hpp b/include/wrapper/Messaging.hpp index cf7b4c3..4e27305 100644 --- a/include/wrapper/Messaging.hpp +++ b/include/wrapper/Messaging.hpp @@ -14,6 +14,8 @@ struct FluidSCMessaging{ static auto getInterfaceTable(){ return FluidSCWrapper::getInterfaceTable(); } static auto getName(){ return FluidSCWrapper::getName(); } + using Params = typename Client::ParamSetType; + using ParamValues = typename Params::ValueTuple; template struct MessageDispatchCmd @@ -117,6 +119,13 @@ struct FluidSCMessaging{ return willContinue; } + static void refreshParams(Params& p, MessageResult& r) + { + p.fromTuple(ParamValues(r)); + } + + template + static void refreshParams(Params&,MessageResult&){} template static void doMessage(World* inWorld, void* inUserData, struct sc_msg_iter* args, void* replyAddr) @@ -168,6 +177,8 @@ struct FluidSCMessaging{ if (!m->result.ok()) FluidSCWrapper::printResult(world, m->result); + else + refreshParams(ptr->mParams, m->result); } else FluidSCWrapper::printNotFound(m->id); return true; diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index 607ab1b..93159df 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -23,8 +23,9 @@ namespace impl { template class NonRealTime : public SCUnit { +public: using Params = typename Client::ParamSetType; - +private: template static T* rtalloc(World* world, Args&&... args) { diff --git a/release-packaging/Classes/FluidMLP.sc b/release-packaging/Classes/FluidMLP.sc index 1de31a5..e486d99 100644 --- a/release-packaging/Classes/FluidMLP.sc +++ b/release-packaging/Classes/FluidMLP.sc @@ -65,6 +65,15 @@ FluidMLPRegressor : FluidModelObject { this.prSendMsg(this.predictPointMsg(sourceBuffer, targetBuffer)); } + read { |filename, action| + actions[\read] = [numbers(FluidMessageResponse,_,nil,_), { + |data| + this.prUpdateParams(data); + action.value; + }]; + this.prSendMsg(this.readMsg(filename)); + } + kr{|trig, inputBuffer,outputBuffer, tapIn = 0, tapOut = -1| var params; tapIn = tapIn ? this.tapIn; @@ -78,6 +87,17 @@ FluidMLPRegressor : FluidModelObject { ^FluidMLPRegressorQuery.kr(trig,this, *params); } + prUpdateParams{|data| + var rest = data.keep(-9); + this.hidden_(data.drop(1).drop(-9).copy); + [\activation_, \outputActivation_, + \tapIn_, \tapOut_, \maxIter_, + \learnRate_, \momentum_, + \batchSize_, \validation_] + .do{|prop,i| + this.performList(prop,rest[i]); + }; + } } FluidMLPRegressorQuery : FluidRTMultiOutUGen { @@ -151,6 +171,27 @@ FluidMLPClassifier : FluidModelObject { this.prSendMsg(this.predictPointMsg(sourceBuffer)); } + + read { |filename, action| + actions[\read] = [numbers(FluidMessageResponse,_,nil,_), { + |data| + this.prUpdateParams(data); + action.value; + }]; + this.prSendMsg(this.readMsg(filename)); + } + + prUpdateParams{|data| + var rest = data.keep(-6); + this.hidden_(data.drop(1).drop(-6).copy); + [\activation_, \maxIter_, + \learnRate_, \momentum_, + \batchSize_, \validation_] + .do{|prop,i| + this.performList(prop,rest[i]); + }; + } + kr{|trig, inputBuffer,outputBuffer| var params = [this.prEncodeBuffer(inputBuffer),