An ugly lfsr_rbyd_append implementation, but a working one

This commit is contained in:
Christopher Haster
2023-01-26 12:59:55 -06:00
parent 1c64ccbde7
commit 2f3c0129d6
+61 -12
View File
@@ -824,7 +824,27 @@ 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
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 upper_lower_id = lower_lower_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_upper_tag = 0xffff;
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_swaps32(&lower_lower_id, &upper_lower_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_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_lower_id = lower_lower_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_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
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
? '='
: (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_isgt(alt) ? "gt" : "lt",
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_,
lower_lower_id, lower_upper_id,
lower_tag_, lower_id_),
@@ -2106,8 +2134,8 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
// lower_id_);
// }
// TODO can this be rewritten in terms of lfsr_tag_follow?
if (weight_ > (lfs_size_t)(lower_upper_id-lower_lower_id-1)
|| (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)
// TODO need key?
&& (lfsr_tag_isgt(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_,
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),
// lower_lower_id, lower_upper_id,
// &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_trimweight(alt, weight_,
&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,
// lower_lower_id, lower_upper_id,
// &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_,
&lower_lower_id, &lower_upper_id);
lfsr_tag_trimtag(alt,
lower_lower_id, lower_upper_id,
&lower_lower_tag, &lower_upper_tag,
lower_id_);
// lfsr_tag_trimtag(alt,
// lower_lower_id, lower_upper_id,
// &lower_lower_tag, &lower_upper_tag,
// lower_id_);
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_;
continue;
}
@@ -2322,10 +2367,10 @@ static int lfsr_rbyd_append(lfs_t *lfs, lfsr_rbyd_t *rbyd_,
// continue to next alt
lfsr_tag_trimweight(alt, weight_, &lower_lower_id, &lower_upper_id);
if (lfsr_tag_isblack(alt)) {
lfsr_tag_trimtag(alt,
lfsr_tag_trim_(alt,
lower_lower_id, lower_upper_id,
&lower_lower_tag, &lower_upper_tag,
lower_id_);
&lower_lower_id_, &lower_upper_id_,
&lower_lower_tag, &lower_upper_tag);
// if (p_alts[0] && lfsr_tag_isred(p_alts[0])) {
// lfsr_tag_trimtag(p_alts[0],
// lower_lower_id, lower_upper_id,
@@ -2370,6 +2415,8 @@ stem:;
upper_branch = lower_branch;
upper_lower_id = lower_lower_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_upper_tag = lower_upper_tag;
} else if (lower_id_ > upper_id_
@@ -2379,6 +2426,8 @@ stem:;
lfs_swap32(&lower_branch, &upper_branch);
lfs_swaps32(&lower_lower_id, &upper_lower_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_upper_tag, &upper_upper_tag);
}