예제 #1
0
        public PerlinNoise(int seed, double frequency, InterpolationMethod interpol)
        {
            freq          = frequency;
            this.seed     = seed;
            interpolation = interpol;

            var intFreq = (int)freq;

            if (intFreq != freq)
            {
                intFreq++;
            }
            rndEngine = new TRandom(new Troschuetz.Random.Generators.StandardGenerator(seed));

            //generate row seed
            rowSeed = new uint[intFreq + 2];
            for (int i = 0; i < intFreq + 2; i++)
            {
                rowSeed[i] = rndEngine.NextUInt();
            }
        }
        private void Selection(double[][] Population, ref double[][] PopulationAfterSelection)
        {
            HashSet <int> numbers1 = new HashSet <int>();
            HashSet <int> numbers2 = new HashSet <int>();

            if (refill == true)
            {
                for (int j = Pop_Size / 4; j < Pop_Size; j++)
                {
                    PopulationFunctionValue[j] = new double[2];

                    PopulationFunctionValue[j][0] = Population[j][0];
                    PopulationFunctionValue[j][1] = Function2Value(Population[j]);
                }
            }
            else
            {
                Function2ValueCountForAllPopulation(Population, ref PopulationFunctionValue);
            }


            for (int i = 0; i < Pop_Size / 4; i++)
            {
                int trandom1 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                int trandom2 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));

                while (!numbers1.Contains(trandom1))
                {
                    trandom1 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                    numbers1.Add(trandom1);
                }

                while (!numbers2.Contains(trandom2))
                {
                    trandom2 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                    numbers2.Add(trandom2);
                }

                if (PopulationFunctionValue[trandom1][0] < PopulationFunctionValue[trandom2][0])
                {
                    PopulationAfterSelection[i][0] = Population[trandom1][0];
                    PopulationAfterSelection[i][1] = Population[trandom1][1];
                }
                else
                {
                    PopulationAfterSelection[i][0] = Population[trandom2][0];
                    PopulationAfterSelection[i][1] = Population[trandom2][1];
                }
            }
            for (int i = Pop_Size / 4; i < Pop_Size / 2; i++)
            {
                int trandom1 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                int trandom2 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));

                while (!numbers1.Contains(trandom1))
                {
                    trandom1 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                    numbers1.Add(trandom1);
                }


                while (!numbers2.Contains(trandom2))
                {
                    trandom2 = (int)(trandom.NextUInt(0, (uint)Pop_Size / 2));
                    numbers2.Add(trandom2);
                }


                if (PopulationFunctionValue[trandom1][1] < PopulationFunctionValue[trandom2][1])
                {
                    PopulationAfterSelection[i][0] = Population[trandom1][0];
                    PopulationAfterSelection[i][1] = Population[trandom1][1];
                }
                else
                {
                    PopulationAfterSelection[i][0] = Population[trandom2][0];
                    PopulationAfterSelection[i][1] = Population[trandom2][1];
                }
            }
        }
