Может ли protobuf кодировать распределение вероятностей? - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у меня есть это

message Game
{
    string name = 1;
    repeated float probability = 2;
}

где поля probability представляют распределение. Это означает, что каждое значение должно быть неотрицательным, а сумма должна быть равна 1.

Есть ли лучший способ использовать для этого protobuf (например, что-то вроде non_negative_float или что-то, что ограничивает сумму значений)?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Невозможно безопасно сделать это только одним типом. Вы можете пойти еще дальше и сказать: «1001 *»

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

Хитрость заключается в том, чтобы умножить ваш float на большое число, 1000 000 или около того, а затем разделить его снова. Это обеспечит вам безопасность, но также и накладные расходы.

0 голосов
/ 10 сентября 2018

Нет, в буферах протоколов нет неподписанных типов с плавающей запятой и каких-либо автоматически наложенных ограничений.

Возможно, вы захотите добавить ограничения в свой бизнес-код, когда десериализуете Game - с осознанием того, что сумма приближений float к дробным результатам не может быть точно 1.0. Вам понадобится какая-то форма терпимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...