TensorFlow/Keras vs SPROCLIB Comparison

Parallel Design: ML Framework Meets Chemical Engineering

SPROCLIB introduces a semantic API that brings the intuitive, familiar syntax of TensorFlow/Keras to chemical process control. This approach makes complex plant design as simple as building neural networks.

Core Philosophy Comparison

Framework Philosophy

TensorFlow/Keras Approach

SPROCLIB Approach

Build neural networks with layers

Build chemical plants with process units

Sequential and functional APIs

Sequential and functional plant design

Compile with optimizers and loss functions

Compile with economic/environmental objectives

Train with data to minimize loss

Optimize operations to maximize profit

Evaluate model performance

Evaluate plant performance

Syntax Side-by-Side Comparison

1. Model/Plant Initialization

TensorFlow/Keras

SPROCLIB

model = keras.Sequential()
plant = ChemicalPlant()

2. Adding Components

TensorFlow/Keras

SPROCLIB

model.add(layers.Dense(
    64,
    activation="relu",
    name="layer1"
))
plant.add(CentrifugalPump(
    H0=50.0,
    eta=0.75,
    name="pump1"
))

3. Sequential Architecture Building

TensorFlow/Keras

SPROCLIB

model = keras.Sequential([
    layers.Dense(64, activation="relu"),
    layers.Dense(32, activation="relu"),
    layers.Dense(1, activation="linear")
])
plant = ChemicalPlant([
    CentrifugalPump(H0=50.0, eta=0.75),
    CSTR(V=150.0, k0=7.2e10),
    BinaryDistillationColumn(N_trays=12)
])

4. Compilation with Optimization Strategy

TensorFlow/Keras

SPROCLIB

model.compile(
    optimizer='adam',
    loss='mse',
    metrics=['mae']
)
plant.compile(
    optimizer='economic',
    loss='total_cost',
    metrics=['profit', 'efficiency']
)

5. Training/Optimization

TensorFlow/Keras

SPROCLIB

model.fit(
    x_train, y_train,
    epochs=100,
    validation_split=0.2
)
plant.optimize(
    target_production=1000.0,
    constraints={...}
)

6. Model/Plant Summary

TensorFlow/Keras

SPROCLIB

model.summary()
plant.summary()

7. Evaluation

TensorFlow/Keras

SPROCLIB

model.evaluate(x_test, y_test)
plant.evaluate(operating_conditions)

8. Prediction/Simulation

TensorFlow/Keras

SPROCLIB

predictions = model.predict(x_new)
results = plant.simulate(duration=24.0)

Complete Example Comparison

TensorFlow/Keras: Image Classification Model

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 1. Define model architecture
model = keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,), name='input_layer'),
    layers.Dropout(0.2),
    layers.Dense(64, activation='relu', name='hidden_layer'),
    layers.Dropout(0.2),
    layers.Dense(10, activation='softmax', name='output_layer')
])

# 2. Compile with optimizer, loss, and metrics
model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=0.001),
    loss=keras.losses.SparseCategoricalCrossentropy(),
    metrics=[keras.metrics.SparseCategoricalAccuracy()]
)

# 3. Train the model
history = model.fit(
    x_train, y_train,
    epochs=50,
    batch_size=32,
    validation_data=(x_val, y_val),
    verbose=1
)

# 4. Evaluate performance
test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=0)
print(f"Test accuracy: {test_accuracy:.4f}")

# 5. Make predictions
predictions = model.predict(x_new)

# 6. Display model summary
model.summary()

# 7. Save model
model.save('image_classifier.h5')

SPROCLIB: Chemical Plant Design (Equivalent Complexity)

from unit.plant import ChemicalPlant, PlantConfiguration
from unit.reactor.cstr import CSTR
from unit.pump import CentrifugalPump
from unit.distillation import BinaryDistillationColumn
from unit.valve import ControlValve
from transport.continuous.liquid import PipeFlow

# 1. Define plant architecture
config = PlantConfiguration(operating_hours=8760, electricity_cost=0.12)
plant = ChemicalPlant("Production Plant", config=config)

plant.add(CentrifugalPump(H0=50.0, eta=0.75), name='feed_pump')
plant.add(PipeFlow(length=200.0, diameter=0.15), name='feed_line')
plant.add(CSTR(V=150.0, k0=7.2e10, Ea=72750), name='reactor')
plant.add(PipeFlow(length=100.0, diameter=0.12), name='product_line')
plant.add(BinaryDistillationColumn(N_trays=12, alpha=2.2), name='separator')
plant.add(ControlValve(Cv_max=15.0, time_constant=3.0), name='flow_control')
plant.add(CentrifugalPump(H0=35.0, eta=0.72), name='product_pump')

# Connect units (functional API)
plant.connect('feed_pump', 'feed_line', 'raw_feed')
plant.connect('feed_line', 'reactor', 'reactor_feed')
plant.connect('reactor', 'product_line', 'reactor_effluent')
plant.connect('product_line', 'separator', 'separation_feed')
plant.connect('separator', 'flow_control', 'product_stream')
plant.connect('flow_control', 'product_pump', 'final_product')

# 2. Compile with optimizer, loss, and metrics
plant.compile(
    optimizer="economic",
    loss="total_cost",
    metrics=["profit", "conversion", "energy_efficiency", "emissions"]
)

