Searching extreme points of polyhedron Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Finding points with the shortest distanceFaster computation of barycentric coordinates for many pointsStrange performance differenceShakespeare and dictionariesFind k nearest pointsClustering points on a sphereClosest distance between points in a listFind the closest parametric values corresponding to a BSpline's control points2D Perlin noise generaton needs PerfomanceEfficiently determining maximum allowed euclidean distance between lists of colors

Is Electric Central Heating worth it if using Solar Panels?

Is accepting an invalid credit card number a security issue?

What *exactly* is electrical current, voltage, and resistance?

How would this chord from "Rocket Man" be analyzed?

Raising a bilingual kid. When should we introduce the majority language?

Visa-free travel to the US using refugee travel document from Spain?

Map material from china not allowed to leave the country

Book with legacy programming code on a space ship that the main character hacks to escape

How would I use different systems of magic when they are capable of the same effects?

Justification for leaving new position after a short time

Is there any hidden 'W' sound after 'comment' in : Comment est-elle?

A Paper Record is What I Hamper

Split coins into combinations of different denominations

Is Diceware more secure than a long passphrase?

What is a 'Key' in computer science?

Are these square matrices always diagonalisable?

Do I need to protect SFP ports and optics from dust/contaminants? If so, how?

What is it called when you ride around on your front wheel?

What's parked in Mil Moscow helicopter plant?

"Rubric" as meaning "signature" or "personal mark" -- is this accepted usage?

Would reducing the reference voltage of an ADC have any effect on accuracy?

How to count in linear time worst-case?

What do you call the part of a novel that is not dialog?

Does Feeblemind produce an ongoing magical effect that can be dispelled?



Searching extreme points of polyhedron



Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?Finding points with the shortest distanceFaster computation of barycentric coordinates for many pointsStrange performance differenceShakespeare and dictionariesFind k nearest pointsClustering points on a sphereClosest distance between points in a listFind the closest parametric values corresponding to a BSpline's control points2D Perlin noise generaton needs PerfomanceEfficiently determining maximum allowed euclidean distance between lists of colors



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6












$begingroup$


