Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/numpy/distutils/cpuinfo.py
7757 views
#!/usr/bin/env python31"""2cpuinfo34Copyright 2002 Pearu Peterson all rights reserved,5Pearu Peterson <[email protected]>6Permission to use, modify, and distribute this software is given under the7terms of the NumPy (BSD style) license. See LICENSE.txt that came with8this distribution for specifics.910NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.11Pearu Peterson1213"""14__all__ = ['cpu']1516import os17import platform18import re19import sys20import types21import warnings2223from subprocess import getstatusoutput242526def getoutput(cmd, successful_status=(0,), stacklevel=1):27try:28status, output = getstatusoutput(cmd)29except OSError as e:30warnings.warn(str(e), UserWarning, stacklevel=stacklevel)31return False, ""32if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:33return True, output34return False, output3536def command_info(successful_status=(0,), stacklevel=1, **kw):37info = {}38for key in kw:39ok, output = getoutput(kw[key], successful_status=successful_status,40stacklevel=stacklevel+1)41if ok:42info[key] = output.strip()43return info4445def command_by_line(cmd, successful_status=(0,), stacklevel=1):46ok, output = getoutput(cmd, successful_status=successful_status,47stacklevel=stacklevel+1)48if not ok:49return50for line in output.splitlines():51yield line.strip()5253def key_value_from_command(cmd, sep, successful_status=(0,),54stacklevel=1):55d = {}56for line in command_by_line(cmd, successful_status=successful_status,57stacklevel=stacklevel+1):58l = [s.strip() for s in line.split(sep, 1)]59if len(l) == 2:60d[l[0]] = l[1]61return d6263class CPUInfoBase:64"""Holds CPU information and provides methods for requiring65the availability of various CPU features.66"""6768def _try_call(self, func):69try:70return func()71except Exception:72pass7374def __getattr__(self, name):75if not name.startswith('_'):76if hasattr(self, '_'+name):77attr = getattr(self, '_'+name)78if isinstance(attr, types.MethodType):79return lambda func=self._try_call,attr=attr : func(attr)80else:81return lambda : None82raise AttributeError(name)8384def _getNCPUs(self):85return 18687def __get_nbits(self):88abits = platform.architecture()[0]89nbits = re.compile(r'(\d+)bit').search(abits).group(1)90return nbits9192def _is_32bit(self):93return self.__get_nbits() == '32'9495def _is_64bit(self):96return self.__get_nbits() == '64'9798class LinuxCPUInfo(CPUInfoBase):99100info = None101102def __init__(self):103if self.info is not None:104return105info = [ {} ]106ok, output = getoutput('uname -m')107if ok:108info[0]['uname_m'] = output.strip()109try:110fo = open('/proc/cpuinfo')111except OSError as e:112warnings.warn(str(e), UserWarning, stacklevel=2)113else:114for line in fo:115name_value = [s.strip() for s in line.split(':', 1)]116if len(name_value) != 2:117continue118name, value = name_value119if not info or name in info[-1]: # next processor120info.append({})121info[-1][name] = value122fo.close()123self.__class__.info = info124125def _not_impl(self): pass126127# Athlon128129def _is_AMD(self):130return self.info[0]['vendor_id']=='AuthenticAMD'131132def _is_AthlonK6_2(self):133return self._is_AMD() and self.info[0]['model'] == '2'134135def _is_AthlonK6_3(self):136return self._is_AMD() and self.info[0]['model'] == '3'137138def _is_AthlonK6(self):139return re.match(r'.*?AMD-K6', self.info[0]['model name']) is not None140141def _is_AthlonK7(self):142return re.match(r'.*?AMD-K7', self.info[0]['model name']) is not None143144def _is_AthlonMP(self):145return re.match(r'.*?Athlon\(tm\) MP\b',146self.info[0]['model name']) is not None147148def _is_AMD64(self):149return self.is_AMD() and self.info[0]['family'] == '15'150151def _is_Athlon64(self):152return re.match(r'.*?Athlon\(tm\) 64\b',153self.info[0]['model name']) is not None154155def _is_AthlonHX(self):156return re.match(r'.*?Athlon HX\b',157self.info[0]['model name']) is not None158159def _is_Opteron(self):160return re.match(r'.*?Opteron\b',161self.info[0]['model name']) is not None162163def _is_Hammer(self):164return re.match(r'.*?Hammer\b',165self.info[0]['model name']) is not None166167# Alpha168169def _is_Alpha(self):170return self.info[0]['cpu']=='Alpha'171172def _is_EV4(self):173return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4'174175def _is_EV5(self):176return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5'177178def _is_EV56(self):179return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56'180181def _is_PCA56(self):182return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56'183184# Intel185186#XXX187_is_i386 = _not_impl188189def _is_Intel(self):190return self.info[0]['vendor_id']=='GenuineIntel'191192def _is_i486(self):193return self.info[0]['cpu']=='i486'194195def _is_i586(self):196return self.is_Intel() and self.info[0]['cpu family'] == '5'197198def _is_i686(self):199return self.is_Intel() and self.info[0]['cpu family'] == '6'200201def _is_Celeron(self):202return re.match(r'.*?Celeron',203self.info[0]['model name']) is not None204205def _is_Pentium(self):206return re.match(r'.*?Pentium',207self.info[0]['model name']) is not None208209def _is_PentiumII(self):210return re.match(r'.*?Pentium.*?II\b',211self.info[0]['model name']) is not None212213def _is_PentiumPro(self):214return re.match(r'.*?PentiumPro\b',215self.info[0]['model name']) is not None216217def _is_PentiumMMX(self):218return re.match(r'.*?Pentium.*?MMX\b',219self.info[0]['model name']) is not None220221def _is_PentiumIII(self):222return re.match(r'.*?Pentium.*?III\b',223self.info[0]['model name']) is not None224225def _is_PentiumIV(self):226return re.match(r'.*?Pentium.*?(IV|4)\b',227self.info[0]['model name']) is not None228229def _is_PentiumM(self):230return re.match(r'.*?Pentium.*?M\b',231self.info[0]['model name']) is not None232233def _is_Prescott(self):234return self.is_PentiumIV() and self.has_sse3()235236def _is_Nocona(self):237return (self.is_Intel()238and (self.info[0]['cpu family'] == '6'239or self.info[0]['cpu family'] == '15')240and (self.has_sse3() and not self.has_ssse3())241and re.match(r'.*?\blm\b', self.info[0]['flags']) is not None)242243def _is_Core2(self):244return (self.is_64bit() and self.is_Intel() and245re.match(r'.*?Core\(TM\)2\b',246self.info[0]['model name']) is not None)247248def _is_Itanium(self):249return re.match(r'.*?Itanium\b',250self.info[0]['family']) is not None251252def _is_XEON(self):253return re.match(r'.*?XEON\b',254self.info[0]['model name'], re.IGNORECASE) is not None255256_is_Xeon = _is_XEON257258# Varia259260def _is_singleCPU(self):261return len(self.info) == 1262263def _getNCPUs(self):264return len(self.info)265266def _has_fdiv_bug(self):267return self.info[0]['fdiv_bug']=='yes'268269def _has_f00f_bug(self):270return self.info[0]['f00f_bug']=='yes'271272def _has_mmx(self):273return re.match(r'.*?\bmmx\b', self.info[0]['flags']) is not None274275def _has_sse(self):276return re.match(r'.*?\bsse\b', self.info[0]['flags']) is not None277278def _has_sse2(self):279return re.match(r'.*?\bsse2\b', self.info[0]['flags']) is not None280281def _has_sse3(self):282return re.match(r'.*?\bpni\b', self.info[0]['flags']) is not None283284def _has_ssse3(self):285return re.match(r'.*?\bssse3\b', self.info[0]['flags']) is not None286287def _has_3dnow(self):288return re.match(r'.*?\b3dnow\b', self.info[0]['flags']) is not None289290def _has_3dnowext(self):291return re.match(r'.*?\b3dnowext\b', self.info[0]['flags']) is not None292293class IRIXCPUInfo(CPUInfoBase):294info = None295296def __init__(self):297if self.info is not None:298return299info = key_value_from_command('sysconf', sep=' ',300successful_status=(0, 1))301self.__class__.info = info302303def _not_impl(self): pass304305def _is_singleCPU(self):306return self.info.get('NUM_PROCESSORS') == '1'307308def _getNCPUs(self):309return int(self.info.get('NUM_PROCESSORS', 1))310311def __cputype(self, n):312return self.info.get('PROCESSORS').split()[0].lower() == 'r%s' % (n)313def _is_r2000(self): return self.__cputype(2000)314def _is_r3000(self): return self.__cputype(3000)315def _is_r3900(self): return self.__cputype(3900)316def _is_r4000(self): return self.__cputype(4000)317def _is_r4100(self): return self.__cputype(4100)318def _is_r4300(self): return self.__cputype(4300)319def _is_r4400(self): return self.__cputype(4400)320def _is_r4600(self): return self.__cputype(4600)321def _is_r4650(self): return self.__cputype(4650)322def _is_r5000(self): return self.__cputype(5000)323def _is_r6000(self): return self.__cputype(6000)324def _is_r8000(self): return self.__cputype(8000)325def _is_r10000(self): return self.__cputype(10000)326def _is_r12000(self): return self.__cputype(12000)327def _is_rorion(self): return self.__cputype('orion')328329def get_ip(self):330try: return self.info.get('MACHINE')331except Exception: pass332def __machine(self, n):333return self.info.get('MACHINE').lower() == 'ip%s' % (n)334def _is_IP19(self): return self.__machine(19)335def _is_IP20(self): return self.__machine(20)336def _is_IP21(self): return self.__machine(21)337def _is_IP22(self): return self.__machine(22)338def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000()339def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000()340def _is_IP24(self): return self.__machine(24)341def _is_IP25(self): return self.__machine(25)342def _is_IP26(self): return self.__machine(26)343def _is_IP27(self): return self.__machine(27)344def _is_IP28(self): return self.__machine(28)345def _is_IP30(self): return self.__machine(30)346def _is_IP32(self): return self.__machine(32)347def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000()348def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000()349350351class DarwinCPUInfo(CPUInfoBase):352info = None353354def __init__(self):355if self.info is not None:356return357info = command_info(arch='arch',358machine='machine')359info['sysctl_hw'] = key_value_from_command('sysctl hw', sep='=')360self.__class__.info = info361362def _not_impl(self): pass363364def _getNCPUs(self):365return int(self.info['sysctl_hw'].get('hw.ncpu', 1))366367def _is_Power_Macintosh(self):368return self.info['sysctl_hw']['hw.machine']=='Power Macintosh'369370def _is_i386(self):371return self.info['arch']=='i386'372def _is_ppc(self):373return self.info['arch']=='ppc'374375def __machine(self, n):376return self.info['machine'] == 'ppc%s'%n377def _is_ppc601(self): return self.__machine(601)378def _is_ppc602(self): return self.__machine(602)379def _is_ppc603(self): return self.__machine(603)380def _is_ppc603e(self): return self.__machine('603e')381def _is_ppc604(self): return self.__machine(604)382def _is_ppc604e(self): return self.__machine('604e')383def _is_ppc620(self): return self.__machine(620)384def _is_ppc630(self): return self.__machine(630)385def _is_ppc740(self): return self.__machine(740)386def _is_ppc7400(self): return self.__machine(7400)387def _is_ppc7450(self): return self.__machine(7450)388def _is_ppc750(self): return self.__machine(750)389def _is_ppc403(self): return self.__machine(403)390def _is_ppc505(self): return self.__machine(505)391def _is_ppc801(self): return self.__machine(801)392def _is_ppc821(self): return self.__machine(821)393def _is_ppc823(self): return self.__machine(823)394def _is_ppc860(self): return self.__machine(860)395396397class SunOSCPUInfo(CPUInfoBase):398399info = None400401def __init__(self):402if self.info is not None:403return404info = command_info(arch='arch',405mach='mach',406uname_i='uname_i',407isainfo_b='isainfo -b',408isainfo_n='isainfo -n',409)410info['uname_X'] = key_value_from_command('uname -X', sep='=')411for line in command_by_line('psrinfo -v 0'):412m = re.match(r'\s*The (?P<p>[\w\d]+) processor operates at', line)413if m:414info['processor'] = m.group('p')415break416self.__class__.info = info417418def _not_impl(self): pass419420def _is_i386(self):421return self.info['isainfo_n']=='i386'422def _is_sparc(self):423return self.info['isainfo_n']=='sparc'424def _is_sparcv9(self):425return self.info['isainfo_n']=='sparcv9'426427def _getNCPUs(self):428return int(self.info['uname_X'].get('NumCPU', 1))429430def _is_sun4(self):431return self.info['arch']=='sun4'432433def _is_SUNW(self):434return re.match(r'SUNW', self.info['uname_i']) is not None435def _is_sparcstation5(self):436return re.match(r'.*SPARCstation-5', self.info['uname_i']) is not None437def _is_ultra1(self):438return re.match(r'.*Ultra-1', self.info['uname_i']) is not None439def _is_ultra250(self):440return re.match(r'.*Ultra-250', self.info['uname_i']) is not None441def _is_ultra2(self):442return re.match(r'.*Ultra-2', self.info['uname_i']) is not None443def _is_ultra30(self):444return re.match(r'.*Ultra-30', self.info['uname_i']) is not None445def _is_ultra4(self):446return re.match(r'.*Ultra-4', self.info['uname_i']) is not None447def _is_ultra5_10(self):448return re.match(r'.*Ultra-5_10', self.info['uname_i']) is not None449def _is_ultra5(self):450return re.match(r'.*Ultra-5', self.info['uname_i']) is not None451def _is_ultra60(self):452return re.match(r'.*Ultra-60', self.info['uname_i']) is not None453def _is_ultra80(self):454return re.match(r'.*Ultra-80', self.info['uname_i']) is not None455def _is_ultraenterprice(self):456return re.match(r'.*Ultra-Enterprise', self.info['uname_i']) is not None457def _is_ultraenterprice10k(self):458return re.match(r'.*Ultra-Enterprise-10000', self.info['uname_i']) is not None459def _is_sunfire(self):460return re.match(r'.*Sun-Fire', self.info['uname_i']) is not None461def _is_ultra(self):462return re.match(r'.*Ultra', self.info['uname_i']) is not None463464def _is_cpusparcv7(self):465return self.info['processor']=='sparcv7'466def _is_cpusparcv8(self):467return self.info['processor']=='sparcv8'468def _is_cpusparcv9(self):469return self.info['processor']=='sparcv9'470471class Win32CPUInfo(CPUInfoBase):472473info = None474pkey = r"HARDWARE\DESCRIPTION\System\CentralProcessor"475# XXX: what does the value of476# HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0477# mean?478479def __init__(self):480if self.info is not None:481return482info = []483try:484#XXX: Bad style to use so long `try:...except:...`. Fix it!485import winreg486487prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)"488r"\s+stepping\s+(?P<STP>\d+)", re.IGNORECASE)489chnd=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.pkey)490pnum=0491while True:492try:493proc=winreg.EnumKey(chnd, pnum)494except winreg.error:495break496else:497pnum+=1498info.append({"Processor":proc})499phnd=winreg.OpenKey(chnd, proc)500pidx=0501while True:502try:503name, value, vtpe=winreg.EnumValue(phnd, pidx)504except winreg.error:505break506else:507pidx=pidx+1508info[-1][name]=value509if name=="Identifier":510srch=prgx.search(value)511if srch:512info[-1]["Family"]=int(srch.group("FML"))513info[-1]["Model"]=int(srch.group("MDL"))514info[-1]["Stepping"]=int(srch.group("STP"))515except Exception as e:516print(e, '(ignoring)')517self.__class__.info = info518519def _not_impl(self): pass520521# Athlon522523def _is_AMD(self):524return self.info[0]['VendorIdentifier']=='AuthenticAMD'525526def _is_Am486(self):527return self.is_AMD() and self.info[0]['Family']==4528529def _is_Am5x86(self):530return self.is_AMD() and self.info[0]['Family']==4531532def _is_AMDK5(self):533return self.is_AMD() and self.info[0]['Family']==5 \534and self.info[0]['Model'] in [0, 1, 2, 3]535536def _is_AMDK6(self):537return self.is_AMD() and self.info[0]['Family']==5 \538and self.info[0]['Model'] in [6, 7]539540def _is_AMDK6_2(self):541return self.is_AMD() and self.info[0]['Family']==5 \542and self.info[0]['Model']==8543544def _is_AMDK6_3(self):545return self.is_AMD() and self.info[0]['Family']==5 \546and self.info[0]['Model']==9547548def _is_AMDK7(self):549return self.is_AMD() and self.info[0]['Family'] == 6550551# To reliably distinguish between the different types of AMD64 chips552# (Athlon64, Operton, Athlon64 X2, Semperon, Turion 64, etc.) would553# require looking at the 'brand' from cpuid554555def _is_AMD64(self):556return self.is_AMD() and self.info[0]['Family'] == 15557558# Intel559560def _is_Intel(self):561return self.info[0]['VendorIdentifier']=='GenuineIntel'562563def _is_i386(self):564return self.info[0]['Family']==3565566def _is_i486(self):567return self.info[0]['Family']==4568569def _is_i586(self):570return self.is_Intel() and self.info[0]['Family']==5571572def _is_i686(self):573return self.is_Intel() and self.info[0]['Family']==6574575def _is_Pentium(self):576return self.is_Intel() and self.info[0]['Family']==5577578def _is_PentiumMMX(self):579return self.is_Intel() and self.info[0]['Family']==5 \580and self.info[0]['Model']==4581582def _is_PentiumPro(self):583return self.is_Intel() and self.info[0]['Family']==6 \584and self.info[0]['Model']==1585586def _is_PentiumII(self):587return self.is_Intel() and self.info[0]['Family']==6 \588and self.info[0]['Model'] in [3, 5, 6]589590def _is_PentiumIII(self):591return self.is_Intel() and self.info[0]['Family']==6 \592and self.info[0]['Model'] in [7, 8, 9, 10, 11]593594def _is_PentiumIV(self):595return self.is_Intel() and self.info[0]['Family']==15596597def _is_PentiumM(self):598return self.is_Intel() and self.info[0]['Family'] == 6 \599and self.info[0]['Model'] in [9, 13, 14]600601def _is_Core2(self):602return self.is_Intel() and self.info[0]['Family'] == 6 \603and self.info[0]['Model'] in [15, 16, 17]604605# Varia606607def _is_singleCPU(self):608return len(self.info) == 1609610def _getNCPUs(self):611return len(self.info)612613def _has_mmx(self):614if self.is_Intel():615return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \616or (self.info[0]['Family'] in [6, 15])617elif self.is_AMD():618return self.info[0]['Family'] in [5, 6, 15]619else:620return False621622def _has_sse(self):623if self.is_Intel():624return ((self.info[0]['Family']==6 and625self.info[0]['Model'] in [7, 8, 9, 10, 11])626or self.info[0]['Family']==15)627elif self.is_AMD():628return ((self.info[0]['Family']==6 and629self.info[0]['Model'] in [6, 7, 8, 10])630or self.info[0]['Family']==15)631else:632return False633634def _has_sse2(self):635if self.is_Intel():636return self.is_Pentium4() or self.is_PentiumM() \637or self.is_Core2()638elif self.is_AMD():639return self.is_AMD64()640else:641return False642643def _has_3dnow(self):644return self.is_AMD() and self.info[0]['Family'] in [5, 6, 15]645646def _has_3dnowext(self):647return self.is_AMD() and self.info[0]['Family'] in [6, 15]648649if sys.platform.startswith('linux'): # variations: linux2,linux-i386 (any others?)650cpuinfo = LinuxCPUInfo651elif sys.platform.startswith('irix'):652cpuinfo = IRIXCPUInfo653elif sys.platform == 'darwin':654cpuinfo = DarwinCPUInfo655elif sys.platform.startswith('sunos'):656cpuinfo = SunOSCPUInfo657elif sys.platform.startswith('win32'):658cpuinfo = Win32CPUInfo659elif sys.platform.startswith('cygwin'):660cpuinfo = LinuxCPUInfo661#XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices.662else:663cpuinfo = CPUInfoBase664665cpu = cpuinfo()666667#if __name__ == "__main__":668#669# cpu.is_blaa()670# cpu.is_Intel()671# cpu.is_Alpha()672#673# print('CPU information:'),674# for name in dir(cpuinfo):675# if name[0]=='_' and name[1]!='_':676# r = getattr(cpu,name[1:])()677# if r:678# if r!=1:679# print('%s=%s' %(name[1:],r))680# else:681# print(name[1:]),682# print()683684685