--- /dev/null
+#!/usr/bin/env python
+
+"""
+Solve an example problem with lp_solve.
+"""
+
+from math import acos, sin, cos
+import os
+import site
+import sys
+
+# Basically, add '../src' to our path.
+# Needed for the imports that follow.
+site.addsitedir(os.path.dirname(os.path.abspath(sys.argv[0])) + '/../../src')
+
+import LinearProgramming
+
+
+class Facility(object):
+
+ def __init__(self, fac_id, fac_capacity, fac_latitude, fac_longitude):
+ self.id = fac_id
+ self.capacity = fac_capacity
+ self.latitude = fac_latitude
+ self.longitude = fac_longitude
+
+ def distance(self, other_facility):
+ return 3963.0 * acos(sin(self.latitude/57.2958) * sin(other_facility.latitude/57.2958) + cos(self.latitude/57.2958) * cos(other_facility.latitude/57.2958) * cos(other_facility.longitude/57.2958 - self.longitude/57.2958))
+
+
+class Consumer(Facility):
+ def __init__(self, fac_id, fac_capacity, fac_latitude, fac_longitude):
+ super(Consumer, self).__init__(fac_id,
+ fac_capacity,
+ fac_latitude,
+ fac_longitude)
+
+class Producer(Facility):
+ def __init__(self, fac_id, fac_capacity, fac_latitude, fac_longitude):
+ super(Producer, self).__init__(fac_id,
+ fac_capacity,
+ fac_latitude,
+ fac_longitude)
+
+f = open('midatl.csv', 'r')
+f.readline() # Skip the header
+
+producers = []
+consumers = []
+
+for line in f:
+ row = line.split(',')
+ fac_id = int(row[0])
+ fac_type = row[1]
+ fac_capacity = float(row[2])
+ fac_latitude = float(row[3])
+ fac_longitude = float(row[4])
+
+ if fac_type == '"D"':
+ c = Consumer(fac_id, fac_capacity, fac_latitude, fac_longitude)
+ consumers.append(c)
+ else:
+ p = Producer(fac_id, fac_capacity, fac_latitude, fac_longitude)
+ producers.append(p)
+
+
+
+lp = LinearProgramming.LinearProgram()
+
+# Loop through the consumer/producer pairs, calculating costs
+# (distances) and adding them to the array of objective function
+# coefficients.
+lp.objective_coefficients = []
+
+for c_idx in range(0, len(consumers)):
+ for p_idx in range(0, len(producers)):
+ distance = consumers[c_idx].distance(producers[p_idx])
+ lp.objective_coefficients.append(distance)
+
+
+num_cols = len(lp.objective_coefficients)
+
+lp.constraint_matrix = []
+lp.inequalities = []
+lp.rhs = []
+
+for c_idx in range(0, len(consumers)):
+ demand = consumers[c_idx].capacity
+ lp.rhs.append(demand)
+
+ lp.inequalities.append(LinearProgramming.GE)
+
+ demand_row = [0]*num_cols
+ offset = c_idx * len(producers)
+ for idx in range(0, len(producers)):
+ demand_row[offset+idx] = 1
+
+ lp.constraint_matrix.append(demand_row)
+
+for p_idx in range(0, len(producers)):
+ supply = producers[p_idx].capacity
+ lp.rhs.append(supply)
+
+ lp.inequalities.append(LinearProgramming.LE)
+
+ supply_row = [0]*num_cols
+
+ for idx in range(0,len(consumers)):
+ offset = p_idx + len(producers)*idx
+ supply_row[offset] = 1
+ lp.constraint_matrix.append(supply_row)
+
+lp.type = LinearProgramming.MINIMIZE
+
+[v,x,duals] = lp.solve()
+
+print 'Optimal objective function value: ', v
+print 'Optimal solution vector: ', x