Skip to content

Commit

Permalink
Development: clara 1.0.0 (#2)
Browse files Browse the repository at this point in the history
* docs: adding documentation

[Documentation]

adding information about using testing example

Signed-off-by: slowy07 <[email protected]>

* docs: adding documentation

[Documentation]

``include/constants.h``

adding commented code for information about variable ``chop``, `maxn`, `eps`

``include/internal/classFunction/iomanip.h``

``IDisplay`` class is an abstract class the provides a generic interface for displaying object . the ``Display_Impl_`` class concrete class that implements the ``IDisplay`` interface for Eigen matrices.
  - the first constructor takes an eigen matrix as input and double as a parameter, the double parameter specifies amount of chopping that should be done whne displaying the matrix
  - the second constructure takes a complex number as input an a double as parameter, the double parameter specifieds tha amount of chopping that soubld be done when displaying the complex number

``include/traits.h``

adding preprocessor directive to check the version of the GCC compiler

``clara_test/tests/traits.cpp``

adding testing for test ``traits.h``

``clara_test/run_test``

adding support for macOs and support for ubuntu and arch based package

Signed-off-by: slowy07 <[email protected]>

* chore(test): adding run_test interactive to github action

Signed-off-by: slowy07 <[email protected]>

* fix: fixing directories

Signed-off-by: slowy07 <[email protected]>

* fix: fixing directories

Signed-off-by: slowy07 <[email protected]>

* chroe: ``evects`` function (#1)

added necessary using statements to define ComplexScalar and ComplexMatrix types for handling complex numbers.
replaced dyn_mat with Eigen::Matrix to match the type of rA.
improved the check for matrix size by comparing the rows and columns separately.
changed rA.template cas<cplx>() to rA.template cast<ComplexScalar>() to handle complex matrix conversion.

* chore(add): adding more information and unitest

[Documentation]

adding reference used in clara
adding unitest for mac os

Signed-off-by: slowy07 <[email protected]>

* fix: fix interpreter

Signed-off-by: slowy07 <[email protected]>

* fix: fix interpreter

Signed-off-by: slowy07 <[email protected]>

* chore(feat): improvement exception function call

[Documentation]

make expection hierarchy for custom exceptions, this exception based on the standard ``std::exception`` class, provide a mechanisem for creating custom exception types with specific description that can be thrown and caught in the application code

Signed-off-by: slowy07 <[email protected]>

* chore(feat): update ``testing/_test.cpp``

[Documentation]

testing quantum bit manipulation

- the code initialize the number of bits and the number of trials. it creates a vector of vectors called `indices`, where each sub-vector contains indices representing bits for trial operations
- it perform a series trials using `TOF` operation on the `Bit_circuit`, the `TOF` operation applies controlled NOT operation on the specified bits in the circuit
- after the trials the code display the initial and final states of the bit circuit as well as the hamming weight ( number of set bits )
- create `ket` and `bra` instance representing quantim states and display them using the `disp` function

Signed-off-by: slowy07 <[email protected]>

* chore(feat): update ``testing/grover_search.cpp``

[Documentation]

grover algorithm starts with equal superposition of all possible states, then iteratively applies the oracle and diffusion operator to amplify the probability of the marked state while reducing the probability of other states, after a sufficient number of iterations, measuring the final state gives a high probability of obtaining the marked state

fix: fixing ``clara/include/operations.h``

[Documentation]

fixing code to provide a flexible efficient way to apply a controlled quantum gate a quantum state, allowing for various types of control and target subsystem configurations. the use of eigen library provides efficient matrix operations, and the code is optimized for performance using multi-threading

fix: fixing ``clara/include/random.h``

fixing function to provide a convenient and safe way to generate random indices whithin specified range, making use of the standard library random number generation capabilitesm use of thread local random number generators is particularly helpful multi-threading applications to avoid potential concurency issues

Signed-off-by: slowy07 <[email protected]>

* chore(attemp: 1): testing grover search and testing channels

Signed-off-by: slowy07 <[email protected]>

* docs: adding documentation

Signed-off-by: slowy07 <[email protected]>

* chore: test macos environment (#3)

* fix: typo spelling run

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: header fix test on macOS clara

Signed-off-by: slowy07 <[email protected]>

* fix: remove temporary macos

Signed-off-by: slowy07 <[email protected]>

* feat: add testing with docker image

* docs: update Documentation

[Documentation]

code documentation is a collection of documents and code comments explaining how code works and how to use it.

Signed-off-by: slowy07 <[email protected]>

* fix: identation action test

Signed-off-by: slowy07 <[email protected]>

* chore: adding operation testing

[Documentation]

AllTest: applies a custom quantum gate represented by the Pauli X gate (`gt.x`) to a single qubit state (`ket psi = 1_ket`) and checks if the result matches the expected state ('0_ket') and checks if the result matches the expected state (`0_ket`)

EmptyControl: test case validation the functionally of applying controlled quantum gates (`U`) to a pure state (`ket psi`) and a density matrix (`cmat rho`). it randomly generates a quantum state and applies the random quantum gate `u` to both he pure state and the corresponding density matrix. the result are compared to check if they are approximately equal within a specified tolerance

[Documentation random testing clara]

AllTest: generate two `bigint` value `a` and `b`, both set to 42. it then calls the `clara::rand` function with `a` and `b` as input parameter. the test verifies that the output of the `clara:rand` function falls within the range [a, b] (inclusive), and thus, it is expected to be equal to either `a` or `b`

Average: further examines the random double generation by calculation by calculating the average of the generated `N` random double values within range [-10, 10]. the average value is then checked to ensure that its approximately close to 0 with a tolerance of 2e-1
Signed-off-by: slowy07 <[email protected]>

* chore: trying update code with macOS test clara

[Documentation]

testing on macOS according issue #4

Signed-off-by: slowy07 <[email protected]>

* fix: environment changes

Signed-off-by: slowy07 <[email protected]>

* fix: try use xcode --install

referenced issues #4

Signed-off-by: slowy07 <[email protected]>

* fix: try use xcode --install

referenced issues #4

Signed-off-by: slowy07 <[email protected]>

* fix: fixing cmake

referenced issues #4

Signed-off-by: slowy07 <[email protected]>

* fix: testing timer

according #4

Signed-off-by: slowy07 <[email protected]>

* fix: testing timer

according #4

Signed-off-by: slowy07 <[email protected]>

* fix: testing timer

according #4

Signed-off-by: slowy07 <[email protected]>

* docs: update documentation

Signed-off-by: slowy07 <[email protected]>

* docs: adding more documentation

[Documentation]

adding more documentation on ``include``

Signed-off-by: slowy07 <[email protected]>

* chore: testing adding action environment windows test

Signed-off-by: slowy07 <[email protected]>

* fix: test with specific command to test on windows

Signed-off-by: slowy07 <[email protected]>

* fix: test rmdir to rd

according information from microsoft official website : https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/rd

Signed-off-by: slowy07 <[email protected]>

* fix: test rd to rmdir with shell powershell

according information from microsoft official website : https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/rd

Signed-off-by: slowy07 <[email protected]>

* fix: test to adding path from eigen was installed

Signed-off-by: slowy07 <[email protected]>

* fix: testing env github action path setting eigen

according from github documentation: https://docs.github.com/en/actions/learn-github-actions/variables

Signed-off-by: slowy07 <[email protected]>

* fix: testing env github action path setting eigen

according from github documentation: https://docs.github.com/en/actions/learn-github-actions/variables

Signed-off-by: slowy07 <[email protected]>

* fix: attemp fixing on directory command

Signed-off-by: slowy07 <[email protected]>

* fix: try to adding cmake list for windows

Signed-off-by: slowy07 <[email protected]>

* fix: typo

Signed-off-by: slowy07 <[email protected]>

* fix: call cmake

Signed-off-by: slowy07 <[email protected]>

* fix: call cmake

Signed-off-by: slowy07 <[email protected]>

* fix: call cmake

Signed-off-by: slowy07 <[email protected]>

* fix: call cmake

Signed-off-by: slowy07 <[email protected]>

* fix: remove windows test and adding on arch latest

Signed-off-by: slowy07 <[email protected]>

* fix: adding

Signed-off-by: slowy07 <[email protected]>

* fix: adding separate the install test

Signed-off-by: slowy07 <[email protected]>

* fix: adding arch based by separated the test

Signed-off-by: slowy07 <[email protected]>

* fix: adding arch based by separated the test

Signed-off-by: slowy07 <[email protected]>

* chore: update shell test

Signed-off-by: slowy07 <[email protected]>

* fix: rename testing filename

Signed-off-by: slowy07 <[email protected]>

* chore: testing GPU support install

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (1) test gpu CUDA

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (2) test gpu CUDA

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (3) test base on windows

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (4) test base on windows

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (5) test base on windows

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (6) test base on windows

Signed-off-by: slowy07 <[email protected]>

* chore: attemp (7) test base on windows

Signed-off-by: slowy07 <[email protected]>

* fix: fixing CWE-120, CWE-20

[Documentation]

information CWE-120: The product copies an input buffer to an output buffer without verifying that the size of the input buffer is less than the size of the output buffer, leading to a buffer overflow.

fix: typo on input_output.h
fix: delete windows test

chore: adding ``input_output_testing``

[Documentation]
adding unitesting using google test framwork to test the functionallity of the `save` and `load` function from `clara` library `input_output`

Signed-off-by: slowy07 <[email protected]>

* docs: adding documentation code

chore: update ``experimental_test``
[Documentation]
The `experimental_test.h` header file defines classes and functions for simulating quantum circuits. The classes provided are:
- `clara::experimental::ClaraCircuit`: Represents a quantum circuit for simulation.
- `clara::experimental::LogicalCircuit`: Represents a logical circuit with gates and their details.
- `clara::experimental::Test`: Represents a test class for quantum circuit operations.
ClaraCircuit Class
This class represents a quantum circuit for simulation. It provides functionalities for creating, manipulating, and simulating quantum circuits.

Class: `clara::experimental::ClaraCircuit<T>`
- Constructor:
  Initializes a quantum circuit.
  Parameters:
  - `number_qubit`: Number of qubits in the circuit.
  - `number_classical`: Number of classical bits in the circuit.
  - `dimension`: Dimension of the quantum state space (default: 2).
- Methods:
  - `measure(std::vector<idx> subsys)`: Measures specified subsystem qubits.
  - `measure_all()`: Measures all unmeasured qubits in the circuit.
  - `apply(const cmat& gate, const std::vector<idx>& subsys)`: Applies a quantum gate to specified subsystem qubits.
  - `apply_all(const cmat& gate)`: Applies a quantum gate to all unmeasured qubits.
  - `reset()`: Resets the quantum circuit to its initial state.
  - Accessor methods for retrieving circuit information:
    - `dimension()`: Returns the dimension of the quantum state space.
    - `get_number_qubit()`: Returns the number of qubits in the circuit.
    - `get_number_classical()`: Returns the number of classical bits in the circuit.
    - `get_size()`: Returns the total size of the circuit (qubits + classical bits).
    - `get_num_measured_qubits()`: Returns the number of measured qubits.
    - `get_num_active_qubits()`: Returns the number of active (unmeasured) qubits.
    - `get_psi()`: Returns the current quantum state of the circuit.
    - `get_results()`: Returns the measured results as a vector of indices.
    - `get_results_as_N()`: Returns the measured results as an integer in base-N representation.
    - `bits()`: Returns a reference to the classical bits associated with the circuit.
LogicalCircuit Class
This class represents a logical circuit with gates and their details.

Class: `clara::experimental::LogicalCircuit`
- Methods:
  - `add(const cmat& gate, const std::string& gate_name, const idx_vec& ctrl, const idx_vec& target)`: Adds a gate to the logical circuit.
  - `gate_gate_count()`: Returns the total count of gates added to the logical circuit.
  - `display(std::ostream& os) const`: Displays the logical circuit's gates and their details.

chore: add more testing for make sure code works very well

chore: adding reversible
[Documentation]
provided functionalities to work with dynamic bitset, perform bitwise operations, and represent bit circuits with various gate operations

Signed-off-by: slowy07 <[email protected]>

* fix: testing timer

Signed-off-by: slowy07 <[email protected]>

* chore: more upgrade stuff

[Documentation]
change from `pi` to `std::pi`

docs: add more documentation `gates.h`
fix: fixing entanglement which testing always return `out of range`
Signed-off-by: slowy07 <[email protected]>

* chore: add quantum operation

[Documentation]

this code demonstrate various quantum channels using clara lib. it perform operations on a quantum state, such as partial transpose, measurement channels application and entropy computation.
`performChannelsOperations()`:
  - step process
    - create the initial state `|00⟩ + |11⟩` and display it
    - perform partial transpose on the first subsystem of the state and display eigen values
    - set up a measurement channels with two kraus operators (pauli Z operatios for `|0⟩` and `|11⟩`)
    - apply the measurement channels to first subsystem and display the resulting state
    - partially trace down the second subsystem and display the resulting state.
    -compute and diplasy the von-neummann entropy of the final state.

Signed-off-by: slowy07 <[email protected]>

* docs: adding documentation on ``functions.h``

[Documentation]

function applies a scalar function element-wise to each entry of the input matrix 'A'. the result is a new matrix of the same dimensions, where each entry is the result of applying the provided scalar function to the corresponding entry in 'A'.

Signed-off-by: slowy07 <[email protected]>

* chore: adding quantum fourier transform

[Documentation]

adding algorithm that can be used to efficiently transform a quantum state from one basis to another.
- Command Line Argument
  the code check if exactly two command line arguments are provided, if not it prints an errpr message and exists the program
- Extracting Command Line Arguments
  - the number CPU cores to use (`num_core`) and the number qubits in quantum system (`n`) are extracted from the command line arguments
- Setting OpenMP Threads
  - the number of OpenMP threads to use for parallel processing is set to `num_core`
- Creating Quantum State Vector
  - A vector `qubits` is created to store indices
  - A quantum state vector `psi` is created using `mket` function with the qubit indices.
  - An initial copy `result` of the quantum state is also created
- Measuring Execution Time
  - A `Timer` object `t` is created to measure the execution time
- Quantum operations
  - A loops iterates over each qubit index
  - A hadamard gate (`gt.H`) applied to each qubit
  - Another Nested llop applies controlled-phase gate, where the control and target qubits are determined by the loop indices
  - The gate are applied to the `result` quantum state vector
- Qubit Swap Operations
  - Another loop swaps qubit state using the `gt.SWAP` gate
  - Qubit at specific indices are swapped
- Printing Result
  - the program prints the number of CPU cores used, the number of qubits, and the execution time measured by the timer

Signed-off-by: slowy07 <[email protected]>

* .git/refs/COMMIT_EDITMSG

Signed-off-by: slowy07 <[email protected]>

* fix: remove testing shoutOperator

Signed-off-by: slowy07 <[email protected]>

* fix: adding preprocessor directive to catch macos

Signed-off-by: slowy07 <[email protected]>

* docs: adding CONTRIBUTING

Signed-off-by: slowy07 <[email protected]>

* chore: adding entropies

[Documentation]

adding entropies, entrpoies is a measure of the amount of randomness or
uncertainty ins tate of a quantum system.
- creating quantum system
  the code creates a complex matrix `rho` representing a quantum state
  using predefined state `st.pb00`, the state is likely defined in the
  include `clarah.h` header
- partial trace calculation
  the `ptrace()` function is used to compute the partial trace of the
  quantums state `rho` over subsystem B. the result stored in the matrix
  `rhoA`
- displaying states
  the `disp()` function is used to display the original quantum state
  matrix `rho` and the result of the partial trace `rhoA`
- entropy calculation
  the `tsallis()` function is used to calculate the tsallis-1 and
  tsallis-2 entropies for the quantum matrix `rho`. the calculated
  entropies displayed
- quantum mutual information calculation
  teh `qmutualinformation()` function to calculation the quantum mutual
  information between subsystem A and B the quantum state `rho`. the
  calculated mutual information is displayed

Signed-off-by: slowy07 <[email protected]>

* chore: adding quantum circuit simulation

[Documentation]

demonstrate the simulation of quantum circuit, including gate operations
and measurement, the process code by:
- create quantum state `psi` and initialized to |00⟩ state
- controlled (CNOT) gate `U` is created using the tensor product (`kron`) of the hadamard gate (`gt.H`) and the identity gate (`gt.Id2`)
- the gate `U` applied to the quantums state `psi` resulting in a new
  state stored in the variable `result` state
- X gate (`gt.X`) is applied to the `result` state at qubit 1, updating
  the state
- print the `producing` bell state
- the state measurement is performed on the `result` state using
  hadamard gate (`gt.H`) on qubit 0. the measurement result,
  probabilites, and resulting states are store in the `measured tuple`

Signed-off-by: slowy07 <[email protected]>

---------

Signed-off-by: slowy07 <[email protected]>
Co-authored-by: khaira nabila <[email protected]>
Co-authored-by: rulanugrh <[email protected]>
  • Loading branch information
3 people authored Sep 29, 2023
1 parent 5f560ad commit 33b58dd
Show file tree
Hide file tree
Showing 65 changed files with 7,966 additions and 1,392 deletions.
10 changes: 10 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Description

<!-- explain the changes -->

### checklist

- [ ] Have you followed the project's coding style guidelines?
- [ ] Have you added unit tests to cover your changes?
- [ ] Have you updated the documentation to reflect your changes?
- [ ] Have you reviewed your changes carefully?
43 changes: 43 additions & 0 deletions .github/workflows/cpp-testing-linux-base.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Clara Test Linux Base

on:
push:
branches:
- main
- development
pull_request:
branches:
- main
- development

jobs:
build-and-testing:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Install Eigen
run: |
sudo apt-get install libeigen3-dev
sudo cp -r /usr/include/eigen3/Eigen /usr/local/include
- name: Build and test
run: |
echo "check g++ version"
g++ --version
cd clara_test
chmod +x run_test
./run_test
- name: testing grover search
run: |
g++ -pedantic -std=c++11 -Wall -Wextra -Weffc++ -fopenmp -g3 -DDEBUG -isystem $HOME/eigen -I $HOME/clara/include testing/grover_search.cpp -o grover_search
./grover_search
- name: testing channels
run: |
g++ -pedantic -std=c++11 -Wall -Wextra -Weffc++ -fopenmp -g3 -DDEBUG -isystem $HOME/eigen -I $HOME/clara/include testing/channels.cpp -o channels
./channels
40 changes: 40 additions & 0 deletions .github/workflows/cpp-testing-mac.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Clara Test On Mac Os

on:
push:
branches:
- main
- development
pull_request:
branches:
- main
- development

jobs:
build-and-testing:
runs-on: macos-latest

steps:
- name: checkout code
uses: actions/checkout@v3

- name: install wget and configure eigen
run: |
brew install eigen
brew install wget
sudo cp -r /usr/local/Cellar/eigen/3.4.0_1/include/eigen3/Eigen /usr/local/include
export C_INCLUDE_PATH=/usr/local/include
export CPLUS_INCLUDE_PATH=/usr/local/include
echo "showing path"
ls /usr/local/include
- name: install libintl
run:
wget -P /usr/local/include https://opensource.apple.com/source/zfs/zfs-59/zfs_lib/libintl.h

- name: build googletest
run: |
g++ --version
cd clara_test
chmod +x run_test
./run_test
16 changes: 0 additions & 16 deletions .github/workflows/cpp-testing.yml.backup

This file was deleted.

20 changes: 20 additions & 0 deletions .github/workflows/docker-testing.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Docker testing

on:
push:
branches:
- main
- development
pull_request:
branches:
- main
- development

jobs:
build-and-testing:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: testing docker build
run: docker build . --file docker/Dockerfile.channels --tag ${{ github.repository }}:$(date +%s)
86 changes: 42 additions & 44 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,27 @@ project(
VERSION 1.0
LANGUAGES CXX)

# C++11
include_directories(include)

set(SOURCE_FILES testing/minimal.cpp)

message(STATUS "Detecting Eigen3")
set(EIGEN3_INCLUDE_DIR "" CACHE PATH "Path to Eigen3")
if(NOT ${EIGEN3_INCLUDE_DIR} STREQUAL "")
if(IS_DIRECTORY ${EIGEN3_INCLUDE_DIR})
message(STATUS "Detecting Eigen3 - done (in ${EIGEN3_INCLUDE_DIR})")
include_directories(SYSTEM "${EIGEN3_INCLUDE_DIR}")
else()
message(FATAL_ERROR "Invalid path to Eigen3 installation")
endif()
else()
find_package(Eigen3 3.0 QUIET NO_MODULE)
if(NOT TARGET Eigen3::Eigen)
message(FATAL_ERROR "eigen 3 not detected please point EIGEN3_INCLUDE_DIR")
endif()
message(STATUS "Detecting Eigen3 - done")
endif()

if(CYGWIN)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
else()
Expand All @@ -14,73 +34,47 @@ endif()
set(ADDITIONAL_FLAGS "-pedantic -Wall -Wextra -Weffc++")
set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem")

# CMake suppport only for GNUC gcc and Clang and apple clang
if(NOT ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"
AND NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
message(FATAL_ERROR "CMakeLists.txt only work with GNU gcc/Clang/AppleClang")
message(
FATAL_ERROR "this CMakeLists.txt work only with GNU gcc/Clang/AppleCLang")
endif()

# clara header
include_directories(include)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} include)

# source file
set(SOURCE_FILES testing/_test.cpp)

include_directories(SYSTEM "$ENV{HOME}/eigen3")
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang")
add_definitions(-DNO_THREAD_LOCAL_)
message(
WARNING
"Detected compiler ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}. thread_local not supported"
)
endif()

# openmp
option(WITH_OPENMP "OpenMP support" ON)
if(${WITH_OPENMP})
# inject definition (as #define) in the source file
add_definitions(-DWITH_OPENMP_)
# gnuc
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU"
OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"
AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "3.8"
OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL "3.8")))
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
# clang but not appleClang
elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "3.7")
set(CLANG_LIBOMP "opt/local/lib/libomp/")
set(CLANG_LIBOMP_INCLUDE "/opt/local/include/libomp/")
include_directories(SYSTEM "${CLANG_LIBOMP_INCLUDE}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp=libomp")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CLANG_LIBOMP}")
endif()
add_definitions(-DWITH_OPENMP)
else()
message(
WARNING
"detected compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} A support for openMP is enable only the GNU gcc compiler or Clang >= 3.7"
"Detected compiler : ${CMAKE_CXX_COMPILER_VERSION}, support for OpenMP is enabled only for the gnu gcc compiler or the clang version 3.8 higher"
)
endif()
endif()

