/// <summary>
		///   Gets a function that initializes the runtime model.
		/// </summary>
		private Func<RuntimeModel> CreateModel(Formula hazard)
		{
			var serializer = new RuntimeModelSerializer();
			serializer.Serialize(Model, !hazard);

			return () =>
			{
				var serializedData = serializer.LoadSerializedData();
				return new RuntimeModel(serializedData, _stateHeaderBytes);
			};
		}
Ejemplo n.º 2
0
        /// <summary>
        ///   Creates a <see cref="RuntimeModel" /> instance.
        /// </summary>
        private static Func <RuntimeModel> CreateRuntimeModel(RuntimeModelSerializer serializer, Fault[] faultTemplates)
        {
            return(() =>
            {
                var serializedData = serializer.LoadSerializedData();
                var faults = serializedData.ObjectTable.OfType <Fault>().Where(f => f.Identifier >= 0).OrderBy(f => f.Identifier).ToArray();
                Requires.That(faults.Length == faultTemplates.Length, "Unexpected fault count.");

                for (var i = 0; i < faults.Length; ++i)
                {
                    Requires.That(faults[i].Identifier == faultTemplates[i].Identifier, "Fault mismatch.");
                    faults[i].Activation = faultTemplates[i].Activation;
                }

                return new RuntimeModel(serializedData);
            });
        }
Ejemplo n.º 3
0
        /// <summary>
        ///   Loads a counter example from the <paramref name="file" />.
        /// </summary>
        /// <param name="file">The path to the file the counter example should be loaded from.</param>
        public static CounterExample Load(string file)
        {
            Requires.NotNullOrWhitespace(file, nameof(file));

            using (var reader = new BinaryReader(File.OpenRead(file), Encoding.UTF8))
            {
                if (reader.ReadInt32() != FileHeader)
                {
                    throw new InvalidOperationException("The file does not contain a counter example that is compatible with this version of S#.");
                }

                var endsWithException      = reader.ReadBoolean();
                var serializedRuntimeModel = reader.ReadBytes(reader.ReadInt32());
                var modelData = RuntimeModelSerializer.LoadSerializedData(serializedRuntimeModel);

                foreach (var fault in modelData.ObjectTable.OfType <Fault>())
                {
                    fault.Activation = (Activation)reader.ReadInt32();
                }

                var runtimeModel   = new RuntimeModel(modelData);
                var metadataStream = new MemoryStream(reader.ReadBytes(reader.ReadInt32()));
                var formatter      = new BinaryFormatter();
                var slotMetadata   = new StateVectorLayout((StateSlotMetadata[])formatter.Deserialize(metadataStream));
                var modelMetadata  = runtimeModel.StateVectorLayout;

                var counterExample = new byte[reader.ReadInt32()][];
                var slotCount      = reader.ReadInt32();

                if (slotCount != runtimeModel.StateVectorSize)
                {
                    throw new InvalidOperationException(
                              $"State slot count mismatch; the instantiated model requires {runtimeModel.StateVectorSize} state slots, " +
                              $"whereas the counter example uses {slotCount} state slots.");
                }

                if (slotMetadata.SlotCount != modelMetadata.SlotCount)
                {
                    throw new InvalidOperationException(
                              $"State slot metadata count mismatch; the instantiated model has {modelMetadata.SlotCount} state slot metadata entries, " +
                              $"whereas the counter example has {slotMetadata.SlotCount} state slot entries.");
                }

                for (var i = 0; i < slotMetadata.SlotCount; ++i)
                {
                    if (modelMetadata[i] != slotMetadata[i])
                    {
                        throw new StateVectorMismatchException(slotMetadata, modelMetadata);
                    }
                }

                for (var i = 0; i < counterExample.Length; ++i)
                {
                    counterExample[i] = new byte[runtimeModel.StateVectorSize];
                    for (var j = 0; j < runtimeModel.StateVectorSize; ++j)
                    {
                        counterExample[i][j] = reader.ReadByte();
                    }
                }

                var replayInfo = new int[reader.ReadInt32()][];
                for (var i = 0; i < replayInfo.Length; ++i)
                {
                    replayInfo[i] = new int[reader.ReadInt32()];
                    for (var j = 0; j < replayInfo[i].Length; ++j)
                    {
                        replayInfo[i][j] = reader.ReadInt32();
                    }
                }

                return(new CounterExample(runtimeModel, counterExample, replayInfo, endsWithException));
            }
        }