// create miner creates new miners based on device type and algorithm/miner path
        public static Miner CreateMiner(ComputeDevice device, Algorithm algorithm)
        {
            var minerPath = MinerPaths.GetOptimizedMinerPath(device, algorithm);

            if (minerPath != MinerPaths.NONE)
            {
                return(CreateMiner(device.DeviceType, minerPath));
            }
            return(null);
        }
        // this will not check Ethminer path
        private static bool IsSameBinPath(ComputeDevice a, ComputeDevice b)
        {
            // same group uses same Miner class and therefore same binary path for same algorithm
            bool sameGroup = a.DeviceGroupType == b.DeviceGroupType;

            if (!sameGroup)
            {
                var a_algoType = a.MostProfitableAlgorithm.NiceHashID;
                var b_algoType = b.MostProfitableAlgorithm.NiceHashID;
                // a and b algorithm settings should be the same if we call this function
                return(MinerPaths.GetOptimizedMinerPath(a_algoType, a.DeviceType, a.DeviceGroupType, a.Codename, a.IsOptimizedVersion)
                       == MinerPaths.GetOptimizedMinerPath(b_algoType, b.DeviceType, b.DeviceGroupType, b.Codename, b.IsOptimizedVersion));
            }

            return(true);
        }