Protobuf可以编码概率分布吗?

时间:2018-09-07 14:46:45

标签: protocol-buffers

假设我有这个

class PlayerSchema(Schema):

    nickname = fields.Str(required=True)
...

    @validates('nickname')
    def validate_nickname(self, value):
        raise ValidationError('Error!!!')

其中message Game { string name = 1; repeated float probability = 2; } 字段代表分布。这意味着每个值都必须为非负数,且总和必须为1。

是否有更好的方法来使用protobuf(例如,像probability之类的东西或在值之和上加边界的东西)?

2 个答案:

答案 0 :(得分:4)

不,协议缓冲区中没有无符号浮点类型,也没有类似这样的自动施加的约束。

当您对Game进行反序列化时,您可能想在业务代码中添加约束-请注意,float近似于小数结果的总和可能不是精确 1.0。您将需要某种形式的宽容。

答案 1 :(得分:2)

仅使用一种类型就无法安全地执行此操作。您可以再说一步:

{
    string name = 1;
    repeated uint32 probability = 2;
    uint32 divisor = 3;
}

诀窍是将浮点数乘以1000 000左右的较大数字,然后再将其除以。这样既可以确保您的安全,又可以增加开销。