ds4dm / ecole

Extensible Combinatorial Optimization Learning Environments
https://www.ecole.ai
BSD 3-Clause "New" or "Revised" License
318 stars 68 forks source link

Saving instance generated by ecole #312

Closed sleepymalc closed 2 years ago

sleepymalc commented 2 years ago

Hi! I'm currently looking at learn2branch-ecole reimplementation and want to reproduce some of the results. But since the file seems incomplete, specifically, there are no 01_generate_instances.py mentioned in the README, hence I decide to do it myself as I think this is rather simple.

As far as I can tell, here is how the official reimplementation creates a dataset for setcover:

if args.problem == 'setcover':
        instances_train = glob.glob(
            'data/instances/setcover/train_500r_1000c_0.05d/*.lp')
        instances_valid = glob.glob(
            'data/instances/setcover/valid_500r_1000c_0.05d/*.lp')
        instances_test = glob.glob(
            'data/instances/setcover/test_500r_1000c_0.05d/*.lp')
        out_dir = 'data/samples/setcover/500r_1000c_0.05d'

I'm not sure how to store files ended in .lp generated by

random_generators = ecole.RandomGenerator(0)
for i in range(train_size):
    instance = ecole.instance.SetCoverGenerator(n_rows=500, n_cols=1000, density=node_record_prob, rng=random_generators)

which I assume should be the right way to generate instances for instances_train in this case by iterating through train_size.

Thanks for helping!

amf272 commented 2 years ago

Hi, As I understand, the instance generators (ecole.instance.SetCoverGenerator) are python generators (https://docs.python.org/3/glossary.html#term-generator) so you can iterate over them or access the next item by calling next(instance_generator). Here's a small snippet that generates train_size .lp files and saves them to file at my/output/path/special_instance_name_{i}.lp:

import ecole

train_size = 10
rng = ecole.RandomGenerator(0)
instance_generator = ecole.instance.SetCoverGenerator(n_rows=500, n_cols=1000, density=0.5, rng=rng)
for i, instance in enumerate(instance_generator):
    if i == train_size:
        break
    instance.write_problem(f"my/output/path/special_instance_name_{i}.lp")
AntoinePrv commented 2 years ago

Hi @sleepymalc

@amf272's solution works. You can use the write_problem on the instances you created.