{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.SageMaker.CreateExperiment
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a SageMaker /experiment/. An experiment is a collection of
-- /trials/ that are observed, compared and evaluated as a group. A trial
-- is a set of steps, called /trial components/, that produce a machine
-- learning model.
--
-- In the Studio UI, trials are referred to as /run groups/ and trial
-- components are referred to as /runs/.
--
-- The goal of an experiment is to determine the components that produce
-- the best model. Multiple trials are performed, each one isolating and
-- measuring the impact of a change to one or more inputs, while keeping
-- the remaining inputs constant.
--
-- When you use SageMaker Studio or the SageMaker Python SDK, all
-- experiments, trials, and trial components are automatically tracked,
-- logged, and indexed. When you use the Amazon Web Services SDK for Python
-- (Boto), you must use the logging APIs provided by the SDK.
--
-- You can add tags to experiments, trials, trial components and then use
-- the Search API to search for the tags.
--
-- To add a description to an experiment, specify the optional
-- @Description@ parameter. To add a description later, or to change the
-- description, call the UpdateExperiment API.
--
-- To get a list of all your experiments, call the ListExperiments API. To
-- view an experiment\'s properties, call the DescribeExperiment API. To
-- get a list of all the trials associated with an experiment, call the
-- ListTrials API. To create a trial call the CreateTrial API.
module Amazonka.SageMaker.CreateExperiment
  ( -- * Creating a Request
    CreateExperiment (..),
    newCreateExperiment,

    -- * Request Lenses
    createExperiment_description,
    createExperiment_displayName,
    createExperiment_tags,
    createExperiment_experimentName,

    -- * Destructuring the Response
    CreateExperimentResponse (..),
    newCreateExperimentResponse,

    -- * Response Lenses
    createExperimentResponse_experimentArn,
    createExperimentResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.SageMaker.Types

-- | /See:/ 'newCreateExperiment' smart constructor.
data CreateExperiment = CreateExperiment'
  { -- | The description of the experiment.
    CreateExperiment -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | The name of the experiment as displayed. The name doesn\'t need to be
    -- unique. If you don\'t specify @DisplayName@, the value in
    -- @ExperimentName@ is displayed.
    CreateExperiment -> Maybe Text
displayName :: Prelude.Maybe Prelude.Text,
    -- | A list of tags to associate with the experiment. You can use Search API
    -- to search on the tags.
    CreateExperiment -> Maybe [Tag]
tags :: Prelude.Maybe [Tag],
    -- | The name of the experiment. The name must be unique in your Amazon Web
    -- Services account and is not case-sensitive.
    CreateExperiment -> Text
experimentName :: Prelude.Text
  }
  deriving (CreateExperiment -> CreateExperiment -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateExperiment -> CreateExperiment -> Bool
$c/= :: CreateExperiment -> CreateExperiment -> Bool
== :: CreateExperiment -> CreateExperiment -> Bool
$c== :: CreateExperiment -> CreateExperiment -> Bool
Prelude.Eq, ReadPrec [CreateExperiment]
ReadPrec CreateExperiment
Int -> ReadS CreateExperiment
ReadS [CreateExperiment]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateExperiment]
$creadListPrec :: ReadPrec [CreateExperiment]
readPrec :: ReadPrec CreateExperiment
$creadPrec :: ReadPrec CreateExperiment
readList :: ReadS [CreateExperiment]
$creadList :: ReadS [CreateExperiment]
readsPrec :: Int -> ReadS CreateExperiment
$creadsPrec :: Int -> ReadS CreateExperiment
Prelude.Read, Int -> CreateExperiment -> ShowS
[CreateExperiment] -> ShowS
CreateExperiment -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateExperiment] -> ShowS
$cshowList :: [CreateExperiment] -> ShowS
show :: CreateExperiment -> String
$cshow :: CreateExperiment -> String
showsPrec :: Int -> CreateExperiment -> ShowS
$cshowsPrec :: Int -> CreateExperiment -> ShowS
Prelude.Show, forall x. Rep CreateExperiment x -> CreateExperiment
forall x. CreateExperiment -> Rep CreateExperiment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateExperiment x -> CreateExperiment
$cfrom :: forall x. CreateExperiment -> Rep CreateExperiment x
Prelude.Generic)