# enable all warnings
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ADDITIONAL_FLAGS}")

# disable support for thread_local storage duration specifier when using apple
# clang as libc++ doesn't yet support
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang")
# inject definition (as #define) in the source files
add_definitions(-DNO_THREAD_LOCAL_)
message(
WARNING
"detected compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION} thread_local not support"
)
endif()

# gnu gcc additional debug settings
if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
if(${CMAKE_CXX_FLAGS} MATCHES "GNU")
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-weak")
endif()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -D_GLIBCXX_DEBUG")
endif()

# configuration
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} -DEIGEN_NO_DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DEIGEN_NO_DEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -DEIGEN_NO_DEBUG")

Expand All @@ -89,12 +83,16 @@ if(NOT CMAKE_BUILD_TYPE)
Release
CACHE
STRING
"choose the type of build, options are: None Debug Release miniSizeRel RelWithDebugInfo"
"choose tyhe type build, oprtions are: None Debug Release MinSizeRel RelWithDebInfo"
FORCE)
endif()

add_executable(clara ${SOURCE_FILES})

if(TARGET Eigen3::Eigen)
target_link_libraries(clara Eigen3::Eigen)
endif()

if($WITH_OPENMP$
AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"
AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "3.7")
Expand Down
Loading

0 comments on commit 33b58dd

Please sign in to comment.