# 3. Optimize the plant
optimization_results = plant.optimize(
    target_production=1000.0,  # kg/h
    constraints={
        "max_pressure": 15e5,       # Pa
        "min_conversion": 0.85,     # 85% minimum
        "max_temperature": 400.0,   # K
        "max_energy": 2000.0        # kW
    }
)

# 4. Evaluate performance
operating_conditions = {
    "feed_flow": 1200.0,
    "feed_temperature": 298.15,
    "reactor_temperature": 358.15
}
performance = plant.evaluate(operating_conditions)
print(f"Plant efficiency: {performance['plant']['overall_efficiency']:.1%}")

# 5. Run dynamic simulation
simulation_results = plant.simulate(
    duration=24.0,      # hours
    time_step=0.5,      # 30 min intervals
    disturbances={
        "feed_composition": lambda t: 0.8 + 0.1*np.sin(0.1*t)
    }
)

# 6. Display plant summary
plant.summary()

# 7. Save plant configuration
plant.save_plant('production_plant.json')

Conceptual Mapping

Concept Translation

Concept

TensorFlow/Keras

SPROCLIB

Basic Building Block

Layer (Dense, Conv2D, etc.)

Process Unit (Pump, Reactor, etc.)

Architecture Pattern

Sequential, Functional

Sequential, Functional

Optimization Target

Minimize loss function

Optimize economics/performance

Training Data

Input-output pairs

Operating conditions & constraints

Model Parameters

Weights and biases

Equipment sizing & operating variables

Hyperparameters

Learning rate, batch size

Economic parameters, constraints

Regularization

Dropout, L1/L2

Safety margins, environmental limits

Validation

Test set performance

Plant performance metrics

Inference

Predict on new data

Simulate plant operation

Advanced API Comparison

Functional API: Complex Architectures

TensorFlow/Keras Functional API:

# Complex neural network with skip connections
inputs = keras.Input(shape=(784,))
x = layers.Dense(64, activation='relu')(inputs)
residual = x
x = layers.Dense(64, activation='relu')(x)
x = layers.Add()([x, residual])  # Skip connection
outputs = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs=inputs, outputs=outputs)

SPROCLIB Functional API:

# Complex plant with recycle streams
feed_pump = CentrifugalPump(H0=50.0, name='feed_pump')
reactor = CSTR(V=150.0, name='reactor')
separator = BinaryDistillationColumn(N_trays=12, name='separator')
recycle_pump = CentrifugalPump(H0=30.0, name='recycle_pump')
mixer = Mixer(name='feed_mixer')

# Create plant with recycle (skip connection equivalent)
plant = ChemicalPlant.from_functional_design([
    (feed_pump, mixer, 'fresh_feed'),
    (mixer, reactor, 'mixed_feed'),
    (reactor, separator, 'reactor_out'),
    (separator, recycle_pump, 'recycle_stream'),
    (recycle_pump, mixer, 'recycle_return')  # Recycle connection
])

Custom Training/Optimization Loops

TensorFlow/Keras Custom Training:

@tf.function
def train_step(x, y):
    with tf.GradientTape() as tape:
        predictions = model(x, training=True)
        loss = loss_fn(y, predictions)
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    return loss

SPROCLIB Custom Optimization:

def optimization_step(plant, target_conditions):
    current_performance = plant.evaluate(plant.current_state)
    cost = plant.calculate_cost(current_performance)

    # Gradient-free optimization (typical for process plants)
    new_variables = plant.optimizer.step(cost, plant.operating_variables)
    plant.update_operating_conditions(new_variables)
    return cost

Benefits of the Semantic Approach

🎯 Familiar Learning Curve

Engineers already familiar with TensorFlow/Keras can immediately start building chemical plants:

  • Zero Learning Curve for ML practitioners entering chemical engineering

  • Immediate Productivity using known patterns and syntax

  • Cross-Domain Knowledge Transfer between ML and process control

🚀 Rapid Prototyping

Build complex chemical plants as quickly as neural networks:

  • Minutes, Not Hours to design complete plants

  • Interactive Development with immediate feedback

  • Easy Experimentation with different configurations

📚 Educational Excellence

Perfect for teaching both process control and ML concepts:

  • Unified Conceptual Framework for both domains

  • Clear Analogies between ML and process control

  • Progressive Complexity from simple to advanced

🏭 Industrial Adoption

Lower barriers to industrial implementation:

  • Familiar Tools reduce training requirements

  • Proven Patterns from successful ML deployments

  • Community Knowledge leverages ML ecosystem

🔧 Extensibility

Easy to extend using familiar patterns:

  • Plugin Architecture similar to Keras layers

  • Custom Optimizers like custom ML optimizers

  • Community Contributions following ML open-source model

Why This Comparison Matters

🏆 Industry First: First semantic API applying ML framework design to chemical engineering

🎓 Educational Revolution: Makes process control accessible to ML practitioners and vice versa

🔬 Research Catalyst: Enables rapid prototyping of advanced control concepts

🌍 Community Building: Leverages successful ML community patterns for process control

🚀 Innovation Acceleration: Faster development cycles for process control applications

The parallel between TensorFlow/Keras and SPROCLIB demonstrates that complex chemical plant design can be as intuitive and accessible as machine learning model development, revolutionizing how engineers approach process control.

See Also