From 782b22548c06e143767f72b938a4be20e7e5d771 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Tue, 25 Dec 2012 19:42:36 +0400 Subject: [PATCH 01/12] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B8=D1=82.=20=D0=9F=D1=80=D0=B8=D0=B2?= =?UTF-8?q?=D1=8F=D0=B7=D0=BA=D0=B0=20=D1=81=D0=BB=D0=B0=D0=B9=D0=B4=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=20=D0=BA=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=D0=BC.=20=D0=9A=D0=BB=D0=B0=D1=81=D1=81=20Ce?= =?UTF-8?q?ll=20=D0=B8=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 316 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 17517 bytes .../n.xcuserdatad/xcschemes/iDNA.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + iDNA/iDNA/AppDelegate.h | 23 + iDNA/iDNA/AppDelegate.m | 47 + iDNA/iDNA/Cell.h | 20 + iDNA/iDNA/Cell.m | 141 + iDNA/iDNA/NSMutableArray+Shuffle.h | 13 + iDNA/iDNA/NSMutableArray+Shuffle.m | 22 + iDNA/iDNA/en.lproj/Credits.rtf | 29 + iDNA/iDNA/en.lproj/InfoPlist.strings | 2 + iDNA/iDNA/en.lproj/MainMenu.xib | 5274 +++++++++++++++++ iDNA/iDNA/iDNA-Info.plist | 34 + iDNA/iDNA/iDNA-Prefix.pch | 7 + iDNA/iDNA/main.m | 14 + 17 files changed, 6057 insertions(+) create mode 100644 iDNA/iDNA.xcodeproj/project.pbxproj create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iDNA/iDNA/AppDelegate.h create mode 100644 iDNA/iDNA/AppDelegate.m create mode 100644 iDNA/iDNA/Cell.h create mode 100644 iDNA/iDNA/Cell.m create mode 100644 iDNA/iDNA/NSMutableArray+Shuffle.h create mode 100644 iDNA/iDNA/NSMutableArray+Shuffle.m create mode 100644 iDNA/iDNA/en.lproj/Credits.rtf create mode 100644 iDNA/iDNA/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/en.lproj/MainMenu.xib create mode 100644 iDNA/iDNA/iDNA-Info.plist create mode 100644 iDNA/iDNA/iDNA-Prefix.pch create mode 100644 iDNA/iDNA/main.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..164bb64 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -0,0 +1,316 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0D6AEA1D1689DF2600034395 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D6AEA1C1689DF2600034395 /* Cocoa.framework */; }; + 0D6AEA271689DF2600034395 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA251689DF2600034395 /* InfoPlist.strings */; }; + 0D6AEA291689DF2600034395 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA281689DF2600034395 /* main.m */; }; + 0D6AEA2D1689DF2600034395 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA2B1689DF2600034395 /* Credits.rtf */; }; + 0D6AEA301689DF2600034395 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA2F1689DF2600034395 /* AppDelegate.m */; }; + 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA311689DF2600034395 /* MainMenu.xib */; }; + 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; + 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0D6AEA181689DF2600034395 /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D6AEA1C1689DF2600034395 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 0D6AEA1F1689DF2600034395 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 0D6AEA201689DF2600034395 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 0D6AEA211689DF2600034395 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0D6AEA241689DF2600034395 /* iDNA-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNA-Info.plist"; sourceTree = ""; }; + 0D6AEA261689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 0D6AEA281689DF2600034395 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 0D6AEA2A1689DF2600034395 /* iDNA-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + 0D6AEA2C1689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 0D6AEA2E1689DF2600034395 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 0D6AEA2F1689DF2600034395 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 0D6AEA321689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 0D6AEA411689FE7300034395 /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cell.h; sourceTree = ""; }; + 0D6AEA421689FE7300034395 /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; + 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+Shuffle.h"; sourceTree = ""; }; + 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+Shuffle.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0D6AEA151689DF2600034395 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA1D1689DF2600034395 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0D6AEA0D1689DF2600034395 = { + isa = PBXGroup; + children = ( + 0D6AEA221689DF2600034395 /* iDNA */, + 0D6AEA1B1689DF2600034395 /* Frameworks */, + 0D6AEA191689DF2600034395 /* Products */, + ); + sourceTree = ""; + }; + 0D6AEA191689DF2600034395 /* Products */ = { + isa = PBXGroup; + children = ( + 0D6AEA181689DF2600034395 /* iDNA.app */, + ); + name = Products; + sourceTree = ""; + }; + 0D6AEA1B1689DF2600034395 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0D6AEA1C1689DF2600034395 /* Cocoa.framework */, + 0D6AEA1E1689DF2600034395 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 0D6AEA1E1689DF2600034395 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 0D6AEA1F1689DF2600034395 /* AppKit.framework */, + 0D6AEA201689DF2600034395 /* CoreData.framework */, + 0D6AEA211689DF2600034395 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 0D6AEA221689DF2600034395 /* iDNA */ = { + isa = PBXGroup; + children = ( + 0D6AEA411689FE7300034395 /* Cell.h */, + 0D6AEA421689FE7300034395 /* Cell.m */, + 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */, + 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */, + 0D6AEA2E1689DF2600034395 /* AppDelegate.h */, + 0D6AEA2F1689DF2600034395 /* AppDelegate.m */, + 0D6AEA311689DF2600034395 /* MainMenu.xib */, + 0D6AEA231689DF2600034395 /* Supporting Files */, + ); + path = iDNA; + sourceTree = ""; + }; + 0D6AEA231689DF2600034395 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 0D6AEA241689DF2600034395 /* iDNA-Info.plist */, + 0D6AEA251689DF2600034395 /* InfoPlist.strings */, + 0D6AEA281689DF2600034395 /* main.m */, + 0D6AEA2A1689DF2600034395 /* iDNA-Prefix.pch */, + 0D6AEA2B1689DF2600034395 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0D6AEA171689DF2600034395 /* iDNA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D6AEA361689DF2600034395 /* Build configuration list for PBXNativeTarget "iDNA" */; + buildPhases = ( + 0D6AEA141689DF2600034395 /* Sources */, + 0D6AEA151689DF2600034395 /* Frameworks */, + 0D6AEA161689DF2600034395 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iDNA; + productName = iDNA; + productReference = 0D6AEA181689DF2600034395 /* iDNA.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0D6AEA0F1689DF2600034395 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = witzawitz; + }; + buildConfigurationList = 0D6AEA121689DF2600034395 /* Build configuration list for PBXProject "iDNA" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0D6AEA0D1689DF2600034395; + productRefGroup = 0D6AEA191689DF2600034395 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0D6AEA171689DF2600034395 /* iDNA */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0D6AEA161689DF2600034395 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA271689DF2600034395 /* InfoPlist.strings in Resources */, + 0D6AEA2D1689DF2600034395 /* Credits.rtf in Resources */, + 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0D6AEA141689DF2600034395 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA291689DF2600034395 /* main.m in Sources */, + 0D6AEA301689DF2600034395 /* AppDelegate.m in Sources */, + 0D6AEA431689FE7400034395 /* Cell.m in Sources */, + 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0D6AEA251689DF2600034395 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA261689DF2600034395 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 0D6AEA2B1689DF2600034395 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA2C1689DF2600034395 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 0D6AEA311689DF2600034395 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA321689DF2600034395 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0D6AEA341689DF2600034395 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 0D6AEA351689DF2600034395 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + SDKROOT = macosx; + }; + name = Release; + }; + 0D6AEA371689DF2600034395 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 0D6AEA381689DF2600034395 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0D6AEA121689DF2600034395 /* Build configuration list for PBXProject "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D6AEA341689DF2600034395 /* Debug */, + 0D6AEA351689DF2600034395 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0D6AEA361689DF2600034395 /* Build configuration list for PBXNativeTarget "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D6AEA371689DF2600034395 /* Debug */, + 0D6AEA381689DF2600034395 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0D6AEA0F1689DF2600034395 /* Project object */; +} diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2d38afe --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d994352237e01cf8c9c5c31e1079d68209561984 GIT binary patch literal 17517 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

