Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ USER 0
RUN apt-get update && \
apt install -y curl vim
ENV SPARK_MASTER local[*]
ENV ZINGG_HOME /zingg-0.5.0
ENV ZINGG_HOME /zingg-0.6.0
ENV PATH $ZINGG_HOME/scripts:$PATH
ENV LANG C.UTF-8
WORKDIR /
USER root
WORKDIR /zingg-0.5.0
RUN curl --location https://github.com/zinggAI/zingg/releases/download/v0.5.0/zingg-0.5.0-spark-3.5.0.tar.gz | \
WORKDIR /zingg-0.6.0
RUN curl --location https://github.com/zinggAI/zingg/releases/download/v0.6.0/zingg-0.6.0-spark-3.6.0.tar.gz | \
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Docker base image is still apache/spark:3.5.0-python3, but the downloaded Zingg distribution is the ...-spark-3.6.0.tar.gz build. Mixing a Spark 3.6 build with a Spark 3.5 runtime can lead to binary incompatibilities at runtime. Please align these by either updating the base image to Spark 3.6 (if intended) or downloading the Spark 3.5 build of the Zingg tarball.

Suggested change
RUN curl --location https://github.com/zinggAI/zingg/releases/download/v0.6.0/zingg-0.6.0-spark-3.6.0.tar.gz | \
RUN curl --location https://github.com/zinggAI/zingg/releases/download/v0.6.0/zingg-0.6.0-spark-3.5.0.tar.gz | \

Copilot uses AI. Check for mistakes.
tar --extract --gzip --strip=1
RUN pip install -r python/requirements.txt
RUN pip install zingg
RUN chmod -R a+rwx /zingg-0.5.0/models
RUN chown -R spark /zingg-0.5.0/models
RUN chmod -R a+rwx /zingg-0.6.0/models
RUN chown -R spark /zingg-0.6.0/models
USER spark

8 changes: 4 additions & 4 deletions common/client/src/main/java/zingg/common/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
protected ClientOptions options;
protected S session;
protected PipeUtilBase<S,D,R,C> pipeUtil;
public static final Log LOG = LogFactory.getLog(Client.class);

Check warning on line 38 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger should be defined private static final and have the correct class

A logger should normally be defined private static final and be associated with the correct class. `private final Log log;` is also allowed for rare cases where loggers need to be passed around, with the restriction that the logger needs to be passed into the constructor. ProperLogger (Priority: 3, Ruleset: Error Prone) https://docs.pmd-code.org/snapshot/pmd_rules_java_errorprone.html#properlogger
protected String zFactoryClassName;


Expand All @@ -59,7 +59,7 @@
setOptions(options);
try {
buildAndSetArguments(args, options);
setZingg(args, options);
setZingg(options);
}
catch (Exception e) {
throw new ZinggClientException("An error has occured while setting up the client", e);
Expand All @@ -78,27 +78,27 @@
public Client(IZArgs args, ClientOptions options, S s, String zFactory) throws ZinggClientException {
this(args, options, zFactory);
this.session = s;
LOG.debug("Session passed is " + s);

Check failure on line 81 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
if (session != null) zingg.setSession(session);

Check warning on line 82 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

This statement should have braces

Enforce a policy for braces on control statements. It is recommended to use braces on 'if ... else' statements and loop statements, even if they are optional. This usually makes the code clearer, and helps prepare the future when you need to add another statement. That said, this rule lets you control which statements are required to have braces via properties. From 6.2.0 on, this rule supersedes WhileLoopMustUseBraces, ForLoopMustUseBraces, IfStmtMustUseBraces, and IfElseStmtMustUseBraces. ControlStatementBraces (Priority: 3, Ruleset: Code Style) https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#controlstatementbraces
}


public IZinggFactory getZinggFactory() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
LOG.debug("z factory is " + getZFactoryClassName());

Check failure on line 87 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
return (IZinggFactory) Class.forName(getZFactoryClassName()).newInstance();
}




public void setZingg(IZArgs args, ClientOptions options) throws Exception{
public void setZingg(ClientOptions options) throws Exception{
IZinggFactory zf = getZinggFactory();
try{
setZingg(zf.get(ZinggOptions.getByValue(options.get(ClientOptions.PHASE).value.trim())));
}
catch(Exception e) {
//set default
setZingg(zf.get(ZinggOptions.getByValue(ZinggOptions.PEEK_MODEL.getName())));
LOG.error("Error creating zingg instance for phase " + options.get(ClientOptions.PHASE).value.trim(), e);

Check failure on line 100 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
throw e;
}
}

Expand All @@ -108,7 +108,7 @@
}

