class SymmetricCone: def __init__(self, dimension): self._dimension = dimension def dimension(self): return self._dimension class NonnegativeOrthant(SymmetricCone): pass class IceCream(SymmetricCone): pass class SymmetricPSD(SymmetricCone): pass class CartesianProduct(SymmetricCone): def __init__(self, *factors): self._factors = factors def factors(self): return self._factors def cvxopt_dims(self): d = { 'l':0, 'q':[], 's':[] } d['l'] += sum([ K.dimension() for K in self.factors() if isinstance(K, NonnegativeOrthant) ]) d['q'] = [ K.dimension() for K in self.factors() if isinstance(K, IceCream) ] d['s'] = [ K.dimension() for K in self.factors() if isinstance(K, SymmetricPSD) ] return d def dimension(self): return sum([ f.dimension() for f in self.factors() ])