Dynami c способ вычисления линейных ограничений с несколькими операторами - PullRequest
1 голос
/ 06 августа 2020

Представьте себе матрицу A, имеющую один столбец с множеством операторов неравенства / равенства (≥, = ≤) и вектор b, где количество строк в A равно количеству элементов в b. Тогда одна строка в моих настройках будет вычисляться, например,

dot(A[0, 1:], x) ≥ b[0] 

, где x - некоторый вектор, столбец A[,0] представляет все операторы, и мы бы знали, что для строки 0 мы должны были вычислить с использованием оператора (верно ei A[0,0] == "≥"). Теперь, есть ли способ динамически вычислять все строки следующим пока воображаемым способом

dot(A[, 1:], x) A[, 0] b

Я надеялся на динамическую c оценку каждой строки, где мы оцениваем, какой оператор используется для каждой строки.

Например, пусть

A = [
         [">=", -2, 1, 1],
         [">=",  0, 1, 0],
         ["==",  0, 1, 1]
    ]

b = [0, 1, 1]

и x будет некоторым заданным вектором, например, x = [1,1,0] мы будем sh вычислить следующим образом:

       A[,1:]          x       A[,0]     b
dot([-2, 1,  1],   [1, 1, 0])   >=       0
dot([0,  1,  0],   [1, 1, 0])   >=       1
dot([0,  1,  1],   [1, 1, 0])   ==       1

Результат будет быть [False, True, True]

1 Ответ

0 голосов
/ 07 августа 2020

Если я правильно понимаю, это способ выполнить эту операцию:

import numpy as np
# Input data
a = [
         [">=", -2, 1, 1],
         [">=",  0, 1, 0],
         ["==",  0, 1, 1]
    ]
b = np.array([0, 1, 1])
x = np.array([1, 1, 0])
# Split in comparison and data
a0 = np.array([lst[0] for lst in a])
a1 = np.array([lst[1:] for lst in a])
# Compute dot product
c = a1 @ x
# Compute comparisons
leq = c <= b
eq = c == b
geq = c >= b
# Find comparison index for each row
cmps = np.array(["<=", "==", ">="])  # This array is lex sorted
cmp_idx = np.searchsorted(cmps, a0)
# Select the right result for each row
result = np.choose(cmp_idx, [leq, eq, geq])
# Convert to numeric type if preferred
result = result.astype(np.int32)
print(result)
# [0 1 1]
...