-- |
-- Create a value of 'CreateExperiment' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'description', 'createExperiment_description' - The description of the experiment.
--
-- 'displayName', 'createExperiment_displayName' - The name of the experiment as displayed. The name doesn\'t need to be
-- unique. If you don\'t specify @DisplayName@, the value in
-- @ExperimentName@ is displayed.
--
-- 'tags', 'createExperiment_tags' - A list of tags to associate with the experiment. You can use Search API
-- to search on the tags.
--
-- 'experimentName', 'createExperiment_experimentName' - The name of the experiment. The name must be unique in your Amazon Web
-- Services account and is not case-sensitive.
newCreateExperiment ::
  -- | 'experimentName'
  Prelude.Text ->
  CreateExperiment
newCreateExperiment :: Text -> CreateExperiment
newCreateExperiment Text
pExperimentName_ =
  CreateExperiment'
    { $sel:description:CreateExperiment' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
      $sel:displayName:CreateExperiment' :: Maybe Text
displayName = forall a. Maybe a
Prelude.Nothing,
      $sel:tags:CreateExperiment' :: Maybe [Tag]
tags = forall a. Maybe a
Prelude.Nothing,
      $sel:experimentName:CreateExperiment' :: Text
experimentName = Text
pExperimentName_
    }

-- | The description of the experiment.
createExperiment_description :: Lens.Lens' CreateExperiment (Prelude.Maybe Prelude.Text)
createExperiment_description :: Lens' CreateExperiment (Maybe Text)
createExperiment_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperiment' {Maybe Text
description :: Maybe Text
$sel:description:CreateExperiment' :: CreateExperiment -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateExperiment
s@CreateExperiment' {} Maybe Text
a -> CreateExperiment
s {$sel:description:CreateExperiment' :: Maybe Text
description = Maybe Text
a} :: CreateExperiment)

-- | The name of the experiment as displayed. The name doesn\'t need to be
-- unique. If you don\'t specify @DisplayName@, the value in
-- @ExperimentName@ is displayed.
createExperiment_displayName :: Lens.Lens' CreateExperiment (Prelude.Maybe Prelude.Text)
createExperiment_displayName :: Lens' CreateExperiment (Maybe Text)
createExperiment_displayName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperiment' {Maybe Text
displayName :: Maybe Text
$sel:displayName:CreateExperiment' :: CreateExperiment -> Maybe Text
displayName} -> Maybe Text
displayName) (\s :: CreateExperiment
s@CreateExperiment' {} Maybe Text
a -> CreateExperiment
s {$sel:displayName:CreateExperiment' :: Maybe Text
displayName = Maybe Text
a} :: CreateExperiment)

-- | A list of tags to associate with the experiment. You can use Search API
-- to search on the tags.
createExperiment_tags :: Lens.Lens' CreateExperiment (Prelude.Maybe [Tag])
createExperiment_tags :: Lens' CreateExperiment (Maybe [Tag])
createExperiment_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperiment' {Maybe [Tag]
tags :: Maybe [Tag]
$sel:tags:CreateExperiment' :: CreateExperiment -> Maybe [Tag]
tags} -> Maybe [Tag]
tags) (\s :: CreateExperiment
s@CreateExperiment' {} Maybe [Tag]
a -> CreateExperiment
s {$sel:tags:CreateExperiment' :: Maybe [Tag]
tags = Maybe [Tag]
a} :: CreateExperiment) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The name of the experiment. The name must be unique in your Amazon Web
-- Services account and is not case-sensitive.
createExperiment_experimentName :: Lens.Lens' CreateExperiment Prelude.Text
createExperiment_experimentName :: Lens' CreateExperiment Text
createExperiment_experimentName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperiment' {Text
experimentName :: Text
$sel:experimentName:CreateExperiment' :: CreateExperiment -> Text
experimentName} -> Text
experimentName) (\s :: CreateExperiment
s@CreateExperiment' {} Text
a -> CreateExperiment
s {$sel:experimentName:CreateExperiment' :: Text
experimentName = Text
a} :: CreateExperiment)

