├── .codeclimate.yml ├── .csslintrc ├── .deployment ├── README.md ├── deploy-deepforge ├── dev-entrypoint.sh └── docker-compose-overrides.yml ├── .dockerignore ├── .eslintignore ├── .eslintrc.yml ├── .gitattributes ├── .github └── workflows │ ├── docker-build.yml │ └── npm-publish.yml ├── .gitignore ├── .jshintrc ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── _config.yml ├── app.js ├── bin ├── .eslintrc.yml ├── config.json ├── deepforge ├── deepforge-extensions ├── deepforge-users └── envConfig.json ├── chimp.js ├── config ├── README.md ├── components.json ├── config.base.js ├── config.default.js ├── config.dev.js ├── config.extensions.js ├── config.local.js ├── config.production.js ├── config.test.js ├── config.webgme.js └── index.js ├── docker ├── Dockerfile ├── Dockerfile.kitchensink ├── Dockerfile.workerenv └── docker-compose.yml ├── docs ├── .gitignore ├── Makefile ├── conf.py ├── deployment │ ├── native.rst │ ├── overview.rst │ └── quick_start.rst ├── examples │ ├── application-pipelines.png │ ├── basic-io.png │ ├── display-cifar.png │ ├── display-rand-img.png │ ├── download.png │ ├── redshift.rst │ ├── rs-tutorial.rst │ ├── train-basic.png │ ├── train-compare.png │ ├── train-single.png │ ├── vis-pred-plot.png │ └── vis-pred.png ├── fundamentals │ ├── action_layer.png │ ├── artifacts_tab.png │ ├── custom_operations.rst │ ├── custom_serializer.png │ ├── custom_utils.png │ ├── execute_pipeline.png │ ├── execution_finished.png │ ├── executions_tab.png │ ├── graph_example.png │ ├── import_artifact.png │ ├── integration.rst │ ├── interface.rst │ ├── interface_tabs.png │ ├── model_data_editor.png │ ├── neural_network.png │ ├── operation_editor.png │ ├── operation_environment.png │ ├── operation_interface.png │ ├── pipeline_example.png │ ├── pipelines_tab.png │ ├── plotloss.png │ ├── recurrent_attention.png │ ├── resources_tab.png │ ├── train_operation.png │ └── upload_artifact.png ├── getting_started │ ├── create_project.png │ ├── getting_started.rst │ ├── pipelines.png │ ├── quick_start.rst │ ├── select_train_data.png │ ├── set_seed.png │ ├── test_pipeline.png │ ├── test_results.png │ └── training_execution.png ├── index.rst ├── reference │ ├── 3d_graph.png │ ├── cli.rst │ ├── configuration.rst │ ├── mnist_fashion.png │ └── operation_feedback.rst └── walkthrough │ ├── CIFAR-10-classifier.rst │ ├── creating-neural-networks.rst │ ├── creating-operations.rst │ ├── creating-pipelines.rst │ ├── executing-pipelines.rst │ ├── images │ ├── artifact-blank.png │ ├── artifact-import-upload.png │ ├── cifar-eval-output.png │ ├── cifar-execute-basic.png │ ├── cifar-execute-button.png │ ├── cifar-execute-compute.png │ ├── cifar-execute-dialog.png │ ├── cifar-execute-storage.png │ ├── cifar-execution-eval.png │ ├── cifar-execution-in-progress.png │ ├── cifar-gt.png │ ├── cifar-gtp.png │ ├── cifar-gtpe.png │ ├── cifar-operation-io.png │ ├── cifar-pipeline-blank.png │ ├── cifar-pipeline-final.png │ ├── cifar-select-execution.png │ ├── cifar-view-output.png │ ├── eval-cifar-io.png │ ├── export-pipeline-dialog.png │ ├── export-pipeline.png │ ├── get-cifar-pipeline.png │ ├── get-data-io.png │ ├── incep-full.png │ ├── incep-incep-block-1.png │ ├── incep-incep-block-2.png │ ├── incep-incep-block-3.png │ ├── incep-input-block.png │ ├── incep-output.png │ ├── network-connect-delete.png │ ├── network-connect-hover.png │ ├── network-multi-io.png │ ├── network-multi-out.png │ ├── network-new-layer.png │ ├── new-operation-io.png │ ├── new-operation-orig.png │ ├── new-operation.png │ ├── operation-code-editor.png │ ├── operation-depen.png │ ├── output-artifacts.png │ ├── pipeline-view-exec.png │ ├── pipelines-view.png │ ├── predict-cifar-io.png │ ├── redshift-eval-depen.png │ ├── redshift-eval-io.png │ ├── redshift-eval-res.png │ ├── redshift-execute-creds.png │ ├── redshift-final.png │ ├── redshift-inputs.png │ ├── redshift-pdfvis-io.png │ ├── redshift-pdfvis-res.png │ ├── redshift-predict-io.png │ ├── redshift-t.png │ ├── redshift-tp.png │ ├── redshift-tpe.png │ ├── redshift-tpep.png │ ├── redshift-train-io.png │ ├── resources-blank.png │ ├── resources-import-keras-after.png │ ├── resources-import-keras.png │ ├── resources-new.png │ ├── simple-execute-compute.png │ ├── simple-execute-creds.png │ ├── simple-execute-storage.png │ ├── status-tracker-selected.png │ ├── train-cifar-attr.png │ ├── train-cifar-epochs.png │ ├── train-cifar-io.png │ ├── vgg-add-layer.png │ ├── vgg-blank.png │ ├── vgg-block-conv.png │ ├── vgg-block-pool.png │ ├── vgg-class-block-dense.png │ ├── vgg-class-block-out.png │ ├── vgg-full.png │ ├── vgg-gen-keras-view-res-details.png │ ├── vgg-gen-keras-view-res.png │ ├── vgg-generate-keras.png │ ├── vgg-input-doc.png │ ├── vgg-input-error.png │ ├── vgg-input-hover.png │ ├── vgg-input.png │ ├── view-cifar-attr.png │ ├── view-cifar-io.png │ ├── view-compute-window.png │ ├── view-compute.png │ └── view-graphical-output.png │ ├── introduction.rst │ ├── redshift-estimator.rst │ └── viewing-executions.rst ├── environment.server.yml ├── environment.worker.yml ├── favicon.ico ├── images └── overview.png ├── package-lock.json ├── package.json ├── src ├── common │ ├── CodeGenerator.js │ ├── Constants.js │ ├── EventEmitter.js │ ├── GraphChecker.js │ ├── NewOperationCode.ejs │ ├── OperationCode.js │ ├── PromiseEvents.js │ ├── api │ │ ├── APIClient.js │ │ ├── ExecPulseClient.js │ │ ├── JobLogsClient.js │ │ └── JobOriginClient.js │ ├── compute │ │ ├── backends │ │ │ ├── ComputeBackend.js │ │ │ ├── ComputeClient.js │ │ │ ├── ComputeDashboard.js │ │ │ ├── ComputeJob.js │ │ │ ├── JobResults.js │ │ │ ├── gme │ │ │ │ ├── Client.js │ │ │ │ ├── ExecutorHelper.js │ │ │ │ ├── dashboard │ │ │ │ │ ├── WorkerJobItem.html │ │ │ │ │ ├── WorkerModal.css │ │ │ │ │ ├── WorkerModal.html │ │ │ │ │ ├── WorkerTemplate.html.ejs │ │ │ │ │ └── index.js │ │ │ │ └── metadata.js │ │ │ ├── local │ │ │ │ ├── Client.js │ │ │ │ └── metadata.js │ │ │ └── sciserver-compute │ │ │ │ ├── Client.js │ │ │ │ ├── dashboard │ │ │ │ ├── dashboard.html │ │ │ │ └── index.js │ │ │ │ ├── files │ │ │ │ └── prepare-and-run.sh │ │ │ │ └── metadata.js │ │ ├── index.js │ │ ├── interactive │ │ │ ├── errors.js │ │ │ ├── message.js │ │ │ ├── session-with-queue.js │ │ │ ├── session.js │ │ │ └── task.js │ │ └── line-collector.js │ ├── globals.js │ ├── gmeConfig.js │ ├── js-yaml.min.js │ ├── plugin │ │ ├── Artifacts.js │ │ ├── ExecutionHelpers.js │ │ ├── GeneratedFiles.js │ │ ├── LocalExecutor.js │ │ └── Operation.js │ ├── sciserver-auth.js │ ├── skulpt.min.js │ ├── storage │ │ ├── backends │ │ │ ├── StorageBackend.js │ │ │ ├── StorageClient.js │ │ │ ├── gme │ │ │ │ ├── Client.js │ │ │ │ └── metadata.js │ │ │ ├── s3 │ │ │ │ ├── Client.js │ │ │ │ └── metadata.json │ │ │ └── sciserver-files │ │ │ │ ├── Client.js │ │ │ │ └── metadata.js │ │ └── index.js │ ├── styles │ │ ├── global.css │ │ └── img │ │ │ ├── deepforge-icon.png │ │ │ └── deepforge-logo.png │ ├── updates │ │ ├── Updates.js │ │ └── Version.js │ ├── utils.js │ └── viz │ │ ├── Buttons.js │ │ ├── CodeControl.js │ │ ├── ConfigDialog.css │ │ ├── ConfigDialog.js │ │ ├── ConfigDialogEntries │ │ └── CustomConfigEntries.js │ │ ├── ConfirmDialog.js │ │ ├── Execute.js │ │ ├── FigureExtractor.js │ │ ├── InformDialog.js │ │ ├── NodePrompter.css │ │ ├── NodePrompter.js │ │ ├── OperationControl.js │ │ ├── PipelineControl.js │ │ ├── PlotlyDescExtractor.js │ │ ├── RenameablePanel.js │ │ ├── StorageHelpers.js │ │ ├── TextPrompter.css │ │ ├── TextPrompter.js │ │ ├── Utils.js │ │ ├── panels │ │ └── ThumbnailControl.js │ │ └── widgets │ │ ├── FileWidget.js │ │ └── Thumbnail.js ├── decorators │ ├── ArtifactOpDecorator │ │ ├── ArtifactOpDecorator.js │ │ └── EasyDAG │ │ │ ├── ArtifactOpDecorator.EasyDAGWidget.css │ │ │ └── ArtifactOpDecorator.EasyDAGWidget.js │ ├── DcOpDecorator │ │ ├── DcOpDecorator.js │ │ └── EasyDAG │ │ │ ├── DcOpDecorator.EasyDAGWidget.css │ │ │ └── DcOpDecorator.EasyDAGWidget.js │ ├── JobDecorator │ │ ├── EasyDAG │ │ │ ├── AttributeField.RO.js │ │ │ ├── JobDecorator.EasyDAGWidget.css │ │ │ ├── JobDecorator.EasyDAGWidget.js │ │ │ └── PointerField.RO.js │ │ └── JobDecorator.js │ ├── OpIntDecorator │ │ ├── EasyDAG │ │ │ ├── AttributeField.js │ │ │ ├── CreateAttributeField.js │ │ │ ├── OpIntDecorator.EasyDAGWidget.css │ │ │ └── OpIntDecorator.EasyDAGWidget.js │ │ └── OpIntDecorator.js │ ├── OpIntPtrDecorator │ │ ├── EasyDAG │ │ │ ├── OpIntPtrDecorator.EasyDAGWidget.css │ │ │ └── OpIntPtrDecorator.EasyDAGWidget.js │ │ └── OpIntPtrDecorator.js │ └── OperationDecorator │ │ ├── EasyDAG │ │ ├── OperationDecorator.EasyDAGWidget.css │ │ └── OperationDecorator.EasyDAGWidget.js │ │ └── OperationDecorator.js ├── layouts │ └── SidebarLayout │ │ ├── SidebarLayout.css │ │ ├── SidebarLayout.js │ │ └── templates │ │ └── SidebarLayout.html ├── plugins │ ├── ApplyUpdates │ │ ├── ApplyUpdates.js │ │ └── metadata.json │ ├── CheckUpdates │ │ ├── CheckUpdates.js │ │ └── metadata.json │ ├── CreateExecution │ │ ├── CreateExecution.js │ │ └── metadata.json │ ├── ExecuteJob │ │ ├── ExecuteJob.Metadata.js │ │ ├── ExecuteJob.js │ │ ├── metadata.json │ │ └── metadata │ │ │ ├── Figure.js │ │ │ ├── Metadata.js │ │ │ └── index.js │ ├── ExecutePipeline │ │ ├── ExecutePipeline.js │ │ └── metadata.json │ ├── Export │ │ ├── Export.js │ │ ├── deepforge.ejs │ │ ├── format.js │ │ ├── format.js.ejs │ │ ├── formats │ │ │ └── cli │ │ │ │ └── cli.js │ │ ├── metadata.json │ │ └── toboolean.lua │ ├── ExportBranch │ │ ├── ExportBranch.js │ │ └── metadata.json │ ├── GenerateJob │ │ ├── .gitignore │ │ ├── GenerateJob.js │ │ ├── metadata.json │ │ └── templates │ │ │ ├── backend_deepforge.py │ │ │ ├── deepforge.ejs │ │ │ ├── deepforge__init__.py │ │ │ ├── deserialize.ejs │ │ │ ├── entry.ejs │ │ │ ├── environment.worker.yml │ │ │ ├── index.js │ │ │ ├── main.ejs │ │ │ ├── plotly_backend.py │ │ │ ├── run-debug.js │ │ │ ├── serialize.ejs │ │ │ └── start.js │ ├── GenerateYaml │ │ ├── GenerateYaml.js │ │ └── metadata.json │ ├── ImportArtifact │ │ ├── ImportArtifact.js │ │ └── metadata.json │ ├── ImportLibrary │ │ ├── ImportLibrary.js │ │ └── metadata.json │ ├── ImportYaml │ │ ├── ImportYaml.js │ │ └── metadata.json │ ├── ReifyArtifactProv │ │ ├── ReifyArtifactProv.js │ │ └── metadata.json │ ├── TwoPhaseCommit │ │ ├── CreatedNode.js │ │ ├── StagedChanges.js │ │ ├── TwoPhaseCommit.js │ │ ├── TwoPhaseCore.js │ │ └── metadata.json │ ├── UpdateLibrarySeed │ │ ├── UpdateLibrarySeed.js │ │ └── metadata.json │ ├── UploadArtifact │ │ ├── UploadArtifact.js │ │ └── metadata.json │ ├── UploadLibraryModelToBlob │ │ ├── UploadLibraryModelToBlob.js │ │ └── metadata.json │ └── UploadSeedToBlob │ │ ├── UploadSeedToBlob.js │ │ └── metadata.json ├── routers │ ├── ExecPulse │ │ └── ExecPulse.js │ ├── InteractiveCompute │ │ ├── Channel.js │ │ ├── InteractiveCompute.js │ │ ├── Session.js │ │ └── job-files │ │ │ ├── index.js │ │ │ └── start.js │ ├── JobLogsAPI │ │ ├── JobLogManager.js │ │ └── JobLogsAPI.js │ ├── JobOriginAPI │ │ └── JobOriginAPI.js │ ├── SciServerAuth │ │ ├── SciServerAuth.js │ │ └── Tokens.js │ ├── storage.js │ └── utils.js ├── seeds │ ├── devPipelineTests │ │ └── devPipelineTests.webgmex │ ├── devProject │ │ └── devProject.webgmex │ ├── devTests │ │ └── devTests.webgmex │ ├── devUtilTests │ │ └── devUtilTests.webgmex │ ├── minimal │ │ └── minimal.webgmex │ ├── pipeline │ │ ├── pipeline.webgmex │ │ ├── releases.jsonl │ │ └── version.txt │ ├── project │ │ └── project.webgmex │ └── tests │ │ └── tests.webgmex └── visualizers │ ├── Visualizers.json │ ├── panels │ ├── ArchEditor │ │ ├── ArchEditorControl.js │ │ └── ArchEditorPanel.js │ ├── ArtifactIndex │ │ ├── ArtifactIndexControl.js │ │ └── ArtifactIndexPanel.js │ ├── DataTypeEditor │ │ └── DataTypeEditorPanel.js │ ├── DeserializeEditor │ │ ├── DeserializeEditorControl.js │ │ └── DeserializeEditorPanel.js │ ├── ExecutionIndex │ │ ├── ExecutionIndexControl.js │ │ └── ExecutionIndexPanel.js │ ├── ExecutionView │ │ ├── ExecutionViewControl.js │ │ └── ExecutionViewPanel.js │ ├── Footer │ │ ├── FilteredNotificationWidget.js │ │ └── FooterPanel.js │ ├── ForgeActionButton │ │ ├── Actions.js │ │ ├── ExamplesDialog.svelte │ │ ├── ForgeActionButton.js │ │ ├── Libraries.json │ │ ├── Libraries.json.ejs │ │ ├── LibraryDialog.css │ │ ├── LibraryDialog.js │ │ ├── LibraryDialogModal.html │ │ └── build │ │ │ ├── ExamplesDialog.js │ │ │ └── ExamplesDialog.js.map │ ├── ForwardViz │ │ └── ForwardVizPanel.js │ ├── ImageViewer │ │ ├── ImageViewerControl.js │ │ └── ImageViewerPanel.js │ ├── InteractiveEditor │ │ ├── InteractiveEditorControl.js │ │ └── InteractiveEditorPanel.js │ ├── InteractiveExplorer │ │ ├── InteractiveExplorerControl.js │ │ └── InteractiveExplorerPanel.js │ ├── InteractiveWorkspace │ │ ├── InteractiveEditors.json │ │ ├── InteractiveWorkspaceControl.js │ │ └── InteractiveWorkspacePanel.js │ ├── JobEditor │ │ └── JobEditorPanel.js │ ├── LineGraph │ │ ├── LineGraphControl.js │ │ └── LineGraphPanel.js │ ├── LogViewer │ │ ├── LogViewerControl.js │ │ └── LogViewerPanel.js │ ├── OperationCodeEditor │ │ ├── OperationCodeEditorControl.js │ │ └── OperationCodeEditorPanel.js │ ├── OperationDepEditor │ │ ├── OperationDepEditorPanel.js │ │ └── environment.yml.tpl │ ├── OperationEditor │ │ └── OperationEditorPanel.js │ ├── OperationInterfaceEditor │ │ ├── Colors.js │ │ ├── OperationInterfaceEditorControl.EventHandlers.js │ │ ├── OperationInterfaceEditorControl.js │ │ └── OperationInterfaceEditorPanel.js │ ├── OperationSecondaryEditor │ │ ├── OperationSecondaryEditorControl.js │ │ └── OperationSecondaryEditorPanel.js │ ├── OutputViewer │ │ ├── OutputViewer.css │ │ ├── OutputViewerPanel.js │ │ └── icons.json │ ├── PipelineEditor │ │ ├── PipelineEditorControl.js │ │ └── PipelineEditorPanel.js │ ├── PipelineIndex │ │ ├── PipelineIndexControl.js │ │ └── PipelineIndexPanel.js │ ├── ResourceIndex │ │ ├── ResourceIndexControl.js │ │ └── ResourceIndexPanel.js │ ├── RootViz │ │ ├── RootVizControl.js │ │ └── RootVizPanel.js │ ├── SerializeEditor │ │ ├── SerializeEditorControl.js │ │ └── SerializeEditorPanel.js │ ├── Sidebar │ │ └── SidebarPanel.js │ ├── TabbedTextEditor │ │ ├── TabbedTextEditorControl.js │ │ └── TabbedTextEditorPanel.js │ ├── TensorPlotter │ │ ├── TensorPlotterControl.js │ │ ├── TensorPlotterPanel.js │ │ └── explorer_helpers.py │ ├── TextEditor │ │ ├── TextEditorControl.js │ │ └── TextEditorPanel.js │ ├── TilingViz │ │ └── TilingVizPanel.js │ ├── TrainKeras │ │ ├── JSONImporter.js │ │ ├── Main.py │ │ ├── TrainKerasControl.js │ │ ├── TrainKerasPanel.js │ │ ├── TrainOperation.py │ │ └── changeset.js │ └── WorkerHeader │ │ ├── ComputeDialog.js │ │ ├── ComputeModal.css │ │ ├── ComputeModal.html.ejs │ │ ├── EmptyDashboard.css │ │ ├── EmptyDashboard.js │ │ ├── NodePathNavWithHiddenNodes.js │ │ ├── ProjectNavigatorController.js │ │ └── WorkerHeaderPanel.js │ └── widgets │ ├── ArchEditor │ ├── ArchEditorWidget.js │ ├── Layer.js │ ├── SelectionManager.js │ └── styles │ │ ├── ArchEditorWidget.css │ │ └── ArchEditorWidget.scss │ ├── ArtifactIndex │ ├── ArtifactIndexWidget.js │ ├── ArtifactModal.html │ ├── ArtifactModal.js │ ├── ModelItem.js │ ├── ModelRow.html │ ├── Table.html │ └── styles │ │ └── ArtifactIndexWidget.css │ ├── DeserializeEditor │ ├── DeserializeEditorWidget.js │ └── styles │ │ ├── DeserializeEditorWidget.css │ │ └── DeserializeEditorWidget.scss │ ├── ExecutionIndex │ ├── ExecTable.html │ ├── ExecutionIndexWidget.js │ ├── lib │ │ └── moment.min.js │ └── styles │ │ ├── ExecutionIndexWidget.css │ │ └── ExecutionIndexWidget.scss │ ├── ExecutionView │ ├── ExecutionViewWidget.js │ ├── SelectionManager.js │ └── styles │ │ ├── ExecutionViewWidget.css │ │ └── ExecutionViewWidget.scss │ ├── ImageViewer │ ├── ImageViewerWidget.js │ ├── no-image.gif │ └── styles │ │ └── ImageViewerWidget.css │ ├── InteractiveEditor │ ├── InteractiveEditorWidget.js │ └── styles │ │ ├── InteractiveEditorWidget.css │ │ └── InteractiveEditorWidget.scss │ ├── InteractiveExplorer │ ├── InteractiveExplorerWidget.js │ └── styles │ │ ├── InteractiveExplorerWidget.css │ │ └── InteractiveExplorerWidget.scss │ ├── InteractiveWorkspace │ ├── InteractiveWorkspaceWidget.js │ ├── lib │ │ └── golden-layout-1.5.9 │ │ │ ├── dist │ │ │ ├── goldenlayout.js │ │ │ └── goldenlayout.min.js │ │ │ ├── lib │ │ │ └── jquery.js │ │ │ └── src │ │ │ └── css │ │ │ ├── README.md │ │ │ ├── default-theme.css │ │ │ ├── goldenlayout-base.css │ │ │ ├── goldenlayout-base.css.map │ │ │ ├── goldenlayout-dark-theme.css │ │ │ ├── goldenlayout-dark-theme.css.map │ │ │ ├── goldenlayout-light-theme.css │ │ │ ├── goldenlayout-light-theme.css.map │ │ │ ├── goldenlayout-soda-theme.css │ │ │ ├── goldenlayout-soda-theme.css.map │ │ │ ├── goldenlayout-translucent-theme.css │ │ │ └── goldenlayout-translucent-theme.css.map │ └── styles │ │ ├── InteractiveWorkspaceWidget.css │ │ ├── InteractiveWorkspaceWidget.css.map │ │ └── InteractiveWorkspaceWidget.scss │ ├── LineGraph │ ├── LineGraphWidget.js │ └── lib │ │ ├── nv.d3.min.css │ │ ├── nv.d3.min.css.map │ │ ├── nv.d3.min.js │ │ └── nv.d3.min.js.map │ ├── LogViewer │ ├── LogViewerWidget.js │ ├── lib │ │ └── AnsiParser.js │ └── styles │ │ ├── LogViewerWidget.css │ │ └── LogViewerWidget.scss │ ├── OperationCodeEditor │ ├── OperationCodeEditorWidget.js │ └── styles │ │ ├── OperationCodeEditorWidget.css │ │ └── OperationCodeEditorWidget.scss │ ├── OperationInterfaceEditor │ ├── Buttons.js │ ├── Item.js │ ├── OperationInterfaceEditorWidget.js │ ├── SelectionManager.js │ ├── lib │ │ └── spectrum.min.js │ └── styles │ │ ├── OperationInterfaceEditorWidget.css │ │ └── OperationInterfaceEditorWidget.scss │ ├── PipelineEditor │ ├── Connection.js │ ├── OperationNode.js │ ├── PipelineEditorWidget.js │ ├── SelectionManager.js │ ├── klay.js │ └── styles │ │ ├── PipelineEditorWidget.css │ │ └── PipelineEditorWidget.scss │ ├── PipelineIndex │ ├── PipelineIndexWidget.js │ ├── cards │ │ ├── Architecture.ejs │ │ └── Pipeline.ejs │ └── styles │ │ ├── PipelineIndexWidget.css │ │ └── PipelineIndexWidget.scss │ ├── ResourceIndex │ ├── ResourceIndexWidget.js │ └── styles │ │ ├── ArchIndexWidget.css │ │ └── ArchIndexWidget.scss │ ├── RootViz │ ├── Card.html.ejs │ ├── RootViz.html │ ├── RootVizWidget.js │ └── styles │ │ ├── RootVizWidget.css │ │ └── RootVizWidget.scss │ ├── SerializeEditor │ ├── SerializeEditorWidget.js │ └── styles │ │ ├── SerializeEditorWidget.css │ │ └── SerializeEditorWidget.scss │ ├── Sidebar │ ├── NavBar.html │ ├── SidebarWidget.js │ ├── lib │ │ └── font │ │ │ ├── css │ │ │ ├── open-iconic-bootstrap.css │ │ │ ├── open-iconic-bootstrap.less │ │ │ ├── open-iconic-bootstrap.min.css │ │ │ ├── open-iconic-bootstrap.scss │ │ │ ├── open-iconic-bootstrap.styl │ │ │ ├── open-iconic-foundation.css │ │ │ ├── open-iconic-foundation.less │ │ │ ├── open-iconic-foundation.min.css │ │ │ ├── open-iconic-foundation.scss │ │ │ ├── open-iconic-foundation.styl │ │ │ ├── open-iconic.css │ │ │ ├── open-iconic.less │ │ │ ├── open-iconic.min.css │ │ │ ├── open-iconic.scss │ │ │ └── open-iconic.styl │ │ │ └── fonts │ │ │ ├── open-iconic.eot │ │ │ ├── open-iconic.otf │ │ │ ├── open-iconic.svg │ │ │ ├── open-iconic.ttf │ │ │ └── open-iconic.woff │ └── styles │ │ └── SidebarWidget.css │ ├── TabbedTextEditor │ ├── TabbedTextEditorWidget.js │ └── styles │ │ ├── TabbedTextEditorWidget.css │ │ └── TabbedTextEditorWidget.scss │ ├── TensorPlotter │ ├── ArtifactLoader.html │ ├── ArtifactLoader.js │ ├── DataEditorBase.js │ ├── PlotEditor.html │ ├── PlotEditor.js │ ├── PlottedData.js │ ├── PlottedDataEditor.html │ ├── PlottedDataEditor.js │ ├── PythonSliceParser.js │ ├── TensorPlotterWidget.js │ ├── lib │ │ └── jscolor.js │ └── styles │ │ ├── ArtifactLoader.css │ │ ├── TensorPlotterWidget.css │ │ ├── TensorPlotterWidget.scss │ │ └── simple-grid.min.css │ ├── TextEditor │ ├── MonacoLanguages.json │ ├── MonacoThemesProvider.js │ ├── TextEditorWidget.js │ ├── Themes │ │ ├── Active4D.json │ │ ├── All_Hallows_Eve.json │ │ ├── Amy.json │ │ ├── Birds_of_Paradise.json │ │ ├── Blackboard.json │ │ ├── Brilliance_Black.json │ │ ├── Brilliance_Dull.json │ │ ├── Chrome_DevTools.json │ │ ├── Clouds.json │ │ ├── Clouds_Midnight.json │ │ ├── Cobalt.json │ │ ├── Dawn.json │ │ ├── Dominion_Day.json │ │ ├── Dreamweaver.json │ │ ├── Eiffel.json │ │ ├── Espresso_Libre.json │ │ ├── GitHub.json │ │ ├── IDLE.json │ │ ├── Katzenmilch.json │ │ ├── Kuroir_Theme.json │ │ ├── LAZY.json │ │ ├── MagicWB_(Amiga).json │ │ ├── Merbivore.json │ │ ├── Merbivore_Soft.json │ │ ├── Monokai.json │ │ ├── Monokai_Bright.json │ │ ├── Night_Owl.json │ │ ├── Oceanic_Next.json │ │ ├── Pastels_on_Dark.json │ │ ├── Slush_and_Poppies.json │ │ ├── Solarized-dark.json │ │ ├── Solarized-light.json │ │ ├── SpaceCadet.json │ │ ├── Sunburst.json │ │ ├── Textmate_(Mac_Classic).json │ │ ├── Tomorrow-Night-Blue.json │ │ ├── Tomorrow-Night-Bright.json │ │ ├── Tomorrow-Night-Eighties.json │ │ ├── Tomorrow-Night.json │ │ ├── Tomorrow.json │ │ ├── Twilight.json │ │ ├── Upstream_Sunburst.json │ │ ├── Vibrant_Ink.json │ │ ├── Xcode_default.json │ │ ├── Zenburnesque.json │ │ ├── iPlastic.json │ │ ├── idleFingers.json │ │ ├── krTheme.json │ │ ├── monoindustrial.json │ │ └── themelist.json │ └── styles │ │ ├── TextEditorWidget.css │ │ └── TextEditorWidget.scss │ └── TrainKeras │ ├── TrainDashboard.svelte │ ├── TrainKerasWidget.js │ ├── build │ ├── TrainDashboard.css │ ├── TrainDashboard.css.map │ ├── TrainDashboard.js │ └── TrainDashboard.js.map │ ├── schemas │ ├── generate-schemas.py │ └── index.json │ └── styles │ ├── TrainKerasWidget.css │ └── TrainKerasWidget.scss ├── test ├── .eslintrc.yml ├── .jshintrc ├── assets │ ├── TestOperation.webgmexm │ └── configs │ │ ├── compute.js │ │ ├── sciserver.js │ │ └── storage.js ├── features │ ├── operations │ │ └── OperationEditor.spec.js │ ├── projects │ │ └── index.js │ ├── selectors.js │ ├── start.sh │ └── utils.js ├── globals.js ├── integration │ ├── ExecutePipeline.spec.js │ ├── InteractiveCompute.js │ └── StorageBackends.spec.js └── unit │ ├── cli │ └── cli.spec.js │ ├── common │ ├── OperationCode.spec.js │ ├── PromiseEvents.spec.js │ ├── api │ │ ├── JobLogsClient.spec.js │ │ └── JobOriginClient.spec.js │ ├── compute │ │ ├── backends │ │ │ └── local │ │ │ │ └── Client.spec.js │ │ └── line-collector.js │ ├── plugin │ │ ├── ExecutionHelpers.spec.js │ │ └── GeneratedFiles.spec.js │ ├── storage │ │ └── backends │ │ │ └── gme │ │ │ └── Client.spec.js │ ├── updates │ │ └── Version.spec.js │ ├── utils.spec.js │ └── viz │ │ ├── FigureExtractor.spec.js │ │ └── FigureReference.json │ ├── external-utils │ └── conda-utils.spec.js │ ├── plugins │ ├── ApplyUpdates │ │ └── ApplyUpdates.spec.js │ ├── CheckUpdates │ │ └── CheckLibraries.spec.js │ ├── CreateExecution │ │ └── CreateExecution.spec.js │ ├── ExecuteJob │ │ └── ExecuteJob.spec.js │ ├── ExecutePipeline │ │ └── ExecutePipeline.js │ ├── Export │ │ └── Export.spec.js │ ├── ExportBranch │ │ └── ExportBranch.spec.js │ ├── GenerateJob │ │ ├── GenerateJob.spec.js │ │ └── templates │ │ │ └── utils.build.spec.js │ ├── GenerateYaml │ │ └── GenerateYaml.spec.js │ ├── ImportArtifact │ │ └── ImportArtifact.spec.js │ ├── ImportLibrary │ │ └── ImportLibrary.spec.js │ ├── ImportYaml │ │ └── ImportYaml.spec.js │ ├── ReifyArtifactProv │ │ └── ReifyArtifactProv.spec.js │ ├── TwoPhaseCommit │ │ ├── TwoPhaseCommit.spec.js │ │ └── TwoPhaseCore.spec.js │ ├── UpdateLibrarySeed │ │ └── UpdateLibrarySeed.spec.js │ ├── UploadArtifact │ │ └── UploadArtifact.spec.js │ ├── UploadLibraryModelToBlob │ │ └── UploadLibraryModelToBlob.spec.js │ └── UploadSeedToBlob │ │ └── UploadSeedToBlob.spec.js │ ├── routers │ ├── ExecPulse │ │ └── ExecPulse.spec.js │ ├── InteractiveCompute │ │ └── start.js │ ├── JobLogsAPI │ │ └── JobLogsAPI.spec.js │ └── JobOriginAPI │ │ └── JobOriginAPI.spec.js │ ├── test-cases │ ├── code │ │ ├── alexnet.lua │ │ ├── alexnetowt.lua │ │ ├── alexnetowtbn.lua │ │ ├── basic-transfers.lua │ │ ├── basic.lua │ │ ├── basic2.lua │ │ ├── basic3.lua │ │ ├── basic4.lua │ │ ├── basiccontainer.lua │ │ ├── concat-parallel.lua │ │ ├── concat-seq.lua │ │ ├── concat-y.lua │ │ ├── concat.lua │ │ ├── googlenet-setters.lua │ │ ├── googlenet.lua │ │ ├── lenet.lua │ │ ├── multi-args.lua │ │ ├── ninbn.lua │ │ ├── overfeat.lua │ │ ├── resnet.lua │ │ ├── simple.lua │ │ ├── table-literal.lua │ │ ├── vgg.lua │ │ └── vggbn.lua │ ├── generated-code │ │ ├── ContainerWithLayerArgs.lua │ │ ├── basic-transfers.lua │ │ ├── basic.lua │ │ ├── basiccontainer.lua │ │ ├── concat-parallel.lua │ │ ├── googlenet.lua │ │ ├── overfeat.lua │ │ └── requiredOmitted.lua │ ├── models │ │ ├── alexnetowt.yml │ │ ├── alexnetowtbn.yml │ │ ├── basic-transfers.yml │ │ ├── basic.yml │ │ ├── basic2.yml │ │ ├── basiccontainer.yml │ │ ├── concat-parallel-utils.yml │ │ ├── concat-parallel.yml │ │ ├── concat-seq.yml │ │ ├── concat-y-bad-conn.yml │ │ ├── concat-y-utils.yml │ │ ├── concat-y.yml │ │ ├── concat.yml │ │ ├── googlenet-setters.yml │ │ ├── googlenet.yml │ │ ├── lenet.yml │ │ ├── multi-args.yml │ │ ├── ninbn.yml │ │ ├── overfeat.yml │ │ ├── resnet.yml │ │ ├── simple.yml │ │ ├── table-literal.yml │ │ ├── vgg.yml │ │ └── vggbn.yml │ └── operations │ │ ├── example.py │ │ ├── multi-anon-results.py │ │ ├── no-inputs.py │ │ ├── numeric-attr.py │ │ ├── op-output-name.py │ │ └── simple.py │ ├── utils │ └── utils.spec.js │ └── visualizers │ └── widgets │ └── TensorPlotter │ ├── PlottedDataEditor.js │ └── PythonSliceParser.js ├── token_keys └── README.md ├── utils ├── additional-ci-checks.js ├── build-includes.ejs ├── build-job-utils.js ├── conda-utils.js ├── extender.js ├── generate_token_keys.sh ├── install-conda.sh ├── notes.md ├── reinstall-extensions.js └── svelte │ └── rollup.config.js └── webgme-setup.json /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | csslint: 4 | enabled: true 5 | duplication: 6 | enabled: true 7 | exclude_fingerprints: 8 | - 1e004cf4e49528a58a0ac3858112601c 9 | config: 10 | languages: 11 | - ruby 12 | - javascript 13 | - python 14 | - php 15 | eslint: 16 | enabled: true 17 | channel: "eslint-6" 18 | fixme: 19 | enabled: true 20 | ratings: 21 | paths: 22 | - "**.css" 23 | - "**.inc" 24 | - "**.js" 25 | - "**.jsx" 26 | - "**.module" 27 | - "**.php" 28 | - "**.py" 29 | - "**.rb" 30 | exclude_paths: 31 | - config/ 32 | - test/ 33 | - src/common/lua.js 34 | - src/common/js-yaml.min.js 35 | - src/visualizers/widgets/Sidebar/lib/ 36 | - src/visualizers/widgets/TextEditor/lib/ 37 | - src/visualizers/widgets/PipelineIndex/styles/PipelineIndex.css 38 | - src/visualizers/widgets/LineGraph/lib/ 39 | - src/visualizers/widgets/PipelineEditor/klay.js 40 | - src/visualizers/widgets/PlotlyGraph/lib/plotly.min.js 41 | - src/plugins/GenerateJob/templates/utils.build.js 42 | - src/visualizers/widgets/TensorPlotter/lib/ 43 | - src/visualizers/widgets/TensorPlotter/styles/simple-grid.min.css 44 | - src/visualizers/widgets/TrainKeras/build 45 | - src/visualizers/panels/ForgeActionButton/build 46 | - src/visualizers/panels/TrainKeras/JSONImporter.js 47 | - src/visualizers/panels/TrainKeras/changeset.js 48 | - src/visualizers/widgets/InteractiveWorkspace/lib 49 | -------------------------------------------------------------------------------- /.csslintrc: -------------------------------------------------------------------------------- 1 | --exclude-exts=.min.css 2 | --exclude-list=src/visualizers/widgets/PipelineIndex/styles/PipelineIndex.css 3 | --ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes 4 | -------------------------------------------------------------------------------- /.deployment/README.md: -------------------------------------------------------------------------------- 1 | # Deployment Files 2 | This directory contains customizations to the standard deployment settings to accommodate the deployment machine. 3 | 4 | The script `deploy-deepforge` is used for standard deployment of deepforge using github actions. 5 | 6 | Additionally, this contains a file with customizations to the standard docker-compose.yml file which allows us to modify the entrypoint and install a version of tensorflow [compatible with the CPU of the deployment machine](https://github.com/deepforge-dev/deepforge/issues/1561). 7 | 8 | The deployment is updated by first creating the custom docker compose file using [yaml-merge](https://github.com/alexlafroscia/yaml-merge): 9 | ``` 10 | yaml-merge docker-compose.yml .deployment/docker-compose-overrides.yml > custom-docker-compose.yml 11 | ``` 12 | Next, the generated file can be used with docker-compose: 13 | ``` 14 | docker-compose --file custom-docker-compose.yml up 15 | ``` 16 | -------------------------------------------------------------------------------- /.deployment/deploy-deepforge: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | DEEPFORGE_DEPLOYMENT_DIR="$(realpath "$(dirname "$0")")" 3 | export DEEPFORGE_DEPLOYMENT_DIR 4 | 5 | . ~/.nvm/nvm.sh 6 | SERVER_NAME="server" 7 | 8 | if [[ $1 = "stable" ]]; then 9 | SERVER_NAME="server_stable" 10 | fi; 11 | 12 | # This will overwrite config/components.json on the local source tree (please use with discretion) 13 | < config/components.json jq '.Compute.backends=(.Compute.backends | map(select(. != "local")))' \ 14 | > config/components2.json 15 | < config/components2.json jq '.Storage.backends=(.Storage.backends | map(select(. != "gme")))' \ 16 | > config/components.json 17 | rm config/components2.json 18 | 19 | # Merging the custom override yml file 20 | yq m -a docker/docker-compose.yml "$DEEPFORGE_DEPLOYMENT_DIR"/docker-compose-overrides.yml > custom-docker-compose.yml 21 | 22 | # Pulling the latest docker image, stopping the server, removing and restarting it 23 | docker-compose --file custom-docker-compose.yml -p deepforge pull $SERVER_NAME 24 | docker-compose --file custom-docker-compose.yml -p deepforge stop $SERVER_NAME 25 | docker-compose --file custom-docker-compose.yml -p deepforge rm -f $SERVER_NAME 26 | docker-compose --file custom-docker-compose.yml -p deepforge up -d $SERVER_NAME 27 | 28 | docker image prune -f 29 | -------------------------------------------------------------------------------- /.deployment/dev-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Remove pypi tensorflow in favor of conda installation 3 | source activate deepforge 4 | pip uninstall tensorflow -y 5 | conda install tensorflow==1.14 -y 6 | conda env export -n deepforge > src/plugins/GenerateJob/templates/environment.worker.yml 7 | 8 | source activate deepforge-server 9 | pip uninstall tensorflow -y 10 | conda install tensorflow==1.14 -y 11 | 12 | 13 | deepforge start --server 14 | 15 | -------------------------------------------------------------------------------- /.deployment/docker-compose-overrides.yml: -------------------------------------------------------------------------------- 1 | services: 2 | server: 3 | entrypoint: /.deployment/dev-entrypoint.sh 4 | environment: 5 | - "DEEPFORGE_HOST=https://dev.deepforge.org" 6 | - "DEEPFORGE_INTERACTIVE_COMPUTE_HOST=wss://dev-compute.deepforge.org" 7 | volumes: 8 | - "${DEEPFORGE_DEPLOYMENT_DIR}:/.deployment" 9 | - "${DEEPFORGE_DEPLOYMENT_DIR}/../config/components.json:/deepforge/config/components.json" 10 | 11 | server_stable: 12 | entrypoint: /.deployment/dev-entrypoint.sh 13 | environment: 14 | - "MONGO_URI=mongodb://mongo:27017/deepforge" 15 | - "DEEPFORGE_HOST=https://editor.deepforge.org" 16 | - "DEEPFORGE_INTERACTIVE_COMPUTE_HOST=wss://compute.deepforge.org" 17 | - "DEEPFORGE_PUBLIC_KEY=/token_keys/public_key" 18 | - "DEEPFORGE_PRIVATE_KEY=/token_keys/private_key" 19 | image: deepforge/kitchen-sink:stable 20 | ports: 21 | - "9000:8888" 22 | volumes: 23 | - "$HOME/.deepforge/blob:/data/blob" 24 | - "${TOKEN_KEYS_DIR}:/token_keys" 25 | - "${DEEPFORGE_DEPLOYMENT_DIR}:/.deployment" 26 | - "${DEEPFORGE_DEPLOYMENT_DIR}/../config/components.json:/deepforge/config/components.json" 27 | depends_on: 28 | - mongo 29 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /.deployment 3 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | src/common/lua.js 2 | src/visualizers/widgets/TextEditor/lib/* 3 | src/common/js-yaml.min.js 4 | src/visualizers/Visualizers.json 5 | config/config.webgme.js 6 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | browser: true 3 | node: true 4 | mocha: true 5 | es6: true 6 | extends: 'eslint:recommended' 7 | parserOptions: 8 | ecmaVersion: 2020 9 | rules: 10 | indent: 11 | - 2 12 | - 4 13 | linebreak-style: 14 | - 2 15 | - unix 16 | quotes: 17 | - 2 18 | - single 19 | semi: 20 | - 2 21 | - always 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.json text eol=lf 2 | *.js text eol=lf 3 | *.md text eol=lf 4 | *.rst text eol=lf 5 | *.txt text eol=lf 6 | *.css text eol=lf 7 | *.scss text eol=lf 8 | *.yml text eol=lf 9 | *.yaml text eol=lf 10 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to NPM 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Install Conda 14 | run: | 15 | source utils/install-conda.sh 16 | 17 | - uses: actions/setup-node@v1 18 | with: 19 | node-version: 12 20 | registry-url: https://registry.npmjs.org/ 21 | - run: npm ci 22 | - run: npm publish 23 | env: 24 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | src/worker/tmp 2 | .env 3 | *.swp 4 | *.swo 5 | **.sass-cache 6 | # Logs 7 | logs 8 | *.log 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 22 | .grunt 23 | 24 | # node-waf configuration 25 | .lock-wscript 26 | 27 | # Compiled binary addons (http://nodejs.org/api/addons.html) 28 | build/Release 29 | 30 | # Dependency directory 31 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 32 | node_modules 33 | tmp/ 34 | test-tmp/ 35 | blob-local-storage/ 36 | src/seeds/nn/hash.txt 37 | src/seeds/pipeline/hash.txt 38 | 39 | notes/ 40 | src/worker 41 | token_keys/public_key 42 | token_keys/private_key 43 | # Created by deployment script 44 | custom-docker-compose.yml 45 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6 3 | } 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/worker/tmp 2 | .env 3 | *.swp 4 | *.swo 5 | **.sass-cache 6 | # Logs 7 | logs 8 | *.log 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 22 | .grunt 23 | 24 | # node-waf configuration 25 | .lock-wscript 26 | 27 | # Compiled binary addons (http://nodejs.org/api/addons.html) 28 | build/Release 29 | 30 | # Dependency directory 31 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 32 | node_modules 33 | tmp/ 34 | test-tmp/ 35 | blob-local-storage/ 36 | src/seeds/nn/hash.txt 37 | src/seeds/pipeline/hash.txt 38 | 39 | # docs 40 | images/ 41 | 42 | notes/ 43 | src/worker 44 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | services: 3 | - mongodb 4 | - docker 5 | addons: 6 | chrome: beta 7 | sudo: false 8 | env: 9 | - DEEPFORGE_HOST=127.0.0.1:8080 NODE_ENV=test 10 | script: travis_wait 30 npm run test-ci 11 | before_install: 12 | - docker pull minio/minio 13 | - docker run -d -p 9000:9000 --name minio-test -e "MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY}" -e "MINIO_SECRET_KEY=${MINIO_SECRET_KEY}" minio/minio server ./data 14 | - nvm install 12.18.0; if [[ `npm -v` != 6* ]]; then npm i -g npm@6; fi 15 | install: 16 | - source utils/install-conda.sh 17 | - npm install 18 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | // jshint node: true 2 | 'use strict'; 3 | 4 | var gmeConfig = require('./config'), 5 | webgme = require('webgme'), 6 | path = require('path'), 7 | fs = require('fs'), 8 | rm_rf = require('rimraf'), 9 | gracefulFs = require('graceful-fs'), 10 | myServer; 11 | 12 | process.chdir(__dirname); 13 | webgme.addToRequireJsPaths(gmeConfig); 14 | 15 | // Patch the 'fs' module to fix 'too many files open' error 16 | gracefulFs.gracefulify(fs); 17 | 18 | // Clear seed hash info 19 | ['pipeline'].map(lib => path.join(__dirname, 'src', 'seeds', lib, 'hash.txt')) 20 | .forEach(file => rm_rf.sync(file)); 21 | 22 | myServer = new webgme.standaloneServer(gmeConfig); 23 | myServer.start(function (err) { 24 | if (err) { 25 | console.error(err); 26 | process.exit(1); 27 | } 28 | 29 | console.log('DeepForge now listening on port', gmeConfig.server.port); 30 | }); 31 | -------------------------------------------------------------------------------- /bin/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | browser: true 3 | node: true 4 | mocha: true 5 | es6: true 6 | extends: 'eslint:recommended' 7 | rules: 8 | no-console: 9 | - 0 10 | indent: 11 | - 2 12 | - 4 13 | linebreak-style: 14 | - 2 15 | - unix 16 | quotes: 17 | - 2 18 | - single 19 | semi: 20 | - 2 21 | - always 22 | -------------------------------------------------------------------------------- /bin/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "blob": { 3 | "dir": "~/.deepforge/blob" 4 | }, 5 | "mongo": { 6 | "dir": "~/.deepforge/data" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /bin/deepforge-users: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const program = require('webgme-engine/src/bin/usermanager').main(process.argv); 3 | -------------------------------------------------------------------------------- /bin/envConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "DEEPFORGE_BLOB_DIR": "blob.dir" 3 | } 4 | -------------------------------------------------------------------------------- /chimp.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | webdriverio: { 3 | desiredCapabilities: { 4 | chromeOptions: { 5 | args: ['--headless', '--disable-extensions'] 6 | } 7 | } 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /config/README.md: -------------------------------------------------------------------------------- 1 | # Configuration 2 | 3 | Overwrite/append the [default webgme configuration](https://github.com/webgme/webgme/blob/master/config/config.default.js) in `config.default.js`. 4 | 5 | When adding your own paths, make sure to either use `__dirname` or a relative path which will be resolved from your repository's root. 6 | 7 | To load another configuration set the environment variable `NODE_ENV` to the wanted configuration, e.g. on windows `set NODE_ENV = app` will load `config.app.js`. 8 | -------------------------------------------------------------------------------- /config/config.base.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var config = require('./config.webgme'), 4 | validateConfig = require('webgme/config/validator'); 5 | 6 | require('dotenv').load({silent: true}); 7 | 8 | // Add/overwrite any additional settings here 9 | config.server.port = +process.env.PORT || config.server.port; 10 | config.server.timeout = 0; 11 | config.mongo.uri = process.env.MONGO_URI || config.mongo.uri; 12 | config.blob.fsDir = process.env.DEEPFORGE_BLOB_DIR || config.blob.fsDir; 13 | 14 | config.requirejsPaths.deepforge = './src/common'; 15 | config.requirejsPaths['aws-sdk-min'] = './node_modules/aws-sdk/dist/aws-sdk.min'; 16 | config.requirejsPaths.vs = './node_modules/monaco-editor/min/vs'; 17 | config.requirejsPaths.MonacoVim = './node_modules/monaco-vim/dist/monaco-vim'; 18 | config.seedProjects.defaultProject = 'project'; 19 | 20 | config.plugin.allowBrowserExecution = true; 21 | config.plugin.allowServerExecution = true; 22 | 23 | config.executor.enable = true; 24 | config.visualization.extraCss.push('deepforge/styles/global.css'); 25 | 26 | config.storage.autoMerge.enable = true; 27 | 28 | config.client.pageTitle = 'DeepForge'; 29 | config.client.faviconPath = '/extlib/favicon.ico'; 30 | 31 | validateConfig(config); 32 | module.exports = config; 33 | -------------------------------------------------------------------------------- /config/config.default.js: -------------------------------------------------------------------------------- 1 | // jshint node: true 2 | 'use strict'; 3 | 4 | var config = require('./config.base'), 5 | validateConfig = require('webgme/config/validator'); 6 | 7 | // Add/overwrite any additional settings here 8 | // config.server.port = 8080; 9 | // config.mongo.uri = 'mongodb://127.0.0.1:27017/webgme_my_app'; 10 | 11 | // Seeds for development are prefixed with 'dev' 12 | config.seedProjects.basePaths = ['src/seeds/project']; 13 | 14 | // user accounts. uncomment the following for enabling user accounts 15 | // config.authentication.enable = true; 16 | // config.authentication.allowGuests = true; 17 | // config.authentication.allowUserRegistration = true; 18 | 19 | validateConfig(config); 20 | module.exports = config; 21 | -------------------------------------------------------------------------------- /config/config.dev.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var config = require('./config.base'), 4 | validateConfig = require('webgme/config/validator'); 5 | 6 | // Add/overwrite any additional settings here 7 | // config.server.port = 8080; 8 | // config.mongo.uri = 'mongodb://127.0.0.1:27017/webgme_my_app'; 9 | config.visualization.layout.default = 'DefaultLayout'; 10 | 11 | validateConfig(config); 12 | module.exports = config; 13 | -------------------------------------------------------------------------------- /config/config.extensions.js: -------------------------------------------------------------------------------- 1 | const merge = require('lodash.merge'); 2 | 3 | module.exports = config => { 4 | config = merge({}, config); 5 | config.extensions = {}; 6 | config.extensions.InteractiveComputeHost = process.env.DEEPFORGE_INTERACTIVE_COMPUTE_HOST; 7 | return config; 8 | }; 9 | -------------------------------------------------------------------------------- /config/config.local.js: -------------------------------------------------------------------------------- 1 | // Config for running deepforge w/ one local worker 2 | // jshint node: true 3 | 'use strict'; 4 | 5 | var config = require('./config.default'), 6 | validateConfig = require('webgme/config/validator'); 7 | 8 | // Turn up the worker polling rate 9 | config.executor.workerRefreshInterval = 150; 10 | 11 | validateConfig(config); 12 | module.exports = config; 13 | -------------------------------------------------------------------------------- /config/config.test.js: -------------------------------------------------------------------------------- 1 | /*jshint node: true*/ 2 | /** 3 | * @author lattmann / https://github.com/lattmann 4 | */ 5 | 6 | 'use strict'; 7 | 8 | var config = require('./config.default'), 9 | path = require('path'); 10 | 11 | config.server.port = 8080; 12 | config.mongo.uri = process.env.MONGO_URI || 'mongodb://127.0.0.1:27017'; 13 | config.mongo.uri = config.mongo.uri.replace(/\/[a-zA-Z_\-]*$/, '') + '/deepforge_tests'; 14 | config.blob.fsDir = path.join(__dirname, '..', 'test-tmp', 'blob'); 15 | 16 | module.exports = config; 17 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | /*jshint node: true*/ 2 | /** 3 | * @author lattmann / https://github.com/lattmann 4 | * @author pmeijer / https://github.com/pmeijer 5 | */ 6 | 7 | 'use strict'; 8 | 9 | var env = process.env.NODE_ENV || 'default', 10 | configFilename = __dirname + '/config.' + env + '.js', 11 | config = require(configFilename), 12 | validateConfig = require('webgme/config/validator'); 13 | 14 | validateConfig(config); 15 | config = require(__dirname + '/config.extensions.js')(config); 16 | module.exports = config; 17 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | # This docker file is to create a docker Image of a deepforge server 2 | FROM node:12 3 | 4 | EXPOSE 8888 5 | 6 | LABEL maintainer1.name="Brian Broll"\ 7 | maintainer1.email="brian.broll@gmail.com" 8 | 9 | LABEL maintainer2.name="Umesh Timalsina"\ 10 | maintainer2.email="umesh.timalsina@vanderbilt.edu" 11 | 12 | SHELL ["/bin/bash", "-c"] 13 | 14 | ENV MINICONDA Miniconda3-latest-Linux-x86_64.sh 15 | 16 | ADD . /deepforge 17 | 18 | WORKDIR /tmp 19 | 20 | RUN curl -O https://repo.anaconda.com/miniconda/$MINICONDA && bash $MINICONDA -b && rm -f $MINICONDA 21 | 22 | ENV PATH /root/miniconda3/bin:$PATH 23 | ENV NODE_ENV production 24 | 25 | WORKDIR /deepforge 26 | 27 | RUN conda update conda -yq 28 | 29 | RUN echo '{"allow_root": true}' > /root/.bowerrc && mkdir -p /root/.config/configstore/ && \ 30 | echo '{}' > /root/.config/configstore/bower-github.json 31 | 32 | RUN npm install -g npm 33 | 34 | RUN npm config set unsafe-perm true && npm install && ln -s /deepforge/bin/deepforge /usr/local/bin 35 | 36 | #Set up the data storage 37 | RUN deepforge config blob.dir /data/blob && \ 38 | deepforge config mongo.dir /data/db 39 | 40 | ENTRYPOINT deepforge start --server 41 | -------------------------------------------------------------------------------- /docker/Dockerfile.kitchensink: -------------------------------------------------------------------------------- 1 | ARG TAG=latest 2 | FROM deepforge/server:$TAG 3 | 4 | RUN deepforge extensions add deepforge-keras && deepforge create-env -f 5 | -------------------------------------------------------------------------------- /docker/Dockerfile.workerenv: -------------------------------------------------------------------------------- 1 | FROM node:12 2 | 3 | LABEL maintainer1.name="Brian Broll"\ 4 | maintainer1.email="brian.broll@gmail.com" 5 | 6 | LABEL maintainer2.name="Umesh Timalsina"\ 7 | maintainer2.email="umesh.timalsina@vanderbilt.edu" 8 | 9 | SHELL ["/bin/bash", "-c"] 10 | 11 | ENV MINICONDA Miniconda3-latest-Linux-x86_64.sh 12 | 13 | ADD ./src/plugins/GenerateJob/templates/environment.worker.yml /tmp 14 | 15 | WORKDIR /tmp 16 | 17 | RUN curl -O https://repo.anaconda.com/miniconda/$MINICONDA && bash $MINICONDA -b && rm -f $MINICONDA 18 | 19 | ENV PATH /root/miniconda3/bin:$PATH 20 | 21 | RUN conda update conda -yq 22 | 23 | RUN npm install -g npm 24 | RUN npm install requirejs@2.3.5 rimraf@^2.4.0 superagent@3.8.3 @babel/runtime@^7.7.2 q@1.5.1 node-fetch@2.6.0 agentkeepalive@3.4.1 aws-sdk@2.624.0 25 | RUN pip install simplejson 26 | RUN conda env create -n deepforge --file /tmp/environment.worker.yml 27 | 28 | ENTRYPOINT /bin/bash 29 | -------------------------------------------------------------------------------- /docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: "3" 3 | services: 4 | mongo: 5 | image: mongo 6 | volumes: 7 | - "$HOME/.deepforge/data:/data/db" 8 | server: 9 | environment: 10 | - "MONGO_URI=mongodb://mongo:27017/deepforge" 11 | - "DEEPFORGE_PUBLIC_KEY=/token_keys/public_key" 12 | - "DEEPFORGE_PRIVATE_KEY=/token_keys/private_key" 13 | image: deepforge/kitchen-sink:latest 14 | ports: 15 | - "8888:8888" 16 | - "8889:8889" 17 | volumes: 18 | - "$HOME/.deepforge/blob:/data/blob" 19 | - "${TOKEN_KEYS_DIR}:/token_keys" 20 | depends_on: 21 | - mongo 22 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = deepforge 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/deployment/overview.rst: -------------------------------------------------------------------------------- 1 | Overview 2 | ======== 3 | 4 | DeepForge Component Overview 5 | ---------------------------- 6 | DeepForge is composed of four main elements: 7 | 8 | - *Client*: The connected browsers working on DeepForge projects. 9 | - *Server*: Main component hosting all the project information and is connected to by the clients. 10 | - *Compute*: Connected computational resources used for executing pipelines. 11 | - *Storage*: Connected storage resources used for storing project data artifacts such as datasets or trained model weights. 12 | 13 | Component Dependencies 14 | ---------------------- 15 | The following dependencies are required for each component: 16 | 17 | - *Server* (NodeJS LTS) 18 | - *Database* (MongoDB v3.0.7) 19 | - *Client*: We recommend using Google Chrome and are not supporting other browsers (for now). In other words, other browsers can be used at your own risk. 20 | 21 | Configuration 22 | ------------- 23 | After installing DeepForge, it can be helpful to check out `configuring DeepForge `_ 24 | -------------------------------------------------------------------------------- /docs/examples/application-pipelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/application-pipelines.png -------------------------------------------------------------------------------- /docs/examples/basic-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/basic-io.png -------------------------------------------------------------------------------- /docs/examples/display-cifar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/display-cifar.png -------------------------------------------------------------------------------- /docs/examples/display-rand-img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/display-rand-img.png -------------------------------------------------------------------------------- /docs/examples/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/download.png -------------------------------------------------------------------------------- /docs/examples/train-basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/train-basic.png -------------------------------------------------------------------------------- /docs/examples/train-compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/train-compare.png -------------------------------------------------------------------------------- /docs/examples/train-single.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/train-single.png -------------------------------------------------------------------------------- /docs/examples/vis-pred-plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/vis-pred-plot.png -------------------------------------------------------------------------------- /docs/examples/vis-pred.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/examples/vis-pred.png -------------------------------------------------------------------------------- /docs/fundamentals/action_layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/action_layer.png -------------------------------------------------------------------------------- /docs/fundamentals/artifacts_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/artifacts_tab.png -------------------------------------------------------------------------------- /docs/fundamentals/custom_serializer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/custom_serializer.png -------------------------------------------------------------------------------- /docs/fundamentals/custom_utils.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/custom_utils.png -------------------------------------------------------------------------------- /docs/fundamentals/execute_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/execute_pipeline.png -------------------------------------------------------------------------------- /docs/fundamentals/execution_finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/execution_finished.png -------------------------------------------------------------------------------- /docs/fundamentals/executions_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/executions_tab.png -------------------------------------------------------------------------------- /docs/fundamentals/graph_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/graph_example.png -------------------------------------------------------------------------------- /docs/fundamentals/import_artifact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/import_artifact.png -------------------------------------------------------------------------------- /docs/fundamentals/interface_tabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/interface_tabs.png -------------------------------------------------------------------------------- /docs/fundamentals/model_data_editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/model_data_editor.png -------------------------------------------------------------------------------- /docs/fundamentals/neural_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/neural_network.png -------------------------------------------------------------------------------- /docs/fundamentals/operation_editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/operation_editor.png -------------------------------------------------------------------------------- /docs/fundamentals/operation_environment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/operation_environment.png -------------------------------------------------------------------------------- /docs/fundamentals/operation_interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/operation_interface.png -------------------------------------------------------------------------------- /docs/fundamentals/pipeline_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/pipeline_example.png -------------------------------------------------------------------------------- /docs/fundamentals/pipelines_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/pipelines_tab.png -------------------------------------------------------------------------------- /docs/fundamentals/plotloss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/plotloss.png -------------------------------------------------------------------------------- /docs/fundamentals/recurrent_attention.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/recurrent_attention.png -------------------------------------------------------------------------------- /docs/fundamentals/resources_tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/resources_tab.png -------------------------------------------------------------------------------- /docs/fundamentals/train_operation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/train_operation.png -------------------------------------------------------------------------------- /docs/fundamentals/upload_artifact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/fundamentals/upload_artifact.png -------------------------------------------------------------------------------- /docs/getting_started/create_project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/create_project.png -------------------------------------------------------------------------------- /docs/getting_started/pipelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/pipelines.png -------------------------------------------------------------------------------- /docs/getting_started/select_train_data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/select_train_data.png -------------------------------------------------------------------------------- /docs/getting_started/set_seed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/set_seed.png -------------------------------------------------------------------------------- /docs/getting_started/test_pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/test_pipeline.png -------------------------------------------------------------------------------- /docs/getting_started/test_results.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/test_results.png -------------------------------------------------------------------------------- /docs/getting_started/training_execution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/getting_started/training_execution.png -------------------------------------------------------------------------------- /docs/reference/3d_graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/reference/3d_graph.png -------------------------------------------------------------------------------- /docs/reference/mnist_fashion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/reference/mnist_fashion.png -------------------------------------------------------------------------------- /docs/walkthrough/images/artifact-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/artifact-blank.png -------------------------------------------------------------------------------- /docs/walkthrough/images/artifact-import-upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/artifact-import-upload.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-eval-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-eval-output.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execute-basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execute-basic.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execute-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execute-button.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execute-compute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execute-compute.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execute-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execute-dialog.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execute-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execute-storage.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execution-eval.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execution-eval.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-execution-in-progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-execution-in-progress.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-gt.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-gtp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-gtp.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-gtpe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-gtpe.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-operation-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-operation-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-pipeline-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-pipeline-blank.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-pipeline-final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-pipeline-final.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-select-execution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-select-execution.png -------------------------------------------------------------------------------- /docs/walkthrough/images/cifar-view-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/cifar-view-output.png -------------------------------------------------------------------------------- /docs/walkthrough/images/eval-cifar-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/eval-cifar-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/export-pipeline-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/export-pipeline-dialog.png -------------------------------------------------------------------------------- /docs/walkthrough/images/export-pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/export-pipeline.png -------------------------------------------------------------------------------- /docs/walkthrough/images/get-cifar-pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/get-cifar-pipeline.png -------------------------------------------------------------------------------- /docs/walkthrough/images/get-data-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/get-data-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-full.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-incep-block-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-incep-block-1.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-incep-block-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-incep-block-2.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-incep-block-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-incep-block-3.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-input-block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-input-block.png -------------------------------------------------------------------------------- /docs/walkthrough/images/incep-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/incep-output.png -------------------------------------------------------------------------------- /docs/walkthrough/images/network-connect-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/network-connect-delete.png -------------------------------------------------------------------------------- /docs/walkthrough/images/network-connect-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/network-connect-hover.png -------------------------------------------------------------------------------- /docs/walkthrough/images/network-multi-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/network-multi-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/network-multi-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/network-multi-out.png -------------------------------------------------------------------------------- /docs/walkthrough/images/network-new-layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/network-new-layer.png -------------------------------------------------------------------------------- /docs/walkthrough/images/new-operation-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/new-operation-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/new-operation-orig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/new-operation-orig.png -------------------------------------------------------------------------------- /docs/walkthrough/images/new-operation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/new-operation.png -------------------------------------------------------------------------------- /docs/walkthrough/images/operation-code-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/operation-code-editor.png -------------------------------------------------------------------------------- /docs/walkthrough/images/operation-depen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/operation-depen.png -------------------------------------------------------------------------------- /docs/walkthrough/images/output-artifacts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/output-artifacts.png -------------------------------------------------------------------------------- /docs/walkthrough/images/pipeline-view-exec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/pipeline-view-exec.png -------------------------------------------------------------------------------- /docs/walkthrough/images/pipelines-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/pipelines-view.png -------------------------------------------------------------------------------- /docs/walkthrough/images/predict-cifar-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/predict-cifar-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-eval-depen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-eval-depen.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-eval-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-eval-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-eval-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-eval-res.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-execute-creds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-execute-creds.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-final.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-inputs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-inputs.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-pdfvis-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-pdfvis-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-pdfvis-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-pdfvis-res.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-predict-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-predict-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-t.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-tp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-tp.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-tpe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-tpe.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-tpep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-tpep.png -------------------------------------------------------------------------------- /docs/walkthrough/images/redshift-train-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/redshift-train-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/resources-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/resources-blank.png -------------------------------------------------------------------------------- /docs/walkthrough/images/resources-import-keras-after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/resources-import-keras-after.png -------------------------------------------------------------------------------- /docs/walkthrough/images/resources-import-keras.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/resources-import-keras.png -------------------------------------------------------------------------------- /docs/walkthrough/images/resources-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/resources-new.png -------------------------------------------------------------------------------- /docs/walkthrough/images/simple-execute-compute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/simple-execute-compute.png -------------------------------------------------------------------------------- /docs/walkthrough/images/simple-execute-creds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/simple-execute-creds.png -------------------------------------------------------------------------------- /docs/walkthrough/images/simple-execute-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/simple-execute-storage.png -------------------------------------------------------------------------------- /docs/walkthrough/images/status-tracker-selected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/status-tracker-selected.png -------------------------------------------------------------------------------- /docs/walkthrough/images/train-cifar-attr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/train-cifar-attr.png -------------------------------------------------------------------------------- /docs/walkthrough/images/train-cifar-epochs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/train-cifar-epochs.png -------------------------------------------------------------------------------- /docs/walkthrough/images/train-cifar-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/train-cifar-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-add-layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-add-layer.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-blank.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-block-conv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-block-conv.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-block-pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-block-pool.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-class-block-dense.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-class-block-dense.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-class-block-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-class-block-out.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-full.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-gen-keras-view-res-details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-gen-keras-view-res-details.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-gen-keras-view-res.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-gen-keras-view-res.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-generate-keras.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-generate-keras.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-input-doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-input-doc.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-input-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-input-error.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-input-hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-input-hover.png -------------------------------------------------------------------------------- /docs/walkthrough/images/vgg-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/vgg-input.png -------------------------------------------------------------------------------- /docs/walkthrough/images/view-cifar-attr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/view-cifar-attr.png -------------------------------------------------------------------------------- /docs/walkthrough/images/view-cifar-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/view-cifar-io.png -------------------------------------------------------------------------------- /docs/walkthrough/images/view-compute-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/view-compute-window.png -------------------------------------------------------------------------------- /docs/walkthrough/images/view-compute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/view-compute.png -------------------------------------------------------------------------------- /docs/walkthrough/images/view-graphical-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/docs/walkthrough/images/view-graphical-output.png -------------------------------------------------------------------------------- /docs/walkthrough/introduction.rst: -------------------------------------------------------------------------------- 1 | Introduction 2 | ============ 3 | This tutorial provides detailed instructions for creating a complete DeepForge project from scratch. The motivating examples for this walkthrough will be a simple image classification task using `CIFAR-10 `_ as our dataset and a more complex astronomical redshift estimation task using `Sloan Digital Sky Survey `_ as our dataset. 4 | 5 | The overall process of creating projects is centered around the creation of data processing **pipelines** that will be executed to generate the data, visualizations, models, etc. that we need. This guide begins with a detailed walkthrough on how to create pipelines and all their constituent parts. After this introductory walkthrough will be detailed walkthroughs on how to create a pair of useful pipelines using the motivating examples. 6 | 7 | .. figure:: images/pipelines-view.png 8 | :align: center -------------------------------------------------------------------------------- /environment.server.yml: -------------------------------------------------------------------------------- 1 | name: deepforge 2 | dependencies: 3 | - python=3.7 4 | - pip=21.0.1 5 | -------------------------------------------------------------------------------- /environment.worker.yml: -------------------------------------------------------------------------------- 1 | name: deepforge 2 | dependencies: 3 | - python=3.7 4 | - pip=21.0.1 5 | - pip: 6 | - pillow 7 | - matplotlib==3.2.2 8 | - simplejson 9 | - plotly 10 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/favicon.ico -------------------------------------------------------------------------------- /images/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/images/overview.png -------------------------------------------------------------------------------- /src/common/EventEmitter.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | class EventEmitter { 6 | constructor() { 7 | this.init(); 8 | } 9 | 10 | init() { 11 | this._handlers = {}; 12 | } 13 | 14 | on(event, fn) { 15 | if (!this._handlers[event]) { 16 | this._handlers[event] = []; 17 | } 18 | this._handlers[event].push(fn); 19 | } 20 | 21 | emit(event) { 22 | const handlers = this._handlers[event] || []; 23 | const args = Array.prototype.slice.call(arguments, 1); 24 | handlers.forEach(fn => fn.apply(null, args)); 25 | } 26 | // TODO: Can I make this an official stream in node? 27 | } 28 | 29 | return EventEmitter; 30 | }); 31 | -------------------------------------------------------------------------------- /src/common/NewOperationCode.ejs: -------------------------------------------------------------------------------- 1 | class <%= name %>(): 2 | 3 | def execute(self): 4 | # Execute your operation here! 5 | print('<%= name %> is running!') 6 | -------------------------------------------------------------------------------- /src/common/PromiseEvents.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([ 3 | 'deepforge/EventEmitter', 4 | 'deepforge/utils', 5 | ], function( 6 | EventEmitter, 7 | utils, 8 | ) { 9 | class PromiseEvents extends Promise { 10 | constructor(fn) { 11 | super(fn); 12 | this.init(); 13 | } 14 | 15 | static new(fn) { 16 | let promise; 17 | promise = new PromiseEvents(async function(resolve, reject) { 18 | await utils.yield(); 19 | return fn.call(promise, resolve, reject); 20 | }); 21 | return promise; 22 | } 23 | } 24 | 25 | const methods = Object.getOwnPropertyNames(EventEmitter.prototype) 26 | .filter(fn => !PromiseEvents.prototype[fn]); 27 | 28 | methods.forEach(fn => { 29 | PromiseEvents.prototype[fn] = EventEmitter.prototype[fn]; 30 | }); 31 | 32 | return PromiseEvents; 33 | }); 34 | -------------------------------------------------------------------------------- /src/common/api/ExecPulseClient.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | './APIClient' 4 | ], function( 5 | APIClient 6 | ) { 7 | 'use strict'; 8 | 9 | var ExecPulseClient = function(params) { 10 | this.relativeUrl = '/execution/pulse/'; 11 | this.logger = params.logger.fork('ExecPulseClient'); 12 | APIClient.call(this, params); 13 | }; 14 | 15 | ExecPulseClient.prototype = Object.create(APIClient.prototype); 16 | 17 | ExecPulseClient.prototype.getUrl = function(hash) { 18 | return this.url + hash; 19 | }; 20 | 21 | // - update the heartbeat 22 | // - check the heartbeat 23 | // - delete the heartbeat 24 | ExecPulseClient.prototype.update = function(hash) { 25 | return this._request('post', hash) 26 | .catch(err => { 27 | throw err.text || err; 28 | }); 29 | }; 30 | 31 | ExecPulseClient.prototype.check = function(hash) { 32 | return this._request('get', hash) 33 | .then(res => JSON.parse(res.text)) 34 | .catch(err => { 35 | throw err.text || err; 36 | }); 37 | }; 38 | 39 | ExecPulseClient.prototype.clear = function(hash) { 40 | return this._request('delete', hash); 41 | }; 42 | 43 | return ExecPulseClient; 44 | }); 45 | -------------------------------------------------------------------------------- /src/common/compute/backends/ComputeDashboard.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | 6 | const ComputeDashboard = function(/*logger, $container*/) { 7 | }; 8 | 9 | ComputeDashboard.prototype.onShow = 10 | ComputeDashboard.prototype.onHide = 11 | ComputeDashboard.prototype.onActivate = 12 | ComputeDashboard.prototype.onDeactivate = () => {}; 13 | 14 | return ComputeDashboard; 15 | }); 16 | -------------------------------------------------------------------------------- /src/common/compute/backends/ComputeJob.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([], function() { 3 | 4 | class ComputeJob { 5 | constructor (hash, name='DeepForge Job') { 6 | this.name = name; 7 | this.hash = hash; 8 | } 9 | } 10 | 11 | class PipelineJob extends ComputeJob { 12 | constructor (hash, projectId, branch, core, job) { 13 | const execNode = core.getParent(job); 14 | const jobInfo = PipelineJob.getNodeMetadata(core, job); 15 | const execution = PipelineJob.getNodeMetadata(core, execNode); 16 | const name = `DeepForge Job: ${jobInfo.name} (${execution.name}) in ${projectId} (${branch})`; 17 | super(hash, name); 18 | this.job = jobInfo; 19 | this.execution = execution; 20 | this.branch = branch; 21 | this.projectId = projectId; 22 | } 23 | 24 | static getNodeMetadata (core, node) { 25 | const id = core.getPath(node); 26 | const name = core.getAttribute(node, 'name'); 27 | return {id, name}; 28 | } 29 | } 30 | 31 | return {ComputeJob, PipelineJob}; 32 | }); 33 | -------------------------------------------------------------------------------- /src/common/compute/backends/JobResults.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | './ComputeClient', 4 | ], function( 5 | ComputeClient, 6 | ) { 7 | 8 | class JobResults { 9 | constructor(status=ComputeClient.prototype.CREATED) { 10 | this.status = status; 11 | this.resultHashes = []; 12 | } 13 | } 14 | 15 | return JobResults; 16 | }); 17 | -------------------------------------------------------------------------------- /src/common/compute/backends/gme/dashboard/WorkerJobItem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | unknown 4 | unknown 5 | unknown 6 | unknown 7 | 8 | -------------------------------------------------------------------------------- /src/common/compute/backends/gme/dashboard/WorkerModal.css: -------------------------------------------------------------------------------- 1 | .gme-dashboard .modal-content .modal-header span { 2 | font-size: 28px; 3 | vertical-align: middle; 4 | } 5 | 6 | .gme-dashboard .modal-content .modal-header .header-icon { 7 | background-size: 28px 28px; 8 | display: inline-block; 9 | height: 28px; 10 | margin-right: 1ex; 11 | vertical-align: middle; 12 | width: 28px; 13 | } 14 | 15 | .gme-dashboard .modal-content .modal-body th { 16 | text-align: left; 17 | } 18 | 19 | .gme-dashboard .job-tag { 20 | margin-right: 5px; 21 | } 22 | 23 | .gme-dashboard .queue-title { 24 | color: #555555; 25 | float: left; 26 | font-size: 1.4em; 27 | font-weight: bold; 28 | margin-right: 5px; 29 | text-align: center; 30 | width: 100%; 31 | } 32 | 33 | .gme-dashboard .no-jobs-msg { 34 | color: #777; 35 | font-size: 1.3em; 36 | font-style: italic; 37 | } 38 | 39 | .gme-dashboard .no-workers-msg { 40 | color: #777; 41 | font-size: 1.3em; 42 | font-style: italic; 43 | } 44 | 45 | .gme-dashboard .job-queue { 46 | padding-top: 1em; 47 | } 48 | -------------------------------------------------------------------------------- /src/common/compute/backends/gme/dashboard/WorkerTemplate.html.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | unknown 4 | unknown 5 | 6 | -------------------------------------------------------------------------------- /src/common/compute/backends/gme/metadata.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([], function() { 3 | return { 4 | name: 'WebGME Executor Framework', 5 | dashboard: './dashboard/index', 6 | client: './Client', 7 | configStructure: [] 8 | }; 9 | }); 10 | -------------------------------------------------------------------------------- /src/common/compute/backends/local/metadata.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([], function() { 3 | return { 4 | name: 'Server Execution', 5 | dashboard: null, 6 | client: './Client', 7 | configStructure: [] 8 | }; 9 | }); 10 | -------------------------------------------------------------------------------- /src/common/compute/backends/sciserver-compute/dashboard/dashboard.html: -------------------------------------------------------------------------------- 1 |
Compute information can be found on SciServer's Compute Dashboard.
2 | -------------------------------------------------------------------------------- /src/common/compute/backends/sciserver-compute/dashboard/index.js: -------------------------------------------------------------------------------- 1 | /*globals define, $*/ 2 | define([ 3 | '../../ComputeDashboard', 4 | 'text!./dashboard.html', 5 | ], function( 6 | ComputeDashboard, 7 | DashboardHtml, 8 | ) { 9 | const Dashboard = function(logger, $container) { 10 | const link = $(DashboardHtml); 11 | $container.append(link); 12 | }; 13 | 14 | Dashboard.prototype = Object.create(ComputeDashboard.prototype); 15 | 16 | return Dashboard; 17 | }); 18 | -------------------------------------------------------------------------------- /src/common/compute/backends/sciserver-compute/files/prepare-and-run.sh: -------------------------------------------------------------------------------- 1 | RESULTS_DIR=$(pwd) 2 | JOB_DIR=$1 3 | 4 | source activate deepforge; 5 | export NODE_PATH=/home/idies/miniconda3/envs/deepforge/lib/node_modules:$NODE_PATH 6 | cd $JOB_DIR; 7 | CMD=$(conda run -n deepforge node -e 'console.log(require("./executor_config.json").cmd)') 8 | ARGS=$(conda run -n deepforge node -e 'console.log(require("./executor_config.json").args.join(" "))') 9 | conda run -n deepforge $CMD $ARGS 10 | cp $JOB_DIR/results.json $RESULTS_DIR/results.json 11 | -------------------------------------------------------------------------------- /src/common/compute/interactive/errors.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | class CommandFailedError extends Error { 6 | constructor(cmd, result) { 7 | const {exitCode, stderr} = result; 8 | const msg = stderr ? 9 | `Command "${cmd}" failed with exit code ${exitCode}:\n${stderr}` : 10 | `Command "${cmd}" failed with exit code ${exitCode}.`; 11 | super(msg); 12 | this.jobResult = result; 13 | } 14 | } 15 | 16 | return {CommandFailedError}; 17 | }); 18 | -------------------------------------------------------------------------------- /src/common/compute/line-collector.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([], function() { 3 | class LineCollector { 4 | constructor() { 5 | this.currentLine = ''; 6 | this.handler = null; 7 | } 8 | 9 | on(fn) { 10 | this.handler = fn; 11 | } 12 | 13 | receive(data) { 14 | const text = data.toString(); 15 | const newLineIndex = text.indexOf('\n'); 16 | let fragment; 17 | if (newLineIndex > -1) { 18 | const line = this.currentLine + text.substring(0, newLineIndex); 19 | this.handler(line); 20 | fragment = text.substring(newLineIndex + 1); 21 | this.currentLine = ''; 22 | } else { 23 | fragment = text; 24 | } 25 | this.currentLine += fragment; 26 | } 27 | 28 | flush() { 29 | if (this.currentLine) { 30 | this.handler(this.currentLine); 31 | this.currentLine = ''; 32 | } 33 | } 34 | } 35 | 36 | return LineCollector; 37 | }); 38 | -------------------------------------------------------------------------------- /src/common/gmeConfig.js: -------------------------------------------------------------------------------- 1 | /* globals define, WebGMEGlobal */ 2 | define([ 3 | 'module', 4 | ], function( 5 | module, 6 | ) { 7 | 8 | if (require.isBrowser) { 9 | return WebGMEGlobal.gmeConfig; 10 | } else { 11 | const path = require.nodeRequire('path'); 12 | const PROJECT_ROOT = path.join(path.dirname(module.uri), '..', '..'); 13 | const configPath = path.join(PROJECT_ROOT, 'config'); 14 | return require.nodeRequire(configPath); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /src/common/sciserver-auth.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | 3 | (function(root, factory){ 4 | if(typeof define === 'function' && define.amd) { 5 | define([], function(){ 6 | return factory(); 7 | }); 8 | } else if(typeof module === 'object' && module.exports) { 9 | module.exports = factory(); 10 | } else { 11 | root.SciServerAuth = factory(); 12 | } 13 | }(this, function() { 14 | const isBrowser = typeof window !== 'undefined'; 15 | 16 | async function getTokenBrowser(ssUser) { 17 | const url = `/routers/SciServerAuth/${ssUser}/token`; 18 | const response = await fetch(url); 19 | if (response.status < 400) { 20 | return await response.text(); 21 | } else { 22 | throw new Error(await response.text()); 23 | } 24 | } 25 | 26 | async function getToken(ssUser) { 27 | if (isBrowser) { 28 | return getTokenBrowser(ssUser); 29 | } else { 30 | throw new Error('Cannot retrieve SciServer token outside of browser.'); 31 | } 32 | } 33 | 34 | return getToken; 35 | })); 36 | -------------------------------------------------------------------------------- /src/common/storage/backends/StorageBackend.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | 6 | const StorageBackend = function(id, metadata) { 7 | const {name, client} = metadata; 8 | this.id = id; 9 | this.name = name; 10 | this.clientPath = client || './Client'; 11 | this._metadata = metadata; 12 | }; 13 | 14 | StorageBackend.prototype.getClient = async function(logger, config) { 15 | const Client = await this.require(`deepforge/storage/backends/${this.id}/${this.clientPath}`); 16 | return new Client(this.id, this.name, logger, config); 17 | }; 18 | 19 | StorageBackend.prototype.prepareConfig = async function(config) { 20 | if (this._metadata.prepare) { 21 | return await this._metadata.prepare(config); 22 | } 23 | return config; 24 | }; 25 | 26 | StorageBackend.prototype.require = function(path) { // helper for loading async 27 | return new Promise((resolve, reject) => 28 | require([path], resolve, reject) 29 | ); 30 | }; 31 | 32 | return StorageBackend; 33 | }); 34 | -------------------------------------------------------------------------------- /src/common/storage/backends/gme/metadata.js: -------------------------------------------------------------------------------- 1 | /*global define*/ 2 | define([ 3 | 'deepforge/gmeConfig', 4 | ], function( 5 | config, 6 | ) { 7 | const metadata = { 8 | name: 'WebGME Blob Storage', 9 | configStructure: [] 10 | }; 11 | 12 | 13 | if (config.authentication.enable) { 14 | metadata.configStructure.push({ 15 | name: 'apiToken', 16 | displayName: 'Access Token', 17 | value: '', 18 | valueType: 'string', 19 | readOnly: false, 20 | isAuth: true, 21 | isRequiredForBrowser: false, 22 | }); 23 | } 24 | return metadata; 25 | }); 26 | -------------------------------------------------------------------------------- /src/common/storage/backends/s3/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "S3 Storage", 3 | "configStructure": [ 4 | { 5 | "name": "endpoint", 6 | "displayName": "S3 Server URL", 7 | "description": "The URL of the S3 Server (eg, https://s3.amazonaws.com, https://play.min.io:9000).", 8 | "value": "", 9 | "valueType": "string", 10 | "readOnly": false 11 | }, 12 | { 13 | "name": "accessKeyId", 14 | "displayName": "Access Key", 15 | "value": "", 16 | "valueType": "string", 17 | "readOnly": false, 18 | "isAuth": true 19 | }, 20 | { 21 | "name": "secretAccessKey", 22 | "displayName": "Secret Key", 23 | "value": "", 24 | "valueType": "string", 25 | "readOnly": false, 26 | "isAuth": true 27 | }, 28 | { 29 | "name": "bucketName", 30 | "displayName": "Bucket Name", 31 | "description": "Name of the bucket in which you want to upload artifacts. If the bucket doesn't exist, it will be created.", 32 | "value": "deepforge", 33 | "valueType": "string", 34 | "readOnly": false 35 | } 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /src/common/styles/global.css: -------------------------------------------------------------------------------- 1 | li.deepforge-logo { 2 | background-image: url(img/deepforge-logo.png); 3 | background-repeat: no-repeat; 4 | background-position: center; 5 | width: 100px; 6 | background-size: 95px; 7 | } 8 | 9 | li.deepforge-logo span { 10 | visibility: hidden; 11 | } 12 | 13 | i.gme-icon { 14 | background-image: url(img/deepforge-icon.png); 15 | background-size: 15.20px 18px; 16 | } 17 | 18 | .create-node text { 19 | font-style: italic; 20 | } 21 | 22 | .job-canceled { 23 | background-color: #ffe0b2; 24 | } 25 | -------------------------------------------------------------------------------- /src/common/styles/img/deepforge-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/common/styles/img/deepforge-icon.png -------------------------------------------------------------------------------- /src/common/styles/img/deepforge-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/common/styles/img/deepforge-logo.png -------------------------------------------------------------------------------- /src/common/updates/Version.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | const Version = function(versionString) { 6 | this.versionNumbers = versionString.trim().split('.') 7 | .map(version => +version); 8 | }; 9 | 10 | Version.prototype.compare = function(otherVersion) { 11 | for (let i = 0; i < this.versionNumbers.length; i++) { 12 | if (this.versionNumbers[i] < otherVersion.versionNumbers[i]) { 13 | return -1; 14 | } else if (this.versionNumbers[i] > otherVersion.versionNumbers[i]) { 15 | return 1; 16 | } 17 | } 18 | return 0; 19 | }; 20 | 21 | Version.prototype.lessThan = function(otherVersion) { 22 | return this.compare(otherVersion) === -1; 23 | }; 24 | 25 | Version.prototype.equalTo = function(otherVersion) { 26 | return this.compare(otherVersion) === 0; 27 | }; 28 | 29 | Version.prototype.greaterThan = function(otherVersion) { 30 | return this.compare(otherVersion) === 1; 31 | }; 32 | 33 | Version.prototype.toString = function() { 34 | return this.versionNumbers.join('.'); 35 | }; 36 | 37 | return Version; 38 | }); 39 | -------------------------------------------------------------------------------- /src/common/viz/ConfigDialog.css: -------------------------------------------------------------------------------- 1 | .config-section-header { 2 | margin-top: 0; 3 | color: #888; 4 | font-style: italic; 5 | } 6 | 7 | .glyphicon-refresh-animate { 8 | -animation: spin .7s infinite linear; 9 | -webkit-animation: spin2 .7s infinite linear; 10 | } 11 | 12 | @-webkit-keyframes spin2 { 13 | from { -webkit-transform: rotate(0deg);} 14 | to { -webkit-transform: rotate(360deg);} 15 | } 16 | 17 | @keyframes spin { 18 | from { transform: scale(1) rotate(0deg);} 19 | to { transform: scale(1) rotate(360deg);} 20 | } 21 | -------------------------------------------------------------------------------- /src/common/viz/InformDialog.js: -------------------------------------------------------------------------------- 1 | /* globals define, $*/ 2 | define([ 3 | ], function( 4 | ) { 5 | 6 | const InformDialog = function(title, body) { 7 | this.$el = this.createElement(title, body); 8 | this.$ok = this.$el.find('.btn-primary'); 9 | }; 10 | 11 | InformDialog.prototype.createElement = function(title, body) { 12 | const html = ``; 27 | return $(html); 28 | }; 29 | 30 | InformDialog.prototype.show = function() { 31 | return new Promise(resolve => { 32 | this.$ok.on('click', () => resolve()); 33 | this.$el.modal('show'); 34 | this.$el.on('hidden.bs.modal', () => resolve()); 35 | }); 36 | }; 37 | 38 | return InformDialog; 39 | }); 40 | -------------------------------------------------------------------------------- /src/common/viz/NodePrompter.css: -------------------------------------------------------------------------------- 1 | .node-prompter .scrollbar { 2 | fill: #bfbfbf; 3 | } 4 | -------------------------------------------------------------------------------- /src/decorators/ArtifactOpDecorator/ArtifactOpDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/ArtifactOpDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | ArtifactOpDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var ArtifactOpDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'ArtifactOpDecorator'; 22 | 23 | ArtifactOpDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('ArtifactOpDecorator ctor'); 29 | }; 30 | 31 | _.extend(ArtifactOpDecorator.prototype, __parent_proto__); 32 | ArtifactOpDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | ArtifactOpDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: ArtifactOpDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return ArtifactOpDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/decorators/DcOpDecorator/DcOpDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/DcOpDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | DcOpDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var DcOpDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'DcOpDecorator'; 22 | 23 | DcOpDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('DcOpDecorator ctor'); 29 | }; 30 | 31 | _.extend(DcOpDecorator.prototype, __parent_proto__); 32 | DcOpDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | DcOpDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: DcOpDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return DcOpDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/decorators/JobDecorator/EasyDAG/AttributeField.RO.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([ 3 | 'decorators/EllipseDecorator/EasyDAG/AttributeField' 4 | ], function( 5 | BaseAttributeField 6 | ) { 7 | var AttributeField = function() { 8 | BaseAttributeField.apply(this, arguments); 9 | }; 10 | 11 | AttributeField.prototype = Object.create(BaseAttributeField.prototype); 12 | 13 | AttributeField.prototype.onClick = function() { 14 | }; 15 | 16 | return AttributeField; 17 | }); 18 | -------------------------------------------------------------------------------- /src/decorators/JobDecorator/EasyDAG/PointerField.RO.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([ 3 | 'decorators/EllipseDecorator/EasyDAG/PointerField' 4 | ], function( 5 | BasePointerField 6 | ) { 7 | var PointerField = function() { 8 | BasePointerField.apply(this, arguments); 9 | }; 10 | 11 | PointerField.prototype = Object.create(BasePointerField.prototype); 12 | 13 | PointerField.prototype.onClick = function() { 14 | }; 15 | 16 | // Remove the delete icon and adjust the text location 17 | PointerField.prototype.hasIcon = function() { 18 | return false; 19 | }; 20 | 21 | return PointerField; 22 | }); 23 | -------------------------------------------------------------------------------- /src/decorators/JobDecorator/JobDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/JobDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | JobDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var JobDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'JobDecorator'; 22 | 23 | JobDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('JobDecorator ctor'); 29 | }; 30 | 31 | _.extend(JobDecorator.prototype, __parent_proto__); 32 | JobDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | JobDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: JobDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return JobDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/decorators/OpIntDecorator/EasyDAG/AttributeField.js: -------------------------------------------------------------------------------- 1 | /* globals define, _*/ 2 | define([ 3 | 'decorators/EllipseDecorator/EasyDAG/AttributeField' 4 | ], function( 5 | AttributeFieldBase 6 | ) { 7 | // Attribute field in which the label is clickable and the attribute meta is editable 8 | var AttributeField = function() { 9 | AttributeFieldBase.apply(this, arguments); 10 | this.$label.on('click', () => this.onLabelClick()); 11 | }; 12 | 13 | _.extend(AttributeField.prototype, AttributeFieldBase.prototype); 14 | 15 | return AttributeField; 16 | }); 17 | -------------------------------------------------------------------------------- /src/decorators/OpIntDecorator/EasyDAG/CreateAttributeField.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | 6 | var CreateAttrField = function(logger, pEl, y) { 7 | this.$el = pEl.append('text') 8 | .attr('y', y) 9 | .attr('class', 'create-attr-field') 10 | .attr('text-anchor', 'middle') 11 | .attr('dominant-baseline', 'middle') 12 | .attr('font-weight', 'bold') 13 | .attr('font-style', 'italic') 14 | .text('New Attribute') 15 | .on('click', () => this.onClick()); 16 | }; 17 | 18 | CreateAttrField.prototype.render = 19 | CreateAttrField.prototype.destroy = function() {}; 20 | 21 | CreateAttrField.prototype.width = function() { 22 | return this.$el[0][0].getBoundingClientRect().width; 23 | }; 24 | 25 | return CreateAttrField; 26 | }); 27 | -------------------------------------------------------------------------------- /src/decorators/OpIntDecorator/OpIntDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/OpIntDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | OpIntDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var OpIntDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'OpIntDecorator'; 22 | 23 | OpIntDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('OpIntDecorator ctor'); 29 | }; 30 | 31 | _.extend(OpIntDecorator.prototype, __parent_proto__); 32 | OpIntDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | OpIntDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: OpIntDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return OpIntDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/decorators/OpIntPtrDecorator/EasyDAG/OpIntPtrDecorator.EasyDAGWidget.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'decorators/OpIntDecorator/EasyDAG/OpIntDecorator.EasyDAGWidget', 10 | 'css!./OpIntPtrDecorator.EasyDAGWidget.css' 11 | ], function ( 12 | DecoratorBase 13 | ) { 14 | 15 | 'use strict'; 16 | 17 | var OpIntPtrDecorator, 18 | DECORATOR_ID = 'OpIntPtrDecorator'; 19 | 20 | // OpInt nodes need to be able to... 21 | // - show their ports 22 | // - highlight ports 23 | // - unhighlight ports 24 | // - report the location of specific ports 25 | OpIntPtrDecorator = function (options) { 26 | this.color = '#80deea'; 27 | DecoratorBase.call(this, options); 28 | }; 29 | 30 | _.extend(OpIntPtrDecorator.prototype, DecoratorBase.prototype); 31 | 32 | OpIntPtrDecorator.prototype.DECORATOR_ID = DECORATOR_ID; 33 | 34 | OpIntPtrDecorator.prototype.onValidNameChange = function(newValue) { 35 | return this.changePtrName(this.name, newValue); 36 | }; 37 | 38 | return OpIntPtrDecorator; 39 | }); 40 | -------------------------------------------------------------------------------- /src/decorators/OpIntPtrDecorator/OpIntPtrDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/OpIntPtrDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | OpIntPtrDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var OpIntPtrDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'OpIntPtrDecorator'; 22 | 23 | OpIntPtrDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('OpIntPtrDecorator ctor'); 29 | }; 30 | 31 | _.extend(OpIntPtrDecorator.prototype, __parent_proto__); 32 | OpIntPtrDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | OpIntPtrDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: OpIntPtrDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return OpIntPtrDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/decorators/OperationDecorator/OperationDecorator.js: -------------------------------------------------------------------------------- 1 | /*globals define, _*/ 2 | /*jshint browser: true, camelcase: false*/ 3 | 4 | /** 5 | * @author brollb / https://github.com/brollb 6 | */ 7 | 8 | define([ 9 | 'js/Decorators/DecoratorBase', 10 | './EasyDAG/OperationDecorator.EasyDAGWidget' 11 | ], function ( 12 | DecoratorBase, 13 | OperationDecoratorEasyDAGWidget 14 | ) { 15 | 16 | 'use strict'; 17 | 18 | var OperationDecorator, 19 | __parent__ = DecoratorBase, 20 | __parent_proto__ = DecoratorBase.prototype, 21 | DECORATOR_ID = 'OperationDecorator'; 22 | 23 | OperationDecorator = function (params) { 24 | var opts = _.extend({loggerName: this.DECORATORID}, params); 25 | 26 | __parent__.apply(this, [opts]); 27 | 28 | this.logger.debug('OperationDecorator ctor'); 29 | }; 30 | 31 | _.extend(OperationDecorator.prototype, __parent_proto__); 32 | OperationDecorator.prototype.DECORATORID = DECORATOR_ID; 33 | 34 | /*********************** OVERRIDE DecoratorBase MEMBERS **************************/ 35 | 36 | OperationDecorator.prototype.initializeSupportedWidgetMap = function () { 37 | this.supportedWidgetMap = { 38 | EasyDAG: OperationDecoratorEasyDAGWidget 39 | }; 40 | }; 41 | 42 | return OperationDecorator; 43 | }); 44 | -------------------------------------------------------------------------------- /src/layouts/SidebarLayout/SidebarLayout.css: -------------------------------------------------------------------------------- 1 | .ui-layout-center .layout-center { 2 | left: 40px; 3 | height: 100%; 4 | width: 100%; 5 | position: absolute; 6 | } 7 | 8 | .ui-layout-sidebar { 9 | top: 64px; 10 | width: 40px; 11 | bottom: 27px; 12 | } 13 | -------------------------------------------------------------------------------- /src/layouts/SidebarLayout/templates/SidebarLayout.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | -------------------------------------------------------------------------------- /src/plugins/ApplyUpdates/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ApplyUpdates", 3 | "name": "ApplyUpdates", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } -------------------------------------------------------------------------------- /src/plugins/CheckUpdates/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CheckUpdates", 3 | "name": "CheckUpdates", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": true, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } 15 | -------------------------------------------------------------------------------- /src/plugins/CreateExecution/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "CreateExecution", 3 | "name": "Create Execution", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [ 14 | { 15 | "name": "snapshot", 16 | "displayName": "Snapshot", 17 | "description": "Freeze the operation definitions and attributes at current value", 18 | "value": true, 19 | "valueType": "boolean", 20 | "readOnly": false 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/plugins/ExecuteJob/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ExecuteJob", 3 | "name": "ExecuteJob", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": true, 12 | "writeAccessRequired": false, 13 | "canBeAborted": true, 14 | "configStructure": [] 15 | } 16 | -------------------------------------------------------------------------------- /src/plugins/ExecuteJob/metadata/Metadata.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | ], function( 4 | ) { 5 | class Metadata { 6 | constructor(node, core, META) { 7 | this.node = node; 8 | this.core = core; 9 | this.META = META; 10 | } 11 | 12 | async update(/*content*/) { 13 | throw new Error('not implemented!'); 14 | } 15 | 16 | async loadChildren() { 17 | const provPath = this.core.getPointerPath(this.node, 'provenance'); 18 | const children = (await this.core.loadChildren(this.node)) 19 | .filter(node => !provPath.includes(this.core.getPath(node))); 20 | 21 | return children; 22 | } 23 | 24 | static getCommand() { 25 | throw new Error('not implemented!'); 26 | } 27 | 28 | static getMetaType() { 29 | throw new Error('not implemented!'); 30 | } 31 | } 32 | 33 | 34 | return Metadata; 35 | }); 36 | -------------------------------------------------------------------------------- /src/plugins/ExecuteJob/metadata/index.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | './Figure', 4 | ], function( 5 | Figure, 6 | ) { 7 | 8 | const MetadataClasses = [Figure]; 9 | function getClassForCommand(cmd) { 10 | return MetadataClasses.find(clazz => { 11 | return clazz.getCommand() === cmd; 12 | }); 13 | } 14 | 15 | return {getClassForCommand}; 16 | }); 17 | -------------------------------------------------------------------------------- /src/plugins/ExecutePipeline/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ExecutePipeline", 3 | "name": "Execute Pipeline", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-random", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": true, 12 | "canBeAborted": true, 13 | "configStructure": [ 14 | { 15 | "name": "name", 16 | "displayName": "Execution name", 17 | "description": "Optional name for this execution instance", 18 | "value": "", 19 | "valueType": "string", 20 | "readOnly": false 21 | }, 22 | { 23 | "name": "debug", 24 | "displayName": "Debug Mode", 25 | "description": "Allow for operation editing after creation", 26 | "value": false, 27 | "valueType": "boolean", 28 | "readOnly": false 29 | } 30 | ] 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/plugins/Export/deepforge.ejs: -------------------------------------------------------------------------------- 1 | -- Instantiate the deepforge object 2 | deepforge = {} 3 | 4 | function deepforge.initialize() 5 | require 'nn' 6 | require 'rnn' 7 | <%= initCode %> 8 | end 9 | 10 | -- Graph support 11 | torch.class('deepforge.Graph') 12 | 13 | function deepforge.Graph:__init(name) 14 | -- nop 15 | end 16 | 17 | torch.class('deepforge._Line') 18 | 19 | function deepforge._Line:__init(graphId, name, opts) 20 | -- nop 21 | end 22 | 23 | function deepforge._Line:add(x, y) 24 | -- nop 25 | end 26 | 27 | function deepforge.Graph:line(name, opts) 28 | return deepforge._Line(self.id, name, opts) 29 | end 30 | 31 | -- Image support 32 | function deepforge.image(name, tensor) 33 | -- nop 34 | end 35 | 36 | torch.class('deepforge.Image') 37 | function deepforge.Image:__init(name, tensor) 38 | -- nop 39 | end 40 | 41 | function deepforge.Image:update(tensor) 42 | -- nop 43 | end 44 | 45 | function deepforge.Image:title(name) 46 | -- nop 47 | end 48 | -------------------------------------------------------------------------------- /src/plugins/Export/format.js: -------------------------------------------------------------------------------- 1 | 2 | /* globals define*/ 3 | // The supported export formats and metadata 4 | define([ 5 | './formats/cli/cli' 6 | ], function( 7 | Format0 8 | ) { 9 | 10 | return { 11 | 'Basic CLI': Format0 12 | }; 13 | }); 14 | -------------------------------------------------------------------------------- /src/plugins/Export/format.js.ejs: -------------------------------------------------------------------------------- 1 | <% // Add default format 2 | formats = extensions 3 | formats.unshift({ name: 'cli', main: 'cli.js', displayName: 'Basic CLI' }) 4 | %> 5 | /* globals define*/ 6 | // The supported export formats and metadata 7 | define([ 8 | <%= formats.map(function(format) { 9 | return ' \'./formats/' + format.name + '/' + 10 | path.basename(format.main.replace(/\.js$/, '')) + '\'' 11 | }) 12 | .join(',\n') %> 13 | ], function( 14 | <%= formats.map(function(f, index) { return ' Format' + index; }).join(',\n') %> 15 | ) { 16 | 17 | return { 18 | <%= formats.map(function(f, index) { 19 | return ' \'' + f.displayName + '\': Format' + index; 20 | }).join(',\n') %> 21 | }; 22 | }); 23 | -------------------------------------------------------------------------------- /src/plugins/Export/formats/cli/cli.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | // Simple torch cli for the given pipeline 3 | define([ 4 | ], function( 5 | ) { 6 | 7 | var CliExporter = {}; 8 | 9 | CliExporter.main = function (files) { 10 | // Add a readme, dockerfile, requirements.txt? 11 | // TODO 12 | return files; 13 | }; 14 | 15 | return CliExporter; 16 | }); 17 | -------------------------------------------------------------------------------- /src/plugins/Export/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "Export", 3 | "name": "Export", 4 | "version": "1.0.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } 15 | -------------------------------------------------------------------------------- /src/plugins/Export/toboolean.lua: -------------------------------------------------------------------------------- 1 | local function toboolean(str) 2 | if str == 'true' then 3 | return true 4 | elseif str == 'false' then 5 | return false 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /src/plugins/ExportBranch/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ExportBranch", 3 | "name": "ExportBranch", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "dependencies": [], 13 | "writeAccessRequired": false, 14 | "configStructure": [] 15 | } -------------------------------------------------------------------------------- /src/plugins/GenerateJob/.gitignore: -------------------------------------------------------------------------------- 1 | templates/utils.build.js -------------------------------------------------------------------------------- /src/plugins/GenerateJob/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "GenerateJob", 3 | "name": "GenerateJob", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/deepforge.ejs: -------------------------------------------------------------------------------- 1 | # Instantiate the deepforge object 2 | 3 | import pickle 4 | 5 | serializers = {} 6 | deserializers = {} 7 | 8 | def dump(data, outfile): 9 | serialize = get_serializer(data) 10 | serialize(data, outfile) 11 | 12 | def load(full_name, outfile): 13 | deserialize = get_deserializer(full_name) 14 | return deserialize(outfile) 15 | 16 | def get_full_name(data): 17 | class_name = data.__name__ 18 | module = data.__module__ 19 | return module + '.' + class_name 20 | 21 | def get_full_class_name(data): 22 | return get_full_name(data.__class__) 23 | 24 | def get_serializer(data): 25 | try: 26 | full_name = get_full_class_name(data) 27 | return serializers[full_name] 28 | except: 29 | return pickle.dump 30 | 31 | def get_deserializer(full_name): 32 | try: 33 | return deserializers[full_name] 34 | except: 35 | return pickle.load 36 | 37 | def register(classObj, serialize, deserialize): 38 | full_name = get_full_name(classObj) 39 | serializers[full_name] = serialize 40 | deserializers[full_name] = deserialize 41 | -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/deepforge__init__.py: -------------------------------------------------------------------------------- 1 | from . import serialization 2 | -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/deserialize.ejs: -------------------------------------------------------------------------------- 1 | require 'paths' 2 | 3 | local path = 'inputs/<%= name %>/data' 4 | local abs_path = paths.concat('inputs', '<%= name %>', 'data') 5 | 6 | <%= code %> 7 | -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/entry.ejs: -------------------------------------------------------------------------------- 1 | import main 2 | import pickle 3 | 4 | # run the <%= name %> and serialize the results 5 | 6 | # serialize by type 7 | import outputs 8 | -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/environment.worker.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/plugins/GenerateJob/templates/environment.worker.yml -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/index.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([ 3 | 'text!./start.js', 4 | 'text!./run-debug.js', 5 | 'text!./main.ejs', 6 | 'text!./deepforge.ejs', 7 | 'text!./plotly_backend.py', 8 | 'text!./deepforge__init__.py', 9 | 'text!./serialize.ejs', 10 | 'text!./deserialize.ejs', 11 | 'text!./utils.build.js', 12 | 'text!./environment.worker.yml', 13 | ], function( 14 | START, 15 | RUN_DEBUG, 16 | MAIN, 17 | DEEPFORGE_SERIALIZATION, 18 | MATPLOTLIB_BACKEND, 19 | DEEPFORGE_INIT, 20 | SERIALIZE, 21 | DESERIALIZE, 22 | UTILS, 23 | WORKER_ENV, 24 | ) { 25 | 26 | return { 27 | START, 28 | RUN_DEBUG, 29 | MAIN, 30 | SERIALIZE, 31 | DEEPFORGE_SERIALIZATION, 32 | MATPLOTLIB_BACKEND, 33 | DEEPFORGE_INIT, 34 | DESERIALIZE, 35 | UTILS, 36 | WORKER_ENV, 37 | }; 38 | }); 39 | -------------------------------------------------------------------------------- /src/plugins/GenerateJob/templates/serialize.ejs: -------------------------------------------------------------------------------- 1 | # Serialization functions for: <%= types.map(function(type) {return type[0];}).join('\n-- ') %> 2 | 3 | serializer = {} 4 | <% types.forEach(function(pair) { 5 | var type = pair[0], 6 | fn = pair[1], 7 | safeType = type.replace(/[^a-zA-Z\d_]/g, '_'); 8 | 9 | %> 10 | 11 | def <%= safeType %> (name, data): 12 | path = 'outputs/' .. name 13 | <%= fn.replace('\n', '\n ') %> 14 | 15 | serializer['<%= type %>'] = <%= safeType %> 16 | 17 | <% }); %> 18 | -------------------------------------------------------------------------------- /src/plugins/GenerateYaml/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "GenerateYaml", 3 | "name": "Generate Yaml", 4 | "version": "0.1.0", 5 | "description": "Generate yaml representation of the model", 6 | "icon": { 7 | "src": "", 8 | "class": "glyphicon glyphicon-ok-circle" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "configStructure": [] 13 | } 14 | -------------------------------------------------------------------------------- /src/plugins/ImportArtifact/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ImportArtifact", 3 | "name": "Import Existing Data", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-transfer", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": true, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": true, 13 | "configStructure": [ 14 | { 15 | "name": "dataPath", 16 | "displayName": "File Path", 17 | "description": "Path to an existing artifact in the storage backend", 18 | "value": "", 19 | "valueType": "string", 20 | "readOnly": false, 21 | "required": true 22 | }, 23 | { 24 | "name": "dataTypeId", 25 | "displayName": "Data Type", 26 | "description": "", 27 | "value": "", 28 | "valueType": "string", 29 | "readOnly": false 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /src/plugins/ImportLibrary/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ImportLibrary", 3 | "name": "ImportLibrary", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } -------------------------------------------------------------------------------- /src/plugins/ImportYaml/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ImportYaml", 3 | "name": "Import Yaml architecture", 4 | "version": "0.1.0", 5 | "description": "Import a Yaml model.", 6 | "icon": { 7 | "src": "", 8 | "class": "glyphicon glyphicon-ok-circle" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "configStructure": [ 13 | { 14 | "name": "srcHash", 15 | "displayName": "yaml nodes", 16 | "description": "", 17 | "value": "", 18 | "valueType": "asset", 19 | "readOnly": false 20 | }, 21 | { 22 | "name": "baseType", 23 | "displayName": "Base type of model container", 24 | "description": "", 25 | "value": "", 26 | "valueType": "string", 27 | "readOnly": false 28 | }, 29 | { 30 | "name": "connType", 31 | "displayName": "Base type of connections to use", 32 | "description": "", 33 | "value": "", 34 | "valueType": "string", 35 | "readOnly": false 36 | } 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /src/plugins/ReifyArtifactProv/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "ReifyArtifactProv", 3 | "name": "Reify Artifact Provenance", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "dependencies": [], 13 | "writeAccessRequired": false, 14 | "configStructure": [ 15 | { 16 | "name": "artifactId", 17 | "displayName": "Artifact", 18 | "description": "Create a pipeline of the provenance of the given artifact", 19 | "value": "", 20 | "valueType": "string", 21 | "readOnly": false 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /src/plugins/TwoPhaseCommit/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "TwoPhaseCommit", 3 | "name": "TwoPhaseCommit", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "dependencies": [], 13 | "writeAccessRequired": false, 14 | "configStructure": [] 15 | } -------------------------------------------------------------------------------- /src/plugins/UpdateLibrarySeed/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "UpdateLibrarySeed", 3 | "name": "UpdateLibrarySeed", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": true, 12 | "writeAccessRequired": false, 13 | "configStructure": [ 14 | { 15 | "name": "releaseType", 16 | "displayName": "Release Type", 17 | "description": "Specify major, minor or patch release", 18 | "value": "minor", 19 | "valueItems": [ 20 | "major", 21 | "minor", 22 | "patch" 23 | ], 24 | "valueType": "string", 25 | "readOnly": false 26 | }, 27 | { 28 | "name": "changelog", 29 | "displayName": "Changelog", 30 | "description": "Describe the changes made in this release", 31 | "value": "", 32 | "valueType": "string", 33 | "readOnly": false 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /src/plugins/UploadArtifact/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "UploadArtifact", 3 | "name": "Upload Artifact", 4 | "version": "0.3.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cloud-upload", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": true, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": true, 13 | "configStructure": [ 14 | { 15 | "name": "assetInfo", 16 | "displayName": "Data to upload", 17 | "description": "", 18 | "value": "", 19 | "valueType": "userAsset", 20 | "readOnly": false 21 | }, 22 | { 23 | "name": "dataTypeId", 24 | "displayName": "Data Type", 25 | "description": "", 26 | "value": "", 27 | "valueType": "string", 28 | "readOnly": false 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /src/plugins/UploadLibraryModelToBlob/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "UploadLibraryModelToBlob", 3 | "name": "UploadLibraryModelToBlob", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "dependencies": [], 13 | "writeAccessRequired": false, 14 | "configStructure": [] 15 | } -------------------------------------------------------------------------------- /src/plugins/UploadSeedToBlob/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "UploadSeedToBlob", 3 | "name": "UploadSeedToBlob", 4 | "version": "0.1.0", 5 | "description": "", 6 | "icon": { 7 | "class": "glyphicon glyphicon-cog", 8 | "src": "" 9 | }, 10 | "disableServerSideExecution": false, 11 | "disableBrowserSideExecution": false, 12 | "writeAccessRequired": false, 13 | "configStructure": [] 14 | } 15 | -------------------------------------------------------------------------------- /src/routers/InteractiveCompute/Channel.js: -------------------------------------------------------------------------------- 1 | /* globals requireJS */ 2 | const EventEmitter = requireJS('deepforge/EventEmitter'); 3 | 4 | class Channel extends EventEmitter { 5 | constructor(ws1, ws2) { 6 | super(); 7 | this.ws1 = ws1; 8 | this.ws2 = ws2; 9 | this.ws1.on('message', data => this.ws2.send(data)); 10 | this.ws2.on('message', data => this.ws1.send(data)); 11 | this.ws1.onclose = 12 | this.ws2.onclose = () => this.close(); 13 | } 14 | 15 | close () { 16 | this.ws1.close(); 17 | this.ws2.close(); 18 | this.emit('close'); 19 | } 20 | } 21 | 22 | Channel.CLOSE = 'close'; 23 | module.exports = Channel; 24 | -------------------------------------------------------------------------------- /src/routers/storage.js: -------------------------------------------------------------------------------- 1 | // Get a mongodb connection 2 | 3 | var mongodb = require('mongodb'), 4 | connection; 5 | 6 | module.exports = function(logger, gmeConfig) { 7 | if (!connection) { 8 | connection = mongodb.MongoClient.connect(gmeConfig.mongo.uri, gmeConfig.mongo.options) 9 | .then(db => { 10 | logger.debug('Connected to mongo!'); 11 | return db; 12 | }) 13 | .catch(err => { 14 | logger.error(`Could not connect to mongo: ${err}`); 15 | throw err; 16 | }); 17 | } 18 | return connection; 19 | }; 20 | -------------------------------------------------------------------------------- /src/routers/utils.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | getMissingField: function(array, fields) { 3 | for (var i = fields.length; i--;) { 4 | if (!array[fields[i]]) { 5 | return fields[i]; 6 | } 7 | } 8 | return null; 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /src/seeds/devPipelineTests/devPipelineTests.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/devPipelineTests/devPipelineTests.webgmex -------------------------------------------------------------------------------- /src/seeds/devProject/devProject.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/devProject/devProject.webgmex -------------------------------------------------------------------------------- /src/seeds/devTests/devTests.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/devTests/devTests.webgmex -------------------------------------------------------------------------------- /src/seeds/devUtilTests/devUtilTests.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/devUtilTests/devUtilTests.webgmex -------------------------------------------------------------------------------- /src/seeds/minimal/minimal.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/minimal/minimal.webgmex -------------------------------------------------------------------------------- /src/seeds/pipeline/pipeline.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/pipeline/pipeline.webgmex -------------------------------------------------------------------------------- /src/seeds/pipeline/releases.jsonl: -------------------------------------------------------------------------------- 1 | {"version":"0.20.0","changelog":"Add provenance info to Data nodes"} 2 | {"version":"0.21.0","changelog":"Add provenance to metadata (via WithProvenance mixin)"} 3 | {"version":"0.21.1","changelog":"Update Inheritance of Subgraph, Line, Images, ScatterPoints etc.. nodes"} 4 | {"version":"0.22.0","changelog":"Incorporate PlotlyJSON into Graph meta node"} 5 | {"version":"0.23.0","changelog":"Add TrainKeras implicit operation"} 6 | 7 | {"version":"0.24.0","changelog":"Add provOutput to WithProvenance mixin (required for pipeline reconstruction)"} -------------------------------------------------------------------------------- /src/seeds/pipeline/version.txt: -------------------------------------------------------------------------------- 1 | 0.20.1 -------------------------------------------------------------------------------- /src/seeds/project/project.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/project/project.webgmex -------------------------------------------------------------------------------- /src/seeds/tests/tests.webgmex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/seeds/tests/tests.webgmex -------------------------------------------------------------------------------- /src/visualizers/panels/DataTypeEditor/DataTypeEditorPanel.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | /*jshint browser: true*/ 3 | 4 | define([ 5 | 'panels/TilingViz/TilingVizPanel', 6 | 'panels/SerializeEditor/SerializeEditorPanel', 7 | 'panels/DeserializeEditor/DeserializeEditorPanel', 8 | 'underscore' 9 | ], function ( 10 | TilingViz, 11 | SerializeEditor, 12 | DeserializeEditor, 13 | _ 14 | ) { 15 | 'use strict'; 16 | 17 | var DataTypeEditorPanel; 18 | 19 | DataTypeEditorPanel = function (layoutManager, params) { 20 | TilingViz.call(this, layoutManager, params); 21 | }; 22 | 23 | //inherit from PanelBaseWithHeader 24 | _.extend(DataTypeEditorPanel.prototype, TilingViz.prototype); 25 | 26 | DataTypeEditorPanel.prototype.getPanels = function () { 27 | return [SerializeEditor, DeserializeEditor]; 28 | }; 29 | 30 | return DataTypeEditorPanel; 31 | }); 32 | -------------------------------------------------------------------------------- /src/visualizers/panels/DeserializeEditor/DeserializeEditorControl.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | /*jshint browser: true*/ 3 | 4 | define([ 5 | 'panels/SerializeEditor/SerializeEditorControl', 6 | 'panels/TextEditor/TextEditorControl', 7 | 'underscore' 8 | ], function ( 9 | SerializeEditorControl, 10 | TextEditorControl, 11 | _ 12 | ) { 13 | 14 | 'use strict'; 15 | 16 | var DeserializeEditorControl; 17 | 18 | DeserializeEditorControl = function (options) { 19 | options.attributeName = 'deserialize'; 20 | TextEditorControl.call(this, options); 21 | }; 22 | 23 | _.extend( 24 | DeserializeEditorControl.prototype, 25 | SerializeEditorControl.prototype 26 | ); 27 | 28 | return DeserializeEditorControl; 29 | }); 30 | -------------------------------------------------------------------------------- /src/visualizers/panels/Footer/FilteredNotificationWidget.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | // A notification widget which filters out stdout update notifications 3 | define([ 4 | 'deepforge/Constants', 5 | 'js/Widgets/Notification/NotificationWidget' 6 | ], function( 7 | CONSTANTS, 8 | GmeNotificationWidget 9 | ) { 10 | var NotificationWidget = function() { 11 | GmeNotificationWidget.apply(this, arguments); 12 | }; 13 | 14 | NotificationWidget.prototype = Object.create(GmeNotificationWidget.prototype); 15 | 16 | NotificationWidget.prototype.isUserNotication = function(data) { 17 | return data.message.indexOf(CONSTANTS.STDOUT_UPDATE) === -1; 18 | }; 19 | 20 | NotificationWidget.prototype._refreshNotifications = function(eventData) { 21 | 22 | if (this.isUserNotication(eventData)) { 23 | GmeNotificationWidget.prototype._refreshNotifications.call(this, eventData); 24 | } 25 | }; 26 | 27 | return NotificationWidget; 28 | }); 29 | -------------------------------------------------------------------------------- /src/visualizers/panels/ForgeActionButton/Libraries.json: -------------------------------------------------------------------------------- 1 | [ 2 | ] 3 | -------------------------------------------------------------------------------- /src/visualizers/panels/ForgeActionButton/Libraries.json.ejs: -------------------------------------------------------------------------------- 1 | <%= JSON.stringify(extensions.map(function(ext) { 2 | return { 3 | name: ext.name, 4 | description: ext.description, 5 | nodeTypes: ext.nodeTypes, 6 | initCode: ext.initCode, 7 | seed: ext.seed, 8 | models: ext.models, 9 | }; 10 | }), null, 2) %> 11 | -------------------------------------------------------------------------------- /src/visualizers/panels/ForgeActionButton/LibraryDialog.css: -------------------------------------------------------------------------------- 1 | .library-modal .modal-content .modal-header span { 2 | font-size: 28px; 3 | vertical-align: middle; 4 | } 5 | 6 | .library-modal .library-description { 7 | font-style: italic; 8 | } 9 | 10 | .library-modal i { 11 | cursor: pointer; 12 | } 13 | 14 | .library-modal .badge { 15 | cursor: default; 16 | } 17 | 18 | .library-modal span { 19 | cursor: default; 20 | } 21 | -------------------------------------------------------------------------------- /src/visualizers/panels/ForgeActionButton/LibraryDialogModal.html: -------------------------------------------------------------------------------- 1 | 26 | -------------------------------------------------------------------------------- /src/visualizers/panels/InteractiveExplorer/InteractiveExplorerPanel.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | 3 | define([ 4 | 'panels/InteractiveEditor/InteractiveEditorPanel', 5 | 'widgets/InteractiveExplorer/InteractiveExplorerWidget', 6 | './InteractiveExplorerControl', 7 | ], function ( 8 | InteractiveEditorPanel, 9 | InteractiveExplorerWidget, 10 | InteractiveExplorerControl, 11 | ) { 12 | 'use strict'; 13 | 14 | class InteractiveExplorerPanel extends InteractiveEditorPanel { 15 | 16 | initialize() { 17 | this.setTitle(''); 18 | this.widget = new InteractiveExplorerWidget(this.logger, this.$el); 19 | this.widget.setTitle = title => this.setTitle(title); 20 | 21 | this.control = new InteractiveExplorerControl({ 22 | logger: this.logger, 23 | client: this._client, 24 | embedded: this._embedded, 25 | widget: this.widget 26 | }); 27 | 28 | this.onActivate(); 29 | } 30 | } 31 | 32 | return InteractiveExplorerPanel; 33 | }); 34 | -------------------------------------------------------------------------------- /src/visualizers/panels/InteractiveWorkspace/InteractiveEditors.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "TrainKeras", 4 | "title": "Neural Network Trainer", 5 | "panel": "panels/TrainKeras/TrainKerasPanel", 6 | "dependencies": ["keras"], 7 | "DEBUG_ONLY": false 8 | } 9 | ] 10 | -------------------------------------------------------------------------------- /src/visualizers/panels/OperationDepEditor/environment.yml.tpl: -------------------------------------------------------------------------------- 1 | # Conda environment to use when executing the given operation. 2 | # For more information, check out https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#create-env-file-manually 3 | dependencies: 4 | - python=3.7 5 | -------------------------------------------------------------------------------- /src/visualizers/panels/OperationInterfaceEditor/Colors.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define({ 3 | PRIMITIVE: '#b0bec5', 4 | COMPLEX: '#78909c' 5 | }); 6 | -------------------------------------------------------------------------------- /src/visualizers/panels/OutputViewer/OutputViewer.css: -------------------------------------------------------------------------------- 1 | 2 | .output-viewer .output-pager { 3 | position: absolute; 4 | left: 0.75em; 5 | bottom: 0; 6 | z-index: 100; 7 | } 8 | .output-viewer .empty { 9 | visibility: hidden; 10 | } 11 | .output-viewer .pagination { 12 | margin-bottom: 0.5em; 13 | } 14 | -------------------------------------------------------------------------------- /src/visualizers/panels/OutputViewer/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "Image": "picture", 3 | "Console": "console", 4 | "Graph": "random" 5 | } 6 | -------------------------------------------------------------------------------- /src/visualizers/panels/SerializeEditor/SerializeEditorControl.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | /*jshint browser: true*/ 3 | 4 | define([ 5 | 'panels/TextEditor/TextEditorControl', 6 | 'underscore' 7 | ], function ( 8 | TextEditorControl, 9 | _ 10 | ) { 11 | 12 | 'use strict'; 13 | 14 | var SerializeEditorControl; 15 | 16 | SerializeEditorControl = function (options) { 17 | options.attributeName = 'serialize'; 18 | TextEditorControl.call(this, options); 19 | this._widget.setName = this.setName.bind(this); 20 | }; 21 | 22 | _.extend( 23 | SerializeEditorControl.prototype, 24 | TextEditorControl.prototype 25 | ); 26 | 27 | // input/output updates are actually activeNode updates 28 | SerializeEditorControl.prototype._onUpdate = function (id) { 29 | if (id === this._currentNodeId) { 30 | TextEditorControl.prototype._onUpdate.call(this, this._currentNodeId); 31 | } 32 | }; 33 | 34 | return SerializeEditorControl; 35 | }); 36 | -------------------------------------------------------------------------------- /src/visualizers/panels/TrainKeras/Main.py: -------------------------------------------------------------------------------- 1 | import utils.init 2 | from operations.train import Train 3 | from artifacts.<%= dataset.name %> import data 4 | import deepforge 5 | import os 6 | import json 7 | 8 | <%= archCode %> 9 | model = result 10 | 11 | train = Train(model) 12 | model = train.execute(data) 13 | 14 | os.makedirs('outputs/<%= path %>/', exist_ok=True) 15 | with open('outputs/<%= path %>/metadata.json', 'w') as outfile: 16 | metadata = {} 17 | metadata['type'] = deepforge.serialization.get_full_class_name(model) 18 | json.dump(metadata, outfile) 19 | 20 | with open('outputs/<%= path %>/data', 'wb') as outfile: 21 | deepforge.serialization.dump(model, outfile) 22 | -------------------------------------------------------------------------------- /src/visualizers/panels/WorkerHeader/ComputeModal.css: -------------------------------------------------------------------------------- 1 | .compute-modal .modal-content .modal-header span { 2 | font-size: 28px; 3 | vertical-align: middle; 4 | } 5 | 6 | .compute-modal .modal-content .modal-header .header-icon { 7 | height: 28px; 8 | width: 28px; 9 | margin-right: 1ex; 10 | display: inline-block; 11 | vertical-align: middle; 12 | background-size: 28px 28px; 13 | } 14 | 15 | .compute-modal .modal-content .modal-body { 16 | text-align: left; 17 | } 18 | 19 | .compute-modal .tab-pane { 20 | padding: 15px; 21 | } 22 | -------------------------------------------------------------------------------- /src/visualizers/panels/WorkerHeader/EmptyDashboard.css: -------------------------------------------------------------------------------- 1 | .compute-modal .empty-dashboard { 2 | font-style: italic; 3 | font-size: 1.3em; 4 | color: #777; 5 | text-align: center; 6 | } 7 | 8 | .compute-modal .no-dashboards { 9 | font-style: italic; 10 | font-size: 1.3em; 11 | color: #777; 12 | text-align: center; 13 | } 14 | -------------------------------------------------------------------------------- /src/visualizers/panels/WorkerHeader/EmptyDashboard.js: -------------------------------------------------------------------------------- 1 | /* globals define, $ */ 2 | define([ 3 | 'deepforge/compute/backends/ComputeDashboard', 4 | 'css!./EmptyDashboard.css', 5 | ], function( 6 | ComputeDashboard 7 | ) { 8 | 9 | const EmptyDashboard = function(name, logger, $container) { 10 | this.$el = $('
', {class: 'empty-dashboard'}); 11 | this.$el.text(`No dashboard available for ${name} backend`); 12 | this.logger = logger.fork(name); 13 | $container.append(this.$el); 14 | }; 15 | 16 | EmptyDashboard.prototype = Object.create(ComputeDashboard.prototype); 17 | 18 | return EmptyDashboard; 19 | }); 20 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArchEditor/SelectionManager.js: -------------------------------------------------------------------------------- 1 | /* globals _, define*/ 2 | define([ 3 | 'widgets/EasyDAG/SelectionManager', 4 | 'deepforge/viz/Buttons' 5 | ], function( 6 | ManagerBase, 7 | Buttons 8 | ) { 9 | 10 | var SelectionManager = function() { 11 | ManagerBase.apply(this, arguments); 12 | }; 13 | 14 | _.extend(SelectionManager.prototype, ManagerBase.prototype); 15 | 16 | SelectionManager.prototype.createActionButtons = function(width, height) { 17 | var btn; 18 | 19 | ManagerBase.prototype.createActionButtons.call(this, width, height); 20 | 21 | if (this.selectedItem.isConnection) { 22 | btn = new Buttons.Insert({ 23 | context: this._widget, 24 | $pEl: this.$selection, 25 | item: this.selectedItem, 26 | x: width/2, 27 | y: height/2 28 | }); 29 | } else { 30 | // Check that the base type 31 | btn = new Buttons.GoToBase({ 32 | $pEl: this.$selection, 33 | context: this._widget, 34 | title: 'Edit layer definition', 35 | item: this.selectedItem, 36 | x: width, 37 | y: 0 38 | }); 39 | } 40 | 41 | return btn; 42 | }; 43 | 44 | return SelectionManager; 45 | }); 46 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArchEditor/styles/ArchEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .arch-editor { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArchEditor/styles/ArchEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .arch-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArtifactIndex/ModelItem.js: -------------------------------------------------------------------------------- 1 | /*globals define, $*/ 2 | define([ 3 | 'deepforge/viz/Utils', 4 | 'text!./ModelRow.html' 5 | ], function( 6 | Utils, 7 | ROW_HTML 8 | ) { 9 | 'use strict'; 10 | 11 | var ModelItem = function(parent, node) { 12 | this.$el = $(ROW_HTML); 13 | this.initialize(); 14 | this.update(node); 15 | parent.append(this.$el); 16 | }; 17 | 18 | ModelItem.prototype.initialize = function() { 19 | // Get the fields and stuff 20 | this.$name = this.$el.find('.name'); 21 | this.$type = this.$el.find('.type'); 22 | this.$size = this.$el.find('.size'); 23 | this.$createdAt = this.$el.find('.createdAt'); 24 | this.$download = this.$el.find('.data-download'); 25 | this.$delete = this.$el.find('.data-remove'); 26 | this.$info = this.$el.find('.data-info'); 27 | }; 28 | 29 | ModelItem.prototype.update = function(node) { 30 | var date = node.createdAt ? Utils.getDisplayTime(node.createdAt) : 'unknown'; 31 | 32 | this.$name.text(node.name); 33 | this.$type.text(node.type || 'unknown'); 34 | this.$size.text(node.size || 'unknown'); 35 | this.$createdAt.text(date); 36 | }; 37 | 38 | ModelItem.prototype.remove = function() { 39 | this.$el.remove(); 40 | }; 41 | 42 | return ModelItem; 43 | }); 44 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArtifactIndex/ModelRow.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArtifactIndex/Table.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
NameTypeSizeCreation Date
13 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ArtifactIndex/styles/ArtifactIndexWidget.css: -------------------------------------------------------------------------------- 1 | .artifact-index { 2 | background-color: #eee !important; 3 | outline: none; 4 | text-align: center; 5 | } 6 | 7 | .artifact-index .data-download { 8 | color: inherit; 9 | } 10 | 11 | .artifact-index .type { 12 | font-style: italic; 13 | } 14 | 15 | .artifact-data-info { 16 | resize: none; 17 | } 18 | -------------------------------------------------------------------------------- /src/visualizers/widgets/DeserializeEditor/DeserializeEditorWidget.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | /*jshint browser: true*/ 3 | 4 | /** 5 | * Generated by VisualizerGenerator 1.7.0 from webgme on Wed Jun 01 2016 14:45:18 GMT-0500 (CDT). 6 | */ 7 | 8 | define([ 9 | 'widgets/SerializeEditor/SerializeEditorWidget', 10 | 'underscore', 11 | 'css!./styles/DeserializeEditorWidget.css' 12 | ], function ( 13 | SerializeEditorWidget, 14 | _ 15 | ) { 16 | 'use strict'; 17 | 18 | var DeserializeEditorWidget; 19 | //WIDGET_CLASS = 'deserialize-editor'; 20 | 21 | DeserializeEditorWidget = function (logger, container) { 22 | SerializeEditorWidget.call(this, logger, container); 23 | }; 24 | 25 | _.extend(DeserializeEditorWidget.prototype, SerializeEditorWidget.prototype); 26 | 27 | DeserializeEditorWidget.prototype.getHeader = function(desc) { 28 | this._name = desc.name; 29 | return this.comment([ 30 | `The deserialization function for ${desc.name}`, 31 | 'Globals:', 32 | ' `path` - target filename to load', 33 | '', 34 | `return the loaded ${desc.name}` 35 | ].join('\n')); 36 | }; 37 | 38 | DeserializeEditorWidget.prototype.getNameRegex = function() { 39 | return /The deserialization function for (.*)/; 40 | }; 41 | 42 | return DeserializeEditorWidget; 43 | }); 44 | -------------------------------------------------------------------------------- /src/visualizers/widgets/DeserializeEditor/styles/DeserializeEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .deserialize-editor { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/DeserializeEditor/styles/DeserializeEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .deserialize-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionIndex/ExecTable.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
NameCreation DateOrigin PipelineDurationDelete
15 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionIndex/styles/ExecutionIndexWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | .execution-index.panel-body { 5 | padding: 0; } 6 | 7 | .execution-index .left { 8 | position: absolute; 9 | background-color: #eee; 10 | overflow-y: scroll; } 11 | 12 | .execution-index .right { 13 | position: absolute; 14 | background-color: #eee; } 15 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionIndex/styles/ExecutionIndexWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .execution-index.panel-body { 6 | padding: 0; 7 | } 8 | 9 | .execution-index .left { 10 | position: absolute; 11 | background-color: #eee; 12 | overflow-y: scroll; 13 | } 14 | 15 | .execution-index .right { 16 | position: absolute; 17 | background-color: #eee; 18 | } 19 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionView/SelectionManager.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | 3 | define([ 4 | 'widgets/EasyDAG/SelectionManager', 5 | 'widgets/EasyDAG/Buttons', 6 | 'underscore' 7 | ], function( 8 | EasyDAGSelectionManager, 9 | Buttons, 10 | _ 11 | ) { 12 | 'use strict'; 13 | 14 | var SelectionManager = function(widget) { 15 | EasyDAGSelectionManager.call(this, widget); 16 | }; 17 | 18 | _.extend(SelectionManager.prototype, EasyDAGSelectionManager.prototype); 19 | 20 | SelectionManager.prototype.createActionButtons = function(width/*, height*/) { 21 | if (!this.selectedItem.isConnection) { 22 | new Buttons.Enter({ 23 | context: this._widget, 24 | $pEl: this.$selection, 25 | title: 'View output', 26 | item: this.selectedItem, 27 | icon: 'monitor', 28 | x: width, 29 | y: 0 30 | }); 31 | } 32 | }; 33 | 34 | return SelectionManager; 35 | }); 36 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionView/styles/ExecutionViewWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .execution-view { 10 | outline: none; 11 | } 12 | .footer-caption-container { 13 | position: absolute; 14 | left: 5px; 15 | bottom: 0; 16 | color: #666666; 17 | } 18 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ExecutionView/styles/ExecutionViewWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .execution-view { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ImageViewer/no-image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/visualizers/widgets/ImageViewer/no-image.gif -------------------------------------------------------------------------------- /src/visualizers/widgets/ImageViewer/styles/ImageViewerWidget.css: -------------------------------------------------------------------------------- 1 | 2 | .image-viewer img { 3 | position: absolute; 4 | image-rendering: pixelated; 5 | } 6 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveExplorer/InteractiveExplorerWidget.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | 3 | define([ 4 | 'widgets/InteractiveEditor/InteractiveEditorWidget', 5 | 'css!./styles/InteractiveExplorerWidget.css', 6 | ], function ( 7 | InteractiveEditorWidget, 8 | ) { 9 | 'use strict'; 10 | 11 | class InteractiveExplorerWidget extends InteractiveEditorWidget { 12 | 13 | getCapabilities() { 14 | return { 15 | suspend: this.isOveridden('getEditorState') && 16 | this.isOveridden('resume'), 17 | save: this.isOveridden('getSnapshot'), 18 | provenance: this.isOveridden('getEditorState') && 19 | this.isOveridden('getOperation'), 20 | }; 21 | } 22 | } 23 | 24 | return InteractiveExplorerWidget; 25 | }); 26 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveExplorer/styles/InteractiveExplorerWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .interactive-explorer { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveExplorer/styles/InteractiveExplorerWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .interactive-explorer { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/lib/golden-layout-1.5.9/src/css/README.md: -------------------------------------------------------------------------------- 1 | # Beware! 2 | 3 | All these files are generated automatically from the `less` templates in `../src/less` 4 | and are created by the `grunt less` command. 5 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/lib/golden-layout-1.5.9/src/css/goldenlayout-dark-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/less/goldenlayout-dark-theme.less"],"names":[],"mappings":"AAiBA,iBACE,mBAIF,YACE,mBAIF,aACE,aACE,uCAKJ,wBACE,iCAAA,CACA,0BAAA,CACA,0BAHF,uBAME,WACE,kBAAA,CACA,WAKJ,aACE,kBAAA,CACA,YAAA,CACA,8BAEA,YAAC,OACD,YAAC,aACC,kBAAA,CACA,UAKJ,WACE,WAAA,CACA,iBAEA,UAAC,eACC,eALJ,UASE,SACE,4BAAA,CACA,cAAA,CACA,aAAA,CACA,kBAAA,CACA,uCAAA,CACA,gBAAA,CACA,kBAAA,CACA,gBAjBJ,UASE,QAgBE,eACE,UAAA,CACA,WAAA,CACA,gOAAA,CACA,iCAAA,CACA,2BAAA,CACA,OAAA,CACA,SAAA,CACA,WAEA,UA1BJ,QAgBE,cAUG,OACC,UAKJ,UAhCF,QAgCG,WACC,kBAAA,CACA,6BAAA,CACA,mBAHF,UAhCF,QAgCG,UAKC,eACE,UAMR,aAAa,UAEX,WAAW,SADb,SAAS,UACP,WAAW,SACT,uCACA,aAJS,UAEX,WAAW,QAER,WAAD,SAHK,UACP,WAAW,QAER,WACC,6BAMN,YACE,YACE,yBAKF,OAAC,OACD,OAAC,WAEC,kBAAA,CACA,cAKJ,UAAW,aAAa,gBAAe,QACrC,cAIF,YAEE,IACE,iBAAA,CACA,iCAAA,CACA,2BAAA,CACA,UAAA,CACA,8BAEA,YAPF,GAOG,OACC,UAVN,YAeE,YACE,6MAhBJ,YAoBE,cACE,iLArBJ,YAyBE,WACE,iNAKJ,aAEE,YACE,yBAHJ,aAOE,aACE,cACE,6KAKN,yBACE,wBAAA,CACA,0BAIF,UACE,eADF,SAIE,QACE,kBAAA,CACA,WANJ,SAUE,UACE,gPAAA,CACA,iCAAA,CACA,2BAAA,CACA,6BAAA,CACA,4BAAA,CACA,WAGF,SAAC,MACC,UACE"} -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/lib/golden-layout-1.5.9/src/css/goldenlayout-light-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/less/goldenlayout-light-theme.less"],"names":[],"mappings":"AAiBA,iBAEE,+aAIF,YACE,kBAAA,CACA,yBAIF,aACE,aACE,sCAAA,CACA,sBAKJ,wBACE,yCAAA,CACA,0BAAA,CACA,UAAA,CACA,0BAJF,uBAOE,WACE,kBAAA,CACA,WAKJ,aACE,kBAAA,CACA,YAAA,CACA,8BAEA,YAAC,OACD,YAAC,aACC,kBAAA,CACA,UAKJ,WACE,YAGA,UAAC,eACC,eALJ,UASE,SACE,4BAAA,CACA,cAAA,CACA,aAAA,CACA,kBAAA,CACA,gBAAA,CACA,kBAAA,CACA,wBAAA,CACA,mBAjBJ,UASE,QAUE,WACE,gBApBN,UASE,QAeE,eACE,UAAA,CACA,WAAA,CACA,wKAAA,CACA,iCAAA,CACA,2BAAA,CACA,SAAA,CACA,OAAA,CACA,WAEA,UAzBJ,QAeE,cAUG,OACC,UAKJ,UA/BF,QA+BG,WACC,kBAAA,CACA,4CAAA,CACA,mBAHF,UA/BF,QA+BG,UAKC,eACE,UASJ,aAHS,UAEX,WAAW,QACR,WAAD,SAFK,UACP,WAAW,QACR,WACC,4CAMN,YACE,YACE,yBAKF,OAAC,OACD,OAAC,WAEC,kBAAA,CACA,cAKJ,UAAW,aAAa,gBAAe,QACrC,cAIF,YAEE,IACE,iBAAA,CACA,iCAAA,CACA,2BAAA,CACA,UAAA,CACA,8BAEA,YAPF,GAOG,OACC,UAVN,YAeE,YACE,iMAhBJ,YAoBE,cACE,yKArBJ,YAyBE,WACE,iLAKJ,aAEE,YACE,yBAHJ,aAOE,aACE,cACE,6KAKN,yBACE,wBAAA,CACA,0BAIF,UACE,eADF,SAIE,QACE,kBAAA,CACA,WANJ,SAUE,UACE,gPAAA,CACA,iCAAA,CACA,2BAAA,CACA,WAGF,SAAC,MACC,UACE"} -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/lib/golden-layout-1.5.9/src/css/goldenlayout-soda-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/less/goldenlayout-soda-theme.less"],"names":[],"mappings":"AAcA,iBACE,kBAAA,CACA,WAAY,iCAAZ,CACA,yBAIF,YACE,mBAIF,aACE,aACE,uCAKJ,wBACE,iCAAA,CACA,0BAAA,CACA,0BAHF,uBAME,WACE,kBAAA,CACA,WAKJ,aACE,kBAAA,CACA,YAAA,CACA,8BAEA,YAAC,OACD,YAAC,aACC,kBAAA,CACA,UAKJ,WACE,0LAAA,CACA,YAGA,UAAC,eACC,eANJ,UAUE,SACE,4BAAA,CACA,cAAA,CACA,0LAAA,CACA,aAAA,CACA,QAAA,CACA,mBAhBJ,UAUE,QAgBE,eACE,UAAA,CACA,WAAA,CACA,gOAAA,CACA,iCAAA,CACA,2BAAA,CACA,SAAA,CACA,OAAA,CACA,WAEA,UA1BJ,QAgBE,cAUG,OACC,UAKJ,UAhCF,QAgCG,WACC,kBAAA,CACA,mBAFF,UAhCF,QAgCG,UAIC,eACE,UAKR,SAAS,QAEP,YADF,SAAS,SACP,YACE,2OAIJ,YACE,YACE,yBAKF,OAAC,OACD,OAAC,WAEC,0KAAA,CACA,cAKJ,UAAW,aAAa,gBAAe,QACrC,cAIF,YAEE,IACE,iBAAA,CACA,iCAAA,CACA,2BAAA,CACA,UAAA,CACA,8BAEA,YAPF,GAOG,OACC,UAVN,YAeE,YACE,6MAhBJ,YAoBE,cACE,iLArBJ,YAyBE,WACE,iNAKJ,aAEE,YACE,yBAHJ,aAOE,aACE,cACE,6KAKN,yBACE,wBAAA,CACA,0BAIF,UACE,eADF,SAIE,QACE,kBAAA,CACA,WANJ,SAUE,UACE,gPAAA,CACA,iCAAA,CACA,2BAAA,CACA,WAGF,SAAC,MACC,UACE"} -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/lib/golden-layout-1.5.9/src/css/goldenlayout-translucent-theme.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/less/goldenlayout-translucent-theme.less"],"names":[],"mappings":"AAMA,iBACE,sBAAA,CACA,WAAY,4DAId,YACE,gCAAA,CACA,uCAAA,CACA,iBAIF,aACE,aACE,uCAKJ,wBACE,+CAAA,CACA,0BAAA,CACA,UAAA,CACA,0BAWF,aACE,kBAAA,CACA,YAAA,CACA,8BAEA,YAAC,OACD,YAAC,aACC,kBAAA,CACA,WAKJ,WACE,YAGA,UAAC,eACC,eALJ,UASE,SACE,4BAAA,CACA,cAAA,CACA,aAAA,CACA,gCAAA,CACA,gBAAA,CACA,mBAfJ,UASE,QASE,eACE,UAAA,CACA,WAAA,CACA,gOAAA,CACA,iCAAA,CACA,2BAAA,CACA,SAAA,CACA,OAAA,CACA,WAEA,UAnBJ,QASE,cAUG,OACC,UAKJ,UAzBF,QAyBG,WACC,kBAAA,CACA,4CAAA,CACA,mBAHF,UAzBF,QAyBG,UAKC,eACE,UASJ,aAHS,UAEX,WAAW,QACR,WAAD,SAFK,UACP,WAAW,QACR,WACC,4CAeJ,OAAC,OACD,OAAC,WAEC,gCAAA,CACA,cAaJ,YAEE,IACE,iBAAA,CACA,iCAAA,CACA,2BAAA,CACA,UAAA,CACA,8BAEA,YAPF,GAOG,OACC,UAVN,YAeE,YACE,6MAhBJ,YAoBE,cACE,iLArBJ,YAyBE,WACE,iNAmCJ,UACE,eADF,SAaE,UACE,gPAAA,CACA,iCAAA,CACA,2BAAA,CACA,WAGF,SAAC,MACC,UACE,UAON,SACE"} -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/styles/InteractiveWorkspaceWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | .interactive-workspace { 5 | outline: none; 6 | padding: 0 !important; } 7 | .interactive-workspace .welcome { 8 | color: #757575; 9 | font-size: 3em; 10 | font-style: italic; 11 | left: 50%; 12 | top: 50%; 13 | transform: translateY(-50%) translateX(-50%); 14 | position: absolute; } 15 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/styles/InteractiveWorkspaceWidget.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA;;GAEG;AAEH,sBAAuB;EACrB,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,YAAW", 4 | "sources": ["InteractiveWorkspaceWidget.scss"], 5 | "names": [], 6 | "file": "InteractiveWorkspaceWidget.css" 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/InteractiveWorkspace/styles/InteractiveWorkspaceWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .interactive-workspace { 6 | outline: none; 7 | padding: 0!important; 8 | 9 | .welcome { 10 | color: #757575; 11 | font-size: 3em; 12 | font-style: italic; 13 | left: 50%; 14 | top: 50%; 15 | transform: translateY(-50%) translateX(-50%); 16 | position: absolute; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/visualizers/widgets/LogViewer/styles/LogViewerWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | .log-viewer { 5 | outline: none; } 6 | .log-viewer .ansi-black { 7 | color: #000000; } 8 | .log-viewer .ansi-red { 9 | color: #c23621; } 10 | .log-viewer .ansi-green { 11 | color: #25bc24; } 12 | .log-viewer .ansi-yellow { 13 | color: #adad27; } 14 | .log-viewer .ansi-blue { 15 | color: #492ee1; } 16 | .log-viewer .ansi-magenta { 17 | color: #d338d3; } 18 | .log-viewer .ansi-cyan { 19 | color: #33bbc8; } 20 | .log-viewer .ansi-gray { 21 | color: #cbcccd; } 22 | -------------------------------------------------------------------------------- /src/visualizers/widgets/LogViewer/styles/LogViewerWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .log-viewer { 6 | outline: none; 7 | .ansi-black { 8 | color: #000000; 9 | } 10 | .ansi-red { 11 | color: rgb(194, 54, 33); 12 | } 13 | .ansi-green { 14 | color: rgb(37, 188, 36); 15 | } 16 | .ansi-yellow { 17 | color: rgb(173, 173, 39); 18 | } 19 | .ansi-blue { 20 | color: rgb(73, 46, 225); 21 | } 22 | .ansi-magenta { 23 | color: rgb(211, 56, 211); 24 | } 25 | .ansi-cyan { 26 | color: rgb(51, 187, 200); 27 | } 28 | .ansi-gray { 29 | color: rgb(203, 204, 205); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/visualizers/widgets/OperationCodeEditor/styles/OperationCodeEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .operation-code-editor { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/OperationCodeEditor/styles/OperationCodeEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .operation-code-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/OperationInterfaceEditor/styles/OperationInterfaceEditorWidget.css: -------------------------------------------------------------------------------- 1 | .operation-interface-editor { 2 | height: 100%; 3 | } 4 | -------------------------------------------------------------------------------- /src/visualizers/widgets/OperationInterfaceEditor/styles/OperationInterfaceEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .operation-interface-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineEditor/Connection.js: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | // Connection with port support 3 | define([ 4 | 'widgets/EasyDAG/Connection', 5 | 'underscore' 6 | ], function( 7 | EasyDAGConn, 8 | _ 9 | ) { 10 | 'use strict'; 11 | 12 | var Connection = function() { 13 | EasyDAGConn.apply(this, arguments); 14 | this.srcPort = this.desc.srcPort; 15 | this.dstPort = this.desc.dstPort; 16 | }; 17 | 18 | _.extend(Connection.prototype, EasyDAGConn.prototype); 19 | 20 | return Connection; 21 | }); 22 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineEditor/styles/PipelineEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | .pipeline-editor { 5 | outline: none; } 6 | .pipeline-editor .execution-container { 7 | bottom: 0; 8 | left: 0.75em; 9 | position: absolute; 10 | min-width: 25em; 11 | margin-bottom: 0; 12 | text-align: center; } 13 | .pipeline-editor .execution-header { 14 | font-size: 1.2em; 15 | padding-top: 0.25em; 16 | padding-bottom: 0.25em; 17 | padding-left: 0.75em; 18 | padding-right: 0.75em; } 19 | .pipeline-editor .execution-body { 20 | overflow: auto; 21 | max-height: 500px; } 22 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineEditor/styles/PipelineEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .pipeline-editor { 6 | outline: none; 7 | 8 | .execution-container { 9 | bottom: 0; 10 | left: 0.75em; 11 | position: absolute; 12 | min-width: 25em; 13 | margin-bottom: 0; 14 | text-align: center; 15 | } 16 | 17 | .execution-header { 18 | font-size: 1.2em; 19 | padding-top: 0.25em; 20 | padding-bottom: 0.25em; 21 | padding-left: 0.75em; 22 | padding-right: 0.75em; 23 | } 24 | 25 | .execution-body { 26 | overflow: auto; 27 | max-height: 500px; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineIndex/cards/Architecture.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | <%= name %> 7 |
8 | 12 |
13 | Open 14 | Delete 15 |
16 |
17 |
18 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineIndex/cards/Pipeline.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | <%= name %> 7 |

8 | <% if (executionCount === 0) { %> 9 | No executions 10 | <% } else if (executionCount === 1){ %> 11 | Executed once 12 | <% } else if (executionCount === 2){ %> 13 | Executed twice 14 | <% } else { %> 15 | Executed <%= executionCount %> times 16 | <% } %> 17 |

18 |
19 | 23 |
24 | Open 25 | Delete 26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /src/visualizers/widgets/PipelineIndex/styles/PipelineIndexWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .pipeline-index { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ResourceIndex/ResourceIndexWidget.js: -------------------------------------------------------------------------------- 1 | /*globals define */ 2 | /*jshint browser: true*/ 3 | 4 | define([ 5 | 'widgets/PipelineIndex/PipelineIndexWidget' 6 | ], function ( 7 | PipelineIndexWidget 8 | ) { 9 | 'use strict'; 10 | 11 | var ResourceIndexWidget = function () { 12 | PipelineIndexWidget.apply(this, arguments); 13 | }; 14 | 15 | ResourceIndexWidget.prototype = Object.create(PipelineIndexWidget.prototype); 16 | 17 | ResourceIndexWidget.prototype.getEmptyMsg = function() { 18 | // TODO: If no resources supported, then prompt about loading them? 19 | return 'No Existing Resources...'; 20 | }; 21 | 22 | return ResourceIndexWidget; 23 | }); 24 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ResourceIndex/styles/ArchIndexWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .arch-index { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/ResourceIndex/styles/ArchIndexWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .arch-index { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/RootViz/Card.html.ejs: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | <% if (typeof icon !== 'undefined') {%> 5 |
<%=icon%>
6 | <%}%> 7 | <%= title %> 8 |
<%= description %>

10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /src/visualizers/widgets/RootViz/RootViz.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | -------------------------------------------------------------------------------- /src/visualizers/widgets/RootViz/styles/RootVizWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .root-viz { 6 | outline: none; 7 | 8 | .description{ 9 | font-size: large; 10 | } 11 | 12 | .architectures-node-panel path { 13 | fill: blue; 14 | stroke: blue; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/visualizers/widgets/SerializeEditor/styles/SerializeEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .serialize-editor { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/SerializeEditor/styles/SerializeEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .serialize-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/Sidebar/NavBar.html: -------------------------------------------------------------------------------- 1 | 24 | -------------------------------------------------------------------------------- /src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/src/visualizers/widgets/Sidebar/lib/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /src/visualizers/widgets/TensorPlotter/ArtifactLoader.html: -------------------------------------------------------------------------------- 1 |

Available Artifacts

2 |
    3 |
  • Artifact 4 | 5 |
  • 6 |
7 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TensorPlotter/PlotEditor.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |
6 |
7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 |

Plotted Data

15 |
    16 |
17 | 18 |
19 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TensorPlotter/PlottedData.js: -------------------------------------------------------------------------------- 1 | /*globals define*/ 2 | define([ 3 | ], function( 4 | ) { 5 | class PlottedData { 6 | } 7 | 8 | return PlottedData; 9 | }); 10 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TensorPlotter/styles/ArtifactLoader.css: -------------------------------------------------------------------------------- 1 | .artifact-loader .artifact-state { 2 | font-style: italic; 3 | color: #777; 4 | } 5 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TextEditor/MonacoLanguages.json: -------------------------------------------------------------------------------- 1 | { 2 | "python": { 3 | "id": "python", 4 | "extensions": [ 5 | ".py", 6 | ".pyc" 7 | ], 8 | "aliases": [ 9 | "py", 10 | "PY" 11 | ], 12 | "mimetypes": [ 13 | "application/text" 14 | ], 15 | "comment": "#" 16 | }, 17 | "javascript": { 18 | "id": "javascript", 19 | "extensions": [ 20 | "js", 21 | "jsx" 22 | ], 23 | "mimetypes": [ 24 | "application/text" 25 | ], 26 | "comment": "//" 27 | }, 28 | "yaml": { 29 | "id": "yaml", 30 | "extensions": [ 31 | "yaml", 32 | "yml" 33 | ], 34 | "aliases": [ 35 | "yml", 36 | "yaml", 37 | "YML", 38 | "YAML" 39 | ], 40 | "mimetypes": [ 41 | "application/text" 42 | ], 43 | "comment": "#" 44 | }, 45 | "plaintext": { 46 | "id": "plaintext", 47 | "extensions": [ 48 | "txt", 49 | "text" 50 | ], 51 | "aliases": [ 52 | "text", 53 | "PLAINTEXT" 54 | ], 55 | "mimetypes": [ 56 | "application/text" 57 | ], 58 | "comment": "#" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TextEditor/styles/TextEditorWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .text-editor { 10 | outline: none; 11 | padding: 0px; 12 | text-align: left !important; 13 | } 14 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TextEditor/styles/TextEditorWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .text-editor { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TrainKeras/build/TrainDashboard.css: -------------------------------------------------------------------------------- 1 | main.svelte-193h8ui{text-align:center;padding:1em;max-width:240px;margin:0 auto}@media(min-width: 640px){main.svelte-193h8ui{max-width:none}}.row.svelte-193h8ui{display:flex;flex-flow:row wrap;justify-content:space-around} 2 | 3 | /*# sourceMappingURL=TrainDashboard.css.map */ -------------------------------------------------------------------------------- /src/visualizers/widgets/TrainKeras/styles/TrainKerasWidget.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any css that you may want for this visualizer. 3 | * 4 | * Ideally, you would use the scss file also provided in this directory 5 | * and then generate this file automatically from that. However, you can 6 | * simply write css if you prefer 7 | */ 8 | 9 | .train-keras { 10 | outline: none; } 11 | -------------------------------------------------------------------------------- /src/visualizers/widgets/TrainKeras/styles/TrainKerasWidget.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is for any scss that you may want for this visualizer. 3 | */ 4 | 5 | .train-keras { 6 | outline: none; 7 | } 8 | -------------------------------------------------------------------------------- /test/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | browser: false 3 | node: true 4 | es6: true 5 | extends: 'eslint:recommended' 6 | parserOptions: 7 | sourceType: module 8 | rules: 9 | indent: 10 | - error 11 | - 4 12 | linebreak-style: 13 | - error 14 | - unix 15 | quotes: 16 | - error 17 | - single 18 | semi: 19 | - error 20 | - always 21 | -------------------------------------------------------------------------------- /test/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "node": true 4 | } 5 | -------------------------------------------------------------------------------- /test/assets/TestOperation.webgmexm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deepforge-dev/deepforge/f9cb1ff12644f64c01ca4d71ca66e6e22506b084/test/assets/TestOperation.webgmexm -------------------------------------------------------------------------------- /test/assets/configs/compute.js: -------------------------------------------------------------------------------- 1 | const {getSciServerPassword, getSciServerUsername, login} = require('./sciserver'); 2 | 3 | async function getSciServerJobsConfig() { 4 | const username = getSciServerUsername(); 5 | const password = getSciServerPassword(); 6 | const token = await login(username, password); 7 | return { 8 | username: username, 9 | token: token, 10 | volume: `${username}/deepforge_test`, 11 | computeDomain: 'Small Jobs Domain', 12 | }; 13 | } 14 | 15 | module.exports = async function() { 16 | const configs = {}; 17 | configs['gme'] = {}; 18 | configs['sciserver-compute'] = await getSciServerJobsConfig(); 19 | 20 | return configs; 21 | }; 22 | -------------------------------------------------------------------------------- /test/assets/configs/storage.js: -------------------------------------------------------------------------------- 1 | const {getSciServerPassword, getSciServerUsername, login} = require('./sciserver'); 2 | 3 | async function getSciServerFilesConfig() { 4 | const username = getSciServerUsername(); 5 | const password = getSciServerPassword(); 6 | const token = await login(username, password); 7 | const volume = `${username}/deepforge_test`; 8 | const volumePool = 'Temporary'; 9 | 10 | return {username, token, volume, volumePool}; 11 | } 12 | 13 | function getS3Config() { 14 | return { 15 | endpoint: 'http://localhost:9000', 16 | accessKeyId: process.env.MINIO_ACCESS_KEY, 17 | secretAccessKey: process.env.MINIO_SECRET_KEY, 18 | bucketName: 'deepforge' 19 | }; 20 | } 21 | 22 | module.exports = async function() { 23 | const configs = {}; 24 | configs['gme'] = {}; 25 | 26 | configs['sciserver-files'] = await getSciServerFilesConfig(); 27 | configs['s3'] = getS3Config(); 28 | 29 | return configs; 30 | }; 31 | -------------------------------------------------------------------------------- /test/features/selectors.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ACTION_BTN: '.webgme-fab a', 3 | NEW_OPERATION: '.node-prompter .create-node rect', 4 | PANEL_TITLE: '.panel-header-title', 5 | INT: { // (Operation) Interface Editor 6 | OPERATION: '.operation-interface-editor rect.operation', 7 | ADD_INPUT: '.operation-interface-editor .add-operation-input circle', 8 | ADD_ATTR: '.operation-interface-editor .create-attr-field', 9 | ADD_OUTPUT: '.operation-interface-editor .add-operation-output circle', 10 | INPUT: '.operation-interface-editor .operation-input', 11 | OUTPUT: '.operation-interface-editor .operation-output', 12 | CREATE_ATTR: '.operation-interface-editor .create-attr-field', 13 | ATTR_NAME: '.operation-interface-editor .attr-title', 14 | ATTR_VALUE: '.operation-interface-editor .attr-content', 15 | DELETE: '.operation-interface-editor .selection-container .button.basic circle', 16 | EDIT_ATTR: { 17 | NAME: '.attribute-details-dialog.modal #inputName', 18 | SAVE: '.attribute-details-dialog.modal .btn-save', 19 | DELETE: '.attribute-details-dialog.modal .btn-delete' 20 | } 21 | } 22 | }; 23 | -------------------------------------------------------------------------------- /test/features/start.sh: -------------------------------------------------------------------------------- 1 | export NODE_ENV=test 2 | node app.js > server-test.log & # suppress this stdout 3 | ./node_modules/.bin/chimp --mocha --path test/features 4 | RESULT=$? 5 | kill -SIGINT %1 6 | 7 | exit $RESULT 8 | -------------------------------------------------------------------------------- /test/features/utils.js: -------------------------------------------------------------------------------- 1 | /* globals browser */ 2 | const testFixture = require('../globals'); 3 | const gmeConfig = testFixture.getGmeConfig(); 4 | const BASE_URL = `http://localhost:${gmeConfig.server.port}`; 5 | const getUrl = function(project, nodeId, branch) { 6 | branch = branch || 'master'; 7 | nodeId = nodeId || '/f'; 8 | 9 | nodeId = encodeURIComponent(nodeId); 10 | return `${BASE_URL}?project=guest%2B${project}&branch=${branch}&node=${nodeId}`; 11 | }; 12 | 13 | // sleep function 14 | const sleep = duration => { 15 | let endTime = Date.now() + duration; 16 | browser.waitUntil(function() { 17 | return endTime <= Date.now(); 18 | }, Math.max(2*duration, 5000)); 19 | }; 20 | 21 | const waitForFocus = selector => { 22 | browser.waitUntil(function() { 23 | return browser.hasFocus(selector); 24 | }); 25 | }; 26 | 27 | module.exports = { 28 | waitForFocus, 29 | sleep, 30 | getUrl 31 | }; 32 | -------------------------------------------------------------------------------- /test/unit/common/PromiseEvents.spec.js: -------------------------------------------------------------------------------- 1 | describe('PromiseEvents', function() { 2 | const assert = require('assert'); 3 | const testFixture = require('../../globals'); 4 | const PromiseEvents = testFixture.requirejs('deepforge/PromiseEvents'); 5 | 6 | it('should resolve as a promise', async function() { 7 | const five = await PromiseEvents.new( 8 | resolve => setTimeout(() => resolve(5), 5) 9 | ); 10 | assert.equal(five, 5); 11 | }); 12 | 13 | it('should support updates', async function() { 14 | const promise = PromiseEvents.new(function(resolve) { 15 | for (let i = 1; i < 6; i++) { 16 | this.emit('update', i); 17 | } 18 | resolve(6); 19 | }); 20 | const events = []; 21 | promise.on('update', status => events.push(status)); 22 | const six = await promise; 23 | assert.equal(events.length, 5); 24 | assert.equal(six, 6); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /test/unit/common/plugin/GeneratedFiles.spec.js: -------------------------------------------------------------------------------- 1 | describe('GeneratedFiles', function() { 2 | const testFixture = require('../../../globals'); 3 | const assert = require('assert'); 4 | const GeneratedFiles = testFixture.requirejs('deepforge/plugin/GeneratedFiles'); 5 | 6 | describe('should ensure files are strings', function() { 7 | const failingCases = [ 8 | {hello: 'world'}, 9 | 120, 10 | true, 11 | ]; 12 | failingCases.forEach(data => { 13 | it(`should throw with "${typeof data}" data`, function () { 14 | const files = new GeneratedFiles(); 15 | assert.throws(() => files.addFile('test.txt', data)); 16 | }); 17 | }); 18 | 19 | it('should add text file', function() { 20 | const files = new GeneratedFiles(); 21 | files.addFile('test.txt', 'test data'); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/unit/common/storage/backends/gme/Client.spec.js: -------------------------------------------------------------------------------- 1 | describe('GME Storage Adapter', function() { 2 | const testFixture = require('../../../../../globals'); 3 | const assert = require('assert'); 4 | const Storage = testFixture.requirejs('deepforge/storage/index'); 5 | const ID = 'gme'; 6 | 7 | it('should correctly generate blob client params (https)', async function() { 8 | const client = await Storage.getClient(ID); 9 | const {DEEPFORGE_HOST} = process.env; 10 | process.env.DEEPFORGE_HOST = 'https://editor.deepforge.org'; 11 | const params = client.getBlobClientParams(); 12 | process.env.DEEPFORGE_HOST = DEEPFORGE_HOST; 13 | assert.equal(params.serverPort, 443); 14 | }); 15 | 16 | it('should correctly generate blob client params', async function() { 17 | const client = await Storage.getClient(ID); 18 | const {DEEPFORGE_HOST} = process.env; 19 | process.env.DEEPFORGE_HOST = 'http://editor.deepforge.org'; 20 | const params = client.getBlobClientParams(); 21 | process.env.DEEPFORGE_HOST = DEEPFORGE_HOST; 22 | assert.equal(params.serverPort, 80); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/unit/common/updates/Version.spec.js: -------------------------------------------------------------------------------- 1 | describe('Version', function() { 2 | const testFixture = require('../../../globals'); 3 | const assert = require('assert'); 4 | const Version = testFixture.requirejs('deepforge/updates/Version'); 5 | 6 | const lessThanTestCases = [ 7 | ['0.8.2', '0.10.2'], 8 | ['0.8.2', '0.10.2'], 9 | ['0.8.2', '1.0.0'], 10 | ['0.0.2', '0.1.0'], 11 | ]; 12 | const equalTestCases = [ 13 | ['0.8.2', '0.08.02'], 14 | [' 0.8.2', '0.8.2'] 15 | ]; 16 | equalTestCases.forEach(testCase => { 17 | const [vs1, vs2] = testCase; 18 | it(`should detect ${vs1} == ${vs2}`, () => { 19 | const v1 = new Version(vs1); 20 | const v2 = new Version(vs2); 21 | assert(v1.equalTo(v2)); 22 | }); 23 | }); 24 | 25 | lessThanTestCases.forEach(testCase => { 26 | const [vs1, vs2] = testCase; 27 | const v1 = new Version(vs1); 28 | const v2 = new Version(vs2); 29 | 30 | it(`should detect ${vs1} < ${vs2}`, () => { 31 | assert(v1.lessThan(v2)); 32 | }); 33 | 34 | it(`should detect ${vs2} > ${vs1}`, () => { 35 | assert(v2.greaterThan(v1)); 36 | }); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /test/unit/external-utils/conda-utils.spec.js: -------------------------------------------------------------------------------- 1 | describe('CondaUtils', function () { 2 | const conda = require('../../../utils/conda-utils'), 3 | expect = require('chai').expect, 4 | path = require('path'), 5 | ENV_FILE = path.join(__dirname, '..', '..', '..', 'environment.server.yml'); 6 | 7 | it('should find executable conda', () => { 8 | expect(conda.check).to.not.throw(); 9 | }); 10 | 11 | it('should throw an error when creating from a missing environment file', async () => { 12 | const badCreateFunc = () => conda.createOrUpdateEnvironment('dummyfile'); 13 | await shouldThrow(badCreateFunc); 14 | }); 15 | 16 | it('should not throw an error from a proper environment file', async function() { 17 | this.timeout(5000); 18 | await conda.createOrUpdateEnvironment(ENV_FILE); 19 | }); 20 | 21 | async function shouldThrow(fn) { 22 | try { 23 | await fn(); 24 | } catch (err) { 25 | return err; 26 | } 27 | throw new Error('Function did not throw an exception.'); 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /test/unit/routers/InteractiveCompute/start.js: -------------------------------------------------------------------------------- 1 | describe('InteractiveClient worker script', function() { 2 | const testFixture = require('../../../globals'); 3 | const assert = require('assert').strict; 4 | let InteractiveSession; 5 | 6 | before(() => { 7 | InteractiveSession = require(testFixture.PROJECT_ROOT + '/src/routers/InteractiveCompute/job-files/start').InteractiveSession; 8 | }); 9 | 10 | describe('parseCommand', function() { 11 | it('should parse separate words ("ab cd efg h")', function() { 12 | const cmd = 'ab cd efg h'; 13 | const chunks = InteractiveSession.parseCommand(cmd); 14 | assert.equal(chunks.join(' '), cmd); 15 | }); 16 | 17 | it('should parse "ab \'cd efg h\'"', function() { 18 | const cmd = 'ab \'cd efg h\''; 19 | const chunks = InteractiveSession.parseCommand(cmd); 20 | assert.equal(chunks.length, 2); 21 | assert.equal(chunks[0], 'ab'); 22 | }); 23 | 24 | it('should parse "ab "cd efg h""', function() { 25 | const cmd = 'ab "cd efg h"'; 26 | const chunks = InteractiveSession.parseCommand(cmd); 27 | assert.equal(chunks.length, 2); 28 | assert.equal(chunks[0], 'ab'); 29 | }); 30 | }); 31 | }); 32 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/basic-transfers.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | model = nn.Sequential() 4 | model:add(nn.Reshape(100)) 5 | model:add(nn.Linear(100, 300)) 6 | model:add(nn.RReLU()) 7 | model:add(nn.Linear(300, 100)) 8 | model:add(nn.ReLU()) 9 | model:add(nn.Linear(100, 100)) 10 | model:add(nn.Sigmoid()) 11 | model:add(nn.Linear(100, 120)) 12 | model:add(nn.LeakyReLU()) 13 | model:add(nn.Linear(120, 5)) 14 | model:add(nn.SoftMax()) -------------------------------------------------------------------------------- /test/unit/test-cases/code/basic.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | model = nn.Sequential() 4 | model:add(nn.Reshape(100)) 5 | model:add(nn.Linear(100, 300)) 6 | model:add(nn.HardTanh()) 7 | model:add(nn.Linear(300, 10)) -------------------------------------------------------------------------------- /test/unit/test-cases/code/basic2.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | -- dummy values 4 | local ninputs = 100 5 | local nhiddens = 300 6 | local noutputs = 10 7 | 8 | -- Simple 2-layer neural network, with tanh hidden units 9 | model = nn.Sequential() 10 | model:add(nn.Reshape(ninputs)) -- can these be added behind the scenes? 11 | model:add(nn.Linear(ninputs,nhiddens)) 12 | model:add(nn.Tanh()) 13 | model:add(nn.Linear(nhiddens,noutputs)) 14 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/basic4.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | local nfeats = 500 4 | local nstates = {} 5 | local filtsize = 10 6 | local poolsize = 10 7 | 8 | -- a typical modern convolution network (conv+relu+pool) 9 | model = nn.Sequential() 10 | 11 | -- stage 1 : filter bank -> squashing -> L2 pooling -> normalization 12 | model:add(nn.SpatialConvolutionMM(nfeats, nstates[1], filtsize, filtsize)) 13 | model:add(nn.ReLU()) 14 | model:add(nn.SpatialMaxPooling(poolsize,poolsize,poolsize,poolsize)) 15 | 16 | -- stage 2 : filter bank -> squashing -> L2 pooling -> normalization 17 | model:add(nn.SpatialConvolutionMM(nstates[1], nstates[2], filtsize, filtsize)) 18 | model:add(nn.ReLU()) 19 | model:add(nn.SpatialMaxPooling(poolsize,poolsize,poolsize,poolsize)) 20 | 21 | -- stage 3 : standard 2-layer neural network 22 | model:add(nn.View(nstates[2]*filtsize*filtsize)) 23 | model:add(nn.Dropout(0.5)) 24 | model:add(nn.Linear(nstates[2]*filtsize*filtsize, nstates[3])) 25 | model:add(nn.ReLU()) 26 | model:add(nn.Linear(nstates[3], noutputs)) 27 | 28 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/basiccontainer.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'rnn' 3 | 4 | local P0 = nn.Sequential() 5 | P0:add(nn.View(2,5,10):setNumInputDims(20)) 6 | local P1 = nn.Sequential() 7 | P1:add(nn.Linear(50, 200)) 8 | P1:add(nn.ReLU()) 9 | P1:add(nn.Linear(100, 210)) 10 | 11 | local net = nn.Sequential() 12 | net:add(nn.Linear(100, 200)) 13 | net:add(nn.Parallel(100, 200):add(P0):add(P1)) 14 | net:add(nn.Sqrt(3)) 15 | 16 | return net -------------------------------------------------------------------------------- /test/unit/test-cases/code/concat-parallel.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | nhiddens = 150 4 | 5 | function createSeq(input, output) 6 | seq = nn.Sequential(); 7 | seq:add(nn.Linear(input,nhiddens)) 8 | seq:add(nn.Tanh()) 9 | seq:add(nn.Linear(nhiddens,output)) 10 | return seq 11 | end 12 | 13 | -- merge 14 | mlp = nn.Sequential() 15 | mlp:add(nn.Reshape(100)) 16 | 17 | -- concat layer 18 | concat = nn.Concat(1) 19 | concat:add(createSeq(100, 50)) 20 | concat:add(createSeq(100, 30)) 21 | 22 | mlp:add(concat) 23 | 24 | -- join 25 | mlp:add(nn.Tanh()) 26 | mlp:add(nn.Linear(80,7)) 27 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/concat-seq.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | nhiddens = 150 4 | 5 | function createSeq(input, output) 6 | seq = nn.Sequential(); 7 | seq:add(nn.Linear(input,nhiddens)) 8 | seq:add(nn.Tanh()) 9 | seq:add(nn.Linear(nhiddens,output)) 10 | return seq 11 | end 12 | 13 | mlp = nn.Sequential() 14 | 15 | -- concat layer 16 | concat = nn.Concat(1) 17 | concat:add(createSeq(100, 50)) 18 | concat:add(createSeq(100, 30)) 19 | 20 | -- merge 21 | mlp:add(concat) 22 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/concat-y.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | nhiddens = 150 4 | 5 | function createSeq(input, output) 6 | seq = nn.Sequential(); 7 | seq:add(nn.Linear(input,nhiddens)) 8 | seq:add(nn.Tanh()) 9 | seq:add(nn.Linear(nhiddens,output)) 10 | return seq 11 | end 12 | 13 | mlp = nn.Sequential() 14 | 15 | -- concat layer 16 | concat = nn.Concat(1) 17 | concat:add(createSeq(100, 50)) 18 | concat:add(createSeq(100, 30)) 19 | 20 | -- merge 21 | mlp:add(concat) 22 | mlp:add(nn.Tanh()) 23 | mlp:add(nn.Linear(80,7)) 24 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/concat.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | n = nn.Sequential(); 4 | 5 | mlp = nn.Concat(1) 6 | mlp:add(nn.Linear(5,3)) 7 | mlp:add(nn.Linear(5,7)) 8 | 9 | n:add(nn.Reshape(5)) 10 | n:add(mlp) 11 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/lenet.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | net = nn.Sequential() 3 | net:add(nn.SpatialConvolution(3, 6, 5, 5)) -- 1 input image channel, 6 output channels, 5x5 convolution kernel 4 | net:add(nn.ReLU()) -- non-linearity 5 | net:add(nn.SpatialMaxPooling(2,2,2,2)) -- A max-pooling operation that looks at 2x2 windows and finds the max. 6 | net:add(nn.SpatialConvolution(6, 16, 5, 5)) 7 | net:add(nn.ReLU()) -- non-linearity 8 | net:add(nn.SpatialMaxPooling(2,2,2,2)) 9 | net:add(nn.View(16*5*5)) -- reshapes from a 3D tensor of 16x5x5 into 1D tensor of 16*5*5 10 | net:add(nn.Linear(16*5*5, 120)) -- fully connected layer (matrix multiplication between input and weights) 11 | net:add(nn.ReLU()) -- non-linearity 12 | net:add(nn.Linear(120, 84)) 13 | net:add(nn.ReLU()) -- non-linearity 14 | net:add(nn.Linear(84, 10)) -- 10 is the number of outputs of the network (in this case, 10 digits) 15 | net:add(nn.LogSoftMax()) 16 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/multi-args.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | local net = nn.Sequential() 4 | net:add(nn.View(5, -1):setNumInputDims(3)) -- batch x features x seqLength 5 | net:add(nn.Transpose({ 2, 3 }, { 1, 2 })) -- seqLength x batch x features 6 | 7 | return net 8 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/simple.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | -- dummy values 4 | local ninputs = 100 5 | local noutputs = 10 6 | 7 | model = nn.Sequential() 8 | model:add(nn.Reshape(ninputs)) 9 | model:add(nn.Linear(ninputs,noutputs)) 10 | -------------------------------------------------------------------------------- /test/unit/test-cases/code/table-literal.lua: -------------------------------------------------------------------------------- 1 | local net = nn.Sequential() 2 | net:add(nn.Transpose({ 1, 2 })) 3 | net:add(nn.Transpose({ {1, 2}, {3, 4} })) 4 | 5 | return net; 6 | -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/ContainerWithLayerArgs.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'rnn' 3 | 4 | local m = nn.Sequential() 5 | m:add(nn.Linear(100, 50)) 6 | m:add(nn.LeakyReLU()) 7 | m:add(nn.Linear(50, 10)) 8 | 9 | 10 | local net = nn.Sequential() 11 | net:add(nn.Bottle(m, 2)) 12 | 13 | return net -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/basic-transfers.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | local net = nn.Sequential() 4 | net:add(nn.Reshape(100)) 5 | net:add(nn.Linear(100, 300)) 6 | net:add(nn.RReLU()) 7 | net:add(nn.Linear(300, 100)) 8 | net:add(nn.ReLU()) 9 | net:add(nn.Linear(100, 100)) 10 | net:add(nn.Sigmoid()) 11 | net:add(nn.Linear(100, 120)) 12 | net:add(nn.LeakyReLU()) 13 | net:add(nn.Linear(120, 5)) 14 | net:add(nn.SoftMax()) 15 | 16 | return net 17 | -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/basic.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | local net = nn.Sequential() 4 | net:add(nn.Reshape(100)) 5 | net:add(nn.Linear(100, 300)) 6 | net:add(nn.HardTanh()) 7 | net:add(nn.Linear(300, 10)) 8 | 9 | return net 10 | -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/basiccontainer.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'rnn' 3 | 4 | local P0 = nn.Sequential() 5 | P0:add(nn.View(2,5,10):setNumInputDims(20)) 6 | local P1 = nn.Sequential() 7 | P1:add(nn.Linear(50, 200)) 8 | P1:add(nn.ReLU()) 9 | P1:add(nn.Linear(100, 210)) 10 | 11 | local net = nn.Sequential() 12 | net:add(nn.Linear(100, 200)) 13 | net:add(nn.Parallel(100, 200):add(P0):add(P1)) 14 | net:add(nn.Sqrt(3)) 15 | 16 | return net -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/concat-parallel.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | 3 | local net = nn.Sequential() 4 | net:add(nn.Reshape(100)) 5 | 6 | local net_2 = nn.Sequential() 7 | net_2:add(nn.Linear(100, 150)) 8 | net_2:add(nn.Tanh()) 9 | net_2:add(nn.Linear(150, 50)) 10 | 11 | local net_3 = nn.Sequential() 12 | net_3:add(nn.Linear(100, 150)) 13 | net_3:add(nn.Tanh()) 14 | net_3:add(nn.Linear(150, 30)) 15 | 16 | local concat_7 = nn.Concat(1) 17 | concat_7:add(net_3) 18 | concat_7:add(net_2) 19 | 20 | net:add(concat_7) 21 | net:add(nn.Tanh()) 22 | net:add(nn.Linear(80, 7)) 23 | 24 | return net 25 | -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/overfeat.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'rnn' 3 | 4 | local net = nn.Sequential() 5 | net:add(nn.SpatialConvolution(3, 96, 11, 11, 4, 4)) 6 | net:add(nn.ReLU(true)) 7 | net:add(nn.SpatialMaxPooling(2, 2, 2, 2)) 8 | net:add(nn.SpatialConvolution(96, 256, 5, 5, 1, 1)) 9 | net:add(nn.ReLU(true)) 10 | net:add(nn.SpatialMaxPooling(2, 2, 2, 2)) 11 | net:add(nn.SpatialConvolution(256, 512, 3, 3, 1, 1, 1, 1)) 12 | net:add(nn.ReLU(true)) 13 | net:add(nn.SpatialConvolution(512, 1024, 3, 3, 1, 1, 1, 1)) 14 | net:add(nn.ReLU(true)) 15 | net:add(nn.SpatialConvolution(1024, 1024, 3, 3, 1, 1, 1, 1)) 16 | net:add(nn.ReLU(true)) 17 | net:add(nn.SpatialMaxPooling(2, 2, 2, 2)) 18 | net:add(nn.View()) 19 | net:add(nn.Dropout(0.5)) 20 | net:add(nn.Linear(25600, 3072)) 21 | net:add(nn.Threshold(0, 0.000001)) 22 | net:add(nn.Dropout(0.5)) 23 | net:add(nn.Linear(3072, 4096)) 24 | net:add(nn.Threshold(0, 0.000001)) 25 | net:add(nn.Linear(4096, 7)) 26 | net:add(nn.LogSoftMax()) 27 | 28 | return net -------------------------------------------------------------------------------- /test/unit/test-cases/generated-code/requiredOmitted.lua: -------------------------------------------------------------------------------- 1 | require 'nn' 2 | require 'rnn' 3 | 4 | local net = nn.Sequential() 5 | net:add(nn.Add(nil, true)) 6 | 7 | return net -------------------------------------------------------------------------------- /test/unit/test-cases/models/basic.yml: -------------------------------------------------------------------------------- 1 | - type: Linear 2 | id: /Q/E 3 | next: 4 | - /Q/e 5 | attributes: 6 | bias: '' 7 | ctor_arg_order: 'inputSize,outputSize,bias' 8 | outputSize: 300 9 | inputSize: 100 10 | - type: Linear 11 | id: /Q/Q 12 | next: [] 13 | attributes: 14 | bias: '' 15 | ctor_arg_order: 'inputSize,outputSize,bias' 16 | outputSize: 10 17 | inputSize: 300 18 | - type: HardTanh 19 | id: /Q/e 20 | next: 21 | - /Q/Q 22 | attributes: 23 | min_value: '' 24 | max_value: 1 25 | ctor_arg_order: 'min_value,max_value' 26 | - type: Reshape 27 | id: /Q/j 28 | next: 29 | - /Q/E 30 | attributes: 31 | ctor_arg_order: params 32 | params: 100 33 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/basic2.yml: -------------------------------------------------------------------------------- 1 | - type: Reshape 2 | id: /Y/0 3 | next: 4 | - /Y/y 5 | attributes: 6 | params: 100 7 | - type: Linear 8 | id: /Y/Z 9 | next: [] 10 | attributes: 11 | bias: '' 12 | outputSize: 10 13 | inputSize: 300 14 | - type: Tanh 15 | id: /Y/p 16 | next: 17 | - /Y/Z 18 | attributes: {} 19 | - type: Linear 20 | id: /Y/y 21 | next: 22 | - /Y/p 23 | attributes: 24 | bias: '' 25 | outputSize: 300 26 | inputSize: 100 27 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/basiccontainer.yml: -------------------------------------------------------------------------------- 1 | - type: Sqrt 2 | id: /Q/0 3 | next: [] 4 | attributes: 5 | ctor_arg_order: b 6 | b: 3 7 | - type: Linear 8 | id: /Q/V 9 | next: 10 | - /Q/K 11 | attributes: 12 | bias: '' 13 | ctor_arg_order: 'inputSize,outputSize,bias' 14 | inputSize: 100 15 | outputSize: 200 16 | - type: Parallel 17 | id: /Q/K 18 | next: 19 | - /Q/0 20 | attributes: 21 | ctor_arg_order: 'inputDimension,outputDimension' 22 | inputDimension: 100 23 | outputDimension: 200 24 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/concat-parallel.yml: -------------------------------------------------------------------------------- 1 | - type: Linear 2 | id: /p/H 3 | next: 4 | - /p/V 5 | attributes: 6 | bias: '' 7 | outputSize: 150 8 | inputSize: 100 9 | - type: Reshape 10 | id: /p/L 11 | next: 12 | - /p/M 13 | - /p/H 14 | attributes: 15 | params: 100 16 | - type: Linear 17 | id: /p/M 18 | next: 19 | - /p/P 20 | attributes: 21 | bias: '' 22 | outputSize: 150 23 | inputSize: 100 24 | - type: Tanh 25 | id: /p/P 26 | next: 27 | - /p/W 28 | attributes: {} 29 | - type: Linear 30 | id: /p/R 31 | next: 32 | - /p/n 33 | attributes: 34 | bias: '' 35 | outputSize: 30 36 | inputSize: 150 37 | - type: Tanh 38 | id: /p/V 39 | next: 40 | - /p/R 41 | attributes: {} 42 | - type: Linear 43 | id: /p/W 44 | next: 45 | - /p/n 46 | attributes: 47 | bias: '' 48 | outputSize: 50 49 | inputSize: 150 50 | - type: Linear 51 | id: /p/Zj 52 | next: [] 53 | attributes: 54 | bias: '' 55 | outputSize: 7 56 | inputSize: 80 57 | - type: Concat 58 | id: /p/n 59 | next: 60 | - /p/w 61 | attributes: 62 | dimension: 1 63 | - type: Tanh 64 | id: /p/w 65 | next: 66 | - /p/Zj 67 | attributes: {} 68 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/concat-seq.yml: -------------------------------------------------------------------------------- 1 | - type: Linear 2 | id: /u/1 3 | next: 4 | - /u/T 5 | attributes: 6 | bias: '' 7 | outputSize: 30 8 | inputSize: 150 9 | - type: Linear 10 | id: /u/2 11 | next: 12 | - /u/M 13 | attributes: 14 | bias: '' 15 | outputSize: 150 16 | inputSize: 100 17 | - type: Tanh 18 | id: /u/G 19 | next: 20 | - /u/1 21 | attributes: {} 22 | - type: Tanh 23 | id: /u/M 24 | next: 25 | - /u/k 26 | attributes: {} 27 | - type: Concat 28 | id: /u/T 29 | next: [] 30 | attributes: 31 | dimension: 1 32 | - type: Linear 33 | id: /u/k 34 | next: 35 | - /u/T 36 | attributes: 37 | bias: '' 38 | outputSize: 50 39 | inputSize: 150 40 | - type: Linear 41 | id: /u/q 42 | next: 43 | - /u/G 44 | attributes: 45 | bias: '' 46 | outputSize: 150 47 | inputSize: 100 48 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/concat-y-bad-conn.yml: -------------------------------------------------------------------------------- 1 | # Left side 2 | - type: Linear 3 | id: 2 4 | attributes: 5 | output: 150 6 | next: 7 | - 4 8 | 9 | - type: Tanh 10 | id: 4 11 | next: 12 | - 6 13 | 14 | - type: Linear 15 | id: 6 16 | attributes: 17 | output: 50 18 | 19 | # Right side 20 | - type: Linear 21 | id: 3 22 | attributes: 23 | output: 150 24 | next: 25 | - 5 26 | 27 | - type: Tanh 28 | id: 5 29 | next: 30 | - 7 31 | 32 | - type: Linear 33 | id: 7 34 | attributes: 35 | output: 30 36 | next: 37 | - 8 38 | 39 | # Center 40 | - type: Concat 41 | id: 8 42 | attributes: 43 | dim: 1 44 | next: 45 | - 9 46 | 47 | - type: Tanh 48 | id: 9 49 | next: 50 | - 10 51 | 52 | - type: Linear 53 | id: 10 54 | attributes: 55 | output: 7 56 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/concat-y.yml: -------------------------------------------------------------------------------- 1 | - type: Tanh 2 | id: /t/5 3 | next: 4 | - /t/H 5 | attributes: {} 6 | - type: Tanh 7 | id: /t/D 8 | next: 9 | - /t/b 10 | attributes: {} 11 | - type: Linear 12 | id: /t/H 13 | next: [] 14 | attributes: 15 | bias: '' 16 | outputSize: 7 17 | inputSize: 80 18 | - type: Linear 19 | id: /t/I 20 | next: 21 | - /t/O 22 | attributes: 23 | bias: '' 24 | outputSize: 30 25 | inputSize: 150 26 | - type: Linear 27 | id: /t/M 28 | next: 29 | - /t/j 30 | attributes: 31 | bias: '' 32 | outputSize: 150 33 | inputSize: 100 34 | - type: Concat 35 | id: /t/O 36 | next: 37 | - /t/5 38 | attributes: 39 | dimension: 1 40 | - type: Linear 41 | id: /t/b 42 | next: 43 | - /t/O 44 | attributes: 45 | bias: '' 46 | outputSize: 50 47 | inputSize: 150 48 | - type: Linear 49 | id: /t/e 50 | next: 51 | - /t/D 52 | attributes: 53 | bias: '' 54 | outputSize: 150 55 | inputSize: 100 56 | - type: Tanh 57 | id: /t/j 58 | next: 59 | - /t/I 60 | attributes: {} 61 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/concat.yml: -------------------------------------------------------------------------------- 1 | - type: Concat 2 | id: /T/3 3 | next: [] 4 | attributes: 5 | dimension: 1 6 | - type: Linear 7 | id: /T/G 8 | next: 9 | - /T/3 10 | attributes: 11 | bias: '' 12 | outputSize: 7 13 | inputSize: 5 14 | - type: Linear 15 | id: /T/J 16 | next: 17 | - /T/3 18 | attributes: 19 | bias: '' 20 | outputSize: 3 21 | inputSize: 5 22 | - type: Reshape 23 | id: /T/o 24 | next: 25 | - /T/G 26 | - /T/J 27 | attributes: 28 | params: 5 29 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/multi-args.yml: -------------------------------------------------------------------------------- 1 | - type: Transpose 2 | id: /4/g/i 3 | next: [] 4 | attributes: 5 | ctor_arg_order: params 6 | params: '{2, 3}, {1, 2}' 7 | - type: View 8 | id: /4/g/u 9 | next: 10 | - /4/g/i 11 | attributes: 12 | ctor_arg_order: params 13 | params: '5, -1' 14 | numInputDims: 3 15 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/simple.yml: -------------------------------------------------------------------------------- 1 | - type: Linear 2 | id: /3/O 3 | next: [] 4 | attributes: 5 | bias: '' 6 | outputSize: 10 7 | inputSize: 100 8 | - type: Reshape 9 | id: /3/g 10 | next: 11 | - /3/O 12 | attributes: 13 | params: 100 14 | -------------------------------------------------------------------------------- /test/unit/test-cases/models/table-literal.yml: -------------------------------------------------------------------------------- 1 | - type: Transpose 2 | id: /O/c 3 | next: 4 | - /O/j 5 | attributes: 6 | ctor_arg_order: params 7 | params: '{1, 2}' 8 | - type: Transpose 9 | id: /O/j 10 | next: [] 11 | attributes: 12 | ctor_arg_order: params 13 | params: '{{1, 2}, {3, 4}}' 14 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/example.py: -------------------------------------------------------------------------------- 1 | from operations import Operation 2 | from typing import Tuple 3 | 4 | class ExampleOperation(Operation): 5 | 6 | # TODO: add the type hints 7 | def execute(hello, world, count): 8 | # Doing things 9 | concat = hello + world + hello 10 | return concat, count 11 | 12 | def other_method(a, b, c): 13 | # Doing things 14 | return a+b/c 15 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/multi-anon-results.py: -------------------------------------------------------------------------------- 1 | from operations import Operation 2 | from typing import Tuple 3 | 4 | class ExampleOperation(Operation): 5 | 6 | # TODO: add the type hints 7 | def execute(hello, world, count): 8 | # Doing things 9 | concat = hello + world 10 | return concat+1, count-9 11 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/no-inputs.py: -------------------------------------------------------------------------------- 1 | class ExampleOperation(): 2 | def execute(): 3 | return 4 | 5 | def no_return(): 6 | print('hello') 7 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/numeric-attr.py: -------------------------------------------------------------------------------- 1 | class GetNumber(): 2 | def __init__(self, number=4): 3 | self.number = number 4 | return 5 | 6 | 7 | def execute(self): 8 | return self.number 9 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/op-output-name.py: -------------------------------------------------------------------------------- 1 | from operations import Operation 2 | from typing import Tuple 3 | 4 | class ExampleOperation(Operation): 5 | 6 | def execute(hello, world, count): 7 | self.myOutput = hello + world 8 | return self.myOutput 9 | -------------------------------------------------------------------------------- /test/unit/test-cases/operations/simple.py: -------------------------------------------------------------------------------- 1 | class TrainOperation(): 2 | 3 | def __init__(attr, withDefault=5): 4 | self.attr = attr; 5 | return 6 | 7 | # TODO: add type hints 8 | def execute(self, number): 9 | return 20 10 | -------------------------------------------------------------------------------- /token_keys/README.md: -------------------------------------------------------------------------------- 1 | # Public/Private Keys for Production 2 | This directory will contain the public and private keys used for signing the JWTs. After creation, these keys **must** be moved out of the project root to ensure they will not be served as static files by the server. 3 | 4 | After moving the keys to another location, set the `DEEPFORGE_PRIVATE_KEY` and `DEEPFORGE_PUBLIC_KEY` environment variables to the paths to the given key. 5 | -------------------------------------------------------------------------------- /utils/build-includes.ejs: -------------------------------------------------------------------------------- 1 | /* globals define */ 2 | define([ 3 | 'blob/BlobClient', 4 | 'deepforge/storage/index', 5 | 'deepforge/Constants', 6 | 'client/logger', 7 | <% files.forEach(function(file) { %>'<%= file %>', 8 | <% }); %> 9 | ], function( 10 | BlobClient, 11 | Storage, 12 | Constants, 13 | Logger, 14 | ) { 15 | return {BlobClient, Storage, Constants, Logger}; 16 | }); 17 | -------------------------------------------------------------------------------- /utils/generate_token_keys.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Please run this from repository root or provide the path arugment to the script 3 | # ./utils/generate_token_keys.sh 4 | 5 | 6 | SCRIPT_DIR=$(dirname "$0") 7 | PROJECT_ROOT=$(realpath "$SCRIPT_DIR/..") 8 | KEYS_DIR=$PROJECT_ROOT/token_keys 9 | 10 | mkdir -p "$KEYS_DIR" 11 | 12 | echo "Generating Keys" 13 | openssl genrsa -out "$KEYS_DIR"/private_key 14 | openssl rsa -in "$KEYS_DIR"/private_key -pubout > "$KEYS_DIR"/public_key 15 | echo "Generated keys can be found in $KEYS_DIR. Please move the keys outside the project root before deployment." 16 | -------------------------------------------------------------------------------- /utils/install-conda.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | MINICONDA=Miniconda3-latest-Linux-x86_64.sh 3 | if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then MINICONDA=Miniconda3-latest-MacOSX-x86_64.sh; fi 4 | if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then MINICONDA=Miniconda3-latest-Linux-x86_64.sh; fi 5 | 6 | MINICONDA_MD5=$(curl -s https://repo.anaconda.com/miniconda/ | grep -A3 $MINICONDA | sed -n '4p' | sed -n 's/ *\(.*\)<\/td> */\1/p') 7 | curl -O https://repo.anaconda.com/miniconda/$MINICONDA 8 | MD5SUM=$(md5sum $MINICONDA | cut -d ' ' -f 1) 9 | if [[ $MINICONDA_MD5 != $MD5SUM ]]; then 10 | echo "Miniconda MD5 mismatch" 11 | echo $MINICONDA_MD5 12 | echo $MD5SUM 13 | exit 1 14 | fi 15 | bash $MINICONDA -b 16 | rm -f $MINICONDA 17 | 18 | export PATH=$HOME/miniconda3/bin:$PATH 19 | 20 | conda update -yq conda 21 | -------------------------------------------------------------------------------- /utils/notes.md: -------------------------------------------------------------------------------- 1 | # Misc Thoughts 2 | + Should I create this yaml stuff by hand? 3 | + For now, I think it is a good idea - I can't get things like default values programmatically 4 | + In the future, it should be an alternative representation for the meta sheet 5 | + May need to rethink the syntax a little... Currently, it mixes inheritance and attributes... 6 | + A node with attributes cannot be subclassed 7 | -------------------------------------------------------------------------------- /utils/reinstall-extensions.js: -------------------------------------------------------------------------------- 1 | // Re-install all extensions 2 | var extender = require('./extender'), 3 | Q = require('q'), 4 | extConfig = extender.getExtensionsConfig(), 5 | types, 6 | names, 7 | currentInstall = Q(), 8 | installCount = 0, 9 | config; 10 | 11 | // Read the extensions and reinstall each of them 12 | types = Object.keys(extConfig); 13 | for (var i = types.length; i--;) { 14 | names = Object.keys(extConfig[types[i]]); 15 | if (names.length) { 16 | installCount += names.length; 17 | for (var j = names.length; j--;) { 18 | // eslint-disable-next-line no-console 19 | console.log(`Re-installing ${names[j]} extension...`); 20 | config = extConfig[types[i]][names[j]]; 21 | currentInstall = currentInstall 22 | .then(() => extender.install(config.project.arg, true)); 23 | } 24 | } 25 | } 26 | 27 | if (installCount) { 28 | // eslint-disable-next-line no-console 29 | currentInstall.then(() => console.log('Extensions reinstalled successfully')); 30 | } 31 | --------------------------------------------------------------------------------