From 3d8aad9ea6dce13fbdbd140fcf343e6e02ab0263 Mon Sep 17 00:00:00 2001 From: liuruilong Date: Mon, 25 Jun 2018 19:40:44 +0800 Subject: [PATCH] add metal loader and skeleton code --- .gitignore | 21 + .../project.pbxproj | 401 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 7051 bytes .../xcschemes/xcschememanagement.plist | 14 + .../paddle-mobile-demo/AppDelegate.swift | 46 + .../AppIcon.appiconset/Contents.json | 98 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + .../Base.lproj/Main.storyboard | 24 + .../paddle-mobile-demo/Info.plist | 45 + .../paddle-mobile-demo/ViewController.swift | 34 + .../paddle-mobile-demo/test.pb.swift | 79 + metal/paddle-mobile/Podfile | 10 + .../paddle-mobile.xcodeproj/project.pbxproj | 503 +++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11448 bytes .../xcschemes/xcschememanagement.plist | 14 + .../contents.xcworkspacedata | 13 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 119142 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../paddle-mobile/Common/Errors.swift | 22 + .../paddle-mobile/Common/Extensions.swift | 95 + .../paddle-mobile/Common/Types.swift | 50 + .../paddle-mobile/Executor.swift | 19 + metal/paddle-mobile/paddle-mobile/Info.plist | 24 + .../paddle-mobile/paddle-mobile/Loader.swift | 205 ++ .../paddle-mobile/Operators/BatchNormOp.swift | 47 + .../paddle-mobile/Operators/ConvOp.swift | 46 + .../Operators/ElementwiseAddOp.swift | 38 + .../paddle-mobile/Operators/Operator.swift | 182 ++ .../paddle-mobile/Operators/ReluOp.swift | 37 + .../paddle-mobile/Program/Attribute.swift | 58 + .../paddle-mobile/Program/BlockDesc.swift | 41 + .../paddle-mobile/Program/OpDesc.swift | 58 + .../paddle-mobile/Program/Program.swift | 26 + .../paddle-mobile/Program/ProgramDesc.swift | 24 + .../paddle-mobile/Program/Scope.swift | 23 + .../paddle-mobile/Program/TensorDesc.swift | 25 + .../paddle-mobile/Program/VarDesc.swift | 80 + .../paddle-mobile/Program/framework.pb.swift | 1821 +++++++++++++++++ .../paddle-mobile/framework/Dim.swift | 46 + .../paddle-mobile/framework/Tensor.swift | 36 + .../paddle-mobile/paddle_mobile.h | 25 + 47 files changed, 4404 insertions(+) create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.pbxproj create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/AppDelegate.swift create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/Contents.json create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/LaunchScreen.storyboard create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/Main.storyboard create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/Info.plist create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/ViewController.swift create mode 100644 example/paddle-mobile-demo/paddle-mobile-demo/test.pb.swift create mode 100644 metal/paddle-mobile/Podfile create mode 100644 metal/paddle-mobile/paddle-mobile.xcodeproj/project.pbxproj create mode 100644 metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 metal/paddle-mobile/paddle-mobile.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 metal/paddle-mobile/paddle-mobile.xcworkspace/contents.xcworkspacedata create mode 100644 metal/paddle-mobile/paddle-mobile.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 metal/paddle-mobile/paddle-mobile/Common/Errors.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Common/Extensions.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Common/Types.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Executor.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Info.plist create mode 100644 metal/paddle-mobile/paddle-mobile/Loader.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Operators/BatchNormOp.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Operators/ConvOp.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Operators/ElementwiseAddOp.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Operators/Operator.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Operators/ReluOp.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/Attribute.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/BlockDesc.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/OpDesc.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/Program.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/ProgramDesc.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/Scope.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/TensorDesc.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/VarDesc.swift create mode 100644 metal/paddle-mobile/paddle-mobile/Program/framework.pb.swift create mode 100644 metal/paddle-mobile/paddle-mobile/framework/Dim.swift create mode 100644 metal/paddle-mobile/paddle-mobile/framework/Tensor.swift create mode 100644 metal/paddle-mobile/paddle-mobile/paddle_mobile.h diff --git a/.gitignore b/.gitignore index 532601bfe9..3aab8e5c65 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,24 @@ build # clion building directories cmake-build-debug cmake-build-release + +# Pods + +Podfile.lock + +SwiftProtobuf.framework + +metal/paddle-mobile/Pods/ + + +example/paddle-mobile-demo/paddle-mobile-demo/yolo/ + + + + + + + + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.pbxproj b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..5da3a48af3 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.pbxproj @@ -0,0 +1,401 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + FC111A6620DD31C700F213F8 /* test.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A6520DD31C700F213F8 /* test.pb.swift */; }; + FC111BE320DE079E00F213F8 /* params in Resources */ = {isa = PBXBuildFile; fileRef = FC111BE120DE079E00F213F8 /* params */; }; + FC111BE420DE079E00F213F8 /* model in Resources */ = {isa = PBXBuildFile; fileRef = FC111BE220DE079E00F213F8 /* model */; }; + FC9F52F120DA7F4D00C9F612 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F52F020DA7F4D00C9F612 /* AppDelegate.swift */; }; + FC9F52F320DA7F4D00C9F612 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F52F220DA7F4D00C9F612 /* ViewController.swift */; }; + FC9F52F620DA7F4D00C9F612 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC9F52F420DA7F4D00C9F612 /* Main.storyboard */; }; + FC9F52F820DA7F4F00C9F612 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FC9F52F720DA7F4F00C9F612 /* Assets.xcassets */; }; + FC9F52FB20DA7F4F00C9F612 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FC9F52F920DA7F4F00C9F612 /* LaunchScreen.storyboard */; }; + FCBF210620DC007900B5FDF0 /* paddle_mobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCBF210520DC007900B5FDF0 /* paddle_mobile.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + FCBF210720DC007900B5FDF0 /* paddle_mobile.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FCBF210520DC007900B5FDF0 /* paddle_mobile.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + FCBF210820DC00A100B5FDF0 /* SwiftProtobuf.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FCBF20FC20DBFF4D00B5FDF0 /* SwiftProtobuf.framework */; }; + FCBF210920DC00A100B5FDF0 /* SwiftProtobuf.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FCBF20FC20DBFF4D00B5FDF0 /* SwiftProtobuf.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + FCBF210420DC005100B5FDF0 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + FCBF210720DC007900B5FDF0 /* paddle_mobile.framework in Embed Frameworks */, + FCBF210920DC00A100B5FDF0 /* SwiftProtobuf.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + FC111A6520DD31C700F213F8 /* test.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = test.pb.swift; sourceTree = ""; }; + FC111BE120DE079E00F213F8 /* params */ = {isa = PBXFileReference; lastKnownFileType = file; path = params; sourceTree = ""; }; + FC111BE220DE079E00F213F8 /* model */ = {isa = PBXFileReference; lastKnownFileType = file; path = model; sourceTree = ""; }; + FC9F52ED20DA7F4D00C9F612 /* paddle-mobile-demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "paddle-mobile-demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FC9F52F020DA7F4D00C9F612 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + FC9F52F220DA7F4D00C9F612 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + FC9F52F520DA7F4D00C9F612 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + FC9F52F720DA7F4F00C9F612 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + FC9F52FA20DA7F4F00C9F612 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + FC9F52FC20DA7F4F00C9F612 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FCBF20FC20DBFF4D00B5FDF0 /* SwiftProtobuf.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = SwiftProtobuf.framework; sourceTree = ""; }; + FCBF210520DC007900B5FDF0 /* paddle_mobile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = paddle_mobile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FC9F52EA20DA7F4D00C9F612 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FCBF210620DC007900B5FDF0 /* paddle_mobile.framework in Frameworks */, + FCBF210820DC00A100B5FDF0 /* SwiftProtobuf.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + FC111BE020DE079E00F213F8 /* yolo */ = { + isa = PBXGroup; + children = ( + FC111BE120DE079E00F213F8 /* params */, + FC111BE220DE079E00F213F8 /* model */, + ); + path = yolo; + sourceTree = ""; + }; + FC9F52E420DA7F4D00C9F612 = { + isa = PBXGroup; + children = ( + FCBF210520DC007900B5FDF0 /* paddle_mobile.framework */, + FCBF20FC20DBFF4D00B5FDF0 /* SwiftProtobuf.framework */, + FC9F52EF20DA7F4D00C9F612 /* paddle-mobile-demo */, + FC9F52EE20DA7F4D00C9F612 /* Products */, + FCBF20F520DBFE7300B5FDF0 /* Frameworks */, + ); + sourceTree = ""; + }; + FC9F52EE20DA7F4D00C9F612 /* Products */ = { + isa = PBXGroup; + children = ( + FC9F52ED20DA7F4D00C9F612 /* paddle-mobile-demo.app */, + ); + name = Products; + sourceTree = ""; + }; + FC9F52EF20DA7F4D00C9F612 /* paddle-mobile-demo */ = { + isa = PBXGroup; + children = ( + FC111BE020DE079E00F213F8 /* yolo */, + FC111A6520DD31C700F213F8 /* test.pb.swift */, + FC9F52F020DA7F4D00C9F612 /* AppDelegate.swift */, + FC9F52F220DA7F4D00C9F612 /* ViewController.swift */, + FC9F52F420DA7F4D00C9F612 /* Main.storyboard */, + FC9F52F720DA7F4F00C9F612 /* Assets.xcassets */, + FC9F52F920DA7F4F00C9F612 /* LaunchScreen.storyboard */, + FC9F52FC20DA7F4F00C9F612 /* Info.plist */, + ); + path = "paddle-mobile-demo"; + sourceTree = ""; + }; + FCBF20F520DBFE7300B5FDF0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FC9F52EC20DA7F4D00C9F612 /* paddle-mobile-demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = FC9F52FF20DA7F4F00C9F612 /* Build configuration list for PBXNativeTarget "paddle-mobile-demo" */; + buildPhases = ( + FC9F52E920DA7F4D00C9F612 /* Sources */, + FC9F52EA20DA7F4D00C9F612 /* Frameworks */, + FC9F52EB20DA7F4D00C9F612 /* Resources */, + FCBF210420DC005100B5FDF0 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "paddle-mobile-demo"; + productName = "paddle-mobile-demo"; + productReference = FC9F52ED20DA7F4D00C9F612 /* paddle-mobile-demo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FC9F52E520DA7F4D00C9F612 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = orange; + TargetAttributes = { + FC9F52EC20DA7F4D00C9F612 = { + CreatedOnToolsVersion = 9.3.1; + }; + }; + }; + buildConfigurationList = FC9F52E820DA7F4D00C9F612 /* Build configuration list for PBXProject "paddle-mobile-demo" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = FC9F52E420DA7F4D00C9F612; + productRefGroup = FC9F52EE20DA7F4D00C9F612 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FC9F52EC20DA7F4D00C9F612 /* paddle-mobile-demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FC9F52EB20DA7F4D00C9F612 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FC9F52FB20DA7F4F00C9F612 /* LaunchScreen.storyboard in Resources */, + FC111BE420DE079E00F213F8 /* model in Resources */, + FC9F52F820DA7F4F00C9F612 /* Assets.xcassets in Resources */, + FC111BE320DE079E00F213F8 /* params in Resources */, + FC9F52F620DA7F4D00C9F612 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FC9F52E920DA7F4D00C9F612 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FC9F52F320DA7F4D00C9F612 /* ViewController.swift in Sources */, + FC111A6620DD31C700F213F8 /* test.pb.swift in Sources */, + FC9F52F120DA7F4D00C9F612 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + FC9F52F420DA7F4D00C9F612 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FC9F52F520DA7F4D00C9F612 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + FC9F52F920DA7F4F00C9F612 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + FC9F52FA20DA7F4F00C9F612 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FC9F52FD20DA7F4F00C9F612 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + FC9F52FE20DA7F4F00C9F612 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + FC9F530020DA7F4F00C9F612 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = Z5M2UUN5YV; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = "paddle-mobile-demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "orange.paddle-mobile-demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + FC9F530120DA7F4F00C9F612 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = Z5M2UUN5YV; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = "paddle-mobile-demo/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "orange.paddle-mobile-demo"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FC9F52E820DA7F4D00C9F612 /* Build configuration list for PBXProject "paddle-mobile-demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FC9F52FD20DA7F4F00C9F612 /* Debug */, + FC9F52FE20DA7F4F00C9F612 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FC9F52FF20DA7F4F00C9F612 /* Build configuration list for PBXNativeTarget "paddle-mobile-demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FC9F530020DA7F4F00C9F612 /* Debug */, + FC9F530120DA7F4F00C9F612 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FC9F52E520DA7F4D00C9F612 /* Project object */; +} diff --git a/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..d363ac3d83 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dcfb9214de03a35266e6576963e7e58ed7b9e213 GIT binary patch literal 7051 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 literal 0 HcmV?d00001 diff --git a/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000000..ac3b6f5ebc --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + paddle-mobile-demo.xcscheme + + orderHint + 2 + + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/AppDelegate.swift b/example/paddle-mobile-demo/paddle-mobile-demo/AppDelegate.swift new file mode 100644 index 0000000000..cff94f9b47 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// paddle-mobile-demo +// +// Created by liuRuiLong on 2018/6/20. +// Copyright © 2018年 orange. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d8db8d65fd --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/Contents.json b/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..da4a164c91 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/LaunchScreen.storyboard b/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..f83f6fd581 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/Main.storyboard b/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..03c13c2286 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/Info.plist b/example/paddle-mobile-demo/paddle-mobile-demo/Info.plist new file mode 100644 index 0000000000..16be3b6811 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/ViewController.swift b/example/paddle-mobile-demo/paddle-mobile-demo/ViewController.swift new file mode 100644 index 0000000000..d807f82ea4 --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/ViewController.swift @@ -0,0 +1,34 @@ +// +// ViewController.swift +// paddle-mobile-demo +// +// Created by liuRuiLong on 2018/6/20. +// Copyright © 2018年 orange. All rights reserved. +// + +import UIKit +import paddle_mobile + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + var date = Date.init() + if let modelPath = Bundle.main.path(forResource: "model", ofType: nil), let paraPath = Bundle.main.path(forResource: "params", ofType: nil) { + print(" bundlepath: " + modelPath) + let loader = Loader.init() + try! loader.load(modelPath: modelPath, paraPath: paraPath) + } + let els = Date.init().timeIntervalSince(date) + print(els) + + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/example/paddle-mobile-demo/paddle-mobile-demo/test.pb.swift b/example/paddle-mobile-demo/paddle-mobile-demo/test.pb.swift new file mode 100644 index 0000000000..e02fb155ac --- /dev/null +++ b/example/paddle-mobile-demo/paddle-mobile-demo/test.pb.swift @@ -0,0 +1,79 @@ +// DO NOT EDIT. +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: test.proto +// +// For information on using the generated types, please see the documenation: +// https://github.com/apple/swift-protobuf/ + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that your are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +struct BookInfo { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var id: Int64 = 0 + + var title: String = String() + + var author: String = String() + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +extension BookInfo: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = "BookInfo" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "id"), + 2: .same(proto: "title"), + 3: .same(proto: "author"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularInt64Field(value: &self.id) + case 2: try decoder.decodeSingularStringField(value: &self.title) + case 3: try decoder.decodeSingularStringField(value: &self.author) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if self.id != 0 { + try visitor.visitSingularInt64Field(value: self.id, fieldNumber: 1) + } + if !self.title.isEmpty { + try visitor.visitSingularStringField(value: self.title, fieldNumber: 2) + } + if !self.author.isEmpty { + try visitor.visitSingularStringField(value: self.author, fieldNumber: 3) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: BookInfo) -> Bool { + if self.id != other.id {return false} + if self.title != other.title {return false} + if self.author != other.author {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} diff --git a/metal/paddle-mobile/Podfile b/metal/paddle-mobile/Podfile new file mode 100644 index 0000000000..6685c2f306 --- /dev/null +++ b/metal/paddle-mobile/Podfile @@ -0,0 +1,10 @@ +platform :ios, ‘9.0’ +use_frameworks! + +target 'paddle-mobile-demo' do + pod 'SwiftProtobuf', '~> 1.0' +end + +target 'paddle-mobile' do +pod 'SwiftProtobuf', '~> 1.0' +end diff --git a/metal/paddle-mobile/paddle-mobile.xcodeproj/project.pbxproj b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..5eb0367da0 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.pbxproj @@ -0,0 +1,503 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 12F10C488EAE0B360E3ED522 /* Pods_paddle_mobile.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7379EE496BCB959550E49F06 /* Pods_paddle_mobile.framework */; }; + FC111A6A20DD4DE200F213F8 /* BlockDesc.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A6920DD4DE200F213F8 /* BlockDesc.swift */; }; + FC111A6C20DD4DEC00F213F8 /* VarDesc.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A6B20DD4DEC00F213F8 /* VarDesc.swift */; }; + FC111A6E20DD4DF500F213F8 /* TensorDesc.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A6D20DD4DF500F213F8 /* TensorDesc.swift */; }; + FC111A7020DD50AB00F213F8 /* OpDesc.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A6F20DD50AB00F213F8 /* OpDesc.swift */; }; + FC111A7220DDED3D00F213F8 /* Attribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111A7120DDED3D00F213F8 /* Attribute.swift */; }; + FC111BE620DE088600F213F8 /* Program.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC111BE520DE088600F213F8 /* Program.swift */; }; + FC2712A720DE11FE007BC206 /* Tensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712A620DE11FE007BC206 /* Tensor.swift */; }; + FC2712A920DE1206007BC206 /* Dim.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712A820DE1206007BC206 /* Dim.swift */; }; + FC2712AB20DE2340007BC206 /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712AA20DE2340007BC206 /* Types.swift */; }; + FC2712AD20DE5060007BC206 /* Scope.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712AC20DE5060007BC206 /* Scope.swift */; }; + FC2712AF20DEA008007BC206 /* Operator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712AE20DEA008007BC206 /* Operator.swift */; }; + FC2712B220DEA108007BC206 /* ConvOp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC2712B120DEA108007BC206 /* ConvOp.swift */; }; + FC88679D20E0F47900A29C00 /* Executor.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC88679C20E0F47900A29C00 /* Executor.swift */; }; + FC9F530720DA7FB700C9F612 /* ProgramDesc.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F530620DA7FB700C9F612 /* ProgramDesc.swift */; }; + FC9F530A20DA835D00C9F612 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F530920DA835D00C9F612 /* Extensions.swift */; }; + FC9F530C20DA83A700C9F612 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F530B20DA83A700C9F612 /* Errors.swift */; }; + FC9F530E20DA861D00C9F612 /* framework.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC9F530D20DA861D00C9F612 /* framework.pb.swift */; }; + FCB7C3FA20DF885900156259 /* ReluOp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB7C3F920DF885900156259 /* ReluOp.swift */; }; + FCB7C3FC20DF8EEE00156259 /* BatchNormOp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB7C3FB20DF8EEE00156259 /* BatchNormOp.swift */; }; + FCB7C3FE20DFE49B00156259 /* ElementwiseAddOp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCB7C3FD20DFE49B00156259 /* ElementwiseAddOp.swift */; }; + FCBA505920DA7A1100044AA3 /* paddle_mobile.h in Headers */ = {isa = PBXBuildFile; fileRef = FCBA505720DA7A1100044AA3 /* paddle_mobile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FCBA506020DA7CEF00044AA3 /* Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCBA505F20DA7CEF00044AA3 /* Loader.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1BA510B509FF05304A0AA5CF /* Pods-paddle-mobile.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-paddle-mobile.release.xcconfig"; path = "Pods/Target Support Files/Pods-paddle-mobile/Pods-paddle-mobile.release.xcconfig"; sourceTree = ""; }; + 637CE9BBF82421D0FAECA982 /* Pods-paddle-mobile.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-paddle-mobile.debug.xcconfig"; path = "Pods/Target Support Files/Pods-paddle-mobile/Pods-paddle-mobile.debug.xcconfig"; sourceTree = ""; }; + 7379EE496BCB959550E49F06 /* Pods_paddle_mobile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_paddle_mobile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FC111A6920DD4DE200F213F8 /* BlockDesc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockDesc.swift; sourceTree = ""; }; + FC111A6B20DD4DEC00F213F8 /* VarDesc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VarDesc.swift; sourceTree = ""; }; + FC111A6D20DD4DF500F213F8 /* TensorDesc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TensorDesc.swift; sourceTree = ""; }; + FC111A6F20DD50AB00F213F8 /* OpDesc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpDesc.swift; sourceTree = ""; }; + FC111A7120DDED3D00F213F8 /* Attribute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Attribute.swift; sourceTree = ""; }; + FC111BE520DE088600F213F8 /* Program.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Program.swift; sourceTree = ""; }; + FC2712A620DE11FE007BC206 /* Tensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tensor.swift; sourceTree = ""; }; + FC2712A820DE1206007BC206 /* Dim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dim.swift; sourceTree = ""; }; + FC2712AA20DE2340007BC206 /* Types.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Types.swift; sourceTree = ""; }; + FC2712AC20DE5060007BC206 /* Scope.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Scope.swift; sourceTree = ""; }; + FC2712AE20DEA008007BC206 /* Operator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Operator.swift; sourceTree = ""; }; + FC2712B120DEA108007BC206 /* ConvOp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConvOp.swift; sourceTree = ""; }; + FC88679C20E0F47900A29C00 /* Executor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Executor.swift; sourceTree = ""; }; + FC9F530620DA7FB700C9F612 /* ProgramDesc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgramDesc.swift; sourceTree = ""; }; + FC9F530920DA835D00C9F612 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + FC9F530B20DA83A700C9F612 /* Errors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; + FC9F530D20DA861D00C9F612 /* framework.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = framework.pb.swift; sourceTree = ""; }; + FCB7C3F920DF885900156259 /* ReluOp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReluOp.swift; sourceTree = ""; }; + FCB7C3FB20DF8EEE00156259 /* BatchNormOp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatchNormOp.swift; sourceTree = ""; }; + FCB7C3FD20DFE49B00156259 /* ElementwiseAddOp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementwiseAddOp.swift; sourceTree = ""; }; + FCBA505420DA7A1100044AA3 /* paddle_mobile.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = paddle_mobile.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FCBA505720DA7A1100044AA3 /* paddle_mobile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = paddle_mobile.h; sourceTree = ""; }; + FCBA505820DA7A1100044AA3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FCBA505F20DA7CEF00044AA3 /* Loader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Loader.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FCBA505020DA7A1100044AA3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 12F10C488EAE0B360E3ED522 /* Pods_paddle_mobile.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C496DE8B9216803C3A836198 /* Pods */ = { + isa = PBXGroup; + children = ( + 637CE9BBF82421D0FAECA982 /* Pods-paddle-mobile.debug.xcconfig */, + 1BA510B509FF05304A0AA5CF /* Pods-paddle-mobile.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + E707ADA0AE1047E37B361DCE /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7379EE496BCB959550E49F06 /* Pods_paddle_mobile.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + FC2712A520DE11F1007BC206 /* framework */ = { + isa = PBXGroup; + children = ( + FC2712A620DE11FE007BC206 /* Tensor.swift */, + FC2712A820DE1206007BC206 /* Dim.swift */, + ); + path = framework; + sourceTree = ""; + }; + FC2712B020DEA0FE007BC206 /* Operators */ = { + isa = PBXGroup; + children = ( + FC2712AE20DEA008007BC206 /* Operator.swift */, + FC2712B120DEA108007BC206 /* ConvOp.swift */, + FCB7C3F920DF885900156259 /* ReluOp.swift */, + FCB7C3FB20DF8EEE00156259 /* BatchNormOp.swift */, + FCB7C3FD20DFE49B00156259 /* ElementwiseAddOp.swift */, + ); + path = Operators; + sourceTree = ""; + }; + FC9F52E320DA7E7E00C9F612 /* Program */ = { + isa = PBXGroup; + children = ( + FC9F530D20DA861D00C9F612 /* framework.pb.swift */, + FC9F530620DA7FB700C9F612 /* ProgramDesc.swift */, + FC111A6920DD4DE200F213F8 /* BlockDesc.swift */, + FC111A6B20DD4DEC00F213F8 /* VarDesc.swift */, + FC111A6D20DD4DF500F213F8 /* TensorDesc.swift */, + FC111A6F20DD50AB00F213F8 /* OpDesc.swift */, + FC111A7120DDED3D00F213F8 /* Attribute.swift */, + FC111BE520DE088600F213F8 /* Program.swift */, + FC2712AC20DE5060007BC206 /* Scope.swift */, + ); + path = Program; + sourceTree = ""; + }; + FC9F530820DA835700C9F612 /* Common */ = { + isa = PBXGroup; + children = ( + FC9F530920DA835D00C9F612 /* Extensions.swift */, + FC9F530B20DA83A700C9F612 /* Errors.swift */, + FC2712AA20DE2340007BC206 /* Types.swift */, + ); + path = Common; + sourceTree = ""; + }; + FCBA504A20DA7A1100044AA3 = { + isa = PBXGroup; + children = ( + FCBA505620DA7A1100044AA3 /* paddle-mobile */, + FCBA505520DA7A1100044AA3 /* Products */, + C496DE8B9216803C3A836198 /* Pods */, + E707ADA0AE1047E37B361DCE /* Frameworks */, + ); + sourceTree = ""; + }; + FCBA505520DA7A1100044AA3 /* Products */ = { + isa = PBXGroup; + children = ( + FCBA505420DA7A1100044AA3 /* paddle_mobile.framework */, + ); + name = Products; + sourceTree = ""; + }; + FCBA505620DA7A1100044AA3 /* paddle-mobile */ = { + isa = PBXGroup; + children = ( + FC2712B020DEA0FE007BC206 /* Operators */, + FC2712A520DE11F1007BC206 /* framework */, + FC9F530820DA835700C9F612 /* Common */, + FC9F52E320DA7E7E00C9F612 /* Program */, + FCBA505720DA7A1100044AA3 /* paddle_mobile.h */, + FCBA505820DA7A1100044AA3 /* Info.plist */, + FCBA505F20DA7CEF00044AA3 /* Loader.swift */, + FC88679C20E0F47900A29C00 /* Executor.swift */, + ); + path = "paddle-mobile"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + FCBA505120DA7A1100044AA3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FCBA505920DA7A1100044AA3 /* paddle_mobile.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + FCBA505320DA7A1100044AA3 /* paddle-mobile */ = { + isa = PBXNativeTarget; + buildConfigurationList = FCBA505C20DA7A1100044AA3 /* Build configuration list for PBXNativeTarget "paddle-mobile" */; + buildPhases = ( + 522C71CE8D72187FBDA21FBA /* [CP] Check Pods Manifest.lock */, + FCBA504F20DA7A1100044AA3 /* Sources */, + FCBA505020DA7A1100044AA3 /* Frameworks */, + FCBA505120DA7A1100044AA3 /* Headers */, + FCBA505220DA7A1100044AA3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "paddle-mobile"; + productName = "paddle-mobile"; + productReference = FCBA505420DA7A1100044AA3 /* paddle_mobile.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FCBA504B20DA7A1100044AA3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = orange; + TargetAttributes = { + FCBA505320DA7A1100044AA3 = { + CreatedOnToolsVersion = 9.3.1; + LastSwiftMigration = 0930; + }; + }; + }; + buildConfigurationList = FCBA504E20DA7A1100044AA3 /* Build configuration list for PBXProject "paddle-mobile" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = FCBA504A20DA7A1100044AA3; + productRefGroup = FCBA505520DA7A1100044AA3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FCBA505320DA7A1100044AA3 /* paddle-mobile */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FCBA505220DA7A1100044AA3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 522C71CE8D72187FBDA21FBA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-paddle-mobile-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FCBA504F20DA7A1100044AA3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FC111A7220DDED3D00F213F8 /* Attribute.swift in Sources */, + FC9F530C20DA83A700C9F612 /* Errors.swift in Sources */, + FC111A7020DD50AB00F213F8 /* OpDesc.swift in Sources */, + FC2712AB20DE2340007BC206 /* Types.swift in Sources */, + FC2712AD20DE5060007BC206 /* Scope.swift in Sources */, + FC2712AF20DEA008007BC206 /* Operator.swift in Sources */, + FCBA506020DA7CEF00044AA3 /* Loader.swift in Sources */, + FCB7C3FC20DF8EEE00156259 /* BatchNormOp.swift in Sources */, + FC111A6C20DD4DEC00F213F8 /* VarDesc.swift in Sources */, + FC111A6A20DD4DE200F213F8 /* BlockDesc.swift in Sources */, + FC2712A720DE11FE007BC206 /* Tensor.swift in Sources */, + FC111BE620DE088600F213F8 /* Program.swift in Sources */, + FC2712B220DEA108007BC206 /* ConvOp.swift in Sources */, + FC88679D20E0F47900A29C00 /* Executor.swift in Sources */, + FC9F530E20DA861D00C9F612 /* framework.pb.swift in Sources */, + FC2712A920DE1206007BC206 /* Dim.swift in Sources */, + FCB7C3FE20DFE49B00156259 /* ElementwiseAddOp.swift in Sources */, + FC111A6E20DD4DF500F213F8 /* TensorDesc.swift in Sources */, + FC9F530A20DA835D00C9F612 /* Extensions.swift in Sources */, + FCB7C3FA20DF885900156259 /* ReluOp.swift in Sources */, + FC9F530720DA7FB700C9F612 /* ProgramDesc.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + FCBA505A20DA7A1100044AA3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FCBA505B20DA7A1100044AA3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + FCBA505D20DA7A1100044AA3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 637CE9BBF82421D0FAECA982 /* Pods-paddle-mobile.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = Z5M2UUN5YV; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "paddle-mobile/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = "orange.paddle-mobile"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + FCBA505E20DA7A1100044AA3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1BA510B509FF05304A0AA5CF /* Pods-paddle-mobile.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = Z5M2UUN5YV; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "paddle-mobile/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + PRODUCT_BUNDLE_IDENTIFIER = "orange.paddle-mobile"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FCBA504E20DA7A1100044AA3 /* Build configuration list for PBXProject "paddle-mobile" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FCBA505A20DA7A1100044AA3 /* Debug */, + FCBA505B20DA7A1100044AA3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FCBA505C20DA7A1100044AA3 /* Build configuration list for PBXNativeTarget "paddle-mobile" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FCBA505D20DA7A1100044AA3 /* Debug */, + FCBA505E20DA7A1100044AA3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FCBA504B20DA7A1100044AA3 /* Project object */; +} diff --git a/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..bb84e46b46 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate b/metal/paddle-mobile/paddle-mobile.xcodeproj/project.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..8686181bfd7729df3063998b41fdff802baa00fd GIT binary patch literal 11448 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 nOlFe}$qC7}=%)tl|%|P5KP~PcHml4NEq( literal 0 HcmV?d00001 diff --git a/metal/paddle-mobile/paddle-mobile.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist b/metal/paddle-mobile/paddle-mobile.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000000..5272521360 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcodeproj/xcuserdata/liuruilong.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + paddle-mobile.xcscheme + + orderHint + 3 + + + + diff --git a/metal/paddle-mobile/paddle-mobile.xcworkspace/contents.xcworkspacedata b/metal/paddle-mobile/paddle-mobile.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..2d7575a753 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/metal/paddle-mobile/paddle-mobile.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/metal/paddle-mobile/paddle-mobile.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate b/metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fd1d5e8938b53d3d5518774f18d3e35ab42d61ba GIT binary patch literal 119142 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 literal 0 HcmV?d00001 diff --git a/metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000000..ed9a9b4d42 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile.xcworkspace/xcuserdata/liuruilong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/metal/paddle-mobile/paddle-mobile/Common/Errors.swift b/metal/paddle-mobile/paddle-mobile/Common/Errors.swift new file mode 100644 index 0000000000..d086fe3574 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Common/Errors.swift @@ -0,0 +1,22 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +public enum PaddleMobileError: Error{ + case loaderError(message: String) + case netError(message: String) + case memoryError(message: String) + case paramError(message: String) +} diff --git a/metal/paddle-mobile/paddle-mobile/Common/Extensions.swift b/metal/paddle-mobile/paddle-mobile/Common/Extensions.swift new file mode 100644 index 0000000000..d23b1d9300 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Common/Extensions.swift @@ -0,0 +1,95 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +// 自定义 ?! 如果 ?! 前的返回值为一个可选值, 则进行隐式解包, 如果有值则返回这个值, 如果为nil 则fatalError 传入的信息 +precedencegroup ExecutedOrFatalError{ + associativity: left + higherThan: AssignmentPrecedence +} +infix operator ?!: ExecutedOrFatalError +func ?!(option: T?, excuteOrError: @autoclosure () -> String) -> T{ + if let inOpt = option { + return inOpt + }else{ + fatalError(excuteOrError()) + } +} + +//Lense +struct Lense { + let from: (A) -> B + let to: (B, A) -> A +} + +precedencegroup CombineLense{ + associativity: left + higherThan: AssignmentPrecedence +} + +infix operator >>>: CombineLense +func >>>(left: Lense, right: Lense) -> Lense { + return Lense.init(from: { (a) -> C in + left.from(right.from(a)) + }, to: { (c, a) -> A in + right.to( left.to(c, right.from(a)),a) + }) +} + +protocol CIntIndex { + associatedtype T; + subscript(index: CInt) -> T { get set}; +} + +extension Array: CIntIndex{ + typealias T = Element + subscript(index: CInt) -> T { + get{ + guard Int64(Int.max) >= Int64(index) else{ + fatalError("cint index out of Int range") + } + return self[Int(index)] + } + set{ + guard Int64(Int.max) >= Int64(index) else{ + fatalError("cint index out of Int range") + } + self[Int(index)] = newValue + } + + } +} + + +//MARK: Array extension +extension Array where Element: Comparable{ + + /// 返回数组前 r 个元素, 并将元素处于原数组的位置作为元组的第一个元素返回 + /// + /// - Parameter r: 前 r 个元素 + /// - Returns: [(原有位置, 排好位置的元素)] + func top(r: Int) -> [(Int, Element)] { + precondition(r <= self.count) + return Array<(Int, Element)>(zip(0.. $1.1 }.prefix(through: r - 1)) + } +} + +extension String{ + func cStr() -> UnsafePointer? { + return (self as NSString).utf8String + } +} + + diff --git a/metal/paddle-mobile/paddle-mobile/Common/Types.swift b/metal/paddle-mobile/paddle-mobile/Common/Types.swift new file mode 100644 index 0000000000..531a41ed62 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Common/Types.swift @@ -0,0 +1,50 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +//typealias Float16 = Int16 +//extension Float16: PrecisionType { +//} + +public protocol PrecisionType { +} + +extension Float32: PrecisionType { +} + +enum DataLayout { + case NCHW + case NHWC +} + +protocol Variant { +} + +extension Tensor: Variant { + +} + + + +let gConvType = "conv2d" +let gBatchNormType = "batch_norm" +let gReluType = "relu" +let gElementwiseAdd = "elementwise_add" + +let opInputsOutputsKey = [gConvType : (inputs: ["Input"], outputs: ["Output"]), + gBatchNormType : (inputs: ["X"], outputs: ["Y"]), + gReluType : (inputs: ["X"], outputs: ["Out"]), + gElementwiseAdd : (inputs: ["X", "Y"], outputs: ["Out"])] + diff --git a/metal/paddle-mobile/paddle-mobile/Executor.swift b/metal/paddle-mobile/paddle-mobile/Executor.swift new file mode 100644 index 0000000000..76b4e1bc5a --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Executor.swift @@ -0,0 +1,19 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +class Executor { + +} diff --git a/metal/paddle-mobile/paddle-mobile/Info.plist b/metal/paddle-mobile/paddle-mobile/Info.plist new file mode 100644 index 0000000000..1007fd9dd7 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/metal/paddle-mobile/paddle-mobile/Loader.swift b/metal/paddle-mobile/paddle-mobile/Loader.swift new file mode 100644 index 0000000000..f5275d3741 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Loader.swift @@ -0,0 +1,205 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation +import SwiftProtobuf + +class ParamData { + let size: Int + var dim: Dim + private(set) var layout: DataLayout + var pointer: UnsafeMutablePointer

