typedef struct Method Method;
typedef struct Change Change;
+#define PRunkx PRIx32
+typedef uint32_t UnkMap;
+
typedef struct MovPosChange {
Segment *move;
/* everything beyond here is private for indep */
- MovPosComb actual, target;
+ MovPosComb actualpos, target;
+ UnkMap actualunk; /* bit per movfeat, set iff actualpos contains dummy 0 */
int refcount;
int n_changes;
Change *changes[];
static void ouposn_moving(const MovPosChange *indep) {
Segment *move= indep->move;
ouprintf("movpos %s position %s moving\n",
- move->i->pname, movpos_pname(move, indep->actual));
+ move->i->pname,
+ indep->actualunk ? "?" : movpos_pname(move, indep->actualpos));
}
static void ouposn_stable(const Segment *move) {
ouprintf("movpos %s position %s stable\n",
return above*above_weight + featpos*mfi->weight + below;
}
-MovPosComb movpos_poscomb_actual(const Segment *seg) {
- return seg->moving ? seg->motion->actual : seg->movposcomb;
-}
-
static void ignore_all_abandon(Method *m) { }
/*========== points and other fixed timeslot movfeats ==========*/
static void method_update_feature(Method *m, MovPosChange *indep,
const Motion *mo) {
+ int featix= mo->i - indep->move->i->movfeats;
+ assert(featix >= 0 && featix < indep->move->i->n_movfeats);
ouposn_feat(indep->move, mo->i, mo->posn, m);
- if (SOMEP(indep->actual))
- indep->actual=
- movposcomb_update_feature(indep->actual, mo->i, mo->posn);
+ indep->actualpos=
+ movposcomb_update_feature(indep->actualpos, mo->i, mo->posn);
+ indep->actualunk &= (~(UnkMap)1 << featix);
ouposn_moving(indep);
}
return meth;
}
-static int change_needed(const MovFeatInfo *feati,
- MovPosComb startpoint, MovPosComb target) {
+static int change_needed(int featix, const MovFeatInfo *feati,
+ MovPosComb startpointpos, UnkMap startpointunk,
+ MovPosComb target) {
int r;
- r= !SOMEP(startpoint) ||
+
+ r= (startpointunk & ((UnkMap)1 << featix)) ||
(target / feati->weight) % feati->posns -
- (startpoint / feati->weight) % feati->posns;
+ (startpointpos / feati->weight) % feati->posns;
+
if (DEBUGP(movpos,eval))
DPRINTFA(" { %s:%s(%d*%d) %d..%d => %d }",
feature_method(feati)->pname, feati->pname,
feati->posns, feati->weight,
- startpoint, target, r);
+ startpointpos, target, r);
return r;
}
#define EVAL_MAX_MOTIONS 2
static ErrorCode indep_prepare(Segment *move, MovPosComb target,
- MovPosComb startpoint,
+ MovPosComb startpointpos,
int ms, int confirming,
MovPosChange **indep_r /* 0 ok */,
int *cost_r /* 0 ok */) {
const SegmentInfo *movei= move->i;
int feat, DP;
+ UnkMap startpointunk;
MovPosChange *indep=0;
DPRINTF1(movpos,eval, "movpos prepare %s/%s <-%s", move->i->pname,
- movpos_pname(move,target), movpos_pname(move,startpoint));
+ movpos_pname(move,target), movpos_pname(move,startpointpos));
- if (!SOMEP(startpoint)) {
- startpoint= movpos_poscomb_actual(move);
- DPRINTF2(" actual <-%s", movpos_pname(move,startpoint));
+ if (SOMEP(startpointpos)) {
+ startpointunk= 0;
+ } else {
+ if (move->moving) {
+ startpointpos= move->motion->actualpos;
+ startpointunk= move->motion->actualunk;
+ } else if (SOMEP(move->movposcomb)) {
+ startpointpos= move->movposcomb;
+ startpointunk= 0;
+ } else {
+ startpointpos= 0;
+ startpointunk= ((UnkMap)1 << move->i->n_movfeats) - 1;
+ }
+ DPRINTF2(" actual <-%s&%"PRunkx, movpos_pname(move,startpointpos),
+ startpointunk);
}
n_meths= 0;
for (feat=0; feat<movei->n_movfeats; feat++) {
const MovFeatInfo *feati= &movei->movfeats[feat];
- if (!change_needed(feati,startpoint,target)) continue;
+ if (!change_needed(feat,feati,
+ startpointpos,startpointunk,
+ target))
+ continue;
MovPosComb posn= target / feati->weight % feati->posns;
Method *meth= feature_method(feati);
DPRINTF2(" alloc");
indep= mmalloc(sizeof(*indep) + sizeof(Change*) * n_meths);
indep->move= move;
- indep->actual= startpoint;
+ indep->actualpos= startpointpos;
+ indep->actualunk= startpointunk;
indep->target= target;
indep->n_changes= n_meths;
indep->refcount= 0;
ErrorCode movpos_change(Segment *move, MovPosComb target,
int maxdelay_ms, MovPosChange *resv) {
int DP;
- MovPosComb actual;
ErrorCode ec;
- if (!move->moving) {
- actual= move->movposcomb;
- assert(!move->motion);
- } else {
- actual= move->motion->actual;
- }
-
- DPRINTF1(movpos,entry, "movpos change %s/%s maxdelay=%dms actual=%s",
- move->i->pname, movpos_pname(move, target),
- maxdelay_ms, movpos_pname(move, actual));
+ DPRINTF1(movpos,entry, "movpos change %s/%s maxdelay=%dms",
+ move->i->pname, movpos_pname(move, target), maxdelay_ms);
if (resv) DPRINTF2(" resv=%s/%s",
resv->move->i->pname,
movpos_pname(resv->move, resv->target));
MovPosChange *inst= 0;
- ec= indep_prepare(move,target, actual,
+ ec= indep_prepare(move,target, NOTA(MovPosComb),
maxdelay_ms,1,
&inst, 0);
if (ec) goto x;
MovPosChange *abandon= seg->motion;
indep_remove(abandon);
- seg->movposcomb= abandon->actual;
+ seg->movposcomb= abandon->actualunk ? NOTA(MovPosComb) : abandon->actualpos;
seg->moving= 0;
seg->motion= 0;
indep_dispose(abandon);