예제 #3
0
        private async Task <RequestEnvelope.Types.PlatformRequest> GenerateSignature(RequestEnvelope requestEnvelope, GeoCoordinate currentLocation)
        {
            byte[] ticketBytes = requestEnvelope.AuthTicket != null?requestEnvelope.AuthTicket.ToByteArray() : requestEnvelope.AuthInfo.ToByteArray();

            // Common device info
            var deviceInfo = new Signature.Types.DeviceInfo
            {
                DeviceId             = _settings.DeviceId,
                DeviceBrand          = _settings.DeviceBrand,
                DeviceModel          = _settings.DeviceModel,
                DeviceModelBoot      = _settings.DeviceModelBoot + "\0",
                HardwareManufacturer = _settings.HardwareManufacturer,
                HardwareModel        = _settings.HardwareModel + "\0",
                FirmwareBrand        = (_settings.DeviceModel == "iPhone" ? "iOS" : "iPhone OS"),
                FirmwareType         = _settings.FirmwareType
            };

            // Android
            if (_client.Platform == Platform.Android)
            {
                deviceInfo.AndroidBoardName      = _settings.AndroidBoardName;
                deviceInfo.AndroidBootloader     = _settings.AndroidBootloader;
                deviceInfo.DeviceModelIdentifier = _settings.DeviceModelIdentifier;
                deviceInfo.FirmwareTags          = _settings.FirmwareTags;
                deviceInfo.FirmwareFingerprint   = _settings.FirmwareFingerprint;
            }

            var sig = new Signature
            {
                SessionHash         = _sessionHash,
                Unknown25           = _client.Unknown25,
                Timestamp           = (ulong)Utils.GetTime(true),
                TimestampSinceStart = (ulong)(Utils.GetTime(true) - _client.StartTime),
                DeviceInfo          = deviceInfo
            };

            if (sig.TimestampSinceStart < 5000)
            {
                sig.TimestampSinceStart = (ulong)TRandomDevice.Next(5000, 8000);
            }

            var sen = new Signature.Types.SensorInfo()
            {
                LinearAccelerationX   = TRandomDevice.Triangular(-3, 1, 0),
                LinearAccelerationY   = TRandomDevice.Triangular(-2, 3, 0),
                LinearAccelerationZ   = TRandomDevice.Triangular(-4, 2, 0),
                MagneticFieldX        = TRandomDevice.Triangular(-50, 50, 0),
                MagneticFieldY        = TRandomDevice.Triangular(-60, 50, -5),
                MagneticFieldZ        = TRandomDevice.Triangular(-60, 40, -30),
                MagneticFieldAccuracy = TRandomDevice.Choice(new List <int>(new int[] { -1, 1, 1, 2, 2, 2, 2 })),
                AttitudePitch         = TRandomDevice.Triangular(-1.5, 1.5, 0.2),
                AttitudeYaw           = TRandomDevice.NextDouble(-3, 3),
                AttitudeRoll          = TRandomDevice.Triangular(-2.8, 2.5, 0.25),
                RotationRateX         = TRandomDevice.Triangular(-6, 4, 0),
                RotationRateY         = TRandomDevice.Triangular(-5.5, 5, 0),
                RotationRateZ         = TRandomDevice.Triangular(-5, 3, 0),
                GravityX = TRandomDevice.Triangular(-1, 1, 0.15),
                GravityY = TRandomDevice.Triangular(-1, 1, -.2),
                GravityZ = TRandomDevice.Triangular(-1, .7, -0.8),
                Status   = 3
            };

            sen.TimestampSnapshot = (ulong)TRandomDevice.NextUInt((uint)(sig.TimestampSinceStart - 5000), (uint)(sig.TimestampSinceStart - 100));
            sig.SensorInfo.Add(sen);

            var locationFix = new Signature.Types.LocationFix
            {
                Provider       = TRandomDevice.Choice(new List <string>(new string[] { "network", "network", "network", "network", "fused" })),
                Latitude       = (float)currentLocation.Latitude,
                Longitude      = (float)currentLocation.Longitude,
                Altitude       = (float)currentLocation.Altitude,
                ProviderStatus = 3,
                LocationType   = 1
            };

            locationFix.TimestampSnapshot = (ulong)TRandomDevice.NextUInt((uint)(sig.TimestampSinceStart - 5000), (uint)(sig.TimestampSinceStart - 1000));

            if (requestEnvelope.Accuracy >= 65)
            {
                locationFix.HorizontalAccuracy = TRandomDevice.Choice(new List <float>(new float[] { (float)requestEnvelope.Accuracy, 65, 65, TRandomDevice.Next(66, 80), 200 }));
                if (_client.Platform == Platform.Ios)
                {
                    locationFix.VerticalAccuracy = (float)TRandomDevice.Triangular(35, 100, 65);
                }
            }
            else
            {
                locationFix.HorizontalAccuracy = (float)requestEnvelope.Accuracy;
                if (_client.Platform == Platform.Ios)
                {
                    locationFix.VerticalAccuracy = requestEnvelope.Accuracy > 10 ? (float)TRandomDevice.Choice(new List <double>(new double[] {
                        24,
                        32,
                        48,
                        48,
                        64,
                        64,
                        96,
                        128
                    })) : (float)TRandomDevice.Choice(new List <double>(new double[] {
                        3,
                        4,
                        6,
                        6,
                        8,
                        12,
                        24
                    }));
                }
            }

            locationFix.HorizontalAccuracy = (float)Math.Round(locationFix.HorizontalAccuracy, GEOLOCATION_PRECISION);
            locationFix.VerticalAccuracy   = (float)Math.Round(locationFix.VerticalAccuracy, GEOLOCATION_PRECISION);

            if (_client.Platform == Platform.Ios)
            {
                sig.ActivityStatus = new Signature.Types.ActivityStatus()
                {
                    Stationary = true
                };
                sig.ActivityStatus.Tilting |= TRandomDevice.NextDouble() > 0.50;

                if (TRandomDevice.NextDouble() > 0.95)
                {
                    // No reading for roughly 1 in 20 updates
                    locationFix.Course = -1;
                    locationFix.Speed  = -1;
                }
                else
                {
                    // Course is iOS only.
                    locationFix.Course = GetCourse();

                    // Speed is iOS only.
                    locationFix.Speed = (float)TRandomDevice.Triangular(0.2, 4.25, 1);
                }
            }

            sig.LocationFix.Add(locationFix);

            string envelopString = JsonConvert.SerializeObject(requestEnvelope);

            var hashRequest = new HashRequestContent()
            {
                Latitude64  = BitConverter.DoubleToInt64Bits(currentLocation.Latitude),
                Longitude64 = BitConverter.DoubleToInt64Bits(currentLocation.Longitude),
                Accuracy64  = BitConverter.DoubleToInt64Bits(requestEnvelope.Accuracy),
                AuthTicket  = ticketBytes,
                SessionData = _sessionHash.ToByteArray(),
                Requests    = new List <byte[]>(),
                Timestamp   = sig.Timestamp
            };


            foreach (var request in requestEnvelope.Requests)
            {
                hashRequest.Requests.Add(request.ToByteArray());
            }

            var res = await _client.Hasher.RequestHashesAsync(hashRequest).ConfigureAwait(false);

            foreach (var item in res.RequestHashes)
            {
                sig.RequestHash.Add(((ulong)item));
            }
            sig.LocationHash1 = (int)res.LocationAuthHash;
            sig.LocationHash2 = (int)res.LocationHash;

            var encryptedSignature = new RequestEnvelope.Types.PlatformRequest
            {
                Type           = PlatformRequestType.SendEncryptedSignature,
                RequestMessage = new SendEncryptedSignatureRequest
                {
                    EncryptedSignature = ByteString.CopyFrom(_client.Cryptor.Encrypt(sig.ToByteArray(), (uint)_client.StartTime))
                }.ToByteString()
            };

            return(encryptedSignature);
        }