def main():
    '''
    Main function
    '''

    ore = EveOnlineManufacturingJob(DATA_ACCESS_OBJECT)
    reproc_mat_list = ore.get_mineral_matrix_adjusted(sec_status_low_limit=0.9,
                                                      fclt_base_yield=0.54,
                                                      rprcs_skill_lvl=5,
                                                      rprcs_eff_skill_lvl=5,
                                                      mtrl_spcfc_prcs_skill_lvl=5,
                                                      implant_bonus=0)

    # for simplyfication we filter ore list
    reproc_mat_list_filtered = {}
    reproc_mat_list_filtered[DATA_ACCESS_OBJECT.get_inv_type(type_name='Veldspar')['type_id']] = reproc_mat_list[DATA_ACCESS_OBJECT.get_inv_type(type_name='Veldspar')['type_id']]
#    reproc_mat_list_filtered[DATA_ACCESS_OBJECT.get_inv_item(type_name='Plagioclase')['type_id']] = reproc_mat_list[DATA_ACCESS_OBJECT.get_inv_item(type_name='Plagioclase')['type_id']]
#    reproc_mat_list_filtered[DATA_ACCESS_OBJECT.get_inv_item(type_name='Scordite')['type_id']] = reproc_mat_list[DATA_ACCESS_OBJECT.get_inv_item(type_name='Scordite')['type_id']]
    reproc_mat_list_filtered[DATA_ACCESS_OBJECT.get_inv_type(type_name='Pyroxeres')['type_id']] = reproc_mat_list[DATA_ACCESS_OBJECT.get_inv_type(type_name='Pyroxeres')['type_id']]
    reproc_mat_list = reproc_mat_list_filtered

    # define mineral amounts we want to get refining the ores
    mineral_amounts_desired={}
    mineral_amounts_desired[DATA_ACCESS_OBJECT.get_inv_type(type_name='Tritanium')['type_id']] = 200
    mineral_amounts_desired[DATA_ACCESS_OBJECT.get_inv_type(type_name='Nocxium')['type_id']] = 1
#    mineral_amounts_desired[DATA_ACCESS_OBJECT.get_inv_item(type_name='Pyerite')['type_id']] = 160
#    mineral_amounts_desired[DATA_ACCESS_OBJECT.get_inv_item(type_name='Mexallon')['type_id']] = 80

    # define variables for building matrices
    list_of_mineral_matrices = []
    mineral_amounts_desired_matrix = []
    ore_quantity_matrix = []

    # build matrices for linear programming
    for k_ore,v_minerals in reproc_mat_list.iteritems():
        min_quantity_list = [-float(quant) for quant in v_minerals.values()]
        list_of_mineral_matrices.append(min_quantity_list)
        ore_quantity_matrix.append(float(1.0))
        min_id_list = v_minerals.keys()

    for min_id in min_id_list:
        if (min_id not in mineral_amounts_desired.keys()):
            mineral_amounts_desired_matrix.append(float(0.0))
        else:
            mineral_amounts_desired_matrix.append(-float(mineral_amounts_desired[min_id]))
        
    A = matrix(list_of_mineral_matrices)
    b = matrix(mineral_amounts_desired_matrix)
    c = matrix(ore_quantity_matrix)

    printing.options['dformat'] = '%.1f'
    printing.options['width'] = -1
    
    print A
    print b
    print c

    sol=solvers.lp(c,A,b)
    print(sol['x'])
    def setUp(self):
        '''
        Set up of test
        '''
        self.db_access_obj = DBAccessSQLite(self.DATA_FILE)
        self.data_access = EveDB(self.db_access_obj)

        self.eve_item_manufacturing = EveOnlineManufacturingJob(self.data_access,
                                                                type_name=self.BUILD_PRODUCT_NAME)