instance Core.AWSRequest CreateExperiment where
  type
    AWSResponse CreateExperiment =
      CreateExperimentResponse
  request :: (Service -> Service)
-> CreateExperiment -> Request CreateExperiment
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy CreateExperiment
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateExperiment)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe Text -> Int -> CreateExperimentResponse
CreateExperimentResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"ExperimentArn")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable CreateExperiment where
  hashWithSalt :: Int -> CreateExperiment -> Int
hashWithSalt Int
_salt CreateExperiment' {Maybe [Tag]
Maybe Text
Text
experimentName :: Text
tags :: Maybe [Tag]
displayName :: Maybe Text
description :: Maybe Text
$sel:experimentName:CreateExperiment' :: CreateExperiment -> Text
$sel:tags:CreateExperiment' :: CreateExperiment -> Maybe [Tag]
$sel:displayName:CreateExperiment' :: CreateExperiment -> Maybe Text
$sel:description:CreateExperiment' :: CreateExperiment -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
displayName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Tag]
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
experimentName

instance Prelude.NFData CreateExperiment where
  rnf :: CreateExperiment -> ()
rnf CreateExperiment' {Maybe [Tag]
Maybe Text
Text
experimentName :: Text
tags :: Maybe [Tag]
displayName :: Maybe Text
description :: Maybe Text
$sel:experimentName:CreateExperiment' :: CreateExperiment -> Text
$sel:tags:CreateExperiment' :: CreateExperiment -> Maybe [Tag]
$sel:displayName:CreateExperiment' :: CreateExperiment -> Maybe Text
$sel:description:CreateExperiment' :: CreateExperiment -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
displayName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [Tag]
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
experimentName

instance Data.ToHeaders CreateExperiment where
  toHeaders :: CreateExperiment -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# (ByteString
"SageMaker.CreateExperiment" :: Prelude.ByteString),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON CreateExperiment where
  toJSON :: CreateExperiment -> Value
toJSON CreateExperiment' {Maybe [Tag]
Maybe Text
Text
experimentName :: Text
tags :: Maybe [Tag]
displayName :: Maybe Text
description :: Maybe Text
$sel:experimentName:CreateExperiment' :: CreateExperiment -> Text
$sel:tags:CreateExperiment' :: CreateExperiment -> Maybe [Tag]
$sel:displayName:CreateExperiment' :: CreateExperiment -> Maybe Text
$sel:description:CreateExperiment' :: CreateExperiment -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Description" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
description,
            (Key
"DisplayName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
displayName,
            (Key
"Tags" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [Tag]
tags,
            forall a. a -> Maybe a
Prelude.Just
              (Key
"ExperimentName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
experimentName)
          ]
      )

instance Data.ToPath CreateExperiment where
  toPath :: CreateExperiment -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery CreateExperiment where
  toQuery :: CreateExperiment -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newCreateExperimentResponse' smart constructor.
