An ugly lfsr_rbyd_append implementation, but a working one
This commit is contained in:
@@ -825,6 +825,26 @@ static inline void lfsr_tag_trimtag(lfsr_tag_t alt,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void lfsr_tag_trim_(lfsr_tag_t alt,
|
||||||
|
lfsr_sid_t lower_id, lfsr_sid_t upper_id,
|
||||||
|
lfsr_sid_t *lower_id_, lfsr_sid_t *upper_id_,
|
||||||
|
lfsr_tag_t *lower_tag, lfsr_tag_t *upper_tag) {
|
||||||
|
if (lower_id > *lower_id_) {
|
||||||
|
*lower_id_ = lower_id;
|
||||||
|
*lower_tag = 0;
|
||||||
|
}
|
||||||
|
if (upper_id < *upper_id_) {
|
||||||
|
*upper_id_ = upper_id;
|
||||||
|
*upper_tag = 0xffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO need min/max here?
|
||||||
|
if (lfsr_tag_isgt(alt)) {
|
||||||
|
*upper_tag = lfs_min(*upper_tag, alt + 0x10);
|
||||||
|
} else {
|
||||||
|
*lower_tag = lfs_max(*lower_tag, alt + 0x10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// operations on attribute lists
|
// operations on attribute lists
|
||||||
struct lfs_mattr {
|
struct lfs_mattr {
|
||||||
@@ -2007,6 +2027,10 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
lfsr_sid_t lower_upper_id = rbyd_->weight;
|
lfsr_sid_t lower_upper_id = rbyd_->weight;
|
||||||
lfsr_sid_t upper_lower_id = lower_lower_id;
|
lfsr_sid_t upper_lower_id = lower_lower_id;
|
||||||
lfsr_sid_t upper_upper_id = lower_upper_id;
|
lfsr_sid_t upper_upper_id = lower_upper_id;
|
||||||
|
lfsr_sid_t lower_lower_id_ = lower_lower_id;
|
||||||
|
lfsr_sid_t lower_upper_id_ = lower_upper_id;
|
||||||
|
lfsr_sid_t upper_lower_id_ = upper_lower_id;
|
||||||
|
lfsr_sid_t upper_upper_id_ = upper_upper_id;
|
||||||
lfsr_tag_t lower_lower_tag = 0;
|
lfsr_tag_t lower_lower_tag = 0;
|
||||||
lfsr_tag_t lower_upper_tag = 0xffff;
|
lfsr_tag_t lower_upper_tag = 0xffff;
|
||||||
lfsr_tag_t upper_lower_tag = upper_lower_tag;
|
lfsr_tag_t upper_lower_tag = upper_lower_tag;
|
||||||
@@ -2029,6 +2053,8 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
lfs_swap32(&lower_branch, &upper_branch);
|
lfs_swap32(&lower_branch, &upper_branch);
|
||||||
lfs_swaps32(&lower_lower_id, &upper_lower_id);
|
lfs_swaps32(&lower_lower_id, &upper_lower_id);
|
||||||
lfs_swaps32(&lower_upper_id, &upper_upper_id);
|
lfs_swaps32(&lower_upper_id, &upper_upper_id);
|
||||||
|
lfs_swaps32(&lower_lower_id_, &upper_lower_id_);
|
||||||
|
lfs_swaps32(&lower_upper_id_, &upper_upper_id_);
|
||||||
lfs_swap16(&lower_lower_tag, &upper_lower_tag);
|
lfs_swap16(&lower_lower_tag, &upper_lower_tag);
|
||||||
lfs_swap16(&lower_upper_tag, &upper_upper_tag);
|
lfs_swap16(&lower_upper_tag, &upper_upper_tag);
|
||||||
}
|
}
|
||||||
@@ -2063,6 +2089,8 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
upper_branch = lower_branch;
|
upper_branch = lower_branch;
|
||||||
upper_lower_id = lower_lower_id;
|
upper_lower_id = lower_lower_id;
|
||||||
upper_upper_id = lower_upper_id;
|
upper_upper_id = lower_upper_id;
|
||||||
|
upper_lower_id_ = lower_lower_id_;
|
||||||
|
upper_upper_id_ = lower_upper_id_;
|
||||||
upper_lower_tag = lower_lower_tag;
|
upper_lower_tag = lower_lower_tag;
|
||||||
upper_upper_tag = lower_upper_tag;
|
upper_upper_tag = lower_upper_tag;
|
||||||
}
|
}
|
||||||
@@ -2078,7 +2106,7 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
// | | .----'| | .----'| |
|
// | | .----'| | .----'| |
|
||||||
// 1 2 3 4 4 1 2 3 4 4 2
|
// 1 2 3 4 4 1 2 3 4 4 2
|
||||||
bool prune = false;
|
bool prune = false;
|
||||||
printf("%c alt%c%s 0x%x w%d 0x%x (0x%x %d, 0x%x %d) f=%d (0x%x %d)\n",
|
printf("%c alt%c%s 0x%x w%d 0x%x (0x%x %d (%d), 0x%x %d (%d)) f=%d (0x%x %d)\n",
|
||||||
!diverged
|
!diverged
|
||||||
? '='
|
? '='
|
||||||
: (lower_id_ < upper_id_
|
: (lower_id_ < upper_id_
|
||||||
@@ -2089,7 +2117,7 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
lfsr_tag_isred(alt) ? 'r' : 'b',
|
lfsr_tag_isred(alt) ? 'r' : 'b',
|
||||||
lfsr_tag_isgt(alt) ? "gt" : "lt",
|
lfsr_tag_isgt(alt) ? "gt" : "lt",
|
||||||
lfsr_tag_key(alt),
|
lfsr_tag_key(alt),
|
||||||
weight_, jump, lower_lower_tag, lower_lower_id, lower_upper_tag, lower_upper_id,
|
weight_, jump, lower_lower_tag, lower_lower_id_, lower_lower_id, lower_upper_tag, lower_upper_id_, lower_upper_id,
|
||||||
lfsr_tag_follow(alt, weight_,
|
lfsr_tag_follow(alt, weight_,
|
||||||
lower_lower_id, lower_upper_id,
|
lower_lower_id, lower_upper_id,
|
||||||
lower_tag_, lower_id_),
|
lower_tag_, lower_id_),
|
||||||
@@ -2106,8 +2134,8 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
// lower_id_);
|
// lower_id_);
|
||||||
// }
|
// }
|
||||||
// TODO can this be rewritten in terms of lfsr_tag_follow?
|
// TODO can this be rewritten in terms of lfsr_tag_follow?
|
||||||
if (weight_ > (lfs_size_t)(lower_upper_id-lower_lower_id-1)
|
if (weight_ > (lfs_size_t)(lower_upper_id_-lower_lower_id_-1)
|
||||||
|| (weight_ == (lfs_size_t)(lower_upper_id-lower_lower_id-1)
|
|| (weight_ == (lfs_size_t)(lower_upper_id_-lower_lower_id_-1)
|
||||||
// TODO need key?
|
// TODO need key?
|
||||||
&& (lfsr_tag_isgt(alt)
|
&& (lfsr_tag_isgt(alt)
|
||||||
? lfsr_tag_key(predicted_lower_tag) > lfsr_tag_key(alt)
|
? lfsr_tag_key(predicted_lower_tag) > lfsr_tag_key(alt)
|
||||||
@@ -2138,6 +2166,12 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
lfsr_tag_flipweight(weight_,
|
lfsr_tag_flipweight(weight_,
|
||||||
lower_lower_id, lower_upper_id),
|
lower_lower_id, lower_upper_id),
|
||||||
&lower_lower_id, &lower_upper_id);
|
&lower_lower_id, &lower_upper_id);
|
||||||
|
if (p_alts[0] && lfsr_tag_isblack(p_alts[0])) {
|
||||||
|
lfsr_tag_trim_(p_alts[0],
|
||||||
|
lower_lower_id, lower_upper_id,
|
||||||
|
&lower_lower_id_, &lower_upper_id_,
|
||||||
|
&lower_lower_tag, &lower_upper_tag);
|
||||||
|
}
|
||||||
// lfsr_tag_trimtag(lfsr_tag_flipalt(alt),
|
// lfsr_tag_trimtag(lfsr_tag_flipalt(alt),
|
||||||
// lower_lower_id, lower_upper_id,
|
// lower_lower_id, lower_upper_id,
|
||||||
// &lower_lower_tag, &lower_upper_tag,
|
// &lower_lower_tag, &lower_upper_tag,
|
||||||
@@ -2154,6 +2188,12 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
!= lfsr_tag_isle(alt)) {
|
!= lfsr_tag_isle(alt)) {
|
||||||
lfsr_tag_trimweight(alt, weight_,
|
lfsr_tag_trimweight(alt, weight_,
|
||||||
&lower_lower_id, &lower_upper_id);
|
&lower_lower_id, &lower_upper_id);
|
||||||
|
if (p_alts[0] && lfsr_tag_isblack(p_alts[0])) {
|
||||||
|
lfsr_tag_trim_(p_alts[0],
|
||||||
|
lower_lower_id, lower_upper_id,
|
||||||
|
&lower_lower_id_, &lower_upper_id_,
|
||||||
|
&lower_lower_tag, &lower_upper_tag);
|
||||||
|
}
|
||||||
// lfsr_tag_trimtag(alt,
|
// lfsr_tag_trimtag(alt,
|
||||||
// lower_lower_id, lower_upper_id,
|
// lower_lower_id, lower_upper_id,
|
||||||
// &lower_lower_tag, &lower_upper_tag,
|
// &lower_lower_tag, &lower_upper_tag,
|
||||||
@@ -2251,12 +2291,17 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
|
|
||||||
lfsr_tag_trimweight(alt, weight_,
|
lfsr_tag_trimweight(alt, weight_,
|
||||||
&lower_lower_id, &lower_upper_id);
|
&lower_lower_id, &lower_upper_id);
|
||||||
lfsr_tag_trimtag(alt,
|
// lfsr_tag_trimtag(alt,
|
||||||
lower_lower_id, lower_upper_id,
|
// lower_lower_id, lower_upper_id,
|
||||||
&lower_lower_tag, &lower_upper_tag,
|
// &lower_lower_tag, &lower_upper_tag,
|
||||||
lower_id_);
|
// lower_id_);
|
||||||
lfsr_rbyd_p_red(p_alts, p_weights, p_jumps);
|
lfsr_rbyd_p_red(p_alts, p_weights, p_jumps);
|
||||||
|
|
||||||
|
lfsr_tag_trim_(alt,
|
||||||
|
lower_lower_id, lower_upper_id,
|
||||||
|
&lower_lower_id_, &lower_upper_id_,
|
||||||
|
&lower_lower_tag, &lower_upper_tag);
|
||||||
|
|
||||||
lower_branch = branch_;
|
lower_branch = branch_;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2322,10 +2367,10 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
|
|||||||
// continue to next alt
|
// continue to next alt
|
||||||
lfsr_tag_trimweight(alt, weight_, &lower_lower_id, &lower_upper_id);
|
lfsr_tag_trimweight(alt, weight_, &lower_lower_id, &lower_upper_id);
|
||||||
if (lfsr_tag_isblack(alt)) {
|
if (lfsr_tag_isblack(alt)) {
|
||||||
lfsr_tag_trimtag(alt,
|
lfsr_tag_trim_(alt,
|
||||||
lower_lower_id, lower_upper_id,
|
lower_lower_id, lower_upper_id,
|
||||||
&lower_lower_tag, &lower_upper_tag,
|
&lower_lower_id_, &lower_upper_id_,
|
||||||
lower_id_);
|
&lower_lower_tag, &lower_upper_tag);
|
||||||
// if (p_alts[0] && lfsr_tag_isred(p_alts[0])) {
|
// if (p_alts[0] && lfsr_tag_isred(p_alts[0])) {
|
||||||
// lfsr_tag_trimtag(p_alts[0],
|
// lfsr_tag_trimtag(p_alts[0],
|
||||||
// lower_lower_id, lower_upper_id,
|
// lower_lower_id, lower_upper_id,
|
||||||
@@ -2370,6 +2415,8 @@ stem:;
|
|||||||
upper_branch = lower_branch;
|
upper_branch = lower_branch;
|
||||||
upper_lower_id = lower_lower_id;
|
upper_lower_id = lower_lower_id;
|
||||||
upper_upper_id = lower_upper_id;
|
upper_upper_id = lower_upper_id;
|
||||||
|
upper_lower_id_ = lower_lower_id_;
|
||||||
|
upper_upper_id_ = lower_upper_id_;
|
||||||
upper_lower_tag = lower_lower_tag;
|
upper_lower_tag = lower_lower_tag;
|
||||||
upper_upper_tag = lower_upper_tag;
|
upper_upper_tag = lower_upper_tag;
|
||||||
} else if (lower_id_ > upper_id_
|
} else if (lower_id_ > upper_id_
|
||||||
@@ -2379,6 +2426,8 @@ stem:;
|
|||||||
lfs_swap32(&lower_branch, &upper_branch);
|
lfs_swap32(&lower_branch, &upper_branch);
|
||||||
lfs_swaps32(&lower_lower_id, &upper_lower_id);
|
lfs_swaps32(&lower_lower_id, &upper_lower_id);
|
||||||
lfs_swaps32(&lower_upper_id, &upper_upper_id);
|
lfs_swaps32(&lower_upper_id, &upper_upper_id);
|
||||||
|
lfs_swaps32(&lower_lower_id_, &upper_lower_id_);
|
||||||
|
lfs_swaps32(&lower_upper_id_, &upper_upper_id_);
|
||||||
lfs_swap16(&lower_lower_tag, &upper_lower_tag);
|
lfs_swap16(&lower_lower_tag, &upper_lower_tag);
|
||||||
lfs_swap16(&lower_upper_tag, &upper_upper_tag);
|
lfs_swap16(&lower_upper_tag, &upper_upper_tag);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user