protected void setJobId(IZArgs args){
int jobId = new Long(System.currentTimeMillis()).intValue();

Check warning on line 111 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Do not use `new Long(...)`, prefer `Long.valueOf(...)`

Reports usages of primitive wrapper constructors. They are deprecated since Java 9 and should not be used. Even before Java 9, they can be replaced with usage of the corresponding static `valueOf` factory method (which may be automatically inserted by the compiler since Java 1.5). This has the advantage that it may reuse common instances instead of creating a new instance each time. Note that for `Boolean`, the named constants `Boolean.TRUE` and `Boolean.FALSE` are preferred instead of `Boolean.valueOf`. PrimitiveWrapperInstantiation (Priority: 3, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#primitivewrapperinstantiation
if (options.get(options.JOBID)!= null) {
LOG.info("Using job id from command line");
String j = options.get(options.JOBID).value;
Expand All @@ -116,7 +116,7 @@
args.setJobId(jobId);
}
else if (args.getJobId() != -1) {
jobId = (args).getJobId();

Check warning on line 119 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Useless parentheses around `args`.

Parenthesized expressions are used to override the default operator precedence rules. Parentheses whose removal would not change the relative nesting of operators are unnecessary, because they don't change the semantics of the enclosing expression. Some parentheses that strictly speaking are unnecessary, may still be considered useful for readability. This rule allows to ignore violations on two kinds of unnecessary parentheses: - "Clarifying" parentheses, which separate operators of difference precedence. While unnecessary, they make precedence rules explicit, which may be useful for rarely used operators. For example: ```java (a + b) & c // is equivalent to `a + b & c`, but probably clearer ``` Unset the property `ignoreClarifying` to report them. - "Balancing" parentheses, which are unnecessary but visually balance out another pair of parentheses around an equality operator. For example, those two expressions are equivalent: ```java (a == null) != (b == null) a == null != (b == null) ``` The parentheses on the right are required, and the parentheses on the left are just more visually pleasing. Unset the property `ignoreBalancing` to report them. UselessParentheses (Priority: 4, Ruleset: Code Style) https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#uselessparentheses
}
}

Expand Down Expand Up @@ -156,12 +156,12 @@
LOG.info("");
LOG.info("**************************************************************************");
LOG.info("* *");
LOG.info("* "+getProductName()+" *");

Check failure on line 159 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
LOG.info("* (C) 2021 Zingg Labs, Inc. *");
LOG.info("* *");
LOG.info("* https://www.zingg.ai/ *");
LOG.info("* *");
LOG.info("* using: Zingg v"+getProductVersion()+" *");

Check failure on line 164 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
LOG.info("* *");
if(collectMetrics) {
LOG.info("* ** Note about analytics collection by Zingg AI ** *");
Expand Down Expand Up @@ -197,12 +197,12 @@
boolean success = true;
try {

for (String a: args) LOG.debug("args " + a);

Check failure on line 200 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement

Check warning on line 200 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

This statement should have braces

Enforce a policy for braces on control statements. It is recommended to use braces on 'if ... else' statements and loop statements, even if they are optional. This usually makes the code clearer, and helps prepare the future when you need to add another statement. That said, this rule lets you control which statements are required to have braces via properties. From 6.2.0 on, this rule supersedes WhileLoopMustUseBraces, ForLoopMustUseBraces, IfStmtMustUseBraces, and IfElseStmtMustUseBraces. ControlStatementBraces (Priority: 3, Ruleset: Code Style) https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#controlstatementbraces
options = getClientOptions(args);
setOptions(options);

if (options.has(options.HELP) || options.has(options.HELP1) || options.get(ClientOptions.PHASE) == null) {
LOG.warn(options.getHelp());

Check failure on line 205 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
System.exit(0);
}
String phase = options.get(ClientOptions.PHASE).value.trim();
Expand All @@ -216,7 +216,7 @@

LOG.warn("Zingg processing has completed");
}
catch(Throwable throwable) {

Check warning on line 219 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

A catch statement should never catch throwable since it includes errors.

Catching Throwable errors is not recommended since its scope is very broad. It includes runtime issues such as OutOfMemoryError that should be exposed and managed separately. **Deprecated:** This rule is deprecated since PMD 7.18.0 and will be removed with PMD 8.0.0. This rule has been subsumed by {% rule AvoidCatchingGenericException %}, which is now configurable as to which exceptions cause a violation. AvoidCatchingThrowable (Priority: 3, Ruleset: Error Prone) https://docs.pmd-code.org/snapshot/pmd_rules_java_errorprone.html#avoidcatchingthrowable
success = false;

if (options != null && options.get(ClientOptions.EMAIL) != null) {
Expand All @@ -224,9 +224,9 @@
"Zingg Error ",
throwable.getMessage()));
}
LOG.warn("Apologies for this message. Zingg has encountered an error. "
+ throwable.getMessage());

Check failure on line 228 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

Logger calls should be surrounded by log level guards.

Whenever using a log level, one should check if it is actually enabled, or otherwise skip the associate String creation and manipulation, as well as any method calls. An alternative to checking the log level are substituting parameters, formatters or lazy logging with lambdas. The available alternatives depend on the actual logging framework. GuardLogStatement (Priority: 2, Ruleset: Best Practices) https://docs.pmd-code.org/snapshot/pmd_rules_java_bestpractices.html#guardlogstatement
if (LOG.isDebugEnabled()) throwable.printStackTrace();

Check warning on line 229 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

This statement should have braces

Enforce a policy for braces on control statements. It is recommended to use braces on 'if ... else' statements and loop statements, even if they are optional. This usually makes the code clearer, and helps prepare the future when you need to add another statement. That said, this rule lets you control which statements are required to have braces via properties. From 6.2.0 on, this rule supersedes WhileLoopMustUseBraces, ForLoopMustUseBraces, IfStmtMustUseBraces, and IfElseStmtMustUseBraces. ControlStatementBraces (Priority: 3, Ruleset: Code Style) https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#controlstatementbraces
}
finally {
cleanupAndExit(success, client);
Expand Down Expand Up @@ -261,7 +261,7 @@
printBanner(arguments.getCollectMetrics());
zingg.setClientOptions(getOptions());
zingg.init(getArguments(), getSession(),getOptions());
if (session != null) zingg.setSession(session);

Check warning on line 264 in common/client/src/main/java/zingg/common/client/Client.java

View workflow job for this annotation

GitHub Actions / PMD Static Code Analysis

This statement should have braces

Enforce a policy for braces on control statements. It is recommended to use braces on 'if ... else' statements and loop statements, even if they are optional. This usually makes the code clearer, and helps prepare the future when you need to add another statement. That said, this rule lets you control which statements are required to have braces via properties. From 6.2.0 on, this rule supersedes WhileLoopMustUseBraces, ForLoopMustUseBraces, IfStmtMustUseBraces, and IfElseStmtMustUseBraces. ControlStatementBraces (Priority: 3, Ruleset: Code Style) https://docs.pmd-code.org/snapshot/pmd_rules_java_codestyle.html#controlstatementbraces
initializeListeners();
EventsListener.getInstance().fireEvent(new ZinggStartEvent());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ public static String[] getAllMatchTypes() {
return s;
}

public static IMatchType getByName(String name) throws Exception{
public static IMatchType getByName(String name) throws IllegalArgumentException{
for (IMatchType zo: MatchTypes.allMatchTypes.values()) {
if (zo.getName().equalsIgnoreCase(name)) {
return zo;
}
}
return null;
throw new IllegalArgumentException("Invalid match type: " + name);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public A loadArguments(String path) throws ZinggClientException, NoSuchObjectExc

@Override
public void writeArguments(String path, IZArgs args) throws ZinggClientException, NoSuchObjectException {
ArgumentsWriter<A> argumentsWriter = writerFactory.getArgumentsWriter(WriterType.JSON);
ArgumentsWriter<A> argumentsWriter = writerFactory.getArgumentsWriter(WriterType.FILE);
argumentsWriter.write(path, args);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package zingg.common.client.options;

import java.util.HashMap;
import java.util.Map;

import zingg.common.client.ZinggClientException;
import zingg.common.client.util.Util;

import java.util.HashMap;
import java.util.Map;

public class ZinggOptions {

public final static ZinggOption TRAIN = new ZinggOption("train");
Expand All @@ -18,9 +18,6 @@ public class ZinggOptions {
public final static ZinggOption RECOMMEND = new ZinggOption("recommend");
public final static ZinggOption UPDATE_LABEL = new ZinggOption("updateLabel");
public final static ZinggOption FIND_AND_LABEL = new ZinggOption("findAndLabel");
public final static ZinggOption ASSESS_MODEL = new ZinggOption("assessModel");
public final static ZinggOption PEEK_MODEL = new ZinggOption("peekModel");
public final static ZinggOption EXPORT_MODEL = new ZinggOption("exportModel");


public static Map<String, ZinggOption> allZinggOptions;// = new HashMap<String, ZinggOption>();
Expand Down
21 changes: 11 additions & 10 deletions common/client/src/test/java/zingg/common/client/TestArguments.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
package zingg.common.client;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.jupiter.api.Test;
import zingg.common.client.arguments.ArgumentServiceImpl;
import zingg.common.client.arguments.IArgumentService;
import zingg.common.client.arguments.loader.template.EnvironmentVariableSubstitutor;
import zingg.common.client.arguments.model.Arguments;
import zingg.common.client.arguments.model.IArguments;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
Expand All @@ -9,16 +18,8 @@
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.jupiter.api.Test;
import zingg.common.client.arguments.ArgumentServiceImpl;
import zingg.common.client.arguments.IArgumentService;
import zingg.common.client.arguments.model.Arguments;
import zingg.common.client.arguments.model.IArguments;
import zingg.common.client.arguments.loader.template.EnvironmentVariableSubstitutor;

import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;


public class TestArguments {
Expand Down
94 changes: 0 additions & 94 deletions common/core/src/test/resources/testPeekModel/config.json

This file was deleted.

65 changes: 0 additions & 65 deletions common/core/src/test/resources/testPeekModel/test.csv

This file was deleted.

1 change: 0 additions & 1 deletion docs/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
* [Using Pre-existing Training Data](setup/training/addOwnTrainingData.md)
* [Updating Labeled Pairs](updatingLabels.md)
* [Documenting The Training Data](stepbystep/createtrainingdata/generatingdocumentation.md)
* [Exporting Labeled Data](setup/training/exportLabeledData.md)
* [Model Difference](stepbystep/createtrainingdata/modeldiff.md)
* [Ensuring Scalability](verifyBlocking.md)
* [Building And Saving The Model](setup/train.md)
Comment on lines 43 to 48
Copy link

Copilot AI Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A new connector doc was added at docs/connectors/jdbc/clickhouse.md, but it isn’t linked from docs/SUMMARY.md. With mdBook/GitBook-style navigation, unlisted pages are typically undiscoverable (and may not be built). Please add ClickHouse under the JDBC section (near the existing Postgres/MySQL entries) so the page is reachable.

Copilot uses AI. Check for mistakes.
Expand Down
53 changes: 53 additions & 0 deletions docs/connectors/jdbc/clickhouse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# ClickHouse

ClickHouse Pipe Definitions
JSON settings for reading and writing data using the ClickHouse JDBC driver.

## ClickHouse Input (Reading)

```json
"data": [
{
"name": "clickhouse_input",
"format": "jdbc",
"props": {
"url": "jdbc:clickhouse:https://<HOST>:<PORT>/<DATABASE>?ssl=true",
"driver": "com.clickhouse.jdbc.ClickHouseDriver",
"user": "<USERNAME>",
"password": "<PASSWORD>",
"dbtable": "<INPUT_TABLE_NAME>"
}
}
]
```

## ClickHouse Output (Writing)

```json
"output": [
{
"name": "clickhouse_output",
"format": "jdbc",
"props": {
"url": "jdbc:clickhouse:https://<HOST>:<PORT>/<DATABASE>?ssl=true",
"driver": "com.clickhouse.jdbc.ClickHouseDriver",
"user": "<USERNAME>",
"password": "<PASSWORD>",
"dbtable": "<OUTPUT_TABLE_NAME>",
"saveMode": "append"
}
}
]
```

## Implementation Steps

### Add the Driver Jar
Download the `clickhouse-jdbc-0.9.8-all.jar` and add its path to `config/zingg.conf` to ensure Spark can load the driver:

```properties
spark.jars=/path/to/clickhouse-jdbc-0.9.8-all.jar
```

### Port
Use port `8443` for ClickHouse Cloud (HTTPS) or `8123` for local HTTP instances.
2 changes: 0 additions & 2 deletions docs/setup/training/addOwnTrainingData.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,4 @@ Here, the first column specifies the z_cluster, the second column specifies the

The above training data can be specified using [trainingSamples attribute in the configuration.](../../../examples/febrl/configWithTrainingSamples.json)

In addition, labeled data of one model can also be exported and used as training data for another model. For details, check out [exporting labeled data](exportLabeledData.md).

**Note**: It is advisable to still run [findTrainingData](findTrainingData.md) and [label](label.md) a few rounds to tune Zingg with the supplied training data as well as patterns it needs to learn independently.
12 changes: 0 additions & 12 deletions docs/setup/training/exportLabeledData.md

This file was deleted.

Loading
Loading