+ init(inDim: Dim, inLayout: DataLayout = .NCHW) { + dim = inDim + size = inDim.numel() * MemoryLayout

.size + pointer = UnsafeMutablePointer

.allocate(capacity: size) + layout = inLayout + } + + func convert(to: DataLayout) { + guard to != layout else { + return + } + + guard dim.cout() == 4 else { + return + } + + guard layout == .NCHW && to == .NHWC else { + // other not support + return + } + let newPointer = UnsafeMutablePointer

.allocate(capacity: size) + + if layout == .NCHW { + NCHW2NHWC(newPtr: newPointer) + } + + pointer.deinitialize(count: size) + pointer.deallocate() + pointer = newPointer + layout = to + } + + func NCHW2NHWC(newPtr: UnsafeMutablePointer

) { + let N = dim[0] + let C = dim[1] + let H = dim[2] + let W = dim[3] + let HXW = H * W + let CXHXW = C * H * W + + var index: Int = 0 + for n in 0.. { + class ParaLoader { + let file: UnsafeMutablePointer + let fileSize: Int + var nowIndex: Int + init(paramPath: String) throws { + guard let tmpFile = fopen(paramPath, "rb") else { + throw PaddleMobileError.loaderError(message: "open param file error" + paramPath) + } + file = tmpFile + fseek(file, 0, SEEK_END) + fileSize = ftell(file) + guard fileSize > 0 else { + throw PaddleMobileError.loaderError(message: "param file size is too small") + } + rewind(file) + nowIndex = 0 + } + + func read(data: ParamData

) throws { + guard nowIndex <= fileSize else { + throw PaddleMobileError.loaderError(message: "out of the file range") + } + + func pointerReader(type: T.Type) -> T { + let ptr = UnsafeMutablePointer.allocate(capacity: MemoryLayout.size) + fread(ptr, 1, MemoryLayout.size, file) + nowIndex += MemoryLayout.size + let pointee = ptr.pointee + ptr.deinitialize(count: MemoryLayout.size) + ptr.deallocate() + return pointee + } + + _ = pointerReader(type: UInt32.self) + let lodLevel = pointerReader(type: UInt64.self) + for _ in 0...size)){ + _ = pointerReader(type: size_t.self) + } + } + + let _ = pointerReader(type: UInt32.self) + + let tensorDescSize = pointerReader(type: Int32.self) + fseek(file, Int(tensorDescSize), SEEK_CUR) + nowIndex += Int(tensorDescSize) + + /* + 这里没有根据 Data Type 去判断, 而是从外部泛型直接指定了精度 + */ + + let bytesRead = fread(data.pointer, 1, data.size, file) + guard bytesRead == data.size else { + throw PaddleMobileError.loaderError(message: "param read size error") + } + nowIndex += bytesRead + } + + deinit { + fclose(file) + } + } + public init(){} + public func load(modelPath: String, paraPath: String) throws -> Program{ + guard let modelData = try? Data.init(contentsOf: URL.init(fileURLWithPath: modelPath)) else { + throw PaddleMobileError.loaderError(message: "load " + modelPath + " failed !") + } + + do { + let protoProgram = try PaddleMobile_Framework_Proto_ProgramDesc.init( + serializedData: modelData) + let scope = Scope.init() + let program = Program.init(protoProgramDesc: protoProgram, inParamPath: paraPath, inScope: scope) + + guard let paraLoader = try? ParaLoader.init(paramPath: paraPath) else { + throw PaddleMobileError.loaderError(message: "load para error") + } + + for block in program.programDesc.blocks { + for varDesc in block.vars { + if (varDesc.type == .LodTensor) { + if (varDesc.persistable + && varDesc.type != .FeedMiniBatch + && varDesc.type != .FetchList) { + guard let tensorDesc = varDesc.tensorDesc else { + throw PaddleMobileError.loaderError(message: "get tensor desc failed") + } + + guard (try? tensorDesc.dataType.dataTypeSize()) == MemoryLayout

.size else { + throw PaddleMobileError.memoryError(message: "PrecisionType not support") + } + + let dimArr = tensorDesc.dims + + + guard dimArr.count > 0 else { + throw PaddleMobileError.loaderError(message: "tensor desc dim size error") + } + + let dim = Dim.init(inDim: dimArr) + let paraData = ParamData

.init(inDim: dim) + do { + try paraLoader.read(data: paraData) + } catch let error { + throw error + } + paraData.convert(to: .NHWC) + let tensor = Tensor

.init(inData: paraData) + scope.vars[varDesc.name] = tensor + } + } + } + } + return program + } catch _ { + throw PaddleMobileError.loaderError(message: "protobuf decoder error") + } + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Operators/BatchNormOp.swift b/metal/paddle-mobile/paddle-mobile/Operators/BatchNormOp.swift new file mode 100644 index 0000000000..44a1d77866 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Operators/BatchNormOp.swift @@ -0,0 +1,47 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct BatchNormParam: Param { + typealias ParamP = P + init(opDesc: OpDesc, scope: Scope) throws { + do { + inputX = try BatchNormParam.inputX(inputs: opDesc.inputs, from: scope) + outputY = try BatchNormParam.outputY(outputs: opDesc.outputs, from: scope) + inputBias = try BatchNormParam.inputBiase(inputs: opDesc.paraInputs, from: scope) + inputMean = try BatchNormParam.inputMean(inputs: opDesc.paraInputs, from: scope) + inputScale = try BatchNormParam.inputScale(inputs: opDesc.paraInputs, from: scope) + inputVariance = try BatchNormParam.inputVariance(inputs: opDesc.paraInputs, from: scope) + epsilon = try BatchNormParam.getAttr(key: "epsilon", attrs: opDesc.attrs) + momentum = try BatchNormParam.getAttr(key: "momentum", attrs: opDesc.attrs) + is_test = try BatchNormParam.getAttr(key: "is_test", attrs: opDesc.attrs) + } catch let error { + throw error + } + } + let inputX: Tensor + let outputY: Tensor + let inputBias: Tensor + let inputMean: Tensor + let inputScale: Tensor + let inputVariance: Tensor + let epsilon: Float + let momentum: Float + let is_test: Bool +} + +class BatchNormOp: Operator> { + +} diff --git a/metal/paddle-mobile/paddle-mobile/Operators/ConvOp.swift b/metal/paddle-mobile/paddle-mobile/Operators/ConvOp.swift new file mode 100644 index 0000000000..ab8e234631 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Operators/ConvOp.swift @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct ConvParam: Param { + typealias ParamP = P + init(opDesc: OpDesc, scope: Scope) throws { + do { + filter = try ConvParam.inputFilter(paraInputs: opDesc.paraInputs, from: scope) + input = try ConvParam.input(inputs: opDesc.inputs, from: scope) + output = try ConvParam.output(outputs: opDesc.outputs, from: scope) + stride = try ConvParam.getAttr(key: "stride", attrs: opDesc.attrs) + paddings = try ConvParam.getAttr(key: "paddings", attrs: opDesc.attrs) + dilations = try ConvParam.getAttr(key: "dilations", attrs: opDesc.attrs) + groups = try ConvParam.getAttr(key: "groups", attrs: opDesc.attrs) + } catch let error { + throw error + } + } + + let input: Tensor + let output: Tensor + let filter: Tensor + let stride: [Int] + let paddings: [Int] + let dilations: [Int] + let groups: Int +} + +class ConvOp: Operator> { + override func runImpl() { + + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Operators/ElementwiseAddOp.swift b/metal/paddle-mobile/paddle-mobile/Operators/ElementwiseAddOp.swift new file mode 100644 index 0000000000..d87b49d2c1 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Operators/ElementwiseAddOp.swift @@ -0,0 +1,38 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ +import Foundation + +struct ElementwiseAddParam: Param { + typealias ParamP = P + init(opDesc: OpDesc, scope: Scope) throws { + do { + inputX = try ElementwiseAddParam.inputX(inputs: opDesc.inputs, from: scope) + inputY = try ElementwiseAddParam.inputY(inputs: opDesc.inputs, from: scope) + out = try ElementwiseAddParam.outputOut(outputs: opDesc.outputs, from: scope) + axis = try ElementwiseAddParam.getAttr(key: "axis", attrs: opDesc.attrs) + } catch let error { + throw error + } + } + let inputX: Tensor

+ let inputY: Tensor

+ let out: Tensor

+ let axis: Int +} + +class ElementwiseAddOp: Operator>{ + override func runImpl() { + + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Operators/Operator.swift b/metal/paddle-mobile/paddle-mobile/Operators/Operator.swift new file mode 100644 index 0000000000..427d60d6eb --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Operators/Operator.swift @@ -0,0 +1,182 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +/* + let opInputsOutputsKey = [gConvType : (inputs: ["Input"], outputs: ["Output"]), + gBatchNormType : (inputs: ["X"], outputs: ["Y"]), + gReluType : (inputs: ["X"], outputs: ["Out"]), + gElementwiseAdd : (inputs: ["X", "Y"], outputs: ["Out"])] + */ + +protocol Param { + associatedtype ParamP: PrecisionType + init(opDesc: OpDesc, scope: Scope) throws + static func getFirstTensor(key: String, map: [String : [String]], from: Scope) throws -> Tensor + static func inputX(inputs: [String : [String]], from: Scope) throws -> Tensor + static func inputBiase(inputs: [String : [String]], from: Scope) throws -> Tensor + static func inputMean(inputs: [String : [String]], from: Scope) throws -> Tensor + static func inputScale(inputs: [String : [String]], from: Scope) throws -> Tensor + static func inputVariance(inputs: [String : [String]], from: Scope) throws -> Tensor + static func inputFilter(paraInputs: [String : [String]], from: Scope) throws -> Tensor + static func input(inputs: [String : [String]], from: Scope) throws -> Tensor + static func output(outputs: [String : [String]], from: Scope) throws -> Tensor + static func outputY(outputs: [String : [String]], from: Scope) throws -> Tensor + static func inputY(inputs: [String : [String]], from: Scope) throws -> Tensor + static func outputOut(outputs: [String : [String]], from: Scope) throws -> Tensor + static func getAttr(key: String, attrs: [String : Attr]) throws -> T +} + +extension Param { + static func getFirstTensor(key: String, map: [String : [String]], from: Scope) throws -> Tensor { + guard let mapKeys = map["X"], mapKeys.count > 0, let inputX = from[mapKeys[0]], let tensorX = inputX as? Tensor else { + throw PaddleMobileError.paramError(message: "tensor " + key + "in \(map) not found") + } + return tensorX + } + + static func inputX(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorX = try getFirstTensor(key: "X", map: inputs, from: from) + return tensorX + } catch let error { + throw error + } + } + + static func input(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorInput = try getFirstTensor(key: "Input", map: inputs, from: from) + return tensorInput + } catch let error { + throw error + } + } + + static func output(outputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorOutput = try getFirstTensor(key: "Output", map: outputs, from: from) + return tensorOutput + } catch let error { + throw error + } + } + static func outputY(outputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorOutputY = try getFirstTensor(key: "Y", map: outputs, from: from) + return tensorOutputY + } catch let error { + throw error + } + } + static func inputY(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorY = try getFirstTensor(key: "Y", map: inputs, from: from) + return tensorY + } catch let error { + throw error + } + } + + static func outputOut(outputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let out = try getFirstTensor(key: "Out", map: outputs, from: from) + return out + } catch let error { + throw error + } + } + static func inputFilter(paraInputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorFilter = try getFirstTensor(key: "Filter", map: paraInputs, from: from) + return tensorFilter + } catch let error { + throw error + } + } + + static func inputBiase(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorBias = try getFirstTensor(key: "Bias", map: inputs, from: from) + return tensorBias + } catch let error { + throw error + } + } + + static func inputMean(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorMean = try getFirstTensor(key: "Mean", map: inputs, from: from) + return tensorMean + } catch let error { + throw error + } + } + + static func inputScale(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorScale = try getFirstTensor(key: "Scale", map: inputs, from: from) + return tensorScale + } catch let error { + throw error + } + } + + static func inputVariance(inputs: [String : [String]], from: Scope) throws -> Tensor { + do { + let tensorVariance = try getFirstTensor(key: "Variance", map: inputs, from: from) + return tensorVariance + } catch let error { + throw error + } + } + + static func getAttr(key: String, attrs: [String : Attr]) throws -> T{ + guard let attr = attrs[key] as? T else { + throw PaddleMobileError.paramError(message: "attr type error") + } + return attr + } +} + + +class Operator { + let type: String + let inputs: [String : [String]] + let paraInputs: [String : [String]] + let outpus: [String : [String]] + let attrs: [String : Attr] + let para: ParamType + init(opDesc: OpDesc, inScope: Scope) throws { + type = opDesc.type + inputs = opDesc.inputs + outpus = opDesc.outputs + attrs = opDesc.attrs + paraInputs = opDesc.paraInputs + do { + para = try ParamType.init(opDesc:opDesc, scope: inScope) + } catch let error { + throw error + } + } + + func run() { + runImpl() + } + + func runImpl() { + fatalError("runimpl of " + type + "op not implement") + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Operators/ReluOp.swift b/metal/paddle-mobile/paddle-mobile/Operators/ReluOp.swift new file mode 100644 index 0000000000..291d728dbf --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Operators/ReluOp.swift @@ -0,0 +1,37 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ +import Foundation + +struct ReluParam: Param { + typealias ParamP = P + init(opDesc: OpDesc, scope: Scope) throws { + do { + inputX = try ReluParam.inputX(inputs: opDesc.inputs, from: scope) + out = try ReluParam.outputOut(outputs: opDesc.outputs, from: scope) + } catch let error { + throw error + } + } + let inputX: Tensor + let out: Tensor +} + +class ReluOp: Operator> { + override func runImpl() { + + } +} + + + diff --git a/metal/paddle-mobile/paddle-mobile/Program/Attribute.swift b/metal/paddle-mobile/paddle-mobile/Program/Attribute.swift new file mode 100644 index 0000000000..924f92ddd5 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/Attribute.swift @@ -0,0 +1,58 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +protocol Attr { +} + +extension Bool: Attr { +} + +extension Int: Attr { +} + +extension Float: Attr { +} + +extension Int64: Attr { +} + +extension Array: Attr { +} + +func attrWithProtoDesc(attrDesc: PaddleMobile_Framework_Proto_OpDesc.Attr) -> Attr { + switch attrDesc.type { + case .boolean: + return attrDesc.b + case .int: + return Int(attrDesc.i) + case .string: + return attrDesc.strings + case .long: + return attrDesc.l + case .float: + return attrDesc.f + case .booleans: + return attrDesc.bools + case .floats: + return attrDesc.floats + case .ints: + return attrDesc.ints + case .strings: + return attrDesc.strings + default: + fatalError(" not support this attr type: \(attrDesc.type)") + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/BlockDesc.swift b/metal/paddle-mobile/paddle-mobile/Program/BlockDesc.swift new file mode 100644 index 0000000000..630ca3de4c --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/BlockDesc.swift @@ -0,0 +1,41 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct BlockDesc { + let index: Int + let parentIndex: Int + let vars: [VarDesc] + let ops: [OpDesc] + init(block: PaddleMobile_Framework_Proto_BlockDesc) { + index = Int(block.idx) + parentIndex = Int(block.parentIdx) + var vars: [VarDesc] = [] + for varOfBlock in block.vars { + vars.append(VarDesc.init(protoVarDesc: varOfBlock)) + } + vars.sort { $0.name < $1.name } + self.vars = vars + var ops: [OpDesc] = [] + for op in block.ops { + ops.append(OpDesc.init(protoOpDesc: op)) + } + self.ops = ops + } + + + + +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/OpDesc.swift b/metal/paddle-mobile/paddle-mobile/Program/OpDesc.swift new file mode 100644 index 0000000000..48f4377646 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/OpDesc.swift @@ -0,0 +1,58 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct OpDesc { + let inputs: [String : [String]] + let paraInputs: [String : [String]] + let outputs: [String : [String]] + let unusedOutputs: [String : [String]] + var attrs: [String : Attr] = [:] + let type: String + init(protoOpDesc: PaddleMobile_Framework_Proto_OpDesc) { + type = protoOpDesc.type + let creator = { (vars: [PaddleMobile_Framework_Proto_OpDesc.Var], canAdd: (String) -> Bool) -> [String : [String]] in + var map: [String : [String]] = [:] + for opDescVar in vars { + if (canAdd(opDescVar.parameter)) { + map[opDescVar.parameter] = opDescVar.arguments + } + } + return map + } + + inputs = creator(protoOpDesc.inputs) { + opInputsOutputsKey[protoOpDesc.type]?.inputs.contains($0) ?? false + } + + paraInputs = creator(protoOpDesc.inputs) { + !(opInputsOutputsKey[protoOpDesc.type]?.inputs.contains($0) ?? false) + } + + outputs = creator(protoOpDesc.outputs) { + opInputsOutputsKey[protoOpDesc.type]?.outputs.contains($0) ?? false + } + + unusedOutputs = creator(protoOpDesc.outputs) { + !(opInputsOutputsKey[protoOpDesc.type]?.outputs.contains($0) ?? false) + } + + for attr in protoOpDesc.attrs { + if (attr.type != .block) { + attrs[attr.name] = attrWithProtoDesc(attrDesc: attr) + } + } + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/Program.swift b/metal/paddle-mobile/paddle-mobile/Program/Program.swift new file mode 100644 index 0000000000..a346af8304 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/Program.swift @@ -0,0 +1,26 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +public struct Program { + let paramPath: String + let programDesc: ProgramDesc + let scope: Scope + init(protoProgramDesc: PaddleMobile_Framework_Proto_ProgramDesc, inParamPath: String, inScope: Scope) { + programDesc = ProgramDesc.init(protoProgram: protoProgramDesc) + paramPath = inParamPath + scope = inScope + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/ProgramDesc.swift b/metal/paddle-mobile/paddle-mobile/Program/ProgramDesc.swift new file mode 100644 index 0000000000..5e80037e5e --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/ProgramDesc.swift @@ -0,0 +1,24 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +public struct ProgramDesc { + var blocks: [BlockDesc] = [] + init(protoProgram: PaddleMobile_Framework_Proto_ProgramDesc) { + for block in protoProgram.blocks { + self.blocks.append(BlockDesc.init(block: block)) + } + } +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/Scope.swift b/metal/paddle-mobile/paddle-mobile/Program/Scope.swift new file mode 100644 index 0000000000..0f34ed20dd --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/Scope.swift @@ -0,0 +1,23 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +class Scope { + var vars: [String : Variant] = [:] + subscript(key: String) -> Variant?{ + return vars[key] + } + +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/TensorDesc.swift b/metal/paddle-mobile/paddle-mobile/Program/TensorDesc.swift new file mode 100644 index 0000000000..f6457c5355 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/TensorDesc.swift @@ -0,0 +1,25 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct TensorDesc { + let dims: [Int] + let dataType: VarTypeType + init(protoTensorDesc: PaddleMobile_Framework_Proto_VarType.TensorDesc) { + dims = protoTensorDesc.dims.map{ Int($0)} + dataType = VarTypeType.init(rawValue: protoTensorDesc.dataType.rawValue) ?? .ErrorType + } + +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/VarDesc.swift b/metal/paddle-mobile/paddle-mobile/Program/VarDesc.swift new file mode 100644 index 0000000000..a3cef09bfe --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/VarDesc.swift @@ -0,0 +1,80 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +enum VarTypeType: Int { + case ErrorType = -1, + Bool = 0, + Int16 = 1, + Int32 = 2, + Int64 = 3, + FP16 = 4, + FP32 = 5, + FP64 = 6, + LodTensor = 7, + SelectedRows = 8, + FeedMiniBatch = 9, + FetchList = 10, + StepScopes = 11, + StepLodRankTable = 12, + StepLodTensorArray = 13, + StepPlaceList = 14, + Reader = 15, + Channel = 16, + Raw = 17, + Tuple = 18 + + func dataTypeSize() throws -> Int { + switch self { + case .FP16: + return 2 + case .FP32: + return 4 + case .FP64: + return 8 + case .Int32: + return 4 + case .Int64: + return 8 + case .Bool: + return 1 + default: + throw PaddleMobileError.memoryError(message: "not support \(self) type to get size ") + } + } +} + +struct VarDesc { + let name: String + let persistable: Bool + let type: VarTypeType + let tensorDesc: TensorDesc? + init(protoVarDesc: PaddleMobile_Framework_Proto_VarDesc) { + type = VarTypeType.init(rawValue: protoVarDesc.type.type.rawValue) ?? .ErrorType + name = protoVarDesc.name + persistable = protoVarDesc.persistable + switch type { + case .SelectedRows: + tensorDesc = TensorDesc.init(protoTensorDesc: protoVarDesc.type.selectedRows) + case .LodTensor: + tensorDesc = TensorDesc.init(protoTensorDesc: protoVarDesc.type.lodTensor.tensor) + case .StepLodTensorArray: + tensorDesc = TensorDesc.init(protoTensorDesc: protoVarDesc.type.tensorArray.tensor); + default: + tensorDesc = .none + } + } + +} diff --git a/metal/paddle-mobile/paddle-mobile/Program/framework.pb.swift b/metal/paddle-mobile/paddle-mobile/Program/framework.pb.swift new file mode 100644 index 0000000000..df4af3bcc9 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/Program/framework.pb.swift @@ -0,0 +1,1821 @@ +// DO NOT EDIT. +// +// Generated by the Swift generator plugin for the protocol buffer compiler. +// Source: framework.proto +// +// For information on using the generated types, please see the documenation: +// https://github.com/apple/swift-protobuf/ + +// Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserved. +// +//Licensed under the Apache License, Version 2.0 (the "License"); +//you may not use this file except in compliance with the License. +//You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, software +//distributed under the License is distributed on an "AS IS" BASIS, +//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +//See the License for the specific language governing permissions and +//limitations under the License. + +import Foundation +import SwiftProtobuf + +// If the compiler emits an error on this type, it is because this file +// was generated by a version of the `protoc` Swift plug-in that is +// incompatible with the version of SwiftProtobuf to which you are linking. +// Please ensure that your are building against the same version of the API +// that was used to generate this file. +fileprivate struct _GeneratedWithProtocGenSwiftVersion: SwiftProtobuf.ProtobufAPIVersionCheck { + struct _2: SwiftProtobuf.ProtobufAPIVersion_2 {} + typealias Version = _2 +} + +enum PaddleMobile_Framework_Proto_AttrType: SwiftProtobuf.Enum { + typealias RawValue = Int + case int // = 0 + case float // = 1 + case string // = 2 + case ints // = 3 + case floats // = 4 + case strings // = 5 + case boolean // = 6 + case booleans // = 7 + case block // = 8 + case long // = 9 + + init() { + self = .int + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .int + case 1: self = .float + case 2: self = .string + case 3: self = .ints + case 4: self = .floats + case 5: self = .strings + case 6: self = .boolean + case 7: self = .booleans + case 8: self = .block + case 9: self = .long + default: return nil + } + } + + var rawValue: Int { + switch self { + case .int: return 0 + case .float: return 1 + case .string: return 2 + case .ints: return 3 + case .floats: return 4 + case .strings: return 5 + case .boolean: return 6 + case .booleans: return 7 + case .block: return 8 + case .long: return 9 + } + } + +} + +/// OpDesc describes an instance of a C++ framework::OperatorBase +/// derived class type. +struct PaddleMobile_Framework_Proto_OpDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var type: String { + get {return _type ?? String()} + set {_type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return self._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {self._type = nil} + + var inputs: [PaddleMobile_Framework_Proto_OpDesc.Var] = [] + + var outputs: [PaddleMobile_Framework_Proto_OpDesc.Var] = [] + + var attrs: [PaddleMobile_Framework_Proto_OpDesc.Attr] = [] + + var isTarget: Bool { + get {return _isTarget ?? false} + set {_isTarget = newValue} + } + /// Returns true if `isTarget` has been explicitly set. + var hasIsTarget: Bool {return self._isTarget != nil} + /// Clears the value of `isTarget`. Subsequent reads from it will return its default value. + mutating func clearIsTarget() {self._isTarget = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + struct Attr { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var name: String { + get {return _name ?? String()} + set {_name = newValue} + } + /// Returns true if `name` has been explicitly set. + var hasName: Bool {return self._name != nil} + /// Clears the value of `name`. Subsequent reads from it will return its default value. + mutating func clearName() {self._name = nil} + + var type: PaddleMobile_Framework_Proto_AttrType { + get {return _type ?? .int} + set {_type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return self._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {self._type = nil} + + var i: Int32 { + get {return _i ?? 0} + set {_i = newValue} + } + /// Returns true if `i` has been explicitly set. + var hasI: Bool {return self._i != nil} + /// Clears the value of `i`. Subsequent reads from it will return its default value. + mutating func clearI() {self._i = nil} + + var f: Float { + get {return _f ?? 0} + set {_f = newValue} + } + /// Returns true if `f` has been explicitly set. + var hasF: Bool {return self._f != nil} + /// Clears the value of `f`. Subsequent reads from it will return its default value. + mutating func clearF() {self._f = nil} + + var s: String { + get {return _s ?? String()} + set {_s = newValue} + } + /// Returns true if `s` has been explicitly set. + var hasS: Bool {return self._s != nil} + /// Clears the value of `s`. Subsequent reads from it will return its default value. + mutating func clearS() {self._s = nil} + + var ints: [Int32] = [] + + var floats: [Float] = [] + + var strings: [String] = [] + + var b: Bool { + get {return _b ?? false} + set {_b = newValue} + } + /// Returns true if `b` has been explicitly set. + var hasB: Bool {return self._b != nil} + /// Clears the value of `b`. Subsequent reads from it will return its default value. + mutating func clearB() {self._b = nil} + + var bools: [Bool] = [] + + var blockIdx: Int32 { + get {return _blockIdx ?? 0} + set {_blockIdx = newValue} + } + /// Returns true if `blockIdx` has been explicitly set. + var hasBlockIdx: Bool {return self._blockIdx != nil} + /// Clears the value of `blockIdx`. Subsequent reads from it will return its default value. + mutating func clearBlockIdx() {self._blockIdx = nil} + + var l: Int64 { + get {return _l ?? 0} + set {_l = newValue} + } + /// Returns true if `l` has been explicitly set. + var hasL: Bool {return self._l != nil} + /// Clears the value of `l`. Subsequent reads from it will return its default value. + mutating func clearL() {self._l = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _name: String? = nil + fileprivate var _type: PaddleMobile_Framework_Proto_AttrType? = nil + fileprivate var _i: Int32? = nil + fileprivate var _f: Float? = nil + fileprivate var _s: String? = nil + fileprivate var _b: Bool? = nil + fileprivate var _blockIdx: Int32? = nil + fileprivate var _l: Int64? = nil + } + + struct Var { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var parameter: String { + get {return _parameter ?? String()} + set {_parameter = newValue} + } + /// Returns true if `parameter` has been explicitly set. + var hasParameter: Bool {return self._parameter != nil} + /// Clears the value of `parameter`. Subsequent reads from it will return its default value. + mutating func clearParameter() {self._parameter = nil} + + var arguments: [String] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _parameter: String? = nil + } + + init() {} + + fileprivate var _type: String? = nil + fileprivate var _isTarget: Bool? = nil +} + +/// OpProto describes a C++ framework::OperatorBase derived class. +struct PaddleMobile_Framework_Proto_OpProto { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var type: String { + get {return _type ?? String()} + set {_type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return self._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {self._type = nil} + + var inputs: [PaddleMobile_Framework_Proto_OpProto.Var] = [] + + var outputs: [PaddleMobile_Framework_Proto_OpProto.Var] = [] + + var attrs: [PaddleMobile_Framework_Proto_OpProto.Attr] = [] + + var comment: String { + get {return _comment ?? String()} + set {_comment = newValue} + } + /// Returns true if `comment` has been explicitly set. + var hasComment: Bool {return self._comment != nil} + /// Clears the value of `comment`. Subsequent reads from it will return its default value. + mutating func clearComment() {self._comment = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + /// VarProto describes the C++ type framework::Variable. + struct Var { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var name: String { + get {return _name ?? String()} + set {_name = newValue} + } + /// Returns true if `name` has been explicitly set. + var hasName: Bool {return self._name != nil} + /// Clears the value of `name`. Subsequent reads from it will return its default value. + mutating func clearName() {self._name = nil} + + var comment: String { + get {return _comment ?? String()} + set {_comment = newValue} + } + /// Returns true if `comment` has been explicitly set. + var hasComment: Bool {return self._comment != nil} + /// Clears the value of `comment`. Subsequent reads from it will return its default value. + mutating func clearComment() {self._comment = nil} + + var duplicable: Bool { + get {return _duplicable ?? false} + set {_duplicable = newValue} + } + /// Returns true if `duplicable` has been explicitly set. + var hasDuplicable: Bool {return self._duplicable != nil} + /// Clears the value of `duplicable`. Subsequent reads from it will return its default value. + mutating func clearDuplicable() {self._duplicable = nil} + + var intermediate: Bool { + get {return _intermediate ?? false} + set {_intermediate = newValue} + } + /// Returns true if `intermediate` has been explicitly set. + var hasIntermediate: Bool {return self._intermediate != nil} + /// Clears the value of `intermediate`. Subsequent reads from it will return its default value. + mutating func clearIntermediate() {self._intermediate = nil} + + var dispensable: Bool { + get {return _dispensable ?? false} + set {_dispensable = newValue} + } + /// Returns true if `dispensable` has been explicitly set. + var hasDispensable: Bool {return self._dispensable != nil} + /// Clears the value of `dispensable`. Subsequent reads from it will return its default value. + mutating func clearDispensable() {self._dispensable = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _name: String? = nil + fileprivate var _comment: String? = nil + fileprivate var _duplicable: Bool? = nil + fileprivate var _intermediate: Bool? = nil + fileprivate var _dispensable: Bool? = nil + } + + /// AttrProto describes the C++ type Attribute. + struct Attr { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var name: String { + get {return _name ?? String()} + set {_name = newValue} + } + /// Returns true if `name` has been explicitly set. + var hasName: Bool {return self._name != nil} + /// Clears the value of `name`. Subsequent reads from it will return its default value. + mutating func clearName() {self._name = nil} + + var type: PaddleMobile_Framework_Proto_AttrType { + get {return _type ?? .int} + set {_type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return self._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {self._type = nil} + + var comment: String { + get {return _comment ?? String()} + set {_comment = newValue} + } + /// Returns true if `comment` has been explicitly set. + var hasComment: Bool {return self._comment != nil} + /// Clears the value of `comment`. Subsequent reads from it will return its default value. + mutating func clearComment() {self._comment = nil} + + /// If that attribute is generated, it means the Paddle third + /// language binding has responsibility to fill that + /// attribute. End-User should not set that attribute. + var generated: Bool { + get {return _generated ?? false} + set {_generated = newValue} + } + /// Returns true if `generated` has been explicitly set. + var hasGenerated: Bool {return self._generated != nil} + /// Clears the value of `generated`. Subsequent reads from it will return its default value. + mutating func clearGenerated() {self._generated = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _name: String? = nil + fileprivate var _type: PaddleMobile_Framework_Proto_AttrType? = nil + fileprivate var _comment: String? = nil + fileprivate var _generated: Bool? = nil + } + + init() {} + + fileprivate var _type: String? = nil + fileprivate var _comment: String? = nil +} + +struct PaddleMobile_Framework_Proto_VarType { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var type: PaddleMobile_Framework_Proto_VarType.TypeEnum { + get {return _storage._type ?? .bool} + set {_uniqueStorage()._type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return _storage._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {_storage._type = nil} + + var selectedRows: PaddleMobile_Framework_Proto_VarType.TensorDesc { + get {return _storage._selectedRows ?? PaddleMobile_Framework_Proto_VarType.TensorDesc()} + set {_uniqueStorage()._selectedRows = newValue} + } + /// Returns true if `selectedRows` has been explicitly set. + var hasSelectedRows: Bool {return _storage._selectedRows != nil} + /// Clears the value of `selectedRows`. Subsequent reads from it will return its default value. + mutating func clearSelectedRows() {_storage._selectedRows = nil} + + var lodTensor: PaddleMobile_Framework_Proto_VarType.LoDTensorDesc { + get {return _storage._lodTensor ?? PaddleMobile_Framework_Proto_VarType.LoDTensorDesc()} + set {_uniqueStorage()._lodTensor = newValue} + } + /// Returns true if `lodTensor` has been explicitly set. + var hasLodTensor: Bool {return _storage._lodTensor != nil} + /// Clears the value of `lodTensor`. Subsequent reads from it will return its default value. + mutating func clearLodTensor() {_storage._lodTensor = nil} + + var tensorArray: PaddleMobile_Framework_Proto_VarType.LoDTensorArrayDesc { + get {return _storage._tensorArray ?? PaddleMobile_Framework_Proto_VarType.LoDTensorArrayDesc()} + set {_uniqueStorage()._tensorArray = newValue} + } + /// Returns true if `tensorArray` has been explicitly set. + var hasTensorArray: Bool {return _storage._tensorArray != nil} + /// Clears the value of `tensorArray`. Subsequent reads from it will return its default value. + mutating func clearTensorArray() {_storage._tensorArray = nil} + + var reader: PaddleMobile_Framework_Proto_VarType.ReaderDesc { + get {return _storage._reader ?? PaddleMobile_Framework_Proto_VarType.ReaderDesc()} + set {_uniqueStorage()._reader = newValue} + } + /// Returns true if `reader` has been explicitly set. + var hasReader: Bool {return _storage._reader != nil} + /// Clears the value of `reader`. Subsequent reads from it will return its default value. + mutating func clearReader() {_storage._reader = nil} + + var channel: PaddleMobile_Framework_Proto_VarType.ChannelDesc { + get {return _storage._channel ?? PaddleMobile_Framework_Proto_VarType.ChannelDesc()} + set {_uniqueStorage()._channel = newValue} + } + /// Returns true if `channel` has been explicitly set. + var hasChannel: Bool {return _storage._channel != nil} + /// Clears the value of `channel`. Subsequent reads from it will return its default value. + mutating func clearChannel() {_storage._channel = nil} + + var tuple: PaddleMobile_Framework_Proto_VarType.Tuple { + get {return _storage._tuple ?? PaddleMobile_Framework_Proto_VarType.Tuple()} + set {_uniqueStorage()._tuple = newValue} + } + /// Returns true if `tuple` has been explicitly set. + var hasTuple: Bool {return _storage._tuple != nil} + /// Clears the value of `tuple`. Subsequent reads from it will return its default value. + mutating func clearTuple() {_storage._tuple = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + enum TypeEnum: SwiftProtobuf.Enum { + typealias RawValue = Int + + /// Pod Types + case bool // = 0 + case int16 // = 1 + case int32 // = 2 + case int64 // = 3 + case fp16 // = 4 + case fp32 // = 5 + case fp64 // = 6 + + /// Other types that may need additional descriptions + case lodTensor // = 7 + case selectedRows // = 8 + case feedMinibatch // = 9 + case fetchList // = 10 + case stepScopes // = 11 + case lodRankTable // = 12 + case lodTensorArray // = 13 + case placeList // = 14 + case reader // = 15 + case channel // = 16 + + /// Any runtime decided variable type is raw + /// raw variables should manage their own allocations + /// in operators like nccl_op + case raw // = 17 + case tuple // = 18 + + init() { + self = .bool + } + + init?(rawValue: Int) { + switch rawValue { + case 0: self = .bool + case 1: self = .int16 + case 2: self = .int32 + case 3: self = .int64 + case 4: self = .fp16 + case 5: self = .fp32 + case 6: self = .fp64 + case 7: self = .lodTensor + case 8: self = .selectedRows + case 9: self = .feedMinibatch + case 10: self = .fetchList + case 11: self = .stepScopes + case 12: self = .lodRankTable + case 13: self = .lodTensorArray + case 14: self = .placeList + case 15: self = .reader + case 16: self = .channel + case 17: self = .raw + case 18: self = .tuple + default: return nil + } + } + + var rawValue: Int { + switch self { + case .bool: return 0 + case .int16: return 1 + case .int32: return 2 + case .int64: return 3 + case .fp16: return 4 + case .fp32: return 5 + case .fp64: return 6 + case .lodTensor: return 7 + case .selectedRows: return 8 + case .feedMinibatch: return 9 + case .fetchList: return 10 + case .stepScopes: return 11 + case .lodRankTable: return 12 + case .lodTensorArray: return 13 + case .placeList: return 14 + case .reader: return 15 + case .channel: return 16 + case .raw: return 17 + case .tuple: return 18 + } + } + + } + + struct TensorDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + /// Should only be PODType. Is enforced in C++ + var dataType: PaddleMobile_Framework_Proto_VarType.TypeEnum { + get {return _dataType ?? .bool} + set {_dataType = newValue} + } + /// Returns true if `dataType` has been explicitly set. + var hasDataType: Bool {return self._dataType != nil} + /// Clears the value of `dataType`. Subsequent reads from it will return its default value. + mutating func clearDataType() {self._dataType = nil} + + /// [UNK, 640, 480] is saved as [-1, 640, 480] + var dims: [Int64] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _dataType: PaddleMobile_Framework_Proto_VarType.TypeEnum? = nil + } + + struct LoDTensorDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var tensor: PaddleMobile_Framework_Proto_VarType.TensorDesc { + get {return _storage._tensor ?? PaddleMobile_Framework_Proto_VarType.TensorDesc()} + set {_uniqueStorage()._tensor = newValue} + } + /// Returns true if `tensor` has been explicitly set. + var hasTensor: Bool {return _storage._tensor != nil} + /// Clears the value of `tensor`. Subsequent reads from it will return its default value. + mutating func clearTensor() {_storage._tensor = nil} + + var lodLevel: Int32 { + get {return _storage._lodLevel ?? 0} + set {_uniqueStorage()._lodLevel = newValue} + } + /// Returns true if `lodLevel` has been explicitly set. + var hasLodLevel: Bool {return _storage._lodLevel != nil} + /// Clears the value of `lodLevel`. Subsequent reads from it will return its default value. + mutating func clearLodLevel() {_storage._lodLevel = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance + } + + struct LoDTensorArrayDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var tensor: PaddleMobile_Framework_Proto_VarType.TensorDesc { + get {return _storage._tensor ?? PaddleMobile_Framework_Proto_VarType.TensorDesc()} + set {_uniqueStorage()._tensor = newValue} + } + /// Returns true if `tensor` has been explicitly set. + var hasTensor: Bool {return _storage._tensor != nil} + /// Clears the value of `tensor`. Subsequent reads from it will return its default value. + mutating func clearTensor() {_storage._tensor = nil} + + var lodLevel: Int32 { + get {return _storage._lodLevel ?? 0} + set {_uniqueStorage()._lodLevel = newValue} + } + /// Returns true if `lodLevel` has been explicitly set. + var hasLodLevel: Bool {return _storage._lodLevel != nil} + /// Clears the value of `lodLevel`. Subsequent reads from it will return its default value. + mutating func clearLodLevel() {_storage._lodLevel = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance + } + + struct ReaderDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var lodTensor: [PaddleMobile_Framework_Proto_VarType.LoDTensorDesc] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + + struct ChannelDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var dataType: PaddleMobile_Framework_Proto_VarType.TypeEnum { + get {return _dataType ?? .bool} + set {_dataType = newValue} + } + /// Returns true if `dataType` has been explicitly set. + var hasDataType: Bool {return self._dataType != nil} + /// Clears the value of `dataType`. Subsequent reads from it will return its default value. + mutating func clearDataType() {self._dataType = nil} + + var capacity: Int64 { + get {return _capacity ?? 0} + set {_capacity = newValue} + } + /// Returns true if `capacity` has been explicitly set. + var hasCapacity: Bool {return self._capacity != nil} + /// Clears the value of `capacity`. Subsequent reads from it will return its default value. + mutating func clearCapacity() {self._capacity = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _dataType: PaddleMobile_Framework_Proto_VarType.TypeEnum? = nil + fileprivate var _capacity: Int64? = nil + } + + struct Tuple { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var elementType: [PaddleMobile_Framework_Proto_VarType.TypeEnum] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + } + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct PaddleMobile_Framework_Proto_VarDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var name: String { + get {return _storage._name ?? String()} + set {_uniqueStorage()._name = newValue} + } + /// Returns true if `name` has been explicitly set. + var hasName: Bool {return _storage._name != nil} + /// Clears the value of `name`. Subsequent reads from it will return its default value. + mutating func clearName() {_storage._name = nil} + + var type: PaddleMobile_Framework_Proto_VarType { + get {return _storage._type ?? PaddleMobile_Framework_Proto_VarType()} + set {_uniqueStorage()._type = newValue} + } + /// Returns true if `type` has been explicitly set. + var hasType: Bool {return _storage._type != nil} + /// Clears the value of `type`. Subsequent reads from it will return its default value. + mutating func clearType() {_storage._type = nil} + + var persistable: Bool { + get {return _storage._persistable ?? false} + set {_uniqueStorage()._persistable = newValue} + } + /// Returns true if `persistable` has been explicitly set. + var hasPersistable: Bool {return _storage._persistable != nil} + /// Clears the value of `persistable`. Subsequent reads from it will return its default value. + mutating func clearPersistable() {_storage._persistable = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _storage = _StorageClass.defaultInstance +} + +struct PaddleMobile_Framework_Proto_BlockDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var idx: Int32 { + get {return _idx ?? 0} + set {_idx = newValue} + } + /// Returns true if `idx` has been explicitly set. + var hasIdx: Bool {return self._idx != nil} + /// Clears the value of `idx`. Subsequent reads from it will return its default value. + mutating func clearIdx() {self._idx = nil} + + var parentIdx: Int32 { + get {return _parentIdx ?? 0} + set {_parentIdx = newValue} + } + /// Returns true if `parentIdx` has been explicitly set. + var hasParentIdx: Bool {return self._parentIdx != nil} + /// Clears the value of `parentIdx`. Subsequent reads from it will return its default value. + mutating func clearParentIdx() {self._parentIdx = nil} + + var vars: [PaddleMobile_Framework_Proto_VarDesc] = [] + + var ops: [PaddleMobile_Framework_Proto_OpDesc] = [] + + var forwardBlockIdx: Int32 { + get {return _forwardBlockIdx ?? -1} + set {_forwardBlockIdx = newValue} + } + /// Returns true if `forwardBlockIdx` has been explicitly set. + var hasForwardBlockIdx: Bool {return self._forwardBlockIdx != nil} + /// Clears the value of `forwardBlockIdx`. Subsequent reads from it will return its default value. + mutating func clearForwardBlockIdx() {self._forwardBlockIdx = nil} + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} + + fileprivate var _idx: Int32? = nil + fileprivate var _parentIdx: Int32? = nil + fileprivate var _forwardBlockIdx: Int32? = nil +} + +/// Please refer to +/// https://github.com/PaddlePaddle/Paddle/blob/develop/doc/design/program.md +/// for more details. +/// TODO(panyx0718): A model can have multiple programs. Need a +/// way to distinguish them. Maybe ID or name? +struct PaddleMobile_Framework_Proto_ProgramDesc { + // SwiftProtobuf.Message conformance is added in an extension below. See the + // `Message` and `Message+*Additions` files in the SwiftProtobuf library for + // methods supported on all messages. + + var blocks: [PaddleMobile_Framework_Proto_BlockDesc] = [] + + var unknownFields = SwiftProtobuf.UnknownStorage() + + init() {} +} + +// MARK: - Code below here is support for the SwiftProtobuf runtime. + +fileprivate let _protobuf_package = "paddle_mobile.framework.proto" + +extension PaddleMobile_Framework_Proto_AttrType: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "INT"), + 1: .same(proto: "FLOAT"), + 2: .same(proto: "STRING"), + 3: .same(proto: "INTS"), + 4: .same(proto: "FLOATS"), + 5: .same(proto: "STRINGS"), + 6: .same(proto: "BOOLEAN"), + 7: .same(proto: "BOOLEANS"), + 8: .same(proto: "BLOCK"), + 9: .same(proto: "LONG"), + ] +} + +extension PaddleMobile_Framework_Proto_OpDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".OpDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 3: .same(proto: "type"), + 1: .same(proto: "inputs"), + 2: .same(proto: "outputs"), + 4: .same(proto: "attrs"), + 5: .standard(proto: "is_target"), + ] + + public var isInitialized: Bool { + if self._type == nil {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.inputs) {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.outputs) {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.attrs) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeRepeatedMessageField(value: &self.inputs) + case 2: try decoder.decodeRepeatedMessageField(value: &self.outputs) + case 3: try decoder.decodeSingularStringField(value: &self._type) + case 4: try decoder.decodeRepeatedMessageField(value: &self.attrs) + case 5: try decoder.decodeSingularBoolField(value: &self._isTarget) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.inputs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.inputs, fieldNumber: 1) + } + if !self.outputs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.outputs, fieldNumber: 2) + } + if let v = self._type { + try visitor.visitSingularStringField(value: v, fieldNumber: 3) + } + if !self.attrs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.attrs, fieldNumber: 4) + } + if let v = self._isTarget { + try visitor.visitSingularBoolField(value: v, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpDesc) -> Bool { + if self._type != other._type {return false} + if self.inputs != other.inputs {return false} + if self.outputs != other.outputs {return false} + if self.attrs != other.attrs {return false} + if self._isTarget != other._isTarget {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_OpDesc.Attr: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_OpDesc.protoMessageName + ".Attr" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "type"), + 3: .same(proto: "i"), + 4: .same(proto: "f"), + 5: .same(proto: "s"), + 6: .same(proto: "ints"), + 7: .same(proto: "floats"), + 8: .same(proto: "strings"), + 10: .same(proto: "b"), + 11: .same(proto: "bools"), + 12: .standard(proto: "block_idx"), + 13: .same(proto: "l"), + ] + + public var isInitialized: Bool { + if self._name == nil {return false} + if self._type == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &self._name) + case 2: try decoder.decodeSingularEnumField(value: &self._type) + case 3: try decoder.decodeSingularInt32Field(value: &self._i) + case 4: try decoder.decodeSingularFloatField(value: &self._f) + case 5: try decoder.decodeSingularStringField(value: &self._s) + case 6: try decoder.decodeRepeatedInt32Field(value: &self.ints) + case 7: try decoder.decodeRepeatedFloatField(value: &self.floats) + case 8: try decoder.decodeRepeatedStringField(value: &self.strings) + case 10: try decoder.decodeSingularBoolField(value: &self._b) + case 11: try decoder.decodeRepeatedBoolField(value: &self.bools) + case 12: try decoder.decodeSingularInt32Field(value: &self._blockIdx) + case 13: try decoder.decodeSingularInt64Field(value: &self._l) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._name { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if let v = self._type { + try visitor.visitSingularEnumField(value: v, fieldNumber: 2) + } + if let v = self._i { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 3) + } + if let v = self._f { + try visitor.visitSingularFloatField(value: v, fieldNumber: 4) + } + if let v = self._s { + try visitor.visitSingularStringField(value: v, fieldNumber: 5) + } + if !self.ints.isEmpty { + try visitor.visitRepeatedInt32Field(value: self.ints, fieldNumber: 6) + } + if !self.floats.isEmpty { + try visitor.visitRepeatedFloatField(value: self.floats, fieldNumber: 7) + } + if !self.strings.isEmpty { + try visitor.visitRepeatedStringField(value: self.strings, fieldNumber: 8) + } + if let v = self._b { + try visitor.visitSingularBoolField(value: v, fieldNumber: 10) + } + if !self.bools.isEmpty { + try visitor.visitRepeatedBoolField(value: self.bools, fieldNumber: 11) + } + if let v = self._blockIdx { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 12) + } + if let v = self._l { + try visitor.visitSingularInt64Field(value: v, fieldNumber: 13) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpDesc.Attr) -> Bool { + if self._name != other._name {return false} + if self._type != other._type {return false} + if self._i != other._i {return false} + if self._f != other._f {return false} + if self._s != other._s {return false} + if self.ints != other.ints {return false} + if self.floats != other.floats {return false} + if self.strings != other.strings {return false} + if self._b != other._b {return false} + if self.bools != other.bools {return false} + if self._blockIdx != other._blockIdx {return false} + if self._l != other._l {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_OpDesc.Var: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_OpDesc.protoMessageName + ".Var" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "parameter"), + 2: .same(proto: "arguments"), + ] + + public var isInitialized: Bool { + if self._parameter == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &self._parameter) + case 2: try decoder.decodeRepeatedStringField(value: &self.arguments) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._parameter { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if !self.arguments.isEmpty { + try visitor.visitRepeatedStringField(value: self.arguments, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpDesc.Var) -> Bool { + if self._parameter != other._parameter {return false} + if self.arguments != other.arguments {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_OpProto: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".OpProto" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "type"), + 2: .same(proto: "inputs"), + 3: .same(proto: "outputs"), + 4: .same(proto: "attrs"), + 5: .same(proto: "comment"), + ] + + public var isInitialized: Bool { + if self._type == nil {return false} + if self._comment == nil {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.inputs) {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.outputs) {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.attrs) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &self._type) + case 2: try decoder.decodeRepeatedMessageField(value: &self.inputs) + case 3: try decoder.decodeRepeatedMessageField(value: &self.outputs) + case 4: try decoder.decodeRepeatedMessageField(value: &self.attrs) + case 5: try decoder.decodeSingularStringField(value: &self._comment) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._type { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if !self.inputs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.inputs, fieldNumber: 2) + } + if !self.outputs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.outputs, fieldNumber: 3) + } + if !self.attrs.isEmpty { + try visitor.visitRepeatedMessageField(value: self.attrs, fieldNumber: 4) + } + if let v = self._comment { + try visitor.visitSingularStringField(value: v, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpProto) -> Bool { + if self._type != other._type {return false} + if self.inputs != other.inputs {return false} + if self.outputs != other.outputs {return false} + if self.attrs != other.attrs {return false} + if self._comment != other._comment {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_OpProto.Var: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_OpProto.protoMessageName + ".Var" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "comment"), + 3: .same(proto: "duplicable"), + 4: .same(proto: "intermediate"), + 5: .same(proto: "dispensable"), + ] + + public var isInitialized: Bool { + if self._name == nil {return false} + if self._comment == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &self._name) + case 2: try decoder.decodeSingularStringField(value: &self._comment) + case 3: try decoder.decodeSingularBoolField(value: &self._duplicable) + case 4: try decoder.decodeSingularBoolField(value: &self._intermediate) + case 5: try decoder.decodeSingularBoolField(value: &self._dispensable) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._name { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if let v = self._comment { + try visitor.visitSingularStringField(value: v, fieldNumber: 2) + } + if let v = self._duplicable { + try visitor.visitSingularBoolField(value: v, fieldNumber: 3) + } + if let v = self._intermediate { + try visitor.visitSingularBoolField(value: v, fieldNumber: 4) + } + if let v = self._dispensable { + try visitor.visitSingularBoolField(value: v, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpProto.Var) -> Bool { + if self._name != other._name {return false} + if self._comment != other._comment {return false} + if self._duplicable != other._duplicable {return false} + if self._intermediate != other._intermediate {return false} + if self._dispensable != other._dispensable {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_OpProto.Attr: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_OpProto.protoMessageName + ".Attr" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "type"), + 3: .same(proto: "comment"), + 4: .same(proto: "generated"), + ] + + public var isInitialized: Bool { + if self._name == nil {return false} + if self._type == nil {return false} + if self._comment == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &self._name) + case 2: try decoder.decodeSingularEnumField(value: &self._type) + case 3: try decoder.decodeSingularStringField(value: &self._comment) + case 4: try decoder.decodeSingularBoolField(value: &self._generated) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._name { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if let v = self._type { + try visitor.visitSingularEnumField(value: v, fieldNumber: 2) + } + if let v = self._comment { + try visitor.visitSingularStringField(value: v, fieldNumber: 3) + } + if let v = self._generated { + try visitor.visitSingularBoolField(value: v, fieldNumber: 4) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_OpProto.Attr) -> Bool { + if self._name != other._name {return false} + if self._type != other._type {return false} + if self._comment != other._comment {return false} + if self._generated != other._generated {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".VarType" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "type"), + 2: .standard(proto: "selected_rows"), + 3: .standard(proto: "lod_tensor"), + 4: .standard(proto: "tensor_array"), + 5: .same(proto: "reader"), + 6: .same(proto: "channel"), + 7: .same(proto: "tuple"), + ] + + fileprivate class _StorageClass { + var _type: PaddleMobile_Framework_Proto_VarType.TypeEnum? = nil + var _selectedRows: PaddleMobile_Framework_Proto_VarType.TensorDesc? = nil + var _lodTensor: PaddleMobile_Framework_Proto_VarType.LoDTensorDesc? = nil + var _tensorArray: PaddleMobile_Framework_Proto_VarType.LoDTensorArrayDesc? = nil + var _reader: PaddleMobile_Framework_Proto_VarType.ReaderDesc? = nil + var _channel: PaddleMobile_Framework_Proto_VarType.ChannelDesc? = nil + var _tuple: PaddleMobile_Framework_Proto_VarType.Tuple? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _type = source._type + _selectedRows = source._selectedRows + _lodTensor = source._lodTensor + _tensorArray = source._tensorArray + _reader = source._reader + _channel = source._channel + _tuple = source._tuple + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + public var isInitialized: Bool { + return withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._type == nil {return false} + if let v = _storage._selectedRows, !v.isInitialized {return false} + if let v = _storage._lodTensor, !v.isInitialized {return false} + if let v = _storage._tensorArray, !v.isInitialized {return false} + if let v = _storage._reader, !v.isInitialized {return false} + if let v = _storage._channel, !v.isInitialized {return false} + return true + } + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularEnumField(value: &_storage._type) + case 2: try decoder.decodeSingularMessageField(value: &_storage._selectedRows) + case 3: try decoder.decodeSingularMessageField(value: &_storage._lodTensor) + case 4: try decoder.decodeSingularMessageField(value: &_storage._tensorArray) + case 5: try decoder.decodeSingularMessageField(value: &_storage._reader) + case 6: try decoder.decodeSingularMessageField(value: &_storage._channel) + case 7: try decoder.decodeSingularMessageField(value: &_storage._tuple) + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if let v = _storage._type { + try visitor.visitSingularEnumField(value: v, fieldNumber: 1) + } + if let v = _storage._selectedRows { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + if let v = _storage._lodTensor { + try visitor.visitSingularMessageField(value: v, fieldNumber: 3) + } + if let v = _storage._tensorArray { + try visitor.visitSingularMessageField(value: v, fieldNumber: 4) + } + if let v = _storage._reader { + try visitor.visitSingularMessageField(value: v, fieldNumber: 5) + } + if let v = _storage._channel { + try visitor.visitSingularMessageField(value: v, fieldNumber: 6) + } + if let v = _storage._tuple { + try visitor.visitSingularMessageField(value: v, fieldNumber: 7) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType) -> Bool { + if _storage !== other._storage { + let storagesAreEqual: Bool = withExtendedLifetime((_storage, other._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let other_storage = _args.1 + if _storage._type != other_storage._type {return false} + if _storage._selectedRows != other_storage._selectedRows {return false} + if _storage._lodTensor != other_storage._lodTensor {return false} + if _storage._tensorArray != other_storage._tensorArray {return false} + if _storage._reader != other_storage._reader {return false} + if _storage._channel != other_storage._channel {return false} + if _storage._tuple != other_storage._tuple {return false} + return true + } + if !storagesAreEqual {return false} + } + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.TypeEnum: SwiftProtobuf._ProtoNameProviding { + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 0: .same(proto: "BOOL"), + 1: .same(proto: "INT16"), + 2: .same(proto: "INT32"), + 3: .same(proto: "INT64"), + 4: .same(proto: "FP16"), + 5: .same(proto: "FP32"), + 6: .same(proto: "FP64"), + 7: .same(proto: "LOD_TENSOR"), + 8: .same(proto: "SELECTED_ROWS"), + 9: .same(proto: "FEED_MINIBATCH"), + 10: .same(proto: "FETCH_LIST"), + 11: .same(proto: "STEP_SCOPES"), + 12: .same(proto: "LOD_RANK_TABLE"), + 13: .same(proto: "LOD_TENSOR_ARRAY"), + 14: .same(proto: "PLACE_LIST"), + 15: .same(proto: "READER"), + 16: .same(proto: "CHANNEL"), + 17: .same(proto: "RAW"), + 18: .same(proto: "TUPLE"), + ] +} + +extension PaddleMobile_Framework_Proto_VarType.TensorDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".TensorDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "data_type"), + 2: .same(proto: "dims"), + ] + + public var isInitialized: Bool { + if self._dataType == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularEnumField(value: &self._dataType) + case 2: try decoder.decodeRepeatedInt64Field(value: &self.dims) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._dataType { + try visitor.visitSingularEnumField(value: v, fieldNumber: 1) + } + if !self.dims.isEmpty { + try visitor.visitRepeatedInt64Field(value: self.dims, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.TensorDesc) -> Bool { + if self._dataType != other._dataType {return false} + if self.dims != other.dims {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.LoDTensorDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".LoDTensorDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tensor"), + 2: .standard(proto: "lod_level"), + ] + + fileprivate class _StorageClass { + var _tensor: PaddleMobile_Framework_Proto_VarType.TensorDesc? = nil + var _lodLevel: Int32? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _tensor = source._tensor + _lodLevel = source._lodLevel + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + public var isInitialized: Bool { + return withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._tensor == nil {return false} + if let v = _storage._tensor, !v.isInitialized {return false} + return true + } + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularMessageField(value: &_storage._tensor) + case 2: try decoder.decodeSingularInt32Field(value: &_storage._lodLevel) + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if let v = _storage._tensor { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if let v = _storage._lodLevel { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 2) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.LoDTensorDesc) -> Bool { + if _storage !== other._storage { + let storagesAreEqual: Bool = withExtendedLifetime((_storage, other._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let other_storage = _args.1 + if _storage._tensor != other_storage._tensor {return false} + if _storage._lodLevel != other_storage._lodLevel {return false} + return true + } + if !storagesAreEqual {return false} + } + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.LoDTensorArrayDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".LoDTensorArrayDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "tensor"), + 2: .standard(proto: "lod_level"), + ] + + fileprivate class _StorageClass { + var _tensor: PaddleMobile_Framework_Proto_VarType.TensorDesc? = nil + var _lodLevel: Int32? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _tensor = source._tensor + _lodLevel = source._lodLevel + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + public var isInitialized: Bool { + return withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._tensor == nil {return false} + if let v = _storage._tensor, !v.isInitialized {return false} + return true + } + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularMessageField(value: &_storage._tensor) + case 2: try decoder.decodeSingularInt32Field(value: &_storage._lodLevel) + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if let v = _storage._tensor { + try visitor.visitSingularMessageField(value: v, fieldNumber: 1) + } + if let v = _storage._lodLevel { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 2) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.LoDTensorArrayDesc) -> Bool { + if _storage !== other._storage { + let storagesAreEqual: Bool = withExtendedLifetime((_storage, other._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let other_storage = _args.1 + if _storage._tensor != other_storage._tensor {return false} + if _storage._lodLevel != other_storage._lodLevel {return false} + return true + } + if !storagesAreEqual {return false} + } + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.ReaderDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".ReaderDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "lod_tensor"), + ] + + public var isInitialized: Bool { + if !SwiftProtobuf.Internal.areAllInitialized(self.lodTensor) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeRepeatedMessageField(value: &self.lodTensor) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.lodTensor.isEmpty { + try visitor.visitRepeatedMessageField(value: self.lodTensor, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.ReaderDesc) -> Bool { + if self.lodTensor != other.lodTensor {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.ChannelDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".ChannelDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "data_type"), + 2: .same(proto: "capacity"), + ] + + public var isInitialized: Bool { + if self._dataType == nil {return false} + if self._capacity == nil {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularEnumField(value: &self._dataType) + case 2: try decoder.decodeSingularInt64Field(value: &self._capacity) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._dataType { + try visitor.visitSingularEnumField(value: v, fieldNumber: 1) + } + if let v = self._capacity { + try visitor.visitSingularInt64Field(value: v, fieldNumber: 2) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.ChannelDesc) -> Bool { + if self._dataType != other._dataType {return false} + if self._capacity != other._capacity {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarType.Tuple: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = PaddleMobile_Framework_Proto_VarType.protoMessageName + ".Tuple" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .standard(proto: "element_type"), + ] + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeRepeatedEnumField(value: &self.elementType) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.elementType.isEmpty { + try visitor.visitRepeatedEnumField(value: self.elementType, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarType.Tuple) -> Bool { + if self.elementType != other.elementType {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_VarDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".VarDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "name"), + 2: .same(proto: "type"), + 3: .same(proto: "persistable"), + ] + + fileprivate class _StorageClass { + var _name: String? = nil + var _type: PaddleMobile_Framework_Proto_VarType? = nil + var _persistable: Bool? = nil + + static let defaultInstance = _StorageClass() + + private init() {} + + init(copying source: _StorageClass) { + _name = source._name + _type = source._type + _persistable = source._persistable + } + } + + fileprivate mutating func _uniqueStorage() -> _StorageClass { + if !isKnownUniquelyReferenced(&_storage) { + _storage = _StorageClass(copying: _storage) + } + return _storage + } + + public var isInitialized: Bool { + return withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if _storage._name == nil {return false} + if _storage._type == nil {return false} + if let v = _storage._type, !v.isInitialized {return false} + return true + } + } + + mutating func decodeMessage(decoder: inout D) throws { + _ = _uniqueStorage() + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularStringField(value: &_storage._name) + case 2: try decoder.decodeSingularMessageField(value: &_storage._type) + case 3: try decoder.decodeSingularBoolField(value: &_storage._persistable) + default: break + } + } + } + } + + func traverse(visitor: inout V) throws { + try withExtendedLifetime(_storage) { (_storage: _StorageClass) in + if let v = _storage._name { + try visitor.visitSingularStringField(value: v, fieldNumber: 1) + } + if let v = _storage._type { + try visitor.visitSingularMessageField(value: v, fieldNumber: 2) + } + if let v = _storage._persistable { + try visitor.visitSingularBoolField(value: v, fieldNumber: 3) + } + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_VarDesc) -> Bool { + if _storage !== other._storage { + let storagesAreEqual: Bool = withExtendedLifetime((_storage, other._storage)) { (_args: (_StorageClass, _StorageClass)) in + let _storage = _args.0 + let other_storage = _args.1 + if _storage._name != other_storage._name {return false} + if _storage._type != other_storage._type {return false} + if _storage._persistable != other_storage._persistable {return false} + return true + } + if !storagesAreEqual {return false} + } + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_BlockDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".BlockDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "idx"), + 2: .standard(proto: "parent_idx"), + 3: .same(proto: "vars"), + 4: .same(proto: "ops"), + 5: .standard(proto: "forward_block_idx"), + ] + + public var isInitialized: Bool { + if self._idx == nil {return false} + if self._parentIdx == nil {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.vars) {return false} + if !SwiftProtobuf.Internal.areAllInitialized(self.ops) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeSingularInt32Field(value: &self._idx) + case 2: try decoder.decodeSingularInt32Field(value: &self._parentIdx) + case 3: try decoder.decodeRepeatedMessageField(value: &self.vars) + case 4: try decoder.decodeRepeatedMessageField(value: &self.ops) + case 5: try decoder.decodeSingularInt32Field(value: &self._forwardBlockIdx) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if let v = self._idx { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 1) + } + if let v = self._parentIdx { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 2) + } + if !self.vars.isEmpty { + try visitor.visitRepeatedMessageField(value: self.vars, fieldNumber: 3) + } + if !self.ops.isEmpty { + try visitor.visitRepeatedMessageField(value: self.ops, fieldNumber: 4) + } + if let v = self._forwardBlockIdx { + try visitor.visitSingularInt32Field(value: v, fieldNumber: 5) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_BlockDesc) -> Bool { + if self._idx != other._idx {return false} + if self._parentIdx != other._parentIdx {return false} + if self.vars != other.vars {return false} + if self.ops != other.ops {return false} + if self._forwardBlockIdx != other._forwardBlockIdx {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} + +extension PaddleMobile_Framework_Proto_ProgramDesc: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { + static let protoMessageName: String = _protobuf_package + ".ProgramDesc" + static let _protobuf_nameMap: SwiftProtobuf._NameMap = [ + 1: .same(proto: "blocks"), + ] + + public var isInitialized: Bool { + if !SwiftProtobuf.Internal.areAllInitialized(self.blocks) {return false} + return true + } + + mutating func decodeMessage(decoder: inout D) throws { + while let fieldNumber = try decoder.nextFieldNumber() { + switch fieldNumber { + case 1: try decoder.decodeRepeatedMessageField(value: &self.blocks) + default: break + } + } + } + + func traverse(visitor: inout V) throws { + if !self.blocks.isEmpty { + try visitor.visitRepeatedMessageField(value: self.blocks, fieldNumber: 1) + } + try unknownFields.traverse(visitor: &visitor) + } + + func _protobuf_generated_isEqualTo(other: PaddleMobile_Framework_Proto_ProgramDesc) -> Bool { + if self.blocks != other.blocks {return false} + if unknownFields != other.unknownFields {return false} + return true + } +} diff --git a/metal/paddle-mobile/paddle-mobile/framework/Dim.swift b/metal/paddle-mobile/paddle-mobile/framework/Dim.swift new file mode 100644 index 0000000000..fa96f23b74 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/framework/Dim.swift @@ -0,0 +1,46 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +struct Dim { + init(inDim: [Int]) { + dims = inDim + } + + mutating func swapeDimAt(index1: Int, index2: Int) { + dims.swapAt(index1, index2) + } + + func cout() -> Int { + return dims.count + } + + func numel() -> Int { + return dims.reduce(1) { $0 * $1 } + } + + static func ==(left: Dim, right: Dim) -> Bool { + return left.dims == right.dims; + } + + subscript(index: Int) -> Int { + return dims[index]; + } + + private var dims: [Int] + private init(){ + fatalError() + } +} diff --git a/metal/paddle-mobile/paddle-mobile/framework/Tensor.swift b/metal/paddle-mobile/paddle-mobile/framework/Tensor.swift new file mode 100644 index 0000000000..7d00e9b868 --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/framework/Tensor.swift @@ -0,0 +1,36 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +import Foundation + +class Tensor { + var dim: Dim { + return paraData.dim + } + let paraData: ParamData

+ init(inDimArray: [Int], inData: ParamData

) { + paraData = inData + } + init(inData: ParamData

) { + paraData = inData + } + func numel() -> Int { + return dim.numel() + } + + func dataLayout() -> DataLayout { + return paraData.layout + } + +} diff --git a/metal/paddle-mobile/paddle-mobile/paddle_mobile.h b/metal/paddle-mobile/paddle-mobile/paddle_mobile.h new file mode 100644 index 0000000000..f9daa6a97a --- /dev/null +++ b/metal/paddle-mobile/paddle-mobile/paddle_mobile.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ + +#import + +//! Project version number for paddle_mobile. +FOUNDATION_EXPORT double paddle_mobileVersionNumber; + +//! Project version string for paddle_mobile. +FOUNDATION_EXPORT const unsigned char paddle_mobileVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + -- GitLab