Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/20/12 11:06:32 (12 years ago)
Author:
sforsten
Message:

#1782: Modified instance providers QAPLIB, ElloumiCTAP, CordeauGQAP to use a zip archive instead of individual embedded files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.Instances.QAPLIB/3.3/QAPLIBInstanceProvider.cs

    r7558 r7638  
    2626using System.Reflection;
    2727using System.Text.RegularExpressions;
     28using ICSharpCode.SharpZipLib.Zip;
    2829
    2930namespace HeuristicLab.Problems.Instances.QAPLIB {
     
    159160    }
    160161
     162    private const string FileName = "qap";
     163
    161164    public override IEnumerable<IDataDescriptor> GetDataDescriptors() {
    162       var solutions = Assembly.GetExecutingAssembly()
    163         .GetManifestResourceNames()
    164         .Where(x => x.EndsWith(".sln"))
    165         .ToDictionary(x => Path.GetFileNameWithoutExtension(x) + ".dat", x => x);
    166 
    167       return Assembly.GetExecutingAssembly()
    168           .GetManifestResourceNames()
    169           .Where(x => x.EndsWith(".dat"))
    170           .OrderBy(x => x)
    171           .Select(x => new QAPLIBDataDescriptor(GetPrettyName(x), GetDescription(), x, solutions.ContainsKey(x) ? solutions[x] : String.Empty));
     165      Dictionary<string, string> solutions = new Dictionary<string, string>();
     166      var solutionsArchiveName = GetResourceName(FileName + @"\.sln\.zip");
     167      if (!String.IsNullOrEmpty(solutionsArchiveName)) {
     168        using (var solutionsZipFile = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(solutionsArchiveName))) {
     169          foreach (var entry in GetZipContents(solutionsZipFile))
     170              solutions.Add(Path.GetFileNameWithoutExtension(entry) + ".dat", entry);
     171        }
     172      }
     173      var instanceArchiveName = GetResourceName(FileName + @"\.dat\.zip");
     174      if (String.IsNullOrEmpty(instanceArchiveName)) yield break;
     175
     176      using (var instanceStream = new ZipInputStream(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
     177        foreach (var entry in GetZipContents(instanceStream).OrderBy(x => x)) {
     178          yield return new QAPLIBDataDescriptor(Path.GetFileNameWithoutExtension(entry), GetDescription(), entry, solutions.ContainsKey(entry) ? solutions[entry] : String.Empty);
     179        }
     180      }
    172181    }
    173182
    174183    public override QAPData LoadData(IDataDescriptor id) {
    175184      var descriptor = (QAPLIBDataDescriptor)id;
    176       using (var stream = Assembly.GetExecutingAssembly()
    177         .GetManifestResourceStream(descriptor.InstanceIdentifier)) {
    178         var parser = new QAPLIBParser();
    179         parser.Parse(stream);
    180         var instance = Load(parser);
    181         instance.Name = id.Name;
    182         instance.Description = id.Description;
    183 
    184         if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
    185           using (Stream solStream = Assembly.GetExecutingAssembly()
    186             .GetManifestResourceStream(descriptor.SolutionIdentifier)) {
    187             var slnParser = new QAPLIBSolutionParser();
    188             slnParser.Parse(solStream, true);
    189             if (slnParser.Error != null) throw slnParser.Error;
    190 
    191             int[] assignment = slnParser.Assignment;
    192             if (reversedSolutions.Contains(instance.Name)) {
    193               assignment = (int[])slnParser.Assignment.Clone();
    194               for (int i = 0; i < assignment.Length; i++)
    195                 assignment[slnParser.Assignment[i]] = i;
     185      var instanceArchiveName = GetResourceName(FileName + @"\.dat\.zip");
     186      using (var instancesZipFile = new ZipFile(GetType().Assembly.GetManifestResourceStream(instanceArchiveName))) {
     187        var entry = instancesZipFile.GetEntry(descriptor.InstanceIdentifier);
     188
     189        using (var stream = instancesZipFile.GetInputStream(entry)) {
     190          var parser = new QAPLIBParser();
     191          parser.Parse(stream);
     192          var instance = Load(parser);
     193          instance.Name = id.Name;
     194          instance.Description = id.Description;
     195
     196          if (!String.IsNullOrEmpty(descriptor.SolutionIdentifier)) {
     197            var solutionsArchiveName = GetResourceName(FileName + @"\.sln\.zip");
     198            using (var solutionsZipFile = new ZipFile(GetType().Assembly.GetManifestResourceStream(solutionsArchiveName))) {
     199              entry = solutionsZipFile.GetEntry(descriptor.SolutionIdentifier);
     200              using (var solStream = solutionsZipFile.GetInputStream(entry)) {
     201                var slnParser = new QAPLIBSolutionParser();
     202                slnParser.Parse(solStream, true);
     203                if (slnParser.Error != null) throw slnParser.Error;
     204
     205                int[] assignment = slnParser.Assignment;
     206                if (reversedSolutions.Contains(instance.Name)) {
     207                  assignment = (int[])slnParser.Assignment.Clone();
     208                  for (int i = 0; i < assignment.Length; i++)
     209                    assignment[slnParser.Assignment[i]] = i;
     210                }
     211                instance.BestKnownAssignment = assignment;
     212                instance.BestKnownQuality = slnParser.Quality;
     213              }
    196214            }
    197             instance.BestKnownAssignment = assignment;
    198             instance.BestKnownQuality = slnParser.Quality;
    199215          }
     216          return instance;
    200217        }
    201         return instance;
    202218      }
    203219    }
     
    224240    }
    225241
    226     private string GetPrettyName(string instanceIdentifier) {
    227       return Regex.Match(instanceIdentifier, GetType().Namespace + @"\.Data\.(.*)\.dat").Groups[1].Captures[0].Value;
    228     }
    229 
    230242    private string GetDescription() {
    231243      return "Embedded instance of plugin version " + Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyFileVersionAttribute), true).Cast<AssemblyFileVersionAttribute>().First().Version + ".";
    232244    }
     245
     246    protected virtual string GetResourceName(string fileName) {
     247      return Assembly.GetExecutingAssembly().GetManifestResourceNames()
     248              .Where(x => Regex.Match(x, @".*\.Data\." + fileName).Success).SingleOrDefault();
     249    }
     250
     251    protected IEnumerable<string> GetZipContents(ZipInputStream zipFile) {
     252      ZipEntry entry;
     253      while ((entry = zipFile.GetNextEntry()) != null) {
     254        yield return entry.Name;
     255      }
     256    }
    233257  }
    234258}
Note: See TracChangeset for help on using the changeset viewer.