From 3dde0bc423b8e7cfe16e6da116db26a59c2dab3b Mon Sep 17 00:00:00 2001 From: Michelle Ly <lymichelle2016@icloud.com> Date: Fri, 2 May 2025 12:59:23 -0700 Subject: [PATCH 1/2] fix: add updates --- examples/10_Prognostics Server.ipynb | 126 +++++++++++++++++---------- 1 file changed, 81 insertions(+), 45 deletions(-) diff --git a/examples/10_Prognostics Server.ipynb b/examples/10_Prognostics Server.ipynb index a82bb418..2ae1a407 100644 --- a/examples/10_Prognostics Server.ipynb +++ b/examples/10_Prognostics Server.ipynb @@ -6,15 +6,38 @@ "source": [ "# Prognostics Server (prog_server)\n", "\n", - "The ProgPy Server (prog_server) is a simplified implementation of a Service-Oriented Architecture (SOA) for performing prognostics (estimation of time until events and future system states) of engineering systems. prog_server is a wrapper around the ProgPy package, allowing one or more users to access the features of these packages through a REST API. The package is intended to be used as a research tool to prototype and benchmark Prognostics As-A-Service (PaaS) architectures and work on the challenges facing such architectures, including Generality, Communication, Security, Environmental Complexity, Utility, and Trust.\n", + "The ProgPy Server (`prog_server`) is a simplified implementation of a Service-Oriented Architecture (SOA) for performing prognostics (estimation of time until events and future system states) of engineering systems. `prog_server` is a wrapper around the ProgPy package, allowing one or more users to access the features of these packages through a REST API. The package is intended to be used as a research tool to prototype and benchmark Prognostics As-A-Service (PaaS) architectures and work on the challenges facing such architectures, including Generality, Communication, Security, Environmental Complexity, Utility, and Trust.\n", "\n", - "The ProgPy Server is actually two packages, prog_server and prog_client. The prog_server package is a prognostics server that provides the REST API. The prog_client package is a python client that provides functions to interact with the server via the REST API.\n", - "\n", - "**TODO(CT): IMAGE- server with clients**\n", + "The ProgPy Server is actually two packages, `prog_server` and `prog_client`. The `prog_server` package is a prognostics server that provides the REST API. The `prog_client` package is a python client that provides functions to interact with the server via the REST API.\n", "\n", + "**TODO(CT): IMAGE- server with clients**" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Table of Contents\n", + "* [Installing](#Installing)\n", + "* [Starting prog_server](#Starting-prog_server)\n", + " * [Command Line](#Command-Line)\n", + " * [Programmtically](#Programatically)\n", + "* [Using prog_server with prog_client](#Using-prog_server-with-prog_client)\n", + " * [Online Prognostics Example](#Online-Prognostics-Example)\n", + " * [Option Scoring Example](#Option-scoring-example)\n", + "* [Using prog_server with REST Interface](#Using-prog_server-with-REST-Interface)\n", + "* [Custom Models](#Custom-Models)\n", + "* [Closing prog_server](#Closing-prog_server)\n", + "* [Conclusion](#Conclusion)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "## Installing\n", "\n", - "prog_server can be installed using pip\n", + "`prog_server` can be installed using pip\n", "\n", "```console\n", "$ pip install prog_server\n", @@ -32,15 +55,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "prog_server can be started 2 ways. Through command line or programatically (i.e., in a python script). Once the server is started it will take a short time to initialize, then it will start receiving requests for sessions from clients using prog_client, or interacting directly using the REST interface." + "`prog_server` can be started through the command line or programatically (i.e., in a python script). Once the server is started, it will take a short time to initialize. Then, it will start receiving requests for sessions from clients using `prog_client`, or interacting directly using the REST interface." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Starting prog_server in command line\n", - "Generally, you can start the prog_server by running the module, like this:\n", + "### Command Line\n", + "Generally, you can start `prog_server` by running the module, like this:\n", "\n", "```console\n", "$ python -m prog_server\n", @@ -53,8 +76,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Starting prog_server programatically\n", - "There are two methods to start the prog_server in python. The first, below, is non-blocking allowing users to perform other functions while the server is running." + "### Programatically\n", + "There are two methods to start the `prog_server` programatically in python. The first, below, is non-blocking and allows users to perform other functions while the server is running." ] }, { @@ -64,6 +87,7 @@ "outputs": [], "source": [ "import prog_server\n", + "\n", "prog_server.start()" ] }, @@ -71,13 +95,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "When starting a server, users can also provide arguments to customize the way the server runs. Here are the main arguments used by \n", + "When starting a server, users can also provide arguments to customize the way the server runs. Here are the main arguments used:\n", "\n", - "* host (str): Server host address. Defaults to ‘127.0.0.1’\n", - "* port (int): Server port address. Defaults to 8555\n", - "* debug (bool): If the server is to be started in debug mode\n", + "* `host` (str): Server host address. Defaults to ‘127.0.0.1’\n", + "* `port` (int): Server port address. Defaults to 8555\n", + "* `debug` (bool): If the server is to be started in debug mode\n", "\n", - "Now prog_server is ready to start receiving session requests from users. The server can also be stopped using the stop() function" + "Now `prog_server` is ready to start receiving session requests from users. The server can also be stopped using the `stop()` function" ] }, { @@ -93,24 +117,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "prog_server can also be started in blocked mode using the following command:\n", + "`prog_server` can also be started in blocked mode using the following command:\n", "\n", "```python\n", ">>> prog_server.run()\n", "```\n", "\n", - "We will not execute it here, because it would block execution in this notebook until force quit.\n", + "We will not execute it here, because it would block execution in this notebook until we force quit.\n", "\n", - "For details on all supported arguments see [API Doc](https://nasa.github.io/progpy/api_ref/prog_server/prog_server.html#prog_server.start)\n", + "For details on all supported arguments, see the [API Doc](https://nasa.github.io/progpy/api_ref/prog_server/prog_server.html#prog_server.start).\n", "\n", - "The basis of prog_server is the session. Each user creates one or more session. These sessions are each a request for prognostic services. Then the user can interact with the open session. You'll see examples of this in the future sections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's restart the server (so it can be used with the below examples)" + "The basis of `prog_server` is the session. Each user creates one or more session. These sessions are each a request for prognostic services. Then the user can interact with the open session. You'll see examples of this in the future sections.\n", + "\n", + "Let's restart the server again so it can be used with the below examples." ] }, { @@ -127,9 +146,10 @@ "metadata": {}, "source": [ "## Using prog_server with prog_client\n", - "For users using python, prog_server can be interacted with using the prog_client package distributed with progpy. This section describes a few examples using prog_client and prog_server together.\n", "\n", - "Before using prog_client import the package:" + "For users using python, `prog_server` can be interacted with using the `prog_client` package distributed with ProgPy. This section describes a few examples using `prog_client` and `prog_server` together.\n", + "\n", + "We will first import the needed package." ] }, { @@ -145,10 +165,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Example: Online Prognostics\n", + "### Online Prognostics Example\n", "This example creates a session with the server to run prognostics for a Thrown Object, a simplified model of an object thrown into the air. Data is then sent to the server and a prediction is requested. The prediction is then displayed.\n", "\n", - "**Note: before running this example, make sure prog_server is running**\n", + "**Note: before running this example, make sure `prog_server` is running.**\n", "\n", "The first step is to open a session with the server. This starts a session for prognostics with the ThrownObject model, with default parameters. The prediction configuration is updated to have a save frequency of every 1 second." ] @@ -171,7 +191,7 @@ "\n", "Next, we need to prepare the data we will use for this example. The data is a dictionary, and the keys are the names of the inputs and outputs in the model with format (time, value).\n", "\n", - "Note: in an actual application, the data would be received from a sensor or other source. The structure below is used to emulate the sensor." + "Nota that in an actual application, the data would be received from a sensor or other source. The structure below is used to emulate the sensor." ] }, { @@ -214,7 +234,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can start sending the data to the server, checking periodically to see if there is a completed prediction." + "Now, we can start sending the data to the server, checking periodically to see if there is a completed prediction." ] }, { @@ -271,7 +291,7 @@ "source": [ "Notice that the prediction wasn't updated every time step. It takes a bit of time to perform a prediction.\n", "\n", - "*Note*: You can also get the model from prog_server to work with directly." + "Note that we can also get the model from `prog_server` to work with directly." ] }, { @@ -281,6 +301,7 @@ "outputs": [], "source": [ "model = session.get_model()\n", + "\n", "print(model)" ] }, @@ -288,12 +309,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Example: Option Scoring\n", - "This example creates a session with the server to run prognostics for a BatteryCircuit. Three options with different loading profiles are compared by creating a session for each option and comparing the resulting prediction metrics.\n", + "### Option Scoring Example\n", "\n", - "First step is to prepare load profiles to compare. Each load profile has format `Array[Dict]`. Where each dict is in format {TIME: LOAD}, where TIME is the start of that loading in seconds. LOAD is a dict with keys corresponding to model.inputs.\n", + "This example creates a session with the server to run prognostics for a `BatteryCircuit` model. Three options with different loading profiles are compared by creating a session for each option and comparing the resulting prediction metrics.\n", "\n", - "Note: Dict must be in order of increasing time\n", + "First step is to prepare load profiles to compare. Each load profile has format `Array[Dict]`. Where each dict is in format `{TIME: LOAD}`, where `TIME` is the start of that loading in seconds. `LOAD` is a dict with keys corresponding to model.inputs. Note that the dict must be in order of increasing time.\n", "\n", "Here we introduce 3 load profiles to be used with simulation:" ] @@ -379,7 +399,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's wait for prognostics to complete" + "Now let's wait for prognostics to be complete." ] }, { @@ -421,7 +441,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now let's compare results. First let's look at the mean Time to Event (ToE):" + "Now let's compare results. Let's look at the mean Time to Event (`ToE`):" ] }, { @@ -446,7 +466,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As a second metric, let's look at the SOC at our point of interest (2000 seconds)" + "As a second metric, let's look at the `SOC` at our point of interest (2000 seconds)" ] }, { @@ -471,16 +491,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Other metrics can be used as well, like probability of mission success given a certain mission time, uncertainty in ToE estimate, final state at end of mission, etc. " + "Other metrics can be used as well, like probability of mission success given a certain mission time, uncertainty in `ToE` estimate, final state at end of mission, among others." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Using prog_server - REST Interface\n", + "## Using prog_server with REST Interface\n", "\n", - "Communication with ProgPy is through a rest interface. The RestAPI is described here: [Rest API](https://app.swaggerhub.com/apis-docs/teubert/prog_server/).\n", + "Communication with ProgPy is through a REST interface. The REST API is described here: [prog_server REST API](https://app.swaggerhub.com/apis-docs/teubert/prog_server/).\n", "\n", "Most programming languages have a way of interacting with REST APIs (either native or through a package/library). `curl` requests can also be used by command line or apps like Postman." ] @@ -490,14 +510,14 @@ "metadata": {}, "source": [ "## Custom Models\n", - "**A version of this section will be added in release v1.8** " + "**A version of this section will be added in release v1.9** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Closing\n", + "## Closing prog_server\n", "When you're done using prog_server, make sure you turn off the server." ] }, @@ -509,6 +529,22 @@ "source": [ "prog_server.stop()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section, we have demonstrated how to use the ProgPy server, including `prog_server` and `prog_client`. This is the last notebook in the ProgPy tutorial series.\n", + "\n", + "For more information about ProgPy in general, check out the __[00 Intro](00_Intro.ipynb)__ notebook and [ProgPy documentation](https://nasa.github.io/progpy/index.html)." + ] } ], "metadata": { From 61917965eb93d637e45d6588ef43082cd1e4cdf7 Mon Sep 17 00:00:00 2001 From: Michelle Ly <59234861+lymichelle21@users.noreply.github.com> Date: Mon, 5 May 2025 07:51:08 -0700 Subject: [PATCH 2/2] Update examples/10_Prognostics Server.ipynb Co-authored-by: Katy Jarvis Griffith <55932920+kjjarvis@users.noreply.github.com> --- examples/10_Prognostics Server.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/10_Prognostics Server.ipynb b/examples/10_Prognostics Server.ipynb index 2ae1a407..617d6ed4 100644 --- a/examples/10_Prognostics Server.ipynb +++ b/examples/10_Prognostics Server.ipynb @@ -191,7 +191,7 @@ "\n", "Next, we need to prepare the data we will use for this example. The data is a dictionary, and the keys are the names of the inputs and outputs in the model with format (time, value).\n", "\n", - "Nota that in an actual application, the data would be received from a sensor or other source. The structure below is used to emulate the sensor." + "Note that in an actual application, the data would be received from a sensor or other source. The structure below is used to emulate the sensor." ] }, {