1 module des.mc.multitrack.model.base;
2 
3 import des.mc.multitrack.model;
4 import des.mc.multitrack.model.util;
5 
6 /+ TODO: WIP
7 
8 class BaseClassifier : Classifier
9 {
10     Skeleton[][] opCall( in Skeleton[][] )
11     {
12 
13     }
14 }
15 
16 class BaseComplexer : Complexer
17 {
18     Skeleton[] opCall( in Skeleton[][] )
19     {
20         // TODO
21 
22     }
23 }
24 
25 class BaseUserHandler: UserHandler
26 {
27 protected:
28     size_t overdue_count = 0;
29     size_t max_overdue;
30 
31     User self_user;
32 public:
33 
34     this( User fuser, size_t maxOD=4 )
35     {
36         self_user = fuser;
37         max_overdue = maxOD;
38     }
39 
40     @property 
41     {
42         bool updated() const { return !overdue_count; }
43         ref const(User) user() const { return self_user; }
44         bool isOverdue() const { return overdue_count >= max_overdue; }
45     }
46 
47     void setOverdue() { overdue_count++; }
48 
49     void setSkeleton( in Skeleton s )
50     {
51         self_user.skel = s;
52         overdue_count = 0;
53     }
54 
55     float calcTransformPossibility( in Skeleton s ) const
56     {
57         // TODO
58     }
59 }
60 
61 class BaseDestributor : Destributor
62 {
63     Skeleton[] opCall( UserHandler[] handlers, in Skeleton[] skeletons )
64     {
65         auto table = calcPossibility( handlers, skeletons );
66         bool[] destributed, updated;
67         destributed.length = skeletons.length;
68         updated.length = handlers.length;
69 
70         foreach( k; 0 .. min( skeletons.length, handlers.length) )
71         {
72             float max_possibility = 0;
73             ptrdiff_t max_i = -1;
74             ptrdiff_t max_j = -1;
75 
76             foreach( i, skel_line; table )
77             {
78                 if( destributed[i] ) continue;
79                 foreach( j, coef; skel_line )
80                 {
81                     if( updated[j] ) continue;
82 
83                     if( coef > max_possibility )
84                     {
85                         max_possibility = coef;
86                         max_i = i;
87                         max_j = j;
88                     }
89                 }
90             }
91 
92             if( max_i >= 0 )
93             {
94                 handlers[max_j].setSkeleton( skels[max_i] );
95                 updated[max_j] = true;
96                 destributed[max_i] = true;
97             }
98         }
99 
100         Skeleton[] not_destributed;
101         foreach( i, skel; skeletons )
102             if( !destributed[i] )
103                 not_destributed ~= skel;
104         return not_destributed;
105     }
106 
107 protected:
108 
109     float[][] calcPossibility( UserHandler[] handlers, in Skeleton[] skeletons )
110     {
111         float[][] ret;
112         foreach( skel; skeletons )
113         {
114             float[] buf;
115             foreach( uh; handlers )
116                 buf ~= uh.calcTransformPossibility( skel );
117             ret ~= buf;
118         }
119         return ret;
120     }
121 }
122 
123 class BaseMultiTrackerFactory : MultiTrackerFactory
124 {
125 protected:
126     BaseClassifier baseClassifier;
127     BaseComplexer baseComplexer;
128     BaseDestributor baseDestributor;
129 
130     size_t max_handler_overdue = 4;
131 
132 public:
133     this()
134     {
135         baseClassifier = new BaseClassifier;
136         baseComplexer = new BaseComplexer;
137         baseDestributor = new BaseDestributor;
138     }
139 
140     @property
141     {
142         Classifier classifier() { return baseClassifier; }
143         Complexer complexer() { return baseComplexer; }
144         Destributor destributor() { return baseDestributor; }
145     }
146 
147     UserHandler newUserHandler( User user )
148     {
149         return new BaseUserHandler( user, max_handler_overdue );
150     }
151 }
152 
153 +/