class Test(unittest.TestCase):
    '''
    Unit test for class EveItemManufacturing
    '''

    DATA_FILE = '../data/eve.db'
    eve_item_manufacturing = None

    BUILD_PRODUCT_NAME = 'Ark'
    BUILD_PRODUCT_RUNS = 1
    BUILD_PRODUCT_ME = 5
    BUILD_PRODUCT_TE = 0

    maxDiff = None

    def setUp(self):
        '''
        Set up of test
        '''
        self.db_access_obj = DBAccessSQLite(self.DATA_FILE)
        self.data_access = EveDB(self.db_access_obj)

        self.eve_item_manufacturing = EveOnlineManufacturingJob(self.data_access,
                                                                type_name=self.BUILD_PRODUCT_NAME)

    def tearDown(self):
        '''
        Tear down of test
        '''
        self.db_access_obj.close()

    def test_get_item(self):
        '''
        Get item
        '''
        self.eve_item_manufacturing.get_item(type_name="Providence")
        self.failUnlessEqual("Providence",
                             self.eve_item_manufacturing.type_name)

    def test_get_manufacturing_job_list(self):
        '''
        Obtain list of manufacturing jobs
        '''
        job_list = ['Ark',
                    'Capital Jump Drive',
                    'Capital Radar Sensor Cluster',
                    'Capital Linear Shield Emitter',
                    'Capital Antimatter Reactor Unit',
                    'Capital Nanoelectrical Microprocessor',
                    'Capital Tungsten Carbide Armor Plate',
                    'R.A.M.- Starship Tech',
                    'Providence',
                    'Capital Propulsion Engine',
                    'Capital Cargo Bay',
                    'Capital Construction Parts',
                    'Capital Armor Plates',
                    'Capital Tesseract Capacitor Unit',
                    'Capital Fusion Thruster']

        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.manufacturing_data_calculate()

        self.failUnlessEqual(job_list,
                             [job.type_name for job in self.eve_item_manufacturing.get_manufacturing_job_list()])

    def test_get_manufacturing_job_list_with_assets(self):
        '''
        Get manufacturing job list, with assets
        '''
        job_list = ['Ark',
                    'Capital Radar Sensor Cluster',
                    'Capital Linear Shield Emitter',
                    'Capital Antimatter Reactor Unit',
                    'Capital Nanoelectrical Microprocessor',
                    'Capital Tungsten Carbide Armor Plate',
                    'R.A.M.- Starship Tech',
                    'Providence',
                    'Capital Propulsion Engine',
                    'Capital Cargo Bay',
                    'Capital Construction Parts',
                    'Capital Armor Plates',
                    'Capital Tesseract Capacitor Unit',
                    'Capital Fusion Thruster']

        assets = {21025: 29}   # 21025: Capital Jump Drive

        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.asset_list = assets

        self.eve_item_manufacturing.manufacturing_data_calculate()

        self.failUnlessEqual(job_list,
                             [job.type_name for job in self.eve_item_manufacturing.get_manufacturing_job_list()])

    def test_get_material_list(self):
        '''
        Get material list
        '''
        material_list = {16672: 11401167.0, 16678: 2976997.0, 34: 133069643.0, 35: 19441019.0, 36: 7163272.0, 37: 1089400.0, 38: 314014.0, 39: 51734.0, 40: 41236.0, 16681: 40084.0, 16682: 13904.0, 11399: 3563.0, 33360: 44176.0, 16680: 76090.0, 3828: 2138.0, 16679: 1115444.0, 16683: 13673.0, 17317: 16258.0}

        assets = {39: 51732}  # 39: Zydrine

        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.asset_list = assets

        self.eve_item_manufacturing.manufacturing_data_calculate()

        self.failUnlessEqual(material_list,
                             self.eve_item_manufacturing.get_manufacturing_material_list())

    def test_get_material_list_with_assets(self):
        '''
        Get material list with assets
        '''
        material_list = {16672: 11401167.0, 16678: 2976997.0, 34: 133069643.0, 35: 19441019.0, 36: 7163272.0, 37: 1089400.0, 38: 314014.0, 39: 103466.0, 40: 41236.0, 16681: 40084.0, 16682: 13904.0, 11399: 3563.0, 33360: 44176.0, 16680: 76090.0, 3828: 2138.0, 16679: 1115444.0, 16683: 13673.0, 17317: 16258.0}

        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.manufacturing_data_calculate()

        self.failUnlessEqual(material_list,
                             self.eve_item_manufacturing.get_manufacturing_material_list())

    def test_get_manufacturing_job_by_id(self):
        '''
        Get manufacturing job by ID
        '''
        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.manufacturing_data_calculate()

        job_name = "Capital Jump Drive"

        self.failUnlessEqual(job_name,
                             self.eve_item_manufacturing.get_manufacturing_job_by_id(type_id=21025).type_name)

    def test_get_manufacturing_job_by_name(self):
        '''
        Get manufacturing job by manufactured item name
        '''
        self.eve_item_manufacturing.get_item(type_name="Ark")
        self.eve_item_manufacturing.blueprint_me_level = self.BUILD_PRODUCT_ME
        self.eve_item_manufacturing.manufacturing_runs = self.BUILD_PRODUCT_RUNS
        self.eve_item_manufacturing.manufacturing_data_calculate()

        job_id = 21025

        self.failUnlessEqual(job_id,
                             self.eve_item_manufacturing.get_manufacturing_job_by_name(type_name="Capital Jump Drive").type_id)
