or-tools NewIntVar, кажется, не поддерживает int64 в python - PullRequest
1 голос
/ 17 апреля 2020

Уважаемые, я пытаюсь создать NewIntVar с нижней границей, более высокой границей, равной границе int64:

(- от 9,223.372.036.854.775.808 до +9.223.372.036.854.775.807 )

Но я получаю ошибку Недопустимая модель, когда пытаюсь решить модель. Максимальный диапазон, который я нашел как работающий (пробуя вручную), является следующей моделью. NewIntVar (-93.372.036.854.775.808, 9.123.372.036.854.775.807, 'pippo')

Знаете ли вы, почему int64 не является поддерживается?

Спасибо Stefano

1 Ответ

2 голосов
/ 17 апреля 2020

Из исходного кода я вижу:

https://github.com/google/or-tools/blob/stable/ortools/sat/cp_model_checker.cc#L90

  const int64 ub = proto.domain(proto.domain_size() - 1);
  if (lb < kint64min + 2 || ub > kint64max - 1) {
    return absl::StrCat(
        "var #", v, " domain do not fall in [kint64min + 2, kint64max - 1]. ",
        ProtobufShortDebugString(proto));
  }

  // We do compute ub - lb in some place in the code and do not want to deal
  // with overflow everywhere. This seems like a reasonable precondition anyway.
  if (lb < 0 && lb + kint64max < ub) {
    return absl::StrCat(
        "var #", v,
        " has a domain that is too large, i.e. |UB - LB| overflow an int64: ",
        ProtobufShortDebugString(proto));
  }

Таким образом, значения на самом деле:

  • cp_model .INT_MIN + 2 (-9223372036854775806)
  • cp_model.INT_MAX - 1 (9223372036854775806)

И максимум-мин не может превышать kint64max (9223372036854775807)

Вместо этого вы можете использовать INT32_MAX и INT32_MIN или диапазон, который удовлетворяет этим условиям.
...