1impl Decompose for Alignment{
2 fn compose(decomposition:Self::Decomposition)->Self{
3 match decomposition{0=>Self::Center,1=>Self::Left,2=>Self::Right,_=>panic!("unknown alignment number")}
4 }
5 fn decompose(self)->Self::Decomposition{
6 match self{Self::Center=>0,Self::Left=>1,Self::Right=>2}
7 }
8 fn decompose_cloned(&self)->Self::Decomposition{
9 match self{Self::Center=>0,Self::Left=>1,Self::Right=>2}
10 }
11 type Decomposition=usize;
12}
13impl Decompose for OnMismatch{fn compose(decomposition:Self::Decomposition)->Self{
15 match decomposition%10{0=>Self::Error,1=>Self::Pad(Alignment::compose(decomposition/10)),2=>Self::Truncate(Alignment::compose(decomposition/10)),_=>panic!("unknown mismatch number")}
16 }
17 fn decompose(self)->Self::Decomposition{
18 match self{Self::Error=>0,Self::Pad(a)=>a.decompose()*10+1,Self::Truncate(a)=>a.decompose()*10+2}
19 }
20 fn decompose_cloned(&self)->Self::Decomposition{self.clone().decompose()}
21 type Decomposition=usize;
22}
23impl Decompose for ReductionMode{
24 fn compose(decomposition:u64)->Self{
25 match decomposition>>32{0=>Self::Component,1=>Self::Dim(decomposition as i32),2=>Self::Tensor,_=>panic!("unknown reduction mode number")}
26 }
27 fn decompose(self)->Self::Decomposition{
28 match self{Self::Component=>0,Self::Dim(x)=>(1_u64<<32)|(x as u32 as u64),Self::Tensor=>2<<32}
29 }
30 fn decompose_cloned(&self)->Self::Decomposition{self.clone().decompose()}
31 type Decomposition=u64;
32}
33impl Default for Alignment{
34 fn default()->Self{Self::Left}
35}
36impl Default for OnMismatch{
37 fn default()->Self{Self::Error}
38}
39impl Default for ReductionMode{
40 fn default()->Self{Self::Component}
41}
42impl<M:AI<M::Output,M::Output>+Op> Sequential<Vec<M>>{
43 pub fn with_next<A:Into<M>>(mut self,m:A)->Self{
45 self.inner_mut().push(m.into());
46 self
47 }
48}
49impl<A:AI<R,S>+Op<Output=S>,B:AI<S,T>+Op<Output=T>,C:AI<T,U>+Op<Output=U>,D:AI<U,V>+Op<Output=V>,E:AI<V,W>+Op<Output=W>,F:AI<W,X>+Op<Output=X>,G:AI<X,Y>+Op<Output=Y>,H:AI<Y,Z>,R,S,T,U,V,W,X,Y,Z> AI<R,Z> for Sequential<(A,B,C,D,E,F,G,H)>{
50 fn forward(&self,input:R)->Z{
51 let (a,b,c,d,e,f,g,h)=self.inner();
52 h.forward(g.forward(f.forward(e.forward(d.forward(c.forward(b.forward(a.forward(input))))))))
53 }
54 fn forward_mut(&mut self,input:R)->Z{
55 let (a,b,c,d,e,f,g,h)=self.inner_mut();
56 h.forward(g.forward_mut(f.forward_mut(e.forward_mut(d.forward_mut(c.forward_mut(b.forward_mut(a.forward_mut(input))))))))
57 }
58}
59impl<A:AI<S,T>+Op<Output=T>,B:AI<T,U>+Op<Output=U>,C:AI<U,V>+Op<Output=V>,D:AI<V,W>+Op<Output=W>,E:AI<W,X>+Op<Output=X>,F:AI<X,Y>+Op<Output=Y>,G:AI<Y,Z>,S,T,U,V,W,X,Y,Z> AI<S,Z> for Sequential<(A,B,C,D,E,F,G)>{
60 fn forward(&self,input:S)->Z{
61 let (a,b,c,d,e,f,g)=self.inner();
62 g.forward(f.forward(e.forward(d.forward(c.forward(b.forward(a.forward(input)))))))
63 }
64 fn forward_mut(&mut self,input:S)->Z{
65 let (a,b,c,d,e,f,g)=self.inner_mut();
66 g.forward_mut(f.forward_mut(e.forward_mut(d.forward_mut(c.forward_mut(b.forward_mut(a.forward_mut(input)))))))
67 }
68}
69impl<A:AI<T,U>+Op<Output=U>,B:AI<U,V>+Op<Output=V>,C:AI<V,W>+Op<Output=W>,D:AI<W,X>+Op<Output=X>,E:AI<X,Y>+Op<Output=Y>,F:AI<Y,Z>,T,U,V,W,X,Y,Z> AI<T,Z> for Sequential<(A,B,C,D,E,F)>{
70 fn forward(&self,input:T)->Z{
71 let (a,b,c,d,e,f)=self.inner();
72 f.forward(e.forward(d.forward(c.forward(b.forward(a.forward(input))))))
73 }
74 fn forward_mut(&mut self,input:T)->Z{
75 let (a,b,c,d,e,f)=self.inner_mut();
76 f.forward_mut(e.forward_mut(d.forward_mut(c.forward_mut(b.forward_mut(a.forward_mut(input))))))
77 }
78}
79impl<A:AI<U,V>+Op<Output=V>,B:AI<V,W>+Op<Output=W>,C:AI<W,X>+Op<Output=X>,D:AI<X,Y>+Op<Output=Y>,E:AI<Y,Z>,U,V,W,X,Y,Z> AI<U,Z> for Sequential<(A,B,C,D,E)>{
80 fn forward(&self,input:U)->Z{
81 let (a,b,c,d,e)=self.inner();
82 e.forward(d.forward(c.forward(b.forward(a.forward(input)))))
83 }
84 fn forward_mut(&mut self,input:U)->Z{
85 let (a,b,c,d,e)=self.inner_mut();
86 e.forward_mut(d.forward_mut(c.forward_mut(b.forward_mut(a.forward_mut(input)))))
87 }
88}
89impl<A:AI<V,W>+Op<Output=W>,B:AI<W,X>+Op<Output=X>,C:AI<X,Y>+Op<Output=Y>,D:AI<Y,Z>,V,W,X,Y,Z> AI<V,Z> for Sequential<(A,B,C,D)>{
90 fn forward(&self,input:V)->Z{
91 let (a,b,c,d)=self.inner();
92 d.forward(c.forward(b.forward(a.forward(input))))
93 }
94 fn forward_mut(&mut self,input:V)->Z{
95 let (a,b,c,d)=self.inner_mut();
96 d.forward_mut(c.forward_mut(b.forward_mut(a.forward_mut(input))))
97 }
98}
99impl<A:AI<W,X>+Op<Output=X>,B:AI<X,Y>+Op<Output=Y>,C:AI<Y,Z>,W,X,Y,Z> AI<W,Z> for Sequential<(A,B,C)>{
100 fn forward(&self,input:W)->Z{
101 let (a,b,c)=self.inner();
102 c.forward(b.forward(a.forward(input)))
103 }
104 fn forward_mut(&mut self,input:W)->Z{
105 let (a,b,c)=self.inner_mut();
106 c.forward_mut(b.forward_mut(a.forward_mut(input)))
107 }
108}
109impl<A:AI<W,Z>+AI<X,Y>,W,X,Y,Z> AI<W,Z> for SetType<A,X,Y>{
110 fn forward(&self,input:W)->Z{self.inner().forward(input)}
111 fn forward_mut(&mut self,input:W)->Z{self.inner_mut().forward_mut(input)}
112}
113impl<A:AI<X,X>+Op<Output=X>,X> Op for Sequential<&[A]>{
114 type Output=X;
115}
116impl<A:AI<X,X>+Op<Output=X>,X> Op for Sequential<&mut [A]>{
117 type Output=X;
118}
119impl<A:AI<X,X>+Op<Output=X>,X> Op for Sequential<Vec<A>>{
120 type Output=X;
121}
122impl<A:AI<X,X>,X:Clone> Iterator for Autoregression<A,X>{
123 fn next(&mut self)->Option<Self::Item>{
124 let output=self.state.clone();
125 self.state=Some(self.ai.forward_mut(self.state.take().unwrap()));
126 output
127 }
128 fn size_hint(&self)->(usize,Option<usize>){(usize::MAX,None)}
129 type Item=X;
130}
131impl<A:AI<X,X>,X> AI<X,X> for Sequential<&[A]>{
132 fn forward(&self,input:X)->X{self.inner().iter().fold(input,|x,a|a.forward(x))}
133}
134impl<A:AI<X,X>,X> AI<X,X> for Sequential<&mut [A]>{
135 fn forward(&self,input:X)->X{self.inner().iter().fold(input,|x,a|a.forward(x))}
136 fn forward_mut(&mut self,input:X)->X{self.inner_mut().iter_mut().fold(input,|x,a|a.forward_mut(x))}
137}
138impl<A:AI<X,X>,X> AI<X,X> for Sequential<Vec<A>>{
139 fn forward(&self,input:X)->X{self.inner().iter().fold(input,|x,a|a.forward(x))}
140 fn forward_mut(&mut self,input:X)->X{self.inner_mut().iter_mut().fold(input,|x,a|a.forward_mut(x))}
141}
142impl<A:AI<X,Y>+Op<Output=Y>,B:AI<Y,Z>,X,Y,Z> AI<X,Z> for Sequential<(A,B)>{
143 fn forward(&self,input:X)->Z{
144 let (a,b)=self.inner();
145 b.forward(a.forward(input))
146 }
147 fn forward_mut(&mut self,input:X)->Z{
148 let (a,b)=self.inner_mut();
149 b.forward_mut(a.forward_mut(input))
150 }
151}
152impl<A:AI<X,Y>+Op<Output=Y>,I:IntoIterator<Item=X>,J:FromIterator<Y>,X,Y> AI<I,J> for Map<A>{
153 fn forward(&self,input:I)->J{
154 let a=self.inner();
155 input.into_iter().map(|x|a.forward(x)).collect()
156 }
157 fn forward_mut(&mut self,input:I)->J{
158 let a=self.inner_mut();
159 input.into_iter().map(|x|a.forward_mut(x)).collect()
160 }
161}
162impl<A:AI<X,Y>+Op<Output=Y>,X:Clone+OpsAdd<Y,Output=Z>,Y:Into<Z>,Z> AI<X,Z> for Residual<A>{
163 fn forward(&self,x:X)->Z{
164 let apply=self.apply;
165 let f=&self.inner;
166
167 if apply{x.clone()+f.forward(x)}else{f.forward(x).into()}
168 }
169 fn forward_mut(&mut self,x:X)->Z{
170 let apply=self.apply;
171 let f=&mut self.inner;
172
173 if apply{x.clone()+f.forward_mut(x)}else{f.forward_mut(x).into()}
174 }
175}
176impl<A:AI<X,Y>,X,Y:Clone,const N:usize> AI<X,[Y;N]> for Duplicate<A>{
177 fn forward(&self,input:X)->[Y;N]{
178 let y=self.inner().forward(input);
179 [0;N].map(|_|y.clone())
180 }
181 fn forward_mut(&mut self,input:X)->[Y;N]{
182 let y=self.inner_mut().forward_mut(input);
183 [0;N].map(|_|y.clone())
184 }
185}
186impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y)> for Duplicate<A>{
187 fn forward(&self,input:X)->(Y,Y){
188 let y=self.inner().forward(input);
189 (y.clone(),y)
190 }
191 fn forward_mut(&mut self,input:X)->(Y,Y){
192 let y=self.inner_mut().forward_mut(input);
193 (y.clone(),y)
194 }
195}
196impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y)> for Duplicate<A>{
197 fn forward(&self,input:X)->(Y,Y,Y){
198 let y=self.inner().forward(input);
199 (y.clone(),y.clone(),y)
200 }
201 fn forward_mut(&mut self,input:X)->(Y,Y,Y){
202 let y=self.inner_mut().forward_mut(input);
203 (y.clone(),y.clone(),y)
204 }
205}
206impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y,Y)> for Duplicate<A>{
207 fn forward(&self,input:X)->(Y,Y,Y,Y){
208 let y=self.inner().forward(input);
209 (y.clone(),y.clone(),y.clone(),y)
210 }
211 fn forward_mut(&mut self,input:X)->(Y,Y,Y,Y){
212 let y=self.inner_mut().forward_mut(input);
213 (y.clone(),y.clone(),y.clone(),y)
214 }
215}
216impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y,Y,Y)> for Duplicate<A>{
217 fn forward(&self,input:X)->(Y,Y,Y,Y,Y){
218 let y=self.inner().forward(input);
219 (y.clone(),y.clone(),y.clone(),y.clone(),y)
220 }
221 fn forward_mut(&mut self,input:X)->(Y,Y,Y,Y,Y){
222 let y=self.inner_mut().forward_mut(input);
223 (y.clone(),y.clone(),y.clone(),y.clone(),y)
224 }
225}
226impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y,Y,Y,Y)> for Duplicate<A>{
227 fn forward(&self,input:X)->(Y,Y,Y,Y,Y,Y){
228 let y=self.inner().forward(input);
229 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
230 }
231 fn forward_mut(&mut self,input:X)->(Y,Y,Y,Y,Y,Y){
232 let y=self.inner_mut().forward_mut(input);
233 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
234 }
235}
236impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y,Y,Y,Y,Y)> for Duplicate<A>{
237 fn forward(&self,input:X)->(Y,Y,Y,Y,Y,Y,Y){
238 let y=self.inner().forward(input);
239 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
240 }
241 fn forward_mut(&mut self,input:X)->(Y,Y,Y,Y,Y,Y,Y){
242 let y=self.inner_mut().forward_mut(input);
243 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
244 }
245}
246impl<A:AI<X,Y>,X,Y:Clone> AI<X,(Y,Y,Y,Y,Y,Y,Y,Y)> for Duplicate<A>{
247 fn forward(&self,input:X)->(Y,Y,Y,Y,Y,Y,Y,Y){
248 let y=self.inner().forward(input);
249 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
250 }
251 fn forward_mut(&mut self,input:X)->(Y,Y,Y,Y,Y,Y,Y,Y){
252 let y=self.inner_mut().forward_mut(input);
253 (y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y.clone(),y)
254 }
255}
256impl<A:AI<X,Y>,X,Y> Op for SetType<A,X,Y>{
257 type Output=Y;
258}
259impl<A:AI<X,Y>,X,Y> SetType<A,X,Y>{
260 accessible_inner!(inner:A);
261 pub fn new(inner:A)->Self{
262 Self{inner,phantom:PhantomData}
263 }
264}
265impl<A:Decompose,X:Decompose> Decompose for Autoregression<A,X>{
266 fn compose(decomposition:Self::Decomposition)->Self{
267 Self{ai:A::compose(decomposition.0),state:Some(X::compose(decomposition.1))}
268 }
269 fn decompose(self)->Self::Decomposition{(self.ai.decompose(),self.state.unwrap().decompose())}
270 fn decompose_cloned(&self)->Self::Decomposition{(self.ai.decompose_cloned(),self.state.as_ref().unwrap().decompose_cloned())}
271 type Decomposition=(A::Decomposition,X::Decomposition);
272}
273impl<A:Decompose,X,Y> Decompose for SetType<A,X,Y>{
274 fn compose(decomposition:Self::Decomposition)->Self{
275 Self{inner:A::compose(decomposition),phantom:PhantomData}
276 }
277 fn decompose(self)->Self::Decomposition{self.inner.decompose()}
278 fn decompose_cloned(&self)->Self::Decomposition{self.inner.decompose_cloned()}
279 type Decomposition=A::Decomposition;
280}
281impl<A:Decompose> Decompose for Duplicate<A>{
282 fn compose((inner,times):Self::Decomposition)->Self{
283 Self{inner:A::compose(inner),times}
284 }
285 fn decompose(self)->Self::Decomposition{(self.inner.decompose(),self.times)}
286 fn decompose_cloned(&self)->Self::Decomposition{(self.inner.decompose_cloned(),self.times)}
287 type Decomposition=(A::Decomposition,usize);
288}
289impl<A:Decompose> Decompose for Sequential<A>{
290 fn compose(decomposition:Self::Decomposition)->Self{
291 Self{inner:A::compose(decomposition)}
292 }
293 fn decompose(self)->Self::Decomposition{self.inner.decompose()}
294 fn decompose_cloned(&self)->Self::Decomposition{self.inner.decompose_cloned()}
295 type Decomposition=A::Decomposition;
296}
297impl<A:Decompose> Decompose for Map<A>{
298 fn compose(decomposition:Self::Decomposition)->Self{
299 Self{inner:A::compose(decomposition)}
300 }
301 fn decompose(self)->Self::Decomposition{self.inner.decompose()}
302 fn decompose_cloned(&self)->Self::Decomposition{self.inner.decompose_cloned()}
303 type Decomposition=A::Decomposition;
304}
305impl<A:Decompose> Decompose for Residual<A>{
306 fn compose((decomposition,apply):Self::Decomposition)->Self{
307 Self{apply,inner:A::compose(decomposition)}
308 }
309 fn decompose(self)->Self::Decomposition{(self.inner.decompose(),self.apply)}
310 fn decompose_cloned(&self)->Self::Decomposition{(self.inner.decompose_cloned(),self.apply)}
311 type Decomposition=(A::Decomposition,bool);
312}
313impl<A:Op<Output=Y>,Y> Op for Residual<A>{
314 type Output=Y;
315}
316impl<A:Decompose> Decompose for Zip<A>{
317 fn compose(decomposition:Self::Decomposition)->Self{
318 Self{inner:A::compose(decomposition)}
319 }
320 fn decompose(self)->Self::Decomposition{self.inner.decompose()}
321 fn decompose_cloned(&self)->Self::Decomposition{self.inner.decompose_cloned()}
322 type Decomposition=A::Decomposition;
323}
324impl<A:IntoSequence<M>,M:AI<M::Output,M::Output>+Op> IntoSequence<M> for Duplicate<A> where Duplicate<M>:Into<M>{
325 fn into_sequence(self)->Sequential<Vec<M>>{
326 let mut s=self.inner.into_sequence();
327 if let Some(l)=s.inner_mut().pop(){
328 s.inner_mut().push(Duplicate{inner:l,times:self.times}.into())
329 }
330 s
331 }
332}
333impl<A:IntoSequence<M>,M:AI<M::Output,M::Output>+Op> IntoSequence<M> for Map<A> where Map<M>:Into<M>{
334 fn into_sequence(self)->Sequential<Vec<M>>{
335 Sequential::new(self.inner.into_sequence().into_inner().into_iter().map(|inner|Map{inner}.into()).collect())
336 }
337}
338impl<A:IntoSequence<M>,M:AI<M::Output,M::Output>+Op> IntoSequence<M> for Sequential<Vec<A>>{fn into_sequence(self)->Sequential<Vec<M>>{
340 Sequential{inner:self.into_inner().into_iter().flat_map(|a|a.into_sequence().into_inner()).collect()}
341 }
342}
343impl<A:Op<Output=S>,B:AI<S,T>+Op<Output=T>,C:AI<T,U>+Op<Output=U>,D:AI<U,V>+Op<Output=V>,E:AI<V,W>+Op<Output=W>,F:AI<W,X>+Op<Output=X>,G:AI<Y,Z>+Op<Output=Y>,H:AI<Y,Z>+Op<Output=Z>,S,T,U,V,W,X,Y,Z> Op for Sequential<(A,B,C,D,E,F,G,H)>{
344 type Output=Z;
345}
346impl<A:Op<Output=T>,B:AI<T,U>+Op<Output=U>,C:AI<U,V>+Op<Output=V>,D:AI<V,W>+Op<Output=W>,E:AI<W,X>+Op<Output=X>,F:AI<Y,Z>+Op<Output=Y>,G:AI<Y,Z>+Op<Output=Z>,T,U,V,W,X,Y,Z> Op for Sequential<(A,B,C,D,E,F,G)>{
347 type Output=Z;
348}
349impl<A:Op<Output=U>,B:AI<U,V>+Op<Output=V>,C:AI<V,W>+Op<Output=W>,D:AI<W,X>+Op<Output=X>,E:AI<Y,Z>+Op<Output=Y>,F:AI<Y,Z>+Op<Output=Z>,U,V,W,X,Y,Z> Op for Sequential<(A,B,C,D,E,F)>{
350 type Output=Z;
351}
352impl<A:Op<Output=V>,B:AI<V,W>+Op<Output=W>,C:AI<W,X>+Op<Output=X>,D:AI<Y,Z>+Op<Output=Y>,E:AI<Y,Z>+Op<Output=Z>,V,W,X,Y,Z> Op for Sequential<(A,B,C,D,E)>{
353 type Output=Z;
354}
355impl<A:Op<Output=W>,B:AI<W,X>+Op<Output=X>,C:AI<Y,Z>+Op<Output=Y>,D:AI<Y,Z>+Op<Output=Z>,W,X,Y,Z> Op for Sequential<(A,B,C,D)>{
356 type Output=Z;
357}
358impl<A:Op<Output=X>,B:AI<Y,Z>+Op<Output=Y>,C:AI<Y,Z>+Op<Output=Z>,X,Y,Z> Op for Sequential<(A,B,C)>{
359 type Output=Z;
360}
361impl<A:Op<Output=Y>,B:AI<Y,Z>+Op<Output=Z>,Y,Z> Op for Sequential<(A,B)>{
362 type Output=Z;
363}
364impl<A:Op<Output=Y>,Y> Op for Duplicate<A>{
365 type Output=(Y,Y);
366}
367impl<A:Op<Output=Y>,Y> Op for Map<A>{
368 type Output=Vec<Y>;
369}
370impl<A:UnwrapInner> UnwrapInner for Duplicate<A>{
371 fn unwrap_inner(self)->Self::Inner{self.inner.unwrap_inner()}
372 type Inner=A::Inner;
373}
374impl<A:UnwrapInner> UnwrapInner for Map<A>{
375 fn unwrap_inner(self)->Self::Inner{self.inner.unwrap_inner()}
376 type Inner=A::Inner;
377}
378impl<A,X> Autoregression<A,X>{
379 accessible_inner!(ai:A);
380 pub fn new<W>(mut ai:A,input:W)->Self where A:AI<W,X>+AI<X,X>,X:Clone{
381 let state=Some(ai.forward_mut(input));
382 Self{ai,state}
383 }
384}
385impl<A> Duplicate<A>{
386 accessible_inner!(inner:A);
387 pub fn from_inner(inner:A)->Self{
389 Duplicate{inner,times:2}
390 }
391 pub fn new(inner:A)->Self{
393 Duplicate{inner,times:2}
394 }
395 pub fn times(&self)->usize{self.times}
397 pub fn with_inner<B>(&self,inner:B)->Duplicate<B>{Duplicate::from_inner(inner).with_times(self.times)}
399 pub fn with_times(mut self,times:usize)->Self{
401 self.times=times;
402 self
403 }
404}
405impl<A> Sequential<A>{
406 accessible_inner!(inner:A);
407 pub fn new(inner:A)->Self{
408 Self{inner}
409 }
410}
411impl<A> Map<A>{
412 accessible_inner!(inner:A);
413 pub fn new(inner:A)->Self{
414 Self{inner}
415 }
416}
417impl<A> Zip<A>{
418 accessible_inner!(inner:A);
419 pub fn new(inner:A)->Self{
420 Self{inner}
421 }
422}
423impl<F:Fn(X)->Y,M:AI<M::Output,M::Output>+Op,X,Y> IntoSequence<M> for Apply<F,X,Y> where Self:Into<M>{
424 fn into_sequence(self)->Sequential<Vec<M>>{vec![self.into()].sequential()}
425}
426impl<F:Fn(X)->Y,X,Y> AI<X,Y> for Apply<F,X,Y>{
427 fn forward(&self,input:X)->Y{(&self.inner)(input)}
428}
429impl<F:Fn(X)->Y,X,Y> Op for Apply<F,X,Y>{
430 type Output=Y;
431}
432macro_rules! accessible_inner{
434 ($field:ident:$type:ident)=>(
435 pub fn inner(&self)->&$type{&self.$field}
437 pub fn inner_mut(&mut self)->&mut $type{&mut self.$field}
439 pub fn into_inner(self)->$type{self.$field}
441 );
442}
443macro_rules! zip_tuple{
444 ($(($($type:ident),+):($($input:ident),+)->($($output:ident),+)),*)=>($(
445 impl<$($type:AI<$input,$output>,$input,$output),+> AI<($($input),+),($($output),+)> for Zip<($($type),+)>{
446 #[allow(non_snake_case)]
447 fn forward(&self,($($input),+):($($input),+))->($($output),+){
448 let ($($type),+)=self.inner();
449 ($($type.forward($input)),+)
450 }
451 #[allow(non_snake_case)]
452 fn forward_mut(&mut self,($($input),+):($($input),+))->($($output),+){
453 let ($($type),+)=self.inner_mut();
454 ($($type.forward_mut($input)),+)
455 }
456 }
457 impl<$($type:Op<Output=$output>,$output),+> Op for Zip<($($type),+)>{
458 type Output=($($output),+);
459 }
460 )*);
461}
462#[cfg(test)]
463mod tests{
464 #[test]
465 fn acc_q_vec(){
466 let op=().fix_type::<Vec<f32>>().acc_q(0.5);
467 let x:Vec<f32>=vec![1.0,1.0,1.0,1.0,1.0];
468 let y:Vec<f32>=op.forward(x);
469 assert_eq!(y,[1.9375_f32,1.875,1.75,1.5,1.0]);
470 }
471 #[test]
472 fn mse_vec(){
473 let op=().fix_type::<Vec<f32>>().squared_error().mean();
474 let x:(Vec<f32>,Vec<f32>)=(vec![0.0,0.5,1.5],vec![-2.0,1.5,5.5]);
475 let y:f32=op.forward(x);
476 assert_eq!(y,7.0);
477 }
478 use super::*;
479}
480#[derive(Clone,Copy,Debug,Deserialize,Eq,Hash,PartialEq,Serialize)]
481pub enum Alignment{Center,Left,Right}
483#[derive(Clone,Copy,Debug,Deserialize,Eq,Hash,PartialEq,Serialize)]
484pub enum OnMismatch{Error,Pad(Alignment),Truncate(Alignment)}
486#[derive(Clone,Copy,Debug,Deserialize,Eq,Hash,PartialEq,Serialize)]
487pub enum ReductionMode{Component,Dim(i32),Tensor}
489pub fn apply<F:Fn(X)->Y,X,Y>(f:F)->Apply<F,X,Y>{
491 Apply{inner:f,phantom:PhantomData}
492}
493pub mod math;
495pub mod reinforcement;
497pub mod soft;
499pub mod structural;
501
502impl<A:AI<X,Y>+IntoSequence<M>,M:AI<M::Output,M::Output>+Op,X,Y> IntoSequence<M> for SetType<A,X,Y>{
503 fn into_sequence(self)->Sequential<Vec<M>>{self.into_inner().into_sequence()}
504}
505impl<A:AI<X,Y>+UnwrapInner,X,Y> UnwrapInner for SetType<A,X,Y>{
506 fn unwrap_inner(self)->Self::Inner{self.into_inner().unwrap_inner()}
507 type Inner=A::Inner;
508}
509
510#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
511pub struct Apply<F:Fn(X)->Y,X,Y>{inner:F,phantom:PhantomData<fn(X)->Y>}
513#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
514pub struct Autoregression<A,X>{ai:A,state:Option<X>}
516#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
517pub struct Duplicate<A>{inner:A,times:usize}
519#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
520pub struct Map<A>{inner:A}
522#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
523pub struct Residual<A>{apply:bool,inner:A}
525#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
526pub struct SqueezeLayer{dim:i32}
528#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
529pub struct Sequential<A>{inner:A}
531#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
532pub struct SetType<A,X,Y>{inner:A,phantom:PhantomData<fn(X)->Y>}
534#[derive(Clone,Copy,Debug,Default,Deserialize,Serialize)]
535pub struct Zip<A>{inner:A}
537use {accessible_inner,zip_tuple};
538use crate::{
539 AI,Decompose,IntoSequence,Op,UnwrapInner
540};
541use serde::{Deserialize,Serialize};
542use std::{
543 iter::FromIterator,marker::PhantomData,ops::Add as OpsAdd
544};
545zip_tuple!((A,B):(W,X)->(Y,Z),(A,B,C):(U,V,W)->(X,Y,Z),(A,B,C,D):(S,T,U,V)->(W,X,Y,Z),(A,B,C,D,E):(Q,R,S,T,U)->(V,W,X,Y,Z),(A,B,C,D,E,F):(O,P,Q,R,S,T)->(U,V,W,X,Y,Z),(A,B,C,D,E,F,G):(M,N,O,P,Q,R,S)->(T,U,V,W,X,Y,Z),(A,B,C,D,E,F,G,H):(K,L,M,N,O,P,Q,R)->(S,T,U,V,W,X,Y,Z));