def main():
    '''
    Main function for testing the classes
    '''

    building_job_chain = EveOnlineManufacturingJob(DATA_ACCESS_OBJECT,
                                                   type_name=BUILD_PRODUCT_NAME,
                                                   blueprint_me_level=BUILD_PRODUCT_ME,
                                                   manufacturing_runs=BUILD_PRODUCT_RUNS,
                                                   assembly_line_type_name=BUILD_FACILITY)

    if building_job_chain.is_buildable() == False:
        print ("Can not build this item.")
        exit()

    # generate manufacturing job tree
    building_job_chain.manufacturing_data_calculate()

    # set facility for all jobs
    manufacturing_job_list = building_job_chain.get_manufacturing_job_list()

    for job in manufacturing_job_list:
        if job.type_name[0:7] == 'Capital':
            job.blueprint_me_level = 10
            job.assembly_line = EveOnlineRamAssemblyLineTypes(DATA_ACCESS_OBJECT,
                                                              assembly_line_type_name='STATION manufacturing')

    # Recalculate after setting facility
    asset_dict = create_asset_list(ASSETS_LIST)
    building_job_chain.asset_list = asset_dict
    building_job_chain.manufacturing_data_calculate()

    manufacturing_job_list = building_job_chain.get_manufacturing_job_list()

    for job in manufacturing_job_list:

        print ("level: %d, runs %d (produced %d), %s (ME: %d, Facility: %s)" % (job.build_queue_level,
                                                                                job.manufacturing_runs,
                                                                                job.blueprint_produced_quantity,
                                                                                job.type_name,
                                                                                job.blueprint_me_level,
                                                                                job.assembly_line.assembly_line_type_name
                                                                                ))

    print

    market = EveMarket(MarketAccessEveCentral())

    total_material_cost = 0

    for mat_id, quant in building_job_chain.get_manufacturing_material_list().iteritems():
        e_material_item = EveOnlineManufacturingJob(DATA_ACCESS_OBJECT,
                                                    type_id=mat_id)

        mat_price = market.get_price(type_id=mat_id,
                                     solar_system_id=30000142,
                                     price_type='buy',
                                     price_param='max')

        mat_cost = (mat_price * quant)
        total_material_cost += mat_cost

        print "%s\tQuantity: %s\tPrice: %s\tCost: %s" % (e_material_item.type_name,
                                    locale.format("%d", quant, grouping=True),
                                    locale.format("%.2f", mat_price, grouping=True),
                                    locale.format("%d", mat_cost, grouping=True))

    print ("\nCost total: %s\n" % locale.format("%d", total_material_cost, grouping=True))

    manufacturing_product_price = market.get_price(type_id=building_job_chain.type_id,
                                                   solar_system_id=30000142,
                                                   price_type='sell',
                                                   price_param='min')

    total_income = manufacturing_product_price * \
                   building_job_chain.blueprint_produced_quantity * \
                   building_job_chain.manufacturing_runs

    produced_quantity = building_job_chain.blueprint_produced_quantity * \
                        building_job_chain.manufacturing_runs

    profit = total_income - total_material_cost

    print ("Total material cost:\t%s\nSell price:\t%s\nProduced quantity:\t%s\nSelling product income:\t%s\nProfit:\t%s" % (locale.format("%d", total_material_cost, grouping=True),
                                                                                   locale.format("%d", manufacturing_product_price, grouping=True),
                                                                                   locale.format("%d", produced_quantity, grouping=True),
                                                                                   locale.format("%d", total_income, grouping=True),
                                                                                   locale.format("%d", profit, grouping=True)))
    # refining_type = EveOnlineInvType(DATA_ACCESS_OBJECT,
    #                                  type_name="White Glaze")
    #
    # refining_list = DATA_ACCESS_OBJECT.get_lst_mat_for_rfn(type_id=refining_type.type_id)
    # print ("Refining list for %s:" % (refining_type.type_name))
    #
    # for mat in refining_list:
    #     print ("material: %s, quantity: %d" % (DATA_ACCESS_OBJECT.get_inv_type(mat['material_type_id'])['type_name'],
    #                                            mat['quantity']))

    print json.dumps(building_job_chain.get_manufacturing_job_parameter_list(),
                     indent=2)