| import torch |
| import numpy as np |
|
|
|
|
| def print_header(msg): |
| print('===>', msg) |
|
|
|
|
| def to_np(t): |
| if t is None: |
| return None |
| elif t.nelement() == 0: |
| return np.array([]) |
| else: |
| return t.cpu().numpy() |
|
|
|
|
| def bger(x, y): |
| return x.unsqueeze(2).bmm(y.unsqueeze(1)) |
|
|
|
|
| def get_sizes(G, A=None): |
| if G.dim() == 2: |
| nineq, nz = G.size() |
| nBatch = 1 |
| elif G.dim() == 3: |
| nBatch, nineq, nz = G.size() |
| if A is not None: |
| neq = A.size(1) if A.nelement() > 0 else 0 |
| else: |
| neq = None |
| |
| return nineq, nz, neq, nBatch |
|
|
|
|
| def bdiag(d): |
| nBatch, sz = d.size() |
| D = torch.zeros(nBatch, sz, sz).type_as(d) |
| I = torch.eye(sz).repeat(nBatch, 1, 1).type_as(d).bool() |
| D[I] = d.squeeze().view(-1) |
| return D |
|
|
|
|
| def expandParam(X, nBatch, nDim): |
| if X.ndimension() in (0, nDim) or X.nelement() == 0: |
| return X, False |
| elif X.ndimension() == nDim - 1: |
| return X.unsqueeze(0).expand(*([nBatch] + list(X.size()))), True |
| else: |
| raise RuntimeError("Unexpected number of dimensions.") |
|
|
|
|
| def extract_nBatch(Q, p, G, h, A, b): |
| dims = [3, 2, 3, 2, 3, 2] |
| params = [Q, p, G, h, A, b] |
| for param, dim in zip(params, dims): |
| if param.ndimension() == dim: |
| return param.size(0) |
| return 1 |
|
|