9IsImRvlU0lju#S1;(QsH-e?aW$+;R4@%h9me zHSQ)yx8C8?TZ@L;3*}!1%;nW^FM=Wo73ATy>{{OcT*qF|Vfb%dFT0L~Xn8${Z-z-i z4950H$ZH3pAl4rt|IK#*{lxT#$2SCt`OCxOfmlq&-o^Gp_Qq~uA>Fu)A)y$Joc2boNR1DGuMp;Z1OE9Nx^~J2|`sDhC|y z7Jud1+uz9t*SgtI4(6K-z1a|~J6qw>#FJeGeHGAv+~$Sb&Blq~PW_P*BKU@zy1#gHw z2XBWRreCIy(ifmYn#gFGY*{9$QtC!&Ist?(Z*zeg3>_zrx_SY~JMujn9 zVPWF1gs`MAUD%K?Ls)89dRS(dDa;&J5jHK%8MZNOXV~juUxxiC5{be^5>dP;Rg^9= zin2u6BCBYmXo9FpG(|L3G)>ejnk#A(xkU>^U7|&z#iDCOw~IE5wu$Z$JuccOIwE>S zbV77e^oHnN(fgtgMPG`}iz#uqI7XZy&K3_Bj}VU(j}ljk$BHM5Ys9tUI`Ja$TJgQ& zC&W*QkBX0rUlYGBepCFm_+9b);t$0iiN6T}m3B*) zNS8^8bfxra>8;YO((Te+(%sT~r1wc5mhP7xkUlScQF>VVvh=w01L-O0C(_TPUrN7{ zUX=bM6U!vB2w9XYMiwUmFWCdg*UX36Hr8e~pc zi_9nMk}Z@il3guZBfCzvR<>StlWdc0v#d|HO}0a}OZJHD-?ArVPs^T>9hAKwJ0v?U z`#^R|_L=Mp*=gB1**CIpWxqs7B4iQK5wQ`92u(y{gf_w&F*IUL#LW@6MC^*#9kD0k z-iZ4n9*lT6VsFHw5syc_9Pw(zv4|59CnMg7cq`)Fhz}x8MVyHYi%g0%MdnA2i*!e> zjJzdsN96v-MzusOjanadXVm>s zN1|SdIvRC6>b0oX<>B%ed7L~!o+Q`FhscfcJb8h3uVm^Wg6jg`hm#L8o1VimEf*ehel#ZHKw z6k8oz8(SAUD|TLNYpgf6Gj?HYcPxor5xXjOb?gJNhhk5~o{l{edoK2y*x%xCoIEZj zE-p?P7aymION`UTnd7qKta0|Zytsn6qPSskqvIOm+;J=8?uvUd?!~yb6ZdW0 z_i-2EE-GjRtB@%o6>>$4B0-U)&?zz$Mn#q)Pf?&KQjAcHRg70mR7_ILR?Jbj6!R5r z3b$f`VzFYWVwr*{Rw(XJ98ernTvXCZnNp#&D5ol$lpV@N%Eij1%4Nzm%5};O%G;DZ z%0A_GKf$~4f^D3mGR3cTlN~)5pVpMS|t;(b_t8!KO zszTLJRf(!hHBvQ7Ri&D&nxdMjYEm_;I#ml*-Kr(3t5nNXoNA?NgX(70Evnm8n^c=s zcdE9i9#-vDJ*s+K^`z=))eEXas^hBHRIjVvRK2bGSoNvubJf?X^Q!OSsdy$nJYE_f z5g!vD7q5)ZjxUezieD0cP5gE7>*CkPZ-~D+{;v1~@kis2$G;Z;di=-npT?h!|2qDB z{CDv`sF9jdGwLw4SRJj_s152YwMA`J+tp*#Q`OVdbJPv$CUvvAP3=}MPci@9HQ^emCPEXXiPpqw z5;a;)swQ2NsWEACHTjxC%}C7zO_gS{W`<^#re4#eY11s$EY&R25Y4rk>oq?nge8a* zq7z~h6bY&XbwYANN^J zNWv=#M-z@GoJnL7^@--h?8KZzYvPE+;>41~(!{Zeb&1mxorx`puEhC?ZHey0#feK3 zmnD+K6^W}7*C*bdxIgioBsxi!l#rB>WK1$AWhdE^a+3;^N|VMWjZd1KRFhPjG%cw) zX>O7$X#&a2vAS4YqApWs(&gxEx?Ek6ZkTR_Zj7#4H%Hf?Yt%LA z7U;aXF5M#C65TT08r`+J8+146Zr1ha`gA*WckBM8yI=Q^Zm;ec-67rUx;J(2=|0e% z(tW1;Qg=r8n_jF}=v8`)-m1^l7wCuTuh19k%k&lcO8q$fM18Ybvya z`lb5idQQJmze&GWe^mdu{<|R=Lxv8SKBRNV`XSqgJUHaxAx{i>YREG~o*i;%$dMth z4mqA2k*rBhOx7hQC#NQ7BW3||<&GMqJhWB4wGN?}q&Dd8zGDRC(aQ&y#{PFbI_A!TFAZ7H{>Y)#pb za(Bv}l>1WNPL-qbR!>LD8kEgzt`c~>Ysqd$Lp888#SeiIZniiR+OUq2lO3O~OrRAlKNE@3r zK5cT^l(f3ES!r|98q?;bEl69Pc758-X%D46p7wUy*J;0|qja23rAMVlr)$&o>4x;Q z^vv|E^z8KE=~t$grjJY?ojx{wLi&vKS?P1q8`9^ex23vnpZk%bHZEP{lGqxGsMvrlcag}kMag%Yg zahq|6ahGwoagXs4;5I&nDI+Hc3qpCb>y% zN;a8Hg{GmVGSf)YC{v|rtf|H{)im8S(^PMoYx0_wnyxinZ@SrZi|IDgCevoqHq%bi zZqpvqeWpiE`%N#I-Y~sodf#-)^oi+9(;3sbEG8>4t0Zf5)|9NNS<|y-WzETI%vzAu zm9;YK>a4X{>$5gwZOq!7byrqz*0!uSvd)`jW`$X0)|(CHG;^jo%Uon0W-c|4G>0GwV(k(_ywq>|wgk_{< zv}LSif@O-O&N9O?+tOlbw=A?Qx2(uHm2*1hM=P?5tZ`PQ)nHAtW?HkX*;bo1&su67 zX&q%9V;yguXq{y3vfgfe&U)5*!G>+&wiuhjrnRNojJ6`%Fk88;!d7V;Ypb(Ox7FJk zY);!eTbr%Jc9m_pZG~->ZJlks?H9YmF0)73qwN}dqJ4?|8vAwj_4W<+jrL9UJM3HR z+wFVokJz8KAGW`2KW;y1f7AY+{X_f5_A~bH?Z4&X+_+p-t|m7rSD$OhP0P*9&C1Qr z9iBTPwc`xR@ zly@TUWd5l9n*7@QY56nqoAR6UU(f$I|I_?0@=xb~oBw@5Q^A4)Z$VeVq5`g9Wno2O YUE!?4Mt^MqQIznP{Z{xJ_$+k(KRoej`2YX_ literal 0 HcmV?d00001 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme new file mode 100644 index 0000000..b7c2100 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..65f6c8c --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + iDNA.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 0D6AEA171689DF2600034395 + + primary + + + + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h new file mode 100644 index 0000000..5efda52 --- /dev/null +++ b/iDNA/iDNA/AppDelegate.h @@ -0,0 +1,23 @@ +// +// AppDelegate.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +@interface AppDelegate : NSObject +{ + NSInteger populationSize; + NSInteger DNAlength; + NSInteger mutationRate; +} + +@property (assign) IBOutlet NSWindow *window; +@property (weak) IBOutlet NSTextField *tfPopulationSize; +@property (weak) IBOutlet NSTextField *tfDNAlength; +@property (weak) IBOutlet NSTextField *tfMutationRate; + +@end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m new file mode 100644 index 0000000..c57795e --- /dev/null +++ b/iDNA/iDNA/AppDelegate.m @@ -0,0 +1,47 @@ +// +// AppDelegate.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +- (id) init +{ + if (self = [super init]) + { + DNAlength = 50; + mutationRate = 50; + populationSize = 5000; + } + + return self; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ +} + +- (void) setPopulationSize: (NSInteger) x +{ + [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", x]]; + populationSize = x; +} + +- (void) setDNAlength: (NSInteger) x +{ + [_tfDNAlength setStringValue:[NSString stringWithFormat:@"%ld", x]]; + DNAlength = x; +} + +- (void) setMutationRate: (NSInteger) x +{ + [_tfMutationRate setStringValue:[NSString stringWithFormat:@"%ld", x]]; + mutationRate = x; +} + +@end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h new file mode 100644 index 0000000..832ddff --- /dev/null +++ b/iDNA/iDNA/Cell.h @@ -0,0 +1,20 @@ +// +// Cell.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +@interface Cell : NSObject + +-(int) hammingDistance: (Cell *) cell; +-(NSInteger) DNAsize; +-(NSString *) getDNAatIndex: (NSInteger)index; +-(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; +-(NSString *) randomNucleotide; +-(void) mutate: (int) percentToReplace; + +@end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m new file mode 100644 index 0000000..5b14ac0 --- /dev/null +++ b/iDNA/iDNA/Cell.m @@ -0,0 +1,141 @@ +// +// Cell.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "Cell.h" +#import "NSMutableArray+Shuffle.h" + +@implementation Cell +{ + NSMutableArray *DNA; + NSArray *nucleotide; +} + +-(id) init +{ + self = [super init]; + + if (self) + { + // Size of DNA array. + int DNAsize = 100; + + // Possible elements. + nucleotide = [[NSArray alloc] initWithObjects:@"A", @"C", @"G", @"T", nil]; + + // First init of DNA array. + DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; + + // Fill with random nucleotides from corresponding array. + for (NSInteger i=0; i < DNAsize; i++) + { + [DNA setObject:[self randomNucleotide] atIndexedSubscript:i]; + } + } + + return self; +} + +-(int) hammingDistance: (Cell *) cell +{ + int dist = 0; + + // In case DNA size of two cells are differents. + NSInteger minDNAsize = MIN([cell DNAsize], [self DNAsize]); + NSInteger maxDNAsize = MAX([cell DNAsize], [self DNAsize]); + + // Comparing elements. + for (NSInteger i=0; i= [self DNAsize])) + return nil; + return [DNA objectAtIndex:index]; +} + +// Sets DNA nucleotide at given index. +-(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index +{ + if ((index >= 0) && (index < [self DNAsize])) + { + [DNA setObject:nucluotide atIndexedSubscript:index]; + } +} + +// Return random nucleotide from corresponding array. +-(NSString *) randomNucleotide +{ + if ([nucleotide count] > 0) + return [nucleotide objectAtIndex:arc4random_uniform((int)[nucleotide count])]; + else + return @""; +} + +-(void) mutate: (int) percentToReplace +{ + // Explicit number of element to replace. + NSInteger replace = percentToReplace * [self DNAsize] / 100; + + // Some preparation in case of data out of range. + if (replace < 0) + replace = 0; + if (replace > [self DNAsize]) + replace = [self DNAsize]; + + // Nothing to do here. + if (replace == 0) + return; + + NSInteger i = 0; + + // Array that stores indices to replace. + NSMutableArray *indicesToReplace = [[NSMutableArray alloc] initWithCapacity:[self DNAsize]]; + for (i = 0; i < [self DNAsize]; i++) + [indicesToReplace setObject:[NSNumber numberWithInteger:i] atIndexedSubscript:i]; + // Shuffle it! + [indicesToReplace shuffle]; + + // To store generated nucleotide. + NSString *tempNucleotide = [[NSString alloc] init]; + NSInteger DNAindex = 0; + + for (i = 0; i < replace; i++) + { + // Index of DNA array. + DNAindex = [[indicesToReplace objectAtIndex:i] integerValue]; + // Generate string different from that in DNA array. + do + { + tempNucleotide = [self randomNucleotide]; + } + while ([[self getDNAatIndex:DNAindex] isEqualToString:tempNucleotide]); + + [self setDNA:tempNucleotide atIndex:DNAindex]; + } +} + +@end diff --git a/iDNA/iDNA/NSMutableArray+Shuffle.h b/iDNA/iDNA/NSMutableArray+Shuffle.h new file mode 100644 index 0000000..374d469 --- /dev/null +++ b/iDNA/iDNA/NSMutableArray+Shuffle.h @@ -0,0 +1,13 @@ +// +// NSMutableArray+Shuffle.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +@interface NSMutableArray (Shuffle) +-(void) shuffle; +@end diff --git a/iDNA/iDNA/NSMutableArray+Shuffle.m b/iDNA/iDNA/NSMutableArray+Shuffle.m new file mode 100644 index 0000000..66a3174 --- /dev/null +++ b/iDNA/iDNA/NSMutableArray+Shuffle.m @@ -0,0 +1,22 @@ +// +// NSMutableArray+Shuffle.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "NSMutableArray+Shuffle.h" + +@implementation NSMutableArray (Shuffle) + +// Everyday I'm shuffling! +-(void) shuffle +{ + for (NSInteger i = 0; i < [self count] - 1; i++) + { + [self exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((int)([self count]-i)) + i]; + } +} + +@end diff --git a/iDNA/iDNA/en.lproj/Credits.rtf b/iDNA/iDNA/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/iDNA/iDNA/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/iDNA/iDNA/en.lproj/InfoPlist.strings b/iDNA/iDNA/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib new file mode 100644 index 0000000..d906d07 --- /dev/null +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -0,0 +1,5274 @@ + + + + 1070 + 11G63 + 2844 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2844 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSMenu + NSMenuItem + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + iDNA + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + iDNA + + + + About iDNA + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide iDNA + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit iDNA + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + iDNA Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {505, 343}} + 880279552 + iDNA + NSWindow + + + {505, 343} + {505, 343} + + + 256 + + + + 268 + {{17, 306}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Population size + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{17, 272}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + DNA length + + _NS:1535 + + + + + + + + 268 + {{17, 239}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Mutation rate % + + _NS:1535 + + + + + + + + 268 + {{140, 301}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304192 + 5000 + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{140, 267}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304192 + 50 + + _NS:9 + + YES + + + + + + + 268 + {{140, 234}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304192 + 50 + + _NS:9 + + YES + + + + + + + 268 + {{197, 300}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 10000 + 0.0 + 5000 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{197, 267}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{197, 234}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + + + + 268 + {{17, 214}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Generation + + _NS:1535 + + + + + + + + 268 + {{137, 214}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + + + + 268 + {{17, 189}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Best match % + + _NS:1535 + + + + + + + + 268 + {{17, 164}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Goal DNA + + _NS:1535 + + + + + + + + 268 + {{137, 189}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + + + + 268 + {{20, 48}, {465, 108}} + + + + _NS:9 + {250, 750} + YES + + -1805647871 + 272629760 + + + _NS:9 + + YES + + + + + + + 268 + {{14, 12}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Start evolution + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + + + + 268 + {{357, 12}, {134, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Load goal DNA + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + + + + 268 + {{146, 12}, {77, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Pause + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + + + {505, 343} + + + + + {{0, 0}, {1280, 778}} + {505, 365} + {505, 365} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + addFontTrait: + + + + 421 + + + + addFontTrait: + + + + 422 + + + + modifyFont: + + + + 423 + + + + orderFrontFontPanel: + + + + 424 + + + + modifyFont: + + + + 425 + + + + window + + + + 532 + + + + tfPopulationSize + + + + 1346 + + + + tfDNAlength + + + + 1347 + + + + tfMutationRate + + + + 1348 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1345 + + + + takeIntValueFrom: + + + + 1362 + + + + value: self.DNAlength + + + + + + value: self.DNAlength + value + self.DNAlength + 2 + + + 1360 + + + + takeIntValueFrom: + + + + 1363 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 1361 + + + + takeIntValueFrom: + + + + 1364 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 12 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 54 + + 1000 + + 3 + 9 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 420 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 1132 + + + + + + 7 + 0 + + 0 + 1 + + 112 + + 1000 + + 3 + 9 + 1 + + + + + + 1133 + + + + + 1137 + + + + + + + + 1138 + + + + + 1200 + + + + + + + + 1201 + + + + + 1206 + + + + + + 7 + 0 + + 0 + 1 + + 51 + + 1000 + + 3 + 9 + 1 + + + + + + 1207 + + + + + 1211 + + + + + 1212 + + + + + + + + 1214 + + + + + 1220 + + + + + + + + 1221 + + + + + 1241 + + + + + 1242 + + + + + 1246 + + + + + 1248 + + + + + 1261 + + + + + 1267 + + + + + 1295 + + + + + 1296 + + + + + 1298 + + + + + 1299 + + + + + 1302 + + + + + 1303 + + + + + 1304 + + + + + 1306 + + + + + 1307 + + + + + + + + 1308 + + + + + 1313 + + + + + 1314 + + + + + + + + 1316 + + + + + 1321 + + + + + 1323 + + + + + 1324 + + + + + + + + 1325 + + + + + 1329 + + + + + 1331 + + + + + 1335 + + + + + 1336 + + + + + 1354 + + + + + 1355 + + + + + 1356 + + + + + 1357 + + + + + 1358 + + + + + 1365 + + + + + + + + 1366 + + + + + 1368 + + + + + 1369 + + + + + 1370 + + + + + + + + 1371 + + + + + 1374 + + + + + 1375 + + + + + 1376 + + + + + 1377 + + + + + 1378 + + + + + + + + 1379 + + + + + + + + 1380 + + + + + 1381 + + + + + 1383 + + + + + 1386 + + + + + 1388 + + + + + 1389 + + + + + 1390 + + + + + 1391 + + + + + 1392 + + + + + + + + 1393 + + + + + 1397 + + + + + 1398 + + + + + 1399 + + + + + 1400 + + + + + + 8 + 0 + + 0 + 1 + + 108 + + 1000 + + 3 + 9 + 1 + + + + + + 1401 + + + + + 1402 + + + + + 1403 + + + + + 1406 + + + + + 1409 + + + + + + + + 1410 + + + + + 1411 + + + + + 1412 + + + + + 1413 + + + + + + + + 1414 + + + + + 1417 + + + + + 1418 + + + + + 1419 + + + + + + + + 1420 + + + + + 1423 + + + + + 1424 + + + + + 1425 + + + + + 1426 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1426 + + + + + AppDelegate + NSObject + + NSTextField + NSTextField + NSTextField + NSWindow + + + + tfDNAlength + NSTextField + + + tfMutationRate + NSTextField + + + tfPopulationSize + NSTextField + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/iDNA/iDNA/iDNA-Info.plist b/iDNA/iDNA/iDNA-Info.plist new file mode 100644 index 0000000..8abc952 --- /dev/null +++ b/iDNA/iDNA/iDNA-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + bie.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2012 witzawitz. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/iDNA/iDNA/iDNA-Prefix.pch b/iDNA/iDNA/iDNA-Prefix.pch new file mode 100644 index 0000000..41eaf80 --- /dev/null +++ b/iDNA/iDNA/iDNA-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNA' target in the 'iDNA' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/iDNA/main.m b/iDNA/iDNA/main.m new file mode 100644 index 0000000..cb2669b --- /dev/null +++ b/iDNA/iDNA/main.m @@ -0,0 +1,14 @@ +// +// main.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} From 35460331f4aad84fe9b0c7cf58aa559f0cc4bfef Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Sun, 6 Jan 2013 23:03:57 +0400 Subject: [PATCH 02/12] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D1=91?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20GoalDNA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 17517 -> 20760 bytes .../xcdebugger/Breakpoints.xcbkptlist | 20 ++ iDNA/iDNA/AppDelegate.h | 11 +- iDNA/iDNA/AppDelegate.m | 40 +++- iDNA/iDNA/Cell.h | 3 + iDNA/iDNA/Cell.m | 57 ++++-- iDNA/iDNA/en.lproj/MainMenu.xib | 174 ++++++++---------- 7 files changed, 183 insertions(+), 122 deletions(-) create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index d994352237e01cf8c9c5c31e1079d68209561984..c8ce41fd9805dfb1e96e84b1c7ba4cb5c14e6c40 100644 GIT binary patch literal 20760 zcmdUX2Y6G}`|vq;btG+5+9usio3=?hl8&TJ>7a{IDXT4el+dPaplwQ$0%e{HA`S#` zpa>{!86qkw3W$i{02C2L6a;@b5cfbu1r+(-o7*%E;_vVGJ&*pM51uDY?iufU-t+GB zo;$6r+3Ij+WSl@4QHVwiViCu!;8AUlf8uQ5e#q6qJh6P&(2fJ<33tC=2DF0#t>nQ4Jc6#-Ooi92$=% zpowS_nvABPdSpS}AHa5#>@ zkvIxR;~1>OiCB$OaVE~g{c%1nz=e1q9)t(u5qKh=geT)ExE9xAJ9gkXco8OeDPDzF z=@r!srei^@lU&ROUA^bW%ir>NSjOm$P+sVAwYsHdqN)HBqx z)J|#_wVT>Uy+j?P4pGOb)6_@QXVjO}H`Mpk1?nPonYv12nxzBiKstz4(BX6folKkP zJbD0KPTxcir7P(wx|*(`$I;_y3*A6B(oM9Lo=&&YcG^KNpn3Wp`d<1$dIQ}}Z=|=- zkJ8)d$LJ^N9rTOze)<6Y68$oLh(1gor{AGZ(C^ak)BmB*(%;bE(%;eF(--I;=pX5y z=*#pK`ZoqKn4uVs@nL)!DI;TonJ^}vNnlh=B9p|VGHFZ}b&|IS|}N^ zFEIOoDFh4NAFjrV9D`P`g1slo6 zvhi#Zt6|evJ)6zuu%&DnTh0z-2eE_MA#4RZnjOQAWyi7gtc7i08(9bIWZT(U>|%Ba zdo#O~UB%wb-oxI@ZeTmvF1DN9#y-YA&OX6zXP;$vvb)#=>`Uy+>?`aM_FeWp_9T0X zeV;weo?*|kpRu2_U$8&2Kd~3tOYHBQlndYjxgbu)1#@9sI2XZ1aaAwZJHF3?HjdO6bxVhXsZV^Ygo4KXjZQSkLiqVO! z?aj^aAV1`fBuI(^kZeq1U9;KY7(2XLH^b85m;ir!)B#EALV+lVP=xM6!Kfc$cwAU3 zOEi||1BDQTvK^Yc6n)LS*H&eYzLSfnd4P{@wa#p}RMZ10tPNI+y;c?n-An46pmcAHZeL(EHe2&F zv%SJG#_F(6YX)H9y@TD%&pFW^;W0N?x-|(*xH@7G8rtiy2&)xf(2?bBxt8Tb!dItHmL3 zA`Ba3ZMKXwJDVoMPjL;xKpFCzT+-H7ZfUjv_7+`>hlW$pG@|W9W)j