In my Uni, my scientific professor asked me to make some researches about the extreme points of polyhedrals. And I did them. I found that there is still no code in public for searching extreme points for polyhedral with n dimensions (n - x's), but polyhedrons are everywhere (CV, game theories, etc.). I wrote a function for this task and made a python library (also there are matrix and array combination maker functions).



All I want is to make this code more optimal and compatible for all python versions (I have some troubles that some times happen when I install it by "pip install lin", but other times no). I want to make the life of people easier and make it more comfortable.



I am asking for you to test this function on your computer and write if you have any bugs, fails or thoughts on how to make it better. I am open to constructive criticism and non-constructive too (it will help to understand if somebody needs it or that is just a waste of time).



All the examples, instructions and code on my GitHub: https://github.com/r4ndompuff/polyhedral_set



import numpy as np
import itertools as it
import math
import re

def permutation(m,n):
return math.factorial(n)/(math.factorial(n-m)*math.factorial(m))

def matrix_combinations(matr,n):
timed = list(map(list, it.combinations(matr, n)))
for i in range(n):
timed[i][i][i] = np.asscalar(timed[i][i][i])
all = np.array(list(timed))
return all

def array_combinations(arr,n):
timed = list(map(list, it.combinations(arr, n)))
for i in range(n):
timed[i][i] = np.asscalar(timed[i][i])
all = np.array(list(timed))
return all

def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(m):
td_answer = sum(matr[i]*x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1

def extreme_points(m,n,A,b,sym_comb):
# Input
A = np.array(A).reshape(m,n)
b = np.array(b).reshape(m,1)
# Proccess
ans_comb = np.zeros((1,n))
arr_comb = array_combinations(b,n)
matr_comb = matrix_combinations(A,n)
for i in range(int(permutation(n,m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(matr_comb[i],arr_comb[i])
ans_comb = np.vstack([ans_comb,x])
ans_comb = np.delete(ans_comb, (0), axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j = j + 1
else:
ans_comb = np.delete(ans_comb, (j), axis=0)
# Output
return ans_comb


And I am uploading some more tests. https://imgur.com/mjweDyy










share|improve this question









New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$











  • $begingroup$
    Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
    $endgroup$
    – Reinderien
    Apr 21 at 23:21










  • $begingroup$
    "there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
    $endgroup$
    – Reinderien
    Apr 21 at 23:22






  • 2




    $begingroup$
    @Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
    $endgroup$
    – vnp
    Apr 22 at 0:32










  • $begingroup$
    @vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    @Reinderien Agreed. Still deciphering.
    $endgroup$
    – vnp
    2 days ago

















6












$begingroup$


In my Uni, my scientific professor asked me to make some researches about the extreme points of polyhedrals. And I did them. I found that there is still no code in public for searching extreme points for polyhedral with n dimensions (n - x's), but polyhedrons are everywhere (CV, game theories, etc.). I wrote a function for this task and made a python library (also there are matrix and array combination maker functions).



All I want is to make this code more optimal and compatible for all python versions (I have some troubles that some times happen when I install it by "pip install lin", but other times no). I want to make the life of people easier and make it more comfortable.



I am asking for you to test this function on your computer and write if you have any bugs, fails or thoughts on how to make it better. I am open to constructive criticism and non-constructive too (it will help to understand if somebody needs it or that is just a waste of time).



All the examples, instructions and code on my GitHub: https://github.com/r4ndompuff/polyhedral_set



import numpy as np
import itertools as it
import math
import re

def permutation(m,n):
return math.factorial(n)/(math.factorial(n-m)*math.factorial(m))

def matrix_combinations(matr,n):
timed = list(map(list, it.combinations(matr, n)))
for i in range(n):
timed[i][i][i] = np.asscalar(timed[i][i][i])
all = np.array(list(timed))
return all

def array_combinations(arr,n):
timed = list(map(list, it.combinations(arr, n)))
for i in range(n):
timed[i][i] = np.asscalar(timed[i][i])
all = np.array(list(timed))
return all

def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(m):
td_answer = sum(matr[i]*x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1

def extreme_points(m,n,A,b,sym_comb):
# Input
A = np.array(A).reshape(m,n)
b = np.array(b).reshape(m,1)
# Proccess
ans_comb = np.zeros((1,n))
arr_comb = array_combinations(b,n)
matr_comb = matrix_combinations(A,n)
for i in range(int(permutation(n,m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(matr_comb[i],arr_comb[i])
ans_comb = np.vstack([ans_comb,x])
ans_comb = np.delete(ans_comb, (0), axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j = j + 1
else:
ans_comb = np.delete(ans_comb, (j), axis=0)
# Output
return ans_comb


And I am uploading some more tests. https://imgur.com/mjweDyy










share|improve this question









New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$











  • $begingroup$
    Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
    $endgroup$
    – Reinderien
    Apr 21 at 23:21










  • $begingroup$
    "there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
    $endgroup$
    – Reinderien
    Apr 21 at 23:22






  • 2




    $begingroup$
    @Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
    $endgroup$
    – vnp
    Apr 22 at 0:32










  • $begingroup$
    @vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    @Reinderien Agreed. Still deciphering.
    $endgroup$
    – vnp
    2 days ago













6












6








6


2



$begingroup$


In my Uni, my scientific professor asked me to make some researches about the extreme points of polyhedrals. And I did them. I found that there is still no code in public for searching extreme points for polyhedral with n dimensions (n - x's), but polyhedrons are everywhere (CV, game theories, etc.). I wrote a function for this task and made a python library (also there are matrix and array combination maker functions).



All I want is to make this code more optimal and compatible for all python versions (I have some troubles that some times happen when I install it by "pip install lin", but other times no). I want to make the life of people easier and make it more comfortable.



I am asking for you to test this function on your computer and write if you have any bugs, fails or thoughts on how to make it better. I am open to constructive criticism and non-constructive too (it will help to understand if somebody needs it or that is just a waste of time).



All the examples, instructions and code on my GitHub: https://github.com/r4ndompuff/polyhedral_set



import numpy as np
import itertools as it
import math
import re

def permutation(m,n):
return math.factorial(n)/(math.factorial(n-m)*math.factorial(m))

def matrix_combinations(matr,n):
timed = list(map(list, it.combinations(matr, n)))
for i in range(n):
timed[i][i][i] = np.asscalar(timed[i][i][i])
all = np.array(list(timed))
return all

def array_combinations(arr,n):
timed = list(map(list, it.combinations(arr, n)))
for i in range(n):
timed[i][i] = np.asscalar(timed[i][i])
all = np.array(list(timed))
return all

def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(m):
td_answer = sum(matr[i]*x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1

def extreme_points(m,n,A,b,sym_comb):
# Input
A = np.array(A).reshape(m,n)
b = np.array(b).reshape(m,1)
# Proccess
ans_comb = np.zeros((1,n))
arr_comb = array_combinations(b,n)
matr_comb = matrix_combinations(A,n)
for i in range(int(permutation(n,m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(matr_comb[i],arr_comb[i])
ans_comb = np.vstack([ans_comb,x])
ans_comb = np.delete(ans_comb, (0), axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j = j + 1
else:
ans_comb = np.delete(ans_comb, (j), axis=0)
# Output
return ans_comb


And I am uploading some more tests. https://imgur.com/mjweDyy










share|improve this question









New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$




In my Uni, my scientific professor asked me to make some researches about the extreme points of polyhedrals. And I did them. I found that there is still no code in public for searching extreme points for polyhedral with n dimensions (n - x's), but polyhedrons are everywhere (CV, game theories, etc.). I wrote a function for this task and made a python library (also there are matrix and array combination maker functions).



All I want is to make this code more optimal and compatible for all python versions (I have some troubles that some times happen when I install it by "pip install lin", but other times no). I want to make the life of people easier and make it more comfortable.



I am asking for you to test this function on your computer and write if you have any bugs, fails or thoughts on how to make it better. I am open to constructive criticism and non-constructive too (it will help to understand if somebody needs it or that is just a waste of time).



All the examples, instructions and code on my GitHub: https://github.com/r4ndompuff/polyhedral_set



import numpy as np
import itertools as it
import math
import re

def permutation(m,n):
return math.factorial(n)/(math.factorial(n-m)*math.factorial(m))

def matrix_combinations(matr,n):
timed = list(map(list, it.combinations(matr, n)))
for i in range(n):
timed[i][i][i] = np.asscalar(timed[i][i][i])
all = np.array(list(timed))
return all

def array_combinations(arr,n):
timed = list(map(list, it.combinations(arr, n)))
for i in range(n):
timed[i][i] = np.asscalar(timed[i][i])
all = np.array(list(timed))
return all

def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(m):
td_answer = sum(matr[i]*x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1

def extreme_points(m,n,A,b,sym_comb):
# Input
A = np.array(A).reshape(m,n)
b = np.array(b).reshape(m,1)
# Proccess
ans_comb = np.zeros((1,n))
arr_comb = array_combinations(b,n)
matr_comb = matrix_combinations(A,n)
for i in range(int(permutation(n,m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(matr_comb[i],arr_comb[i])
ans_comb = np.vstack([ans_comb,x])
ans_comb = np.delete(ans_comb, (0), axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j = j + 1
else:
ans_comb = np.delete(ans_comb, (j), axis=0)
# Output
return ans_comb


And I am uploading some more tests. https://imgur.com/mjweDyy







python algorithm numpy homework computational-geometry






share|improve this question









New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 2 days ago









200_success

131k17157422




131k17157422






New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Apr 21 at 22:57









Andrey LovyaginAndrey Lovyagin

313




313




New contributor




Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Andrey Lovyagin is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











  • $begingroup$
    Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
    $endgroup$
    – Reinderien
    Apr 21 at 23:21










  • $begingroup$
    "there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
    $endgroup$
    – Reinderien
    Apr 21 at 23:22






  • 2




    $begingroup$
    @Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
    $endgroup$
    – vnp
    Apr 22 at 0:32










  • $begingroup$
    @vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    @Reinderien Agreed. Still deciphering.
    $endgroup$
    – vnp
    2 days ago
















  • $begingroup$
    Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
    $endgroup$
    – Reinderien
    Apr 21 at 23:21










  • $begingroup$
    "there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
    $endgroup$
    – Reinderien
    Apr 21 at 23:22






  • 2




    $begingroup$
    @Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
    $endgroup$
    – vnp
    Apr 22 at 0:32










  • $begingroup$
    @vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    @Reinderien Agreed. Still deciphering.
    $endgroup$
    – vnp
    2 days ago















$begingroup$
Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
$endgroup$
– Reinderien
Apr 21 at 23:21




$begingroup$
Can you provide some more information on what exactly is going on, from a math standpoint? Is this actually a polyhedron, or a polytope? In how many dimensions? By "extreme", what do you mean? Euclidean norm from (the origin, an arbitrary point)?
$endgroup$
– Reinderien
Apr 21 at 23:21












$begingroup$
"there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
$endgroup$
– Reinderien
Apr 21 at 23:22




$begingroup$
"there is still no code in public for searching extreme points for polyhedral with n dimensions" - I can nearly guarantee that that isn't the case.
$endgroup$
– Reinderien
Apr 21 at 23:22




2




2




$begingroup$
@Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
$endgroup$
– vnp
Apr 22 at 0:32




$begingroup$
@Reinderien I am still in the process of deciphering the question. I have a math background, and I share the mother tongue with OP. My impression is that by extremal points OP means the vertices of a simplex where a certain linear form (defined by A, b, and the condition) achieves an extremum. I could be wrong.
$endgroup$
– vnp
Apr 22 at 0:32












$begingroup$
@vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
$endgroup$
– Reinderien
2 days ago




$begingroup$
@vnp That's kind of what I guessed, and if that's the case, linear programming is a quite well-established field already - with some stuff built right into scipy.
$endgroup$
– Reinderien
2 days ago












$begingroup$
@Reinderien Agreed. Still deciphering.
$endgroup$
– vnp
2 days ago




$begingroup$
@Reinderien Agreed. Still deciphering.
$endgroup$
– vnp
2 days ago










1 Answer
1






active

oldest

votes


















5












$begingroup$

I created a rudimentary pull request to your GitHub repo. I won't show all of the content here except for the main file:



import numpy as np
import itertools as it
from math import factorial
import re


def permutation(m, n):
return factorial(n) / (factorial(n - m) * factorial(m))


def matrix_combinations(matr, n):
timed = list(map(list, it.combinations(matr, n)))
return np.array(list(timed))


def array_combinations(arr, n):
timed = list(map(list, it.combinations(arr, n)))
return np.array(list(timed))


def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(int(m)):
td_answer = sum(matr[i] * x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1


def extreme_points(A, b, sym_comb):
# Input
A = np.array(A)
b = np.array(b)
m, n = A.shape
# Process
ans_comb = np.zeros((1, n))
arr_comb = array_combinations(b, n)
matr_comb = matrix_combinations(A, n)
for i in range(int(permutation(n, m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(np.array(matr_comb[i], dtype='float'),
np.array(arr_comb[i], dtype='float'))
ans_comb = np.vstack([ans_comb, x])
ans_comb = np.delete(ans_comb, 0, axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j += 1
else:
ans_comb = np.delete(ans_comb, j, axis=0)
# Output
return ans_comb


Notable changes:



  • Do a direct import of factorial

  • Don't call asscalar, since it's both unneeded and deprecated

  • Don't call a variable all, since that shadows a Python built-in

  • Don't need to explicitly pass array dimensions, nor do you need to reshape the arrays

  • Drop redundant parens around some expressions

  • Use += where applicable

  • Fix up almost all PEP8 issues, except for your capital letter A, which is fine in context

This doesn't solve the bigger issue that you should replace 99% of this with a call to scipy. I'll do that separately (I suspect that @vnp is, as well).






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    @AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Read about the A_ub, b_ub arguments.
    $endgroup$
    – Reinderien
    2 days ago












Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);






Andrey Lovyagin is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217855%2fsearching-extreme-points-of-polyhedron%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









5












$begingroup$

I created a rudimentary pull request to your GitHub repo. I won't show all of the content here except for the main file:



import numpy as np
import itertools as it
from math import factorial
import re


def permutation(m, n):
return factorial(n) / (factorial(n - m) * factorial(m))


def matrix_combinations(matr, n):
timed = list(map(list, it.combinations(matr, n)))
return np.array(list(timed))


def array_combinations(arr, n):
timed = list(map(list, it.combinations(arr, n)))
return np.array(list(timed))


def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(int(m)):
td_answer = sum(matr[i] * x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1


def extreme_points(A, b, sym_comb):
# Input
A = np.array(A)
b = np.array(b)
m, n = A.shape
# Process
ans_comb = np.zeros((1, n))
arr_comb = array_combinations(b, n)
matr_comb = matrix_combinations(A, n)
for i in range(int(permutation(n, m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(np.array(matr_comb[i], dtype='float'),
np.array(arr_comb[i], dtype='float'))
ans_comb = np.vstack([ans_comb, x])
ans_comb = np.delete(ans_comb, 0, axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j += 1
else:
ans_comb = np.delete(ans_comb, j, axis=0)
# Output
return ans_comb


Notable changes:



  • Do a direct import of factorial

  • Don't call asscalar, since it's both unneeded and deprecated

  • Don't call a variable all, since that shadows a Python built-in

  • Don't need to explicitly pass array dimensions, nor do you need to reshape the arrays

  • Drop redundant parens around some expressions

  • Use += where applicable

  • Fix up almost all PEP8 issues, except for your capital letter A, which is fine in context

This doesn't solve the bigger issue that you should replace 99% of this with a call to scipy. I'll do that separately (I suspect that @vnp is, as well).






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    @AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Read about the A_ub, b_ub arguments.
    $endgroup$
    – Reinderien
    2 days ago
















5












$begingroup$

I created a rudimentary pull request to your GitHub repo. I won't show all of the content here except for the main file:



import numpy as np
import itertools as it
from math import factorial
import re


def permutation(m, n):
return factorial(n) / (factorial(n - m) * factorial(m))


def matrix_combinations(matr, n):
timed = list(map(list, it.combinations(matr, n)))
return np.array(list(timed))


def array_combinations(arr, n):
timed = list(map(list, it.combinations(arr, n)))
return np.array(list(timed))


def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(int(m)):
td_answer = sum(matr[i] * x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1


def extreme_points(A, b, sym_comb):
# Input
A = np.array(A)
b = np.array(b)
m, n = A.shape
# Process
ans_comb = np.zeros((1, n))
arr_comb = array_combinations(b, n)
matr_comb = matrix_combinations(A, n)
for i in range(int(permutation(n, m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(np.array(matr_comb[i], dtype='float'),
np.array(arr_comb[i], dtype='float'))
ans_comb = np.vstack([ans_comb, x])
ans_comb = np.delete(ans_comb, 0, axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j += 1
else:
ans_comb = np.delete(ans_comb, j, axis=0)
# Output
return ans_comb


Notable changes:



  • Do a direct import of factorial

  • Don't call asscalar, since it's both unneeded and deprecated

  • Don't call a variable all, since that shadows a Python built-in

  • Don't need to explicitly pass array dimensions, nor do you need to reshape the arrays

  • Drop redundant parens around some expressions

  • Use += where applicable

  • Fix up almost all PEP8 issues, except for your capital letter A, which is fine in context

This doesn't solve the bigger issue that you should replace 99% of this with a call to scipy. I'll do that separately (I suspect that @vnp is, as well).






share|improve this answer











$endgroup$








  • 1




    $begingroup$
    Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    @AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Read about the A_ub, b_ub arguments.
    $endgroup$
    – Reinderien
    2 days ago














5












5








5





$begingroup$

I created a rudimentary pull request to your GitHub repo. I won't show all of the content here except for the main file:



import numpy as np
import itertools as it
from math import factorial
import re


def permutation(m, n):
return factorial(n) / (factorial(n - m) * factorial(m))


def matrix_combinations(matr, n):
timed = list(map(list, it.combinations(matr, n)))
return np.array(list(timed))


def array_combinations(arr, n):
timed = list(map(list, it.combinations(arr, n)))
return np.array(list(timed))


def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(int(m)):
td_answer = sum(matr[i] * x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1


def extreme_points(A, b, sym_comb):
# Input
A = np.array(A)
b = np.array(b)
m, n = A.shape
# Process
ans_comb = np.zeros((1, n))
arr_comb = array_combinations(b, n)
matr_comb = matrix_combinations(A, n)
for i in range(int(permutation(n, m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(np.array(matr_comb[i], dtype='float'),
np.array(arr_comb[i], dtype='float'))
ans_comb = np.vstack([ans_comb, x])
ans_comb = np.delete(ans_comb, 0, axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j += 1
else:
ans_comb = np.delete(ans_comb, j, axis=0)
# Output
return ans_comb


Notable changes:



  • Do a direct import of factorial

  • Don't call asscalar, since it's both unneeded and deprecated

  • Don't call a variable all, since that shadows a Python built-in

  • Don't need to explicitly pass array dimensions, nor do you need to reshape the arrays

  • Drop redundant parens around some expressions

  • Use += where applicable

  • Fix up almost all PEP8 issues, except for your capital letter A, which is fine in context

This doesn't solve the bigger issue that you should replace 99% of this with a call to scipy. I'll do that separately (I suspect that @vnp is, as well).






share|improve this answer











$endgroup$



I created a rudimentary pull request to your GitHub repo. I won't show all of the content here except for the main file:



import numpy as np
import itertools as it
from math import factorial
import re


def permutation(m, n):
return factorial(n) / (factorial(n - m) * factorial(m))


def matrix_combinations(matr, n):
timed = list(map(list, it.combinations(matr, n)))
return np.array(list(timed))


def array_combinations(arr, n):
timed = list(map(list, it.combinations(arr, n)))
return np.array(list(timed))


def check_extreme(matr, arr, x, sym_comb, m):
sym_comb = sym_comb.replace(']', '')
sym_comb = sym_comb.replace('[', '')
sym_comb = re.split("[ ,]", sym_comb)
for i in range(int(m)):
td_answer = sum(matr[i] * x)
if sym_comb[i] == '>':
if td_answer <= arr[i]:
return 0
elif sym_comb[i] == '>=':
if td_answer < arr[i]:
return 0
elif sym_comb[i] == '<':
if td_answer >= arr[i]:
return 0
elif sym_comb[i] == '<=':
if td_answer > arr[i]:
return 0
elif sym_comb[i] == '=':
if td_answer != arr[i]:
return 0
elif sym_comb[i] == '!=':
if td_answer == arr[i]:
return 0
else:
return 0
return 1


def extreme_points(A, b, sym_comb):
# Input
A = np.array(A)
b = np.array(b)
m, n = A.shape
# Process
ans_comb = np.zeros((1, n))
arr_comb = array_combinations(b, n)
matr_comb = matrix_combinations(A, n)
for i in range(int(permutation(n, m))):
if np.linalg.det(matr_comb[i]) != 0:
x = np.linalg.solve(np.array(matr_comb[i], dtype='float'),
np.array(arr_comb[i], dtype='float'))
ans_comb = np.vstack([ans_comb, x])
ans_comb = np.delete(ans_comb, 0, axis=0)
j = 0
for i in range(len(ans_comb)):
if check_extreme(A, b, ans_comb[j], sym_comb, m):
ans_comb = ans_comb
j += 1
else:
ans_comb = np.delete(ans_comb, j, axis=0)
# Output
return ans_comb


Notable changes:



  • Do a direct import of factorial

  • Don't call asscalar, since it's both unneeded and deprecated

  • Don't call a variable all, since that shadows a Python built-in

  • Don't need to explicitly pass array dimensions, nor do you need to reshape the arrays

  • Drop redundant parens around some expressions

  • Use += where applicable

  • Fix up almost all PEP8 issues, except for your capital letter A, which is fine in context

This doesn't solve the bigger issue that you should replace 99% of this with a call to scipy. I'll do that separately (I suspect that @vnp is, as well).







share|improve this answer














share|improve this answer



share|improve this answer








edited 2 days ago

























answered 2 days ago









ReinderienReinderien

5,568928




5,568928







  • 1




    $begingroup$
    Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    @AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Read about the A_ub, b_ub arguments.
    $endgroup$
    – Reinderien
    2 days ago













  • 1




    $begingroup$
    Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    @AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
    $endgroup$
    – Reinderien
    2 days ago










  • $begingroup$
    Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
    $endgroup$
    – Andrey Lovyagin
    2 days ago










  • $begingroup$
    Read about the A_ub, b_ub arguments.
    $endgroup$
    – Reinderien
    2 days ago








1




1




$begingroup$
Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
$endgroup$
– Andrey Lovyagin
2 days ago




$begingroup$
Thank you! In meantime I made it work with any NumPy version now (about loop error you report).
$endgroup$
– Andrey Lovyagin
2 days ago












$begingroup$
Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
$endgroup$
– Andrey Lovyagin
2 days ago




$begingroup$
Sorry, but I can't find the same function in scipy. Can you provide me the name of function?
$endgroup$
– Andrey Lovyagin
2 days ago












$begingroup$
@AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
$endgroup$
– Reinderien
2 days ago




$begingroup$
@AndreyLovyagin docs.scipy.org/doc/scipy/reference/generated/…
$endgroup$
– Reinderien
2 days ago












$begingroup$
Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
$endgroup$
– Andrey Lovyagin
2 days ago




$begingroup$
Thank you very much for all that you have done! Also, I checked scipy.optimize.linprog() function and I can't really understand how it can replace much of the code. I will learn and read more about it, but on first sight, it looks like it can't solve non-equational system (I mean not '=', but any sign, e.g. '>='), that is why I can't see how I can find extreme points by it.
$endgroup$
– Andrey Lovyagin
2 days ago












$begingroup$
Read about the A_ub, b_ub arguments.
$endgroup$
– Reinderien
2 days ago





$begingroup$
Read about the A_ub, b_ub arguments.
$endgroup$
– Reinderien
2 days ago











Andrey Lovyagin is a new contributor. Be nice, and check out our Code of Conduct.









draft saved

draft discarded


















Andrey Lovyagin is a new contributor. Be nice, and check out our Code of Conduct.












Andrey Lovyagin is a new contributor. Be nice, and check out our Code of Conduct.











Andrey Lovyagin is a new contributor. Be nice, and check out our Code of Conduct.














Thanks for contributing an answer to Code Review Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f217855%2fsearching-extreme-points-of-polyhedron%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown