2 #include <Engine/Node/SimpleApi.hpp>
4 #include <ossia/detail/hash_map.hpp>
5 #include <ossia/detail/math.hpp>
6 #include <ossia/detail/ssize.hpp>
13 #define debug_vector_t std::vector
78 int suffix_transition_;
80 void singleTransitionResize() {
transition_.resize(10); }
87 int phi = 0, k = 0, fo_iter = 0, current_state = 1;
88 std::vector<T> input_values;
90 std::vector<std::vector<int>>
94 this->states_.resize(2);
95 this->states_[0].state_ = 0;
96 this->states_[0].lrs_ = 0;
97 this->states_[0].suffix_transition_ = -1;
109 this->states_.resize(i + 1);
111 T alpha = word[i - 1];
112 this->AddState(i - 1);
113 int state_m_plus_one = i;
114 this->AddTransition(i - 1, i, alpha);
115 k = this->states_[i - 1].suffix_transition_;
117 int flag = 0, iter = 0;
124 while(k > -1 && flag == 0)
126 while(iter < std::ssize(this->states_[k].transition_))
128 if(this->states_[k].transition_[iter].symbol_ == alpha)
136 this->AddTransition(k, state_m_plus_one, alpha);
138 k = this->states_[k].suffix_transition_;
144 this->states_[state_m_plus_one].suffix_transition_ = 0;
145 this->states_[state_m_plus_one].lrs_ = 0;
150 if(this->states_[k].transition_[iter].symbol_ == alpha)
153 this->states_[state_m_plus_one].suffix_transition_
154 = this->states_[k].transition_[iter].last_state_;
155 this->states_[state_m_plus_one].lrs_
156 = this->LengthCommonSuffix(
157 phi, this->states_[state_m_plus_one].suffix_transition_ - 1)
160 while(iter < this->
states_[k].transition_.size() && flag == 0)
162 if(this->states_[k].transition_[iter].symbol_ == alpha)
165 this->states_[state_m_plus_one].suffix_transition_
166 = this->states_[k].transition_[iter].last_state_;
167 this->states_[state_m_plus_one].lrs_
168 = this->LengthCommonSuffix(
169 phi, this->states_[state_m_plus_one].suffix_transition_ - 1)
177 T temp_word = word[state_m_plus_one - this->states_[state_m_plus_one].lrs_ - 1];
178 k = this->
FindBetter(state_m_plus_one, temp_word, word);
181 this->states_[state_m_plus_one].lrs_ = this->states_[state_m_plus_one].lrs_ + 1;
182 this->states_[state_m_plus_one].suffix_transition_ = k;
184 RevSuffix[this->states_[state_m_plus_one].suffix_transition_].push_back(
185 std::move(state_m_plus_one));
188 int LengthCommonSuffix(
int phi_one,
int phi_two)
190 if(phi_two == this->states_[phi_one].suffix_transition_)
191 return this->states_[phi_one].lrs_;
194 while(this->states_[phi_one].suffix_transition_
195 != this->states_[phi_two].suffix_transition_)
196 phi_two = this->states_[phi_two].suffix_transition_;
198 if(this->states_[phi_one].lrs_ <= this->
states_[phi_two].lrs_)
199 return this->states_[phi_one].lrs_;
201 return this->states_[phi_two].lrs_;
213 int len_t = this->
RevSuffix[this->states_[i].suffix_transition_].size();
214 int state_i = this->states_[i].suffix_transition_;
218 for(
int j = 0; j < len_t; j++)
220 if(this->states_[this->
RevSuffix[this->states_[i].suffix_transition_][j]].lrs_
221 == this->states_[i].lrs_
223 [this->
RevSuffix[this->states_[i].suffix_transition_][j]
224 - this->states_[i].lrs_ - 1]
227 int out =
RevSuffix[this->states_[i].suffix_transition_][j];
242 std::random_device rd;
243 std::mt19937 gen(rd());
244 std::uniform_real_distribution<> dis(0.0, 1.0);
247 if(this->states_.size() == 2 || this->states_.size() == 1)
249 v.push_back(this->states_[0].transition_[0].symbol_);
256 int len = this->states_.size();
259 T w = this->states_[i].transition_[0].symbol_;
260 v.push_back(std::move(w));
265 = this->states_[this->states_[i].suffix_transition_].transition_.size() - 1;
266 std::random_device rd;
267 std::mt19937 gen(rd());
268 std::uniform_int_distribution<> dis_int(0, lenSuffix);
269 int rand_alpha = dis_int(gen);
270 T alpha = this->states_[this->states_[i].suffix_transition_]
271 .transition_[rand_alpha]
273 i = this->states_[this->states_[i].suffix_transition_]
274 .transition_[rand_alpha]
280 v.push_back(std::move(alpha));
291 int len = std::ssize(word);
292 this->states_.resize(2);
293 this->states_[0].state_ = 0;
294 this->states_[0].lrs_ = 0;
295 this->states_[0].suffix_transition_ = -1;
298 void AddState(
int first_state) { this->states_[first_state].state_ = first_state; };
299 void AddTransition(
int first_state,
int last_state, T symbol)
301 SingleTransition<T> transition_i;
302 transition_i.first_state_ = first_state;
303 transition_i.last_state_ = last_state;
304 transition_i.symbol_ = std::move(symbol);
305 this->states_[first_state].transition_.push_back(std::move(transition_i));
307 std::vector<T> CallGenerate(
int len,
float q)
310 std::vector<T> oracle = {};
312 for(
int x = 0; x < len; x++)
314 oracle = this->
FOGenerate(fo_iter, oracle, q);
322 namespace Nodes::FactorOracle2
328 static const constexpr
auto prettyName =
"New Factor Oracle";
329 static const constexpr
auto objectKey =
"New Factor Oracle";
330 static const constexpr
auto category =
"Control/Impro";
331 static const constexpr
auto author =
"Maria Paula Carrero Rivas";
332 static const constexpr
auto kind = Process::ProcessCategory::Mapping;
333 static const constexpr
auto description =
"Factor Oracle algorithm .";
334 static const constexpr
auto tags = std::array<const char*, 0>{};
335 static const uuid_constexpr
auto uuid
336 = make_uuid(
"66F1C352-C48F-40A2-9283-35C2CB376258");
338 static const constexpr
auto controls
340 static const constexpr value_in value_ins[]{
"in",
"regen",
"bang"};
341 static const constexpr value_out value_outs[]{
"out"};
347 std::size_t sequence_idx{};
348 debug_vector_t<ossia::value> sequence;
351 ossia::value* buffer =
nullptr;
352 using control_policy = ossia::safe_nodes::last_tick;
354 run(
const ossia::value_port& in,
const ossia::value_port& regen,
355 const ossia::value_port& bangs,
int seq_len, ossia::value_port& out,
356 ossia::token_request, ossia::exec_state_facade,
State&
self)
360 for(
auto val : in.get_data())
362 self.oracle.input_values.push_back(val.value);
363 self.oracle.AddLetter(
self.oracle.current_state,
self.oracle.input_values);
364 self.oracle.current_state =
self.oracle.current_state + 1;
367 if(!regen.get_data().empty())
369 self.sequence =
self.oracle.CallGenerate(seq_len, 0.6);
372 if(!
self.sequence.empty())
374 for(
auto& bang : bangs.get_data())
376 self.sequence_idx = ossia::clamp<int64_t>(
377 (int64_t)
self.sequence_idx, 0, (int64_t)
self.sequence.size() - 1);
378 out.write_value(
self.sequence[
self.sequence_idx], bang.timestamp);
379 self.sequence_idx = (
self.sequence_idx + 1) %
self.sequence.size();
384 #undef debug_vector_t
Definition: FactorOracle2.hpp:85
int FindBetter(int i, T alpha, const std::vector< T > word)
Definition: FactorOracle2.hpp:203
std::vector< std::vector< int > > RevSuffix
Definition: FactorOracle2.hpp:91
FactorOracle()
Definition: FactorOracle2.hpp:92
std::vector< State< T > > states_
Definition: FactorOracle2.hpp:89
std::vector< T > FOGenerate(int &i, std::vector< T > v, float q)
Definition: FactorOracle2.hpp:233
void AddLetter(int i, const std::vector< T > word)
Definition: FactorOracle2.hpp:100
void FactorOracleStart(const std::vector< T > word)
Definition: FactorOracle2.hpp:285
Definition: FactorOracle2.hpp:59
int first_state_
Definition: FactorOracle2.hpp:61
int last_state_
Definition: FactorOracle2.hpp:62
T symbol_
Definition: FactorOracle2.hpp:63
std::vector< SingleTransition< T > > transition_
denotes the number of the state
Definition: FactorOracle2.hpp:77
int state_
denotes the number of the state
Definition: FactorOracle2.hpp:76
Utilities for OSSIA data structures.
Definition: DeviceInterface.hpp:33
Definition: score-lib-process/Control/Widgets.hpp:178
Definition: FactorOracle2.hpp:325