PTFzEVz73 zO)shyPD_hJ+_MJMNHkrj30aAfB)cb&qGn_hB((*#l6aEPh1$?eq9TctVVb^-CWGI? z;)j_VTdmIaddo;v@xmvO@K5A{*=WwB;nn3*%@+lcN$tI*x(9-=3MNhKLpD^rfE1G&=yxrbVvy53FIRXgqNbNJ;cx zbSbw?Yi|UCSHrf{IW6_QgKK3me=(%O;b^xw+*FaH2T>Q%Zb56&IOT3;&*f=+InYe4ge%68zKHgjverQXFd;^SzcW7)83r`g%=`13r1 zt^}~4jQ$#ypw4>f;sv7A(qOY&dS~rHWZt}t9;K6I1oe|+1fApSrk4~wi*}KuPPCKs z??k&vzPOe#=4K#ji9?ve-BphEqJ4s3yg&*%(Tk+8##%nS#MAmRdR1tBg%ow7gJi&U zt*@gugw`XZxDy>ECEl_((mjh5IR8X1I`5J)cY_?ALZ^FypCRR*hO_8nqU}OQ0dff` z628Fvq!%$M`V4*1JLQ*TkZ0sK=v$)Qu)*`-0=h`F-RKAOBl?L9Ar<7NZuB$oNCg=R zyb&pCci6kS8D+MXHoFB>qpj6NE8tIIXF>gpXl?GOXa)YTIGn&Df~A4&1coRt9bD4{ znx}q*eN?-p-69w#8TB{B#e?59><8K%BaAVHY0O|2bJz#_lHp_o8A(QwDpE~q$Y?TV zD@w!?EX4uvHweq%vmdNrEEz{8z~71FX82qxu4ka#ZnO6?O%F@|NeqHvd1YX(&20`# zJ@mGK)fS%hGN4Ngg<%2_9HkvK9c>^6VZsA1VFrQe8QMFY&=sBuHe6)>>#?bo^@FzF z{)6qd_BI$0dOd4r=k%CU9E;<~_zf-t`SZ#53!xI(CA3eMpez-I_bWe75 z7c6lD))Gx8P9c+ev^-8Hnr^JadYnNflWC+^BBVGQ=YR^v25cl#NNpF+#U?V9n5(Sy zRn88V1dM8QZ=Vzoz@=Wj%WyfVBcMJ;3zDQCV`~PN%%PtRW>fC~gV3RGvdn3=IQ7Fy z$}%%D^&{;zAu3d6>uruX>22b#^lZIrwClsmqK#_sfUdxmUZ98J;iQ2qad(j8QFsh! zcU*<5aSa|#8c7qelIa`qSUe7o#}mj5GLsOp7&g7W$8)T-)tLpuqs-Py^k%p0XO0%Y(;)}I-Y@>AvB$cTW~A0JJ|pv$T$PT7hIva|?{NgR-|b$ENrG{Kt-g+{w5 zhbh*jkc&l5?bHLa%TUr~P zO=@Mm1#%4#nJb&XVX2i>jCNR*wgx3Io4di<8yYKJV_VIY;@Es;y|rEm!Jx9mVr~^1 zdnX<+%IYE)Sk~9vmKDCg0pC4zKZf5HTsk4p!pF%n_lCYJnA`X8NqmajO70*l+ykWe z3_c51tT(X2AL5V5ZRGYFM31WCwqjQh6ix0S z_mca_YH~k$fUF@8lC@hYmf|QMi0&&We@a40AzibMY$R_(bRS91@;HUZsl)_^)fIR( zTI{`HE=2y|a*6S>D~$qfFK8fp{e)&$0zili1kwrKp4e+bpU$paQ=i|1Ev?pe@Ys~) zmIiZsvvZ`7=LTKZ>a4N|el&a$eF?BwFlkRO7g7RYfz|>XHGsA#gj zhl{8Wh=A*s{TEtei4Y{Q)^Dk8J9s^2z2}S&~SVo-E2=(ZP+doEkut2on^OEuB;;d8B5T z+1l!El~RMKn@CbOHJBPgRgkUZQL?R@8VZ{|j64P#e5_Wc^#TWb=(JQr!lt#+^|d$J zhinO`Q18AyUiv2I&_4xPz~f+vXi__AT}g#kfW1?=%U>0G>Z{Lc!}!- zLAC^shNrHHkT(D(bhf< z?0!!U7Se+0b?FXUyS>ixF4acOr0mF#a!^jHotj0>Mis!T?%{5SYl>%TAra;3(E|JE zc`O7!pmOJoXmF49w2^&eH`zsA65`Juw*$D|+sWG_6Ycxo{^GNBKgJ*3#>bW%&HTfkBP5D)2LMqnBjjw8)hdl$7#@H_u&A2*Cw z$R1ME^Mkq*e!L*225=*||1)q4wTikMypaRsMWNHZ)P24* zru*Cd-C`)EHc^j~q>a>OY76xUwUxX=UL^;~p^elw>M@i^JwXnW*B}Y-IwS!`+N~|% zZ@O8p#uHK{Uf0x<87uP&%_a}A)>}%No5f5VsJQC}x#NHDQL2)i4^q_6AB>s+$?(iH zWu7r}!MJ(G99M?CRu)xkZE0(^2uBny%b@HN+SbaFy^?{VB5M%ID_C#b{JYXIwY>Im@jQR+<~YMV$@5jR(iFvmF@aDr&9(Pa&9 z(9+LtvpGf6AlO%-J2?)r@gH*fJ?bs$ZR$8BEa?RGE}BTaNu8ulVTeYR^*s^!U-8gH zo89WB%_d2pkv3u33GEjJSFdt(=tpxAgHfqJ41aSYBusdIUy<{H(5Rr z)XF*PQ|df?3G)2?3GS%OJ&_y%C?0=`LTTtb+ z5A6>LOxhQ`gb&H4E?PoM$w%bl$u3`Pq|IR!vMdP$z_aj-f$&@y(~l}9pO7tGbQmos z=g5`uB|>Jp6|B6wtCWtUW3TrS=r~kC$CFRNN4O-?w1G~9q!*n;&btT7X$_t6KiP3Q zlg^^EX#;JfEOajUjC@XhAU~5|z>fb4nzYAq)}=SOBGo=zMfa!kK~%tAlJChEu)AR1 zdUlsCfzX{UrOU{dZAvguR7@p@-_IU5ZSbwn?>8_F=Mr|lo_JCS!Hp6 ztLYeQH@7vpB(KUm8)SNpc-n@X|KowNAQ%1>!`0+ofs~#|PrZ@8r_J;y@n+K#E$G9*bK*gI*9cs4I0tw+T!% zlU(-Fli5aNkDl}(+fH}$ILGII!?|M)X#pALCMuA&ahw|N3&(c7dyS49CMRCy9PqaE)gCDM|HrlgR%y z5ou}FH4EuwNMCudc5i`{ewN+?oJQ}YchS4)=XmVLV}Bk?cr4vWKTq$apQHEjIDp4N z@Px;5aBkf$z%YxDmGuZKL>+Mzr9(QV*{$`xPOESxDi}<$IsjaIaWp7FNPy1*!GyG~ zyrQ(s+&aq)2k(75yZ7T&fo%@*IIt$ukdfiWTu#4EzX=CC^bz_E`Y4ZOJPzh@zi#>% z{TBT;k3)DI%HuGw&=sX4+MUgi8up$Z*t((={EQjbKaQw0JDfvXZL?eZj2mmMclOGs zoIXjP@;Ysz&(I$T4>C=9LwW)9w$ziV6(Lhf~+|l$CrTuv)D)4K%${Uq=)k5HMU+0*_TyS$RUY-dPxiVFkKP z5K`jGK~_sMoS+Aq*JeK4*xGf{BJ?A`{L;Fp*3YkJEUZ&SM>q^&6QOCYFg~lswMhaTbpaJT{IW zW42p`;MOq~c-~=awoDKm7O{3kNWys1Aidcc4}3MF1(Grv9%pufF@+d0vUf&-OWl%J zT?d(I&oCVWw!M?l^EkU_Sa1(`h`xbs1n8dLMkW_}yApMbiN`sjm^Co@kYiyAm_i=s z^0>ddzmzFv%1ED78&l2<U|#raa^CT5t|$l=Tg9_RD8U}6t?VxDdG zRIhPzriPhHwA+}`%ot`YGmaV0OkgH5lbFfO6sDHPMLZtB<6<6{@VJ!6WjrqDF`zVv z$Afu1WE)a5(@+Id&sdlSrjco4tU_r3f!za&@^~$eH}JTd$1m~tWgfo;W)yN}p{0<9 zn$af6m%~*r1Reo!Vq{P9N@O`#cET~pW(UUuq(~vAiy)L1>ySz-^{xR>T?0X+%?@%Op~=-n9VsUcY;`%FPdQrh{1k zYL}VI%wy*B_$D3?<#A;h4x{Zl-r9;GnyhF>o`8 zh)AsnvG3%br9Q_zFYE(2W#c=Uy*!>EWXb=c4vg6^D8d5_=!c0sp6Z@N%Dl=P26e_9 zWDfCo5|1Z$F|RSN^LPr6YyVC)n5EcD%}JTJ8K{oAZoc6{ddFSuz{iqfa6=(Q9%W; z{R9=z`j4mpI9TpmH<()8)ZWkl5tC3W*@I7*h>zWaPsG2Ek0&B!qeXn29(xQCjB#;RAy;z*7bp&B0`_zfv)=pp}P(q`Y=SM2z{;xy73=`?pnL2 zbeA=;gnDlm-bj_t-71wfIIA&#uX(Cr8sb@+n+j>JBZEPD%XXo*9 z9^WZUw?e=Xk3VeH_sKdLvLM%=*JsIdSa1_>u;hj8BAAZn@m)M#B}{j>Fdh13>V_$< z>5N$>;piaC(?VeE0HDBLq{fb}e}KYipy#1!re27$X+WdX~GI zU3)|P*0JkhGVs+N;PDz^vIkwurPJp6z?KMw{&@!19viRQ<4x=%VCUG)>=quc-s8Vsc)mWX)Jw=5L>_MX0$R1)3v#+t>Q$51t?L6MW({J;uJpYlaH!6+2w4b-~bs2UuAop zwcZS82XHK(UTSNuKc1}CXm4~Srw3M-CdG3f$3HDyr_X@JxxiNo7p?%8u}zR%BmOeF zGy}nOS=nyw=u{2wue!8Xvza0w-1qoG%2JHy85Tw@VV>wdZ?uXG66joN8c_i zsu7MA35F}9!Ek3wh0;+L+%Xymmw&2IEowkEG!r>cJ6Z%+K31SLaChP%xHZuQS0uKe zt#JKwH#z`UK930{_;BI#Jo*CtjxmX&6E1H)gLmP*B5^4!{)HP#UjOhum&49pX0J@{^*V(jkZySN8_EYF3%@*a@dpP< zz|HKN9O5wh7Dsc8OTZx;4H4Tm9zW0Hy_-3XiQ{}ZKS;X8@%RN-#%&*u_q)Cr#Je5d z3dT$D#R3%J0?2>q1ZY8&B%CMy51p!=9l`~%|DmUF`0nbdD)tpAbe!vl{J0P@)$}cpl*Saa|)3_mM%_?@~70;>dhTWvs0Os-9IB+_LUg@HE_{zJc9y> zaEL6bbxz5tzyfjcTmp|lk00#f61gNEALj8<=p;J%oJRENUM1*XKXK^6AYH`ZkbuEI z=|=aul2R^K1 zU0>YPm2yQ~$#rv-a%DV*T=Owi@#6hG!)~7H`r_WCAw=^iSHa!H4dp7iVcc+T1UHf! z#Z~bbjws&Y@w+@e$>aBVe1^yW;qiw&{+P$-Ji9eoq!rW+z>GqO$c_J(LLg5Vz)cd7 zIN?EJ>c519Clcc7L?qtxAkiow@h=~m^|0`C5t&mSWLp1?z^DiMOc6R1BfFWR{hx;3 zXCvl_(4ny8e=k+REfA47`|l&shZ2iLBtH5F71?zWIk!v%`H2AXA5Z3a)X;Jf?56_Q z{eQ}Qz)8aY+Fc5OEnH0X+@lyHzIDT)FVlOjRP@162PK+sdwIUxXJD`~t5Y2!~e=#Bgz(2CS0s znt=+gimQbe3^?J%0(0Qi0`s|r@M?j@@N$7$xHa5bZaw!f*U5Ero4769R&E>j3U`t_ z=M&@(V@$!E6DQlDi$xB9I1>Gs*=^N7!*K9Bos_j%dp4WBoC-tl?Y=cLc4KA-t~ z?eneA_dXYWe(|~F%lSt5M*6CJ(|q%Mi+qRr4)d+@t??b>JJENtZ>?{W?@V9fyUh14 z-_5>{`|k1G>-(zjA>Y@0kN6(-eb4ul?`hu;e9!t}Kc%0+ug1^pSLbK1dT$Nb**JLh-BKf=GzzuA9@|IPlZ{O|E!?f-!P zTL1O_+x_?Y@AE(4|FZu<|HJ-A{ZIRU;Qyij$Nr!Cf9C(S|0Vw`{#X64Nhk>;=_d)1 zC?yG!B#By*B1x0vN%AE{l441jWT2!e z3du^zU6S>Zhb5aOk4PSsJSN#8c~-JZ@|@&^{3=^5!)0aSoIAS+;Sz?6W-0BgYX z07n1`SQc<+!0Lbp0@eg{1#Ar160kMk>40Yfo)35-;KhIg0dEGp74UAr$$<9*&IWuG z@JYb=fG+~R4fsCb_kceF=|DEnCr}y~7$^&D3Y;D|JFp{gVIT=y9Jnm-w!k|A9|(Lf zusd*5;FiFxf!hL~3EUaDJ8)0n-oUp4PX~S&_;ujLz+VD?3%nY5EhsU_6jT{BCTK>` z;-LG3x`TEG?GD-#v^Qv9(0*C6OfRdDjg(E75!oi$BeF+jkI9~pJt=!SI6OE$SQV@Z zP64ju$Hj7Ve`ZI zuq9zj!)^~-9=0NEUD&3ur^B8JdoJwxuouE!3VS8&VA%U%pU89MW%7aYaqTNSq}Rw`C0?oq5)Y*y@0JgeBF*sIv5cv%$wu zo5H7uuMU4A{9yR8@VCQHgufSlF8qA>#qeLkFNI$T|2_PV2oym@1V@BKghePKA|j$9 zVj|)q(jo>&R7W&MEQ#ohcs$~@h_ewtM54%$NPT2xWOk%6GB+|Waz>;xa#rMm$VHKS z zwLNNQ)QeGvqs~U1i@F?5MW;t+MNf{N9^D+>9z8p{BYIx+g6LbKZ;ie^dU^DU=&jLj zMW2n~VuE5KV^lFEG1Fsa$1I7tBj(PSl`*Sg9*o%#vngg<%rh}NW1fq7KIVALxtKp< z!(-E9^|6_;*|Emh;juGg7sTEidspn5*tN0iV;_#~jO~uy9lIxXZ|uI<{jo2_9*I2~ zdm{F|*i*5mW6#B&kNrIMLhO&R7h|u+UW>zVTwF+8Sezm*A}%Y=5SJ5Yit8U&7B?_% zNZd_v)o}~r7RNmn_iWsmxQ~>aGDI1sj8sM|W0fjpl2WZSD*G!3D=U=4l_Ql^%CXAv z%85#g(ynwW=P4H`7b$t=t;*Y#%atpX_bb;Z*C`)TZc{$4+^gKD+^>8|`HJ$O^04xC z<@?Gr%Ks=oRDP^Hr#!FxTzNS@FkTklFFrJ09v>bbAFqnn#HYlk#plK6#}~yH$Ct$q zjGq#JNBjfv55}*Le>lD?eq;Rh_!IFT$DfNoAOCs6u!IQ-lM*ZmjS1F-83`>3vl8Yc z%uSe|urOg+!d(e#5}r=jpKvtcSi;*0?<9PXa5mxNgmVd3R6Z&{l}y!76{?b}VpMUe zcvYe*U8PrLsSK(TRhgO{3xou<~Sv(!22GW9_9AoXB%m3o=_UiE7A8ueQBM)hX(R`p}*m(_2nkE`ENpHP3S zKBxXh{k{4}_0Q@{8mwV7J{o^bfJUK-)1+w1G$S=tn$enZnu(gpnz@=~n%gwXH7hlD zYwp!NqIp)cOS4C_SM#FgCCw4dQO$A9yP8v)^P0~!-)O$mT+sZixup3`>!g=r~I1oM=DNbQhibb zQ-f1OQx&O|skfwVPu-ikFZDp`E2)Q4Ur#-m`hMysspnI_Nc}qXyVPG(ucTg0LuquH zG%YYKI4v|SK24RDoTg1nOVg(nq!p!=q?M&rrVUSfDs5ld{U$Vd>@Rj`VfuThq6tKau`a`ZMXf(vPH{NPjQ=O#0dMkJGj-9X(C-B8^~UA1nEu2$#NEzm8}E!Hj7t=4VOb?Y|kw(1_! z2kFE0NqV(DO|REy>2vk{^@aL!{ZRc>y+z-uU!lKG|E&Iq{*?Z-{*3+u{g?W$^;h&) z_17|}3^v0zLy{4g5tE_JP-P@%Xfx6>^ch(h12Rf7$}OSpJslR`DNzUnHMvE$r_zCEvr7OG0U1|&vItHll4*7 zCt2sSKF_+4^<(y^>?zq(v#r_9*|uzZc6;{1Y(D$u>|3&L%ifrMB>Q~>HuxJt4ABOy zA=Looy#|w^zoEb|&@jX>)G*92(lFjoZ)h>hHOx0GHQZ{r!?41z%J86JyhmDUIw;T5w_ZbfvUo##t z9yJ~_o-&>>o;7}CJZJpI_-hWz3CIb`3C&UDMCQchB;+LJ4Z(3wpY`V>~+_chkw`r}Z%e2k3!?ZJBo*$Q=o^Qy{&mWS1Q~uce z3Hg)rr{>q?H{@IMXXSU~&(B|!zc_zs{;m0s=O54iy&$8^M(5g4-_6Me6#Rm;YWqv7JgrNvGCWzD}~pJs3Nu~ut-s)EJ`TKE$UxX zSX5k8Ry3%nqNuWHL{U}I=%Q&w^+kiu=S5!@eN*&Z(XU092hMWgI+EMyJ>6fKnmws1zp=?Llt7Wg3z2(YsA&L_J Na`%XT-JfO0{|`aEAw&QG delta 10137 zcmaiZ2Yi#&_x^kDeQ%Ryv}v2s>@;bTHc8Va>0+0?%ig1uHibe5qs#)iFMC=cqR8%G ziHL}Rh$0{&Q-m@F5l~S;1Z2qef74J3e*Jy^{Xp`*x#ygF?m5qS?z!)~qypTU4c?Zq z_zu47Kay@?H%EZA3!C@yEn@u4JIrEcBl97%iTQ}x%zVsjVLoBDGM_TrnC;9?=1XP| z^EGpTImBFGE;2tdmzbZJ%ghz#D)TdQow>o>VeT@2Gmn@T%s+quAwUGAKm~Ll7TACr zct8Wt5VQa-K`YQ23;+W`78nGw!C;UBa)H+e@<0)o0H%TIU@mwIECP$c67W7)1uDTh zun}wqpMuZ87hn%K0KNssz<1yrI1hdR7r;;8F8B-F1NXrL@DThB9)ZW;ABZ6z3Sk%w zhfz=u4KM~8p$W!9GqgY}jDt?-hN&bx=i(xsefR(Tcu7?}oR=5Kmf`{Sv@C-Z;e}F&2%kT=k3a`QI@Bw@X|Avp? zWB44tKztO61W1U&Q52FQBQl{_WJVTbMR6z|C88wcLa8XthZ>-Us1a(4TB25{E9!>2 zqaLUy>W>DX955E;qG6~QjYH$n1jM1KXd0S@7NA9FDO!e>qbjrptwnp#UbGK=jrOB& z&;j%}K{8 zb~pPKyNBJ&9%H{_kF(#i7ug@#OYBeVP4*A=7W*grgni0BW1r(tEWko6!cr{5a;(77 zSm(ofY``{b#}1r;lW}9*1ZUu;xEXGaTi{IG33tX_a6jB155U>ji^t%xcpM&&C*X;A z3g+-sJPpsnW!R73#Y^!Dyaunu>+pKK0dK*d;H~&8{53v+594F_1U`k&;S2aDd=+2A z*YT|$u|;DF{E=)!AlTZ8-2_0o|2baA>qXRL5Xts$47uU&U<~!I;!2zadoazs!&ECy4}| z-eby1{03$T^FFhbS;j19Rxm4>Rm^IVNRo()xQT}(lN6Fl(l#)$OeIsrtfAlQnDzAY z1Cmbak@}<|{cc1W)6XXUIilS@ewIX9TAJiABu#c0O5G{-9EMa+>g35MnNUW^>|j14 z4OX9I(wKDSb7oin%x)dWlw=Ps@OJZ-RMKC*U>fwu>_%^D#lNZ%52)rb`$!yB4VwAp z)$co)gY>$Z{w|ET}ydQDktPQ?7m{6@^>%r(-kocW!!_pcCWe19;1lK67w z7U@vV+$J5n=eNjgTB{*v?lBJnqxVT>IrETo`q$_a=2>9$Dd}9!JSSZSG#xRbg}1;v zB)i1x9NM|oiU>f!*3Jts=~g=+2YlcY)XolsqFS870h!wbr+HuxS$h|F0}$8 zAP3Q}Y${35+5tJx04<4M{VIrZU;xIz9N9!y4oswXFzR{0LgFfc)d%80Jn2LFkpZ

JugDZ_1eYZ^_1>>Fbi9 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 sFfBK2WZLMov1#KSX + + + + + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 5efda52..bde2c00 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -7,17 +7,20 @@ // #import +#import "Cell.h" @interface AppDelegate : NSObject { NSInteger populationSize; - NSInteger DNAlength; + NSInteger dnaLength; NSInteger mutationRate; + + Cell *goalDNA; } +- (void) createGoalDNA; + @property (assign) IBOutlet NSWindow *window; -@property (weak) IBOutlet NSTextField *tfPopulationSize; -@property (weak) IBOutlet NSTextField *tfDNAlength; -@property (weak) IBOutlet NSTextField *tfMutationRate; +@property (weak) IBOutlet NSTextField *tfGoalDNA; @end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index c57795e..63d5f18 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -9,12 +9,21 @@ #import "AppDelegate.h" @implementation AppDelegate +{ + NSInteger maxPopulationSize; + NSInteger maxDnaLength; + NSInteger maxMutationRate; +} - (id) init { if (self = [super init]) { - DNAlength = 50; + maxDnaLength = 100; + maxMutationRate = 100; + maxPopulationSize = 10000; + + dnaLength = 50; mutationRate = 50; populationSize = 5000; } @@ -22,26 +31,37 @@ - (id) init return self; } -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +- (void) applicationDidFinishLaunching:(NSNotification *)aNotification { + [self createGoalDNA]; } -- (void) setPopulationSize: (NSInteger) x +- (void) createGoalDNA { - [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", x]]; - populationSize = x; + goalDNA = [[Cell alloc] initWithDNAlength:dnaLength]; + [_tfGoalDNA setStringValue:[goalDNA DNAtoString]]; } -- (void) setDNAlength: (NSInteger) x +// Getters. +- (NSInteger) dnaLength { return dnaLength; } +- (NSInteger) mutationRate { return mutationRate; } +- (NSInteger) populationSize { return populationSize; } + +// Setters. +- (void) setDnaLength: (NSInteger) x { - [_tfDNAlength setStringValue:[NSString stringWithFormat:@"%ld", x]]; - DNAlength = x; + dnaLength = MIN(x, maxDnaLength); + [self createGoalDNA]; } - (void) setMutationRate: (NSInteger) x { - [_tfMutationRate setStringValue:[NSString stringWithFormat:@"%ld", x]]; - mutationRate = x; + mutationRate = MIN(x, maxMutationRate); +} + +- (void) setPopulationSize: (NSInteger) x +{ + populationSize = MIN(x, maxPopulationSize); } @end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index 832ddff..d53cb1c 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -16,5 +16,8 @@ -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; -(NSString *) randomNucleotide; -(void) mutate: (int) percentToReplace; +-(void) initNucleotides; +-(id) initWithDNAlength: (NSInteger) length; +-(NSString *) DNAtoString; @end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index 5b14ac0..bd4c529 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -21,25 +21,43 @@ -(id) init if (self) { - // Size of DNA array. - int DNAsize = 100; - - // Possible elements. - nucleotide = [[NSArray alloc] initWithObjects:@"A", @"C", @"G", @"T", nil]; - - // First init of DNA array. - DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; - - // Fill with random nucleotides from corresponding array. - for (NSInteger i=0; i < DNAsize; i++) - { - [DNA setObject:[self randomNucleotide] atIndexedSubscript:i]; - } + [self initNucleotides]; + [self initDNAWithlength:100]; } return self; } +-(id) initWithDNAlength: (NSInteger) length +{ + if (self = [super init]) + { + [self initNucleotides]; + [self initDNAWithlength:length]; + } + return self; +} + +-(void) initDNAWithlength: (NSInteger) length +{ + int DNAsize = (int) length; + + // First init of DNA array. + DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; + + // Fill with random nucleotides from corresponding array. + for (NSInteger i=0; i < DNAsize; i++) + { + [DNA setObject:[self randomNucleotide] atIndexedSubscript:i]; + } +} + +-(void) initNucleotides +{ + // Possible elements. + nucleotide = [[NSArray alloc] initWithObjects:@"A", @"C", @"G", @"T", nil]; +} + -(int) hammingDistance: (Cell *) cell { int dist = 0; @@ -63,6 +81,7 @@ -(int) hammingDistance: (Cell *) cell return dist; } + // Returns the size of DNA array. -(NSInteger) DNAsize { @@ -138,4 +157,14 @@ -(void) mutate: (int) percentToReplace } } +-(NSString *) DNAtoString +{ + NSMutableString *output = [[NSMutableString alloc] init]; + for (NSInteger i = 0; i < [self DNAsize]; i++) + { + [output appendString: [self getDNAatIndex:i]]; + } + return output; +} + @end diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index d906d07..b0a74bd 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -1317,7 +1317,6 @@ 268 {{17, 306}, {118, 17}} - _NS:1535 YES @@ -1357,7 +1356,6 @@ 268 {{17, 272}, {118, 17}} - _NS:1535 YES @@ -1377,7 +1375,6 @@ 268 {{17, 239}, {118, 17}} - _NS:1535 YES @@ -1397,13 +1394,12 @@ 268 {{140, 301}, {51, 22}} - _NS:9 YES -1804599231 - 71304192 + 71304256 5000 _NS:9 @@ -1431,13 +1427,12 @@ 268 {{140, 267}, {51, 22}} - _NS:9 YES -1804599231 - 71304192 + -2076179456 50 _NS:9 @@ -1452,7 +1447,6 @@ 268 {{140, 234}, {51, 22}} - _NS:9 YES @@ -1471,9 +1465,8 @@ 268 - {{197, 300}, {290, 21}} + {{197, 301}, {290, 21}} - _NS:9 YES @@ -1498,7 +1491,6 @@ 268 {{197, 267}, {290, 21}} - _NS:9 YES @@ -1523,7 +1515,6 @@ 268 {{197, 234}, {290, 21}} - _NS:9 YES @@ -1548,7 +1539,6 @@ 268 {{17, 214}, {118, 17}} - _NS:1535 YES @@ -1568,7 +1558,6 @@ 268 {{137, 214}, {57, 17}} - _NS:1535 YES @@ -1588,7 +1577,6 @@ 268 {{17, 189}, {118, 17}} - _NS:1535 YES @@ -1608,7 +1596,6 @@ 268 {{17, 164}, {118, 17}} - _NS:1535 YES @@ -1628,7 +1615,6 @@ 268 {{137, 189}, {57, 17}} - _NS:1535 YES @@ -1648,7 +1634,6 @@ 268 {{20, 48}, {465, 108}} - _NS:9 {250, 750} @@ -1670,7 +1655,6 @@ 268 {{14, 12}, {132, 32}} - _NS:9 YES @@ -1694,8 +1678,6 @@ 268 {{357, 12}, {134, 32}} - - _NS:9 YES @@ -1718,7 +1700,6 @@ 268 {{146, 12}, {77, 32}} - _NS:9 YES @@ -1740,7 +1721,6 @@ {505, 343} - {{0, 0}, {1280, 778}} @@ -2442,27 +2422,75 @@ - tfPopulationSize + tfGoalDNA - + - 1346 + 1456 - - tfDNAlength - - + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + - 1347 + 1434 - - tfMutationRate - - + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1437 + + + + value: self.dnaLength + + + + + + value: self.dnaLength + value + self.dnaLength + 2 + + + 1455 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + - 1348 + 1443 @@ -2488,29 +2516,29 @@ 1362 + + + takeIntValueFrom: + + + + 1363 + - value: self.DNAlength + value: self.dnaLength - value: self.DNAlength + value: self.dnaLength value - self.DNAlength + self.dnaLength 2 - 1360 - - - - takeIntValueFrom: - - - - 1363 + 1450 @@ -3851,7 +3879,6 @@ - @@ -3863,6 +3890,7 @@ + @@ -4439,6 +4467,7 @@ 1214 + @@ -5215,52 +5244,9 @@ - 1426 - - - - - AppDelegate - NSObject - - NSTextField - NSTextField - NSTextField - NSWindow - - - - tfDNAlength - NSTextField - - - tfMutationRate - NSTextField - - - tfPopulationSize - NSTextField - - - window - NSWindow - - - - IBProjectSource - ./Classes/AppDelegate.h - - - - NSLayoutConstraint - NSObject - - IBProjectSource - ./Classes/NSLayoutConstraint.h - - - + 1456 + 0 IBCocoaFramework YES From 7ad03ecb05e563e823c7770cdbde2655f051e0bd Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Sun, 6 Jan 2013 23:43:33 +0400 Subject: [PATCH 03/12] =?UTF-8?q?=D0=A1=D0=BA=D1=80=D0=B5=D1=89=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 20760 -> 18605 bytes .../xcdebugger/Breakpoints.xcbkptlist | 19 +++- iDNA/iDNA/AppDelegate.h | 1 + iDNA/iDNA/AppDelegate.m | 7 +- iDNA/iDNA/Cell.h | 2 +- iDNA/iDNA/Cell.m | 89 ++++++++++-------- iDNA/iDNA/en.lproj/MainMenu.xib | 12 ++- 7 files changed, 83 insertions(+), 47 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index c8ce41fd9805dfb1e96e84b1c7ba4cb5c14e6c40..dafeb196b4624f390adc46f293e9b257625ca237 100644 GIT binary patch delta 9171 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 delta 10732 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 cH)nsI{bly4`ZKElLhoGfA*RG10eb=cK`qY diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 9d4d47a..e2351a3 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,13 +8,26 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379191785.375565" + timestampString = "379192740.530171" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "53" - endingLineNumber = "53" + startingLineNumber = "59" + endingLineNumber = "59" landmarkName = "-setDnaLength:" landmarkType = "5"> + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index bde2c00..26a8b9f 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -22,5 +22,6 @@ @property (assign) IBOutlet NSWindow *window; @property (weak) IBOutlet NSTextField *tfGoalDNA; +- (IBAction)startEvolution:(id)sender; @end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 63d5f18..0b0ee1b 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -36,6 +36,12 @@ - (void) applicationDidFinishLaunching:(NSNotification *)aNotification [self createGoalDNA]; } +- (IBAction)startEvolution:(id)sender +{ + +} + +// Create new goal DNA and sets value to corresponding text field. - (void) createGoalDNA { goalDNA = [[Cell alloc] initWithDNAlength:dnaLength]; @@ -63,5 +69,4 @@ - (void) setPopulationSize: (NSInteger) x { populationSize = MIN(x, maxPopulationSize); } - @end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index d53cb1c..f00b988 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -15,9 +15,9 @@ -(NSString *) getDNAatIndex: (NSInteger)index; -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; -(NSString *) randomNucleotide; --(void) mutate: (int) percentToReplace; -(void) initNucleotides; -(id) initWithDNAlength: (NSInteger) length; -(NSString *) DNAtoString; +-(Cell *) crossWithCell: (Cell *) otherCell; @end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index bd4c529..77aaf0d 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -114,47 +114,56 @@ -(NSString *) randomNucleotide return @""; } --(void) mutate: (int) percentToReplace +-(Cell *) crossWithCell: (Cell *) otherCell { - // Explicit number of element to replace. - NSInteger replace = percentToReplace * [self DNAsize] / 100; - - // Some preparation in case of data out of range. - if (replace < 0) - replace = 0; - if (replace > [self DNAsize]) - replace = [self DNAsize]; - - // Nothing to do here. - if (replace == 0) - return; - - NSInteger i = 0; - - // Array that stores indices to replace. - NSMutableArray *indicesToReplace = [[NSMutableArray alloc] initWithCapacity:[self DNAsize]]; - for (i = 0; i < [self DNAsize]; i++) - [indicesToReplace setObject:[NSNumber numberWithInteger:i] atIndexedSubscript:i]; - // Shuffle it! - [indicesToReplace shuffle]; - - // To store generated nucleotide. - NSString *tempNucleotide = [[NSString alloc] init]; - NSInteger DNAindex = 0; - - for (i = 0; i < replace; i++) - { - // Index of DNA array. - DNAindex = [[indicesToReplace objectAtIndex:i] integerValue]; - // Generate string different from that in DNA array. - do - { - tempNucleotide = [self randomNucleotide]; - } - while ([[self getDNAatIndex:DNAindex] isEqualToString:tempNucleotide]); - - [self setDNA:tempNucleotide atIndex:DNAindex]; - } + switch (arc4random_uniform(3)) + { + case 0: + return [self crossByHalfWithCell:otherCell]; + case 1: + return [self crossByOnePercentWithCell:otherCell]; + case 2: + return [self crossByPartsWithCell:otherCell]; + default: return self; + } +} + +-(Cell *) crossByHalfWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + Cell *newCell = [self copy]; + + for (NSInteger i = [self DNAsize] / 2; i<[self DNAsize]; i++) + [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + + return newCell; +} + +-(Cell *) crossByOnePercentWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + Cell *newCell = [self copy]; + + // Simpler method described in module video. + for (NSInteger i = 0; i < [self DNAsize]; i++) + { + if (i % 2 == 1) + [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + } + return newCell; +} + +-(Cell *) crossByPartsWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + Cell *newCell = [self copy]; + + for (NSInteger i = [self DNAsize]/5; i < 4*[self DNAsize]/5; i++) + [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return newCell; } -(NSString *) DNAtoString diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index b0a74bd..c182fe0 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -1704,7 +1704,7 @@ _NS:9 YES - 67108864 + 603979776 134217728 Pause @@ -2428,6 +2428,14 @@ 1456 + + + startEvolution: + + + + 1457 + value: self.populationSize @@ -5244,7 +5252,7 @@ - 1456 + 1457 0 From 8513ea37b467c5e6842c3bb9918c3fc5c108211a Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Mon, 7 Jan 2013 00:56:55 +0400 Subject: [PATCH 04/12] =?UTF-8?q?=D0=AD=D0=B2=D0=BE=D0=BB=D1=8E=D1=86?= =?UTF-8?q?=D0=B8=D1=8F.=20=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 7 ++ .../UserInterfaceState.xcuserstate | Bin 18605 -> 19636 bytes .../xcdebugger/Breakpoints.xcbkptlist | 23 +++- iDNA/iDNA/AppDelegate.h | 20 +++- iDNA/iDNA/AppDelegate.m | 33 +++++- iDNA/iDNA/Cell.h | 1 + iDNA/iDNA/Cell.m | 47 +++++++- iDNA/iDNA/Evolution.h | 26 +++++ iDNA/iDNA/Evolution.m | 109 ++++++++++++++++++ iDNA/iDNA/en.lproj/MainMenu.xib | 82 ++++++++++++- 10 files changed, 333 insertions(+), 15 deletions(-) create mode 100644 iDNA/iDNA/Evolution.h create mode 100644 iDNA/iDNA/Evolution.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index 164bb64..b7eb003 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA311689DF2600034395 /* MainMenu.xib */; }; 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; + 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7E761D169A0BBA0089D9C8 /* Evolution.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -35,6 +36,8 @@ 0D6AEA421689FE7300034395 /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+Shuffle.h"; sourceTree = ""; }; 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+Shuffle.m"; sourceTree = ""; }; + 0D7E761C169A0BBA0089D9C8 /* Evolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Evolution.h; sourceTree = ""; }; + 0D7E761D169A0BBA0089D9C8 /* Evolution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Evolution.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -88,6 +91,8 @@ 0D6AEA221689DF2600034395 /* iDNA */ = { isa = PBXGroup; children = ( + 0D7E761C169A0BBA0089D9C8 /* Evolution.h */, + 0D7E761D169A0BBA0089D9C8 /* Evolution.m */, 0D6AEA411689FE7300034395 /* Cell.h */, 0D6AEA421689FE7300034395 /* Cell.m */, 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */, @@ -180,6 +185,7 @@ 0D6AEA301689DF2600034395 /* AppDelegate.m in Sources */, 0D6AEA431689FE7400034395 /* Cell.m in Sources */, 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */, + 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -309,6 +315,7 @@ 0D6AEA381689DF2600034395 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index dafeb196b4624f390adc46f293e9b257625ca237..7ea67d9f2bc5231eb898c1157c3b3bcc7734fe4f 100644 GIT binary patch delta 9341 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 + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 26a8b9f..5cdab57 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -8,6 +8,7 @@ #import #import "Cell.h" +#import "Evolution.h" @interface AppDelegate : NSObject { @@ -15,13 +16,26 @@ NSInteger dnaLength; NSInteger mutationRate; - Cell *goalDNA; + Evolution *evolution; } -- (void) createGoalDNA; - @property (assign) IBOutlet NSWindow *window; + +// Text fields. +@property (weak) IBOutlet NSTextField *tfPopulationSize; +@property (weak) IBOutlet NSTextField *tfDnaLength; +@property (weak) IBOutlet NSTextField *tfMutationRate; @property (weak) IBOutlet NSTextField *tfGoalDNA; +// Sliders. +@property (weak) IBOutlet NSSlider *slPopulationSize; +@property (weak) IBOutlet NSSlider *slDnaLength; +@property (weak) IBOutlet NSSlider *slMutationRate; +// Buttons. +@property (weak) IBOutlet NSButton *btStartEvolution; +@property (weak) IBOutlet NSButton *btPause; +@property (weak) IBOutlet NSButton *btLoadGoalDNA; + - (IBAction)startEvolution:(id)sender; +- (IBAction)pause:(id)sender; @end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 0b0ee1b..0ee8ca5 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -33,19 +33,39 @@ - (id) init - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { - [self createGoalDNA]; + evolution = [[Evolution alloc] init]; + [self setGoalDNA]; } - (IBAction)startEvolution:(id)sender { + [self setInputsEnabled:NO]; +} + +- (IBAction)pause:(id)sender +{ + [self setInputsEnabled:YES]; +} + +- (void) setInputsEnabled: (Boolean) status +{ + [_btLoadGoalDNA setEnabled:status]; + [_btStartEvolution setEnabled:status]; + [_btPause setEnabled:!status]; + + [_tfDnaLength setEnabled:status]; + [_tfMutationRate setEnabled:status]; + [_tfPopulationSize setEnabled:status]; + [_slDnaLength setEnabled:status]; + [_slMutationRate setEnabled:status]; + [_slPopulationSize setEnabled:status]; } // Create new goal DNA and sets value to corresponding text field. -- (void) createGoalDNA +- (void) setGoalDNA { - goalDNA = [[Cell alloc] initWithDNAlength:dnaLength]; - [_tfGoalDNA setStringValue:[goalDNA DNAtoString]]; + [_tfGoalDNA setStringValue:[[evolution createGoalDNAWithLength:dnaLength] DNAtoString]]; } // Getters. @@ -57,16 +77,19 @@ - (NSInteger) populationSize { return populationSize; } - (void) setDnaLength: (NSInteger) x { dnaLength = MIN(x, maxDnaLength); - [self createGoalDNA]; + [_tfDnaLength setStringValue:[NSString stringWithFormat:@"%ld", dnaLength]]; + [self setGoalDNA]; } - (void) setMutationRate: (NSInteger) x { mutationRate = MIN(x, maxMutationRate); + [_tfMutationRate setStringValue:[NSString stringWithFormat:@"%ld", mutationRate]]; } - (void) setPopulationSize: (NSInteger) x { populationSize = MIN(x, maxPopulationSize); + [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", populationSize]]; } @end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index f00b988..c789a2a 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -19,5 +19,6 @@ -(id) initWithDNAlength: (NSInteger) length; -(NSString *) DNAtoString; -(Cell *) crossWithCell: (Cell *) otherCell; +-(void) mutate: (NSInteger) percentToReplace; @end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index 77aaf0d..f5f8576 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -124,7 +124,8 @@ -(Cell *) crossWithCell: (Cell *) otherCell return [self crossByOnePercentWithCell:otherCell]; case 2: return [self crossByPartsWithCell:otherCell]; - default: return self; + default: + return self; } } @@ -166,6 +167,50 @@ -(Cell *) crossByPartsWithCell: (Cell *) otherCell return newCell; } +-(void) mutate: (NSInteger) percentToReplace +{ + // Explicit number of element to replace. + NSInteger replace = percentToReplace * [self DNAsize] / 100; + + // Some preparation in case of data out of range. + if (replace < 0) + replace = 0; + if (replace > [self DNAsize]) + replace = [self DNAsize]; + + // Nothing to do here. + if (replace == 0) + return; + + NSInteger i = 0; + + // Array that stores indices to replace. + NSMutableArray *indicesToReplace = [[NSMutableArray alloc] initWithCapacity:[self DNAsize]]; + for (i = 0; i < [self DNAsize]; i++) + [indicesToReplace setObject:[NSNumber numberWithInteger:i] atIndexedSubscript:i]; + // Shuffle it! + [indicesToReplace shuffle]; + + // To store generated nucleotide. + NSString *tempNucleotide = [[NSString alloc] init]; + NSInteger DNAindex = 0; + + for (i = 0; i < replace; i++) + { + // Index of DNA array. + DNAindex = [[indicesToReplace objectAtIndex:i] integerValue]; + // Generate string different from that in DNA array. + do + { + tempNucleotide = [self randomNucleotide]; + } + while ([[self getDNAatIndex:DNAindex] isEqualToString:tempNucleotide]); + + [self setDNA:tempNucleotide atIndex:DNAindex]; + } +} + +// Returns DNA as string. -(NSString *) DNAtoString { NSMutableString *output = [[NSMutableString alloc] init]; diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h new file mode 100644 index 0000000..176b9d5 --- /dev/null +++ b/iDNA/iDNA/Evolution.h @@ -0,0 +1,26 @@ +// +// Evolution.h +// iDNA +// +// Created by n on 06.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import +#import "Cell.h" + +@interface Evolution : NSObject +{ + NSInteger step; + Boolean finished; + Boolean started; + + NSInteger mutationRate; + NSMutableArray *population; + Cell *goalDNA; +} + +-(Cell *) createGoalDNAWithLength:(NSInteger) length; +-(void) creatPopulationWithSize:(NSInteger) populationSize andDNALength:(NSInteger) dnaLength; + +@end diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m new file mode 100644 index 0000000..7a8b4dc --- /dev/null +++ b/iDNA/iDNA/Evolution.m @@ -0,0 +1,109 @@ +// +// Evolution.m +// iDNA +// +// Created by n on 06.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import "Evolution.h" + +@implementation Evolution + +-(id) init +{ + if (self = [super init]) + { + step = 0; + finished = NO; + started = NO; + } + return self; +} + +// Create goal DNA with given length. +-(Cell *) createGoalDNAWithLength:(NSInteger) length +{ + goalDNA = [[Cell alloc] initWithDNAlength:length]; + return goalDNA; +} + +// Init population with given parameters. +-(void) creatPopulationWithSize:(NSInteger) populationSize andDNALength:(NSInteger) dnaLength +{ + population = [[NSMutableArray alloc] initWithCapacity:populationSize]; + for (NSInteger i = 0; i < populationSize; i++) + { + [population setObject:[[Cell alloc] initWithDNAlength:dnaLength] atIndexedSubscript:i]; + } +} + +// Sets mutation rate. +-(void) setMutationRate: (NSInteger) rate +{ + mutationRate = rate; +} + +// Performs one step of evolution. +-(void) perfomStep +{ + [self sortPopulation]; + if ([self isZeroHammingDistance]) + { + finished = YES; + return; + } + + [self crossPopulation]; + [self mutatePopulation]; +} + +// Sort population by hamming distance. +- (void) sortPopulation +{ + NSArray *sorted = [population sortedArrayUsingComparator:^NSComparisonResult (id a, id b){ + NSNumber *first = [NSNumber numberWithInt:[(Cell *)a hammingDistance:goalDNA]]; + NSNumber *second = [NSNumber numberWithInt:[(Cell *)b hammingDistance:goalDNA]]; + return [first compare:second]; + }]; + population = [sorted mutableCopy]; +} + +// Cross first half of population and replace the second. +- (void) crossPopulation +{ + for (NSInteger i = ceil([population count] / 2); i < [population count]; i++) + { + [population setObject:[self crossDNAfromTop] atIndexedSubscript:i]; + } +} + +// Crosses two random DNA from first half. +- (Cell *) crossDNAfromTop +{ + int half = ceil([population count] / 2); + Cell *cell1 = [population objectAtIndex:arc4random_uniform(half)]; + Cell *cell2 = [population objectAtIndex:arc4random_uniform(half)]; + + return [cell1 crossWithCell:cell2]; +} + +// Mutate the whole population. +- (void) mutatePopulation +{ + for (Cell *cell in population) + [cell mutate:mutationRate]; +} + +// Checks whether there is cell with hamming distance = 0. +// Implying the population array is sorted. +- (Boolean) isZeroHammingDistance +{ + if ([population count] < 1) + return NO; + if ([goalDNA hammingDistance:[population objectAtIndex:0]] == 0) + return YES; + return NO; +} + +@end diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index c182fe0..d6ad1dd 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -2436,6 +2436,86 @@ 1457 + + + tfPopulationSize + + + + 1458 + + + + tfDnaLength + + + + 1459 + + + + tfMutationRate + + + + 1460 + + + + slPopulationSize + + + + 1461 + + + + slDnaLength + + + + 1462 + + + + slMutationRate + + + + 1463 + + + + btStartEvolution + + + + 1464 + + + + btPause + + + + 1465 + + + + btLoadGoalDNA + + + + 1466 + + + + pause: + + + + 1467 + value: self.populationSize @@ -5252,7 +5332,7 @@ - 1457 + 1467 0 From c5c670d2f69abfb6f70bbd27ff7c80d2cadd5007 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Mon, 7 Jan 2013 04:37:53 +0400 Subject: [PATCH 05/12] =?UTF-8?q?=D0=AD=D0=B2=D0=BE=D0=BB=D1=8E=D1=86?= =?UTF-8?q?=D0=B8=D1=8F.=20=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 19636 -> 19850 bytes .../xcdebugger/Breakpoints.xcbkptlist | 25 +++++++++++++----- iDNA/iDNA/AppDelegate.m | 4 +++ iDNA/iDNA/Cell.h | 1 + iDNA/iDNA/Cell.m | 20 +++++++++++--- iDNA/iDNA/Evolution.h | 15 ++++++++--- iDNA/iDNA/Evolution.m | 23 +++++++++++----- 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index 7ea67d9f2bc5231eb898c1157c3b3bcc7734fe4f..24acc1f1caafd0bd34e2caed196e8a1a3c135b7f 100644 GIT binary patch delta 8836 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 JzWvT=^?#Unbk6_) delta 8659 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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 1d68c05..a10551a 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379195807.911365" + timestampString = "379211338.488247" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "79" - endingLineNumber = "79" + startingLineNumber = "83" + endingLineNumber = "83" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -34,13 +34,26 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "379194868.131089" + timestampString = "379211338.488247" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "25" - endingLineNumber = "25" + startingLineNumber = "26" + endingLineNumber = "26" landmarkName = "-createGoalDNAWithLength:" landmarkType = "5"> + + diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 0ee8ca5..a0ca667 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -40,6 +40,10 @@ - (void) applicationDidFinishLaunching:(NSNotification *)aNotification - (IBAction)startEvolution:(id)sender { [self setInputsEnabled:NO]; + [evolution setMutationRate:mutationRate]; + [evolution setPopulationSize:populationSize]; + [evolution setDnaLength:dnaLength]; + [evolution go]; } - (IBAction)pause:(id)sender diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index c789a2a..93c8962 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -16,6 +16,7 @@ -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; -(NSString *) randomNucleotide; -(void) initNucleotides; +-(id) initWithCell: (Cell *) cell; -(id) initWithDNAlength: (NSInteger) length; -(NSString *) DNAtoString; -(Cell *) crossWithCell: (Cell *) otherCell; diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index f5f8576..85fc15c 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -38,6 +38,20 @@ -(id) initWithDNAlength: (NSInteger) length return self; } +-(id) initWithCell: (Cell *) cell +{ + if (self = [super init]) + { + [self initNucleotides]; + + NSInteger DNAsize = [cell DNAsize]; + DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; + for (NSInteger i = 0; i < DNAsize; i++) + [DNA setObject:[cell getDNAatIndex:i] atIndexedSubscript:i]; + } + return self; +} + -(void) initDNAWithlength: (NSInteger) length { int DNAsize = (int) length; @@ -133,7 +147,7 @@ -(Cell *) crossByHalfWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [self copy]; + Cell *newCell = [[Cell alloc] initWithCell:self]; for (NSInteger i = [self DNAsize] / 2; i<[self DNAsize]; i++) [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; @@ -145,7 +159,7 @@ -(Cell *) crossByOnePercentWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [self copy]; + Cell *newCell = [[Cell alloc] initWithCell:self]; // Simpler method described in module video. for (NSInteger i = 0; i < [self DNAsize]; i++) @@ -160,7 +174,7 @@ -(Cell *) crossByPartsWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [self copy]; + Cell *newCell = [[Cell alloc] initWithCell:self]; for (NSInteger i = [self DNAsize]/5; i < 4*[self DNAsize]/5; i++) [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h index 176b9d5..2b5660d 100644 --- a/iDNA/iDNA/Evolution.h +++ b/iDNA/iDNA/Evolution.h @@ -9,18 +9,27 @@ #import #import "Cell.h" +#define INIT 0 +#define STARTED 1 +#define FINISHED 2 +#define PAUSED 3 + @interface Evolution : NSObject { NSInteger step; - Boolean finished; - Boolean started; + NSInteger state; NSInteger mutationRate; + NSInteger populationSize; + NSInteger dnaLength; NSMutableArray *population; Cell *goalDNA; } -(Cell *) createGoalDNAWithLength:(NSInteger) length; --(void) creatPopulationWithSize:(NSInteger) populationSize andDNALength:(NSInteger) dnaLength; +-(void) setMutationRate: (NSInteger) rate; +-(void) setPopulationSize: (NSInteger) size; +-(void) setDnaLength: (NSInteger) length; +-(void) go; @end diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m index 7a8b4dc..1aa142b 100644 --- a/iDNA/iDNA/Evolution.m +++ b/iDNA/iDNA/Evolution.m @@ -15,8 +15,7 @@ -(id) init if (self = [super init]) { step = 0; - finished = NO; - started = NO; + state = INIT; } return self; } @@ -29,7 +28,7 @@ -(Cell *) createGoalDNAWithLength:(NSInteger) length } // Init population with given parameters. --(void) creatPopulationWithSize:(NSInteger) populationSize andDNALength:(NSInteger) dnaLength +-(void) creatPopulation { population = [[NSMutableArray alloc] initWithCapacity:populationSize]; for (NSInteger i = 0; i < populationSize; i++) @@ -38,10 +37,20 @@ -(void) creatPopulationWithSize:(NSInteger) populationSize andDNALength:(NSInteg } } -// Sets mutation rate. --(void) setMutationRate: (NSInteger) rate +// Setters. +-(void) setMutationRate: (NSInteger) rate { mutationRate = rate; } +-(void) setPopulationSize: (NSInteger) size { populationSize = size; } +-(void) setDnaLength: (NSInteger) length { dnaLength = length; } + +-(void) go { - mutationRate = rate; + if (state == INIT) + { + [self creatPopulation]; + state = STARTED; + } + while (state == STARTED) + [self perfomStep]; } // Performs one step of evolution. @@ -50,7 +59,7 @@ -(void) perfomStep [self sortPopulation]; if ([self isZeroHammingDistance]) { - finished = YES; + state = FINISHED; return; } From 9fc7205ba7fa30935256933414f02471df589e89 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Wed, 9 Jan 2013 19:27:11 +0400 Subject: [PATCH 06/12] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=87=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=8D=D0=B2=D0=BE=D0=BB=D1=8E=D1=86=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 122 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 19850 -> 24012 bytes .../xcdebugger/Breakpoints.xcbkptlist | 57 ++++++-- .../xcschemes/iDNAtests.xcscheme | 53 ++++++++ .../xcschemes/xcschememanagement.plist | 10 ++ iDNA/iDNA/AppDelegate.h | 3 + iDNA/iDNA/AppDelegate.m | 63 ++++++++- iDNA/iDNA/Evolution.h | 13 +- iDNA/iDNA/Evolution.m | 32 ++++- iDNA/iDNA/en.lproj/MainMenu.xib | 20 ++- iDNA/iDNAtests/en.lproj/InfoPlist.strings | 2 + iDNA/iDNAtests/iDNAtests-Info.plist | 22 ++++ iDNA/iDNAtests/iDNAtests-Prefix.pch | 7 + iDNA/iDNAtests/iDNAtests.h | 13 ++ iDNA/iDNAtests/iDNAtests.m | 24 ++++ 15 files changed, 414 insertions(+), 27 deletions(-) create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme create mode 100644 iDNA/iDNAtests/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNAtests/iDNAtests-Info.plist create mode 100644 iDNA/iDNAtests/iDNAtests-Prefix.pch create mode 100644 iDNA/iDNAtests/iDNAtests.h create mode 100644 iDNA/iDNAtests/iDNAtests.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index b7eb003..c237e5e 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -16,8 +16,20 @@ 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7E761D169A0BBA0089D9C8 /* Evolution.m */; }; + 0D7E762F169B11AC0089D9C8 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */; }; + 0D7E7630169B11AC0089D9C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D6AEA1C1689DF2600034395 /* Cocoa.framework */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 0D7E763E169B123B0089D9C8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0D6AEA0F1689DF2600034395 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0D6AEA171689DF2600034395; + remoteInfo = iDNA; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 0D6AEA181689DF2600034395 /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0D6AEA1C1689DF2600034395 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -38,6 +50,8 @@ 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+Shuffle.m"; sourceTree = ""; }; 0D7E761C169A0BBA0089D9C8 /* Evolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Evolution.h; sourceTree = ""; }; 0D7E761D169A0BBA0089D9C8 /* Evolution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Evolution.m; sourceTree = ""; }; + 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iDNAtests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -49,6 +63,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 0D7E7629169B11AC0089D9C8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D7E762F169B11AC0089D9C8 /* SenTestingKit.framework in Frameworks */, + 0D7E7630169B11AC0089D9C8 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -65,6 +88,7 @@ isa = PBXGroup; children = ( 0D6AEA181689DF2600034395 /* iDNA.app */, + 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */, ); name = Products; sourceTree = ""; @@ -73,6 +97,7 @@ isa = PBXGroup; children = ( 0D6AEA1C1689DF2600034395 /* Cocoa.framework */, + 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */, 0D6AEA1E1689DF2600034395 /* Other Frameworks */, ); name = Frameworks; @@ -137,6 +162,25 @@ productReference = 0D6AEA181689DF2600034395 /* iDNA.app */; productType = "com.apple.product-type.application"; }; + 0D7E762C169B11AC0089D9C8 /* iDNAtests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D7E763B169B11AC0089D9C8 /* Build configuration list for PBXNativeTarget "iDNAtests" */; + buildPhases = ( + 0D7E7628169B11AC0089D9C8 /* Sources */, + 0D7E7629169B11AC0089D9C8 /* Frameworks */, + 0D7E762A169B11AC0089D9C8 /* Resources */, + 0D7E762B169B11AC0089D9C8 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 0D7E763F169B123B0089D9C8 /* PBXTargetDependency */, + ); + name = iDNAtests; + productName = iDNAtests; + productReference = 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -159,6 +203,7 @@ projectRoot = ""; targets = ( 0D6AEA171689DF2600034395 /* iDNA */, + 0D7E762C169B11AC0089D9C8 /* iDNAtests */, ); }; /* End PBXProject section */ @@ -174,8 +219,31 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 0D7E762A169B11AC0089D9C8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 0D7E762B169B11AC0089D9C8 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 0D6AEA141689DF2600034395 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -189,8 +257,23 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 0D7E7628169B11AC0089D9C8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 0D7E763F169B123B0089D9C8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0D6AEA171689DF2600034395 /* iDNA */; + targetProxy = 0D7E763E169B123B0089D9C8 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 0D6AEA251689DF2600034395 /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -290,12 +373,43 @@ COMBINE_HIDPI_IMAGES = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; + 0D7E763C169B11AC0089D9C8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/iDNA"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\""; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNAtests/iDNAtests-Prefix.pch"; + INFOPLIST_FILE = "iDNAtests/iDNAtests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + 0D7E763D169B11AC0089D9C8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/iDNA"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\""; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNAtests/iDNAtests-Prefix.pch"; + INFOPLIST_FILE = "iDNAtests/iDNAtests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -317,6 +431,14 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 0D7E763B169B11AC0089D9C8 /* Build configuration list for PBXNativeTarget "iDNAtests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D7E763C169B11AC0089D9C8 /* Debug */, + 0D7E763D169B11AC0089D9C8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 0D6AEA0F1689DF2600034395 /* Project object */; diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index 24acc1f1caafd0bd34e2caed196e8a1a3c135b7f..281d6d54e39cb6b14a53e13bd9a42633beb2e95e 100644 GIT binary patch literal 24012 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 literal 19850 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 HS>68uqFIaR diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index a10551a..24827b8 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379211338.488247" + timestampString = "379437940.278291" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "83" - endingLineNumber = "83" + startingLineNumber = "132" + endingLineNumber = "132" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379195559.015468" + timestampString = "379437630.550915" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "41" - endingLineNumber = "41" + startingLineNumber = "63" + endingLineNumber = "63" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -34,11 +34,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "379211338.488247" + timestampString = "379263174.792226" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "26" - endingLineNumber = "26" + startingLineNumber = "29" + endingLineNumber = "29" landmarkName = "-createGoalDNAWithLength:" landmarkType = "5"> @@ -55,5 +55,44 @@ landmarkName = "-initWithCell:" landmarkType = "5"> + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme new file mode 100644 index 0000000..f6304b9 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist index 65f6c8c..35fd38b 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 0 + iDNAtests.xcscheme + + orderHint + 1 + SuppressBuildableAutocreation @@ -17,6 +22,11 @@ primary + 0D7E762C169B11AC0089D9C8 + + primary + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 5cdab57..344c9e4 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -34,6 +34,9 @@ @property (weak) IBOutlet NSButton *btStartEvolution; @property (weak) IBOutlet NSButton *btPause; @property (weak) IBOutlet NSButton *btLoadGoalDNA; +// Labels. +@property (weak) IBOutlet NSTextField *lbGeneration; +@property (weak) IBOutlet NSTextField *lbBestMatch; - (IBAction)startEvolution:(id)sender; - (IBAction)pause:(id)sender; diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index a0ca667..4125cbb 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -23,9 +23,9 @@ - (id) init maxMutationRate = 100; maxPopulationSize = 10000; - dnaLength = 50; - mutationRate = 50; - populationSize = 5000; + dnaLength = maxDnaLength / 2; + mutationRate = maxMutationRate / 2; + populationSize = maxPopulationSize / 2; } return self; @@ -33,24 +33,73 @@ - (id) init - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { + [_slDnaLength setIntegerValue:dnaLength]; + [_slMutationRate setIntegerValue:mutationRate]; + [_slPopulationSize setIntegerValue:populationSize]; + evolution = [[Evolution alloc] init]; [self setGoalDNA]; + [self addObserver:self forKeyPath:@"dnaLength" options:NSKeyValueObservingOptionNew context:nil]; + [self addObserver:self forKeyPath:@"mutationRate" options:NSKeyValueObservingOptionNew context:nil]; + [self addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionNew context:nil]; +} + +-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // If any of parameters was changed we should reset evolution. + [evolution reset]; + [self setLabelForGeneration:0]; + [self setLabelForBestMatch:dnaLength]; +} + +-(void) dealloc +{ + [self removeObserver:self forKeyPath:@"dnaLength"]; + [self removeObserver:self forKeyPath:@"mutationRate"]; + [self removeObserver:self forKeyPath:@"populationSize"]; } - (IBAction)startEvolution:(id)sender +{ + [self performSelectorInBackground:@selector(evolve) withObject:nil]; +} + +// Evolve in background. +-(void) evolve { [self setInputsEnabled:NO]; - [evolution setMutationRate:mutationRate]; - [evolution setPopulationSize:populationSize]; - [evolution setDnaLength:dnaLength]; - [evolution go]; + + if ([evolution state] == INIT) + [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; + else if ([evolution state] == PAUSED) + [evolution setState:STARTED]; + + while ([evolution state] == STARTED) + { + [evolution perfomStep]; + [self setLabelForGeneration:[evolution step]]; + [self setLabelForBestMatch:[evolution bestHammingDistance]]; + } + [self setInputsEnabled:YES]; } +// Pause button pressed. - (IBAction)pause:(id)sender { + [evolution setState:PAUSED]; [self setInputsEnabled:YES]; } +-(void) setLabelForGeneration: (NSInteger) step +{ + [_lbGeneration setStringValue:[NSString stringWithFormat:@"%ld", step]]; +} + +-(void) setLabelForBestMatch: (NSInteger) hammingDistance +{ + [_lbBestMatch setStringValue:[NSString stringWithFormat:@"%ld", 100 - 100 * hammingDistance / dnaLength]]; +} + - (void) setInputsEnabled: (Boolean) status { [_btLoadGoalDNA setEnabled:status]; diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h index 2b5660d..a1ba5e9 100644 --- a/iDNA/iDNA/Evolution.h +++ b/iDNA/iDNA/Evolution.h @@ -9,6 +9,7 @@ #import #import "Cell.h" +// States of evolution process. #define INIT 0 #define STARTED 1 #define FINISHED 2 @@ -22,14 +23,18 @@ NSInteger mutationRate; NSInteger populationSize; NSInteger dnaLength; + NSMutableArray *population; Cell *goalDNA; } -(Cell *) createGoalDNAWithLength:(NSInteger) length; --(void) setMutationRate: (NSInteger) rate; --(void) setPopulationSize: (NSInteger) size; --(void) setDnaLength: (NSInteger) length; --(void) go; +-(void) initWithMutationRate:(NSInteger)rate PopulationSize: (NSInteger) size DnaLength: (NSInteger) length; +-(void) perfomStep; +-(NSInteger) state; +-(NSInteger) step; +-(NSInteger) bestHammingDistance; +-(void) reset; +-(void) setState: (NSInteger) st; @end diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m index 1aa142b..182a925 100644 --- a/iDNA/iDNA/Evolution.m +++ b/iDNA/iDNA/Evolution.m @@ -20,6 +20,9 @@ -(id) init return self; } +-(NSInteger) state { return state; } +-(NSInteger) step { return step; } + // Create goal DNA with given length. -(Cell *) createGoalDNAWithLength:(NSInteger) length { @@ -41,21 +44,26 @@ -(void) creatPopulation -(void) setMutationRate: (NSInteger) rate { mutationRate = rate; } -(void) setPopulationSize: (NSInteger) size { populationSize = size; } -(void) setDnaLength: (NSInteger) length { dnaLength = length; } +-(void) setState: (NSInteger) st { state = st; } --(void) go +// Initialization with parameters. +-(void) initWithMutationRate:(NSInteger)rate PopulationSize: (NSInteger) size DnaLength: (NSInteger) length { + [self setMutationRate:rate]; + [self setPopulationSize:size]; + [self setDnaLength:length]; + if (state == INIT) { [self creatPopulation]; state = STARTED; } - while (state == STARTED) - [self perfomStep]; } // Performs one step of evolution. -(void) perfomStep { + step++; [self sortPopulation]; if ([self isZeroHammingDistance]) { @@ -73,9 +81,9 @@ - (void) sortPopulation NSArray *sorted = [population sortedArrayUsingComparator:^NSComparisonResult (id a, id b){ NSNumber *first = [NSNumber numberWithInt:[(Cell *)a hammingDistance:goalDNA]]; NSNumber *second = [NSNumber numberWithInt:[(Cell *)b hammingDistance:goalDNA]]; - return [first compare:second]; + return first > second; }]; - population = [sorted mutableCopy]; + population = [NSMutableArray arrayWithArray:sorted]; } // Cross first half of population and replace the second. @@ -115,4 +123,18 @@ - (Boolean) isZeroHammingDistance return NO; } +-(NSInteger) bestHammingDistance +{ + if ([population count] < 1) + return 0; + else + return [goalDNA hammingDistance:[population objectAtIndex:0]]; +} + +-(void) reset +{ + state = INIT; + step = 0; +} + @end diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index d6ad1dd..9845212 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -1700,7 +1700,7 @@ 268 {{146, 12}, {77, 32}} - + _NS:9 YES @@ -2516,6 +2516,22 @@ 1467 + + + lbGeneration + + + + 1477 + + + + lbBestMatch + + + + 1478 + value: self.populationSize @@ -5332,7 +5348,7 @@ - 1467 + 1478 0 diff --git a/iDNA/iDNAtests/en.lproj/InfoPlist.strings b/iDNA/iDNAtests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNAtests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNAtests/iDNAtests-Info.plist b/iDNA/iDNAtests/iDNAtests-Info.plist new file mode 100644 index 0000000..16679ab --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + bie.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/iDNA/iDNAtests/iDNAtests-Prefix.pch b/iDNA/iDNAtests/iDNAtests-Prefix.pch new file mode 100644 index 0000000..8e69d7b --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNAtests' target in the 'iDNAtests' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/iDNAtests/iDNAtests.h b/iDNA/iDNAtests/iDNAtests.h new file mode 100644 index 0000000..e00857d --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests.h @@ -0,0 +1,13 @@ +// +// iDNAtests.h +// iDNAtests +// +// Created by n on 07.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import + +@interface iDNAtests : SenTestCase + +@end diff --git a/iDNA/iDNAtests/iDNAtests.m b/iDNA/iDNAtests/iDNAtests.m new file mode 100644 index 0000000..13edc92 --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests.m @@ -0,0 +1,24 @@ +#import "iDNAtests.h" + +@implementation iDNAtests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in iDNAtests"); +} + +@end From 6411e89c6cee94dfa4f5cf075240edcb99429781 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Sat, 12 Jan 2013 01:40:21 +0400 Subject: [PATCH 07/12] =?UTF-8?q?=D0=93=D1=80=D0=B0=D1=84=D0=B8=D0=BA=20?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=B3=D0=BE=20hamming=20distance?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 129 +------ .../UserInterfaceState.xcuserstate | Bin 24012 -> 21998 bytes .../xcdebugger/Breakpoints.xcbkptlist | 25 +- iDNA/iDNA/AppDelegate.h | 4 + iDNA/iDNA/AppDelegate.m | 5 + iDNA/iDNA/Graph.h | 23 ++ iDNA/iDNA/Graph.m | 77 ++++ iDNA/iDNA/en.lproj/MainMenu.xib | 330 +++++++++++++----- 8 files changed, 369 insertions(+), 224 deletions(-) create mode 100644 iDNA/iDNA/Graph.h create mode 100644 iDNA/iDNA/Graph.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index c237e5e..886b163 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -16,20 +16,9 @@ 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7E761D169A0BBA0089D9C8 /* Evolution.m */; }; - 0D7E762F169B11AC0089D9C8 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */; }; - 0D7E7630169B11AC0089D9C8 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D6AEA1C1689DF2600034395 /* Cocoa.framework */; }; + 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD00A8016A05DAA00B661B2 /* Graph.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 0D7E763E169B123B0089D9C8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0D6AEA0F1689DF2600034395 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0D6AEA171689DF2600034395; - remoteInfo = iDNA; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 0D6AEA181689DF2600034395 /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0D6AEA1C1689DF2600034395 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -50,8 +39,9 @@ 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+Shuffle.m"; sourceTree = ""; }; 0D7E761C169A0BBA0089D9C8 /* Evolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Evolution.h; sourceTree = ""; }; 0D7E761D169A0BBA0089D9C8 /* Evolution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Evolution.m; sourceTree = ""; }; - 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iDNAtests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 0DD00A7F16A05DAA00B661B2 /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graph.h; sourceTree = ""; }; + 0DD00A8016A05DAA00B661B2 /* Graph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Graph.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -63,15 +53,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 0D7E7629169B11AC0089D9C8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0D7E762F169B11AC0089D9C8 /* SenTestingKit.framework in Frameworks */, - 0D7E7630169B11AC0089D9C8 /* Cocoa.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -88,7 +69,6 @@ isa = PBXGroup; children = ( 0D6AEA181689DF2600034395 /* iDNA.app */, - 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */, ); name = Products; sourceTree = ""; @@ -126,6 +106,8 @@ 0D6AEA2F1689DF2600034395 /* AppDelegate.m */, 0D6AEA311689DF2600034395 /* MainMenu.xib */, 0D6AEA231689DF2600034395 /* Supporting Files */, + 0DD00A7F16A05DAA00B661B2 /* Graph.h */, + 0DD00A8016A05DAA00B661B2 /* Graph.m */, ); path = iDNA; sourceTree = ""; @@ -162,25 +144,6 @@ productReference = 0D6AEA181689DF2600034395 /* iDNA.app */; productType = "com.apple.product-type.application"; }; - 0D7E762C169B11AC0089D9C8 /* iDNAtests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0D7E763B169B11AC0089D9C8 /* Build configuration list for PBXNativeTarget "iDNAtests" */; - buildPhases = ( - 0D7E7628169B11AC0089D9C8 /* Sources */, - 0D7E7629169B11AC0089D9C8 /* Frameworks */, - 0D7E762A169B11AC0089D9C8 /* Resources */, - 0D7E762B169B11AC0089D9C8 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 0D7E763F169B123B0089D9C8 /* PBXTargetDependency */, - ); - name = iDNAtests; - productName = iDNAtests; - productReference = 0D7E762D169B11AC0089D9C8 /* iDNAtests.octest */; - productType = "com.apple.product-type.bundle"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -203,7 +166,6 @@ projectRoot = ""; targets = ( 0D6AEA171689DF2600034395 /* iDNA */, - 0D7E762C169B11AC0089D9C8 /* iDNAtests */, ); }; /* End PBXProject section */ @@ -219,31 +181,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 0D7E762A169B11AC0089D9C8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 0D7E762B169B11AC0089D9C8 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 0D6AEA141689DF2600034395 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -254,26 +193,12 @@ 0D6AEA431689FE7400034395 /* Cell.m in Sources */, 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */, 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0D7E7628169B11AC0089D9C8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( + 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 0D7E763F169B123B0089D9C8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 0D6AEA171689DF2600034395 /* iDNA */; - targetProxy = 0D7E763E169B123B0089D9C8 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 0D6AEA251689DF2600034395 /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -326,7 +251,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; @@ -350,7 +275,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; + MACOSX_DEPLOYMENT_TARGET = 10.8; SDKROOT = macosx; }; name = Release; @@ -380,36 +305,6 @@ }; name = Release; }; - 0D7E763C169B11AC0089D9C8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/iDNA"; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\""; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "iDNAtests/iDNAtests-Prefix.pch"; - INFOPLIST_FILE = "iDNAtests/iDNAtests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 0D7E763D169B11AC0089D9C8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/iDNA.app/iDNA"; - COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\""; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "iDNAtests/iDNAtests-Prefix.pch"; - INFOPLIST_FILE = "iDNAtests/iDNAtests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -431,14 +326,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 0D7E763B169B11AC0089D9C8 /* Build configuration list for PBXNativeTarget "iDNAtests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0D7E763C169B11AC0089D9C8 /* Debug */, - 0D7E763D169B11AC0089D9C8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; /* End XCConfigurationList section */ }; rootObject = 0D6AEA0F1689DF2600034395 /* Project object */; diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index 281d6d54e39cb6b14a53e13bd9a42633beb2e95e..1d7ab51cfa45f205e62c1867ff2fbae9ad60c180 100644 GIT binary patch delta 11815 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

H=-M} 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 CTMc#q diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 24827b8..6fa4783 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379437940.278291" + timestampString = "379630599.519024" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "132" - endingLineNumber = "132" + startingLineNumber = "137" + endingLineNumber = "137" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379437630.550915" + timestampString = "379630599.519024" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "63" - endingLineNumber = "63" + startingLineNumber = "66" + endingLineNumber = "66" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -94,5 +94,18 @@ landmarkName = "-sortPopulation" landmarkType = "5"> + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 344c9e4..6892cfd 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -8,6 +8,7 @@ #import #import "Cell.h" +#import "Graph.h" #import "Evolution.h" @interface AppDelegate : NSObject @@ -38,6 +39,9 @@ @property (weak) IBOutlet NSTextField *lbGeneration; @property (weak) IBOutlet NSTextField *lbBestMatch; +// View for drawing graph. +@property (weak) IBOutlet Graph *vwGraph; + - (IBAction)startEvolution:(id)sender; - (IBAction)pause:(id)sender; diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 4125cbb..8ecbebe 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -50,6 +50,9 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N [evolution reset]; [self setLabelForGeneration:0]; [self setLabelForBestMatch:dnaLength]; + + [_vwGraph reset]; + [_vwGraph setNeedsDisplay:YES]; } -(void) dealloc @@ -79,6 +82,8 @@ -(void) evolve [evolution perfomStep]; [self setLabelForGeneration:[evolution step]]; [self setLabelForBestMatch:[evolution bestHammingDistance]]; + [_vwGraph addPointWithY:[evolution bestHammingDistance]]; + [_vwGraph setNeedsDisplay:YES]; } [self setInputsEnabled:YES]; } diff --git a/iDNA/iDNA/Graph.h b/iDNA/iDNA/Graph.h new file mode 100644 index 0000000..0c633ca --- /dev/null +++ b/iDNA/iDNA/Graph.h @@ -0,0 +1,23 @@ +// +// Graph.h +// iDNA +// +// Created by n on 11.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import + +@interface Graph : NSView +{ + NSPointArray points; + NSMutableData *pointData; + float width; + float height; + float originX; +} + +-(void) addPointWithY: (float) y; +-(void) reset; + +@end diff --git a/iDNA/iDNA/Graph.m b/iDNA/iDNA/Graph.m new file mode 100644 index 0000000..4d4bf35 --- /dev/null +++ b/iDNA/iDNA/Graph.m @@ -0,0 +1,77 @@ +// +// Graph.m +// iDNA +// +// Created by n on 11.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import "Graph.h" + +@implementation Graph + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + pointData = [[NSMutableData alloc] init]; + width = self.frame.size.width; + height = self.frame.size.height; + originX = self.frame.origin.x; + } + + return self; +} + +-(void) addPoint: (NSPoint) point +{ + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + [pointData setLength:(pointCount+1) * sizeof(NSPoint)]; + points = [pointData mutableBytes]; + points[pointCount] = point; +} + +-(void) addPointWithX: (float) x andY: (float) y +{ + [self addPoint:NSMakePoint(x, y)]; +} + +-(void) addPointWithY: (float) y +{ + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + if (pointCount == 0) + [self addPoint:NSMakePoint(0, y)]; + else + { + float lastX = points[pointCount-1].x; + [self addPoint:NSMakePoint(lastX+1, y)]; + } +} + +-(void) reset +{ + [pointData setLength:0]; + points = NULL; +} + +- (void)drawRect:(NSRect)rect +{ + [NSBezierPath strokeLineFromPoint:NSMakePoint(0, 0) toPoint:NSMakePoint(0, height)]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(0, 0) toPoint:NSMakePoint(width, 0)]; + + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + if (pointCount > 0) + { + NSBezierPath *path = [NSBezierPath bezierPath]; + if (pointCount > width) + { + //originX--; + //[self translateOriginToPoint:NSMakePoint(-points[pointCount-(int)width-1].x, 0)]; + } + [path appendBezierPathWithPoints:[pointData mutableBytes] count: pointCount]; + [path stroke]; + } +} + +@end diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index 9845212..6e74bdf 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -1,11 +1,11 @@ - 1070 - 11G63 + 1080 + 12C60 2844 - 1138.51 - 569.00 + 1187.34 + 625.00 com.apple.InterfaceBuilder.CocoaPlugin 2844 @@ -15,6 +15,7 @@ NSButton NSButtonCell NSCustomObject + NSCustomView NSMenu NSMenuItem NSSlider @@ -1350,6 +1351,7 @@

+ NO
@@ -1369,11 +1371,12 @@ + NO
268 - {{17, 239}, {118, 17}} + {{17, 240}, {118, 17}} _NS:1535 @@ -1388,6 +1391,7 @@ + NO
@@ -1421,6 +1425,7 @@
+ NO
@@ -1441,11 +1446,12 @@ + NO
268 - {{140, 234}, {51, 22}} + {{140, 235}, {51, 22}} _NS:9 @@ -1461,6 +1467,7 @@ + NO @@ -1485,6 +1492,7 @@ NO NO + NO @@ -1509,11 +1517,12 @@ NO NO + NO 268 - {{197, 234}, {290, 21}} + {{197, 235}, {290, 21}} _NS:9 @@ -1533,11 +1542,12 @@ NO NO + NO 268 - {{17, 214}, {118, 17}} + {{17, 215}, {118, 17}} _NS:1535 @@ -1552,11 +1562,12 @@ + NO 268 - {{137, 214}, {57, 17}} + {{137, 215}, {57, 17}} _NS:1535 @@ -1571,11 +1582,12 @@ + NO 268 - {{17, 189}, {118, 17}} + {{17, 190}, {118, 17}} _NS:1535 @@ -1590,13 +1602,14 @@ + NO 268 - {{17, 164}, {118, 17}} + {{17, 165}, {118, 17}} - + _NS:1535 YES @@ -1609,11 +1622,12 @@ + NO 268 - {{137, 189}, {57, 17}} + {{137, 190}, {57, 17}} _NS:1535 @@ -1628,11 +1642,12 @@ + NO 268 - {{20, 48}, {465, 108}} + {{20, 49}, {465, 108}} _NS:9 @@ -1649,11 +1664,12 @@ + NO 268 - {{14, 12}, {132, 32}} + {{14, 13}, {132, 32}} _NS:9 @@ -1672,11 +1688,12 @@ 200 25 + NO 268 - {{357, 12}, {134, 32}} + {{357, 13}, {134, 32}} _NS:9 YES @@ -1694,13 +1711,14 @@ 200 25 + NO 268 - {{146, 12}, {77, 32}} + {{146, 13}, {77, 32}} - + _NS:9 YES @@ -1717,6 +1735,16 @@ 200 25 + NO + + + + 268 + {{206, 165}, {279, 67}} + + + _NS:9 + Graph {505, 343} @@ -2532,6 +2560,14 @@ 1478 + + + vwGraph + + + + 1530 + value: self.populationSize @@ -3305,29 +3341,45 @@ 29 3 - - - 5 + + + 6 0 - + 6 1 - 8 + 20 1000 - 6 - 24 + 8 + 29 3 - - + + 5 0 - + 5 1 + + 206 + + 1000 + + 3 + 9 + 3 + + + + 3 + 0 + + 3 + 1 0.0 @@ -3337,12 +3389,44 @@ 24 2 - + - 10 + 11 0 - 10 + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 1 0.0 @@ -3369,6 +3453,22 @@ 29 3 + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + 5 @@ -3417,12 +3517,12 @@ 29 3 - - - 10 + + + 11 0 - - 10 + + 11 1 0.0 @@ -3449,22 +3549,6 @@ 24 3 - - - 10 - 0 - - 10 - 1 - - 0.0 - - 1000 - - 6 - 24 - 2 - 6 @@ -3545,6 +3629,22 @@ 24 2 + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + 6 @@ -3641,6 +3741,22 @@ 24 2 + + + 3 + 0 + + 4 + 1 + + 10 + + 1000 + + 6 + 24 + 3 + 6 @@ -3913,22 +4029,6 @@ 29 3 - - - 3 - 0 - - 3 - 1 - - 54 - - 1000 - - 3 - 9 - 3 - 5 @@ -3995,6 +4095,7 @@ + @@ -4607,11 +4708,6 @@ - - 1261 - - - 1267 @@ -4688,11 +4784,6 @@ - - 1321 - - - 1323 @@ -4716,16 +4807,6 @@ - - 1331 - - - - - 1335 - - - 1336 @@ -5019,6 +5100,51 @@ + + 1486 + + + + + 1488 + + + + + 1490 + + + + + 1493 + + + + + 1522 + + + + + 1523 + + + + + 1525 + + + + + 1528 + + + + + 1529 + + + @@ -5058,7 +5184,6 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -5078,14 +5203,11 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -5153,8 +5275,18 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -5205,7 +5337,6 @@ - @@ -5223,27 +5354,32 @@ + + - - + + - + + + + @@ -5348,7 +5484,7 @@ - 1478 + 1530 0 From fa2cbc9b930a4aeb748636f690c0af5cfe63c127 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Sat, 12 Jan 2013 01:47:40 +0400 Subject: [PATCH 08/12] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B5=D0=B4=D1=8B=D0=B4=D1=83=D1=89?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=B8=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 21998 -> 22218 bytes iDNA/iDNA/Graph.m | 1 + 2 files changed, 1 insertion(+) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index 1d7ab51cfa45f205e62c1867ff2fbae9ad60c180..aa878db18678862ed8dece50de4e3a0f8dded530 100644 GIT binary patch delta 6921 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 delta 6662 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 diff --git a/iDNA/iDNA/Graph.m b/iDNA/iDNA/Graph.m index 4d4bf35..1806bab 100644 --- a/iDNA/iDNA/Graph.m +++ b/iDNA/iDNA/Graph.m @@ -64,6 +64,7 @@ - (void)drawRect:(NSRect)rect if (pointCount > 0) { NSBezierPath *path = [NSBezierPath bezierPath]; + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); if (pointCount > width) { //originX--; From 478eb9fa2480db01a6697bc6ff02dca3cecbc67e Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Wed, 16 Jan 2013 22:00:53 +0400 Subject: [PATCH 09/12] =?UTF-8?q?1.=20BestMatch=20=D0=BE=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE.=202.=20=D0=9F=D1=80?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=D1=82=20=D1=83=D1=82=D0=B5=D1=87=D0=B5=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D1=8F=D1=82=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 22218 -> 25804 bytes .../xcdebugger/Breakpoints.xcbkptlist | 51 +++++------- iDNA/iDNA/AppDelegate.m | 49 +++++++++--- iDNA/iDNA/Cell.h | 3 +- iDNA/iDNA/Cell.m | 73 +++++++----------- iDNA/iDNA/Evolution.h | 4 +- iDNA/iDNA/Evolution.m | 14 ++-- 7 files changed, 101 insertions(+), 93 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index aa878db18678862ed8dece50de4e3a0f8dded530..cef4a16a7ec279a3c4ab386d5401a0009b974cee 100644 GIT binary patch literal 25804 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�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 R2t|pXQnmQ$_*+x*{{YhfecJ#4 delta 12771 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 @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "379630599.519024" + timestampString = "380051327.180207" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "66" - endingLineNumber = "66" + startingLineNumber = "68" + endingLineNumber = "68" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -34,11 +34,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "379263174.792226" + timestampString = "380044430.22897" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "29" - endingLineNumber = "29" + startingLineNumber = "30" + endingLineNumber = "30" landmarkName = "-createGoalDNAWithLength:" landmarkType = "5"> @@ -47,11 +47,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Cell.m" - timestampString = "379211556.122138" + timestampString = "380048496.01082" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "41" - endingLineNumber = "41" + startingLineNumber = "46" + endingLineNumber = "46" landmarkName = "-initWithCell:" landmarkType = "5"> @@ -60,20 +60,7 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "379437630.550915" - startingColumnNumber = "9223372036854775807" - endingColumnNumber = "9223372036854775807" - startingLineNumber = "64" - endingLineNumber = "64" - landmarkName = "-perfomStep" - landmarkType = "5"> - - + landmarkName = "@interface AppDelegate" + landmarkType = "2"> diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 8ecbebe..fb6bd63 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -42,6 +42,8 @@ - (void) applicationDidFinishLaunching:(NSNotification *)aNotification [self addObserver:self forKeyPath:@"dnaLength" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"mutationRate" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionNew context:nil]; + + [_vwGraph setHidden:YES]; } -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context @@ -49,11 +51,11 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N // If any of parameters was changed we should reset evolution. [evolution reset]; [self setLabelForGeneration:0]; - [self setLabelForBestMatch:dnaLength]; + [self setLabelForBestMatch:0]; [_vwGraph reset]; [_vwGraph setNeedsDisplay:YES]; -} +} -(void) dealloc { @@ -64,7 +66,24 @@ -(void) dealloc - (IBAction)startEvolution:(id)sender { - [self performSelectorInBackground:@selector(evolve) withObject:nil]; + dispatch_queue_t back = dispatch_queue_create("back", NULL); + dispatch_async(back, ^{ + [self setInputsEnabled:NO]; + + if ([evolution state] == INIT) + [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; + else if ([evolution state] == PAUSED) + [evolution setState:STARTED]; + + while ([evolution state] == STARTED) + { + [evolution perfomStep]; + dispatch_sync(dispatch_get_main_queue(), ^{ + [self updateLabels]; + }); + } + [self setInputsEnabled:YES]; + }); } // Evolve in background. @@ -80,10 +99,9 @@ -(void) evolve while ([evolution state] == STARTED) { [evolution perfomStep]; - [self setLabelForGeneration:[evolution step]]; - [self setLabelForBestMatch:[evolution bestHammingDistance]]; - [_vwGraph addPointWithY:[evolution bestHammingDistance]]; - [_vwGraph setNeedsDisplay:YES]; + [self performSelectorOnMainThread:@selector(updateLabels) withObject:nil waitUntilDone:YES]; + //[_vwGraph addPointWithY:[evolution bestHammingDistance]]; + //[_vwGraph setNeedsDisplay:YES]; } [self setInputsEnabled:YES]; } @@ -92,7 +110,12 @@ -(void) evolve - (IBAction)pause:(id)sender { [evolution setState:PAUSED]; - [self setInputsEnabled:YES]; +} + +-(void) updateLabels +{ + [self setLabelForGeneration:[evolution step]]; + [self setLabelForBestMatch:[evolution bestMatch]]; } -(void) setLabelForGeneration: (NSInteger) step @@ -100,9 +123,9 @@ -(void) setLabelForGeneration: (NSInteger) step [_lbGeneration setStringValue:[NSString stringWithFormat:@"%ld", step]]; } --(void) setLabelForBestMatch: (NSInteger) hammingDistance +-(void) setLabelForBestMatch: (NSInteger) bestMatch { - [_lbBestMatch setStringValue:[NSString stringWithFormat:@"%ld", 100 - 100 * hammingDistance / dnaLength]]; + [_lbBestMatch setStringValue:[NSString stringWithFormat:@"%ld", bestMatch]]; } - (void) setInputsEnabled: (Boolean) status @@ -150,4 +173,10 @@ - (void) setPopulationSize: (NSInteger) x populationSize = MIN(x, maxPopulationSize); [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", populationSize]]; } + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +{ + return YES; +} + @end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index 93c8962..a2847ba 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -14,12 +14,11 @@ -(NSInteger) DNAsize; -(NSString *) getDNAatIndex: (NSInteger)index; -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; --(NSString *) randomNucleotide; --(void) initNucleotides; -(id) initWithCell: (Cell *) cell; -(id) initWithDNAlength: (NSInteger) length; -(NSString *) DNAtoString; -(Cell *) crossWithCell: (Cell *) otherCell; -(void) mutate: (NSInteger) percentToReplace; +-(NSString *) randomNucleotide; @end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index 85fc15c..c21a47b 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -12,7 +12,7 @@ @implementation Cell { NSMutableArray *DNA; - NSArray *nucleotide; + NSString *nucleotide; } -(id) init @@ -21,13 +21,18 @@ -(id) init if (self) { - [self initNucleotides]; - [self initDNAWithlength:100]; + [self initNucleotides]; + [self initDNAWithlength:100]; } return self; } +-(void) initNucleotides +{ + nucleotide = @"ATCG"; +} + -(id) initWithDNAlength: (NSInteger) length { if (self = [super init]) @@ -66,12 +71,6 @@ -(void) initDNAWithlength: (NSInteger) length } } --(void) initNucleotides -{ - // Possible elements. - nucleotide = [[NSArray alloc] initWithObjects:@"A", @"C", @"G", @"T", nil]; -} - -(int) hammingDistance: (Cell *) cell { int dist = 0; @@ -122,10 +121,21 @@ -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index // Return random nucleotide from corresponding array. -(NSString *) randomNucleotide { - if ([nucleotide count] > 0) - return [nucleotide objectAtIndex:arc4random_uniform((int)[nucleotide count])]; - else - return @""; + return [NSString stringWithFormat:@"%c", [nucleotide characterAtIndex:arc4random_uniform((int)[nucleotide length])]]; +} + +-(NSString *) randomNucleotideExceptGiven: (NSString *) except +{ + @autoreleasepool + { + NSString *ncl = [nucleotide stringByReplacingOccurrencesOfString:except withString:@""]; + return [NSString stringWithFormat:@"%c", [ncl characterAtIndex:arc4random_uniform((int)[ncl length])]]; + } +} + +-(void) setRandomDNAatIndex:(NSInteger) index +{ + [self setDNA:[self randomNucleotideExceptGiven:[self getDNAatIndex:index]] atIndex:index]; } -(Cell *) crossWithCell: (Cell *) otherCell @@ -147,38 +157,28 @@ -(Cell *) crossByHalfWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [[Cell alloc] initWithCell:self]; - for (NSInteger i = [self DNAsize] / 2; i<[self DNAsize]; i++) - [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; - - return newCell; + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; } -(Cell *) crossByOnePercentWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [[Cell alloc] initWithCell:self]; - - // Simpler method described in module video. for (NSInteger i = 0; i < [self DNAsize]; i++) - { if (i % 2 == 1) - [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; - } - return newCell; + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; } -(Cell *) crossByPartsWithCell: (Cell *) otherCell { if ([self DNAsize] != [otherCell DNAsize]) return self; - Cell *newCell = [[Cell alloc] initWithCell:self]; - for (NSInteger i = [self DNAsize]/5; i < 4*[self DNAsize]/5; i++) - [newCell setDNA:[otherCell getDNAatIndex:i] atIndex:i]; - return newCell; + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; } -(void) mutate: (NSInteger) percentToReplace @@ -205,22 +205,9 @@ -(void) mutate: (NSInteger) percentToReplace // Shuffle it! [indicesToReplace shuffle]; - // To store generated nucleotide. - NSString *tempNucleotide = [[NSString alloc] init]; - NSInteger DNAindex = 0; - for (i = 0; i < replace; i++) { - // Index of DNA array. - DNAindex = [[indicesToReplace objectAtIndex:i] integerValue]; - // Generate string different from that in DNA array. - do - { - tempNucleotide = [self randomNucleotide]; - } - while ([[self getDNAatIndex:DNAindex] isEqualToString:tempNucleotide]); - - [self setDNA:tempNucleotide atIndex:DNAindex]; + [self setRandomDNAatIndex:[[indicesToReplace objectAtIndex:i] integerValue]]; } } diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h index a1ba5e9..515d0d6 100644 --- a/iDNA/iDNA/Evolution.h +++ b/iDNA/iDNA/Evolution.h @@ -23,6 +23,8 @@ NSInteger mutationRate; NSInteger populationSize; NSInteger dnaLength; + + NSInteger bestMatch; NSMutableArray *population; Cell *goalDNA; @@ -33,7 +35,7 @@ -(void) perfomStep; -(NSInteger) state; -(NSInteger) step; --(NSInteger) bestHammingDistance; +-(NSInteger) bestMatch; -(void) reset; -(void) setState: (NSInteger) st; diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m index 182a925..e3e4e14 100644 --- a/iDNA/iDNA/Evolution.m +++ b/iDNA/iDNA/Evolution.m @@ -16,6 +16,7 @@ -(id) init { step = 0; state = INIT; + bestMatch = 0; } return self; } @@ -123,18 +124,21 @@ - (Boolean) isZeroHammingDistance return NO; } --(NSInteger) bestHammingDistance +-(NSInteger) bestMatch { - if ([population count] < 1) - return 0; - else - return [goalDNA hammingDistance:[population objectAtIndex:0]]; + NSInteger bestHD = 0; + if ([population count] > 0) + bestHD = [goalDNA hammingDistance:[population objectAtIndex:0]]; + bestMatch = MAX(bestMatch, 100 - 100 * bestHD / dnaLength); + + return bestMatch; } -(void) reset { state = INIT; step = 0; + bestMatch = 0; } @end From ddcc27a65e3d8c2aacda58ab372d4cf4db43ebb6 Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Wed, 16 Jan 2013 22:12:20 +0400 Subject: [PATCH 10/12] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=20=D0=BE=D1=82=D1=80=D0=B0=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=BD=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 25804 -> 25540 bytes .../xcdebugger/Breakpoints.xcbkptlist | 21 ++++-- iDNA/iDNA/AppDelegate.m | 68 +++++++++--------- 3 files changed, 49 insertions(+), 40 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index cef4a16a7ec279a3c4ab386d5401a0009b974cee..03f82a5c69c0eeaf90f7840dc3df05e7ec5e9369 100644 GIT binary patch delta 5911 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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index c3b19bc..f7a9139 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380051327.180207" + timestampString = "380052663.31632" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "160" - endingLineNumber = "160" + startingLineNumber = "156" + endingLineNumber = "156" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -21,7 +21,7 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380051327.180207" + timestampString = "380052343.352983" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "68" @@ -94,5 +94,18 @@ landmarkName = "@interface AppDelegate" landmarkType = "2"> + + diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index fb6bd63..a7ce0b9 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -66,44 +66,40 @@ -(void) dealloc - (IBAction)startEvolution:(id)sender { - dispatch_queue_t back = dispatch_queue_create("back", NULL); - dispatch_async(back, ^{ - [self setInputsEnabled:NO]; - - if ([evolution state] == INIT) - [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; - else if ([evolution state] == PAUSED) - [evolution setState:STARTED]; - - while ([evolution state] == STARTED) - { - [evolution perfomStep]; - dispatch_sync(dispatch_get_main_queue(), ^{ - [self updateLabels]; - }); - } - [self setInputsEnabled:YES]; - }); -} - -// Evolve in background. --(void) evolve -{ - [self setInputsEnabled:NO]; - - if ([evolution state] == INIT) - [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; - else if ([evolution state] == PAUSED) - [evolution setState:STARTED]; - - while ([evolution state] == STARTED) + [self checkInputValues]; + if (dnaLength > 0 && populationSize > 0) + { + dispatch_queue_t back = dispatch_queue_create("back", NULL); + dispatch_async(back, ^{ + [self setInputsEnabled:NO]; + + if ([evolution state] == INIT) + [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; + else if ([evolution state] == PAUSED) + [evolution setState:STARTED]; + + while ([evolution state] == STARTED) + { + [evolution perfomStep]; + dispatch_sync(dispatch_get_main_queue(), ^{ + [self updateLabels]; + }); + } + [self setInputsEnabled:YES]; + }); + } + else { - [evolution perfomStep]; - [self performSelectorOnMainThread:@selector(updateLabels) withObject:nil waitUntilDone:YES]; - //[_vwGraph addPointWithY:[evolution bestHammingDistance]]; - //[_vwGraph setNeedsDisplay:YES]; + NSAlert *alert = [NSAlert alertWithMessageText:@"Какой-то из параметров равен 0." defaultButton:@"Просто закройся" alternateButton:@"Я понял" otherButton:@"Другая кнопка" informativeTextWithFormat:@"Скорее всего это размер ДНК или популяции."]; + [alert runModal]; } - [self setInputsEnabled:YES]; +} + +-(void) checkInputValues +{ + [self setDnaLength:[_tfDnaLength integerValue]]; + [self setMutationRate:[_tfMutationRate integerValue]]; + [self setPopulationSize:[_tfPopulationSize integerValue]]; } // Pause button pressed. From ac55eb12e86e2aa2ecde6a20c1898ae8380062da Mon Sep 17 00:00:00 2001 From: Manaenkova Anna Date: Thu, 17 Jan 2013 01:24:47 +0400 Subject: [PATCH 11/12] =?UTF-8?q?1.=20=D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=BF=D1=83=D0=BB=D1=8F=D1=86=D0=B8=D0=B8?= =?UTF-8?q?.=202.=20=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=94=D0=9D=D0=9A=20=D0=B8=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 25540 -> 25779 bytes .../xcdebugger/Breakpoints.xcbkptlist | 69 ++++++-- iDNA/iDNA/AppDelegate.h | 1 + iDNA/iDNA/AppDelegate.m | 48 +++++- iDNA/iDNA/Cell.h | 2 + iDNA/iDNA/Cell.m | 14 +- iDNA/iDNA/Evolution.h | 1 + iDNA/iDNA/Evolution.m | 6 + iDNA/iDNA/en.lproj/MainMenu.xib | 153 +++++++++++++++++- 9 files changed, 274 insertions(+), 20 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index 03f82a5c69c0eeaf90f7840dc3df05e7ec5e9369..a5d816b52d4ec044a1a9db421bbb5869507da248 100644 GIT binary patch delta 12500 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∾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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index f7a9139..080373b 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380052663.31632" + timestampString = "380064222.089664" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "156" - endingLineNumber = "156" + startingLineNumber = "198" + endingLineNumber = "198" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380052343.352983" + timestampString = "380063088.913543" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "68" - endingLineNumber = "68" + startingLineNumber = "69" + endingLineNumber = "69" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -60,11 +60,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "380044430.22897" + timestampString = "380062608.199112" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "65" - endingLineNumber = "65" + startingLineNumber = "71" + endingLineNumber = "71" landmarkName = "-perfomStep" landmarkType = "5"> @@ -73,11 +73,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/Evolution.m" - timestampString = "380044430.22897" + timestampString = "380062608.199112" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "66" - endingLineNumber = "66" + startingLineNumber = "72" + endingLineNumber = "72" landmarkName = "-perfomStep" landmarkType = "5"> @@ -99,11 +99,50 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380052663.31632" + timestampString = "380063088.913543" + startingColumnNumber = "9223372036854775807" + endingColumnNumber = "9223372036854775807" + startingLineNumber = "101" + endingLineNumber = "101" + landmarkName = "-checkInputValues" + landmarkType = "5"> + + + + + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index 6892cfd..e1ede13 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -44,5 +44,6 @@ - (IBAction)startEvolution:(id)sender; - (IBAction)pause:(id)sender; +- (IBAction)loadGoalDNA:(id)sender; @end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index a7ce0b9..14ca377 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -57,6 +57,7 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N [_vwGraph setNeedsDisplay:YES]; } +// Only for remove observers. -(void) dealloc { [self removeObserver:self forKeyPath:@"dnaLength"]; @@ -99,7 +100,9 @@ -(void) checkInputValues { [self setDnaLength:[_tfDnaLength integerValue]]; [self setMutationRate:[_tfMutationRate integerValue]]; - [self setPopulationSize:[_tfPopulationSize integerValue]]; + // It can be over 1000 which implies a space after thousands. + //[self setPopulationSize:[[[_tfPopulationSize stringValue] stringByReplacingOccurrencesOfString:@"\t" withString:@""] integerValue]]; + [self setPopulationSize:[[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]]; } // Pause button pressed. @@ -108,6 +111,44 @@ - (IBAction)pause:(id)sender [evolution setState:PAUSED]; } +- (IBAction)loadGoalDNA:(id)sender +{ + [self openDNADialog]; +} + +-(void) openDNADialog +{ + NSOpenPanel *open = [NSOpenPanel openPanel]; + [open setCanChooseFiles:YES]; + [open setAllowsMultipleSelection:NO]; + [open setAllowedFileTypes:[NSArray arrayWithObjects:@"txt", nil]]; + + if ([open runModal] == NSOKButton) + { + @try + { + NSString *path = [[[open URLs] objectAtIndex:0] path]; + if (path) + { + NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + // Validate string. Force reading only necessary symbols. + content = [[content componentsSeparatedByCharactersInSet: [[NSCharacterSet characterSetWithCharactersInString:NUCLEOTIDES] invertedSet]] componentsJoinedByString:@""]; + content = [content substringToIndex:MIN([content length], maxDnaLength)]; + dnaLength = [content length]; + [_tfDnaLength setStringValue:[NSString stringWithFormat:@"%ld", dnaLength]]; + [_tfGoalDNA setStringValue:content]; + [evolution setGoalDNAwithString:@"content"]; + } + } + @catch(NSException *exception) + { + NSAlert *alert = [NSAlert alertWithMessageText:@"Неправильный файл." defaultButton:@"Просто закройся" alternateButton:@"Я понял" otherButton:@"Другая кнопка" informativeTextWithFormat:@"Что-то пошло не так."]; + [alert runModal]; + } + } +} + +// Set information for labels 'current generation' and 'best match'. -(void) updateLabels { [self setLabelForGeneration:[evolution step]]; @@ -124,6 +165,7 @@ -(void) setLabelForBestMatch: (NSInteger) bestMatch [_lbBestMatch setStringValue:[NSString stringWithFormat:@"%ld", bestMatch]]; } +// Enabling or disabling inputs. - (void) setInputsEnabled: (Boolean) status { [_btLoadGoalDNA setEnabled:status]; @@ -155,7 +197,8 @@ - (void) setDnaLength: (NSInteger) x { dnaLength = MIN(x, maxDnaLength); [_tfDnaLength setStringValue:[NSString stringWithFormat:@"%ld", dnaLength]]; - [self setGoalDNA]; + if ([evolution state] == INIT || [evolution state] == FINISHED) + [self setGoalDNA]; } - (void) setMutationRate: (NSInteger) x @@ -170,6 +213,7 @@ - (void) setPopulationSize: (NSInteger) x [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", populationSize]]; } +// Close app if window is closed. - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { return YES; diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h index a2847ba..20ee836 100644 --- a/iDNA/iDNA/Cell.h +++ b/iDNA/iDNA/Cell.h @@ -7,6 +7,7 @@ // #import +#define NUCLEOTIDES @"ATGC" @interface Cell : NSObject @@ -16,6 +17,7 @@ -(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; -(id) initWithCell: (Cell *) cell; -(id) initWithDNAlength: (NSInteger) length; +-(id) initWithString: (NSString *) dna; -(NSString *) DNAtoString; -(Cell *) crossWithCell: (Cell *) otherCell; -(void) mutate: (NSInteger) percentToReplace; diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m index c21a47b..0f93617 100644 --- a/iDNA/iDNA/Cell.m +++ b/iDNA/iDNA/Cell.m @@ -30,7 +30,7 @@ -(id) init -(void) initNucleotides { - nucleotide = @"ATCG"; + nucleotide = NUCLEOTIDES; } -(id) initWithDNAlength: (NSInteger) length @@ -71,6 +71,18 @@ -(void) initDNAWithlength: (NSInteger) length } } +-(id) initWithString: (NSString *) dna +{ + if (self = [super init]) + { + [self initNucleotides]; + DNA = [[NSMutableArray alloc] initWithCapacity:[dna length]]; + for (NSInteger i = 0; i < [dna length]; i++) + [DNA setObject:[NSString stringWithFormat:@"%c", [dna characterAtIndex:i]] atIndexedSubscript:i]; + } + return self; +} + -(int) hammingDistance: (Cell *) cell { int dist = 0; diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h index 515d0d6..bc43177 100644 --- a/iDNA/iDNA/Evolution.h +++ b/iDNA/iDNA/Evolution.h @@ -38,5 +38,6 @@ -(NSInteger) bestMatch; -(void) reset; -(void) setState: (NSInteger) st; +-(void) setGoalDNAwithString: (NSString *) dna; @end diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m index e3e4e14..fd6feee 100644 --- a/iDNA/iDNA/Evolution.m +++ b/iDNA/iDNA/Evolution.m @@ -46,6 +46,12 @@ -(void) setMutationRate: (NSInteger) rate { mutationRate = rate; } -(void) setPopulationSize: (NSInteger) size { populationSize = size; } -(void) setDnaLength: (NSInteger) length { dnaLength = length; } -(void) setState: (NSInteger) st { state = st; } +-(void) setGoalDNAwithString: (NSString *) dna +{ + [self reset]; + goalDNA = [[Cell alloc] initWithString:dna]; + dnaLength = [goalDNA DNAsize]; +} // Initialization with parameters. -(void) initWithMutationRate:(NSInteger)rate PopulationSize: (NSInteger) size DnaLength: (NSInteger) length diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index 6e74bdf..330201a 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -1318,6 +1318,7 @@ 268 {{17, 306}, {118, 17}} + _NS:1535 YES @@ -1358,6 +1359,7 @@ 268 {{17, 272}, {118, 17}} + _NS:1535 YES @@ -1378,6 +1380,7 @@ 268 {{17, 240}, {118, 17}} + _NS:1535 YES @@ -1398,6 +1401,7 @@ 268 {{140, 301}, {51, 22}} + _NS:9 YES @@ -1432,6 +1436,7 @@ 268 {{140, 267}, {51, 22}} + _NS:9 YES @@ -1453,6 +1458,7 @@ 268 {{140, 235}, {51, 22}} + _NS:9 YES @@ -1474,6 +1480,7 @@ 268 {{197, 301}, {290, 21}} + _NS:9 YES @@ -1499,6 +1506,7 @@ 268 {{197, 267}, {290, 21}} + _NS:9 YES @@ -1524,6 +1532,7 @@ 268 {{197, 235}, {290, 21}} + _NS:9 YES @@ -1549,6 +1558,7 @@ 268 {{17, 215}, {118, 17}} + _NS:1535 YES @@ -1569,6 +1579,7 @@ 268 {{137, 215}, {57, 17}} + _NS:1535 YES @@ -1589,6 +1600,7 @@ 268 {{17, 190}, {118, 17}} + _NS:1535 YES @@ -1609,6 +1621,7 @@ 268 {{17, 165}, {118, 17}} + _NS:1535 YES @@ -1629,6 +1642,7 @@ 268 {{137, 190}, {57, 17}} + _NS:1535 YES @@ -1649,6 +1663,7 @@ 268 {{20, 49}, {465, 108}} + _NS:9 {250, 750} @@ -1671,6 +1686,7 @@ 268 {{14, 13}, {132, 32}} + _NS:9 YES @@ -1695,6 +1711,8 @@ 268 {{357, 13}, {134, 32}} + + _NS:9 YES @@ -1718,6 +1736,7 @@ 268 {{146, 13}, {77, 32}} + _NS:9 YES @@ -1742,6 +1761,7 @@ 268 {{206, 165}, {279, 67}} + _NS:9 Graph @@ -1749,6 +1769,7 @@ {505, 343} + {{0, 0}, {1280, 778}} @@ -2568,6 +2589,14 @@ 1530 + + + loadGoalDNA: + + + + 1531 + value: self.populationSize @@ -5484,9 +5513,129 @@ - 1530 + 1531 + + + + + AppDelegate + NSObject + + id + id + id + + + + loadGoalDNA: + id + + + pause: + id + + + startEvolution: + id + + + + NSButton + NSButton + NSButton + NSTextField + NSTextField + NSSlider + NSSlider + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + Graph + NSWindow + + + + btLoadGoalDNA + NSButton + + + btPause + NSButton + + + btStartEvolution + NSButton + + + lbBestMatch + NSTextField + + + lbGeneration + NSTextField + + + slDnaLength + NSSlider + + + slMutationRate + NSSlider + + + slPopulationSize + NSSlider + + + tfDnaLength + NSTextField + + + tfGoalDNA + NSTextField + + + tfMutationRate + NSTextField + + + tfPopulationSize + NSTextField + + + vwGraph + Graph + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + Graph + NSView + + IBProjectSource + ./Classes/Graph.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + - 0 IBCocoaFramework YES From 190fe3b699824c60a7e74e33b6f1ecdd1848eb56 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 7 Feb 2013 18:21:00 +0400 Subject: [PATCH 12/12] =?UTF-8?q?=D0=9F=D0=B0=D1=83=D0=B7=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D0=BA=D0=B0=D0=BA?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B4=D0=BE.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 25779 -> 27487 bytes .../xcdebugger/Breakpoints.xcbkptlist | 25 +++++------------- iDNA/iDNA/AppDelegate.m | 16 +++++++---- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index a5d816b52d4ec044a1a9db421bbb5869507da248..261e0b5e6435217a40792d36bb878fc5ff74f24a 100644 GIT binary patch delta 15032 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

xFta9eNanE2k(r}2zs%f~ zc{KBR<{Le)m+1ZUGQC_Mq7T!@>f`hY`XqfDeTv?o&)1jg`{?`W2j~asYxSe`NIzCT zUO!Q9o}{tp@tEL(FU_&jA5K%vSGGikztKtvtgUz zJHt-H9>XESQNsztDZ^RAdBYXMeZ!wd#%y#nij8hY52Kec$fz(Xjp0U>G1{15Of%*h z+Z#I?yBNC}dl)N?RmN&#t#PPvxN(eevhge965}%CO5+;iI^#CucgCH@-Nt>!AB@M0 z|1;h(J~2Ks{%L$^d~M=Pb|#U@$>d^kGx?g7rdU&o$zaMd<(l$Lg{Cehb2n2DQ@N>+ zsjsQVgiMo6b4-g(OH9j5D@|)mn@!tH-qyp>tfyJe zv;N8k*^b$++5Xv~*{Rujb9T4vA=zWICuV=1Jtf7;J&VrmRIlFQW<{ZvBmUA-aOwPHS z>p6FG9^^dEd7ASw=XEZXOXsq=QMsLSC+1GiwdBstU6%WG?)uzKxm$A0-{IUF7o--X7w8Ha z3N{pMD%f1GtpxT1ujRz+=!v_+<( zf}+kv6-5Jz1{Kv74KEs1WG=!*lZq@wi;I>PtteVuw7zIl(UziZMSF@46`e0KUo5&@ zbgk%i(cPj4MURS}7riOwi^au?Vr6keaa6IoxJ7Y%aZ+)c;?!bov9373xUjgmxTN^| z;zPwpijNhaY#-M?y?sXe%=X6iE81^vzqS4L_B%TGbWnB(?-1D`y2Gpv^&J{IEbFkc n#JeQ4B&;N&B&y_bN7#|?=-7DcM0rDK`yza4``z@}(fR)Y%`!WE delta 14534 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 e+hp5f+iyE)JLYP=K @@ -112,11 +112,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380064222.089664" + timestampString = "381939601.22474" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "133" - endingLineNumber = "133" + startingLineNumber = "139" + endingLineNumber = "139" landmarkName = "-openDNADialog" landmarkType = "5"> @@ -133,18 +133,5 @@ landmarkName = "-bestMatch" landmarkType = "5"> - - diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 14ca377..012e1b6 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -98,11 +98,17 @@ - (IBAction)startEvolution:(id)sender -(void) checkInputValues { - [self setDnaLength:[_tfDnaLength integerValue]]; - [self setMutationRate:[_tfMutationRate integerValue]]; - // It can be over 1000 which implies a space after thousands. - //[self setPopulationSize:[[[_tfPopulationSize stringValue] stringByReplacingOccurrencesOfString:@"\t" withString:@""] integerValue]]; - [self setPopulationSize:[[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]]; + NSInteger currentDnaLength = [_tfDnaLength integerValue]; + NSInteger currentMutationRate = [_tfMutationRate integerValue]; + NSInteger currentPopulationSize = [[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]; + + // Check if any value was changed. + if (currentDnaLength != [self dnaLength]) + [self setDnaLength:currentDnaLength]; + if (currentMutationRate != [self mutationRate]) + [self setMutationRate:currentMutationRate]; + if (currentPopulationSize != [self populationSize]) + [self setPopulationSize:currentPopulationSize]; } // Pause button pressed.