data CreateExperimentResponse = CreateExperimentResponse'
  { -- | The Amazon Resource Name (ARN) of the experiment.
    CreateExperimentResponse -> Maybe Text
experimentArn :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateExperimentResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateExperimentResponse -> CreateExperimentResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateExperimentResponse -> CreateExperimentResponse -> Bool
$c/= :: CreateExperimentResponse -> CreateExperimentResponse -> Bool
== :: CreateExperimentResponse -> CreateExperimentResponse -> Bool
$c== :: CreateExperimentResponse -> CreateExperimentResponse -> Bool
Prelude.Eq, ReadPrec [CreateExperimentResponse]
ReadPrec CreateExperimentResponse
Int -> ReadS CreateExperimentResponse
ReadS [CreateExperimentResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateExperimentResponse]
$creadListPrec :: ReadPrec [CreateExperimentResponse]
readPrec :: ReadPrec CreateExperimentResponse
$creadPrec :: ReadPrec CreateExperimentResponse
readList :: ReadS [CreateExperimentResponse]
$creadList :: ReadS [CreateExperimentResponse]
readsPrec :: Int -> ReadS CreateExperimentResponse
$creadsPrec :: Int -> ReadS CreateExperimentResponse
Prelude.Read, Int -> CreateExperimentResponse -> ShowS
[CreateExperimentResponse] -> ShowS
CreateExperimentResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateExperimentResponse] -> ShowS
$cshowList :: [CreateExperimentResponse] -> ShowS
show :: CreateExperimentResponse -> String
$cshow :: CreateExperimentResponse -> String
showsPrec :: Int -> CreateExperimentResponse -> ShowS
$cshowsPrec :: Int -> CreateExperimentResponse -> ShowS
Prelude.Show, forall x.
Rep CreateExperimentResponse x -> CreateExperimentResponse
forall x.
CreateExperimentResponse -> Rep CreateExperimentResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateExperimentResponse x -> CreateExperimentResponse
$cfrom :: forall x.
CreateExperimentResponse -> Rep CreateExperimentResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateExperimentResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'experimentArn', 'createExperimentResponse_experimentArn' - The Amazon Resource Name (ARN) of the experiment.
--
-- 'httpStatus', 'createExperimentResponse_httpStatus' - The response's http status code.
newCreateExperimentResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateExperimentResponse
newCreateExperimentResponse :: Int -> CreateExperimentResponse
newCreateExperimentResponse Int
pHttpStatus_ =
  CreateExperimentResponse'
    { $sel:experimentArn:CreateExperimentResponse' :: Maybe Text
experimentArn =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateExperimentResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The Amazon Resource Name (ARN) of the experiment.
createExperimentResponse_experimentArn :: Lens.Lens' CreateExperimentResponse (Prelude.Maybe Prelude.Text)
createExperimentResponse_experimentArn :: Lens' CreateExperimentResponse (Maybe Text)
createExperimentResponse_experimentArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperimentResponse' {Maybe Text
experimentArn :: Maybe Text
$sel:experimentArn:CreateExperimentResponse' :: CreateExperimentResponse -> Maybe Text
experimentArn} -> Maybe Text
experimentArn) (\s :: CreateExperimentResponse
s@CreateExperimentResponse' {} Maybe Text
a -> CreateExperimentResponse
s {$sel:experimentArn:CreateExperimentResponse' :: Maybe Text
experimentArn = Maybe Text
a} :: CreateExperimentResponse)

-- | The response's http status code.
createExperimentResponse_httpStatus :: Lens.Lens' CreateExperimentResponse Prelude.Int
createExperimentResponse_httpStatus :: Lens' CreateExperimentResponse Int
createExperimentResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateExperimentResponse' {Int
httpStatus :: Int
$sel:httpStatus:CreateExperimentResponse' :: CreateExperimentResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: CreateExperimentResponse
s@CreateExperimentResponse' {} Int
a -> CreateExperimentResponse
s {$sel:httpStatus:CreateExperimentResponse' :: Int
httpStatus = Int
a} :: CreateExperimentResponse)

instance Prelude.NFData CreateExperimentResponse where
  rnf :: CreateExperimentResponse -> ()
rnf CreateExperimentResponse' {Int
Maybe Text
httpStatus :: Int
experimentArn :: Maybe Text
$sel:httpStatus:CreateExperimentResponse' :: CreateExperimentResponse -> Int
$sel:experimentArn:CreateExperimentResponse' :: CreateExperimentResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
experimentArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus