using System; using System.Linq; using System.Text; using HeuristicLab.Problems.QuadraticAssignment; namespace HeuristicLab.Services.ProblemInstances.QAPInitializer { class Program { static void Main(string[] args) { QuadraticAssignmentProblem qap = new QuadraticAssignmentProblem(); using (ProblemInstancesEntities context = new ProblemInstancesEntities()) { foreach (string instance in qap.EmbeddedInstances) { qap.LoadEmbeddedInstance(instance); // transform DoubleMatrix into multidimensional array double[,] weights = new double[qap.Weights.Rows, qap.Weights.Columns]; double[,] distances = new double[qap.Distances.Rows, qap.Distances.Columns]; for (int i = 0; i < weights.GetLength(0); i++) { for (int j = 0; j < weights.GetLength(1); j++) { weights[i, j] = qap.Weights[i, j]; distances[i, j] = qap.Distances[i, j]; } } QAPInstance dbInstance = context.CreateObject(); dbInstance.Name = qap.Name; dbInstance.Description = qap.Description; dbInstance.Maximization = qap.Maximization.Value; dbInstance.Weights = SimpleSerializer.SerializeDoubleMatrix(weights); dbInstance.WeightsHash = GetSHA1Hash(dbInstance.Weights); dbInstance.Distances = SimpleSerializer.SerializeDoubleMatrix(distances); dbInstance.DistancesHash = GetSHA1Hash(dbInstance.Distances); dbInstance.ProblemSize = qap.Weights.Rows; context.QAPInstances.AddObject(dbInstance); if (qap.BestKnownQuality != null) { QAPSolution dbSolution = context.CreateObject(); if (qap.BestKnownSolution != null) { dbSolution.Assignment = SimpleSerializer.SerializeIntArray(qap.BestKnownSolution.ToArray()); dbSolution.AssignmentHash = GetSHA1Hash(dbSolution.Assignment); } dbSolution.Instance = dbInstance; dbSolution.Quality = qap.BestKnownQuality.Value; context.QAPSolutions.AddObject(dbSolution); } } context.SaveChanges(); } } public static string GetSHA1Hash(string text) { var SHA1 = new System.Security.Cryptography.SHA1CryptoServiceProvider(); byte[] arrayData; byte[] arrayResult; string result = null; string temp = null; arrayData = Encoding.ASCII.GetBytes(text); arrayResult = SHA1.ComputeHash(arrayData); for (int i = 0; i < arrayResult.Length; i++) { temp = Convert.ToString(arrayResult[i], 16); if (temp.Length == 1) temp = "0" + temp; result += temp; } return result; } } }